diff --git a/app/composer.lock b/app/composer.lock index 6549f6f93..c9c36f6ad 100644 --- a/app/composer.lock +++ b/app/composer.lock @@ -8,16 +8,16 @@ "packages": [ { "name": "cakephp/cakephp", - "version": "4.4.12", + "version": "4.4.17", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp.git", - "reference": "ecacba23d96a5e5052716bf19fe8b96c5549acf3" + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp/zipball/ecacba23d96a5e5052716bf19fe8b96c5549acf3", - "reference": "ecacba23d96a5e5052716bf19fe8b96c5549acf3", + "url": "https://api.github.com/repos/cakephp/cakephp/zipball/9ff254d6d60720089dec1e10aa1907e24e39a98e", + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e", "shasum": "" }, "require": { @@ -71,7 +71,7 @@ "suggest": { "ext-curl": "To enable more efficient network calls in Http\\Client.", "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.", - "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()", + "lib-ICU": "To use locale-aware features in the I18n and Database packages", "paragonie/csp-builder": "CSP builder, to use the CSP Middleware" }, "type": "library", @@ -116,20 +116,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/cakephp" }, - "time": "2023-03-24T01:27:09+00:00" + "time": "2023-08-20T02:36:22+00:00" }, { "name": "cakephp/chronos", - "version": "2.3.2", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "a21b7b633f483c4cf525d200219d200f551ee38b" + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/a21b7b633f483c4cf525d200219d200f551ee38b", - "reference": "a21b7b633f483c4cf525d200219d200f551ee38b", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/dd583900b26971e84d56c482d6c5fc16961bd103", + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103", "shasum": "" }, "require": { @@ -174,20 +174,20 @@ "issues": "https://github.com/cakephp/chronos/issues", "source": "https://github.com/cakephp/chronos" }, - "time": "2022-11-08T02:17:04+00:00" + "time": "2023-09-12T03:12:29+00:00" }, { "name": "cakephp/migrations", - "version": "3.8.0", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/cakephp/migrations.git", - "reference": "8eaf51d88fc4350a66fd98118828f9a75ff1e0d2" + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/8eaf51d88fc4350a66fd98118828f9a75ff1e0d2", - "reference": "8eaf51d88fc4350a66fd98118828f9a75ff1e0d2", + "url": "https://api.github.com/repos/cakephp/migrations/zipball/58446fdd096087ddf7752c0317731b8725d1dc28", + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28", "shasum": "" }, "require": { @@ -234,7 +234,7 @@ "issues": "https://github.com/cakephp/migrations/issues", "source": "https://github.com/cakephp/migrations" }, - "time": "2023-03-22T18:19:12+00:00" + "time": "2023-09-22T08:39:18+00:00" }, { "name": "cakephp/plugin-installer", @@ -336,16 +336,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.5", + "version": "1.3.7", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -392,7 +392,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -408,7 +408,7 @@ "type": "tidelift" } ], - "time": "2023-01-11T08:27:00+00:00" + "time": "2023-08-30T09:31:38+00:00" }, { "name": "doctrine/cache", @@ -505,16 +505,16 @@ }, { "name": "doctrine/dbal", - "version": "3.6.1", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e" + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/57815c7bbcda3cd18871d253c1dd8cbe56f8526e", - "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/00d03067f07482f025d41ab55e4ba0db5eca2cdf", + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf", "shasum": "" }, "require": { @@ -527,13 +527,14 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "11.1.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.3", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.35", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.4", + "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", @@ -597,7 +598,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.0" }, "funding": [ { @@ -613,29 +614,33 @@ "type": "tidelift" } ], - "time": "2023-03-02T19:26:24+00:00" + "time": "2023-09-26T20:56:55+00:00" }, { "name": "doctrine/deprecations", - "version": "v1.0.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" @@ -654,9 +659,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, - "time": "2022-05-02T15:47:09+00:00" + "time": "2023-06-03T09:27:29+00:00" }, { "name": "doctrine/event-manager", @@ -751,22 +756,22 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.24.0", + "version": "2.25.2", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902" + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6028af6c3b5ced4d063a680d2483cce67578b902", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", "shasum": "" }, "require": { "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1" }, "conflict": { "zendframework/zend-diactoros": "*" @@ -781,11 +786,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.4.0", + "laminas/laminas-coding-standard": "^2.5", "php-http/psr7-integration-tests": "^1.2", - "phpunit/phpunit": "^9.5.27", + "phpunit/phpunit": "^9.5.28", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.4" + "vimeo/psalm": "^5.6" }, "type": "library", "extra": { @@ -844,34 +849,34 @@ "type": "community_bridge" } ], - "time": "2022-12-20T12:22:40+00:00" + "time": "2023-04-17T15:44:17+00:00" }, { "name": "laminas/laminas-httphandlerrunner", - "version": "2.5.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-httphandlerrunner.git", - "reference": "7a47834aaad7852816d2ec4fdbb0492163b039ae" + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/7a47834aaad7852816d2ec4fdbb0492163b039ae", - "reference": "7a47834aaad7852816d2ec4fdbb0492163b039ae", + "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/d3e84755a17e563b1c5f8290cbfb150210501a77", + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-message-implementation": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "require-dev": { - "laminas/laminas-coding-standard": "~2.4.0", - "laminas/laminas-diactoros": "^2.18", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.0", - "vimeo/psalm": "^5.0.0" + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-diactoros": "^3.0.0", + "phpunit/phpunit": "^10.1.2", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.11" }, "type": "library", "extra": { @@ -911,7 +916,7 @@ "type": "community_bridge" } ], - "time": "2023-01-05T21:54:03+00:00" + "time": "2023-09-04T10:43:03+00:00" }, { "name": "league/container", @@ -1155,21 +1160,21 @@ }, { "name": "psr/http-client", - "version": "1.0.1", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1189,7 +1194,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -1201,27 +1206,27 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, - "time": "2020-06-29T06:28:15+00:00" + "time": "2023-09-23T14:17:50+00:00" }, { "name": "psr/http-factory", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1241,7 +1246,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -1256,31 +1261,31 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, - "time": "2019-04-30T12:38:16+00:00" + "time": "2023-04-10T20:10:41+00:00" }, { "name": "psr/http-message", - "version": "1.0.1", + "version": "1.1", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1309,27 +1314,27 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/master" + "source": "https://github.com/php-fig/http-message/tree/1.1" }, - "time": "2016-08-06T14:39:51+00:00" + "time": "2023-04-04T09:50:52+00:00" }, { "name": "psr/http-server-handler", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "type": "library", "extra": { @@ -1349,7 +1354,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", @@ -1365,28 +1370,27 @@ "server" ], "support": { - "issues": "https://github.com/php-fig/http-server-handler/issues", - "source": "https://github.com/php-fig/http-server-handler/tree/master" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, - "time": "2018-10-30T16:46:14+00:00" + "time": "2023-04-10T20:06:20+00:00" }, { "name": "psr/http-server-middleware", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "type": "library", @@ -1407,7 +1411,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", @@ -1423,9 +1427,9 @@ ], "support": { "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/master" + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, - "time": "2018-10-30T17:12:04+00:00" + "time": "2023-04-11T06:14:47+00:00" }, { "name": "psr/log", @@ -1616,37 +1620,35 @@ }, { "name": "symfony/config", - "version": "v6.2.7", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, "type": "library", "autoload": { "psr-4": { @@ -1673,7 +1675,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/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -1689,27 +1691,27 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-07-19T20:22:16+00:00" }, { "name": "symfony/console", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3582d68a64a86ec25240aaa521ec8bc2342b369b" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3582d68a64a86ec25240aaa521ec8bc2342b369b", - "reference": "3582d68a64a86ec25240aaa521ec8bc2342b369b", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -1731,12 +1733,6 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, "type": "library", "autoload": { "psr-4": { @@ -1769,7 +1765,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.8" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -1785,20 +1781,20 @@ "type": "tidelift" } ], - "time": "2023-03-29T21:42:15+00:00" + "time": "2023-08-16T10:10:12+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { @@ -1807,7 +1803,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -1836,7 +1832,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -1852,20 +1848,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:25:55+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/filesystem", - "version": "v6.2.7", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -1899,7 +1895,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -1915,20 +1911,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:44:56+00:00" + "time": "2023-06-01T08:30:39+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -1943,7 +1939,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -1981,7 +1977,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -1997,20 +1993,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -2022,7 +2018,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2062,7 +2058,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -2078,20 +2074,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -2103,7 +2099,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2146,7 +2142,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -2162,20 +2158,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -2190,7 +2186,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2229,7 +2225,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -2245,20 +2241,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-07-28T09:04:16+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.2.1", + "version": "v3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -2268,13 +2264,10 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -2314,7 +2307,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -2330,20 +2323,20 @@ "type": "tidelift" } ], - "time": "2023-03-01T10:32:47+00:00" + "time": "2023-05-23T14:45:45+00:00" }, { "name": "symfony/string", - "version": "v6.2.8", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -2354,13 +2347,13 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", @@ -2400,7 +2393,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.8" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -2416,20 +2409,20 @@ "type": "tidelift" } ], - "time": "2023-03-20T16:06:02+00:00" + "time": "2023-07-05T08:41:27+00:00" }, { "name": "twbs/bootstrap", - "version": "v5.2.3", + "version": "v5.3.2", "source": { "type": "git", "url": "https://github.com/twbs/bootstrap.git", - "reference": "cb021439c683d9805e2864c58095b92d405e9b11" + "reference": "344e912d04b5b6a04482113eff20ab416ff01048" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/cb021439c683d9805e2864c58095b92d405e9b11", - "reference": "cb021439c683d9805e2864c58095b92d405e9b11", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/344e912d04b5b6a04482113eff20ab416ff01048", + "reference": "344e912d04b5b6a04482113eff20ab416ff01048", "shasum": "" }, "replace": { @@ -2464,9 +2457,9 @@ ], "support": { "issues": "https://github.com/twbs/bootstrap/issues", - "source": "https://github.com/twbs/bootstrap/tree/v5.2.3" + "source": "https://github.com/twbs/bootstrap/tree/v5.3.2" }, - "time": "2022-11-21T18:19:01+00:00" + "time": "2023-09-14T14:19:27+00:00" } ], "packages-dev": [ @@ -2578,21 +2571,21 @@ }, { "name": "cakephp/cakephp-codesniffer", - "version": "4.6.0", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp-codesniffer.git", - "reference": "5a64e6e6434128f6a1549318de86c564737d5cda" + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/5a64e6e6434128f6a1549318de86c564737d5cda", - "reference": "5a64e6e6434128f6a1549318de86c564737d5cda", + "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", "shasum": "" }, "require": { "php": ">=7.2.0", - "slevomat/coding-standard": "^6.3.6 || ^7.0 || ^8.0", + "slevomat/coding-standard": "^7.0 || ^8.0", "squizlabs/php_codesniffer": "^3.6" }, "require-dev": { @@ -2626,20 +2619,20 @@ "issues": "https://github.com/cakephp/cakephp-codesniffer/issues", "source": "https://github.com/cakephp/cakephp-codesniffer" }, - "time": "2022-07-04T03:29:58+00:00" + "time": "2023-04-10T06:35:04+00:00" }, { "name": "cakephp/debug_kit", - "version": "4.9.3", + "version": "4.9.4", "source": { "type": "git", "url": "https://github.com/cakephp/debug_kit.git", - "reference": "db848e787bf53483069cba2feb449c2e8523f525" + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/db848e787bf53483069cba2feb449c2e8523f525", - "reference": "db848e787bf53483069cba2feb449c2e8523f525", + "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/663491edec4a6b9111f1cf4733ebd471450df71e", + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e", "shasum": "" }, "require": { @@ -2687,12 +2680,12 @@ "kit" ], "support": { - "forum": "http://stackoverflow.com/tags/cakephp", + "forum": "https://stackoverflow.com/tags/cakephp", "irc": "irc://irc.freenode.org/cakephp", "issues": "https://github.com/cakephp/debug_kit/issues", "source": "https://github.com/cakephp/debug_kit" }, - "time": "2023-01-25T04:49:08+00:00" + "time": "2023-07-05T16:04:04+00:00" }, { "name": "cakephp/repl", @@ -2816,22 +2809,22 @@ }, { "name": "composer/class-map-generator", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", "shasum": "" }, "require": { - "composer/pcre": "^2 || ^3", + "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.6", @@ -2869,7 +2862,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" }, "funding": [ { @@ -2885,20 +2878,20 @@ "type": "tidelift" } ], - "time": "2022-06-19T11:31:27+00:00" + "time": "2023-06-30T13:58:57+00:00" }, { "name": "composer/composer", - "version": "2.5.5", + "version": "2.6.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", + "url": "https://api.github.com/repos/composer/composer/zipball/ff477832e6d838a736556d4a39a3b80f4412abfd", + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd", "shasum": "" }, "require": { @@ -2906,23 +2899,23 @@ "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", "composer/pcre": "^2.1 || ^3.1", - "composer/semver": "^3.0", + "composer/semver": "^3.2.5", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "react/promise": "^2.8 || ^3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.9.3", @@ -2930,7 +2923,7 @@ "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "symfony/phpunit-bridge": "^6.0 || ^7" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -2943,7 +2936,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" }, "phpstan": { "includes": [ @@ -2953,7 +2946,7 @@ }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2982,7 +2975,8 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.5" + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.6.3" }, "funding": [ { @@ -2998,7 +2992,7 @@ "type": "tidelift" } ], - "time": "2023-03-21T10:50:05+00:00" + "time": "2023-09-15T07:38:22+00:00" }, { "name": "composer/metadata-minifier", @@ -3142,16 +3136,16 @@ }, { "name": "composer/semver", - "version": "3.3.2", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -3201,9 +3195,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -3219,7 +3213,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T19:23:25+00:00" + "time": "2023-08-31T09:50:34+00:00" }, { "name": "composer/spdx-licenses", @@ -3629,7 +3623,7 @@ ], "support": { "issues": "https://github.com/jdorn/sql-formatter/issues", - "source": "https://github.com/jdorn/sql-formatter/tree/master" + "source": "https://github.com/jdorn/sql-formatter/tree/v1.2.17" }, "time": "2014-01-12T16:20:24+00:00" }, @@ -3883,16 +3877,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", + "version": "v4.17.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -3933,9 +3927,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, - "time": "2023-03-05T19:49:14+00:00" + "time": "2023-08-13T19:53:39+00:00" }, { "name": "phar-io/manifest", @@ -4050,22 +4044,24 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.16.1", + "version": "1.24.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -4089,9 +4085,9 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, - "time": "2023-02-07T18:11:17+00:00" + "time": "2023-09-26T12:28:12+00:00" }, { "name": "phpstan/phpstan", @@ -4155,16 +4151,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", + "version": "9.2.29", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { @@ -4220,7 +4216,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -4228,7 +4225,7 @@ "type": "github" } ], - "time": "2023-03-06T12:58:08+00:00" + "time": "2023-09-19T04:57:46+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4473,16 +4470,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.6", + "version": "9.6.13", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { @@ -4497,7 +4494,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -4556,7 +4553,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -4572,20 +4569,20 @@ "type": "tidelift" } ], - "time": "2023-03-27T11:43:46+00:00" + "time": "2023-09-19T05:39:22+00:00" }, { "name": "psy/psysh", - "version": "v0.11.14", + "version": "v0.11.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "8c2e264def7a8263a68ef6f0b55ce90b77d41e17" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/8c2e264def7a8263a68ef6f0b55ce90b77d41e17", - "reference": "8c2e264def7a8263a68ef6f0b55ce90b77d41e17", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -4615,6 +4612,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "autoload": { @@ -4646,29 +4647,30 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.14" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, - "time": "2023-03-28T03:41:01+00:00" + "time": "2023-09-17T21:15:54+00:00" }, { "name": "react/promise", - "version": "v2.9.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, "type": "library", "autoload": { @@ -4712,19 +4714,15 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v3.0.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], - "time": "2022-02-11T10:27:51+00:00" + "time": "2023-07-11T16:12:49+00:00" }, { "name": "sebastian/cli-parser", @@ -5026,16 +5024,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -5080,7 +5078,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -5088,7 +5086,7 @@ "type": "github" } ], - "time": "2020-10-26T13:10:38+00:00" + "time": "2023-05-07T05:35:17+00:00" }, { "name": "sebastian/environment", @@ -5232,16 +5230,16 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", + "version": "5.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -5284,7 +5282,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5292,7 +5290,7 @@ "type": "github" } ], - "time": "2022-02-14T08:28:10+00:00" + "time": "2023-08-02T09:26:13+00:00" }, { "name": "sebastian/lines-of-code", @@ -5692,16 +5690,16 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", + "version": "1.10.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -5740,7 +5738,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -5752,7 +5750,7 @@ "type": "tidelift" } ], - "time": "2022-04-01T13:37:23+00:00" + "time": "2023-05-11T13:16:46+00:00" }, { "name": "seld/phar-utils", @@ -5804,16 +5802,16 @@ }, { "name": "seld/signal-handler", - "version": "2.0.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { @@ -5859,38 +5857,38 @@ ], "support": { "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, - "time": "2022-07-20T18:31:45+00:00" + "time": "2023-09-03T09:24:00+00:00" }, { "name": "slevomat/coding-standard", - "version": "8.9.1", + "version": "8.13.4", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2" + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2", - "reference": "3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": ">=1.16.0 <1.17.0", + "phpstan/phpdoc-parser": "^1.23.0", "squizlabs/php_codesniffer": "^3.7.1" }, "require-dev": { "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.10.8", + "phpstan/phpstan": "1.10.26", "phpstan/phpstan-deprecation-rules": "1.1.3", - "phpstan/phpstan-phpunit": "1.0.0|1.3.10", - "phpstan/phpstan-strict-rules": "1.5.0", - "phpunit/phpunit": "7.5.20|8.5.21|9.6.5" + "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" }, "type": "phpcodesniffer-standard", "extra": { @@ -5914,7 +5912,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.9.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.13.4" }, "funding": [ { @@ -5926,7 +5924,7 @@ "type": "tidelift" } ], - "time": "2023-03-27T11:00:16+00:00" + "time": "2023-07-25T10:28:55+00:00" }, { "name": "squizlabs/php_codesniffer", @@ -5987,16 +5985,16 @@ }, { "name": "symfony/finder", - "version": "v6.2.7", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -6031,7 +6029,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.7" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -6047,20 +6045,20 @@ "type": "tidelift" } ], - "time": "2023-02-16T09:57:23+00:00" + "time": "2023-07-31T08:31:44+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -6069,7 +6067,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6110,7 +6108,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -6126,20 +6124,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { @@ -6148,7 +6146,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6193,7 +6191,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -6209,20 +6207,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { @@ -6231,7 +6229,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6272,7 +6270,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -6288,20 +6286,20 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "symfony/process", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "75ed64103df4f6615e15a7fe38b8111099f47416" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/75ed64103df4f6615e15a7fe38b8111099f47416", - "reference": "75ed64103df4f6615e15a7fe38b8111099f47416", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { @@ -6333,7 +6331,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.8" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6349,42 +6347,38 @@ "type": "tidelift" } ], - "time": "2023-03-09T16:20:02+00:00" + "time": "2023-08-07T10:39:22+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.2.8", + "version": "v6.3.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^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" ], @@ -6421,7 +6415,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -6437,7 +6431,7 @@ "type": "tidelift" } ], - "time": "2023-03-29T21:42:15+00:00" + "time": "2023-08-24T14:51:05+00:00" }, { "name": "theseer/tokenizer", @@ -6491,16 +6485,16 @@ }, { "name": "twig/markdown-extra", - "version": "v3.5.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "9474c89fd2787187a3809e5e964dfce2395ae5f0" + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/9474c89fd2787187a3809e5e964dfce2395ae5f0", - "reference": "9474c89fd2787187a3809e5e964dfce2395ae5f0", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/83dfa86a0379f784ea30bdb9c15a356b8aabf780", + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780", "shasum": "" }, "require": { @@ -6512,14 +6506,9 @@ "league/commonmark": "^1.0|^2.0", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^5.4|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "autoload": { "psr-4": { "Twig\\Extra\\Markdown\\": "" @@ -6548,7 +6537,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.5.1" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.7.1" }, "funding": [ { @@ -6560,20 +6549,20 @@ "type": "tidelift" } ], - "time": "2023-02-08T07:44:55+00:00" + "time": "2023-07-29T15:34:56+00:00" }, { "name": "twig/twig", - "version": "v3.5.1", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { @@ -6582,15 +6571,10 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "autoload": { "psr-4": { "Twig\\": "src/" @@ -6624,7 +6608,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.5.1" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { @@ -6636,7 +6620,7 @@ "type": "tidelift" } ], - "time": "2023-02-08T07:49:20+00:00" + "time": "2023-08-28T11:09:02+00:00" } ], "aliases": [], diff --git a/app/vendor/bin/jsonlint b/app/vendor/bin/jsonlint index 513f1c973..b8170cf4d 100755 --- a/app/vendor/bin/jsonlint +++ b/app/vendor/bin/jsonlint @@ -108,7 +108,10 @@ if (PHP_VERSION_ID < 80000) { } } - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { + 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__ . '/..'.'/seld/jsonlint/bin/jsonlint'); exit(0); } diff --git a/app/vendor/cakephp/cakephp-codesniffer/.github/workflows/ci.yml b/app/vendor/cakephp/cakephp-codesniffer/.github/workflows/ci.yml index a9c5b62b7..92cbce0f7 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/.github/workflows/ci.yml +++ b/app/vendor/cakephp/cakephp-codesniffer/.github/workflows/ci.yml @@ -10,7 +10,7 @@ on: jobs: testsuite: - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 strategy: fail-fast: false matrix: @@ -69,7 +69,7 @@ jobs: cs-stan: name: Coding Standard & Static Analysis - runs-on: ubuntu-18.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v2 diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/DocBlockAlignmentSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/DocBlockAlignmentSniff.php index 9d651c2a6..41e90c1f3 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/DocBlockAlignmentSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/DocBlockAlignmentSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 1.0.0 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\Commenting; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/FunctionCommentSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/FunctionCommentSniff.php index cc59dd3e4..fa8674a7b 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/FunctionCommentSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/FunctionCommentSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.24 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\Commenting; @@ -46,7 +46,7 @@ * @copyright 2006-2014 Squiz Pty Ltd (ABN 77 084 670 600) * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence * @version Release: @package_version@ - * @link http://pear.php.net/package/PHP_CodeSniffer + * @link https://pear.php.net/package/PHP_CodeSniffer */ class FunctionCommentSniff implements Sniff { diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/InheritDocSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/InheritDocSniff.php index a46746215..d36475c2f 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/InheritDocSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Commenting/InheritDocSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 4.1.0 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\Commenting; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ControlStructuresSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ControlStructuresSniff.php index 6fcd6dfc1..1ffd4d3b2 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ControlStructuresSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ControlStructuresSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.14 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ElseIfDeclarationSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ElseIfDeclarationSniff.php index fd2873c36..c230f6086 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ElseIfDeclarationSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/ElseIfDeclarationSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.14 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\ControlStructures; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/WhileStructuresSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/WhileStructuresSniff.php index 2307cbbeb..67caeb266 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/WhileStructuresSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/ControlStructures/WhileStructuresSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.14 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\ControlStructures; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Formatting/BlankLineBeforeReturnSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Formatting/BlankLineBeforeReturnSniff.php index 1eb9faed5..39fd15204 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Formatting/BlankLineBeforeReturnSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Formatting/BlankLineBeforeReturnSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 2.1.0 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\Formatting; @@ -22,7 +22,7 @@ * Throws errors if there's no blank line before return statements. * * @author Authors - * @license http://spdx.org/licenses/MIT MIT License + * @license https://spdx.org/licenses/MIT MIT License * @link https://github.com/escapestudios/Symfony2-coding-standard */ class BlankLineBeforeReturnSniff implements Sniff diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Functions/ClosureDeclarationSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Functions/ClosureDeclarationSniff.php index 4b2a86e05..3756a8712 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Functions/ClosureDeclarationSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/Functions/ClosureDeclarationSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.28 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\Functions; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidFunctionNameSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidFunctionNameSniff.php index 7212f25d0..777a888bc 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidFunctionNameSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidFunctionNameSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.1 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidTraitNameSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidTraitNameSniff.php index 0736d5b70..f3aae2e36 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidTraitNameSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/NamingConventions/ValidTraitNameSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.10 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/PHP/DisallowShortOpenTagSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/PHP/DisallowShortOpenTagSniff.php index f1fbab200..be835fe74 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/PHP/DisallowShortOpenTagSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/PHP/DisallowShortOpenTagSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.14 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\PHP; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/EmptyLinesSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/EmptyLinesSniff.php index e196fd758..7536d233d 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/EmptyLinesSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/EmptyLinesSniff.php @@ -10,14 +10,14 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 2.4.0 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** * Ensures that not more than one blank line occurs * * @author Mark Scherer - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace CakePHP\Sniffs\WhiteSpace; diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/FunctionCallSpacingSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/FunctionCallSpacingSniff.php index 1ac02c430..256c6b173 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/FunctionCallSpacingSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/FunctionCallSpacingSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.12 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/TabAndSpaceSniff.php b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/TabAndSpaceSniff.php index 6d977d589..c39c9f251 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/TabAndSpaceSniff.php +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/Sniffs/WhiteSpace/TabAndSpaceSniff.php @@ -10,7 +10,7 @@ * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @link https://github.com/cakephp/cakephp-codesniffer * @since CakePHP CodeSniffer 0.1.11 - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ /** diff --git a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml index 543481aa8..c5dba1351 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml +++ b/app/vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml @@ -154,9 +154,6 @@ - - - */config/* */templates/* diff --git a/app/vendor/cakephp/cakephp-codesniffer/composer.json b/app/vendor/cakephp/cakephp-codesniffer/composer.json index bb1e9380f..4e593b5ee 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/composer.json +++ b/app/vendor/cakephp/cakephp-codesniffer/composer.json @@ -19,7 +19,7 @@ }, "require": { "php": ">=7.2.0", - "slevomat/coding-standard": "^6.3.6 || ^7.0 || ^8.0", + "slevomat/coding-standard": "^7.0 || ^8.0", "squizlabs/php_codesniffer": "^3.6" }, "require-dev": { diff --git a/app/vendor/cakephp/cakephp-codesniffer/docs/README.md b/app/vendor/cakephp/cakephp-codesniffer/docs/README.md index e5727fe37..225fe6f50 100644 --- a/app/vendor/cakephp/cakephp-codesniffer/docs/README.md +++ b/app/vendor/cakephp/cakephp-codesniffer/docs/README.md @@ -1,6 +1,6 @@ # CakePHP ruleset -The CakePHP standard contains 136 sniffs +The CakePHP standard contains 135 sniffs CakePHP (19 sniffs) ------------------- @@ -52,10 +52,9 @@ Generic (25 sniffs) - Generic.WhiteSpace.IncrementDecrementSpacing - Generic.WhiteSpace.ScopeIndent -PEAR (2 sniffs) +PEAR (1 sniff) --------------- - PEAR.Functions.ValidDefaultValue -- PEAR.NamingConventions.ValidFunctionName PSR1 (3 sniffs) --------------- @@ -63,11 +62,12 @@ PSR1 (3 sniffs) - PSR1.Files.SideEffects - PSR1.Methods.CamelCapsMethodName -PSR12 (16 sniffs) +PSR12 (17 sniffs) ----------------- - PSR12.Classes.AnonClassDeclaration - PSR12.Classes.ClassInstantiation - PSR12.Classes.ClosingBrace +- PSR12.Classes.OpeningBraceSpace - PSR12.ControlStructures.BooleanOperatorPlacement - PSR12.ControlStructures.ControlStructureSpacing - PSR12.Files.DeclareStatement @@ -129,7 +129,7 @@ SlevomatCodingStandard (32 sniffs) - SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing - SlevomatCodingStandard.Variables.DuplicateAssignmentToVariable -Squiz (29 sniffs) +Squiz (28 sniffs) ----------------- - Squiz.Arrays.ArrayBracketSpacing - Squiz.Classes.ClassFileName @@ -144,7 +144,6 @@ Squiz (29 sniffs) - Squiz.Functions.FunctionDeclarationArgumentSpacing - Squiz.Functions.LowercaseFunctionKeywords - Squiz.Functions.MultiLineFunctionDeclaration -- Squiz.NamingConventions.ValidFunctionName - Squiz.Operators.ValidLogicalOperators - Squiz.PHP.DisallowSizeFunctionsInLoops - Squiz.PHP.Eval diff --git a/app/vendor/cakephp/cakephp/VERSION.txt b/app/vendor/cakephp/cakephp/VERSION.txt index d69db1813..7a0262349 100644 --- a/app/vendor/cakephp/cakephp/VERSION.txt +++ b/app/vendor/cakephp/cakephp/VERSION.txt @@ -16,4 +16,4 @@ // @license https://opensource.org/licenses/mit-license.php MIT License // +--------------------------------------------------------------------------------------------+ // //////////////////////////////////////////////////////////////////////////////////////////////////// -4.4.12 +4.4.17 diff --git a/app/vendor/cakephp/cakephp/composer.json b/app/vendor/cakephp/cakephp/composer.json index 9a80cd6cb..278f11070 100644 --- a/app/vendor/cakephp/cakephp/composer.json +++ b/app/vendor/cakephp/cakephp/composer.json @@ -64,7 +64,7 @@ "suggest": { "ext-curl": "To enable more efficient network calls in Http\\Client.", "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.", - "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()", + "lib-ICU": "To use locale-aware features in the I18n and Database packages", "paragonie/csp-builder": "CSP builder, to use the CSP Middleware" }, "provide": { diff --git a/app/vendor/cakephp/cakephp/src/Collection/CollectionInterface.php b/app/vendor/cakephp/cakephp/src/Collection/CollectionInterface.php index 12cbb1c3c..7e50cfced 100644 --- a/app/vendor/cakephp/cakephp/src/Collection/CollectionInterface.php +++ b/app/vendor/cakephp/cakephp/src/Collection/CollectionInterface.php @@ -250,8 +250,7 @@ public function extract($path): CollectionInterface; * ``` * * @param callable|string $path The column name to use for sorting or callback that returns the value. - * @param int $sort The sort type, one of SORT_STRING - * SORT_NUMERIC or SORT_NATURAL + * @param int $sort The sort type, one of SORT_STRING, SORT_NUMERIC or SORT_NATURAL * @see \Cake\Collection\CollectionInterface::sortBy() * @return mixed The value of the top element in the collection */ @@ -276,8 +275,7 @@ public function max($path, int $sort = \SORT_NUMERIC); * ``` * * @param callable|string $path The column name to use for sorting or callback that returns the value. - * @param int $sort The sort type, one of SORT_STRING - * SORT_NUMERIC or SORT_NATURAL + * @param int $sort The sort type, one of SORT_STRING, SORT_NUMERIC or SORT_NATURAL * @see \Cake\Collection\CollectionInterface::sortBy() * @return mixed The value of the bottom element in the collection */ @@ -306,9 +304,9 @@ public function min($path, int $sort = \SORT_NUMERIC); * The average of an empty set or 0 rows is `null`. Collections with `null` * values are not considered empty. * - * @param callable|string|null $path The property name to sum or a function + * @param callable|string|null $path The property name to compute the average or a function * If no value is passed, an identity function will be used. - * that will return the value of the property to sum. + * that will return the value of the property to compute the average. * @return float|int|null */ public function avg($path = null); @@ -339,18 +337,17 @@ public function avg($path = null); * The median of an empty set or 0 rows is `null`. Collections with `null` * values are not considered empty. * - * @param callable|string|null $path The property name to sum or a function + * @param callable|string|null $path The property name to compute the median or a function * If no value is passed, an identity function will be used. - * that will return the value of the property to sum. + * that will return the value of the property to compute the median. * @return float|int|null */ public function median($path = null); /** * Returns a sorted iterator out of the elements in this collection, - * ranked in ascending order by the results of running each value through a - * callback. $callback can also be a string representing the column or property - * name. + * ranked based on the results of applying a callback function to each value. + * The parameter $path can also be a string representing the column or property name. * * The callback will receive as its first argument each of the elements in $items, * the value returned by the callback will be used as the value for sorting such @@ -378,8 +375,7 @@ public function median($path = null); * * @param callable|string $path The column name to use for sorting or callback that returns the value. * @param int $order The sort order, either SORT_DESC or SORT_ASC - * @param int $sort The sort type, one of SORT_STRING - * SORT_NUMERIC or SORT_NATURAL + * @param int $sort The sort type, one of SORT_STRING, SORT_NUMERIC or SORT_NATURAL * @return self */ public function sortBy($path, int $order = SORT_DESC, int $sort = \SORT_NUMERIC): CollectionInterface; @@ -513,7 +509,7 @@ public function countBy($path): CollectionInterface; * ``` * $items = [ * ['invoice' => ['total' => 100]], - * ['invoice' => ['total' => 200]] + * ['invoice' => ['total' => 200]], * ]; * * $total = (new Collection($items))->sumOf('invoice.total'); @@ -540,7 +536,7 @@ public function sumOf($path = null); public function shuffle(): CollectionInterface; /** - * Returns a new collection with maximum $size random elements + * Returns a new collection with maximum $length random elements * from this collection * * @param int $length the maximum number of elements to randomly @@ -550,7 +546,7 @@ public function shuffle(): CollectionInterface; public function sample(int $length = 10): CollectionInterface; /** - * Returns a new collection with maximum $size elements in the internal + * Returns a new collection with maximum $length elements in the internal * order this collection was created. If a second parameter is passed, it * will determine from what position to start taking elements. * @@ -598,19 +594,19 @@ public function skip(int $length): CollectionInterface; * ``` * $items = [ * ['comment' => ['body' => 'cool', 'user' => ['name' => 'Mark']], - * ['comment' => ['body' => 'very cool', 'user' => ['name' => 'Renan']] + * ['comment' => ['body' => 'very cool', 'user' => ['name' => 'Renan']], * ]; * * $extracted = (new Collection($items))->match(['user.name' => 'Renan']); * * // Result will look like this when converted to array * [ - * ['comment' => ['body' => 'very cool', 'user' => ['name' => 'Renan']] + * ['comment' => ['body' => 'very cool', 'user' => ['name' => 'Renan']]] * ] * ``` * * @param array $conditions a key-value list of conditions where - * the key is a property path as accepted by `Collection::extract, + * the key is a property path as accepted by `Collection::extract`, * and the value the condition against with each element will be matched * @return self */ @@ -705,7 +701,7 @@ public function prependItem($item, $key = null): CollectionInterface; * // Result will look like this when converted to array * [ * 'a' => [1 => 'foo', 3 => 'baz'], - * 'b' => [2 => 'bar'] + * 'b' => [2 => 'bar'], * ]; * ``` * @@ -724,9 +720,9 @@ public function combine($keyPath, $valuePath, $groupPath = null): CollectionInte * based on an id property path and a parent id property path. * * @param callable|string $idPath the column name path to use for determining - * whether an element is parent of another + * whether an element is a parent of another * @param callable|string $parentPath the column name path to use for determining - * whether an element is child of another + * whether an element is a child of another * @param string $nestingKey The key name under which children are nested * @return self */ @@ -835,7 +831,7 @@ public function compile(bool $keepKeys = true): CollectionInterface; /** * Returns a new collection where any operations chained after it are guaranteed - * to be run lazily. That is, elements will be yieleded one at a time. + * to be run lazily. That is, elements will be yielded one at a time. * * A lazy collection can only be iterated once. A second attempt results in an error. * @@ -1162,7 +1158,7 @@ public function countKeys(): int; /** * Create a new collection that is the cartesian product of the current collection * - * In order to create a carteisan product a collection must contain a single dimension + * In order to create a cartesian product a collection must contain a single dimension * of data. * * ### Example diff --git a/app/vendor/cakephp/cakephp/src/Command/PluginLoadCommand.php b/app/vendor/cakephp/cakephp/src/Command/PluginLoadCommand.php index 912855011..bfd61b91b 100644 --- a/app/vendor/cakephp/cakephp/src/Command/PluginLoadCommand.php +++ b/app/vendor/cakephp/cakephp/src/Command/PluginLoadCommand.php @@ -110,7 +110,7 @@ protected function modifyApplication(string $app, string $plugin): void } // Check if plugin is already loaded - $regex = '/->addPlugin\(\'' . $plugin . '\'/mu'; + $regex = '#->addPlugin\(\'' . $plugin . '\'#mu'; if (preg_match($regex, $contents, $otherMatches, PREG_OFFSET_CAPTURE)) { $this->io->info('The specified plugin is already loaded!'); diff --git a/app/vendor/cakephp/cakephp/src/Controller/Component/SecurityComponent.php b/app/vendor/cakephp/cakephp/src/Controller/Component/SecurityComponent.php index 4043b3f36..1b84ba258 100644 --- a/app/vendor/cakephp/cakephp/src/Controller/Component/SecurityComponent.php +++ b/app/vendor/cakephp/cakephp/src/Controller/Component/SecurityComponent.php @@ -427,7 +427,7 @@ protected function _debugPostTokenNotMatching(Controller $controller, array $has $expectedFields = Hash::get($expectedParts, 1); $dataFields = Hash::get($hashParts, 1); if ($dataFields) { - $dataFields = unserialize($dataFields); + $dataFields = unserialize($dataFields, ['allowed_classes' => false]); } $fieldsMessages = $this->_debugCheckFields( $dataFields, diff --git a/app/vendor/cakephp/cakephp/src/Core/BasePlugin.php b/app/vendor/cakephp/cakephp/src/Core/BasePlugin.php index 08e5905d8..a748be37c 100644 --- a/app/vendor/cakephp/cakephp/src/Core/BasePlugin.php +++ b/app/vendor/cakephp/cakephp/src/Core/BasePlugin.php @@ -210,7 +210,7 @@ public function getTemplatePath(): string public function enable(string $hook) { $this->checkHook($hook); - $this->{"{$hook}Enabled}"} = true; + $this->{"{$hook}Enabled"} = true; return $this; } diff --git a/app/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php b/app/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php index c11a12c60..2db862427 100644 --- a/app/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php +++ b/app/vendor/cakephp/cakephp/src/Core/StaticConfigTrait.php @@ -68,7 +68,7 @@ trait StaticConfigTrait * ``` * * @param array|string $key The name of the configuration, or an array of multiple configs. - * @param object|array|null $config An array of name => configuration data for adapter. + * @param mixed $config Configuration value. Generally an array of name => configuration data for adapter. * @throws \BadMethodCallException When trying to modify an existing config. * @throws \LogicException When trying to store an invalid structured config array. * @return void @@ -95,7 +95,7 @@ public static function setConfig($key, $config = null): void $config = ['className' => $config]; } - if (isset($config['url'])) { + if (is_array($config) && isset($config['url'])) { $parsed = static::parseDsn($config['url']); unset($config['url']); $config = $parsed + $config; diff --git a/app/vendor/cakephp/cakephp/src/Core/functions.php b/app/vendor/cakephp/cakephp/src/Core/functions.php index e74ac1736..f938d8817 100644 --- a/app/vendor/cakephp/cakephp/src/Core/functions.php +++ b/app/vendor/cakephp/cakephp/src/Core/functions.php @@ -289,7 +289,12 @@ function deprecationWarning(string $message, int $stackFrame = 1): void $frame = $trace[$stackFrame]; $frame += ['file' => '[internal]', 'line' => '??']; - $relative = str_replace(DIRECTORY_SEPARATOR, '/', substr($frame['file'], strlen(ROOT) + 1)); + // Assuming we're installed in vendor/cakephp/cakephp/src/Core/functions.php + $root = dirname(__DIR__, 5); + if (defined('ROOT')) { + $root = ROOT; + } + $relative = str_replace(DIRECTORY_SEPARATOR, '/', substr($frame['file'], strlen($root) + 1)); $patterns = (array)Configure::read('Error.ignoredDeprecationPaths'); foreach ($patterns as $pattern) { $pattern = str_replace(DIRECTORY_SEPARATOR, '/', $pattern); diff --git a/app/vendor/cakephp/cakephp/src/Database/Query.php b/app/vendor/cakephp/cakephp/src/Database/Query.php index fc66f6e80..503c3a443 100644 --- a/app/vendor/cakephp/cakephp/src/Database/Query.php +++ b/app/vendor/cakephp/cakephp/src/Database/Query.php @@ -29,6 +29,7 @@ use InvalidArgumentException; use IteratorAggregate; use RuntimeException; +use Throwable; /** * This class represents a Relational database SQL Query. A query can be of @@ -2456,7 +2457,7 @@ function ($errno, $errstr) { ); $sql = $this->sql(); $params = $this->getValueBinder()->bindings(); - } catch (RuntimeException $e) { + } catch (Throwable $e) { $sql = 'SQL could not be generated for this query as it is incomplete.'; $params = []; } finally { diff --git a/app/vendor/cakephp/cakephp/src/Database/Schema/PostgresSchemaDialect.php b/app/vendor/cakephp/cakephp/src/Database/Schema/PostgresSchemaDialect.php index 4b2b6e7dd..423727582 100644 --- a/app/vendor/cakephp/cakephp/src/Database/Schema/PostgresSchemaDialect.php +++ b/app/vendor/cakephp/cakephp/src/Database/Schema/PostgresSchemaDialect.php @@ -642,6 +642,10 @@ public function createTableSql(TableSchema $schema, array $columns, array $const $content = array_merge($columns, $constraints); $content = implode(",\n", array_filter($content)); $tableName = $this->_driver->quoteIdentifier($schema->name()); + $dbSchema = $this->_driver->schema(); + if ($dbSchema != 'public') { + $tableName = $this->_driver->quoteIdentifier($dbSchema) . '.' . $tableName; + } $temporary = $schema->isTemporary() ? ' TEMPORARY ' : ' '; $out = []; $out[] = sprintf("CREATE%sTABLE %s (\n%s\n)", $temporary, $tableName, $content); diff --git a/app/vendor/cakephp/cakephp/src/Database/Schema/TableSchema.php b/app/vendor/cakephp/cakephp/src/Database/Schema/TableSchema.php index 3dac32330..9db5fbb16 100644 --- a/app/vendor/cakephp/cakephp/src/Database/Schema/TableSchema.php +++ b/app/vendor/cakephp/cakephp/src/Database/Schema/TableSchema.php @@ -475,13 +475,6 @@ public function addIndex(string $name, $attrs) $this->_table )); } - if (empty($attrs['columns'])) { - throw new DatabaseException(sprintf( - 'Index "%s" in table "%s" must have at least one column.', - $name, - $this->_table - )); - } $attrs['columns'] = (array)$attrs['columns']; foreach ($attrs['columns'] as $field) { if (empty($this->_columns[$field])) { diff --git a/app/vendor/cakephp/cakephp/src/Database/Type/DateTimeType.php b/app/vendor/cakephp/cakephp/src/Database/Type/DateTimeType.php index 655c78f3c..130b49bd2 100644 --- a/app/vendor/cakephp/cakephp/src/Database/Type/DateTimeType.php +++ b/app/vendor/cakephp/cakephp/src/Database/Type/DateTimeType.php @@ -229,10 +229,9 @@ public function toPHP($value, DriverInterface $driver) $class = $this->_className; if (is_int($value)) { $instance = new $class('@' . $value); + } elseif (strpos($value, '0000-00-00') === 0) { + return null; } else { - if (strpos($value, '0000-00-00') === 0) { - return null; - } $instance = new $class($value, $this->dbTimezone); } @@ -282,14 +281,13 @@ public function manyToPHP(array $values, array $fields, DriverInterface $driver) } $value = $values[$field]; - if (strpos($value, '0000-00-00') === 0) { - $values[$field] = null; - continue; - } $class = $this->_className; if (is_int($value)) { $instance = new $class('@' . $value); + } elseif (strpos($value, '0000-00-00') === 0) { + $values[$field] = null; + continue; } else { $instance = new $class($value, $this->dbTimezone); } diff --git a/app/vendor/cakephp/cakephp/src/Datasource/Paging/NumericPaginator.php b/app/vendor/cakephp/cakephp/src/Datasource/Paging/NumericPaginator.php index 66d0665c4..a49c21699 100644 --- a/app/vendor/cakephp/cakephp/src/Datasource/Paging/NumericPaginator.php +++ b/app/vendor/cakephp/cakephp/src/Datasource/Paging/NumericPaginator.php @@ -42,6 +42,13 @@ class NumericPaginator implements PaginatorInterface * - `allowedParameters` - A list of parameters users are allowed to set using request * parameters. Modifying this list will allow users to have more influence * over pagination, be careful with what you permit. + * - `sortableFields` - A list of fields which can be used for sorting. By + * default all table columns can be used for sorting. You can use this option + * to restrict sorting only by particular fields. If you want to allow + * sorting on either associated columns or calculated fields then you will + * have to explicity specify them (along with other fields). Using an empty + * array will disable sorting alltogether. + * - `finder` - The table finder to use. Defaults to `all`. * * @var array */ diff --git a/app/vendor/cakephp/cakephp/src/Filesystem/Folder.php b/app/vendor/cakephp/cakephp/src/Filesystem/Folder.php index 00d11a454..70ac122e7 100644 --- a/app/vendor/cakephp/cakephp/src/Filesystem/Folder.php +++ b/app/vendor/cakephp/cakephp/src/Filesystem/Folder.php @@ -776,8 +776,8 @@ public function delete(?string $path = null): bool * * ### Options * - * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of pwd(). - * - `mode` The mode to copy the files/directories with as integer, e.g. 0775. + * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of `pwd()`. + * - `mode` The mode to copy the files/directories with as integer, e.g. `0770`. * - `skip` Files/directories to skip. * - `scheme` Folder::MERGE, Folder::OVERWRITE, Folder::SKIP * - `recursive` Whether to copy recursively or not (default: true - recursive) @@ -877,8 +877,8 @@ public function copy(string $to, array $options = []): bool * * ### Options * - * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of pwd(). - * - `mode` The mode to copy the files/directories with as integer, e.g. 0775. + * - `from` The directory to copy from, this will cause a cd() to occur, changing the results of `pwd()`. + * - `mode` The mode to copy the files/directories with as integer, e.g. `0770`. * - `skip` Files/directories to skip. * - `scheme` Folder::MERGE, Folder::OVERWRITE, Folder::SKIP * - `recursive` Whether to copy recursively or not (default: true - recursive) diff --git a/app/vendor/cakephp/cakephp/src/Http/Cookie/CookieCollection.php b/app/vendor/cakephp/cakephp/src/Http/Cookie/CookieCollection.php index d7c13295f..a028433f3 100644 --- a/app/vendor/cakephp/cakephp/src/Http/Cookie/CookieCollection.php +++ b/app/vendor/cakephp/cakephp/src/Http/Cookie/CookieCollection.php @@ -88,7 +88,7 @@ public static function createFromServerRequest(ServerRequestInterface $request) $data = $request->getCookieParams(); $cookies = []; foreach ($data as $name => $value) { - $cookies[] = new Cookie($name, $value); + $cookies[] = new Cookie((string)$name, $value); } return new static($cookies); diff --git a/app/vendor/cakephp/cakephp/src/Http/composer.json b/app/vendor/cakephp/cakephp/src/Http/composer.json index c1ac3b358..ee0f86a2c 100644 --- a/app/vendor/cakephp/cakephp/src/Http/composer.json +++ b/app/vendor/cakephp/cakephp/src/Http/composer.json @@ -36,7 +36,7 @@ }, "provide": { "psr/http-client-implementation": "^1.0", - "psr/http-server-server-implementation": "^1.0", + "psr/http-server-implementation": "^1.0", "psr/http-server-middleware-implementation": "^1.0" }, "suggest": { diff --git a/app/vendor/cakephp/cakephp/src/I18n/DateFormatTrait.php b/app/vendor/cakephp/cakephp/src/I18n/DateFormatTrait.php index bd23d8cb5..942ce1a30 100644 --- a/app/vendor/cakephp/cakephp/src/I18n/DateFormatTrait.php +++ b/app/vendor/cakephp/cakephp/src/I18n/DateFormatTrait.php @@ -190,7 +190,7 @@ public function i18nFormat($format = null, $timezone = null, $locale = null) if ($timezone) { // Handle the immutable and mutable object cases. $time = clone $this; - $time = $time->timezone($timezone); + $time = $time->setTimezone($timezone); } $format = $format ?? static::$_toStringFormat; diff --git a/app/vendor/cakephp/cakephp/src/I18n/RelativeTimeFormatter.php b/app/vendor/cakephp/cakephp/src/I18n/RelativeTimeFormatter.php index ffc18a5b0..7615507f5 100644 --- a/app/vendor/cakephp/cakephp/src/I18n/RelativeTimeFormatter.php +++ b/app/vendor/cakephp/cakephp/src/I18n/RelativeTimeFormatter.php @@ -101,7 +101,7 @@ public function timeAgoInWords(I18nDateTimeInterface $time, array $options = []) { $options = $this->_options($options, FrozenTime::class); if ($options['timezone']) { - $time = $time->timezone($options['timezone']); + $time = $time->setTimezone($options['timezone']); } $now = $options['from']->format('U'); @@ -323,7 +323,7 @@ public function dateAgoInWords(I18nDateTimeInterface $date, array $options = []) { $options = $this->_options($options, FrozenDate::class); if ($options['timezone']) { - $date = $date->timezone($options['timezone']); + $date = $date->setTimezone($options['timezone']); } $now = $options['from']->format('U'); diff --git a/app/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php b/app/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php index 68be51147..0e6409eed 100644 --- a/app/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php +++ b/app/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php @@ -16,6 +16,7 @@ */ namespace Cake\Mailer\Transport; +use Cake\Core\Exception\CakeException; use Cake\Mailer\AbstractTransport; use Cake\Mailer\Message; use Cake\Network\Exception\SocketException; @@ -28,8 +29,15 @@ */ class SmtpTransport extends AbstractTransport { - protected const AUTH_PLAIN = 'PLAIN'; - protected const AUTH_LOGIN = 'LOGIN'; + public const AUTH_PLAIN = 'PLAIN'; + public const AUTH_LOGIN = 'LOGIN'; + public const AUTH_XOAUTH2 = 'XOAUTH2'; + + public const SUPPORTED_AUTH_TYPES = [ + self::AUTH_PLAIN, + self::AUTH_LOGIN, + self::AUTH_XOAUTH2, + ]; /** * Default config for this class @@ -45,6 +53,7 @@ class SmtpTransport extends AbstractTransport 'client' => null, 'tls' => false, 'keepAlive' => false, + 'authType' => null, ]; /** @@ -69,7 +78,7 @@ class SmtpTransport extends AbstractTransport protected $_lastResponse = []; /** - * Detected authentication type. + * Authentication type. * * @var string|null */ @@ -230,7 +239,22 @@ protected function _bufferResponseLines(array $responseLines): void */ protected function _parseAuthType(): void { - $this->authType = null; + $authType = $this->getConfig('authType'); + if ($authType !== null) { + if (!in_array($authType, self::SUPPORTED_AUTH_TYPES)) { + throw new CakeException( + 'Unsupported auth type. Available types are: ' . implode(', ', self::SUPPORTED_AUTH_TYPES) + ); + } + + $this->authType = $authType; + + return; + } + + if (!isset($this->_config['username'], $this->_config['password'])) { + return; + } $auth = ''; foreach ($this->_lastResponse as $line) { @@ -240,17 +264,19 @@ protected function _parseAuthType(): void } } - if (strpos($auth, self::AUTH_PLAIN) !== false) { - $this->authType = self::AUTH_PLAIN; - + if ($auth === '') { return; } - if (strpos($auth, self::AUTH_LOGIN) !== false) { - $this->authType = self::AUTH_LOGIN; + foreach (self::SUPPORTED_AUTH_TYPES as $type) { + if (strpos($auth, $type) !== false) { + $this->authType = $type; - return; + return; + } } + + throw new CakeException('Unsupported auth type: ' . substr($auth, 5)); } /** @@ -322,27 +348,27 @@ protected function _auth(): void $username = $this->_config['username']; $password = $this->_config['password']; - if (empty($this->authType)) { - $replyCode = $this->_authPlain($username, $password); - if ($replyCode === '235') { - return; - } - - $this->_authLogin($username, $password); - return; - } + switch ($this->authType) { + case self::AUTH_PLAIN: + $this->_authPlain($username, $password); + break; - if ($this->authType === self::AUTH_PLAIN) { - $this->_authPlain($username, $password); + case self::AUTH_LOGIN: + $this->_authLogin($username, $password); + break; - return; - } + case self::AUTH_XOAUTH2: + $this->_authXoauth2($username, $password); + break; - if ($this->authType === self::AUTH_LOGIN) { - $this->_authLogin($username, $password); + default: + $replyCode = $this->_authPlain($username, $password); + if ($replyCode === '235') { + break; + } - return; + $this->_authLogin($username, $password); } } @@ -394,6 +420,26 @@ protected function _authLogin(string $username, string $password): void } } + /** + * Authenticate using AUTH XOAUTH2 mechanism. + * + * @param string $username Username. + * @param string $token Token. + * @return void + * @see https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth#smtp-protocol-exchange + * @see https://developers.google.com/gmail/imap/xoauth2-protocol#smtp_protocol_exchange + */ + protected function _authXoauth2(string $username, string $token): void + { + $authString = base64_encode(sprintf( + "user=%s\1auth=Bearer %s\1\1", + $username, + $token + )); + + $this->_smtpSend('AUTH XOAUTH2 ' . $authString, '235'); + } + /** * Prepares the `MAIL FROM` SMTP command. * diff --git a/app/vendor/cakephp/cakephp/src/ORM/AssociationCollection.php b/app/vendor/cakephp/cakephp/src/ORM/AssociationCollection.php index 5e7d6ff2c..9e9e9c0d1 100644 --- a/app/vendor/cakephp/cakephp/src/ORM/AssociationCollection.php +++ b/app/vendor/cakephp/cakephp/src/ORM/AssociationCollection.php @@ -66,6 +66,9 @@ public function __construct(?LocatorInterface $tableLocator = null) * @param string $alias The association alias * @param \Cake\ORM\Association $association The association to add. * @return \Cake\ORM\Association The association object being added. + * @template T of \Cake\ORM\Association + * @psalm-param T $association + * @psalm-return T */ public function add(string $alias, Association $association): Association { @@ -82,7 +85,9 @@ public function add(string $alias, Association $association): Association * @param array $options List of options to configure the association definition. * @return \Cake\ORM\Association * @throws \InvalidArgumentException - * @psalm-param class-string<\Cake\ORM\Association> $className + * @template T of \Cake\ORM\Association + * @psalm-param class-string $className + * @psalm-return T */ public function load(string $className, string $associated, array $options = []): Association { diff --git a/app/vendor/cakephp/cakephp/src/ORM/Table.php b/app/vendor/cakephp/cakephp/src/ORM/Table.php index 0c8250691..1a37af224 100644 --- a/app/vendor/cakephp/cakephp/src/ORM/Table.php +++ b/app/vendor/cakephp/cakephp/src/ORM/Table.php @@ -632,9 +632,7 @@ protected function _initializeSchema(TableSchemaInterface $schema): TableSchemaI */ public function hasField(string $field): bool { - $schema = $this->getSchema(); - - return $schema->getColumn($field) !== null; + return $this->getSchema()->getColumn($field) !== null; } /** @@ -1048,10 +1046,7 @@ public function belongsTo(string $associated, array $options = []): BelongsTo { $options += ['sourceTable' => $this]; - /** @var \Cake\ORM\Association\BelongsTo $association */ - $association = $this->_associations->load(BelongsTo::class, $associated, $options); - - return $association; + return $this->_associations->load(BelongsTo::class, $associated, $options); } /** @@ -1094,10 +1089,7 @@ public function hasOne(string $associated, array $options = []): HasOne { $options += ['sourceTable' => $this]; - /** @var \Cake\ORM\Association\HasOne $association */ - $association = $this->_associations->load(HasOne::class, $associated, $options); - - return $association; + return $this->_associations->load(HasOne::class, $associated, $options); } /** @@ -1146,10 +1138,7 @@ public function hasMany(string $associated, array $options = []): HasMany { $options += ['sourceTable' => $this]; - /** @var \Cake\ORM\Association\HasMany $association */ - $association = $this->_associations->load(HasMany::class, $associated, $options); - - return $association; + return $this->_associations->load(HasMany::class, $associated, $options); } /** @@ -1200,10 +1189,7 @@ public function belongsToMany(string $associated, array $options = []): BelongsT { $options += ['sourceTable' => $this]; - /** @var \Cake\ORM\Association\BelongsToMany $association */ - $association = $this->_associations->load(BelongsToMany::class, $associated, $options); - - return $association; + return $this->_associations->load(BelongsToMany::class, $associated, $options); } /** @@ -2782,9 +2768,8 @@ public function newEmptyEntity(): EntityInterface public function newEntity(array $data, array $options = []): EntityInterface { $options['associated'] = $options['associated'] ?? $this->_associations->keys(); - $marshaller = $this->marshaller(); - return $marshaller->one($data, $options); + return $this->marshaller()->one($data, $options); } /** @@ -2822,9 +2807,8 @@ public function newEntity(array $data, array $options = []): EntityInterface public function newEntities(array $data, array $options = []): array { $options['associated'] = $options['associated'] ?? $this->_associations->keys(); - $marshaller = $this->marshaller(); - return $marshaller->many($data, $options); + return $this->marshaller()->many($data, $options); } /** @@ -2881,9 +2865,8 @@ public function newEntities(array $data, array $options = []): array public function patchEntity(EntityInterface $entity, array $data, array $options = []): EntityInterface { $options['associated'] = $options['associated'] ?? $this->_associations->keys(); - $marshaller = $this->marshaller(); - return $marshaller->merge($entity, $data, $options); + return $this->marshaller()->merge($entity, $data, $options); } /** @@ -2920,9 +2903,8 @@ public function patchEntity(EntityInterface $entity, array $data, array $options public function patchEntities(iterable $entities, array $data, array $options = []): array { $options['associated'] = $options['associated'] ?? $this->_associations->keys(); - $marshaller = $this->marshaller(); - return $marshaller->mergeMany($entities, $data, $options); + return $this->marshaller()->mergeMany($entities, $data, $options); } /** diff --git a/app/vendor/cakephp/cakephp/src/Routing/RouteBuilder.php b/app/vendor/cakephp/cakephp/src/Routing/RouteBuilder.php index 80952eee0..25dcfd5eb 100644 --- a/app/vendor/cakephp/cakephp/src/Routing/RouteBuilder.php +++ b/app/vendor/cakephp/cakephp/src/Routing/RouteBuilder.php @@ -985,13 +985,13 @@ public function registerMiddleware(string $name, $middleware) } /** - * Apply a middleware to the current route scope. + * Apply one or many middleware to the current route scope. * - * Requires middleware to be registered via `registerMiddleware()` + * Requires middleware to be registered via `registerMiddleware()`. * * @param string ...$names The names of the middleware to apply to the current scope. * @return $this - * @throws \RuntimeException + * @throws \RuntimeException If it cannot apply one of the given middleware or middleware groups. * @see \Cake\Routing\RouteCollection::addMiddlewareToScope() */ public function applyMiddleware(string ...$names) diff --git a/app/vendor/cakephp/cakephp/src/Routing/RouteCollection.php b/app/vendor/cakephp/cakephp/src/Routing/RouteCollection.php index 5ceadaf14..8f96a5a99 100644 --- a/app/vendor/cakephp/cakephp/src/Routing/RouteCollection.php +++ b/app/vendor/cakephp/cakephp/src/Routing/RouteCollection.php @@ -124,6 +124,12 @@ public function parse(string $url, string $method = ''): array { $decoded = urldecode($url); + $queryParameters = []; + if (strpos($url, '?') !== false) { + [$url, $qs] = explode('?', $url, 2); + parse_str($qs, $queryParameters); + } + // Sort path segments matching longest paths first. krsort($this->_paths); @@ -132,12 +138,6 @@ public function parse(string $url, string $method = ''): array continue; } - $queryParameters = []; - if (strpos($url, '?') !== false) { - [$url, $qs] = explode('?', $url, 2); - parse_str($qs, $queryParameters); - } - foreach ($routes as $route) { $r = $route->parse($url, $method); if ($r === null) { diff --git a/app/vendor/cakephp/cakephp/src/Shell/Helper/ProgressHelper.php b/app/vendor/cakephp/cakephp/src/Shell/Helper/ProgressHelper.php index b91a69c5b..f3eb29ff1 100644 --- a/app/vendor/cakephp/cakephp/src/Shell/Helper/ProgressHelper.php +++ b/app/vendor/cakephp/cakephp/src/Shell/Helper/ProgressHelper.php @@ -35,6 +35,17 @@ */ class ProgressHelper extends Helper { + /** + * Default value for progress bar total value. + * Percent completion is derived from progress/total + */ + protected const DEFAULT_TOTAL = 100; + + /** + * Default value for progress bar width + */ + protected const DEFAULT_WIDTH = 80; + /** * The current progress. * @@ -47,14 +58,14 @@ class ProgressHelper extends Helper * * @var int */ - protected $_total = 0; + protected $_total = self::DEFAULT_TOTAL; /** * The width of the bar. * * @var int */ - protected $_width = 0; + protected $_width = self::DEFAULT_WIDTH; /** * Output a progress bar. @@ -102,7 +113,7 @@ public function output(array $args): void */ public function init(array $args = []) { - $args += ['total' => 100, 'width' => 80]; + $args += ['total' => self::DEFAULT_TOTAL, 'width' => self::DEFAULT_WIDTH]; $this->_progress = 0; $this->_width = $args['width']; $this->_total = $args['total']; diff --git a/app/vendor/cakephp/cakephp/src/Validation/Validation.php b/app/vendor/cakephp/cakephp/src/Validation/Validation.php index c70c3d80e..6ca684f3a 100644 --- a/app/vendor/cakephp/cakephp/src/Validation/Validation.php +++ b/app/vendor/cakephp/cakephp/src/Validation/Validation.php @@ -1614,7 +1614,7 @@ public static function utf8($value, array $options = []): bool } $options += ['extended' => false]; if ($options['extended']) { - return true; + return preg_match('//u', $value) === 1; } return preg_match('/[\x{10000}-\x{10FFFF}]/u', $value) === 0; diff --git a/app/vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php b/app/vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php index a3033bcc2..058248c99 100644 --- a/app/vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php +++ b/app/vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php @@ -891,11 +891,9 @@ protected function _modulusNumbers(StringTemplate $templater, array $params, arr ]); } - $url = $options['url']; - $url['?']['page'] = $params['page']; $out .= $templater->format('current', [ 'text' => $this->Number->format($params['page']), - 'url' => $this->generateUrl($url, $options['model']), + 'url' => $this->generateUrl(['page' => $params['page']], $options['model'], $options['url']), ]); $start = $params['page'] + 1; diff --git a/app/vendor/cakephp/cakephp/src/View/Helper/TimeHelper.php b/app/vendor/cakephp/cakephp/src/View/Helper/TimeHelper.php index 89b4e31d1..bd1ffe1a7 100644 --- a/app/vendor/cakephp/cakephp/src/View/Helper/TimeHelper.php +++ b/app/vendor/cakephp/cakephp/src/View/Helper/TimeHelper.php @@ -71,7 +71,7 @@ public function fromString($dateString, $timezone = null): FrozenTime { $time = new FrozenTime($dateString); if ($timezone !== null) { - $time = $time->timezone($timezone); + $time = $time->setTimezone($timezone); } return $time; @@ -226,7 +226,7 @@ public function toAtom($dateString, $timezone = null): string { $timezone = $this->_getTimezone($timezone) ?: date_default_timezone_get(); - return (new FrozenTime($dateString))->timezone($timezone)->toAtomString(); + return (new FrozenTime($dateString))->setTimeZone($timezone)->toAtomString(); } /** @@ -240,7 +240,7 @@ public function toRss($dateString, $timezone = null): string { $timezone = $this->_getTimezone($timezone) ?: date_default_timezone_get(); - return (new FrozenTime($dateString))->timezone($timezone)->toRssString(); + return (new FrozenTime($dateString))->setTimeZone($timezone)->toRssString(); } /** diff --git a/app/vendor/cakephp/cakephp/tests/phpstan.neon b/app/vendor/cakephp/cakephp/tests/phpstan.neon index a940ab7f5..44e1191d3 100644 --- a/app/vendor/cakephp/cakephp/tests/phpstan.neon +++ b/app/vendor/cakephp/cakephp/tests/phpstan.neon @@ -1,3 +1,6 @@ +includes: + - phpstan-baseline.neon + parameters: level: 1 treatPhpDocTypesAsCertain: false diff --git a/app/vendor/cakephp/chronos/LICENSE b/app/vendor/cakephp/chronos/LICENSE index 97f3ee6d4..e8772ee54 100644 --- a/app/vendor/cakephp/chronos/LICENSE +++ b/app/vendor/cakephp/chronos/LICENSE @@ -1,5 +1,5 @@ Copyright (C) Brian Nesbitt -Copyright (C) Cake Software Foundation, Inc. (http://cakefoundation.org) +Copyright (C) Cake Software Foundation, Inc. (https://cakefoundation.org) 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/app/vendor/cakephp/chronos/README.md b/app/vendor/cakephp/chronos/README.md index 0aad3315e..ca6f943dd 100644 --- a/app/vendor/cakephp/chronos/README.md +++ b/app/vendor/cakephp/chronos/README.md @@ -63,7 +63,6 @@ want to migrate, we could use the following to update files: ``` # Replace imports -find ./src -type f -name '*.php' -exec sed -i '' 's/use Carbon\\CarbonInterval/use Cake\\Chronos\\ChronosInterval/g' {} \; find ./src -type f -name '*.php' -exec sed -i '' 's/use Carbon\\CarbonImmutable/use Cake\\Chronos\\Chronos/g' {} \; find ./src -type f -name '*.php' -exec sed -i '' 's/use Carbon\\Carbon/use Cake\\Chronos\\Chronos/g' {} \; @@ -104,7 +103,7 @@ In the case that you need a mutable instance you can get one: $time = new Chronos('2015-10-21 16:29:00'); $mutable = $time->toMutable(); -$date = new Date('2015-10-21'); +$date = new ChronosDate('2015-10-21'); $mutable = $date->toMutable(); ``` @@ -130,9 +129,9 @@ set to the server default timezone. This makes them ideal when working with calendar dates as the time components will always match. ```php -use Cake\Chronos\Date; +use Cake\Chronos\ChronosDate; -$today = new Date(); +$today = new ChronosDate(); echo $today; // Outputs '2015-10-21' diff --git a/app/vendor/cakephp/chronos/compare-data.json b/app/vendor/cakephp/chronos/compare-data.json new file mode 100644 index 000000000..0619f37fa --- /dev/null +++ b/app/vendor/cakephp/chronos/compare-data.json @@ -0,0 +1 @@ +{"2x":{"Cake\\Chronos\\Chronos":["__construct","toMutable","copy","setTestNow","getTestNow","hasTestNow","createInterval","__debugInfo","checkTypes","__wakeup","__set_state","createFromFormat","getLastErrors","format","getTimezone","getOffset","getTimestamp","diff","modify","add","sub","setTimezone","setTime","setDate","setISODate","setTimestamp","createFromMutable","createFromInterface","getWeekendDays","setWeekendDays","eq","equals","ne","notEquals","gt","greaterThan","gte","greaterThanOrEquals","lt","lessThan","lte","lessThanOrEquals","between","closest","farthest","min","max","isWeekday","isWeekend","isYesterday","isToday","isTomorrow","isNextWeek","isLastWeek","isNextMonth","isLastMonth","isNextYear","isLastYear","isFuture","isPast","isLeapYear","isSameDay","isSunday","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","isThisWeek","isThisMonth","isThisYear","isBirthday","wasWithinLast","isWithinNext","isMutable","diffInYears","diffInMonths","diffInMonthsIgnoreTimezone","diffInWeeks","diffInDays","diffInDaysFiltered","diffInHoursFiltered","diffFiltered","diffInWeekdays","diffInWeekendDays","diffInHours","diffInMinutes","diffInSeconds","secondsSinceMidnight","secondsUntilEndOfDay","fromNow","diffForHumans","diffFormatter","instance","parse","now","today","tomorrow","yesterday","maxValue","minValue","create","createFromDate","createFromTime","createFromArray","createFromTimestamp","createFromTimestampUTC","resetToStringFormat","setToStringFormat","__toString","toDateString","toFormattedDateString","toTimeString","toDateTimeString","toDayDateTimeString","toAtomString","toCookieString","toIso8601String","toRfc822String","toRfc850String","toRfc1036String","toRfc1123String","toRfc2822String","toRfc3339String","toRssString","toW3cString","toUnixString","toQuarter","toWeek","__get","__isset","getWeekStartsAt","setWeekStartsAt","getWeekEndsAt","setWeekEndsAt","setDateTime","setTimeFromTimeString","timestamp","year","month","day","hour","minute","second","microsecond","addYears","addYear","subYears","subYear","addYearsWithOverflow","addYearWithOverflow","subYearsWithOverflow","subYearWithOverflow","addMonths","addMonth","subMonth","subMonths","addMonthsWithOverflow","addMonthWithOverflow","subMonthsWithOverflow","subMonthWithOverflow","addDays","addDay","subDay","subDays","addWeekdays","addWeekday","subWeekdays","subWeekday","addWeeks","addWeek","subWeek","subWeeks","addHours","addHour","subHour","subHours","addMinutes","addMinute","subMinute","subMinutes","addSeconds","addSecond","subSecond","subSeconds","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfYear","endOfYear","startOfDecade","endOfDecade","startOfCentury","endOfCentury","startOfWeek","endOfWeek","next","previous","firstOfMonth","lastOfMonth","nthOfMonth","firstOfQuarter","lastOfQuarter","nthOfQuarter","firstOfYear","lastOfYear","nthOfYear","average","hasRelativeKeywords","timezone","tz"],"Cake\\Chronos\\ChronosDate":["__construct","toMutable","__debugInfo","create","add","sub","modify","setTimestamp","hour","minute","second","microsecond","__wakeup","__set_state","createFromFormat","getLastErrors","format","getTimezone","getOffset","getTimestamp","diff","setTimezone","setTime","setDate","setISODate","createFromMutable","createFromInterface","getWeekendDays","setWeekendDays","eq","equals","ne","notEquals","gt","greaterThan","gte","greaterThanOrEquals","lt","lessThan","lte","lessThanOrEquals","between","closest","farthest","min","max","isWeekday","isWeekend","isYesterday","isToday","isTomorrow","isNextWeek","isLastWeek","isNextMonth","isLastMonth","isNextYear","isLastYear","isFuture","isPast","isLeapYear","isSameDay","isSunday","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","isThisWeek","isThisMonth","isThisYear","isBirthday","wasWithinLast","isWithinNext","isMutable","copy","diffInYears","diffInMonths","diffInMonthsIgnoreTimezone","diffInWeeks","diffInDays","diffInDaysFiltered","diffInHoursFiltered","diffFiltered","diffInWeekdays","diffInWeekendDays","diffInHours","diffInMinutes","diffInSeconds","secondsSinceMidnight","secondsUntilEndOfDay","fromNow","diffForHumans","diffFormatter","instance","parse","now","today","tomorrow","yesterday","maxValue","minValue","createFromDate","createFromTime","createFromArray","createFromTimestamp","createFromTimestampUTC","resetToStringFormat","setToStringFormat","__toString","toDateString","toFormattedDateString","toTimeString","toDateTimeString","toDayDateTimeString","toAtomString","toCookieString","toIso8601String","toRfc822String","toRfc850String","toRfc1036String","toRfc1123String","toRfc2822String","toRfc3339String","toRssString","toW3cString","toUnixString","toQuarter","toWeek","timezone","tz","hasRelativeKeywords","__get","__isset","getWeekStartsAt","setWeekStartsAt","getWeekEndsAt","setWeekEndsAt","setDateTime","setTimeFromTimeString","timestamp","year","month","day","addYears","addYear","subYears","subYear","addYearsWithOverflow","addYearWithOverflow","subYearsWithOverflow","subYearWithOverflow","addMonths","addMonth","subMonth","subMonths","addMonthsWithOverflow","addMonthWithOverflow","subMonthsWithOverflow","subMonthWithOverflow","addDays","addDay","subDay","subDays","addWeekdays","addWeekday","subWeekdays","subWeekday","addWeeks","addWeek","subWeek","subWeeks","addHours","addHour","subHour","subHours","addMinutes","addMinute","subMinute","subMinutes","addSeconds","addSecond","subSecond","subSeconds","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfYear","endOfYear","startOfDecade","endOfDecade","startOfCentury","endOfCentury","startOfWeek","endOfWeek","next","previous","firstOfMonth","lastOfMonth","nthOfMonth","firstOfQuarter","lastOfQuarter","nthOfQuarter","firstOfYear","lastOfYear","nthOfYear","average","setTestNow","getTestNow","hasTestNow"]},"3x":{"Cake\\Chronos\\Chronos":["__construct","setTestNow","getTestNow","hasTestNow","hasRelativeKeywords","getWeekendDays","setWeekendDays","getWeekStartsAt","setWeekStartsAt","getWeekEndsAt","setWeekEndsAt","diffFormatter","instance","parse","now","today","tomorrow","yesterday","maxValue","minValue","create","createFromDate","createFromTime","createFromFormat","createFromArray","createFromTimestamp","createFromTimestampUTC","createInterval","setDateTime","setDate","setTime","modify","diff","format","getOffset","setTimestamp","getTimestamp","setTimezone","getTimezone","setTimeFromTimeString","timestamp","year","month","day","hour","minute","second","microsecond","addYears","subYears","addYearsWithOverflow","subYearsWithOverflow","addMonths","subMonths","addMonthsWithOverflow","subMonthsWithOverflow","addDays","subDays","addWeekdays","subWeekdays","addWeeks","subWeeks","addHours","subHours","addMinutes","subMinutes","addSeconds","subSeconds","startOfDay","endOfDay","startOfMonth","endOfMonth","startOfYear","endOfYear","startOfDecade","endOfDecade","startOfCentury","endOfCentury","startOfWeek","endOfWeek","next","previous","firstOfMonth","lastOfMonth","nthOfMonth","firstOfQuarter","lastOfQuarter","nthOfQuarter","firstOfYear","lastOfYear","nthOfYear","equals","notEquals","greaterThan","greaterThanOrEquals","lessThan","lessThanOrEquals","between","closest","farthest","min","max","average","isWeekday","isWeekend","isYesterday","isToday","isTomorrow","isNextWeek","isLastWeek","isNextMonth","isLastMonth","isNextYear","isLastYear","isFuture","isPast","isLeapYear","isSameDay","isSunday","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","isThisWeek","isThisMonth","isThisYear","isBirthday","wasWithinLast","isWithinNext","diffFiltered","diffInYears","diffInMonths","diffInMonthsIgnoreTimezone","diffInWeeks","diffInDays","diffInDaysFiltered","diffInHoursFiltered","diffInWeekdays","diffInWeekendDays","diffInHours","diffInMinutes","diffInSeconds","secondsSinceMidnight","secondsUntilEndOfDay","fromNow","diffForHumans","__get","__isset","__debugInfo","resetToStringFormat","setToStringFormat","__toString","toDateString","toFormattedDateString","toTimeString","toDateTimeString","toDayDateTimeString","toAtomString","toCookieString","toIso8601String","toRfc822String","toRfc850String","toRfc1036String","toRfc1123String","toRfc2822String","toRfc3339String","toRssString","toW3cString","toUnixString","toQuarter","toWeek"],"Cake\\Chronos\\ChronosDate":["__construct","now","today","tomorrow","yesterday","parse","create","createFromFormat","createFromArray","diffFormatter","add","sub","modify","setDate","diff","format","year","month","day","addYears","subYears","addYearsWithOverflow","subYearsWithOverflow","addMonths","subMonths","addMonthsWithOverflow","subMonthsWithOverflow","addDays","subDays","addWeekdays","subWeekdays","addWeeks","subWeeks","startOfMonth","endOfMonth","startOfYear","endOfYear","startOfDecade","endOfDecade","startOfCentury","endOfCentury","startOfWeek","endOfWeek","next","previous","firstOfMonth","lastOfMonth","nthOfMonth","firstOfQuarter","lastOfQuarter","nthOfQuarter","firstOfYear","lastOfYear","nthOfYear","equals","notEquals","greaterThan","greaterThanOrEquals","lessThan","lessThanOrEquals","between","closest","farthest","isWeekday","isWeekend","isYesterday","isToday","isTomorrow","isNextWeek","isLastWeek","isNextMonth","isLastMonth","isNextYear","isLastYear","isFuture","isPast","isLeapYear","isSunday","isMonday","isTuesday","isWednesday","isThursday","isFriday","isSaturday","wasWithinLast","isWithinNext","diffFiltered","diffInYears","diffInMonths","diffInWeeks","diffInDays","diffInDaysFiltered","diffInWeekdays","diffInWeekendDays","diffForHumans","__get","__isset","__debugInfo","resetToStringFormat","setToStringFormat","__toString","toDateString","toFormattedDateString","toTimeString","toDateTimeString","toDayDateTimeString","toAtomString","toCookieString","toIso8601String","toRfc822String","toRfc850String","toRfc1036String","toRfc1123String","toRfc2822String","toRfc3339String","toRssString","toW3cString","toUnixString","toQuarter","toWeek"]}} \ No newline at end of file diff --git a/app/vendor/cakephp/chronos/docs.Dockerfile b/app/vendor/cakephp/chronos/docs.Dockerfile index 032ed39c6..7f6a1263e 100644 --- a/app/vendor/cakephp/chronos/docs.Dockerfile +++ b/app/vendor/cakephp/chronos/docs.Dockerfile @@ -1,5 +1,5 @@ # Generate the HTML output. -FROM markstory/cakephp-docs-builder as builder +FROM ghcr.io/cakephp/docs-builder as builder RUN pip install git+https://github.com/sphinx-contrib/video.git@master @@ -11,7 +11,7 @@ RUN cd /data/docs-builder && \ make website LANGS="$LANGS" SOURCE=/data/docs DEST=/data/website # Build a small nginx container with just the static site in it. -FROM markstory/cakephp-docs-builder:runtime as runtime +FROM ghcr.io/cakephp/docs-builder:runtime as runtime ENV LANGS="en fr ja pt" ENV SEARCH_SOURCE="/usr/share/nginx/html" diff --git a/app/vendor/cakephp/chronos/docs/en/2-4-upgrade-guide.rst b/app/vendor/cakephp/chronos/docs/en/2-4-upgrade-guide.rst new file mode 100644 index 000000000..3dedf799f --- /dev/null +++ b/app/vendor/cakephp/chronos/docs/en/2-4-upgrade-guide.rst @@ -0,0 +1,78 @@ +2.4 Upgrade Guide +################# + +Chronos 2.4 introduces a number of deprecations that will help you prepare your +application for the upcoming Chronos 3.x release. This guide covers the +deprecations introduced in 2.4 and gives a preview of what to expect in 3.0. + +No more mutable objects +======================= + +Chronos was an early adopter of PHP's immutable datetime objects. With PHP +moving away from mutable datetime objects both ``Cake\Chronos\MutableDate`` and +``Cake\Chronos\MutaleDateTime`` are deprecated and will be removed in 3.0.0. + +To upgrade, replace usage of ``MutableDate`` with ``ChronosDate`` and +``MutableDateTime`` with ``Chronos``. When modifying datetimes be sure to +always re-assign the variable with the datetime:: + + // Mutate in place + $datetime->modify('+1 days'); + + // Immutable objects must re-assign + $datetime = $datetime->modify('+1 days'); + +ChronosInterface deprecated +=========================== + +Having a consistent interface between date and datetime objects has proven to be +problematic. It created an illusion of compatibility between mutable and +immutable objects and date and datetime objects. Because the +``ChronosInterface`` didn't and can't really deliver on the goals of interfaces +it is deprecated, and will be removed in 3.0. To update your code replace +references to ``ChronosInterface`` with either a reference to +``Cake\Chronos\Chronos`` for datetime instances or ``Cake\Chronos\ChronosDate`` +for date instances. + +Fewer mutation methods +====================== + +For historical reasons the chronos classes included many redundant methods. For +example ``addYear()`` and ``addYears()``. In 2.4.0, all of the singular methods +e.g. ``addYear()`` are deprecated. Instead use the plural versions of the +methods e.g. ``addYears()``. + +Simpler Date class +================== + +When date abstractions were introduced they shared an interfaces with DateTime +classes. This resulted in many no-op methods on dates. For example calling +``setTime()`` on a date would have no effect. In 2.4, all time related methods +(including timezones) are deprecated on date instances. If your application +needs to use the time component of a date, you should use ``Chronos`` instead. + +Upcoming removals in 3.0 +======================== + +The following changes will arrive in 3.0, and don't have a simple deprecation +path. Unfortunately these changes will result in hard breaks in 3.0. + +Carbon aliases removed +---------------------- + +When Chronos was started Carbon had no active maintainers. We included +compatiblity aliases in Chronos to help users migrate from the unmaintained +Carbon library to Chronos. Presently, Carbon has active maintainers and we no +longer feel the need to provide shims. + +No longer extending DateTime +---------------------------- + +Historically Chronos has extended PHP's ``DateTime`` classes. This has proven to +be problematic especially for date classes. While Chronos will not extend +PHP's ``DateTime`` classes or implements the ``DateTimeInterface``, if a method does +not emit a deprecation in 2.4.0 it will continue to work in 3.0. + +To adapt to this change before upgrading to 3.0 replace references to PHP's +``DateTime`` and ``DateTimeInterface`` and use ``Chronos`` or ``ChronosDate`` +instead. diff --git a/app/vendor/cakephp/chronos/docs/en/contents.rst b/app/vendor/cakephp/chronos/docs/en/contents.rst index 10625a2c6..77906664c 100644 --- a/app/vendor/cakephp/chronos/docs/en/contents.rst +++ b/app/vendor/cakephp/chronos/docs/en/contents.rst @@ -3,5 +3,6 @@ :caption: CakePHP Chronos /index + /2-4-upgrade-guide - API \ No newline at end of file + API diff --git a/app/vendor/cakephp/chronos/docs/en/index.rst b/app/vendor/cakephp/chronos/docs/en/index.rst index dabb9b267..44668765c 100644 --- a/app/vendor/cakephp/chronos/docs/en/index.rst +++ b/app/vendor/cakephp/chronos/docs/en/index.rst @@ -26,11 +26,9 @@ Chronos provides 5 classes that cover mutable and immutable date/time variants and extensions to ``DateInterval``. * ``Cake\Chronos\Chronos`` is an immutable *date and time* object. -* ``Cake\Chronos\Date`` is a immutable *date* object. +* ``Cake\Chronos\ChronosDate`` is a immutable *date* object. * ``Cake\Chronos\MutableDateTime`` is a mutable *date and time* object. * ``Cake\Chronos\MutableDate`` is a mutable *date* object. -* ``Cake\Chronos\ChronosInterval`` is an extension to the ``DateInterval`` - object. Lastly, if you want to typehint against Chronos-provided date/time objects you should use ``Cake\Chronos\ChronosInterface``. All of the date and time objects @@ -97,13 +95,13 @@ Date Objects PHP only provides a single DateTime object. Representing calendar dates can be a bit awkward with this class as it includes timezones, and time components that don't really belong in the concept of a 'day'. Chronos provides a ``Date`` -object that allows you to represent dates. The time and timezone for these -objects is always fixed to ``00:00:00 UTC`` and all formatting/difference -methods operate at the day resolution:: +object that allows you to represent dates. The time for date objects is always +fixed to ``00:00:00``, and the timezone is set to the server local timezone. All +formatting/difference methods operate at the day resolution:: - use Cake\Chronos\Date; + use Cake\Chronos\ChronosDate; - $today = Date::today(); + $today = ChronosDate::today(); // Changes to the time/timezone are ignored. $today->modify('+1 hours'); @@ -117,7 +115,7 @@ time zone to use for current time such as ``now()`` or ``today()``:: use Cake\Chronos\Date: // Takes the current date from Asia/Tokyo time zone - $today = Date::today('Asia/Tokyo'); + $today = ChronosDate::today('Asia/Tokyo'); Modifier Methods ---------------- @@ -302,7 +300,7 @@ process you can include the following:: Chronos::setTestNow(Chronos::now()); MutableDateTime::setTestNow(MutableDateTime::now()); - Date::setTestNow(Date::now()); + ChronosDate::setTestNow(ChronosDate::now()); MutableDate::setTestNow(MutableDate::now()); This will fix the current time of all objects to be the point at which the test diff --git a/app/vendor/cakephp/chronos/docs/fr/index.rst b/app/vendor/cakephp/chronos/docs/fr/index.rst index 325767dcc..b3d76723a 100644 --- a/app/vendor/cakephp/chronos/docs/fr/index.rst +++ b/app/vendor/cakephp/chronos/docs/fr/index.rst @@ -27,11 +27,9 @@ par PHP. Chronos fournit 5 classes qui gèrent les variantes mutables et immutables de date/time et les extensions de ``DateInterval``. * ``Cake\Chronos\Chronos`` est un objet de *date et heure* immutable. -* ``Cake\Chronos\Date`` est un objet de *date* immutable. +* ``Cake\Chronos\ChronosDate`` est un objet de *date* immutable. * ``Cake\Chronos\MutableDateTime`` est un objet de *date et heure* mutable. * ``Cake\Chronos\MutableDate`` est un objet de *date* mutable. -* ``Cake\Chronos\ChronosInterval`` est une extension pour l'objet - ``DateInterval``. Enfin si vous voulez typer selon les objets date/time fournis par Chronos, vous devez utiliser ``Cake\Chronos\ChronosInterface``. Tous les objets date et @@ -105,9 +103,9 @@ de représenter les dates. Les time et timezone pour ces objets sont toujours fixés à ``00:00:00 UTC`` et toutes les méthodes de formatage/différence fonctionnent au niveau du jour:: - use Cake\Chronos\Date; + use Cake\Chronos\ChronosDate; - $today = Date::today(); + $today = ChronosDate::today(); // Les changements selon le time/timezone sont ignorés. $today->modify('+1 hours'); @@ -122,7 +120,7 @@ spécifier le fuseau à utiliser pour l'heure courante telle que ``now()`` ou use Cake\Chronos\Date: // Prend l'heure courante pour le fuseau horaire de Tokyo - $today = Date::today('Asia/Tokyo'); + $today = ChronosDate::today('Asia/Tokyo'); Méthodes de Modification @@ -313,7 +311,7 @@ vous pouvez inclure ce qui suit:: Chronos::setTestNow(Chronos::now()); MutableDateTime::setTestNow(MutableDateTime::now()); - Date::setTestNow(Date::now()); + ChronosDate::setTestNow(ChronosDate::now()); MutableDate::setTestNow(MutableDate::now()); Ceci va fixer le time courant de tous les objets selon le moment où la suite de diff --git a/app/vendor/cakephp/chronos/docs/ja/index.rst b/app/vendor/cakephp/chronos/docs/ja/index.rst index 9e1db71d0..d8a8974bd 100644 --- a/app/vendor/cakephp/chronos/docs/ja/index.rst +++ b/app/vendor/cakephp/chronos/docs/ja/index.rst @@ -26,7 +26,7 @@ Chronos は ``DateInterval`` の拡張機能および、ミュータブル(変 イミュータブル(変更不可)な 日付/時刻 の派生系をカバーする5つのクラスを提供します。 * ``Cake\Chronos\Chronos`` はイミュータブルな *日付と時刻* オブジェクト。 -* ``Cake\Chronos\Date`` はイミュータブルな *日付* オブジェクト。 +* ``Cake\Chronos\ChronosDate`` はイミュータブルな *日付* オブジェクト。 * ``Cake\Chronos\MutableDateTime`` はミュータブルな *日付と時刻* オブジェクト。 * ``Cake\Chronos\MutableDate`` はミュータブルな *日付* オブジェクト。 * ``Cake\Chronos\ChronosInterval`` は ``DateInterval`` の拡張機能。 @@ -100,9 +100,9 @@ Chronos は日時表現のための ``Date`` オブジェクトを提供しま これらのオブジェクトの時間とタイムゾーンは常に ``00:00:00 UTC`` に固定されており、 全ての書式/差分のメソッドは一日単位で動作します。 :: - use Cake\Chronos\Date; + use Cake\Chronos\ChronosDate; - $today = Date::today(); + $today = ChronosDate::today(); // 時間/タイムゾーンの変更は無視されます $today->modify('+1 hours'); @@ -286,7 +286,7 @@ Chronos は、出力した日時オブジェクトを表示するための多く Chronos::setTestNow(Chronos::now()); MutableDateTime::setTestNow(MutableDateTime::now()); - Date::setTestNow(Date::now()); + ChronosDate::setTestNow(ChronosDate::now()); MutableDate::setTestNow(MutableDate::now()); これでテストスイートが開始された時点で全てのオブジェクトの現在時刻を修正します。 diff --git a/app/vendor/cakephp/chronos/docs/pt/index.rst b/app/vendor/cakephp/chronos/docs/pt/index.rst index d4a90af83..643a5e6c5 100644 --- a/app/vendor/cakephp/chronos/docs/pt/index.rst +++ b/app/vendor/cakephp/chronos/docs/pt/index.rst @@ -27,7 +27,7 @@ cobrem variantes de data/hora mutáveis e imutáveis e uma extensão do objeto ``DateInterval``. * ``Cake\Chronos\Chronos`` é um objeto *date & time* imutável. -* ``Cake\Chronos\Date`` é um objeto *date* imutável. +* ``Cake\Chronos\ChronosDate`` é um objeto *date* imutável. * ``Cake\Chronos\MutableDateTime`` é um objeto *date and time* mutável. * ``Cake\Chronos\MutableDate`` é um objeto *date* mutável. * ``Cake\Chronos\ChronosInterval`` é uma extensão do objeto ``DateInterval``. @@ -101,9 +101,9 @@ pode ser um pouco desconfortável por essa classe, uma vez que ela inclui zona desse objeto é sempre fixado em ``00:00:00 UTC`` e todos os métodos de formatação/diferença operam sob a resolução de dia:: - use Cake\Chronos\Date; + use Cake\Chronos\ChronosDate; - $today = Date::today(); + $today = ChronosDate::today(); // Mudanças na hora/timezone são ignoradas $today->modify('+1 hours'); @@ -268,7 +268,7 @@ de testes, você pode incluir o seguinte:: Chronos::setTestNow(Chronos::now()); MutableDateTime::setTestNow(MutableDateTime::now()); - Date::setTestNow(Date::now()); + ChronosDate::setTestNow(ChronosDate::now()); MutableDate::setTestNow(MutableDate::now()); Isso irá corrigir a hora atual de todos os objetos para o momento em que o diff --git a/app/vendor/cakephp/chronos/src/Chronos.php b/app/vendor/cakephp/chronos/src/Chronos.php index f8ddf7384..3bb970f26 100644 --- a/app/vendor/cakephp/chronos/src/Chronos.php +++ b/app/vendor/cakephp/chronos/src/Chronos.php @@ -2,18 +2,19 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; +use DateInterval; use DateTimeImmutable; use DateTimeZone; @@ -139,6 +140,8 @@ public function __construct($time = 'now', $tz = null) */ public function toMutable(): MutableDateTime { + trigger_error('2.5 Mutable classes will be removed in 3.0', E_USER_DEPRECATED); + return MutableDateTime::instance($this); } @@ -197,6 +200,70 @@ public static function hasTestNow(): bool return static::$testNow !== null; } + /** + * Create a new DateInterval instance from specified values. + * + * @param int|null $years The year to use. + * @param int|null $months The month to use. + * @param int|null $weeks The week to use. + * @param int|null $days The day to use. + * @param int|null $hours The hours to use. + * @param int|null $minutes The minutes to use. + * @param int|null $seconds The seconds to use. + * @param int|null $microseconds The microseconds to use. + * @return \DateInterval + */ + public static function createInterval( + ?int $years = null, + ?int $months = null, + ?int $weeks = null, + ?int $days = null, + ?int $hours = null, + ?int $minutes = null, + ?int $seconds = null, + ?int $microseconds = null + ): DateInterval { + $spec = 'P'; + + if ($years) { + $spec .= $years . 'Y'; + } + if ($months) { + $spec .= $months . 'M'; + } + if ($weeks) { + $spec .= $weeks . 'W'; + } + if ($days) { + $spec .= $days . 'D'; + } + + if ($hours || $minutes || $seconds) { + $spec .= 'T'; + if ($hours) { + $spec .= $hours . 'H'; + } + if ($minutes) { + $spec .= $minutes . 'M'; + } + if ($seconds) { + $spec .= $seconds . 'S'; + } + } + + if ($microseconds && $spec === 'P') { + $spec .= 'T0S'; + } + + $instance = new DateInterval($spec); + + if ($microseconds) { + $instance->f = $microseconds / 1000000; + } + + return $instance; + } + /** * Return properties for debugging. * @@ -212,4 +279,27 @@ public function __debugInfo(): array return $properties; } + + /** + * Deprecation helper to compare types + * + * Future versions of Chronos will not support comparing date/datetimes to each other. + * + * @param object $first The first object. + * @param object|null $second The second object + * @return void + * @internal + */ + public static function checkTypes(object $first, $second): void + { + $firstClass = get_class($first); + $secondClass = $second !== null ? get_class($second) : null; + if ($second !== null && $firstClass !== $secondClass) { + trigger_error( + "2.5 Comparing {$firstClass} and {$secondClass} is deprecated. " . + 'In 3.0 this functionality will be removed.', + E_USER_DEPRECATED + ); + } + } } diff --git a/app/vendor/cakephp/chronos/src/ChronosDate.php b/app/vendor/cakephp/chronos/src/ChronosDate.php new file mode 100644 index 000000000..f22474dc0 --- /dev/null +++ b/app/vendor/cakephp/chronos/src/ChronosDate.php @@ -0,0 +1,288 @@ +stripTime($time, $tz); + parent::__construct($time); + + return; + } + + $testNow = clone $testNow; + if ($tz !== null && $tz !== $testNow->getTimezone()) { + $testNow = $testNow->setTimezone($tz ?? date_default_timezone_get()); + } + if (!empty($time)) { + $testNow = $testNow->modify($time); + } + + $time = $testNow->format('Y-m-d 00:00:00'); + parent::__construct($time); + } + + /** + * Create a new mutable instance from current immutable instance. + * + * @return \Cake\Chronos\MutableDate + */ + public function toMutable(): MutableDate + { + trigger_error('2.5 Mutable classes will be removed in 3.0', E_USER_DEPRECATED); + + return MutableDate::instance($this); + } + + /** + * Return properties for debugging. + * + * @return array + */ + public function __debugInfo(): array + { + $properties = [ + 'hasFixedNow' => static::hasTestNow(), + 'date' => $this->format('Y-m-d'), + ]; + + return $properties; + } + + /** + * Create an instance from a specific date. + * + * @param int $year The year to create an instance with. + * @param int $month The month to create an instance with. + * @param int $day The day to create an instance with. + * @return static + */ + public static function create(int $year, int $month, int $day) + { + $instance = static::createFromFormat( + 'Y-m-d', + sprintf('%s-%s-%s', 0, $month, $day) + ); + + return $instance->addYears($year); + } + + /** + * Add an Interval to a Date + * + * Any changes to the time will cause an exception to be raised. + * + * @param \DateInterval $interval The interval to modify this date by. + * @return static A modified Date instance + */ + #[\ReturnTypeWillChange] + public function add($interval) + { + if ($interval->f > 0 || $interval->s > 0 || $interval->i > 0 || $interval->h > 0) { + trigger_error('2.5 Adding intervals with time components will be removed in 3.0', E_USER_DEPRECATED); + } + + return parent::add($interval)->setTime(0, 0, 0); + } + + /** + * Subtract an Interval from a Date. + * + * Any changes to the time will cause an exception to be raised. + * + * @param \DateInterval $interval The interval to modify this date by. + * @return static A modified Date instance + */ + #[\ReturnTypeWillChange] + public function sub($interval) + { + if ($interval->f > 0 || $interval->s > 0 || $interval->i > 0 || $interval->h > 0) { + trigger_error('2.5 Subtracting intervals with time components will be removed in 3.0', E_USER_DEPRECATED); + } + + return parent::sub($interval)->setTime(0, 0, 0); + } + + /** + * Creates a new instance with date modified according to DateTimeImmutable::modifier(). + * + * Attempting to change a time component will raise an exception + * + * @param string $modifier Date modifier + * @return static + */ + #[\ReturnTypeWillChange] + public function modify($modifier) + { + if (preg_match('/hour|minute|second/', $modifier)) { + trigger_error('2.5 Modifying dates with time values will be removed in 3.0', E_USER_DEPRECATED); + } + + $new = parent::modify($modifier); + if ($new === false) { + throw new InvalidArgumentException('Unable to modify date using: ' . $modifier); + } + + if ($new->format('H:i:s') !== '00:00:00') { + $new = $new->setTime(0, 0, 0); + } + + return $new; + } + + /** + * @inheritDoc + */ + #[\ReturnTypeWillChange] + public function setTimestamp($value) + { + trigger_error('2.5 Setting timestamp values on Date values will be removed in 3.0', E_USER_DEPRECATED); + + return parent::setTimestamp($value); + } + + /** + * @inheritDoc + */ + public function hour(int $value): ChronosInterface + { + trigger_error('2.5 Modifying hours on Date values will be removed in 3.0', E_USER_DEPRECATED); + + return $this->setTime($value, $this->minute, $this->second); + } + + /** + * Set the instance's minute + * + * @param int $value The minute value. + * @return static + */ + public function minute(int $value): ChronosInterface + { + trigger_error('2.5 Modifying minutes on Date values will be removed in 3.0', E_USER_DEPRECATED); + + return $this->setTime($this->hour, $value, $this->second); + } + + /** + * Set the instance's second + * + * @param int $value The seconds value. + * @return static + */ + public function second(int $value): ChronosInterface + { + trigger_error('2.5 Modifying second on Date values will be removed in 3.0', E_USER_DEPRECATED); + + return $this->setTime($this->hour, $this->minute, $value); + } + + /** + * Set the instance's microsecond + * + * @param int $value The microsecond value. + * @return static + */ + public function microsecond(int $value): ChronosInterface + { + trigger_error('2.5 Modifying microsecond on Date values will be removed in 3.0', E_USER_DEPRECATED); + + return $this->setTime($this->hour, $this->minute, $this->second, $value); + } +} + +class_alias('Cake\Chronos\ChronosDate', 'Cake\Chronos\Date'); diff --git a/app/vendor/cakephp/chronos/src/ChronosInterface.php b/app/vendor/cakephp/chronos/src/ChronosInterface.php index f074b4c15..fa7a47383 100644 --- a/app/vendor/cakephp/chronos/src/ChronosInterface.php +++ b/app/vendor/cakephp/chronos/src/ChronosInterface.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; @@ -102,7 +102,7 @@ interface ChronosInterface extends DateTimeInterface * @param \DateTimeZone|string|null $tz The DateTimeZone object or timezone name. * @return static */ - public static function now($tz): self; + public static function now($tz = null): self; /** * Get a copy of the instance diff --git a/app/vendor/cakephp/chronos/src/ChronosInterval.php b/app/vendor/cakephp/chronos/src/ChronosInterval.php index 4f4464326..6330fab27 100644 --- a/app/vendor/cakephp/chronos/src/ChronosInterval.php +++ b/app/vendor/cakephp/chronos/src/ChronosInterval.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; @@ -146,6 +146,10 @@ public function __construct( if ($microseconds > 0) { $this->f = $microseconds / 1000000; } + trigger_error( + 'Since 2.4 ChronosInterval is deprecated. Use `Chronos::createInterval() instead.`', + E_USER_DEPRECATED + ); } /** diff --git a/app/vendor/cakephp/chronos/src/Date.php b/app/vendor/cakephp/chronos/src/Date.php index 67b44a24e..68d436ca2 100644 --- a/app/vendor/cakephp/chronos/src/Date.php +++ b/app/vendor/cakephp/chronos/src/Date.php @@ -2,141 +2,14 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ -namespace Cake\Chronos; - -use DateTimeImmutable; -use DateTimeZone; - -/** - * An immutable date object that converts all time components into 00:00:00. - * - * This class is useful when you want to represent a calendar date and ignore times. - * This means that timezone changes take no effect as a calendar date exists in all timezones - * in each respective date. - * - * @property-read int $year - * @property-read int $yearIso - * @property-read int $month - * @property-read int $day - * @property-read int $hour - * @property-read int $minute - * @property-read int $second - * @property-read int $micro - * @property-read int $microsecond - * @property-read int $timestamp seconds since the Unix Epoch - * @property-read \DateTimeZone $timezone the current timezone - * @property-read \DateTimeZone $tz alias of timezone - * @property-read int $dayOfWeek 1 (for Monday) through 7 (for Sunday) - * @property-read int $dayOfYear 0 through 365 - * @property-read int $weekOfMonth 1 through 5 - * @property-read int $weekOfYear ISO-8601 week number of year, weeks starting on Monday - * @property-read int $daysInMonth number of days in the given month - * @property-read int $age does a diffInYears() with default parameters - * @property-read int $quarter the quarter of this instance, 1 - 4 - * @property-read int $offset the timezone offset in seconds from UTC - * @property-read int $offsetHours the timezone offset in hours from UTC - * @property-read bool $dst daylight savings time indicator, true if DST, false otherwise - * @property-read bool $local checks if the timezone is local, true if local, false otherwise - * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise - * @property-read string $timezoneName - * @property-read string $tzName - */ -class Date extends DateTimeImmutable implements ChronosInterface -{ - use Traits\ComparisonTrait; - use Traits\DifferenceTrait; - use Traits\FactoryTrait; - use Traits\FormattingTrait; - use Traits\FrozenTimeTrait; - use Traits\MagicPropertyTrait; - use Traits\ModifierTrait; - use Traits\TestingAidTrait; - - /** - * Format to use for __toString method when type juggling occurs. - * - * @var string - */ - protected static $toStringFormat = 'Y-m-d'; - - /** - * Create a new Immutable Date instance. - * - * You can specify the timezone for the $time parameter. This timezone will - * not be used in any future modifications to the Date instance. - * - * The $timezone parameter is ignored if $time is a DateTimeInterface - * instance. - * - * Please see the testing aids section (specifically static::setTestNow()) - * for more on the possibility of this constructor returning a test instance. - * - * Date instances lack time components, however due to limitations in PHP's - * internal Datetime object the time will always be set to 00:00:00, and the - * timezone will always be the server local time. Normalizing the timezone allows for - * subtraction/addition to have deterministic results. - * - * @param \DateTimeInterface|string|int|null $time Fixed or relative time - * @param \DateTimeZone|string|null $tz The timezone in which the date is taken - */ - public function __construct($time = 'now', $tz = null) - { - if ($tz !== null) { - $tz = $tz instanceof DateTimeZone ? $tz : new DateTimeZone($tz); - } - - $testNow = Chronos::getTestNow(); - if ($testNow === null || !static::isRelativeOnly($time)) { - $time = $this->stripTime($time, $tz); - parent::__construct($time); - - return; - } - - $testNow = clone $testNow; - if ($tz !== $testNow->getTimezone()) { - $testNow = $testNow->setTimezone($tz ?? date_default_timezone_get()); - } - if (!empty($time)) { - $testNow = $testNow->modify($time); - } - - $time = $testNow->format('Y-m-d 00:00:00'); - parent::__construct($time); - } - - /** - * Create a new mutable instance from current immutable instance. - * - * @return \Cake\Chronos\MutableDate - */ - public function toMutable(): MutableDate - { - return MutableDate::instance($this); - } - - /** - * Return properties for debugging. - * - * @return array - */ - public function __debugInfo(): array - { - $properties = [ - 'hasFixedNow' => static::hasTestNow(), - 'date' => $this->format('Y-m-d'), - ]; - - return $properties; - } -} +class_exists('Cake\Chronos\ChronosDate'); diff --git a/app/vendor/cakephp/chronos/src/DifferenceFormatter.php b/app/vendor/cakephp/chronos/src/DifferenceFormatter.php index ad10c9582..c627dd9c5 100644 --- a/app/vendor/cakephp/chronos/src/DifferenceFormatter.php +++ b/app/vendor/cakephp/chronos/src/DifferenceFormatter.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; diff --git a/app/vendor/cakephp/chronos/src/DifferenceFormatterInterface.php b/app/vendor/cakephp/chronos/src/DifferenceFormatterInterface.php index e94892604..875a2298e 100644 --- a/app/vendor/cakephp/chronos/src/DifferenceFormatterInterface.php +++ b/app/vendor/cakephp/chronos/src/DifferenceFormatterInterface.php @@ -2,14 +2,14 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; diff --git a/app/vendor/cakephp/chronos/src/MutableDate.php b/app/vendor/cakephp/chronos/src/MutableDate.php index 7cbac3cb9..c8c5f2793 100644 --- a/app/vendor/cakephp/chronos/src/MutableDate.php +++ b/app/vendor/cakephp/chronos/src/MutableDate.php @@ -2,14 +2,14 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; @@ -49,6 +49,7 @@ * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise * @property-read string $timezoneName * @property-read string $tzName + * @deprecated 2.4.0 Use immutable \Cake\Chronos\ChronosDate instead */ class MutableDate extends DateTime implements ChronosInterface { @@ -117,11 +118,11 @@ public function __construct($time = 'now', $tz = null) /** * Create a new immutable instance from current mutable instance. * - * @return \Cake\Chronos\Date + * @return \Cake\Chronos\ChronosDate */ - public function toImmutable(): Date + public function toImmutable(): ChronosDate { - return Date::instance($this); + return ChronosDate::instance($this); } /** diff --git a/app/vendor/cakephp/chronos/src/MutableDateTime.php b/app/vendor/cakephp/chronos/src/MutableDateTime.php index a01865734..5ad91e932 100644 --- a/app/vendor/cakephp/chronos/src/MutableDateTime.php +++ b/app/vendor/cakephp/chronos/src/MutableDateTime.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; @@ -50,6 +50,7 @@ * @property-read bool $utc checks if the timezone is UTC, true if UTC, false otherwise * @property-read string $timezoneName * @property-read string $tzName + * @deprecated 2.4.0 Use immutable \Cake\Chronos\Chronos instead */ class MutableDateTime extends DateTime implements ChronosInterface { diff --git a/app/vendor/cakephp/chronos/src/Traits/ComparisonTrait.php b/app/vendor/cakephp/chronos/src/Traits/ComparisonTrait.php index 5f076d540..677663a7c 100644 --- a/app/vendor/cakephp/chronos/src/Traits/ComparisonTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/ComparisonTrait.php @@ -2,18 +2,20 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\Chronos; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; use DateTime; @@ -38,6 +40,10 @@ trait ComparisonTrait */ public static function getWeekendDays(): array { + if (static::class === ChronosDate::class) { + trigger_error('2.5 getWeekendDays() will be removed in 3.x.', E_USER_DEPRECATED); + } + return static::$weekendDays; } @@ -49,6 +55,10 @@ public static function getWeekendDays(): array */ public static function setWeekendDays(array $days): void { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setWeekendDays() will be removed in 3.x.', E_USER_DEPRECATED); + } + static::$weekendDays = $days; } @@ -57,10 +67,13 @@ public static function setWeekendDays(array $days): void * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 eq() is deprecated. Use equals() instead. */ public function eq(ChronosInterface $dt): bool { - return $this == $dt; + trigger_error('2.5 eq() is deprecated. Use equals() instead.', E_USER_DEPRECATED); + + return $this->equals($dt); } /** @@ -71,7 +84,7 @@ public function eq(ChronosInterface $dt): bool */ public function equals(ChronosInterface $dt) { - return $this->eq($dt); + return $this == $dt; } /** @@ -79,10 +92,13 @@ public function equals(ChronosInterface $dt) * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 ne() is deprecated. Use notEquals() instead. */ public function ne(ChronosInterface $dt): bool { - return !$this->eq($dt); + trigger_error('2.5 ne() is deprecated. Use notEquals() instead.', E_USER_DEPRECATED); + + return $this->notEquals($dt); } /** @@ -93,7 +109,7 @@ public function ne(ChronosInterface $dt): bool */ public function notEquals(ChronosInterface $dt) { - return $this->ne($dt); + return !$this->equals($dt); } /** @@ -101,10 +117,13 @@ public function notEquals(ChronosInterface $dt) * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 gt() is deprecated. Use greaterThan() instead. */ public function gt(ChronosInterface $dt): bool { - return $this > $dt; + trigger_error('2.5 gt() is deprecated. Use greaterThan() instead.', E_USER_DEPRECATED); + + return $this->greaterThan($dt); } /** @@ -115,7 +134,7 @@ public function gt(ChronosInterface $dt): bool */ public function greaterThan(ChronosInterface $dt) { - return $this->gt($dt); + return $this > $dt; } /** @@ -123,10 +142,13 @@ public function greaterThan(ChronosInterface $dt) * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 gte() is deprecated. Use greaterThanOrEquals() instead. */ public function gte(ChronosInterface $dt): bool { - return $this >= $dt; + trigger_error('2.5 gte() is deprecated. Use greaterThanOrEquals() instead.', E_USER_DEPRECATED); + + return $this->greaterThanOrEquals($dt); } /** @@ -137,7 +159,7 @@ public function gte(ChronosInterface $dt): bool */ public function greaterThanOrEquals(ChronosInterface $dt) { - return $this->gte($dt); + return $this >= $dt; } /** @@ -145,10 +167,13 @@ public function greaterThanOrEquals(ChronosInterface $dt) * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 lt() is deprecated. Use lessThan instead. */ public function lt(ChronosInterface $dt): bool { - return $this < $dt; + trigger_error('2.5 lt() is deprecated. Use lessThan() instead.', E_USER_DEPRECATED); + + return $this->lessThan($dt); } /** @@ -159,7 +184,7 @@ public function lt(ChronosInterface $dt): bool */ public function lessThan(ChronosInterface $dt) { - return $this->lt($dt); + return $this < $dt; } /** @@ -167,10 +192,13 @@ public function lessThan(ChronosInterface $dt) * * @param \Cake\Chronos\ChronosInterface $dt The instance to compare with. * @return bool + * @deprecated 2.5 lte() is deprecated. Use lessThanOrEquals() instead. */ public function lte(ChronosInterface $dt): bool { - return $this <= $dt; + trigger_error('2.5 lte() is deprecated. Use lessthanOrEquals() instead.', E_USER_DEPRECATED); + + return $this->lessThanOrEquals($dt); } /** @@ -181,7 +209,7 @@ public function lte(ChronosInterface $dt): bool */ public function lessThanOrEquals(ChronosInterface $dt) { - return $this->lte($dt); + return $this <= $dt; } /** @@ -194,17 +222,18 @@ public function lessThanOrEquals(ChronosInterface $dt) */ public function between(ChronosInterface $dt1, ChronosInterface $dt2, bool $equal = true): bool { - if ($dt1->gt($dt2)) { + if ($dt1->greaterThan($dt2)) { $temp = $dt1; $dt1 = $dt2; $dt2 = $temp; } + Chronos::checkTypes($dt1, $dt2); if ($equal) { - return $this->gte($dt1) && $this->lte($dt2); + return $this->greaterThanOrEquals($dt1) && $this->lessThanOrEquals($dt2); } - return $this->gt($dt1) && $this->lt($dt2); + return $this->greaterThan($dt1) && $this->lessThan($dt2); } /** @@ -241,7 +270,7 @@ public function min(?ChronosInterface $dt = null): ChronosInterface { $dt = $dt ?? static::now($this->tz); - return $this->lt($dt) ? $this : $dt; + return $this->lessThan($dt) ? $this : $dt; } /** @@ -254,7 +283,7 @@ public function max(?ChronosInterface $dt = null): ChronosInterface { $dt = $dt ?? static::now($this->tz); - return $this->gt($dt) ? $this : $dt; + return $this->greaterThan($dt) ? $this : $dt; } /** @@ -314,7 +343,7 @@ public function isTomorrow(): bool */ public function isNextWeek(): bool { - return $this->format('W o') === static::now($this->tz)->addWeek()->format('W o'); + return $this->format('W o') === static::now($this->tz)->addWeeks(1)->format('W o'); } /** @@ -324,7 +353,7 @@ public function isNextWeek(): bool */ public function isLastWeek(): bool { - return $this->format('W o') === static::now($this->tz)->subWeek()->format('W o'); + return $this->format('W o') === static::now($this->tz)->subWeeks(1)->format('W o'); } /** @@ -334,7 +363,7 @@ public function isLastWeek(): bool */ public function isNextMonth(): bool { - return $this->format('m Y') === static::now($this->tz)->addMonth()->format('m Y'); + return $this->format('m Y') === static::now($this->tz)->addMonths(1)->format('m Y'); } /** @@ -344,7 +373,7 @@ public function isNextMonth(): bool */ public function isLastMonth(): bool { - return $this->format('m Y') === static::now($this->tz)->subMonth()->format('m Y'); + return $this->format('m Y') === static::now($this->tz)->subMonths(1)->format('m Y'); } /** @@ -354,7 +383,7 @@ public function isLastMonth(): bool */ public function isNextYear(): bool { - return $this->year === static::now($this->tz)->addYear()->year; + return $this->year === static::now($this->tz)->addYears(1)->year; } /** @@ -364,7 +393,7 @@ public function isNextYear(): bool */ public function isLastYear(): bool { - return $this->year === static::now($this->tz)->subYear()->year; + return $this->year === static::now($this->tz)->subYears(1)->year; } /** @@ -374,7 +403,7 @@ public function isLastYear(): bool */ public function isFuture(): bool { - return $this->gt(static::now($this->tz)); + return $this->greaterThan(static::now($this->tz)); } /** @@ -384,7 +413,7 @@ public function isFuture(): bool */ public function isPast(): bool { - return $this->lt(static::now($this->tz)); + return $this->lessThan(static::now($this->tz)); } /** @@ -560,6 +589,8 @@ public function isWithinNext($timeInterval): bool */ public function isMutable(): bool { + trigger_error('2.5 isMutable will be removed in the future', E_USER_DEPRECATED); + return $this instanceof DateTime; } } diff --git a/app/vendor/cakephp/chronos/src/Traits/CopyTrait.php b/app/vendor/cakephp/chronos/src/Traits/CopyTrait.php index 1bd8ede42..d026ed838 100644 --- a/app/vendor/cakephp/chronos/src/Traits/CopyTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/CopyTrait.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; diff --git a/app/vendor/cakephp/chronos/src/Traits/DifferenceTrait.php b/app/vendor/cakephp/chronos/src/Traits/DifferenceTrait.php index 7d4c74e58..0fbf37cea 100644 --- a/app/vendor/cakephp/chronos/src/Traits/DifferenceTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/DifferenceTrait.php @@ -2,20 +2,21 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\Chronos; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; -use Cake\Chronos\ChronosInterval; use Cake\Chronos\DifferenceFormatter; use Cake\Chronos\DifferenceFormatterInterface; use DatePeriod; @@ -49,6 +50,7 @@ trait DifferenceTrait */ public function diffInYears(?ChronosInterface $dt = null, bool $abs = true): int { + Chronos::checkTypes($this, $dt); $diff = $this->diff($dt ?? static::now($this->tz), $abs); return $diff->invert ? -$diff->y : $diff->y; @@ -63,6 +65,7 @@ public function diffInYears(?ChronosInterface $dt = null, bool $abs = true): int */ public function diffInMonths(?ChronosInterface $dt = null, bool $abs = true): int { + Chronos::checkTypes($this, $dt); $diff = $this->diff($dt ?? static::now($this->tz), $abs); $months = $diff->y * ChronosInterface::MONTHS_PER_YEAR + $diff->m; @@ -83,6 +86,9 @@ public function diffInMonths(?ChronosInterface $dt = null, bool $abs = true): in */ public function diffInMonthsIgnoreTimezone(?ChronosInterface $dt = null, bool $abs = true): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 diffInMonthsIgnoreTimezone() will be removed in 3.x.', E_USER_DEPRECATED); + } $utcTz = new DateTimeZone('UTC'); $source = new static($this->format('Y-m-d H:i:s.u'), $utcTz); @@ -128,7 +134,9 @@ public function diffInDays(?ChronosInterface $dt = null, bool $abs = true): int */ public function diffInDaysFiltered(callable $callback, ?ChronosInterface $dt = null, bool $abs = true): int { - return $this->diffFiltered(ChronosInterval::day(), $callback, $dt, $abs); + $interval = Chronos::createInterval(0, 0, 0, 1); + + return $this->diffFiltered($interval, $callback, $dt, $abs); } /** @@ -141,20 +149,25 @@ public function diffInDaysFiltered(callable $callback, ?ChronosInterface $dt = n */ public function diffInHoursFiltered(callable $callback, ?ChronosInterface $dt = null, bool $abs = true): int { - return $this->diffFiltered(ChronosInterval::hour(), $callback, $dt, $abs); + if (static::class === ChronosDate::class) { + trigger_error('2.5 diffInHoursFiltered() will be removed in 3.x.', E_USER_DEPRECATED); + } + $interval = Chronos::createInterval(0, 0, 0, 0, 1); + + return $this->diffFiltered($interval, $callback, $dt, $abs); } /** * Get the difference by the given interval using a filter callable * - * @param \Cake\Chronos\ChronosInterval $ci An interval to traverse by + * @param \Cake\Chronos\ChronosInterval|\DateInterval $ci An interval to traverse by * @param callable $callback The callback to use for filtering. * @param \Cake\Chronos\ChronosInterface|null $dt The instance to difference from. * @param bool $abs Get the absolute of the difference * @return int */ public function diffFiltered( - ChronosInterval $ci, + $ci, callable $callback, ?ChronosInterface $dt = null, bool $abs = true @@ -162,12 +175,19 @@ public function diffFiltered( $start = $this; $end = $dt ?? static::now($this->tz); $inverse = false; + Chronos::checkTypes($start, $end); if ($end < $start) { $start = $end; $end = $this; $inverse = true; } + // Hack around DatePeriod not including end values. + // When handling dates we need to convert to a DateTime + // and offset by 1 second. + if ($end instanceof ChronosDate) { + $end = (new Chronos($end))->modify('+1 second'); + } $period = new DatePeriod($start, $ci, $end); $vals = array_filter(iterator_to_array($period), function (DateTimeInterface $date) use ($callback) { @@ -216,6 +236,10 @@ public function diffInWeekendDays(?ChronosInterface $dt = null, bool $abs = true */ public function diffInHours(?ChronosInterface $dt = null, bool $abs = true): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 diffInHours() will be removed in 3.x.', E_USER_DEPRECATED); + } + return (int)( $this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE @@ -232,6 +256,10 @@ public function diffInHours(?ChronosInterface $dt = null, bool $abs = true): int */ public function diffInMinutes(?ChronosInterface $dt = null, bool $abs = true): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 diffInMinutes() will be removed in 3.x.', E_USER_DEPRECATED); + } + return (int)($this->diffInSeconds($dt, $abs) / ChronosInterface::SECONDS_PER_MINUTE); } @@ -244,6 +272,10 @@ public function diffInMinutes(?ChronosInterface $dt = null, bool $abs = true): i */ public function diffInSeconds(?ChronosInterface $dt = null, bool $abs = true): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 diffInSeconds() will be removed in 3.x.', E_USER_DEPRECATED); + } + $dt = $dt ?? static::now($this->tz); $value = $dt->getTimestamp() - $this->getTimestamp(); @@ -257,6 +289,10 @@ public function diffInSeconds(?ChronosInterface $dt = null, bool $abs = true): i */ public function secondsSinceMidnight(): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 secondsSinceMidnight() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->diffInSeconds($this->copy()->startOfDay()); } @@ -267,6 +303,10 @@ public function secondsSinceMidnight(): int */ public function secondsUntilEndOfDay(): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 secondsUntilEndOfDay() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->diffInSeconds($this->copy()->endOfDay()); } @@ -278,6 +318,9 @@ public function secondsUntilEndOfDay(): int */ public static function fromNow($datetime) { + if (static::class === ChronosDate::class) { + trigger_error('2.5 fromNow() will be removed in 3.x.', E_USER_DEPRECATED); + } $timeNow = new static(); return $timeNow->diff($datetime); diff --git a/app/vendor/cakephp/chronos/src/Traits/FactoryTrait.php b/app/vendor/cakephp/chronos/src/Traits/FactoryTrait.php index 963624345..e37295d53 100644 --- a/app/vendor/cakephp/chronos/src/Traits/FactoryTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/FactoryTrait.php @@ -2,18 +2,19 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; use DateTimeInterface; use DateTimeZone; @@ -40,6 +41,9 @@ trait FactoryTrait */ public static function instance(DateTimeInterface $dt): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 instance() will be removed in 3.x.', E_USER_DEPRECATED); + } if ($dt instanceof static) { return clone $dt; } @@ -113,7 +117,12 @@ public static function yesterday($tz = null): ChronosInterface */ public static function maxValue(): ChronosInterface { - return static::createFromTimestampUTC(PHP_INT_MAX); + $instance = new static(PHP_INT_MAX); + if (get_class($instance) === ChronosDate::class) { + trigger_error('2.5 Using minValue() to create Date objects will be removed in 3.0', E_USER_DEPRECATED); + } + + return $instance; } /** @@ -125,7 +134,12 @@ public static function minValue(): ChronosInterface { $max = PHP_INT_SIZE === 4 ? PHP_INT_MAX : PHP_INT_MAX / 10; - return static::createFromTimestampUTC(~$max); + $instance = new static(~$max); + if (get_class($instance) === ChronosDate::class) { + trigger_error('2.5 Using minValue() to create Date objects will be removed in 3.0', E_USER_DEPRECATED); + } + + return $instance; } /** @@ -199,6 +213,10 @@ public static function createFromDate( ?int $day = null, $tz = null ): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 createFromDate() will be removed in 3.x.', E_USER_DEPRECATED); + } + return static::create($year, $month, $day, null, null, null, null, $tz); } @@ -219,7 +237,12 @@ public static function createFromTime( ?int $microsecond = null, $tz = null ): ChronosInterface { - return static::create(null, null, null, $hour, $minute, $second, $microsecond, $tz); + $instance = static::create(null, null, null, $hour, $minute, $second, $microsecond, $tz); + if (get_class($instance) === ChronosDate::class) { + trigger_error('2.5 Using createFromTime to create Date objects will be removed in 3.0', E_USER_DEPRECATED); + } + + return $instance; } /** @@ -315,7 +338,15 @@ public static function createFromArray(array $values): ChronosInterface */ public static function createFromTimestamp(int $timestamp, $tz = null): ChronosInterface { - return static::now($tz)->setTimestamp($timestamp); + $instance = static::now($tz)->setTimestamp($timestamp); + if (get_class($instance) === ChronosDate::class) { + trigger_error( + '2.5 Creating Date instances with createFromTimestamp() will be removed in 3.0', + E_USER_DEPRECATED + ); + } + + return $instance; } /** @@ -326,7 +357,13 @@ public static function createFromTimestamp(int $timestamp, $tz = null): ChronosI */ public static function createFromTimestampUTC(int $timestamp): ChronosInterface { - return new static($timestamp); + trigger_error( + '2.5 createFromTimestampUTC() is deprecated. Use createFromTimestamp() instead.', + E_USER_DEPRECATED + ); + $instance = new static($timestamp); + + return $instance; } /** @@ -358,9 +395,16 @@ protected static function safeCreateDateTimeZone($object): DateTimeZone public static function getLastErrors(): array { if (empty(static::$_lastErrors)) { - return parent::getLastErrors(); + return parent::getLastErrors() ?: [ + 'warning_count' => 0, + 'warnings' => [], + 'error_count' => 0, + 'errors' => [], + ]; } + trigger_error('2.5 getLastErrors() is deprecated. Exceptions will be raised in 3.x', E_USER_DEPRECATED); + return static::$_lastErrors; } } diff --git a/app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php b/app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php index 61e3ba393..312eaf083 100644 --- a/app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/FormattingTrait.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; diff --git a/app/vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php b/app/vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php index fd0a001d5..198ab7b0e 100644 --- a/app/vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/FrozenTimeTrait.php @@ -2,17 +2,18 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; use DateTimeImmutable; use DateTimeInterface; @@ -120,6 +121,10 @@ public function sub($interval): ChronosInterface */ public function timezone($value) { + if (static::class === ChronosDate::class) { + trigger_error('2.5 timezone() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this; } @@ -133,6 +138,10 @@ public function timezone($value) */ public function tz($value) { + if (static::class === ChronosDate::class) { + trigger_error('2.5 tz() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this; } @@ -147,6 +156,24 @@ public function tz($value) #[ReturnTypeWillChange] public function setTimezone($value) { + if (static::class === ChronosDate::class) { + $trace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS, 5); + $found = false; + foreach ($trace as $frame) { + $found = in_array( + $frame['class'], + ['PHPUnit\Framework\Assert', 'PHPUnit\Framework\Constraint\IsEqual'], + true + ); + if ($found) { + break; + } + } + if (!$found) { + trigger_error('2.5 setTimezone() will be removed in 3.x.', E_USER_DEPRECATED); + } + } + return $this; } @@ -162,6 +189,10 @@ public function setTimezone($value) #[ReturnTypeWillChange] public function setTimestamp($value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setTimestamp() will be removed in 3.x.', E_USER_DEPRECATED); + } + return parent::setTimestamp($value)->setTime(0, 0, 0); } diff --git a/app/vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php b/app/vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php index 7c01449a2..981e5f68a 100644 --- a/app/vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/MagicPropertyTrait.php @@ -2,16 +2,16 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime * objects. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; diff --git a/app/vendor/cakephp/chronos/src/Traits/ModifierTrait.php b/app/vendor/cakephp/chronos/src/Traits/ModifierTrait.php index adf177d7e..c2624d3dd 100644 --- a/app/vendor/cakephp/chronos/src/Traits/ModifierTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/ModifierTrait.php @@ -2,18 +2,19 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; use ReturnTypeWillChange; @@ -65,6 +66,10 @@ trait ModifierTrait */ public static function getWeekStartsAt(): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 getWeekStartsAt() will be removed in 3.x.', E_USER_DEPRECATED); + } + return static::$weekStartsAt; } @@ -76,6 +81,10 @@ public static function getWeekStartsAt(): int */ public static function setWeekStartsAt(int $day): void { + if (static::class === ChronosDate::class) { + trigger_error('2.5 getWeekStartsAt() will be removed in 3.x.', E_USER_DEPRECATED); + } + static::$weekStartsAt = $day; } @@ -86,6 +95,10 @@ public static function setWeekStartsAt(int $day): void */ public static function getWeekEndsAt(): int { + if (static::class === ChronosDate::class) { + trigger_error('2.5 getWeekEndsAt() will be removed in 3.x.', E_USER_DEPRECATED); + } + return static::$weekEndsAt; } @@ -97,6 +110,10 @@ public static function getWeekEndsAt(): int */ public static function setWeekEndsAt(int $day): void { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setWeekEndsAt() will be removed in 3.x.', E_USER_DEPRECATED); + } + static::$weekEndsAt = $day; } @@ -149,6 +166,10 @@ public function setDateTime( int $minute, int $second = 0 ): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setDateTime() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setDate($year, $month, $day)->setTime($hour, $minute, $second); } @@ -160,6 +181,9 @@ public function setDateTime( */ public function setTimeFromTimeString(string $time): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setTimeFromTimeString() will be removed in 3.x.', E_USER_DEPRECATED); + } $time = explode(':', $time); $hour = $time[0]; $minute = $time[1] ?? 0; @@ -176,6 +200,10 @@ public function setTimeFromTimeString(string $time): ChronosInterface */ public function timestamp(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 timestamp() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setTimestamp($value); } @@ -220,6 +248,10 @@ public function day(int $value): ChronosInterface */ public function hour(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 hour() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setTime($value, $this->minute, $this->second); } @@ -231,6 +263,10 @@ public function hour(int $value): ChronosInterface */ public function minute(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 minute() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setTime($this->hour, $value, $this->second); } @@ -242,6 +278,10 @@ public function minute(int $value): ChronosInterface */ public function second(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 second() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setTime($this->hour, $this->minute, $value); } @@ -253,6 +293,10 @@ public function second(int $value): ChronosInterface */ public function microsecond(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 microsecond() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->setTime($this->hour, $this->minute, $this->second, $value); } @@ -296,6 +340,8 @@ public function addYears(int $value): ChronosInterface */ public function addYear(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addYear() is deprecated. Use addYears() instead.', E_USER_DEPRECATED); + return $this->addYears($value); } @@ -322,6 +368,8 @@ public function subYears(int $value): ChronosInterface */ public function subYear(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subYear() is deprecated. Use subYears() instead.', E_USER_DEPRECATED); + return $this->addYears(-$value); } @@ -355,6 +403,8 @@ public function addYearsWithOverflow(int $value): ChronosInterface */ public function addYearWithOverflow(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addYearWithOverflow() is deprecated.', E_USER_DEPRECATED); + return $this->addYearsWithOverflow($value); } @@ -381,6 +431,8 @@ public function subYearsWithOverflow(int $value): ChronosInterface */ public function subYearWithOverflow(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addYearWithOverflow() is deprecated.', E_USER_DEPRECATED); + return $this->subYearsWithOverflow($value); } @@ -425,6 +477,8 @@ public function addMonths(int $value): ChronosInterface */ public function addMonth(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addMonth() is deprecated. Use addMonths() instead.', E_USER_DEPRECATED); + return $this->addMonths($value); } @@ -438,6 +492,8 @@ public function addMonth(int $value = 1): ChronosInterface */ public function subMonth(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subMonth() is deprecated. Use subMonths() instead.', E_USER_DEPRECATED); + return $this->addMonths(-$value); } @@ -484,6 +540,11 @@ public function addMonthsWithOverflow(int $value): ChronosInterface */ public function addMonthWithOverflow(int $value = 1): ChronosInterface { + trigger_error( + 'Since 2.4 - addMonthWithOverflow() is deprecated. Use addMonthsWithOverflow() instead.', + E_USER_DEPRECATED + ); + return $this->modify($value . ' months'); } @@ -510,6 +571,11 @@ public function subMonthsWithOverflow(int $value): ChronosInterface */ public function subMonthWithOverflow(int $value = 1): ChronosInterface { + trigger_error( + 'Since 2.4 - subMonthWithOverflow() is deprecated. Use subMonthsWithOverflow() instead.', + E_USER_DEPRECATED + ); + return $this->subMonthsWithOverflow($value); } @@ -533,6 +599,8 @@ public function addDays(int $value): ChronosInterface */ public function addDay(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addDay() is deprecated. Use addDays() instead.', E_USER_DEPRECATED); + return $this->modify("$value days"); } @@ -544,6 +612,8 @@ public function addDay(int $value = 1): ChronosInterface */ public function subDay(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subDay() is deprecated. Use subDays() instead.', E_USER_DEPRECATED); + return $this->addDays(-$value); } @@ -578,6 +648,8 @@ public function addWeekdays(int $value): ChronosInterface */ public function addWeekday(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addWeekday() is deprecated. Use addWeekdays() instead.', E_USER_DEPRECATED); + return $this->addWeekdays($value); } @@ -600,6 +672,8 @@ public function subWeekdays(int $value): ChronosInterface */ public function subWeekday(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subWeekday() is deprecated. Use subWeekdays() instead.', E_USER_DEPRECATED); + return $this->addWeekdays(-$value); } @@ -623,6 +697,8 @@ public function addWeeks(int $value): ChronosInterface */ public function addWeek(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addWeek() is deprecated. Use addWeeks() instead.', E_USER_DEPRECATED); + return $this->modify("$value week"); } @@ -634,6 +710,8 @@ public function addWeek(int $value = 1): ChronosInterface */ public function subWeek(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subWeek() is deprecated. Use subWeeks() instead.', E_USER_DEPRECATED); + return $this->addWeeks(-$value); } @@ -668,6 +746,8 @@ public function addHours(int $value): ChronosInterface */ public function addHour(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addHour() is deprecated. Use addHours() instead.', E_USER_DEPRECATED); + return $this->modify("$value hour"); } @@ -679,6 +759,8 @@ public function addHour(int $value = 1): ChronosInterface */ public function subHour(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subHour() is deprecated. Use subHours() instead.', E_USER_DEPRECATED); + return $this->addHours(-$value); } @@ -690,6 +772,10 @@ public function subHour(int $value = 1): ChronosInterface */ public function subHours(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 subHours() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->addHours(-$value); } @@ -702,6 +788,10 @@ public function subHours(int $value): ChronosInterface */ public function addMinutes(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 addMinutes() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify("$value minute"); } @@ -713,6 +803,8 @@ public function addMinutes(int $value): ChronosInterface */ public function addMinute(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addMinute() is deprecated. Use addMinutes() instead.', E_USER_DEPRECATED); + return $this->modify("$value minute"); } @@ -724,6 +816,8 @@ public function addMinute(int $value = 1): ChronosInterface */ public function subMinute(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subMinute() is deprecated. Use subMinutes() instead.', E_USER_DEPRECATED); + return $this->addMinutes(-$value); } @@ -735,6 +829,10 @@ public function subMinute(int $value = 1): ChronosInterface */ public function subMinutes(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 subMinutes() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->addMinutes(-$value); } @@ -747,6 +845,10 @@ public function subMinutes(int $value): ChronosInterface */ public function addSeconds(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setTimestamp() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify("$value second"); } @@ -758,6 +860,8 @@ public function addSeconds(int $value): ChronosInterface */ public function addSecond(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - addSecond() is deprecated. Use addSeconds() instead.', E_USER_DEPRECATED); + return $this->modify("$value second"); } @@ -769,6 +873,8 @@ public function addSecond(int $value = 1): ChronosInterface */ public function subSecond(int $value = 1): ChronosInterface { + trigger_error('Since 2.4 - subSecond() is deprecated. Use subSeconds() instead.', E_USER_DEPRECATED); + return $this->addSeconds(-$value); } @@ -780,6 +886,10 @@ public function subSecond(int $value = 1): ChronosInterface */ public function subSeconds(int $value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 subSeconds() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->addSeconds(-$value); } @@ -790,6 +900,10 @@ public function subSeconds(int $value): ChronosInterface */ public function startOfDay(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 startOfDay() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('midnight'); } @@ -800,6 +914,10 @@ public function startOfDay(): ChronosInterface */ public function endOfDay(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 endOfDay() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('23:59:59'); } @@ -810,6 +928,10 @@ public function endOfDay(): ChronosInterface */ public function startOfMonth(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 startOfMonth() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('first day of this month midnight'); } @@ -820,6 +942,10 @@ public function startOfMonth(): ChronosInterface */ public function endOfMonth(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 endOfMonth() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('last day of this month, 23:59:59'); } @@ -830,6 +956,10 @@ public function endOfMonth(): ChronosInterface */ public function startOfYear(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 startOfYear() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('first day of january midnight'); } @@ -840,6 +970,10 @@ public function startOfYear(): ChronosInterface */ public function endOfYear(): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 endOfYear() will be removed in 3.x.', E_USER_DEPRECATED); + } + return $this->modify('last day of december, 23:59:59'); } @@ -1132,6 +1266,9 @@ public function nthOfYear(int $nth, int $dayOfWeek) */ public function average(?ChronosInterface $dt = null): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 average() will be removed in 3.x.', E_USER_DEPRECATED); + } $dt = $dt ?? static::now($this->tz); return $this->addSeconds((int)($this->diffInSeconds($dt, false) / 2)); diff --git a/app/vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php b/app/vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php index c98e92796..070d6bfc7 100644 --- a/app/vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/RelativeKeywordTrait.php @@ -2,16 +2,16 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime * objects. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; diff --git a/app/vendor/cakephp/chronos/src/Traits/TestingAidTrait.php b/app/vendor/cakephp/chronos/src/Traits/TestingAidTrait.php index ab2fef877..f3cb5eff8 100644 --- a/app/vendor/cakephp/chronos/src/Traits/TestingAidTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/TestingAidTrait.php @@ -2,16 +2,16 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime * objects. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; diff --git a/app/vendor/cakephp/chronos/src/Traits/TimezoneTrait.php b/app/vendor/cakephp/chronos/src/Traits/TimezoneTrait.php index 2452de7ae..6335c9d0b 100644 --- a/app/vendor/cakephp/chronos/src/Traits/TimezoneTrait.php +++ b/app/vendor/cakephp/chronos/src/Traits/TimezoneTrait.php @@ -2,19 +2,20 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. Provides various operator methods for datetime * objects. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos\Traits; +use Cake\Chronos\ChronosDate; use Cake\Chronos\ChronosInterface; use ReturnTypeWillChange; @@ -31,6 +32,8 @@ trait TimezoneTrait */ public function timezone($value): ChronosInterface { + trigger_error('2.5 timezone() is deprecated. Use setTimezone() instead.', E_USER_DEPRECATED); + return $this->setTimezone($value); } @@ -42,6 +45,8 @@ public function timezone($value): ChronosInterface */ public function tz($value): ChronosInterface { + trigger_error('2.5 tz() is deprecated. Use setTimezone() instead.', E_USER_DEPRECATED); + return $this->setTimezone($value); } @@ -54,6 +59,10 @@ public function tz($value): ChronosInterface #[ReturnTypeWillChange] public function setTimezone($value): ChronosInterface { + if (static::class === ChronosDate::class) { + trigger_error('2.5 setTimezone() will be removed in 3.x.', E_USER_DEPRECATED); + } + return parent::setTimezone(static::safeCreateDateTimeZone($value)); } } diff --git a/app/vendor/cakephp/chronos/src/Translator.php b/app/vendor/cakephp/chronos/src/Translator.php index 382bfd484..2229d4680 100644 --- a/app/vendor/cakephp/chronos/src/Translator.php +++ b/app/vendor/cakephp/chronos/src/Translator.php @@ -2,14 +2,14 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ namespace Cake\Chronos; diff --git a/app/vendor/cakephp/chronos/src/carbon_compat.php b/app/vendor/cakephp/chronos/src/carbon_compat.php index 0d8eff724..a7c1c80d2 100644 --- a/app/vendor/cakephp/chronos/src/carbon_compat.php +++ b/app/vendor/cakephp/chronos/src/carbon_compat.php @@ -2,15 +2,15 @@ declare(strict_types=1); /** - * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * * Licensed under The MIT License * Redistributions of files must retain the above copyright notice. * - * @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org) + * @copyright Copyright (c) Cake Software Foundation, Inc. (https://cakefoundation.org) * @copyright Copyright (c) Brian Nesbitt - * @link http://cakephp.org CakePHP(tm) Project - * @license http://www.opensource.org/licenses/mit-license.php MIT License + * @link https://cakephp.org CakePHP(tm) Project + * @license https://www.opensource.org/licenses/mit-license.php MIT License */ // Check if the interface alias exists and don't redeclare it in case we are in diff --git a/app/vendor/cakephp/debug_kit/LICENSE.txt b/app/vendor/cakephp/debug_kit/LICENSE.txt index 0a0a98c8e..7fd9d1f4b 100644 --- a/app/vendor/cakephp/debug_kit/LICENSE.txt +++ b/app/vendor/cakephp/debug_kit/LICENSE.txt @@ -1,6 +1,6 @@ The MIT License -CakePHP(tm) : The Rapid Development PHP Framework (http://cakephp.org) +CakePHP(tm) : The Rapid Development PHP Framework (https://cakephp.org) Copyright (c) 2005-present, Cake Software Foundation, Inc. Permission is hereby granted, free of charge, to any person obtaining a diff --git a/app/vendor/cakephp/debug_kit/composer.json b/app/vendor/cakephp/debug_kit/composer.json index 248275f19..2504f45e3 100644 --- a/app/vendor/cakephp/debug_kit/composer.json +++ b/app/vendor/cakephp/debug_kit/composer.json @@ -18,7 +18,7 @@ ], "support": { "issues": "https://github.com/cakephp/debug_kit/issues", - "forum": "http://stackoverflow.com/tags/cakephp", + "forum": "https://stackoverflow.com/tags/cakephp", "irc": "irc://irc.freenode.org/cakephp", "source": "https://github.com/cakephp/debug_kit" }, diff --git a/app/vendor/cakephp/debug_kit/docs.Dockerfile b/app/vendor/cakephp/debug_kit/docs.Dockerfile index cb30b3edf..f5613cace 100644 --- a/app/vendor/cakephp/debug_kit/docs.Dockerfile +++ b/app/vendor/cakephp/debug_kit/docs.Dockerfile @@ -1,5 +1,5 @@ # Generate the HTML output. -FROM markstory/cakephp-docs-builder as builder +FROM ghcr.io/cakephp/docs-builder as builder RUN pip install git+https://github.com/sphinx-contrib/video.git@master @@ -15,7 +15,7 @@ RUN cd /data/docs-builder \ && cp /data/docs/static/* /data/website/html/_static/ # Build a small nginx container with just the static site in it. -FROM markstory/cakephp-docs-builder:runtime as runtime +FROM ghcr.io/cakephp/docs-builder:runtime as runtime # Configure search index script ENV LANGS="en fr ja pt" diff --git a/app/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php b/app/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php index 662d1b769..e6db2ed37 100644 --- a/app/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php +++ b/app/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php @@ -69,6 +69,6 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface return $response; } - return $this->service->injectScripts($row, $response); + return $this->service->injectScripts($row, $request, $response); } } diff --git a/app/vendor/cakephp/debug_kit/src/Panel/CachePanel.php b/app/vendor/cakephp/debug_kit/src/Panel/CachePanel.php index 0265157ed..23a2a1a2b 100644 --- a/app/vendor/cakephp/debug_kit/src/Panel/CachePanel.php +++ b/app/vendor/cakephp/debug_kit/src/Panel/CachePanel.php @@ -55,9 +55,17 @@ public function initialize() if (isset($config['className']) && $config['className'] instanceof DebugEngine) { $instance = $config['className']; } elseif (isset($config['className'])) { - Cache::drop($name); - $instance = new DebugEngine($config, $name, $this->logger); + /** @var \Cake\Cache\CacheEngine $engine */ + $engine = Cache::pool($name); + // Unload from the cache registry so that subsequence calls to + // Cache::pool($name) use the new config with DebugEngine instance set below. + Cache::getRegistry()->unload($name); + + $instance = new DebugEngine($engine, $name, $this->logger); + $instance->init(); $config['className'] = $instance; + + Cache::drop($name); Cache::setConfig($name, $config); } if (isset($instance)) { diff --git a/app/vendor/cakephp/debug_kit/src/ToolbarService.php b/app/vendor/cakephp/debug_kit/src/ToolbarService.php index 8dac83c4b..c08418c4a 100644 --- a/app/vendor/cakephp/debug_kit/src/ToolbarService.php +++ b/app/vendor/cakephp/debug_kit/src/ToolbarService.php @@ -25,6 +25,7 @@ use DebugKit\Panel\PanelRegistry; use PDOException; use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\ServerRequestInterface; /** * Used to create the panels and inject a toolbar into @@ -337,10 +338,11 @@ public function getToolbarUrl() * contains HTML and there is a tag. * * @param \DebugKit\Model\Entity\Request $row The request data to inject. + * @param \Psr\Http\Message\ServerRequestInterface $request The request to augment. * @param \Psr\Http\Message\ResponseInterface $response The response to augment. * @return \Psr\Http\Message\ResponseInterface The modified response */ - public function injectScripts($row, ResponseInterface $response) + public function injectScripts($row, ServerRequestInterface $request, ResponseInterface $response) { $response = $response->withHeader('X-DEBUGKIT-ID', (string)$row->id); if (strpos($response->getHeaderLine('Content-Type'), 'html') === false) { @@ -357,13 +359,18 @@ public function injectScripts($row, ResponseInterface $response) if ($pos === false) { return $response; } + $nonce = $request->getAttribute('cspScriptNonce'); + if ($nonce) { + $nonce = sprintf(' nonce="%s"', $nonce); + } $url = Router::url('/', true); $script = sprintf( - '', + '', $row->id, $url, - Router::url($this->getToolbarUrl()) + Router::url($this->getToolbarUrl()), + $nonce ); $contents = substr($contents, 0, $pos) . $script . substr($contents, $pos); $body->rewind(); diff --git a/app/vendor/cakephp/debug_kit/tests/Fixture/PanelsFixture.php b/app/vendor/cakephp/debug_kit/tests/Fixture/PanelsFixture.php index b5a2c494f..a79c45143 100644 --- a/app/vendor/cakephp/debug_kit/tests/Fixture/PanelsFixture.php +++ b/app/vendor/cakephp/debug_kit/tests/Fixture/PanelsFixture.php @@ -1,14 +1,14 @@ - + src/ tests/ diff --git a/app/vendor/cakephp/migrations/src/CakeAdapter.php b/app/vendor/cakephp/migrations/src/CakeAdapter.php index 7e5eeafc4..c5bcad7ca 100644 --- a/app/vendor/cakephp/migrations/src/CakeAdapter.php +++ b/app/vendor/cakephp/migrations/src/CakeAdapter.php @@ -58,7 +58,7 @@ public function __construct(AdapterInterface $adapter, ?Connection $connection = if ($connection->getDriver() instanceof Postgres) { $config = $connection->config(); $schema = empty($config['schema']) ? 'public' : $config['schema']; - $pdo->exec('SET search_path TO ' . $schema); + $pdo->exec('SET search_path TO ' . $pdo->quote($schema)); } $connection->getDriver()->setConnection($pdo); } diff --git a/app/vendor/cakephp/migrations/src/Command/BakeMigrationDiffCommand.php b/app/vendor/cakephp/migrations/src/Command/BakeMigrationDiffCommand.php index 58dc44b07..6fc28f154 100644 --- a/app/vendor/cakephp/migrations/src/Command/BakeMigrationDiffCommand.php +++ b/app/vendor/cakephp/migrations/src/Command/BakeMigrationDiffCommand.php @@ -451,7 +451,7 @@ protected function checkSync() $lastVersion = $this->migratedItems[0]['version']; $lastFile = end($this->migrationsFiles); - return (bool)strpos($lastFile, (string)$lastVersion); + return $lastFile && (bool)strpos($lastFile, (string)$lastVersion); } return false; @@ -473,15 +473,7 @@ protected function bakeSnapshot($name, Arguments $args, ConsoleIo $io) $newArgs = []; $newArgs[] = $name; - if ($args->getOption('connection')) { - $newArgs[] = '-c'; - $newArgs[] = $args->getOption('connection'); - } - - if ($args->getOption('plugin')) { - $newArgs[] = '-p'; - $newArgs[] = $args->getOption('plugin'); - } + $newArgs = array_merge($newArgs, $this->parseOptions($args)); $exitCode = $this->executeCommand(BakeMigrationSnapshotCommand::class, $newArgs, $io); diff --git a/app/vendor/cakephp/migrations/src/Command/BakeSimpleMigrationCommand.php b/app/vendor/cakephp/migrations/src/Command/BakeSimpleMigrationCommand.php index 6708aa330..37f2dca88 100644 --- a/app/vendor/cakephp/migrations/src/Command/BakeSimpleMigrationCommand.php +++ b/app/vendor/cakephp/migrations/src/Command/BakeSimpleMigrationCommand.php @@ -40,7 +40,9 @@ abstract class BakeSimpleMigrationCommand extends SimpleBakeCommand * * @var string */ - public $pathFragment = 'config/Migrations/'; + public $pathFragment = 'config'; + + public const DEFAULT_MIGRATION_FOLDER = 'Migrations'; /** * @inheritDoc @@ -65,9 +67,10 @@ public function fileName($name): string */ public function getPath(Arguments $args): string { - $path = ROOT . DS . $this->pathFragment; + $migrationFolder = $this->pathFragment . DS . $args->getOption('source') . DS; + $path = ROOT . DS . $migrationFolder; if ($this->plugin) { - $path = $this->_pluginPath($this->plugin) . $this->pathFragment; + $path = $this->_pluginPath($this->plugin) . $migrationFolder; } return str_replace('/', DS, $path); @@ -188,6 +191,10 @@ public function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionPar 'short' => 'f', 'boolean' => true, 'help' => 'Force overwriting existing file if a migration already exists with the same name.', + ])->addOption('source', [ + 'short' => 's', + 'default' => self::DEFAULT_MIGRATION_FOLDER, + 'help' => 'Name of the folder in which the migration should be saved.', ]); return $parser; diff --git a/app/vendor/cakephp/migrations/src/Command/SnapshotTrait.php b/app/vendor/cakephp/migrations/src/Command/SnapshotTrait.php index 5ba086e63..7d2fc2fff 100644 --- a/app/vendor/cakephp/migrations/src/Command/SnapshotTrait.php +++ b/app/vendor/cakephp/migrations/src/Command/SnapshotTrait.php @@ -59,15 +59,7 @@ protected function markSnapshotApplied($path, Arguments $args, ConsoleIo $io) $newArgs[] = $version; $newArgs[] = '-o'; - if ($args->getOption('connection')) { - $newArgs[] = '-c'; - $newArgs[] = $args->getOption('connection'); - } - - if ($args->getOption('plugin')) { - $newArgs[] = '-p'; - $newArgs[] = $args->getOption('plugin'); - } + $newArgs = array_merge($newArgs, $this->parseOptions($args)); $io->out('Marking the migration ' . $fileName . ' as migrated...'); $this->executeCommand(MigrationsMarkMigratedCommand::class, $newArgs, $io); @@ -83,8 +75,21 @@ protected function markSnapshotApplied($path, Arguments $args, ConsoleIo $io) */ protected function refreshDump(Arguments $args, ConsoleIo $io) { - $newArgs = []; + $newArgs = $this->parseOptions($args); + + $io->out('Creating a dump of the new database state...'); + $this->executeCommand(MigrationsDumpCommand::class, $newArgs, $io); + } + /** + * Will parse 'connection', 'plugin' and 'source' options into a new Array + * + * @param \Cake\Console\Arguments $args The command arguments. + * @return array Array containing the short for the option followed by its value + */ + protected function parseOptions(Arguments $args): array + { + $newArgs = []; if ($args->getOption('connection')) { $newArgs[] = '-c'; $newArgs[] = $args->getOption('connection'); @@ -95,7 +100,11 @@ protected function refreshDump(Arguments $args, ConsoleIo $io) $newArgs[] = $args->getOption('plugin'); } - $io->out('Creating a dump of the new database state...'); - $this->executeCommand(MigrationsDumpCommand::class, $newArgs, $io); + if ($args->getOption('source')) { + $newArgs[] = '-s'; + $newArgs[] = $args->getOption('source'); + } + + return $newArgs; } } diff --git a/app/vendor/cakephp/migrations/templates/bake/element/add-foreign-keys.twig b/app/vendor/cakephp/migrations/templates/bake/element/add-foreign-keys.twig index ef75c63aa..6df6a12d7 100644 --- a/app/vendor/cakephp/migrations/templates/bake/element/add-foreign-keys.twig +++ b/app/vendor/cakephp/migrations/templates/bake/element/add-foreign-keys.twig @@ -1,6 +1,6 @@ {% set statement = Migration.tableStatement(table, true) %} {% set hasProcessedConstraint = false %} -{% for constraint in constraints %} +{% for constraintName, constraint in constraints[table] %} {% set constraintColumns = constraint['columns']|sort %} {% if constraint['type'] != 'unique' %} {% set hasProcessedConstraint = true %} @@ -29,6 +29,7 @@ [ 'update' => '{{ Migration.formatConstraintAction(constraint['update']) | raw }}', 'delete' => '{{ Migration.formatConstraintAction(constraint['delete']) | raw }}', + 'constraint' => '{{ constraintName }}' ] ) {% endif %} diff --git a/app/vendor/cakephp/migrations/templates/bake/element/create-tables.twig b/app/vendor/cakephp/migrations/templates/bake/element/create-tables.twig index 8f4a2e330..0bac5deb7 100644 --- a/app/vendor/cakephp/migrations/templates/bake/element/create-tables.twig +++ b/app/vendor/cakephp/migrations/templates/bake/element/create-tables.twig @@ -40,21 +40,25 @@ {% for name, constraint in createData.tables[table].constraints %} {% if constraint['columns'] != primaryKeysColumns %} ->addIndex( - [{{ Migration.stringifyList(constraint['columns'], {'indent': 5}) | raw }}]{{ (constraint['type'] == 'unique') ? ',' : '' }} + [{{ Migration.stringifyList(constraint['columns'], {'indent': 5}) | raw }}], +{% set params = {'name': name} %} {% if constraint['type'] == 'unique' %} - ['unique' => true] +{% set params = params|merge({'unique': true}) %} {% endif %} + [{{ Migration.stringifyList(params, {'indent': 5}) | raw }}] ) {% endif %} {% endfor %} {% endif %} -{% for index in createData.tables[table].indexes %} +{% for indexName, index in createData.tables[table].indexes %} {% set indexColumns = index['columns'] | sort %} ->addIndex( - [{{ Migration.stringifyList(index['columns'], {'indent': 5}) | raw }}]{{ (index['type'] == 'fulltext') ? ',' : '' }} -{% if index['type'] == 'fulltext' %} - ['type' => 'fulltext'] -{% endif %} + [{{ Migration.stringifyList(index['columns'], {'indent': 5}) | raw }}], +{% set params = {'name': indexName} %} +{% if index['type'] == 'fulltext' %} +{% set params = params|merge({'fulltext': true}) %} +{% endif %} + [{{ Migration.stringifyList(params, {'indent': 5}) | raw }}] ) {% endfor %} ->create(); @@ -62,8 +66,8 @@ {% if createData.constraints %} {% for table, tableConstraints in createData.constraints %} {{- element('Migrations.add-foreign-keys', { - constraints: tableConstraints, - table: table + constraints: createData.constraints, + table: table, }) -}} {% endfor -%} diff --git a/app/vendor/composer/autoload_classmap.php b/app/vendor/composer/autoload_classmap.php index e0bb04b0e..590252cbe 100644 --- a/app/vendor/composer/autoload_classmap.php +++ b/app/vendor/composer/autoload_classmap.php @@ -7,6 +7,7 @@ return array( 'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Mobile_Detect' => $vendorDir . '/mobiledetect/mobiledetectlib/Mobile_Detect.php', @@ -62,6 +63,7 @@ 'PHPUnit\\Framework\\Constraint\\LogicalXor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', 'PHPUnit\\Framework\\Constraint\\Operator' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', @@ -292,8 +294,8 @@ 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistDirectoriesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', + 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Php' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PhpHandler' => $vendorDir . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php', diff --git a/app/vendor/composer/autoload_psr4.php b/app/vendor/composer/autoload_psr4.php index 01cb175f5..d559f9586 100644 --- a/app/vendor/composer/autoload_psr4.php +++ b/app/vendor/composer/autoload_psr4.php @@ -32,7 +32,7 @@ 'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Http\\Server\\' => array($vendorDir . '/psr/http-server-handler/src', $vendorDir . '/psr/http-server-middleware/src'), - 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-factory/src', $vendorDir . '/psr/http-message/src'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src', $vendorDir . '/psr/http-factory/src'), 'Psr\\Http\\Client\\' => array($vendorDir . '/psr/http-client/src'), 'Psr\\Container\\' => array($vendorDir . '/psr/container/src'), 'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'), diff --git a/app/vendor/composer/autoload_static.php b/app/vendor/composer/autoload_static.php index b0e6f28e4..d916ad58e 100644 --- a/app/vendor/composer/autoload_static.php +++ b/app/vendor/composer/autoload_static.php @@ -259,8 +259,8 @@ class ComposerStaticInit8d81387c26c532d7a48feda4036c56c7 ), 'Psr\\Http\\Message\\' => array ( - 0 => __DIR__ . '/..' . '/psr/http-factory/src', - 1 => __DIR__ . '/..' . '/psr/http-message/src', + 0 => __DIR__ . '/..' . '/psr/http-message/src', + 1 => __DIR__ . '/..' . '/psr/http-factory/src', ), 'Psr\\Http\\Client\\' => array ( @@ -448,6 +448,7 @@ class ComposerStaticInit8d81387c26c532d7a48feda4036c56c7 public static $classMap = array ( 'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php', + 'CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php', 'Mobile_Detect' => __DIR__ . '/..' . '/mobiledetect/mobiledetectlib/Mobile_Detect.php', @@ -503,6 +504,7 @@ class ComposerStaticInit8d81387c26c532d7a48feda4036c56c7 'PHPUnit\\Framework\\Constraint\\LogicalXor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php', 'PHPUnit\\Framework\\Constraint\\ObjectEquals' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php', 'PHPUnit\\Framework\\Constraint\\ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasAttribute.php', + 'PHPUnit\\Framework\\Constraint\\ObjectHasProperty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php', 'PHPUnit\\Framework\\Constraint\\Operator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Operator/Operator.php', 'PHPUnit\\Framework\\Constraint\\RegularExpression' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php', 'PHPUnit\\Framework\\Constraint\\SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Cardinality/SameSize.php', @@ -733,8 +735,8 @@ class ComposerStaticInit8d81387c26c532d7a48feda4036c56c7 'PHPUnit\\TextUI\\XmlConfiguration\\Migrator' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromFilterWhitelistToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromFilterWhitelistToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveAttributesFromRootToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveAttributesFromRootToCoverage.php', - 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistDirectoriesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistExcludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php', + 'PHPUnit\\TextUI\\XmlConfiguration\\MoveWhitelistIncludesToCoverage' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistIncludesToCoverage.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PHPUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHPUnit/PHPUnit.php', 'PHPUnit\\TextUI\\XmlConfiguration\\Php' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/Php.php', 'PHPUnit\\TextUI\\XmlConfiguration\\PhpHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php', diff --git a/app/vendor/composer/ca-bundle/res/cacert.pem b/app/vendor/composer/ca-bundle/res/cacert.pem index 2ae7b6cb2..9551dfd83 100644 --- a/app/vendor/composer/ca-bundle/res/cacert.pem +++ b/app/vendor/composer/ca-bundle/res/cacert.pem @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Tue Jan 10 04:12:06 2023 GMT +## Certificate data from Mozilla as of: Tue Aug 22 03:12:04 2023 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. -## SHA256: 90c470e705b4b5f36f09684dc50e2b79c8b86989a848b62cd1a7bd6460ee65f6 +## SHA256: 0ff137babc6a5561a9cfbe9f29558972e5b528202681b7d3803d03a3e82922bd ## @@ -603,26 +603,6 @@ NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----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----- @@ -1261,40 +1241,6 @@ Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- @@ -3276,55 +3222,6 @@ AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- -E-Tugra Global Root CA RSA v3 -============================= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -E-Tugra Global Root CA ECC v3 -============================= ------BEGIN CERTIFICATE----- -MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMwgYAxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVncmEgRUJHIEEuUy4xHTAbBgNV -BAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENB -IEVDQyB2MzAeFw0yMDAzMTgwOTQ2NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEP -MA0GA1UEBxMGQW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 -Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBFQ0MgdjMw -djAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQKczLWYHMjLiSF4mDKpL2 -w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YKfWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31 -Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQ -zPUwHQYDVR0OBBYEFP+CMXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjO -PQQDAwNpADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/67W4W -Aie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFxvmjkI6TZraE3 ------END CERTIFICATE----- - Security Communication RootCA3 ============================== -----BEGIN CERTIFICATE----- @@ -3370,3 +3267,185 @@ BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e N9k= -----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- diff --git a/app/vendor/composer/class-map-generator/README.md b/app/vendor/composer/class-map-generator/README.md index 3205ae989..4b5d6a26d 100644 --- a/app/vendor/composer/class-map-generator/README.md +++ b/app/vendor/composer/class-map-generator/README.md @@ -29,7 +29,7 @@ If all you want is to scan a directory and extract a classmap with all classes/interfaces/traits/enums mapped to their paths, you can simply use: -``` +```php use Composer\ClassMapGenerator\ClassMapGenerator; $map = ClassMapGenerator::createMap('path/to/scan'); @@ -41,7 +41,7 @@ foreach ($map as $symbol => $path) { For more advanced usage, you can instantiate a generator object and call scanPaths one or more time then call getClassMap to get a ClassMap object containing the resulting map + eventual warnings. -``` +```php use Composer\ClassMapGenerator\ClassMapGenerator; $generator = new ClassMapGenerator; diff --git a/app/vendor/composer/class-map-generator/composer.json b/app/vendor/composer/class-map-generator/composer.json index 140b483c8..59aa759e7 100644 --- a/app/vendor/composer/class-map-generator/composer.json +++ b/app/vendor/composer/class-map-generator/composer.json @@ -15,8 +15,8 @@ ], "require": { "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6", - "composer/pcre": "^2 || ^3" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7", + "composer/pcre": "^2.1 || ^3.1" }, "require-dev": { "symfony/phpunit-bridge": "^5", diff --git a/app/vendor/composer/class-map-generator/src/ClassMapGenerator.php b/app/vendor/composer/class-map-generator/src/ClassMapGenerator.php index f347960bf..fd905c3ca 100644 --- a/app/vendor/composer/class-map-generator/src/ClassMapGenerator.php +++ b/app/vendor/composer/class-map-generator/src/ClassMapGenerator.php @@ -174,7 +174,7 @@ public function scanPaths($path, string $excluded = null, string $autoloadType = } $classes = PhpFileParser::findClasses($filePath); - if ('classmap' !== $autoloadType && isset($namespace, $basePath)) { + if ('classmap' !== $autoloadType && isset($namespace)) { $classes = $this->filterByNamespace($classes, $filePath, $namespace, $autoloadType, $basePath); // if no valid class was found in the file then we do not mark it as scanned as it might still be matched by another rule later @@ -291,7 +291,7 @@ private static function normalizePath(string $path) } // extract a prefix being a protocol://, protocol:, protocol://drive: or simply drive: - if (Preg::isMatch('{^( [0-9a-z]{2,}+: (?: // (?: [a-z]: )? )? | [a-z]: )}ix', $path, $match)) { + if (Preg::isMatchStrictGroups('{^( [0-9a-z]{2,}+: (?: // (?: [a-z]: )? )? | [a-z]: )}ix', $path, $match)) { $prefix = $match[1]; $path = substr($path, \strlen($prefix)); } @@ -313,7 +313,7 @@ private static function normalizePath(string $path) } // ensure c: is normalized to C: - $prefix = Preg::replaceCallback('{(^|://)[a-z]:$}i', function (array $m) { return strtoupper($m[0]); }, $prefix); + $prefix = Preg::replaceCallback('{(?:^|://)[a-z]:$}i', function (array $m) { return strtoupper((string) $m[0]); }, $prefix); return $prefix.$absolute.implode('/', $parts); } diff --git a/app/vendor/composer/class-map-generator/src/PhpFileParser.php b/app/vendor/composer/class-map-generator/src/PhpFileParser.php index fa9b4e343..b678aeee0 100644 --- a/app/vendor/composer/class-map-generator/src/PhpFileParser.php +++ b/app/vendor/composer/class-map-generator/src/PhpFileParser.php @@ -52,8 +52,8 @@ public static function findClasses(string $path): array } // return early if there is no chance of matching anything in this file - Preg::matchAll('{\b(?:class|interface|trait'.$extraTypes.')\s}i', $contents, $matches); - if (!$matches) { + Preg::matchAllStrictGroups('{\b(?:class|interface|trait'.$extraTypes.')\s}i', $contents, $matches); + if (0 === \count($matches)) { return array(); } @@ -76,6 +76,7 @@ public static function findClasses(string $path): array $namespace = str_replace(array(' ', "\t", "\r", "\n"), '', (string) $matches['nsname'][$i]) . '\\'; } else { $name = $matches['name'][$i]; + assert(is_string($name)); // skip anon classes extending/implementing if ($name === 'extends' || $name === 'implements') { continue; @@ -83,7 +84,7 @@ public static function findClasses(string $path): array if ($name[0] === ':') { // This is an XHP class, https://github.com/facebook/xhp $name = 'xhp'.substr(str_replace(array('-', ':'), array('_', '__'), $name), 1); - } elseif (strtolower($matches['type'][$i]) === 'enum') { + } elseif (strtolower((string) $matches['type'][$i]) === 'enum') { // something like: // enum Foo: int { HERP = '123'; } // The regex above captures the colon, which isn't part of diff --git a/app/vendor/composer/composer/.editorconfig b/app/vendor/composer/composer/.editorconfig deleted file mode 100644 index 033f8a6da..000000000 --- a/app/vendor/composer/composer/.editorconfig +++ /dev/null @@ -1,11 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_size = 4 -indent_style = space -insert_final_newline = true -trim_trailing_whitespace = true - -[*.yml] -indent_size = 2 diff --git a/app/vendor/composer/composer/.gitattributes b/app/vendor/composer/composer/.gitattributes deleted file mode 100644 index a929b3528..000000000 --- a/app/vendor/composer/composer/.gitattributes +++ /dev/null @@ -1,19 +0,0 @@ -# Auto-detect text files, ensure they use LF. -* text=auto eol=lf - -# These files are always considered text and should use LF. -# See core.whitespace @ https://git-scm.com/docs/git-config for whitespace flags. -*.php text eol=lf whitespace=blank-at-eol,blank-at-eof,space-before-tab,tab-in-indent,tabwidth=4 diff=php -*.json text eol=lf whitespace=blank-at-eol,blank-at-eof,space-before-tab,tab-in-indent,tabwidth=4 -*.test text eol=lf whitespace=blank-at-eol,blank-at-eof,space-before-tab,tab-in-indent,tabwidth=4 -*.yml text eol=lf whitespace=blank-at-eol,blank-at-eof,space-before-tab,tab-in-indent,tabwidth=2 - -# Exclude non-essential files from dist -/tests export-ignore -.github export-ignore -.php_cs export-ignore -.travis.yml export-ignore -appveyor.yml export-ignore -phpunit.xml.dist export-ignore -/phpstan/* export-ignore -/phpstan/rules.neon -export-ignore \ No newline at end of file diff --git a/app/vendor/composer/composer/.gitignore b/app/vendor/composer/composer/.gitignore deleted file mode 100644 index 3db374fdf..000000000 --- a/app/vendor/composer/composer/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -/.settings -/.project -/.buildpath -/composer.phar -/vendor -/nbproject -.phpunit.result.cache -phpunit.xml -.vagrant -Vagrantfile -.idea -.php-cs-fixer.cache diff --git a/app/vendor/composer/composer/.php-cs-fixer.php b/app/vendor/composer/composer/.php-cs-fixer.php deleted file mode 100644 index 7eefc2970..000000000 --- a/app/vendor/composer/composer/.php-cs-fixer.php +++ /dev/null @@ -1,90 +0,0 @@ - - Jordi Boggiano - -For the full copyright and license information, please view the LICENSE -file that was distributed with this source code. -EOF; - -$finder = PhpCsFixer\Finder::create() - ->files() - ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') - ->name('*.php') - ->notPath('Fixtures') - ->notPath('Composer/Autoload/ClassLoader.php') - ->notPath('Composer/InstalledVersions.php') -; - -$config = new PhpCsFixer\Config(); -return $config->setRules([ - '@PSR2' => true, - 'binary_operator_spaces' => true, - 'blank_line_before_statement' => ['statements' => ['declare', 'return']], - 'cast_spaces' => ['space' => 'single'], - 'header_comment' => ['header' => $header], - 'include' => true, - - 'class_attributes_separation' => ['elements' => ['method' => 'one', 'trait_import' => 'none']], - 'no_blank_lines_after_class_opening' => true, - 'no_blank_lines_after_phpdoc' => true, - 'no_empty_statement' => true, - 'no_extra_blank_lines' => true, - 'no_leading_namespace_whitespace' => true, - 'no_trailing_comma_in_singleline_array' => true, - 'no_whitespace_in_blank_line' => true, - 'object_operator_without_whitespace' => true, - //'phpdoc_align' => true, - 'phpdoc_indent' => true, - 'no_empty_comment' => true, - 'no_empty_phpdoc' => true, - 'phpdoc_no_access' => true, - 'phpdoc_no_package' => true, - //'phpdoc_order' => true, - 'phpdoc_scalar' => true, - 'phpdoc_trim' => true, - 'phpdoc_types' => true, - 'psr_autoloading' => true, - 'single_blank_line_before_namespace' => true, - 'standardize_not_equals' => true, - 'ternary_operator_spaces' => true, - 'trailing_comma_in_multiline' => ['elements' => ['arrays']], - 'unary_operator_spaces' => true, - - // imports - 'no_unused_imports' => true, - 'fully_qualified_strict_types' => true, - 'single_line_after_imports' => true, - //'global_namespace_import' => ['import_classes' => true], - 'no_leading_import_slash' => true, - 'single_import_per_statement' => true, - - // PHP 7.2 migration - 'array_syntax' => true, - 'list_syntax' => true, - 'regular_callable_call' => true, - 'static_lambda' => true, - 'nullable_type_declaration_for_default_null_value' => true, - 'explicit_indirect_variable' => true, - 'visibility_required' => ['elements' => ['property', 'method', 'const']], - 'non_printable_character' => true, - 'combine_nested_dirname' => true, - 'random_api_migration' => true, - 'ternary_to_null_coalescing' => true, - 'phpdoc_to_param_type' => true, - 'declare_strict_types' => true, - 'no_superfluous_phpdoc_tags' => [ - 'allow_mixed' => true, - ], - - // TODO php 7.4 migration (one day..) - // 'phpdoc_to_property_type' => true, - ]) - ->setUsingCache(true) - ->setRiskyAllowed(true) - ->setFinder($finder) -; diff --git a/app/vendor/composer/composer/CHANGELOG.md b/app/vendor/composer/composer/CHANGELOG.md deleted file mode 100644 index 5a48af7ba..000000000 --- a/app/vendor/composer/composer/CHANGELOG.md +++ /dev/null @@ -1,1881 +0,0 @@ -### [2.5.5] 2023-03-21 - - * Fixed basic auth failures resulting in infinite retry loop (#11320) - * Fixed GitHub rate limit reporting (#11366) - * Fixed InstalledVersions error in Composer 1 compatibility edge case (#11304) - * Fixed issue displaying solver problems with branch names containing `%` signs (#11359) - * Fixed race condition in cache validity detection when running Composer highly concurrently (#11375) - * Fixed various minor config command issues (#11353, #11302) - -### [2.5.4] 2023-02-15 - - * Fixed extra.plugin-optional support in PluginInstaller when doing pre-install checks (#11318) - -### [2.5.3] 2023-02-10 - - * Added extra.plugin-optional support for allow auto-disabling unknown plugins which are not critical when running non-interactive (#11315) - -### [2.5.2] 2023-02-04 - - * Added warning when `require` auto-selects a feature branch as that is probably not desired (#11270) - * Fixed `self.version` requirements reporting lock file integrity errors when changing branches (#11283) - * Fixed `require` regression which broke the --fixed flag (#11247) - * Fixed security audit reports loading when exclude/only filter rules are used on a repository (#11281) - * Fixed autoloading regression on PHP 5.6 (#11285) - * Fixed archive command including an existing archive into itself if run repeatedly (#11239) - * Fixed dev package prompt in `require` not appearing in some conditions (#11287) - -### [2.5.1] 2022-12-22 - - * Fixed ClassLoader regression which made it fail if serialized (e.g. within PHPUnit process isolation) (#11237) - * Fixed preg type error in svn version guessing (#11231) - -### [2.5.0] 2022-12-20 - - * BC Warning: To prevent abuse of our includeFile() function it is now gone, it was not part of the official API but may still cause issues if some code incorrectly relied on it (#11015) - * Improved version guessing of `require` command to use the dependency resolution result instead of using the latest available version (except if you run with --no-update) (#11160) - * Improved version selection in `archive` command (#11230) - * Added autocompletion of config option names in the `config` command (#11130) - * Added support for writing [custom commands as Command classes](https://getcomposer.org/doc/articles/scripts.md#writing-custom-commands) (#11151) - * Added hard failure when installing from a lock file which does not satisfy the composer.json requirements (#11195) - * Added warning when the outdated command rejects a new package due to unmet platform requirements (#11113) - * Added support for `bump` command to bump `>=x` to `>=installed-version` (#11179) - * Added `--download-only` flag to `install` command to only download and prime the cache with the package archives (#11041) - * Added autoconfiguration of `github-domains`/`gitlab-domains` when GitHub/GitLab credentials are configured for a custom domain (#11062) - * Added hard failure (throw) if COMPOSER_AUTH is present and malformed JSON (#11085) - * Added interactive prompt to `run-script` and `exec` commands if run without any argument (#11157) - * Added interactive prompt where to store credentials when a project-local auth.json exists (#11188) - * Fixed full disk warning to be shown when less than 100MiB is available (#11190) - * Fixed cache keys to allow `_` to avoid conflicts between package names like `a-b` and `a_b` (#11229) - * Fixed docker compatibility by making paths more portable even if the project is installed at `/` (#11169) - -### [2.4.4] 2022-10-27 - - * Added extra debug output when a zip extraction fails while on GitHub Actions (#11148) - * Fixed cache write failures when the cache dir gets removed during a composer run (#11076) - * Fixed 2.4.3 regression in loading Composer on SMB/network shares (#11077) - * Fixed `--dry-run` flag missing from `bump` command (#11047) - * Fixed `status` command reporting differences when the source ref is a tag (#11155) - * Fixed outdated command outputting legend on stdout instead of stderr - * Fixed URL sanitizer to handle new GitHub personal access tokens format (#11137) - -### [2.4.3] 2022-10-14 - - * BC Break: The json format of `audit` command now has `reportedAt` as an RFC3339 string instead of an object which was a mistake (#11120) - * Fixed json format of `audit` command which was missing affectedVersions (#11120) - * Fixed plugin commands not being loaded during bash completions (#11074) - * Fixed parsing of inline aliases within complex constraints with `||` or `,` (#11086) - * Fixed min-php version check in autoload.php to avoid crashing sites running on PHP 5.5 or below silently with a 200 (#11091) - * Fixed JsonFile reading files without checking if they are readable first (#11077) - * Fixed `require` command with `--dry-run` failing when requiring a package requiring stability flag extraction (#11112) - -### [2.4.2] 2022-09-14 - - * Fixed bash completion hanging when running as root without `COMPOSER_ALLOW_SUPERUSER` set (#11024) - * Fixed handling of plugin activation when running as root without `COMPOSER_ALLOW_SUPERUSER` set so it always happens after prompting, or does not happen if input is non-interactive - * Fixed package filter on `bump` command (#11053) - * Fixed handling of --ignore-platform-req with upper-bound ignores to not apply to conflict rules (#11037) - * Fixed handling of `COMPOSER_DISCARD_CHANGES` when set to `0` - * Fixed handling of zero-major versions in `outdated` command with `--major-only` (#11032) - * Fixed `show --platform` regression since 2.4.0 when running in a directory without composer.json (#11046) - * Fixed a few strict type errors - -### [2.4.1] 2022-08-20 - - * Added a `COMPOSER_NO_AUDIT` env var to easily apply the new --no-audit flag in CI (#10998) - * Fixed `show` command showing packages in two sections, this was only meant for the `outdated` command (#11000) - * Fixed local git repos being copied to cache unnecessarily (#11001) - * Fixed git cache invalidation issue when a git tag gets created after the cache has loaded a given reference (#11004) - -### [2.4.0] 2022-08-16 - - * Added `json` format output to the new `audit` command (#10965) - * Added `json` format output to the `check-platform-reqs` command (#10979) - * Added GitLab 15+ token refresh support (#10988) - * Fixed `COMPOSER_NO_DEV` so it also works with `require` and `remove`'s `--update-no-dev` (#10995) - * Fixed various bash completion issues - -### [2.4.0-RC1] 2022-07-21 - - * Added bash completions for Composer commands, package names, etc (see [how to setup](https://getcomposer.org/doc/03-cli.md#bash-completions)) (#10320) - * Added `bump` command to bump requirements to the currently installed version (#10829) - * Added `audit` command to check for known security vulnerabilities in installed packages (#10798, #10898) - * Added automatic auditing of security vulnerabilities after `update` is done, can be overridden with `--no-audit` (#10798, #10898) - * Added `--audit` to `install` command to also do an audit (#10798, #10898) - * Added `r` alias to `require` command (#10953) - * Added `composer/class-map-generator` dependency to replace `Composer\Autoload\ClassMapGenerator` which is now deprecated (#10885) - * Added `--locked` to `depends`/`prohibits` commands (#10834) - * Added `--strict-psr` flag to `dump-autoload` command to fail the process if PSR violations were detected, useful for CI (#10886) - * Added `COMPOSER_PREFER_STABLE` and `COMPOSER_PREFER_LOWEST` env vars to turn on `--prefer-stable`/`--prefer-lowest` on `update` and `require` command, useful for CI (#10919) - * Added support for temporary update constraints on all packages (now also including non-root dependencies) (#10773) - * Added `--major-only` flag to the `outdated` command to show only packages with major version updates (#10827) - * Added sections for direct and transitive deps in `outdated` command output (#10779) - * Added ability for cache GC to clean up `vcs` and `repo` caches (#10826) - * Added `--gc` flag to `clear-cache` to only trigger a garbage collection instead of clearing everything (#10826) - * Added signal (SIGINT, SIGTERM, SIGHUP) handling to ensure we wait for the child process to exit before Composer exits to avoid dropping output (#10958) - * Added prompt suggesting using `--dev` when requiring packages with `dev`/`testing`/`static analysis` keywords present (#10960) - * Added warning in `require`, `init` and `create-project` commands when the latest version of a package cannot be used due to platform requirements (#10896) - -### [2.3.10] 2022-07-13 - - * Fixed plugins from CWD/vendor being loaded in some cases like create-project or validate even though the target directory is outside of CWD (#10935) - * Fixed support for legacy (Composer 1.x, e.g. hirak/prestissimo) plugins which will not warn/error anymore if not in allow-plugins, as they are anyway not loaded (#10928) - * Fixed pre-install check for allowed plugins not taking --no-plugins into account (#10925) - * Fixed support for disable_functions containing disk_free_space (#10936) - * Fixed RootPackageRepository usages to always clone the root package to avoid interoperability issues with plugins (#10940) - -### [2.3.9] 2022-07-05 - - * Fixed non-interactive behavior of allow-plugins to throw instead of continue with a warning to avoid broken installs (#10920) - * Fixed allow-plugins BC mode to ensure old lock files created pre-2.2 can be installed with only a warning but plugins fully loaded (#10920) - * Fixed deprecation notice (#10921) - * Fixed type errors (#10924) - -### [2.3.8] 2022-07-01 - - * Fixed support for `cache-read-only` where the filesystem is not writable (#10906) - * Fixed type error when using `allow-plugins: true` (#10909) - * Fixed @putenv scripts receiving arguments passed to the command (#10846) - * Fixed support for spaces in paths with binary proxies on Windows (#10836) - * Fixed type error in GitDownloader if branches cannot be listed (#10888) - * Fixed RootPackageInterface issue on PHP 5.3.3 (#10895) - * Fixed type errors (#10904, #10897) - -### [2.3.7] 2022-06-06 - - * Fixed a few PHPStan ConfigReturnTypeExtension bugs - * Fixed Config default for auth configs to be empty arrays instead of null, fixes issues with diagnose command (#10814) - * Fixed handling of broken symlinks when checking whether a package is still installed (#6708) - * Fixed bin proxies to allow a proxy to include another one safely (#10823) - * Fixed openssl 3.x version parsing as it is now semver compliant - * Fixed type error when a json file cannot be read (#10818) - * Fixed parsing of multi-line arrays in funding.yml (#10784) - -### [2.3.6] 2022-06-01 - - * Added `Composer\PHPStan\ConfigReturnTypeExtension` to improve return types of `Config::get()` which you can also use in plugins CI (#10635) - * Fixed name validation regex in schema causing issues with JS IDEs like VS Code (#10811) - * Fixed unnecessary HTTP request in BitbucketDriver (#10729) - * Fixed invalid credentials loop when setting up GitLab token (#10748) - * Fixed PHP 8.2 deprecations (#10766) - * Fixed lock file changes being output even when the lock file creation is disabled - * Fixed race condition when multiple requests asking for auth on the same hostname fired concurrently (#10763) - * Fixed quoting of commas on Windows (#10775) - * Fixed issue installing path repos with a disabled symlink function (#10786) - * Fixed various type errors (#10753, #10739, #10751) - -### [2.3.5] 2022-04-13 - - * Security: Fixed command injection vulnerability in HgDriver/GitDriver (GHSA-x7cr-6qr6-2hh6 / CVE-2022-24828) - * Added warning when downloading a file with `verify_peer[_name]` disabled (#10722) - * Fixed curl downloader not retrying when a DNS resolution failure occurs (#10716) - * Fixed composer.lock file still being used/read when the `lock` config option is disabled (#10726) - * Fixed `validate` command checking the lock file even if the `lock` option is disabled (#10723) - * Fixed detection of default branch name when it changed since a git repo was mirrored in cache dir (#10701) - -### [2.3.4] 2022-04-07 - - * Fixed the generated autoload.php to support running on PHP 5.6+ (down from 7.0+) and warn clearly on older PHP versions (#10714) - * Fixed run-script --list flag regression (#10710) - * Fixed curl downloader handling of DNS resolution failures to do an automatic retry (#10716) - * Fixed script handling of external commands not setting the Path env correctly on windows (#10700) - * Fixed various type errors (#10694, #10696, #10702, #10712, #10703) - -### [2.3.3] 2022-04-01 - - * Added --2.2 flag to `self-update` to pin the Composer version to the 2.2 LTS range (#10682) - * Added missing config.bitbucket-oauth in composer-schema.json - * Fixed type errors in SvnDriver (#10681) - * Fixed --version output to match the pre-2.3 one (#10684) - * Fixed config/auth.json files not being validated against the composer-schema.json (#10685) - * Fixed generation of autoload crashing if a package has a broken path (#10688) - * Fixed GitDriver state issue when reusing old cache dirs and the default branch was renamed (#10687) - * Updated semver, jsonlint deps for minor fixes - * Removed dev-master=>dev-main alias from #10372 as it does not work when reloading from lock file and extracting dev deps (#10651) - -### [2.3.2] 2022-03-30 - - * Fixed type error when running `exec` command (#10672) - * Fixed endless loop in plugin activation prompt when input is not fully interactive yet appears to be (#10648) - * Fixed type error in ComposerRepository (#10675) - * Fixed issues loading platform packages where the version of a library cannot be established (#10631) - -### [2.3.1] 2022-03-30 - - * Fixed type error when HOME env var is not set (#10670) - -### [2.3.0] 2022-03-30 - - * Fixed many strict types errors (#10646, #10642, #10647, #10658, #10656, #10665, #10660, #10663, #10662) - -### [2.3.0-RC2] 2022-03-20 - - * Fixed invalid return value in ComposerRepository::findPackage (#10622) - * Fixed many `show` command issues due to a flipped condition (#10623) - * Fixed `phpversion()` handling when it returns false due to an extension defining no version (#10631) - * Fixed `remove` command failing when no `allow-plugin` is defined in config (#10629) - * Performance improvement in Composer bootstrapping (version guessing) when on a feature branch (#10632) - -### [2.3.0-RC1] 2022-03-16 - - * BC Break: the minimum PHP version is now 7.2.5+, use the [Composer 2.2 LTS](https://github.com/composer/composer/issues/10340) if you are stuck with an older PHP (#10343) - * BC Break: added native parameter & return types to many internal APIs, we explicitly left the most extended/implemented symbols untouched but if this causes problems nonetheless please report it ASAP (#10547, #10561) - * BC Break: added visibility to all constants, a few internal ones have been made private/protected, if this causes problems please report it ASAP (#10550) - * BC Break: the minimum supported Symfony components version is now 5.4, this only affects you if you are requiring composer/composer directly however, which is generally frowned upon - * Bumped `composer-plugin-api` to `2.3.0` - * Bumped bundled Symfony components from 2.8 to 5.4 🥳 - * Added `declare(strict_types=1)` to all the classes, which for sure could cause regressions in edge cases, please report with stack traces (#10567) - * Added `--patch-only` to the `outdated` command to only show updates to patch versions and ignore new major/minor versions (#10589) - * Added clickable links to various commands for terminals which support it (#10430) - * Added ProcessExecutor ability to receive commands as arrays by (internals/plugin change only) (#10435) - * Added abandoned flag to `show`/`outdated` commands JSON-formatted output (#10485) - * Added config.reference option to `path` repositories to configure the way the reference is generated, and possibly reduce composer.lock conflicts (#10488) - * Added automatic removal of allow-plugins rules when removing a plugin via the `remove` command (#10615) - * Added COMPOSER_IGNORE_PLATFOR_REQ & COMPOSER_IGNORE_PLATFOR_REQS env vars to configure the equivalent flags (#10616) - * Added support for Symfony 6.0 components - * Added support for psr/log 3.x (#10454) - * Fixed symlink creation in linux VM guest filesystems to be recognized by Windows (#10592) - * Performance improvement in pool optimization step (#10585) - -### [2.2.17] 2022-07-13 - - * Fixed plugins from CWD/vendor being loaded in some cases like create-project or validate even though the target directory is outside of CWD (#10935) - * Fixed support for legacy (Composer 1.x, e.g. hirak/prestissimo) plugins which will not warn/error anymore if not in allow-plugins, as they are anyway not loaded (#10928) - * Fixed pre-install check for allowed plugins not taking --no-plugins into account (#10925) - * Fixed support for disable_functions containing disk_free_space (#10936) - * Fixed RootPackageRepository usages to always clone the root package to avoid interoperability issues with plugins (#10940) - -### [2.2.16] 2022-07-05 - - * Fixed non-interactive behavior of allow-plugins to throw instead of continue with a warning to avoid broken installs (#10920) - * Fixed allow-plugins BC mode to ensure old lock files created pre-2.2 can be installed with only a warning but plugins fully loaded (#10920) - * Fixed deprecation notice (#10921) - -### [2.2.15] 2022-07-01 - - * Fixed support for `cache-read-only` where the filesystem is not writable (#10906) - * Fixed type error when using `allow-plugins: true` (#10909) - * Fixed @putenv scripts receiving arguments passed to the command (#10846) - * Fixed support for spaces in paths with binary proxies on Windows (#10836) - * Fixed type error in GitDownloader if branches cannot be listed (#10888) - * Fixed RootPackageInterface issue on PHP 5.3.3 (#10895) - -### [2.2.14] 2022-06-06 - - * Fixed handling of broken symlinks when checking whether a package is still installed (#6708) - * Fixed name validation regex in schema causing issues with JS IDEs like VS Code (#10811) - * Fixed bin proxies to allow a proxy to include another one safely (#10823) - * Fixed gitlab-token JSON schema definition (#10800) - * Fixed openssl 3.x version parsing as it is now semver compliant - * Fixed type error when a json file cannot be read (#10818) - * Fixed parsing of multi-line arrays in funding.yml (#10784) - -### [2.2.13] 2022-05-25 - - * Fixed invalid credentials loop when setting up GitLab token (#10748) - * Fixed PHP 8.2 deprecations (#10766) - * Fixed lock file changes being output even when the lock file creation is disabled - * Fixed race condition when multiple requests asking for auth on the same hostname fired concurrently (#10763) - * Fixed quoting of commas on Windows (#10775) - * Fixed issue installing path repos with a disabled symlink function (#10786) - -### [2.2.12] 2022-04-13 - - * Security: Fixed command injection vulnerability in HgDriver/GitDriver (GHSA-x7cr-6qr6-2hh6 / CVE-2022-24828) - * Fixed curl downloader not retrying when a DNS resolution failure occurs (#10716) - * Fixed composer.lock file still being used/read when the `lock` config option is disabled (#10726) - * Fixed `validate` command checking the lock file even if the `lock` option is disabled (#10723) - -### [2.2.11] 2022-04-01 - - * Added missing config.bitbucket-oauth in composer-schema.json - * Added --2.2 flag to `self-update` to pin the Composer version to the 2.2 LTS range (#10682) - * Updated semver, jsonlint deps for minor fixes - * Fixed generation of autoload crashing if a package has a broken path (#10688) - * Removed dev-master=>dev-main alias from #10372 as it does not work when reloading from lock file and extracting dev deps (#10651) - -### [2.2.10] 2022-03-29 - - * Fixed Bitbucket authorization detection due to API changes (#10657) - * Fixed validate command warning about dist/source keys if defined (#10655) - * Fixed deletion/handling of corrupted 0-bytes zip archives (#10666) - -### [2.2.9] 2022-03-15 - - * Fixed regression with plugins that modify install path of packages, [see docs](https://getcomposer.org/doc/articles/plugins.md#plugin-modifies-install-path) if you are authoring such a plugin (#10621) - -### [2.2.8] 2022-03-15 - - * Fixed `files` autoloading sort order to be fully deterministic (#10617) - * Fixed pool optimization pass edge cases (#10579) - * Fixed `require` command failing when `self.version` is used as constraint (#10593) - * Fixed --no-ansi / undecorated output still showing color in repo warnings (#10601) - * Performance improvement in pool optimization step (composer/semver#131) - -### [2.2.7] 2022-02-25 - - * Allow installation together with composer/xdebug-handler ^3 (#10528) - * Fixed support for packages with no licenses in `licenses` command output (#10537) - * Fixed handling of `allow-plugins: false` which kept warning (#10530) - * Fixed enum parsing in classmap generation when the enum keyword is not lowercased (#10521) - * Fixed author parsing in `init` command requiring an email whereas the schema allows a name only (#10538) - * Fixed issues in `require` command when requiring packages which do not exist (but are provided by something else you require) (#10541) - * Performance improvement in pool optimization step (#10546) - -### [2.2.6] 2022-02-04 - - * BC Break: due to an oversight, the `COMPOSER_BIN_DIR` env var for binaries added in Composer 2.2.2 had to be renamed to `COMPOSER_RUNTIME_BIN_DIR` (#10512) - * Fixed enum parsing in classmap generation with syntax like `enum foo:string` without space after `:` (#10498) - * Fixed package search not urlencoding the input (#10500) - * Fixed `reinstall` command not firing `pre-install-cmd`/`post-install-cmd` events (#10514) - * Fixed edge case in path repositories where a symlink: true option would be ignored on old Windows and old PHP combos (#10482) - * Fixed test suite compatibility with latest symfony/console releases (#10499) - * Fixed some error reporting edge cases (#10484, #10451, #10493) - -### [2.2.5] 2022-01-21 - - * Disabled `composer/package-versions-deprecated` by default as it can function using `Composer\InstalledVersions` at runtime (#10458) - * Fixed artifact repositories crashing if a phar file was present in the directory (#10406) - * Fixed binary proxy issue on PHP <8 when fseek is used on the proxied binary path (#10468) - * Fixed handling of non-string versions in package repositories metadata (#10470) - -### [2.2.4] 2022-01-08 - - * Fixed handling of process timeout when running async processes during installation - * Fixed GitLab API handling when projects have a repository disabled (#10440) - * Fixed reading of environment variables (e.g. APPDATA) containing unicode characters to workaround a PHP bug on Windows (#10434) - * Fixed partial update issues with path repos missing if a path repo is required by a path repo (#10431) - * Fixed support for sourcing binaries via the new bin proxies ([#10389](https://github.com/composer/composer/issues/10389#issuecomment-1007372740)) - * Fixed messaging when GitHub tokens need SSO authorization (#10432) - -### [2.2.3] 2021-12-31 - - * Fixed issue with PHPUnit and process isolation now including PHPUnit <6.5 (#10387) - * Fixed interoperability issue with laminas/laminas-zendframework-bridge and Composer 2.2 (#10401) - * Fixed binary proxies for shell scripts to work correctly when they are symlinked (jakzal/phpqa#336) - * Fixed overly greedy pool optimization in cases where a locked package is not required by anything anymore in a partial update (#10405) - -### [2.2.2] 2021-12-29 - - * Added [`COMPOSER_BIN_DIR` env var and `_composer_bin_dir` global](https://getcomposer.org/doc/articles/vendor-binaries.md#finding-the-composer-bin-dir-from-a-binary) containing the path to the bin-dir for binaries. Packages relying on finding the bin dir with `$BASH_SOURCES[0]` will need to update their binaries (#10402) - * Fixed issue when new binary proxies are combined with PHPUnit and process isolation (#10387) - * Fixed deprecation warnings when using Symfony 5.4+ and requiring composer/composer itself (#10404) - * Fixed UX of plugin warnings (#10381) - -### [2.2.1] 2021-12-22 - - * Fixed plugin autoloading including files autoload rules from the root package (#10382) - * Fixed issue parsing php files with unterminated comments found inside backticks (#10385) - -### [2.2.0] 2021-12-22 - - * Added support for using `dev-main` as the default path repo package version if no VCS info is available (#10372) - * Added --no-scripts as a globally supported flag to all Composer commands to disable scripts execution (#10371) - * Fixed self-update failing in some edge cases due to loading plugins (#10371) - * Fixed display of conflicts showing the wrong package name in some conditions (#10355) - -### [2.2.0-RC1] 2021-12-08 - - * Bumped `composer-runtime-api` and `composer-plugin-api` to `2.2.0` - * UX Change: Added [`allow-plugins`](https://getcomposer.org/doc/06-config.md#allow-plugins) config value to enhance security against runtime execution, this will prompt you the first time you use a plugin and may hang pipelines if they aren't using --no-interaction (-n) as they should (#10314) - * Added an optimization pass to reduce the amount of redundant inspected during resolution, drastically improving memory and CPU usage (#9261, #9620) - * Added a [global $_composer_autoload_path variable](https://getcomposer.org/doc/articles/vendor-binaries.md#finding-the-composer-autoloader-from-a-binary) containing the path to autoload.php for binaries (#10137) - * Added wildcard support to --ignore-platform-req (e.g. `ext-*`) (#10083) - * Added support for ignoring the upper bound of platform requirements using "name+" notation e.g. using `--ignore-platform-req=php+` would allow installing a package requiring `php: 8.0.*` on PHP 8.1, but not on PHP 7.4. Useful for CI builds of upcoming PHP versions (#10318) - * Added support for setting platform packages to false in config.platform to disable/hide them (#10308) - * Added [`use-parent-dir`](https://getcomposer.org/doc/06-config.md#use-parent-dir) option to configure the prompt for using composer.json in upper directory when none is present in current dir (#10307) - * Added [`composer` platform package](https://getcomposer.org/doc/articles/composer-platform-dependencies.md) which is always the exact version of Composer running unlike `composer-*-api` packages (#10313) - * Added a --source flag to `config` command to show where config values are loaded from (#10129) - * Added support for `files` autoloaders in the runtime scripts/plugins contexts (#10065) - * Added retry behavior on certain http status and curl error codes (#10162) - * Added abandoned flag display in search command output - * Added support for --ignore-platform-reqs in `outdated` command (#10293) - * Added --only-vendor (-O) flag to `search` command to search (and return) vendor names (#10336) - * Added COMPOSER_NO_DEV environment variable to set the --no-dev flag (#10262) - * Fixed `archive` command to behave more like git archive, gitignore/hgignore are not taken into account anymore, and gitattributes support was improved (#10309) - * Fixed unlocking of replacers when a replaced package is unlocked (#10280) - * Fixed auto-unlocked path repo packages also unlocking their transitive deps when -w/-W is used (#10157) - * Fixed handling of recursive package links (e.g. requiring or replacing oneself) - * Fixed env var reads to check $_SERVER and $_ENV before getenv for broader ecosystem compatibility (#10218) - * Fixed `archive` command to produce archives with files sorted by name (#10274) - * Fixed VcsRepository issues where server failure could cause missing tags/branches (#10319) - * Fixed some error reporting issues (#10283, #10339) - -### [2.1.14] 2021-11-30 - - * Fixed invalid release build - -### [2.1.13] 2021-11-30 - - * Removed `symfony/console ^6` support as we cannot be compatible until Composer 2.3.0 is released. If you have issues with Composer required as a dependency + Symfony make sure you stay on Symfony 5.4 for now. (#10321) - -### [2.1.12] 2021-11-09 - - * Fixed issues in proxied binary files relying on __FILE__ / __DIR__ on php <8 (#10261) - * Fixed 9999999-dev being shown in some cases by the `show` command (#10260) - * Fixed GitHub Actions output escaping regression on PHP 8.1 (#10250) - -### [2.1.11] 2021-11-02 - - * Fixed issues in proxied binary files when using declare() on php <8 (#10249) - * Fixed GitHub Actions output escaping issues (#10243) - -### [2.1.10] 2021-10-29 - - * Added type annotations to all classes, which may have an effect on CI/static analysis for people using Composer as a dependency (#10159) - * Fixed CurlDownloader requesting gzip encoding even when no gzip support is present (#10153) - * Fixed regression in 2.1.6 where the help command was not working for plugin commands (#10147) - * Fixed warning showing when an invalid cache dir is configured but unused (#10125) - * Fixed `require` command reverting changes even though dependency resolution succeeded when something fails in scripts for example (#10118) - * Fixed `require` not finding the right package version when some newly required extension is missing from the system (#10167) - * Fixed proxied binary file issues, now using output buffering (e1dbd65aff) - * Fixed and improved error reporting in several edge cases (#9804, #10136, #10163, #10224, #10209) - * Fixed some more Windows CLI parameter escaping edge cases - -### [2.1.9] 2021-10-05 - - * Security: Fixed command injection vulnerability on Windows (GHSA-frqg-7g38-6gcf / CVE-2021-41116) - * Fixed classmap parsing with a new class parser which does not rely on regexes anymore (#10107) - * Fixed inline git credentials showing up in output in some conditions (#10115) - * Fixed support for running updates while offline as long as the cache contains enough information (#10116) - * Fixed `show --all foo/bar` which as of 2.0.0 was not showing all versions anymore but only the installed one (#10095) - * Fixed VCS repos ignoring some versions silently when the API rate limit is reached (#10132) - * Fixed CA bundle to remove the expired Let's Encrypt root CA - -### [2.1.8] 2021-09-15 - - * Fixed regression in 2.1.7 when parsing classmaps in files containing invalid Unicode (#10102) - -### [2.1.7] 2021-09-14 - - * Added many type annotations internally, which may have an effect on CI/static analysis for people using Composer as a dependency. This work will continue in following releases - * Fixed regression in 2.1.6 when parsing classmaps with empty heredocs (#10067) - * Fixed regression in 2.1.6 where list command was not showing plugin commands (#10075) - * Fixed issue handling package updates where the package type changed (#10076) - * Fixed docker being detected as WSL when run inside WSL (#10094) - -### [2.1.6] 2021-08-19 - - * Updated internal PHAR signatures to be SHA512 instead of SHA1 - * Fixed uncaught exception handler regression (#10022) - * Fixed more PHP 8.1 deprecation warnings (#10036, #10038, #10061) - * Fixed corrupted zips in the cache from blocking installs until a cache clear, the bad archives are now deleted automatically on first failure (#10028) - * Fixed URL sanitizer handling of new github tokens (#10048) - * Fixed issue finding classes with very long heredocs in classmap autoload (#10050) - * Fixed proc_open being required for simple installs from zip, as well as diagnose (#9253) - * Fixed path repository bug causing symlinks to be left behind after a package is uninstalled (#10023) - * Fixed issue in 7-zip support on windows with certain archives (#10058) - * Fixed bootstrapping process to avoid loading the composer.json and plugins until necessary, speeding things up slightly (#10064) - * Fixed lib-openssl detection on FreeBSD (#10046) - * Fixed support for `ircs://` protocol for support.irc composer.json entries - -### [2.1.5] 2021-07-23 - - * Fixed `create-project` creating a `php:` directory in the directory it was executed in (#10020, #10021) - * Fixed curl downloader to respect default_socket_timeout if it is bigger than our default 300s (#10018) - -### [2.1.4] 2021-07-22 - - * Fixed PHP 8.1 deprecation warnings (#10008) - * Fixed support for working within UNC/WSL paths on Windows (#9993) - * Fixed 7-zip support to also be looked up on Linux/macOS as 7z or 7zz (#9951) - * Fixed repositories' `only`/`exclude` properties to avoid matching names as sub-strings of full package names (#10001) - * Fixed open_basedir regression from #9855 - * Fixed schema errors being reported incorrectly in some conditions (#9986) - * Fixed `archive` command not working with async archive extraction - * Fixed `init` command being able to generate an invalid composer.json (#9986) - -### [2.1.3] 2021-06-09 - - * Add "symlink" option for "bin-compat" config to force symlinking even on WSL/Windows (#9959) - * Fixed source binaries not being made executable when symlinks cannot be used (#9961) - * Fixed more deletion edge cases (#9955, #9956) - * Fixed `dump-autoload` command not dispatching scripts anymore, regressed in 2.1.2 (#9954) - -### [2.1.2] 2021-06-07 - - * Added `--dev` to `dump-autoload` command to allow force-dumping dev autoload rules even if dev requirements are not present (#9946) - * Fixed `--no-scripts` disabling events for plugins too instead of only disabling script handlers, using `--no-plugins` is the way to disable plugins (#9942) - * Fixed handling of deletions during package installs on some filesystems (#9945, #9947) - * Fixed undefined array access when using "@php " in a script handler (#9943) - * Fixed usage of InstalledVersions when loaded from composer/composer installed as a dependency and runtime Composer is v1 (#9937) - -### [2.1.1] 2021-06-04 - - * Fixed regression in autoload generation when --no-scripts is used (#9935) - * Fixed `outdated` color legend to have the right color in the right place (#9939) - * Fixed PCRE bug causing a previously valid pattern to fail to match (#9941) - * Fixed JsonFile::validateSchema regression when used as a library to validate custom schema files (#9938) - -### [2.1.0] 2021-06-03 - - * Fixed PHP 8.1 deprecation warning (#9932) - * Fixed env var handling when variables_order includes E and symfony/console 3.3.15+ is in use (#9930) - -### [2.1.0-RC1] 2021-06-02 - - * Bumped `composer-runtime-api` and `composer-plugin-api` to `2.1.0` - * UX Change: The default install method for packages is now always dist/zip, even for dev packages, added `--prefer-install=auto` if you want the old behavior (#9603) - * UX Change: Packages from `path` repositories which are symlinked in the vendor dir will always be updated in partial updates to avoid mistakes when the original composer.json changes but the symlinked package is not explicitly updated (#9765) - * Added `reinstall` command that takes one or more package names, including wildcard (`*`) support, and removes then reinstalls them in the exact same version they had (#9915) - * Added support for parallel package installs on Windows via [7-Zip](https://www.7-zip.org/) if it is installed (#9875) - * Added detection of invalid composer.lock files that do not fullfil the composer.json requirements to `validate` command (#9899) - * Added `InstalledVersions::getInstalledPackagesByType(string $type)` to retrieve installed plugins for example, [read more](https://getcomposer.org/doc/07-runtime.md#knowing-which-packages-of-a-given-type-are-installed) (#9699) - * Added `InstalledVersions::getInstalledPath(string $packageName)` to retrieve the install path of a given package, [read more](https://getcomposer.org/doc/07-runtime.md#knowing-the-path-in-which-a-package-is-installed) (#9699) - * Added flag to `InstalledVersions::isInstalled()` to allow excluding dev requirements from that check (#9682) - * Added support for PHP 8.1 enums in autoloader / classmap generation (#9670) - * Added support for using `@php binary-name foo` in scripts to refer to a binary without using its full path, but forcing to use the same PHP version as Composer used (#9726) - * Added `--format=json` support to the `fund` command (#9678) - * Added `--format=json` support to the `search` command (#9747) - * Added `COMPOSER_DEV_MODE` env var definition within the run-script command for compatibility (#9793) - * Added async uninstall of packages (#9618) - * Added color legend to `outdated` and `show --latest` commands (#9716) - * Added `secure-svn-domains` config option to mark secure svn:// hostnames and suppress warnings without disabling secure-http (#9872) - * Added `gitlab-protocol` config option to allow forcing `git` or `http` URLs for all gitlab repos loaded inline, instead of the default of git for private and http for public (#9401) - * Added generation of autoload rules in `init` command (#9829) - * Added source/dist validation in `validate` command - * Added automatic detection of WSL when generating binaries and use `bin-compat:full` implicitly (#9855) - * Added automatic detection of the --no-dev state for `dump-autoload` based on the last install run (#9714) - * Added warning/prompt to `require` command if requiring a package that already exists in require-dev or vice versa (#9542) - * Added information about package conflicts in the `why`/`why-not` commands (#9693) - * Removed version argument from `why` command as it was not needed (#9729) - * Fixed `why-not` command to always require a specific version as it is useless without (#9729) - * Fixed cache dir on macOS to follow OS guidelines, it is now in ~/Library/Caches/composer (#9898) - * Fixed composer.json JSON schema to avoid having name/description required by default (#9912) - * Fixed support for running inside WSL paths from a Windows PHP/Composer (#9861) - * Fixed InstalledVersions to include the original doc blocks when installed from a Composer phar file - * Fixed `require` command to use `*` as constraint for extensions bundled with PHP instead of duplicating the PHP constraint (#9483) - * Fixed `search` output to be aligned and avoid wrapped long lines to be more readable (#9455) - * Error output improvements for many cases (#9876, #9837, #9928, and some smaller improvements) - -### [2.0.14] 2021-05-21 - - * Updated composer/xdebug-handler to 2.0 which adds supports for Xdebug 3 - * Fixed handling of inline-update-constraints with references or stability flags (#9847) - * Fixed async processes erroring in an unclear way when they failed to start (#9808) - * Fixed support for the upcoming Symfony 6.0 release when Composer is installed as a library (#9896) - * Fixed progress output missing newlines on PowerShell, and disable progress output by default when CI env var is present (#9621) - * Fixed support for Vagrant/VirtualBox filesystem slowness when installing binaries from packages (#9627) - * Fixed type annotations for the InstalledVersions class - * Deprecated InstalledVersions::getRawData in favor of InstalledVersions::getAllRawData (#9816) - -### [2.0.13] 2021-04-27 - - * Security: Fixed command injection vulnerability in HgDriver/HgDownloader and hardened other VCS drivers and downloaders (GHSA-h5h8-pc6h-jvvx / CVE-2021-29472) - * Fixed install step at the end of the init command to take new dependencies into account correctly - * Fixed `update --lock` listing updates which were not really happening (#9812) - * Fixed support for --no-dev combined with --locked in outdated and show commands (#9788) - -### [2.0.12] 2021-04-01 - - * Fixed support for new GitHub OAuth token format (#9757) - * Fixed support for Vagrant/VirtualBox filesystem slowness by adding short sleeps in some places (#9627) - * Fixed unclear error reporting when a package is in the lock file but not in the remote repositories (#9750) - * Fixed processes silently ignoring the CWD when it does not exist - * Fixed new Windows bin handling to avoid proxying phar files (#9742) - * Fixed issue extracting archives into paths that already exist, fixing problems with some custom installers (composer/installers#479) - * Fixed support for branch names starting with master/trunk/default (#9739) - * Fixed self-update to preserve phar file permissions on Windows (#9733) - * Fixed detection of hg version when localized (#9753) - * Fixed git execution failures to also include the stdout output (#9720) - -### [2.0.11] 2021-02-24 - - * Reverted "Fixed runtime autoloader registration (for plugins and script handlers) to prefer the project dependencies over the bundled Composer ones" as it caused more problems than expected - -### [2.0.10] 2021-02-23 - - * Added COMPOSER_MAX_PARALLEL_HTTP to let people set a lower amount of parallel requests if needed - * Fixed autoloader registration when plugins are loaded, which may impact plugins relying on this bug (if you use `symfony/flex` make sure you upgrade it to 1.12.2+ to fix `dump-env` issues) - * Fixed `exec` command suppressing output in some circumstances - * Fixed Windows/cmd.exe support for script handlers defined as `path/to/foo`, which are now rewritten internally to `path\to\foo` when needed - * Fixed bin handling on Windows for PHP scripts, to more closely match symlinks and allow `@php vendor/bin/foo` to work cross-platform - * Fixed Git for Windows/Git Bash not being detected correctly as an interactive shell (regression since 2.0.7) - * Fixed regression handling some private Bitbucket repository clones - * Fixed Ctrl-C/SIGINT handling during downloads to correctly abort as soon as possible - * Fixed runtime autoloader registration (for plugins and script handlers) to prefer the project dependencies over the bundled Composer ones - * Fixed numeric default branches being aliased as 9999999-dev internally. This alias now only applies to default branches being non-numeric (e.g. `dev-main`) - * Fixed support for older lib-sodium versions - * Fixed various minor issues - -### [2.0.9] 2021-01-27 - - * Added warning if the curl extension is not enabled as it significantly degrades performance - * Fixed InstalledVersions to report all packages when several vendor dirs are present in the same runtime - * Fixed download speed when downloading large files - * Fixed `archive` and path repo copies mishandling some .gitignore paths - * Fixed root package classes not being available to the plugins/scripts during the initial install - * Fixed cache writes to be atomic and better support multiple Composer processes running in parallel - * Fixed preg jit issues when `config` or `require` modifies large composer.json files - * Fixed compatibility with envs having open_basedir restrictions - * Fixed exclude-from-classmap causing regex issues when having too many paths - * Fixed compatibility issue with Symfony 4/5 - * Several small performance and debug output improvements - -### [2.0.8] 2020-12-03 - - * Fixed packages with aliases not matching conflicts which match the alias - * Fixed invalid reports of uncommitted changes when using non-default remotes in vendor dir - * Fixed curl error handling edge cases - * Fixed cached git repositories becoming stale by having a `git gc` applied to them periodically - * Fixed issue initializing plugins when using dev packages - * Fixed update --lock / mirrors failing to update in some edge cases - * Fixed partial update with --with-dependencies failing in some edge cases with some nonsensical error - -### [2.0.7] 2020-11-13 - - * Fixed detection of TTY mode, made input non-interactive automatically if STDIN is not a TTY - * Fixed root aliases not being present in lock file if not required by anything else - * Fixed `remove` command requiring a lock file to be present - * Fixed `Composer\InstalledVersions` to always contain up to date data during installation - * Fixed `status` command breaking on slow networks - * Fixed order of POST_PACKAGE_* events to occur together once all installations of a package batch are done - -### [2.0.6] 2020-11-07 - - * Fixed regression in 2.0.5 dealing with custom installers which do not pass absolute paths - -### [2.0.5] 2020-11-06 - - * Disabled platform-check verification of extensions by default (now defaulting `php-only`), set platform-check to `true` if you want a complete check - * Improved platform-check handling of issue reporting - * Fixed platform-check to only check non-dev requires even if require-dev dependencies are installed - * Fixed issues dealing with custom installers which return trailing slashes in getInstallPath (ideally avoid doing this as there might be other issues left) - * Fixed issues when curl functions are disabled - * Fixed gitlab-domains/github-domains to make sure if they are overridden the default value remains present - * Fixed issues removing/upgrading packages from path repositories on Windows - * Fixed regression in 2.0.4 when handling of git@bitbucket.org URLs in vcs repositories - * Fixed issue running create-project in current directory on Windows - -### [2.0.4] 2020-10-30 - - * Fixed `check-platform-req` command not being clear on what packages are checked, and added a --lock flag to explicitly check the locked packages - * Fixed `config` & `create-project` adding of repositories to make sure they are prepended as order is much more important in Composer 2, also added a --append flag to `config` to restore the old behavior in the unlikely case this is needed - * Fixed curl downloader failing on old PHP releases or when using self-signed SSL certificates - * Fixed Bitbucket API authentication issue - -### [2.0.3] 2020-10-28 - - * Fixed bug in `outdated` command where dev packages with branch-aliases where always shown as being outdated - * Fixed issue in lock file interoperability with composer 1.x when using `dev-master as xxx` aliases - * Fixed new `--locked` option being missing from `outdated` command, for checking outdated packages directly from the lock file - * Fixed a few debug/error reporting strings - -### [2.0.2] 2020-10-25 - - * Fixed regression handling `composer show -s` in projects where no version can be guessed from VCS - * Fixed regression handling partial updates/`require` when a lock file was missing - * Fixed interop issue with plugins that need to update dist URLs of packages, [see docs](https://getcomposer.org/doc/articles/plugins.md#plugin-modifies-downloads) if you need this - -### [2.0.1] 2020-10-24 - - * Fixed crash on PHP 8 - -### [2.0.0] 2020-10-24 - - * Fixed proxy handling issues when combined with our new curl-based downloader - * Fixed solver bug resulting in endless loops in some cases - * Fixed solver output being extremely long due to learnt rules - * Fixed solver bug with multi literals - * Fixed a couple minor regressions - -### [2.0.0-RC2] 2020-10-14 - - * Breaking: Removed `OperationInterface::getReason` as the data was not accurate - * Added automatic removal of packages which are not required anymore whenever an update is done, this will purge packages previously left over by partial updates and `require`/`remove` - * Added shorthand aliases `-w` for `--with-dependencies` and `-W` for `--with-all-dependencies` on `update`/`require`/`remove` commands - * Added `COMPOSER_DEBUG_EVENTS=1` env var support for plugin authors to figure out which events are triggered when - * Added `setCustomCacheKey` to `PreFileDownloadEvent` and fixed a cache bug for integrations changing the processed url of package archives - * Added `Composer\Util\SyncHelper` for plugin authors to deal with async Promises more easily - * Added `$composer->getLoop()->getHttpDownloader()` to get access to the main HttpDownloader instance in plugins - * Added a non-zero exit code (2) and warning to `remove` command when a package to be removed could not be removed - * Added `--apcu-autoloader-prefix` (or `--apcu-prefix` for `dump-autoload` command) flag to let people use apcu autoloading in a deterministic output way if that is needed - * Fixed version guesser to look at remote branches as well as local ones - * Lots of minor bug fixes and improvements - -### [2.0.0-RC1] 2020-09-10 - - * Added more advanced filtering to avoid loading all versions of all referenced packages when resolving dependencies, which should reduce memory usage further in some cases - * Added support for many new `lib-*` packages in the platform repository and improved version detection for some `ext-*` and `lib-*` packages - * Added an `--ask` flag to `create-project` command to make Composer prompt for the install dir name, [useful for project install instructions](https://github.com/composer/composer/pull/9181) - * Added support for tar in artifact repositories - * Added a `cache-read-only` config option to make the cache usable in read only mode for containers and such - * Added better error reporting for a few more specific cases - * Added a new optional `available-package-patterns` attribute for v2-format Composer repositories, see [UPGRADE](UPGRADE-2.0.md) for details - * Fixed more PHP 8 compatibility issues - * Lots of minor bug fixes for regressions - -### [2.0.0-alpha3] 2020-08-03 - - * Breaking: Zip archives loaded by artifact repositories must now have a composer.json on top level, or a max of one folder on top level of the archive - * Added --no-dev support to `show` and `outdated` commands to skip dev requirements - * Added support for multiple --repository flags being passed into the `create-project` command, only useful in combination with `--add-repository` to persist them to composer.json - * Added a new optional `list` API endpoint for v2-format Composer repositories, see [UPGRADE](UPGRADE-2.0.md) for details - * Fixed `show -a` command not listing anything - * Fixed solver bug where it ended in a "Reached invalid decision id 0" - * Fixed updates of git-installed packages on windows - * Lots of minor bug fixes - -### [2.0.0-alpha2] 2020-06-24 - - * Added parallel installation of packages (requires OSX/Linux/WSL, and that `unzip` is present in PATH) - * Added optimization of constraints by compiling them to PHP code, which should reduce CPU time of updates - * Added handling of Ctrl-C on Windows for PHP 7.4+ - * Added better support for default branch names other than `master` - * Added --format=summary flag to `license` command - * Fixed issue in platform check when requiring ext-zend-opcache - * Fixed inline aliases issues - * Fixed git integration issue when signatures are set to be shown by default - -### [2.0.0-alpha1] 2020-06-03 - - * Breaking: This is a major release and while we tried to keep things compatible for most users, you might want to have a look at the [UPGRADE](UPGRADE-2.0.md) guides - * Many CPU and memory performance improvements - * The update command is now much more deterministic as it does not take the already installed packages into account - * Package installation now performs all network operations first before doing any changes on disk, to reduce the chances of ending up with a partially updated vendor dir - * Partial updates and require/remove are now much faster as they only load the metadata required for the updated packages - * Added a [platform-check step](doc/07-runtime.md#platform-check) when vendor/autoload.php gets initialized which checks the current PHP version/extensions match what is expected and fails hard otherwise. Can be disabled with the platform-check config option - * Added a [`Composer\InstalledVersions`](doc/07-runtime.md#installed-versions) class which is autoloaded in every project and lets you check which packages/versions are present at runtime - * Added a `composer-runtime-api` virtual package which you can require (as e.g. `^2.0`) to ensure things like the InstalledVersions class above are present. It will effectively force people to use Composer 2.x to install your project - * Added support for parallel downloads of package metadata and zip files, this requires that the curl extension is present and we thus strongly recommend enabling curl - * Added much clearer dependency resolution error reporting for common error cases - * Added support for updating to a specific version with partial updates, as well as a [--with flag](doc/03-cli.md#update--u) to pass in temporary constraint overrides - * Added support for TTY mode on Linux/OSX/WSL so that script handlers now run in interactive mode - * Added `only`, `exclude` and `canonical` options to all repositories, see [repository priorities](https://getcomposer.org/repoprio) for details - * Added support for lib-zip platform package - * Added `pre-operations-exec` event to be fired before the packages get installed/upgraded/removed - * Added `pre-pool-create` event to be fired before the package pool for the dependency solver is created, which lets you modify the list of packages going in - * Added `post-file-download` event to be fired after package dist files are downloaded, which lets you do additional checks on the files - * Added --locked flag to `show` command to see the packages from the composer.lock file - * Added --unused flag to `remove` command to make sure any packages which are not needed anymore get removed - * Added --dry-run flag to `require` and `remove` commands - * Added --no-install flag to `update`, `require` and `remove` commands to disable the install step and only do the update step (composer.lock file update) - * Added --with-dependencies and --with-all-dependencies flag aliases to `require` and `remove` commands for consistency with `update` - * Added more info to `vendor/composer/installed.json`, a dev key stores whether dev requirements were installed, and every package now has an install-path key with its install location - * Added COMPOSER_DISABLE_NETWORK which if set makes Composer do its best to run offline. This can be useful when you have poor connectivity or to do benchmarking without network jitter - * Added --json and --merge flags to `config` command to allow editing complex `extra.*` values by using json as input - * Added confirmation prompt when running Composer as superuser in interactive mode - * Added --no-check-version to `validate` command to remove the warning in case the version is defined - * Added --ignore-platform-req (without s) to all commands supporting --ignore-platform-reqs, which accepts a package name so you can ignore only specific platform requirements - * Added support for wildcards (`*`) in classmap autoloader paths - * Added support for configuring GitLab deploy tokens in addition to private tokens, see [gitlab-token](doc/06-config.md#gitlab-token) - * Added support for package version guessing for require and init command to take all platform packages into account, not just php version - * Fixed package ordering when autoloading and especially when loading plugins, to make sure dependencies are loaded before their dependents - * Fixed suggest output being very spammy, it now is only one line long and shows more rarely - * Fixed conflict rules like e.g. >=5 from matching dev-master, as it is not normalized to 9999999-dev internally anymore - -### [1.10.23] 2021-10-05 - - * Security: Fixed command injection vulnerability on Windows (GHSA-frqg-7g38-6gcf / CVE-2021-41116) - -### [1.10.22] 2021-04-27 - - * Security: Fixed command injection vulnerability in HgDriver/HgDownloader and hardened other VCS drivers and downloaders (GHSA-h5h8-pc6h-jvvx / CVE-2021-29472) - -### [1.10.21] 2021-04-01 - - * Fixed support for new GitHub OAuth token format - * Fixed processes silently ignoring the CWD when it does not exist - -### [1.10.20] 2021-01-27 - - * Fixed exclude-from-classmap causing regex issues when having too many paths - * Fixed compatibility issue with Symfony 4/5 - -### [1.10.19] 2020-12-04 - - * Fixed regression on PHP 8.0 - -### [1.10.18] 2020-12-03 - - * Allow installation on PHP 8.0 - -### [1.10.17] 2020-10-30 - - * Fixed Bitbucket API authentication issue - * Fixed parsing of Composer 2 lock files breaking in some rare conditions - -### [1.10.16] 2020-10-24 - - * Added warning to `validate` command for cases where packages provide/replace a package that they also require - * Fixed JSON schema validation issue with PHPStorm - * Fixed symlink handling in `archive` command - -### [1.10.15] 2020-10-13 - - * Fixed path repo version guessing issue - -### [1.10.14] 2020-10-13 - - * Fixed version guesser to look at remote branches as well as local ones - * Fixed path repositories version guessing to handle edge cases where version is different from the VCS-guessed version - * Fixed COMPOSER env var causing issues when combined with the `global ` command - * Fixed a few issues dealing with PHP without openssl extension (not recommended at all but sometimes needed for testing) - -### [1.10.13] 2020-09-09 - - * Fixed regressions with old version validation - * Fixed invalid root aliases not being reported - -### [1.10.12] 2020-09-08 - - * Fixed regressions with old version validation - -### [1.10.11] 2020-09-08 - - * Fixed more PHP 8 compatibility issues - * Fixed regression in handling of CTRL-C when xdebug is loaded - * Fixed `status` handling of broken symlinks - -### [1.10.10] 2020-08-03 - - * Fixed `create-project` not triggering events while installing the root package - * Fixed PHP 8 compatibility issue - * Fixed `self-update` to avoid automatically upgrading to the next major version once it becomes stable - -### [1.10.9] 2020-07-16 - - * Fixed Bitbucket redirect loop when credentials are outdated - * Fixed GitLab auth prompt wording - * Fixed `self-update` handling of files requiring admin permissions to write to on Windows (it now does a UAC prompt) - * Fixed parsing issues in funding.yml files - -### [1.10.8] 2020-06-24 - - * Fixed compatibility issue with git being configured to show signatures by default - * Fixed discarding of local changes when updating packages to include untracked files - * Several minor fixes - -### [1.10.7] 2020-06-03 - - * Fixed PHP 8 deprecations - * Fixed detection of pcntl_signal being in disabled_functions when pcntl_async_signal is allowed - -### [1.10.6] 2020-05-06 - - * Fixed version guessing to take composer-runtime-api and composer-plugin-api requirements into account to avoid selecting packages which require Composer 2 - * Fixed package name validation to allow several dashes following each other - * Fixed post-status-cmd script not firing when there were no changes to be displayed - * Fixed composer-runtime-api support on Composer 1.x, the package is now present as 1.0.0 - * Fixed support for composer show --name-only --self - * Fixed detection of GitLab URLs when handling authentication in some cases - -### [1.10.5] 2020-04-10 - - * Fixed self-update on PHP <5.6, seriously please upgrade people, it's time - * Fixed 1.10.2 regression with PATH resolution in scripts - -### [1.10.4] 2020-04-09 - - * Fixed 1.10.2 regression in path symlinking with absolute path repos - -### [1.10.3] 2020-04-09 - - * Fixed invalid --2 flag warning in `self-update` when no channel is requested - -### [1.10.2] 2020-04-09 - - * Added --1 flag to `self-update` command which can be added to automated self-update runs to make sure it won't automatically jump to 2.0 once that is released - * Fixed path repository symlinks being made relative when the repo url is defined as absolute paths - * Fixed potential issues when using "composer ..." in scripts and composer/composer was also required in the project - * Fixed 1.10.0 regression when downloading GitHub archives from non-API URLs - * Fixed handling of malformed info in fund command - * Fixed Symfony5 compatibility issues in a few commands - -### [1.10.1] 2020-03-13 - - * Fixed path repository warning on empty path when using wildcards - * Fixed superfluous warnings when generating optimized autoloaders - -### [1.10.0] 2020-03-10 - - * Added `bearer` auth config to authenticate using `Authorization: Bearer ` headers - * Added `plugin-api-version` in composer.lock so third-party tools can know which Composer version was used to generate a lock file - * Fixed composer fund command and funding info parsing to be more useful - * Fixed issue where --no-dev autoload generation was excluding some packages which should not have been excluded - * Fixed 1.10-RC regression in create project's handling of absolute paths - -### [1.10.0-RC] 2020-02-14 - - * Breaking: `composer global exec ...` now executes the process in the current working directory instead of executing it in the global directory. - * Warning: Added a warning when class names are being loaded by a PSR-4 or PSR-0 rule only due to classmap optimization, but would not otherwise be autoloadable. Composer 2.0 will stop autoloading these classes so make sure you fix your autoload configs. - * Added new funding key to composer.json to describe ways your package's maintenance can be funded. This reads info from GitHub's FUNDING.yml by default so better configure it there so it shows on GitHub and Composer/Packagist - * Added `composer fund` command to show funding info of your dependencies - * Added support for --format=json output for show command when showing a single package - * Added support for configuring suggestions using config command, e.g. `composer config suggest.foo/bar some text` - * Added support for configuring fine-grained preferred-install using config command, e.g. `composer config preferred-install.foo/* dist` - * Added `@putenv` script handler to set environment variables from composer.json for following scripts - * Added `lock` option that can be set to false, in which case no composer.lock file will be generated - * Added --add-repository flag to create-project command which will persist the repo given in --repository into the composer.json of the package being installed - * Added support for IPv6 addresses in NO_PROXY - * Added package homepage display in the show command - * Added debug info about HTTP authentications - * Added Symfony 5 compatibility - * Added --fixed flag to require command to make it use a fixed constraint instead of a ^x.y constraint when adding the requirement - * Fixed exclude-from-classmap matching subsets of directories e.g. foo/ was excluding foobar/ - * Fixed archive command to persist file permissions inside the zip files - * Fixed init/require command to avoid suggesting packages which are already selected in the search results - * Fixed create-project UX issues - * Fixed filemtime for `vendor/composer/*` files is now only changing when the files actually change - * Fixed issues detecting docker environment with an active open_basedir - -### [1.9.3] 2020-02-04 - - * Fixed GitHub deprecation of access_token query parameter, now using Authorization header - -### [1.9.2] 2020-01-14 - - * Fixed minor git driver bugs - * Fixed schema validation for version field to allow `dev-*` versions too - * Fixed external processes' output being formatted even though it should not - * Fixed issue with path repositories when trying to install feature branches - -### [1.9.1] 2019-11-01 - - * Fixed various credential handling issues with gitlab and github - * Fixed credentials being present in git remotes in Composer cache and vendor directory when not using SSH keys - * Fixed `composer why` not listing replacers as a reason something is present - * Fixed various PHP 7.4 compatibility issues - * Fixed root warnings always present in Docker containers, setting COMPOSER_ALLOW_SUPERUSER is not necessary anymore - * Fixed GitHub access tokens leaking into debug-verbosity output - * Fixed several edge case issues detecting GitHub, Bitbucket and GitLab repository types - * Fixed Composer asking if you want to use a composer.json in a parent directory when ran in non-interactive mode - * Fixed classmap autoloading issue finding classes located within a few non-PHP context blocks (?>... instead of proper colors - * Fixed 1.7.0-RC regression in output missing "Loading from cache" output on package install - -### [1.7.0-RC] 2018-07-24 - - * Changed default repository URL from packagist.org to repo.packagist.org, this might affect people with strict firewall rules - * Changed output from Updating to Downgrading when performing package downgrades, this might affect anything parsing output - * Several minor performance improvements - * Added basic authentication support for mercurial repos - * Added explicit `i` and `u` aliases for the `install` and `update` commands - * Added support for `show` command to output json format with --tree - * Added support for {glob,braces} support in the path repository's path argument - * Added support in `status` command for showing diffs in vendor dir even for packages installed as dist/zip archives - * Added `--remove-vcs` flag to `create-project` command to avoid prompting for keeping VCS files - * Added `--no-secure-http` flag to `create-project` command to bypass https (use at your own risk) - * Added `pre-command-run` event that lets plugins modify arguments - * Added RemoteFilesystem::getRemoteContents extension point - * Fixed setting scripts via `config` command - -### [1.6.5] 2018-05-04 - - * Fixed regression in 1.6.4 causing strange update behaviors with dev packages - * Fixed regression in 1.6.4 color support detection for Windows - * Fixed issues dealing with broken symlinks when switching branches and using path repositories - * Fixed JSON schema for package repositories - * Fixed issues on computers set to Turkish locale - * Fixed classmap parsing of files using short-open-tags when they are disabled in php - -### [1.6.4] 2018-04-13 - - * Security fixes in some edge case scenarios, recommended update for all users - * Fixed regression in version guessing of path repositories - * Fixed removing aliased packages from the repository, which might resolve some odd update bugs - * Fixed updating of package URLs for GitLab - * Fixed run-script --list failing when script handlers were defined - * Fixed init command not respecting the current php version when selecting package versions - * Fixed handling of uppercase package names in why/why-not commands - * Fixed exclude-from-classmap symlink handling - * Fixed filesystem permissions of PEAR binaries - * Improved performance of subversion repos - * Other minor fixes - -### [1.6.3] 2018-01-31 - - * Fixed GitLab downloads failing in some edge cases - * Fixed ctrl-C handling during create-project - * Fixed GitHub VCS repositories not prompting for a token in some conditions - * Fixed SPDX license identifiers being case sensitive - * Fixed and clarified a few dependency resolution error reporting strings - * Fixed SVN commit log fetching in verbose mode when using private repositories - -### [1.6.2] 2018-01-05 - - * Fixed more autoloader regressions - * Fixed support for updating dist refs in gitlab URLs - -### [1.6.1] 2018-01-04 - - * Fixed upgrade regression due to some autoloader cleanups - * Fixed some overly loose version constraints - -### [1.6.0] 2018-01-04 - - * Added support for SPDX license identifiers v3.0, deprecates GPL/LGPL/AGPL identifiers, which should now have a `-only` or `-or-later` suffix added. - * Added support for COMPOSER_MEMORY_LIMIT env var to make Composer set the PHP memory limit explicitly - * Added support for simple strings for the `bin` - * Fixed `check-platform-reqs` bug in version checking - -### [1.6.0-RC] 2017-12-19 - - * Improved performance of installs and updates from git clones when checking out known commits - * Added `check-platform-reqs` command that checks that your PHP and extensions versions match the platform requirements of the installed packages - * Added `--with-all-dependencies` to the `update` and `require` commands which updates all dependencies of the listed packages, including those that are direct root requirements - * Added `scripts-descriptions` key to composer.json to customize the description and document your custom commands - * Added support for the uppercase NO_PROXY env var - * Added support for COMPOSER_DEFAULT_{AUTHOR,LICENSE,EMAIL,VENDOR} env vars to pre-populate init command values - * Added support for local fossil repositories - * Added suggestions for alternative spellings when entering packages in `init` and `require` commands and nothing can be found - * Fixed installed.json data to be sorted alphabetically by package name - * Fixed compatibility with Symfony 4.x components that Composer uses - -### [1.5.6] - 2017-12-18 - - * Fixed root package version guessed when a tag is checked out - * Fixed support for GitLab repos hosted on non-standard ports - * Fixed regression in require command when requiring unstable packages, part 3 - -### [1.5.5] - 2017-12-01 - - * Fixed regression in require command when requiring unstable packages, part 2 - -### [1.5.4] - 2017-12-01 - - * Fixed regression in require command when requiring unstable packages - -### [1.5.3] - 2017-11-30 - - * Fixed require/remove commands reverting the composer.json change when a non-solver-related error occurs - * Fixed GitLabDriver to support installations of GitLab not at the root of the domain - * Fixed create-project not following the optimize-autoloader flag of the root package - * Fixed Authorization header being forwarded across domains after a redirect - * Improved some error messages for clarity - -### [1.5.2] - 2017-09-11 - - * Fixed GitLabDriver looping endlessly in some conditions - * Fixed GitLabDriver support for unauthenticated requests - * Fixed GitLab zip downloads not triggering credentials prompt if unauthenticated - * Fixed path repository support of COMPOSER_ROOT_VERSION, it now applies to all path repos within the same git repository - * Fixed path repository handling of copies to avoid copying VCS files and others - * Fixed sub-directory call to ignore list and create-project commands as well as calls to Composer using --working-dir - * Fixed invalid warning appearing when calling `remove` on an non-stable package - -### [1.5.1] - 2017-08-09 - - * Fixed regression in GitLabDriver with repos containing >100 branches or tags - * Fixed sub-directory call support to respect the COMPOSER env var - -### [1.5.0] - 2017-08-08 - - * Changed the package install order to ensure that plugins are always installed as soon as possible - * Added ability to call composer from within sub-directories of a project - * Added support for GitLab API v4 - * Added support for GitLab sub-groups - * Added some more rules to composer validate - * Added support for reading the `USER` env when guessing the username in `composer init` - * Added warning when uncompressing files with the same name but difference cases on case insensitive filesystems - * Added `htaccess-protect` option / `COMPOSER_HTACCESS_PROTECT` env var to disable the .htaccess creation in home dir (defaults to true) - * Improved `clear-cache` command - * Minor improvements/fixes and many documentation updates - -### [1.4.3] - 2017-08-06 - - * Fixed GitLab URLs - * Fixed root package version detection using latest git versions - * Fixed inconsistencies in date format in composer.lock when installing from source - * Fixed Mercurial support regression - * Fixed exclude-from-classmap not being applied when autoloading files for Composer plugins - * Fixed exclude-from-classmap being ignored when cwd has the wrong case on case insensitive filesystems - * Fixed several other minor issues - -### [1.4.2] - 2017-05-17 - - * Fixed Bitbucket API handler parsing old deleted branches in hg repos - * Fixed regression in gitlab downloads - * Fixed output inconsistencies - * Fixed unicode handling in `init` command for author names - * Fixed useless warning when doing partial updates/removes on packages that are not currently installed - * Fixed Xdebug disabling issue when combined with disable_functions and allow_url_fopen CLI overrides - -### [1.4.1] - 2017-03-10 - - * Fixed `apcu-autoloader` config option being ignored in `dump-autoload` command - * Fixed json validation not allowing boolean for trunk-path, branches-path and tags-path in svn repos - * Fixed json validation not allowing repository URLs without scheme - -### [1.4.0] - 2017-03-08 - - * Improved memory usage of dependency solver - * Added `--format json` option to the `outdated` and `show` command to get machine readable package listings - * Added `--ignore-filters` flag to `archive` command to bypass the .gitignore and co - * Added support for `outdated` output without ansi colors - * Added support for Bitbucket API v2 - * Changed the require command to follow minimum-stability / prefer-stable values when picking a version - * Fixed regression when using composer in a Mercurial repository - -### [1.3.3] - 2017-03-08 - - * **Capifony users beware**: This release has output format tweaks that mess up capifony interactive mode, see #6233 - * Improved baseline psr-4 autoloader performance for projects with many nested namespaces configured - * Fixed issues with gitlab API access when the token had insufficient permissions - * Fixed some HHVM strict type issues - * Fixed version guessing of headless git checkouts in some conditions - * Fixed compatibility with subversion 1.8 - * Fixed version guessing not working with svn/hg - * Fixed script/exec errors not being output correctly - * Fixed PEAR repository bug with pear.php.net - -### [1.3.2] - 2017-01-27 - - * Added `COMPOSER_BINARY` env var that is defined within the scope of a Composer run automatically with the path to the phar file - * Fixed create-project ending in a detached HEAD when installing aliased packages - * Fixed composer show not returning non-zero exit code when the package does not exist - * Fixed `@composer` handling in scripts when --working-dir is used together with it - * Fixed private-GitLab handling of repos with dashes in them - -### [1.3.1] - 2017-01-07 - - * Fixed dist downloads from Bitbucket - * Fixed some regressions related to xdebug disabling - * Fixed `--minor-only` flag in `outdated` command - * Fixed handling of config.platform.php which did not replace other `php-*` package's versions - -### [1.3.0] - 2016-12-24 - - * Fixed handling of annotated git tags vs lightweight tags leading to useless updates sometimes - * Fixed ext-xdebug not being require-able anymore due to automatic xdebug disabling - * Fixed case insensitivity of remove command - -### [1.3.0-RC] - 2016-12-11 - - * Added workaround for xdebug performance impact by restarting PHP without xdebug automatically in case it is enabled - * Added `--minor-only` to the `outdated` command to only show updates to minor versions and ignore new major versions - * Added `--apcu-autoloader` to the `update`/`install` commands and `--apcu` to `dump-autoload` to enable an APCu-caching autoloader, which can be more efficient than --classmap-authoritative if you attempt to autoload many classes that do not exist, or if you can not use authoritative classmaps for some reason - * Added summary of operations to be executed before they run, and made execution output more compact - * Added `php-debug` and `php-zts` virtual platform packages - * Added `gitlab-token` auth config for GitLab private tokens - * Added `--strict` to the `outdated` command to return a non-zero exit code when there are outdated packages - * Added ability to call php scripts using the current php interpreter (instead of finding php in PATH by default) in script handlers via `@php ...` - * Added `COMPOSER_ALLOW_XDEBUG` env var to circumvent the Xdebug-disabling behavior - * Added `COMPOSER_MIRROR_PATH_REPOS` env var to force mirroring of path repositories vs symlinking - * Added `COMPOSER_DEV_MODE` env var that is set by Composer to forward the dev mode to script handlers - * Fixed support for git 2.11 - * Fixed output from zip and rar leaking out when an error occurred - * Removed `hash` from composer.lock, only `content-hash` is now used which should reduce conflicts - * Minor fixes and performance improvements - -### [1.2.4] - 2016-12-06 - - * Fixed regression in output handling of scripts from 1.2.3 - * Fixed support for LibreSSL detection as lib-openssl - * Fixed issue with Zend Guard in the autoloader bootstrapping - * Fixed support for loading partial provider repositories - -### [1.2.3] - 2016-12-01 - - * Fixed bug in HgDriver failing to identify BitBucket repositories - * Fixed support for loading partial provider repositories - -### [1.2.2] - 2016-11-03 - - * Fixed selection of packages based on stability to be independent from package repository order - * Fixed POST_DEPENDENCIES_SOLVING not containing some operations in edge cases - * Fixed issue handling GitLab URLs containing dots and other special characters - * Fixed issue on Windows when running composer at the root of a drive - * Minor fixes - -### [1.2.1] - 2016-09-12 - - * Fixed edge case issues with the static autoloader - * Minor fixes - -### [1.2.0] - 2016-07-19 - - * Security: Fixed [httpoxy](https://httpoxy.org/) vulnerability - * Fixed `home` command to avoid rogue output on unix - * Fixed output of git clones to clearly state when clones are from cache - * (from 1.2 RC) Fixed ext-network-ipv6 to be php-ipv6 - -### [1.2.0-RC] - 2016-07-04 - - * Added caching of git repositories if you have git 2.3+ installed. Repositories will now be cached once and then cloned from local cache so subsequent installs should be faster - * Added detection of HEAD changes to the `status` command. If you `git checkout X` in a vendor directory for example it will tell you that it is not at the version that was installed - * Added a virtual `php-ipv6` extension to require PHP compiled with IPv6 support - * Added `--no-suggest` to `install` and `update` commands to skip output of suggestions at the end - * Added `--type` to the `search` command to restrict to a given package type - * Added fossil support as alternative to git/svn/.. for package downloads - * Improved BitBucket OAuth support - * Added support for blocking cache operations using COMPOSER_CACHE_DIR=/dev/null (or NUL on windows) - * Added support for using declare(strict_types=1) in plugins - * Added `--prefer-stable` and `--prefer-lowest` to the `require` command - * Added `--no-scripts` to the `require` and `remove` commands - * Added `_comment` top level key to the schema to endorse using it as a place to store comments (it can be a string or array of strings) - * Added support for justinrainbow/json-schema 2.0 - * Fixed binaries not being re-installed if deleted by users or the bin-dir changes. `update` and `install` will now re-install them - * Many minor UX and docs improvements - -### [1.1.3] - 2016-06-26 - - * Fixed bitbucket oauth instructions - * Fixed version parsing issue - * Fixed handling of bad proxies that modify JSON content on the fly - -### [1.1.2] - 2016-05-31 - - * Fixed degraded mode issue when accessing packagist.org - * Fixed GitHub access_token being added on subsequent requests in case of redirections - * Fixed exclude-from-classmap not working in some circumstances - * Fixed openssl warning preventing the use of config command for disabling tls - -### [1.1.1] - 2016-05-17 - - * Fixed regression in handling of #reference which made it update every time - * Fixed dev platform requirements being required even in --no-dev install from a lock file - * Fixed parsing of extension versions that do not follow valid numbers, we now try to parse x.y.z and ignore the rest - * Fixed exact constraints warnings appearing for 0.x versions - * Fixed regression in the `remove` command - -### [1.1.0] - 2016-05-10 - - * Added fallback to SSH for https bitbucket URLs - * Added BaseCommand::isProxyCommand that can be overridden to mark a command as being a mere proxy, which helps avoid duplicate warnings etc on composer startup - * Fixed archiving generating long paths in zip files on Windows - -### [1.1.0-RC] - 2016-04-29 - - * Added ability for plugins to register their own composer commands - * Optimized the autoloader initialization using static loading on PHP 5.6 and above, this reduces the load time for large classmaps to almost nothing - * Added `--latest` to `show` command to show the latest version available of your dependencies - * Added `--outdated` to `show` command an `composer outdated` alias for it, to show only packages in need of update - * Added `--direct` to `show` and `outdated` commands to show only your direct dependencies in the listing - * Added support for editing all top-level properties (name, minimum-stability, ...) as well as extra values via the `config` command - * Added abandoned state warning to the `show` and `outdated` commands when listing latest packages - * Added support for `~/` and `$HOME/` in the path repository paths - * Added support for wildcards in the `show` command package filter, e.g. `composer show seld/*` - * Added ability to call composer itself from scripts via `@composer ...` - * Added untracked files detection to the `status` command - * Added warning to `validate` command when using exact-version requires - * Added warning once per domain when accessing insecure URLs with secure-http disabled - * Added a dependency on composer/ca-bundle (extracted CA bundle management to a standalone lib) - * Added support for empty directories when archiving to tar - * Added an `init` event for plugins to react to, which occurs right after a Composer instance is fully initialized - * Added many new detections of problems in the `why-not`/`prohibits` command to figure out why something does not get installed in the expected version - * Added a deprecation notice for script event listeners that use legacy script classes - * Fixed abandoned state not showing up if you had a package installed before it was marked abandoned - * Fixed --no-dev updates creating an incomplete lock file, everything is now always resolved on update - * Fixed partial updates in case the vendor dir was not up to date with the lock file - -### [1.0.3] - 2016-04-29 - - * Security: Fixed possible command injection from the env vars into our sudo detection - * Fixed interactive authentication with gitlab - * Fixed class name replacement in plugins - * Fixed classmap generation mistakenly detecting anonymous classes - * Fixed auto-detection of stability flags in complex constraints like `2.0-dev || ^1.5` - * Fixed content-length handling when redirecting to very small responses - -### [1.0.2] - 2016-04-21 - - * Fixed regression in 1.0.1 on systems with mbstring.func_overload enabled - * Fixed regression in 1.0.1 that made dev packages update to the latest reference even if not whitelisted in a partial update - * Fixed init command ignoring the COMPOSER env var for choosing the json file name - * Fixed error reporting bug when the dependency resolution fails - * Fixed handling of `$` sign in composer config command in some cases it could corrupt the json file - -### [1.0.1] - 2016-04-18 - - * Fixed URL updating when a package's URL changes, composer.lock now contains the right URL including correct reference - * Fixed URL updating of the origin git remote as well for packages installed as git clone - * Fixed binary .bat files generated from linux being incompatible with windows cmd - * Fixed handling of paths with trailing slashes in path repository - * Fixed create-project not using platform config when selecting a package - * Fixed self-update not showing the channel it uses to perform the update - * Fixed file downloads not failing loudly when the content does not match the Content-Length header - * Fixed secure-http detecting some malformed URLs as insecure - * Updated CA bundle - -### [1.0.0] - 2016-04-05 - - * Added support for bitbucket-oauth configuration - * Added warning when running composer as super user, set COMPOSER_ALLOW_SUPERUSER=1 to hide the warning if you really must - * Added PluginManager::getGlobalComposer getter to retrieve the global instance (which can be null!) - * Fixed dependency solver error reporting in many cases it now shows you proper errors instead of just saying a package does not exist - * Fixed output of failed downloads appearing as 100% done instead of Failed - * Fixed handling of empty directories when archiving, they are not skipped anymore - * Fixed installation of broken plugins corrupting the vendor state when combined with symlinked path repositories - -### [1.0.0-beta2] - 2016-03-27 - - * Break: The `install` command now turns into an `update` command automatically if you have no composer.lock. This was done only half-way before which caused inconsistencies - * Break: By default the `remove` command now removes dependencies as well, and --update-with-dependencies is deprecated. Use --no-update-with-dependencies to get old behavior - * Added support for update channels in `self-update`. All users will now update to stable builds by default. Run `self-update` with `--snapshot`, `--preview` or `--stable` to switch between update channels. - * Added support for SSL_CERT_DIR env var and openssl.capath ini value - * Added some conflict detection in `why-not` command - * Added suggestion of root package's suggests in `create-project` command - * Fixed `create-project` ignoring --ignore-platform-reqs when choosing a version of the package - * Fixed `search` command in a directory without composer.json - * Fixed path repository handling of symlinks on windows - * Fixed PEAR repo handling to prefer HTTPS mirrors over HTTP ones - * Fixed handling of Path env var on Windows, only PATH was accepted before - * Small error reporting and docs improvements - -### [1.0.0-beta1] - 2016-03-03 - - * Break: By default we now disable any non-secure protocols (http, git, svn). This may lead to issues if you rely on those. See `secure-http` config option. - * Break: `show` / `list` command now only show installed packages by default. An `--all` option is added to show all packages. - * Added VCS repo support for the GitLab API, see also `gitlab-oauth` and `gitlab-domains` config options - * Added `prohibits` / `why-not` command to show what blocks an upgrade to a given package:version pair - * Added --tree / -t to the `show` command to see all your installed packages in a tree view - * Added --interactive / -i to the `update` command, which lets you pick packages to update interactively - * Added `exec` command to run binaries while having bin-dir in the PATH for convenience - * Added --root-reqs to the `update` command to update only your direct, first degree dependencies - * Added `cafile` and `capath` config options to control HTTPS certificate authority - * Added pubkey verification of composer.phar when running self-update - * Added possibility to configure per-package `preferred-install` types for more flexibility between prefer-source and prefer-dist - * Added unpushed-changes detection when updating dependencies and in the `status` command - * Added COMPOSER_AUTH env var that lets you pass a json configuration like the auth.json file - * Added `secure-http` and `disable-tls` config options to control HTTPS/HTTP - * Added warning when Xdebug is enabled as it reduces performance quite a bit, hide it with COMPOSER_DISABLE_XDEBUG_WARN=1 if you must - * Added duplicate key detection when loading composer.json - * Added `sort-packages` config option to force sorting of the requirements when using the `require` command - * Added support for the XDG Base Directory spec on linux - * Added XzDownloader for xz file support - * Fixed SSL support to fully verify peers in all PHP versions, unsecure HTTP is also disabled by default - * Fixed stashing and cleaning up of untracked files when updating packages - * Fixed plugins being enabled after installation even when --no-plugins - * Many small bug fixes and additions - -### [1.0.0-alpha11] - 2015-11-14 - - * Added config.platform to let you specify what your target environment looks like and make sure you do not inadvertently install dependencies that would break it - * Added `exclude-from-classmap` in the autoload config that lets you ignore sub-paths of classmapped directories, or psr-0/4 directories when building optimized autoloaders - * Added `path` repository type to install/symlink packages from local paths - * Added possibility to reference script handlers from within other handlers using @script-name to reduce duplication - * Added `suggests` command to show what packages are suggested, use -v to see more details - * Added `content-hash` inside the composer.lock to restrict the warnings about outdated lock file to some specific changes in the composer.json file - * Added `archive-format` and `archive-dir` config options to specify default values for the archive command - * Added --classmap-authoritative to `install`, `update`, `require`, `remove` and `dump-autoload` commands, forcing the optimized classmap to be authoritative - * Added -A / --with-dependencies to the `validate` command to allow validating all your dependencies recursively - * Added --strict to the `validate` command to treat any warning as an error that then returns a non-zero exit code - * Added a dependency on composer/semver, which is the externalized lib for all the version constraints parsing and handling - * Added support for classmap autoloading to load plugin classes and script handlers - * Added `bin-compat` config option that if set to `full` will create .bat proxy for binaries even if Composer runs in a linux VM - * Added SPDX 2.0 support, and externalized that in a composer/spdx-licenses lib - * Added warnings when the classmap autoloader finds duplicate classes - * Added --file to the `archive` command to choose the filename - * Added Ctrl+C handling in create-project to cancel the operation cleanly - * Fixed version guessing to use ^ always, default to stable versions, and avoid versions that require a higher php version than you have - * Fixed the lock file switching back and forth between old and new URL when a package URL is changed and many people run updates - * Fixed partial updates updating things they shouldn't when the current vendor dir was out of date with the lock file - * Fixed PHAR file creation to be more reproducible and always generate the exact same phar file from a given source - * Fixed issue when checking out git branches or tags that are also the name of a file in the repo - * Many minor fixes and documentation additions and UX improvements - -### [1.0.0-alpha10] - 2015-04-14 - - * Break: The following event classes are deprecated and you should update your script handlers to use the new ones in type hints: - - `Composer\Script\CommandEvent` is deprecated, use `Composer\Script\Event` - - `Composer\Script\PackageEvent` is deprecated, use `Composer\Installer\PackageEvent` - * Break: Output is now split between stdout and stderr. Any irrelevant output to each command is on stderr as per unix best practices. - * Added support for npm-style semver operators (`^` and `-` ranges, ` ` = AND, `||` = OR) - * Added --prefer-lowest to `update` command to allow testing a package with the lowest declared dependencies - * Added support for parsing semver build metadata `+anything` at the end of versions - * Added --sort-packages option to `require` command for sorting dependencies - * Added --no-autoloader to `install` and `update` commands to skip autoload generation - * Added --list to `run-script` command to see available scripts - * Added --absolute to `config` command to get back absolute paths - * Added `classmap-authoritative` config option, if enabled only the classmap info will be used by the composer autoloader - * Added support for branch-alias on numeric branches - * Added support for the `https_proxy`/`HTTPS_PROXY` env vars used only for https URLs - * Added support for using real composer repos as local paths in `create-project` command - * Added --no-dev to `licenses` command - * Added support for PHP 7.0 nightly builds - * Fixed detection of stability when parsing multiple constraints - * Fixed installs from lock file containing updated composer.json requirement - * Fixed the autoloader suffix in vendor/autoload.php changing in every build - * Many minor fixes, documentation additions and UX improvements - -### [1.0.0-alpha9] - 2014-12-07 - - * Added `remove` command to do the reverse of `require` - * Added --ignore-platform-reqs to `install`/`update` commands to install even if you are missing a php extension or have an invalid php version - * Added a warning when abandoned packages are being installed - * Added auto-selection of the version constraint in the `require` command, which can now be used simply as `composer require foo/bar` - * Added ability to define custom composer commands using scripts - * Added `browse` command to open a browser to the given package's repo URL (or homepage with `-H`) - * Added an `autoload-dev` section to declare dev-only autoload rules + a --no-dev flag to dump-autoload - * Added an `auth.json` file, with `store-auths` config option - * Added a `http-basic` config option to store login/pwds to hosts - * Added failover to source/dist and vice-versa in case a download method fails - * Added --path (-P) flag to the show command to see the install path of packages - * Added --update-with-dependencies and --update-no-dev flags to the require command - * Added `optimize-autoloader` config option to force the `-o` flag from the config - * Added `clear-cache` command - * Added a GzipDownloader to download single gzipped files - * Added `ssh` support in the `github-protocols` config option - * Added `pre-dependencies-solving` and `post-dependencies-solving` events - * Added `pre-archive-cmd` and `post-archive-cmd` script events to the `archive` command - * Added a `no-api` flag to GitHub VCS repos to skip the API but still get zip downloads - * Added http-basic auth support for private git repos not on github - * Added support for autoloading `.hh` files when running HHVM - * Added support for PHP 5.6 - * Added support for OTP auth when retrieving a GitHub API key - * Fixed isolation of `files` autoloaded scripts to ensure they can not affect anything - * Improved performance of solving dependencies - * Improved SVN and Perforce support - * A boatload of minor fixes, documentation additions and UX improvements - -### [1.0.0-alpha8] - 2014-01-06 - - * Break: The `install` command now has --dev enabled by default. --no-dev can be used to install without dev requirements - * Added `composer-plugin` package type to allow extensibility, and deprecated `composer-installer` - * Added `psr-4` autoloading support and deprecated `target-dir` since it is a better alternative - * Added --no-plugins flag to replace --no-custom-installers where available - * Added `global` command to operate Composer in a user-global directory - * Added `licenses` command to list the license of all your dependencies - * Added `pre-status-cmd` and `post-status-cmd` script events to the `status` command - * Added `post-root-package-install` and `post-create-project-cmd` script events to the `create-project` command - * Added `pre-autoload-dump` script event - * Added --rollback flag to self-update - * Added --no-install flag to create-project to skip installing the dependencies - * Added a `hhvm` platform package to require Facebook's HHVM implementation of PHP - * Added `github-domains` config option to allow using GitHub Enterprise with Composer's GitHub support - * Added `prepend-autoloader` config option to allow appending Composer's autoloader instead of the default prepend behavior - * Added Perforce support to the VCS repository - * Added a vendor/composer/autoload_files.php file that lists all files being included by the files autoloader - * Added support for the `no_proxy` env var and other proxy support improvements - * Added many robustness tweaks to make sure zip downloads work more consistently and corrupted caches are invalidated - * Added the release date to `composer -V` output - * Added `autoloader-suffix` config option to allow overriding the randomly generated autoloader class suffix - * Fixed BitBucket API usage - * Fixed parsing of inferred stability flags that are more stable than the minimum stability - * Fixed installation order of plugins/custom installers - * Fixed tilde and wildcard version constraints to be more intuitive regarding stabilities - * Fixed handling of target-dir changes when updating packages - * Improved performance of the class loader - * Improved memory usage and performance of solving dependencies - * Tons of minor bug fixes and improvements - -### [1.0.0-alpha7] - 2013-05-04 - - * Break: For forward compatibility, you should change your deployment scripts to run `composer install --no-dev`. The install command will install dev dependencies by default starting in the next release - * Break: The `update` command now has --dev enabled by default. --no-dev can be used to update without dev requirements, but it will create an incomplete lock file and is discouraged - * Break: Removed support for lock files created before 2012-09-15 due to their outdated unusable format - * Added `prefer-stable` flag to pick stable packages over unstable ones when possible - * Added `preferred-install` config option to always enable --prefer-source or --prefer-dist - * Added `diagnose` command to to system/network checks and find common problems - * Added wildcard support in the update whitelist, e.g. to update all packages of a vendor do `composer update vendor/*` - * Added `archive` command to archive the current directory or a given package - * Added `run-script` command to manually trigger scripts - * Added `proprietary` as valid license identifier for non-free code - * Added a `php-64bit` platform package that you can require to force a 64bit php - * Added a `lib-ICU` platform package - * Added a new official package type `project` for project-bootstrapping packages - * Added zip/dist local cache to speed up repetitive installations - * Added `post-autoload-dump` script event - * Added `Event::getDevMode` to let script handlers know if dev requirements are being installed - * Added `discard-changes` config option to control the default behavior when updating "dirty" dependencies - * Added `use-include-path` config option to make the autoloader look for files in the include path too - * Added `cache-ttl`, `cache-files-ttl` and `cache-files-maxsize` config option - * Added `cache-dir`, `cache-files-dir`, `cache-repo-dir` and `cache-vcs-dir` config option - * Added support for using http(s) authentication to non-github repos - * Added support for using multiple autoloaders at once (e.g. PHPUnit + application both using Composer autoloader) - * Added support for .inc files for classmap autoloading (legacy support, do not do this on new projects!) - * Added support for version constraints in show command, e.g. `composer show monolog/monolog 1.4.*` - * Added support for svn repositories containing packages in a deeper path (see package-path option) - * Added an `artifact` repository to scan a directory containing zipped packages - * Added --no-dev flag to `install` and `update` commands - * Added --stability (-s) flag to create-project to lower the required stability - * Added --no-progress to `install` and `update` to hide the progress indicators - * Added --available (-a) flag to the `show` command to display only available packages - * Added --name-only (-N) flag to the `show` command to show only package names (one per line, no formatting) - * Added --optimize-autoloader (-o) flag to optimize the autoloader from the `install` and `update` commands - * Added -vv and -vvv flags to get more verbose output, can be useful to debug some issues - * Added COMPOSER_NO_INTERACTION env var to do the equivalent of --no-interaction (should be set on build boxes, CI, PaaS) - * Added PHP 5.2 compatibility to the autoloader configuration files so they can be used to configure another autoloader - * Fixed handling of platform requirements of the root package when installing from lock - * Fixed handling of require-dev dependencies - * Fixed handling of unstable packages that should be downgraded to stable packages when updating to new version constraints - * Fixed parsing of the `~` operator combined with unstable versions - * Fixed the `require` command corrupting the json if the new requirement was invalid - * Fixed support of aliases used together with `#` constraints - * Improved output of dependency solver problems by grouping versions of a package together - * Improved performance of classmap generation - * Improved mercurial support in various places - * Improved lock file format to minimize unnecessary diffs - * Improved the `config` command to support all options - * Improved the coverage of the `validate` command - * Tons of minor bug fixes and improvements - -### [1.0.0-alpha6] - 2012-10-23 - - * Schema: Added ability to pass additional options to repositories (i.e. ssh keys/client certificates to secure private repos) - * Schema: Added a new `~` operator that should be preferred over `>=`, see https://getcomposer.org/doc/01-basic-usage.md#package-version-constraints - * Schema: Version constraints `` flags in require for restricting packages to a certain stability - * Schema: Removed `recommend` - * Schema: `suggest` is now informational and can use any description for a package, not only a constraint - * Break: vendor/.composer/autoload.php has been moved to vendor/autoload.php, other files are now in vendor/composer/ - * Added caching of repository metadata (faster startup times & failover if packagist is down) - * Added removal of packages that are not needed anymore - * Added include_path support for legacy projects that are full of require_once statements - * Added installation notifications API to allow better statistics on Composer repositories - * Added support for proxies that require authentication - * Added support for private github repositories over https - * Added autoloading support for root packages that use target-dir - * Added awareness of the root package presence and support for it's provide/replace/conflict keys - * Added IOInterface::isDecorated to test for colored output support - * Added validation of licenses based on the [SPDX registry](https://spdx.org/licenses/) - * Improved repository protocol to have large cacheable parts - * Fixed various bugs relating to package aliasing, proxy configuration, binaries - * Various bug fixes and docs improvements - -### [1.0.0-alpha2] - 2012-04-03 - - * Added `create-project` command to install a project from scratch with composer - * Added automated `classmap` autoloading support for non-PSR-0 compliant projects - * Added human readable error reporting when deps can not be solved - * Added support for private GitHub and SVN repositories (use --no-interaction for CI) - * Added "file" downloader type to download plain files - * Added support for authentication with svn repositories - * Added autoload support for PEAR repositories - * Improved clones from GitHub which now automatically select between git/https/http protocols - * Improved `validate` command to give more feedback - * Improved the `search` & `show` commands output - * Removed dependency on filter_var - * Various robustness & error handling improvements, docs fixes and more bug fixes - -### 1.0.0-alpha1 - 2012-03-01 - - * Initial release - -[2.5.5]: https://github.com/composer/composer/compare/2.5.4...2.5.5 -[2.5.4]: https://github.com/composer/composer/compare/2.5.3...2.5.4 -[2.5.3]: https://github.com/composer/composer/compare/2.5.2...2.5.3 -[2.5.2]: https://github.com/composer/composer/compare/2.5.1...2.5.2 -[2.5.1]: https://github.com/composer/composer/compare/2.5.0...2.5.1 -[2.5.0]: https://github.com/composer/composer/compare/2.4.4...2.5.0 -[2.4.4]: https://github.com/composer/composer/compare/2.4.3...2.4.4 -[2.4.3]: https://github.com/composer/composer/compare/2.4.2...2.4.3 -[2.4.2]: https://github.com/composer/composer/compare/2.4.1...2.4.2 -[2.4.1]: https://github.com/composer/composer/compare/2.4.0...2.4.1 -[2.4.0]: https://github.com/composer/composer/compare/2.4.0-RC1...2.4.0 -[2.4.0-RC1]: https://github.com/composer/composer/compare/2.3.10...2.4.0-RC1 -[2.3.10]: https://github.com/composer/composer/compare/2.3.9...2.3.10 -[2.3.9]: https://github.com/composer/composer/compare/2.3.8...2.3.9 -[2.3.8]: https://github.com/composer/composer/compare/2.3.7...2.3.8 -[2.3.7]: https://github.com/composer/composer/compare/2.3.6...2.3.7 -[2.3.6]: https://github.com/composer/composer/compare/2.3.5...2.3.6 -[2.3.5]: https://github.com/composer/composer/compare/2.3.4...2.3.5 -[2.3.4]: https://github.com/composer/composer/compare/2.3.3...2.3.4 -[2.3.3]: https://github.com/composer/composer/compare/2.3.2...2.3.3 -[2.3.2]: https://github.com/composer/composer/compare/2.3.1...2.3.2 -[2.3.1]: https://github.com/composer/composer/compare/2.3.0...2.3.1 -[2.3.0]: https://github.com/composer/composer/compare/2.3.0-RC2...2.3.0 -[2.3.0-RC2]: https://github.com/composer/composer/compare/2.3.0-RC1...2.3.0-RC2 -[2.3.0-RC1]: https://github.com/composer/composer/compare/2.2.9...2.3.0-RC1 -[2.2.17]: https://github.com/composer/composer/compare/2.2.16...2.2.17 -[2.2.16]: https://github.com/composer/composer/compare/2.2.15...2.2.16 -[2.2.15]: https://github.com/composer/composer/compare/2.2.14...2.2.15 -[2.2.14]: https://github.com/composer/composer/compare/2.2.13...2.2.14 -[2.2.13]: https://github.com/composer/composer/compare/2.2.12...2.2.13 -[2.2.12]: https://github.com/composer/composer/compare/2.2.11...2.2.12 -[2.2.11]: https://github.com/composer/composer/compare/2.2.10...2.2.11 -[2.2.10]: https://github.com/composer/composer/compare/2.2.9...2.2.10 -[2.2.9]: https://github.com/composer/composer/compare/2.2.8...2.2.9 -[2.2.8]: https://github.com/composer/composer/compare/2.2.7...2.2.8 -[2.2.7]: https://github.com/composer/composer/compare/2.2.6...2.2.7 -[2.2.6]: https://github.com/composer/composer/compare/2.2.5...2.2.6 -[2.2.5]: https://github.com/composer/composer/compare/2.2.4...2.2.5 -[2.2.4]: https://github.com/composer/composer/compare/2.2.3...2.2.4 -[2.2.3]: https://github.com/composer/composer/compare/2.2.2...2.2.3 -[2.2.2]: https://github.com/composer/composer/compare/2.2.1...2.2.2 -[2.2.1]: https://github.com/composer/composer/compare/2.2.0...2.2.1 -[2.2.0]: https://github.com/composer/composer/compare/2.2.0-RC1...2.2.0 -[2.2.0-RC1]: https://github.com/composer/composer/compare/2.1.14...2.2.0-RC1 -[2.1.14]: https://github.com/composer/composer/compare/2.1.13...2.1.14 -[2.1.13]: https://github.com/composer/composer/compare/2.1.12...2.1.13 -[2.1.12]: https://github.com/composer/composer/compare/2.1.11...2.1.12 -[2.1.11]: https://github.com/composer/composer/compare/2.1.10...2.1.11 -[2.1.10]: https://github.com/composer/composer/compare/2.1.9...2.1.10 -[2.1.9]: https://github.com/composer/composer/compare/2.1.8...2.1.9 -[2.1.8]: https://github.com/composer/composer/compare/2.1.7...2.1.8 -[2.1.7]: https://github.com/composer/composer/compare/2.1.6...2.1.7 -[2.1.6]: https://github.com/composer/composer/compare/2.1.5...2.1.6 -[2.1.5]: https://github.com/composer/composer/compare/2.1.4...2.1.5 -[2.1.4]: https://github.com/composer/composer/compare/2.1.3...2.1.4 -[2.1.3]: https://github.com/composer/composer/compare/2.1.2...2.1.3 -[2.1.2]: https://github.com/composer/composer/compare/2.1.1...2.1.2 -[2.1.1]: https://github.com/composer/composer/compare/2.1.0...2.1.1 -[2.1.0]: https://github.com/composer/composer/compare/2.1.0-RC1...2.1.0 -[2.1.0-RC1]: https://github.com/composer/composer/compare/2.0.14...2.1.0-RC1 -[2.0.14]: https://github.com/composer/composer/compare/2.0.13...2.0.14 -[2.0.13]: https://github.com/composer/composer/compare/2.0.12...2.0.13 -[2.0.12]: https://github.com/composer/composer/compare/2.0.11...2.0.12 -[2.0.11]: https://github.com/composer/composer/compare/2.0.10...2.0.11 -[2.0.10]: https://github.com/composer/composer/compare/2.0.9...2.0.10 -[2.0.9]: https://github.com/composer/composer/compare/2.0.8...2.0.9 -[2.0.8]: https://github.com/composer/composer/compare/2.0.7...2.0.8 -[2.0.7]: https://github.com/composer/composer/compare/2.0.6...2.0.7 -[2.0.6]: https://github.com/composer/composer/compare/2.0.5...2.0.6 -[2.0.5]: https://github.com/composer/composer/compare/2.0.4...2.0.5 -[2.0.4]: https://github.com/composer/composer/compare/2.0.3...2.0.4 -[2.0.3]: https://github.com/composer/composer/compare/2.0.2...2.0.3 -[2.0.2]: https://github.com/composer/composer/compare/2.0.1...2.0.2 -[2.0.1]: https://github.com/composer/composer/compare/2.0.0...2.0.1 -[2.0.0]: https://github.com/composer/composer/compare/2.0.0-RC2...2.0.0 -[2.0.0-RC2]: https://github.com/composer/composer/compare/2.0.0-RC1...2.0.0-RC2 -[2.0.0-RC1]: https://github.com/composer/composer/compare/2.0.0-alpha3...2.0.0-RC1 -[2.0.0-alpha3]: https://github.com/composer/composer/compare/2.0.0-alpha2...2.0.0-alpha3 -[2.0.0-alpha2]: https://github.com/composer/composer/compare/2.0.0-alpha1...2.0.0-alpha2 -[2.0.0-alpha1]: https://github.com/composer/composer/compare/1.10.7...2.0.0-alpha1 -[1.10.23]: https://github.com/composer/composer/compare/1.10.22...1.10.23 -[1.10.22]: https://github.com/composer/composer/compare/1.10.21...1.10.22 -[1.10.21]: https://github.com/composer/composer/compare/1.10.20...1.10.21 -[1.10.20]: https://github.com/composer/composer/compare/1.10.19...1.10.20 -[1.10.19]: https://github.com/composer/composer/compare/1.10.18...1.10.19 -[1.10.18]: https://github.com/composer/composer/compare/1.10.17...1.10.18 -[1.10.17]: https://github.com/composer/composer/compare/1.10.16...1.10.17 -[1.10.16]: https://github.com/composer/composer/compare/1.10.15...1.10.16 -[1.10.15]: https://github.com/composer/composer/compare/1.10.14...1.10.15 -[1.10.14]: https://github.com/composer/composer/compare/1.10.13...1.10.14 -[1.10.13]: https://github.com/composer/composer/compare/1.10.12...1.10.13 -[1.10.12]: https://github.com/composer/composer/compare/1.10.11...1.10.12 -[1.10.11]: https://github.com/composer/composer/compare/1.10.10...1.10.11 -[1.10.10]: https://github.com/composer/composer/compare/1.10.9...1.10.10 -[1.10.9]: https://github.com/composer/composer/compare/1.10.8...1.10.9 -[1.10.8]: https://github.com/composer/composer/compare/1.10.7...1.10.8 -[1.10.7]: https://github.com/composer/composer/compare/1.10.6...1.10.7 -[1.10.6]: https://github.com/composer/composer/compare/1.10.5...1.10.6 -[1.10.5]: https://github.com/composer/composer/compare/1.10.4...1.10.5 -[1.10.4]: https://github.com/composer/composer/compare/1.10.3...1.10.4 -[1.10.3]: https://github.com/composer/composer/compare/1.10.2...1.10.3 -[1.10.2]: https://github.com/composer/composer/compare/1.10.1...1.10.2 -[1.10.1]: https://github.com/composer/composer/compare/1.10.0...1.10.1 -[1.10.0]: https://github.com/composer/composer/compare/1.10.0-RC...1.10.0 -[1.10.0-RC]: https://github.com/composer/composer/compare/1.9.3...1.10.0-RC -[1.9.3]: https://github.com/composer/composer/compare/1.9.2...1.9.3 -[1.9.2]: https://github.com/composer/composer/compare/1.9.1...1.9.2 -[1.9.1]: https://github.com/composer/composer/compare/1.9.0...1.9.1 -[1.9.0]: https://github.com/composer/composer/compare/1.8.6...1.9.0 -[1.8.6]: https://github.com/composer/composer/compare/1.8.5...1.8.6 -[1.8.5]: https://github.com/composer/composer/compare/1.8.4...1.8.5 -[1.8.4]: https://github.com/composer/composer/compare/1.8.3...1.8.4 -[1.8.3]: https://github.com/composer/composer/compare/1.8.2...1.8.3 -[1.8.2]: https://github.com/composer/composer/compare/1.8.1...1.8.2 -[1.8.1]: https://github.com/composer/composer/compare/1.8.0...1.8.1 -[1.8.0]: https://github.com/composer/composer/compare/1.7.3...1.8.0 -[1.7.3]: https://github.com/composer/composer/compare/1.7.2...1.7.3 -[1.7.2]: https://github.com/composer/composer/compare/1.7.1...1.7.2 -[1.7.1]: https://github.com/composer/composer/compare/1.7.0...1.7.1 -[1.7.0]: https://github.com/composer/composer/compare/1.7.0-RC...1.7.0 -[1.7.0-RC]: https://github.com/composer/composer/compare/1.6.5...1.7.0-RC -[1.6.5]: https://github.com/composer/composer/compare/1.6.4...1.6.5 -[1.6.4]: https://github.com/composer/composer/compare/1.6.3...1.6.4 -[1.6.3]: https://github.com/composer/composer/compare/1.6.2...1.6.3 -[1.6.2]: https://github.com/composer/composer/compare/1.6.1...1.6.2 -[1.6.1]: https://github.com/composer/composer/compare/1.6.0...1.6.1 -[1.6.0]: https://github.com/composer/composer/compare/1.6.0-RC...1.6.0 -[1.6.0-RC]: https://github.com/composer/composer/compare/1.5.6...1.6.0-RC -[1.5.6]: https://github.com/composer/composer/compare/1.5.5...1.5.6 -[1.5.5]: https://github.com/composer/composer/compare/1.5.4...1.5.5 -[1.5.4]: https://github.com/composer/composer/compare/1.5.3...1.5.4 -[1.5.3]: https://github.com/composer/composer/compare/1.5.2...1.5.3 -[1.5.2]: https://github.com/composer/composer/compare/1.5.1...1.5.2 -[1.5.1]: https://github.com/composer/composer/compare/1.5.0...1.5.1 -[1.5.0]: https://github.com/composer/composer/compare/1.4.3...1.5.0 -[1.4.3]: https://github.com/composer/composer/compare/1.4.2...1.4.3 -[1.4.2]: https://github.com/composer/composer/compare/1.4.1...1.4.2 -[1.4.1]: https://github.com/composer/composer/compare/1.4.0...1.4.1 -[1.4.0]: https://github.com/composer/composer/compare/1.3.3...1.4.0 -[1.3.3]: https://github.com/composer/composer/compare/1.3.2...1.3.3 -[1.3.2]: https://github.com/composer/composer/compare/1.3.1...1.3.2 -[1.3.1]: https://github.com/composer/composer/compare/1.3.0...1.3.1 -[1.3.0]: https://github.com/composer/composer/compare/1.3.0-RC...1.3.0 -[1.3.0-RC]: https://github.com/composer/composer/compare/1.2.4...1.3.0-RC -[1.2.4]: https://github.com/composer/composer/compare/1.2.3...1.2.4 -[1.2.3]: https://github.com/composer/composer/compare/1.2.2...1.2.3 -[1.2.2]: https://github.com/composer/composer/compare/1.2.1...1.2.2 -[1.2.1]: https://github.com/composer/composer/compare/1.2.0...1.2.1 -[1.2.0]: https://github.com/composer/composer/compare/1.2.0-RC...1.2.0 -[1.2.0-RC]: https://github.com/composer/composer/compare/1.1.3...1.2.0-RC -[1.1.3]: https://github.com/composer/composer/compare/1.1.2...1.1.3 -[1.1.2]: https://github.com/composer/composer/compare/1.1.1...1.1.2 -[1.1.1]: https://github.com/composer/composer/compare/1.1.0...1.1.1 -[1.1.0]: https://github.com/composer/composer/compare/1.0.3...1.1.0 -[1.1.0-RC]: https://github.com/composer/composer/compare/1.0.3...1.1.0-RC -[1.0.3]: https://github.com/composer/composer/compare/1.0.2...1.0.3 -[1.0.2]: https://github.com/composer/composer/compare/1.0.1...1.0.2 -[1.0.1]: https://github.com/composer/composer/compare/1.0.0...1.0.1 -[1.0.0]: https://github.com/composer/composer/compare/1.0.0-beta2...1.0.0 -[1.0.0-beta2]: https://github.com/composer/composer/compare/1.0.0-beta1...1.0.0-beta2 -[1.0.0-beta1]: https://github.com/composer/composer/compare/1.0.0-alpha11...1.0.0-beta1 -[1.0.0-alpha11]: https://github.com/composer/composer/compare/1.0.0-alpha10...1.0.0-alpha11 -[1.0.0-alpha10]: https://github.com/composer/composer/compare/1.0.0-alpha9...1.0.0-alpha10 -[1.0.0-alpha9]: https://github.com/composer/composer/compare/1.0.0-alpha8...1.0.0-alpha9 -[1.0.0-alpha8]: https://github.com/composer/composer/compare/1.0.0-alpha7...1.0.0-alpha8 -[1.0.0-alpha7]: https://github.com/composer/composer/compare/1.0.0-alpha6...1.0.0-alpha7 -[1.0.0-alpha6]: https://github.com/composer/composer/compare/1.0.0-alpha5...1.0.0-alpha6 -[1.0.0-alpha5]: https://github.com/composer/composer/compare/1.0.0-alpha4...1.0.0-alpha5 -[1.0.0-alpha4]: https://github.com/composer/composer/compare/1.0.0-alpha3...1.0.0-alpha4 -[1.0.0-alpha3]: https://github.com/composer/composer/compare/1.0.0-alpha2...1.0.0-alpha3 -[1.0.0-alpha2]: https://github.com/composer/composer/compare/1.0.0-alpha1...1.0.0-alpha2 diff --git a/app/vendor/composer/composer/CODE_OF_CONDUCT.md b/app/vendor/composer/composer/CODE_OF_CONDUCT.md deleted file mode 100644 index dd7310a5f..000000000 --- a/app/vendor/composer/composer/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,133 +0,0 @@ - -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, caste, color, religion, or sexual -identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall - community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or advances of - any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, - without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -contact@packagist.org. -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series of -actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or permanent -ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within the -community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.1, available at -[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. - -Community Impact Guidelines were inspired by -[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at -[https://www.contributor-covenant.org/translations][translations]. - -[homepage]: https://www.contributor-covenant.org -[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html -[Mozilla CoC]: https://github.com/mozilla/diversity -[FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations diff --git a/app/vendor/composer/composer/PORTING_INFO b/app/vendor/composer/composer/PORTING_INFO deleted file mode 100644 index 54d86b25e..000000000 --- a/app/vendor/composer/composer/PORTING_INFO +++ /dev/null @@ -1,39 +0,0 @@ - * add rule - * p = direct literal; always < 0 for installed rpm rules - * d, if < 0 direct literal, if > 0 offset into whatprovides, if == 0 rule is assertion (look at p only) - * - * - * A requires b, b provided by B1,B2,B3 => (-A|B1|B2|B3) - * - * p < 0 : pkg id of A - * d > 0 : Offset in whatprovidesdata (list of providers of b) - * - * A conflicts b, b provided by B1,B2,B3 => (-A|-B1), (-A|-B2), (-A|-B3) - * p < 0 : pkg id of A - * d < 0 : Id of solvable (e.g. B1) - * - * d == 0: unary rule, assertion => (A) or (-A) - * - * Install: p > 0, d = 0 (A) user requested install - * Remove: p < 0, d = 0 (-A) user requested remove (also: uninstallable) - * Requires: p < 0, d > 0 (-A|B1|B2|...) d: - * Updates: p > 0, d > 0 (A|B1|B2|...) d: - * Conflicts: p < 0, d < 0 (-A|-B) either p (conflict issuer) or d (conflict provider) (binary rule) - * also used for obsoletes - * ?: p > 0, d < 0 (A|-B) - * No-op ?: p = 0, d = 0 (null) (used as policy rule placeholder) - * - * resulting watches: - * ------------------ - * Direct assertion (no watch needed)( if d <0 ) --> d = 0, w1 = p, w2 = 0 - * Binary rule: p = first literal, d = 0, w2 = second literal, w1 = p - * every other : w1 = p, w2 = whatprovidesdata[d]; - * Disabled rule: w1 = 0 - * - * always returns a rule for non-rpm rules - - - -p > 0, d = 0, (A), w1 = p, w2 = 0 -p < 0, d = 0, (-A), w1 = p, w2 = 0 -p !=0, d = 0, (p|q), w1 = p, w2 = q diff --git a/app/vendor/composer/composer/README.md b/app/vendor/composer/composer/README.md deleted file mode 100644 index 6a7d02282..000000000 --- a/app/vendor/composer/composer/README.md +++ /dev/null @@ -1,75 +0,0 @@ -

- - Composer - -

-

Dependency Management for PHP

- -Composer helps you declare, manage, and install dependencies of PHP projects. - -See [https://getcomposer.org/](https://getcomposer.org/) for more information and documentation. - -[![Continuous Integration](https://github.com/composer/composer/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/composer/actions) - -Installation / Usage --------------------- - -Download and install Composer by following the [official instructions](https://getcomposer.org/download/). - -For usage, see [the documentation](https://getcomposer.org/doc/). - -Packages --------- - -Find public packages on [Packagist.org](https://packagist.org). - -For private package hosting take a look at [Private Packagist](https://packagist.com). - -Community ---------- - -Follow [@packagist](https://twitter.com/packagist) or [@seldaek](https://twitter.com/seldaek) on Twitter for announcements, or check the [#composerphp](https://twitter.com/search?q=%23composerphp&src=typed_query&f=live) hashtag. - -For support, Stack Overflow offers a good collection of -[Composer related questions](https://stackoverflow.com/questions/tagged/composer-php), or you can use the [GitHub discussions](https://github.com/composer/composer/discussions). - -Please note that this project is released with a -[Contributor Code of Conduct](https://www.contributor-covenant.org/version/1/4/code-of-conduct/). -By participating in this project and its community you agree to abide by those terms. - -Requirements ------------- - -#### Latest Composer - -PHP 7.2.5 or above for the latest version. - -#### Composer 2.2 LTS (Long Term Support) - -PHP versions 5.3.2 - 8.1 are still supported via the LTS releases of Composer (2.2.x). If you -run the installer or the `self-update` command the appropriate Composer version for your PHP -should be automatically selected. - -Authors -------- - -- Nils Adermann | [GitHub](https://github.com/naderman) | [Twitter](https://twitter.com/naderman) | | [naderman.de](https://naderman.de) -- Jordi Boggiano | [GitHub](https://github.com/Seldaek) | [Twitter](https://twitter.com/seldaek) | | [seld.be](https://seld.be) - -See also the list of [contributors](https://github.com/composer/composer/contributors) who participated in this project. - -Security Reports ----------------- - -Please send any sensitive issue to [security@packagist.org](mailto:security@packagist.org). Thanks! - -License -------- - -Composer is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. - -Acknowledgments ---------------- - -- This project's Solver started out as a PHP port of openSUSE's - [Libzypp satsolver](https://en.opensuse.org/openSUSE:Libzypp_satsolver). diff --git a/app/vendor/composer/composer/UPGRADE-2.0.md b/app/vendor/composer/composer/UPGRADE-2.0.md deleted file mode 100644 index 3e5878ea3..000000000 --- a/app/vendor/composer/composer/UPGRADE-2.0.md +++ /dev/null @@ -1,111 +0,0 @@ -# Upgrade guides for Composer 1.x to 2.0 - -## For composer CLI users - -- The new platform-check feature means that Composer checks the runtime PHP version and available extensions to ensure they match the project dependencies. If a mismatch is found, it exits with error details to make sure problems are not overlooked. To avoid issues when deploying to production it is recommended to run `composer check-platform-reqs` with the production PHP process as part of your build or deployment process. -- If a package exists in a higher priority repository, it will now be entirely ignored in lower priority repositories. See [repository priorities](https://getcomposer.org/repoprio) for details. -- Invalid PSR-0 / PSR-4 class configurations will not autoload anymore in optimized-autoloader mode, as per the warnings introduced in 1.10 -- On linux systems supporting the XDG Base Directory Specification, Composer will now prefer using XDG_CONFIG_DIR/composer over `~/.composer` if both are available (1.x used `~/.composer` first) -- Package names now must comply to our [naming guidelines](doc/04-schema.md#name) or Composer will abort, as per the warnings introduced in 1.8.1 -- Deprecated --no-suggest flag as it is not needed anymore -- PEAR support (repository, downloader, etc.) has been removed -- `update` now lists changes to the lock file first (update step), and then the changes applied when installing the lock file to the vendor dir (install step) -- `HTTPS_PROXY_REQUEST_FULLURI` if not specified will now default to false as this seems to work better in most environments -- `dev-trunk`, `dev-master` and `dev-default` are no longer aliases for each other. The exact branch names are now preserved. - -## For integrators and plugin authors - -- composer-plugin-api has been bumped to 2.0.0 - you can detect which version of Composer you run via `PluginInterface::PLUGIN_API_VERSION` -- `PluginInterface` added a deactivate (so plugin can stop whatever it is doing) and an uninstall (so the plugin can remove any files it created or do general cleanup) method. -- Plugins implementing `EventSubscriberInterface` will be deregistered from the EventDispatcher automatically when being deactivated, nothing to do there. -- `Pool` objects are now created via the `RepositorySet` class, you should use that in case you were using the `Pool` class directly. -- Custom installers extending from LibraryInstaller should be aware that in Composer 2 it MAY return PromiseInterface instances when calling parent::install/update/uninstall/installCode/removeCode. See [composer/installers](https://github.com/composer/installers/commit/5006d0c28730ade233a8f42ec31ac68fb1c5c9bb) for an example of how to handle this best. -- The `Composer\Installer` class changed quite a bit internally, but the inputs are almost the same: - - `setAdditionalInstalledRepository` is now `setAdditionalFixedRepository` - - `setUpdateWhitelist` is now `setUpdateAllowList` - - `setWhitelistDependencies`, `setWhitelistTransitiveDependencies` and `setWhitelistAllDependencies` are now all rolled into `setUpdateAllowTransitiveDependencies` which takes one of the `Request::UPDATE_*` constants - - `setSkipSuggest` is gone -- `vendor/composer/installed.json` format changed: - - packages are now wrapped into a `"packages"` top level key instead of the whole file being the package array - - packages now contain an `"installed-path"` key which lists where they were installed - - there is a top level `"dev"` key which stores whether dev requirements were installed or not -- Removed `OperationInterface::getReason` as the data was not accurate. There is no replacement available. -- `PreFileDownloadEvent` now receives an `HttpDownloader` instance instead of `RemoteFilesystem`, and that instance cannot be overridden by listeners anymore, you can however call setProcessedUrl or setCustomCacheKey. -- `VersionSelector::findBestCandidate`'s third argument (phpVersion) was removed in favor of passing in a complete PlatformRepository instance into the constructor -- `InitCommand::determineRequirements`'s fourth argument (phpVersion) should now receive a complete PlatformRepository instance or null if platform requirements are to be ignored -- `IOInterface` now extends PSR-3's `LoggerInterface`, and has new `writeRaw` + `writeErrorRaw` methods -- `RepositoryInterface` changes: - - A new `loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags)` function was added for use during pool building - - `search` now has a third `$type` argument - - A new `getRepoName()` function was added to describe the repository - - A new `getProviders()` function was added to list packages providing a given package's name -- Removed `BaseRepository` abstract class -- `DownloaderInterface` changes: - - `download` now receives a third `$prevPackage` argument for updates - - `download` should now only do network operations to prepare the package for installation but not actually install anything - - `prepare` (do user prompts or any checks which need to happen to make sure that install/update/remove will most likely succeed), `install` (should do the non-network part that `download` used to do) and `cleanup` (cleaning up anything that may be left over) were added as new steps in the package install flow - - All packages get first downloaded, then all together prepared, then all together installed/updated/uninstalled, then finally cleanup is called for all. Therefore for error recovery it is important to avoid failing during install/update/uninstall as much as possible, and risky things or user prompts should happen in the prepare step rather. In case of failure, cleanup() will be called so that changes can be undone as much as possible. -- If you used `RemoteFilesystem` you probably should use `HttpDownloader` instead now -- `PRE_DEPENDENCIES_SOLVING` and `POST_DEPENDENCIES_SOLVING` events have been removed, use the new `PRE_OPERATIONS_EXEC`, `PRE_POOL_CREATE` or other existing events instead or talk to us if you think you really need this. See below for more details. -- The bundled composer/semver is now the 3.x range, see release notes for [2.0](https://github.com/composer/semver/releases/tag/2.0.0) and [3.0](https://github.com/composer/semver/releases/tag/3.0.0) for the minor breaking changes there -- Run Composer with COMPOSER_DEBUG_EVENTS=1 set in the environment to show which events happen which might help you. - -### Detailed differences in event flow during dependency resolution, composer updates and installs - -#### Composer v1 - -- Composer resolves dependencies (dispatching PRE/POST_DEPENDENCIES_SOLVING) -- It then iterates over all packages one by one (dispatching PRE_PACKAGE_INSTALL/UPDATE/UNINSTALL, then PRE_FILE_DOWNLOAD if needed, then POST_PACKAGE_\*) -- And finally writes the lock file at the end - -#### Composer v2 - -The update and install process have been split up. - -Update does: - -- Composer resolves dependencies (dispatching PRE_POOL_CREATE) -- It then writes the lock file and that's the end of the update - -Install then does: - -- Dispatches PRE_OPERATIONS_EXEC with the full list of operations to be executed -- Downloads all the packages not in cache yet in parallel (dispatching PRE_FILE_DOWNLOAD for those not in cache yet) -- It then iterates over all packages and executes updates/installs/uninstalls in parallel (dispatching PRE_PACKAGE_INSTALL/UPDATE/UNINSTALL then POST_PACKAGE_\* but one package started last may finish installing before another is done for example). - -## For Composer repository implementors - -Composer 2.0 adds support for a new Composer repository format. - -It is possible to build a repository which is compatible with both Composer v1 and v2, you keep everything you had and simply add the new fields in `packages.json`. - -Here are examples of the new values from packagist.org: - -### metadata-url - -`"metadata-url": "/p2/%package%.json",` - -This new metadata-url should serve all packages which are in the repository. - -- Whenever Composer looks for a package, it will replace `%package%` by the package name, and fetch that URL. -- If dev stability is allowed for the package, it will also load the URL again with `$packageName~dev` (e.g. `/p2/foo/bar~dev.json` to look for `foo/bar`'s dev versions). -- Caching is done via the use of If-Modified-Since header, so make sure you return Last-Modified headers and that they are accurate. -- Any requested package which does not exist MUST return a 404 status code, which will indicate to Composer that this package does not exist in your repository. Make sure the 404 response is fast to avoid blocking Composer. Avoid redirects to alternative 404 pages. -- The `foo/bar.json` and `foo/bar~dev.json` files containing package versions MUST contain only versions for the foo/bar package, as `{"packages":{"foo/bar":[ ... versions here ... ]}}`. -- The array of versions can also optionally be minified using `Composer\Util\MetadataMinifier::minify()`. If you do that, you should add a `"minified": "composer/2.0"` key at the top level to indicate to Composer it must expand the version list back into the original data. See https://repo.packagist.org/p2/monolog/monolog.json for an example. - -If your repository only has a small number of packages, and you want to avoid the 404-requests, you can also specify an `"available-packages"` key in `packages.json` which should be an array with all the package names that your repository contain. Alternatively you can specify an `"available-package-patterns"` key which is an array of package name patterns (with `*` matching any string, e.g. `vendor/*` would make composer look up every matching package name in this repository). - -### providers-api - -`"providers-api": "https://packagist.org/providers/%package%.json",` - -The providers-api is optional, but if you implement it it should return packages which provide a given package name, but not the package which has that name. For example https://packagist.org/providers/monolog/monolog.json lists some package which have a "provide" rule for monolog/monolog, but it does not list monolog/monolog itself. - -### list - -This is also optional, it should accept an optional `?filter=xx` query param, which can contain `*` as wildcards matching any substring. - -It must return an array of package names as `{"packageNames": ["a/b", "c/d"]}`. See for example. - -It should return the names of package which names match the filter (or all names if no filter is present). Replace/provide rules should not be considered here. diff --git a/app/vendor/composer/composer/composer.json b/app/vendor/composer/composer/composer.json index da5389298..70f488506 100644 --- a/app/vendor/composer/composer/composer.json +++ b/app/vendor/composer/composer/composer.json @@ -26,18 +26,18 @@ "composer/ca-bundle": "^1.0", "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", - "composer/semver": "^3.0", + "composer/semver": "^3.2.5", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "psr/log": "^1.0 || ^2.0 || ^3.0", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/process": "^5.4 || ^6.0", - "react/promise": "^2.8", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/process": "^5.4 || ^6.0 || ^7", + "react/promise": "^2.8 || ^3", "composer/pcre": "^2.1 || ^3.1", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", @@ -45,7 +45,7 @@ "seld/signal-handler": "^2.0" }, "require-dev": { - "symfony/phpunit-bridge": "^6.0", + "symfony/phpunit-bridge": "^6.0 || ^7", "phpstan/phpstan": "^1.9.3", "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-deprecation-rules": "^1", @@ -65,7 +65,7 @@ }, "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" }, "phpstan": { "includes": [ @@ -75,12 +75,12 @@ }, "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "autoload-dev": { "psr-4": { - "Composer\\Test\\": "tests/Composer/Test" + "Composer\\Test\\": "tests/Composer/Test/" } }, "bin": [ @@ -98,6 +98,7 @@ }, "support": { "issues": "https://github.com/composer/composer/issues", - "irc": "ircs://irc.libera.chat:6697/composer" + "irc": "ircs://irc.libera.chat:6697/composer", + "security": "https://github.com/composer/composer/security/policy" } } diff --git a/app/vendor/composer/composer/composer.lock b/app/vendor/composer/composer/composer.lock deleted file mode 100644 index ed8f2760a..000000000 --- a/app/vendor/composer/composer/composer.lock +++ /dev/null @@ -1,2418 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "c05209907d2737038b580f3345730346", - "packages": [ - { - "name": "composer/ca-bundle", - "version": "1.3.5", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.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": "2023-01-11T08:27:00+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "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-06-19T11:31:27+00:00" - }, - { - "name": "composer/metadata-minifier", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\MetadataMinifier\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Small utility library that handles metadata minification and expansion.", - "keywords": [ - "composer", - "compression" - ], - "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" - }, - "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": "2021-04-07T13:37:33+00:00" - }, - { - "name": "composer/pcre", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/composer/pcre.git", - "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/3fdb2807b31a78a40ad89570e30ec77466c98717", - "reference": "3fdb2807b31a78a40ad89570e30ec77466c98717", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Pcre\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "PCRE wrapping library that offers type-safe preg_* replacements.", - "keywords": [ - "PCRE", - "preg", - "regex", - "regular expression" - ], - "support": { - "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/2.1.0" - }, - "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-11-16T18:32:04+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": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "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": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "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", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-04-01T19:23:25+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.7", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "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": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" - }, - "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-05-23T07:37:50+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "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/3.0.3" - }, - "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-02-25T21:32:43+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.12", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" - }, - "time": "2022-04-13T08:02:27+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "react/promise", - "version": "v2.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" - }, - { - "name": "seld/jsonlint", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2022-04-01T13:37:23+00:00" - }, - { - "name": "seld/phar-utils", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "shasum": "" - }, - "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" - }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\Signal\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", - "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" - ], - "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.21", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "c77433ddc6cdc689caf48065d9ea22ca0853fbd9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c77433ddc6cdc689caf48065d9ea22ca0853fbd9", - "reference": "c77433ddc6cdc689caf48065d9ea22ca0853fbd9", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "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" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.4.21" - }, - "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": "2023-02-25T16:59:41+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "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": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-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/filesystem", - "version": "v5.4.21", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", - "reference": "e75960b1bbfd2b8c9e483e0d74811d555ca3de9f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "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 basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.21" - }, - "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": "2023-02-14T08:03:56+00:00" - }, - { - "name": "symfony/finder", - "version": "v5.4.21", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/078e9a5e1871fcfe6a5ce421b539344c21afef19", - "reference": "078e9a5e1871fcfe6a5ce421b539344c21afef19", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "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": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.21" - }, - "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": "2023-02-16T09:33:00+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "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 grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/polyfill-php81", - "version": "v1.27.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.27-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.27.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-11-03T14:55:06+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.21", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "d4ce417ebcb0b7d090b4c178ed6d3accc518e8bd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d4ce417ebcb0b7d090b4c178ed6d3accc518e8bd", - "reference": "d4ce417ebcb0b7d090b4c178ed6d3accc518e8bd", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "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": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.21" - }, - "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": "2023-02-21T19:46:44+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-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\\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/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-05-30T19:17:29+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.21", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/edac10d167b78b1d90f46a80320d632de0bd9f2f", - "reference": "edac10d167b78b1d90f46a80320d632de0bd9f2f", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "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 object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.21" - }, - "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": "2023-02-22T08:00:55+00:00" - } - ], - "packages-dev": [ - { - "name": "phpstan/phpstan", - "version": "1.10.7", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b10ceb526d9607903c5b2673f1fc8775dbe48975", - "reference": "b10ceb526d9607903c5b2673f1fc8775dbe48975", - "shasum": "" - }, - "require": { - "php": "^7.2|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "keywords": [ - "dev", - "static analysis" - ], - "support": { - "docs": "https://phpstan.org/user-guide/getting-started", - "forum": "https://github.com/phpstan/phpstan/discussions", - "issues": "https://github.com/phpstan/phpstan/issues", - "security": "https://github.com/phpstan/phpstan/security/policy", - "source": "https://github.com/phpstan/phpstan-src" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2023-03-16T15:24:20+00:00" - }, - { - "name": "phpstan/phpstan-deprecation-rules", - "version": "1.1.3", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", - "reference": "a22b36b955a2e9a3d39fe533b6c1bb5359f9c319", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-php-parser": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", - "support": { - "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.1.3" - }, - "time": "2023-03-17T07:50:08+00:00" - }, - { - "name": "phpstan/phpstan-phpunit", - "version": "1.3.10", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/4cc5c6cc38e56bce7ea47c4091814e516d172dc3", - "reference": "4cc5c6cc38e56bce7ea47c4091814e516d172dc3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" - }, - "conflict": { - "phpunit/phpunit": "<7.0" - }, - "require-dev": { - "nikic/php-parser": "^4.13.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPUnit extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.10" - }, - "time": "2023-03-02T10:25:13+00:00" - }, - { - "name": "phpstan/phpstan-strict-rules", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/b7dd96a5503919a43b3cd06a2dced9d4252492f2", - "reference": "b7dd96a5503919a43b3cd06a2dced9d4252492f2", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" - }, - "require-dev": { - "nikic/php-parser": "^4.13.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Extra strict and opinionated rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.5.0" - }, - "time": "2023-02-21T10:17:10+00:00" - }, - { - "name": "phpstan/phpstan-symfony", - "version": "1.2.23", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "8a8d0538ca943b20beda7e9799e14fb3683262d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/8a8d0538ca943b20beda7e9799e14fb3683262d4", - "reference": "8a8d0538ca943b20beda7e9799e14fb3683262d4", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.4" - }, - "conflict": { - "symfony/framework-bundle": "<3.0" - }, - "require-dev": { - "nikic/php-parser": "^4.13.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "psr/container": "1.0 || 1.1.1", - "symfony/config": "^5.4 || ^6.1", - "symfony/console": "^5.4 || ^6.1", - "symfony/dependency-injection": "^5.4 || ^6.1", - "symfony/form": "^5.4 || ^6.1", - "symfony/framework-bundle": "^5.4 || ^6.1", - "symfony/http-foundation": "^5.4 || ^6.1", - "symfony/messenger": "^5.4", - "symfony/polyfill-php80": "^1.24", - "symfony/serializer": "^5.4" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "PHPStan\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Lukáš Unger", - "email": "looky.msc@gmail.com", - "homepage": "https://lookyman.net" - } - ], - "description": "Symfony Framework extensions and rules for PHPStan", - "support": { - "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.2.23" - }, - "time": "2023-02-06T10:42:02+00:00" - }, - { - "name": "symfony/phpunit-bridge", - "version": "v6.2.7", - "source": { - "type": "git", - "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "56965fae0b6b8d271015990eff5240ffff02e185" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/56965fae0b6b8d271015990eff5240ffff02e185", - "reference": "56965fae0b6b8d271015990eff5240ffff02e185", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "conflict": { - "phpunit/phpunit": "<7.5|9.1.2" - }, - "require-dev": { - "symfony/deprecation-contracts": "^2.1|^3.0", - "symfony/error-handler": "^5.4|^6.0" - }, - "suggest": { - "symfony/error-handler": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" - }, - "bin": [ - "bin/simple-phpunit" - ], - "type": "symfony-bridge", - "extra": { - "thanks": { - "name": "phpunit/phpunit", - "url": "https://github.com/sebastianbergmann/phpunit" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Bridge\\PhpUnit\\": "" - }, - "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 utilities for PHPUnit, especially user deprecation notices management", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v6.2.7" - }, - "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": "2023-02-16T09:57:23+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^7.2.5 || ^8.0" - }, - "platform-dev": [], - "platform-overrides": { - "php": "7.2.5" - }, - "plugin-api-version": "2.3.0" -} diff --git a/app/vendor/composer/composer/doc/00-intro.md b/app/vendor/composer/composer/doc/00-intro.md deleted file mode 100644 index ad43c94f6..000000000 --- a/app/vendor/composer/composer/doc/00-intro.md +++ /dev/null @@ -1,197 +0,0 @@ -# Introduction - -Composer is a tool for dependency management in PHP. It allows you to declare -the libraries your project depends on and it will manage (install/update) them -for you. - -## Dependency management - -Composer is **not** a package manager in the same sense as Yum or Apt are. Yes, -it deals with "packages" or libraries, but it manages them on a per-project -basis, installing them in a directory (e.g. `vendor`) inside your project. By -default, it does not install anything globally. Thus, it is a dependency -manager. It does however support a "global" project for convenience via the -[global](03-cli.md#global) command. - -This idea is not new and Composer is strongly inspired by node's -[npm](https://www.npmjs.com/) and ruby's [bundler](https://bundler.io/). - -Suppose: - -1. You have a project that depends on a number of libraries. -2. Some of those libraries depend on other libraries. - -Composer: - -1. Enables you to declare the libraries you depend on. -2. Finds out which versions of which packages can and need to be installed, and - installs them (meaning it downloads them into your project). -3. You can update all your dependencies in one command. - -See the [Basic usage](01-basic-usage.md) chapter for more details on declaring -dependencies. - -## System Requirements - -Composer in its latest version requires PHP 7.2.5 to run. A long-term-support -version (2.2.x) still offers support for PHP 5.3.2+ in case you are stuck with -a legacy PHP version. A few sensitive php settings and compile flags are also -required, but when using the installer you will be warned about any -incompatibilities. - -To install packages from sources instead of plain zip archives, you will need -git, svn, fossil or hg depending on how the package is version-controlled. - -Composer is multi-platform and we strive to make it run equally well on Windows, -Linux and macOS. - -## Installation - Linux / Unix / macOS - -### Downloading the Composer Executable - -Composer offers a convenient installer that you can execute directly from the -command line. Feel free to [download this file](https://getcomposer.org/installer) -or review it on [GitHub](https://github.com/composer/getcomposer.org/blob/main/web/installer) -if you wish to know more about the inner workings of the installer. The source -is plain PHP. - -There are, in short, two ways to install Composer. Locally as part of your -project, or globally as a system wide executable. - -#### Locally - -To install Composer locally, run the installer in your project directory. See -[the Download page](https://getcomposer.org/download/) for instructions. - -The installer will check a few PHP settings and then download `composer.phar` -to your working directory. This file is the Composer binary. It is a PHAR -(PHP archive), which is an archive format for PHP which can be run on -the command line, amongst other things. - -Now run `php composer.phar` in order to run Composer. - -You can install Composer to a specific directory by using the `--install-dir` -option and additionally (re)name it as well using the `--filename` option. When -running the installer when following -[the Download page instructions](https://getcomposer.org/download/) add the -following parameters: - -```shell -php composer-setup.php --install-dir=bin --filename=composer -``` - -Now run `php bin/composer` in order to run Composer. - -#### Globally - -You can place the Composer PHAR anywhere you wish. If you put it in a directory -that is part of your `PATH`, you can access it globally. On Unix systems you -can even make it executable and invoke it without directly using the `php` -interpreter. - -After running the installer following [the Download page instructions](https://getcomposer.org/download/) -you can run this to move composer.phar to a directory that is in your path: - -```shell -mv composer.phar /usr/local/bin/composer -``` - -If you like to install it only for your user and avoid requiring root permissions, -you can use `~/.local/bin` instead which is available by default on some -Linux distributions. - -> **Note:** If the above fails due to permissions, you may need to run it again -> with `sudo`. - -> **Note:** On some versions of macOS the `/usr` directory does not exist by -> default. If you receive the error "/usr/local/bin/composer: No such file or -> directory" then you must create the directory manually before proceeding: -> `mkdir -p /usr/local/bin`. - -> **Note:** For information on changing your PATH, please read the -> [Wikipedia article](https://en.wikipedia.org/wiki/PATH_(variable)) and/or use -> your search engine of choice. - -Now run `composer` in order to run Composer instead of `php composer.phar`. - -## Installation - Windows - -### Using the Installer - -This is the easiest way to get Composer set up on your machine. - -Download and run -[Composer-Setup.exe](https://getcomposer.org/Composer-Setup.exe). It will -install the latest Composer version and set up your PATH so that you can -call `composer` from any directory in your command line. - -> **Note:** Close your current terminal. Test usage with a new terminal: This is -> important since the PATH only gets loaded when the terminal starts. - -### Manual Installation - -Change to a directory on your `PATH` and run the installer following -[the Download page instructions](https://getcomposer.org/download/) -to download `composer.phar`. - -Create a new `composer.bat` file alongside `composer.phar`: - -Using cmd.exe: - -```shell -C:\bin> echo @php "%~dp0composer.phar" %*>composer.bat -``` - -Using PowerShell: - -```shell -PS C:\bin> Set-Content composer.bat '@php "%~dp0composer.phar" %*' -``` - -Add the directory to your PATH environment variable if it isn't already. -For information on changing your PATH variable, please see -[this article](https://www.computerhope.com/issues/ch000549.htm) and/or -use your search engine of choice. - -Close your current terminal. Test usage with a new terminal: - -```shell -C:\Users\username>composer -V -``` -```text -Composer version 2.4.0 2022-08-16 16:10:48 -``` - -## Docker Image - -Composer is published as Docker container in a few places, see the list in the [composer/docker README](https://github.com/composer/docker). - -Example usage: - -```shell -docker pull composer/composer -docker run --rm -it -v "$(pwd):/app" composer/composer install -``` - -To add Composer to an existing **Dockerfile** you can simply copy binary file from pre-built, low-size images: - -```Dockerfile -# Latest release -COPY --from=composer/composer:latest-bin /composer /usr/bin/composer - -# Specific release -COPY --from=composer/composer:2-bin /composer /usr/bin/composer -``` - -Read the [image description](https://hub.docker.com/r/composer/composer) for further usage information. - -**Note:** Docker specific issues should be filed [on the composer/docker repository](https://github.com/composer/docker/issues). - -**Note:** You may also use `composer` instead of `composer/composer` as image name above. It is shorter and is a Docker official image but is not published directly by us and thus usually receives new releases with a delay of a few days. **Important**: short-aliased images don't have binary-only equivalents, so for `COPY --from` approach it's better to use `composer/composer` ones. - -## Using Composer - -Now that you've installed Composer, you are ready to use it! Head on over to the -next chapter for a short demonstration. - -[Basic usage](01-basic-usage.md) → diff --git a/app/vendor/composer/composer/doc/01-basic-usage.md b/app/vendor/composer/composer/doc/01-basic-usage.md deleted file mode 100644 index e0ac13c1c..000000000 --- a/app/vendor/composer/composer/doc/01-basic-usage.md +++ /dev/null @@ -1,279 +0,0 @@ -# Basic usage - -## Introduction - -For our basic usage introduction, we will be installing `monolog/monolog`, -a logging library. If you have not yet installed Composer, refer to the -[Intro](00-intro.md) chapter. - -> **Note:** for the sake of simplicity, this introduction will assume you -> have performed a [local](00-intro.md#locally) install of Composer. - -## `composer.json`: Project setup - -To start using Composer in your project, all you need is a `composer.json` -file. This file describes the dependencies of your project and may contain -other metadata as well. It typically should go in the top-most directory of -your project/VCS repository. You can technically run Composer anywhere but -if you want to publish a package to Packagist.org, it will have to be able -to find the file at the top of your VCS repository. - -### The `require` key - -The first thing you specify in `composer.json` is the -[`require`](04-schema.md#require) key. You are telling Composer which -packages your project depends on. - -```json -{ - "require": { - "monolog/monolog": "2.0.*" - } -} -``` - -As you can see, [`require`](04-schema.md#require) takes an object that maps -**package names** (e.g. `monolog/monolog`) to **version constraints** (e.g. -`1.0.*`). - -Composer uses this information to search for the right set of files in package -"repositories" that you register using the [`repositories`](04-schema.md#repositories) -key, or in [Packagist.org](https://packagist.org), the default package repository. -In the above example, since no other repository has been registered in the -`composer.json` file, it is assumed that the `monolog/monolog` package is registered -on Packagist.org. (Read more [about Packagist](#packagist), and -[about repositories](05-repositories.md)). - -### Package names - -The package name consists of a vendor name and the project's name. Often these -will be identical - the vendor name only exists to prevent naming clashes. For -example, it would allow two different people to create a library named `json`. -One might be named `igorw/json` while the other might be `seldaek/json`. - -Read more about [publishing packages and package naming](02-libraries.md). -(Note that you can also specify "platform packages" as dependencies, allowing -you to require certain versions of server software. See -[platform packages](#platform-packages) below.) - -### Package version constraints - -In our example, we are requesting the Monolog package with the version constraint -[`2.0.*`](https://semver.mwl.be/#?package=monolog%2Fmonolog&version=2.0.*). -This means any version in the `2.0` development branch, or any version that is -greater than or equal to 2.0 and less than 2.1 (`>=2.0 <2.1`). - -Please read [versions](articles/versions.md) for more in-depth information on -versions, how versions relate to each other, and on version constraints. - -> **How does Composer download the right files?** When you specify a dependency in -> `composer.json`, Composer first takes the name of the package that you have requested -> and searches for it in any repositories that you have registered using the -> [`repositories`](04-schema.md#repositories) key. If you have not registered -> any extra repositories, or it does not find a package with that name in the -> repositories you have specified, it falls back to Packagist.org (more [below](#packagist)). -> -> When Composer finds the right package, either in Packagist.org or in a repo you have specified, -> it then uses the versioning features of the package's VCS (i.e., branches and tags) -> to attempt to find the best match for the version constraint you have specified. Be sure to read -> about versions and package resolution in the [versions article](articles/versions.md). - -> **Note:** If you are trying to require a package but Composer throws an error -> regarding package stability, the version you have specified may not meet your -> default minimum stability requirements. By default, only stable releases are taken -> into consideration when searching for valid package versions in your VCS. -> -> You might run into this if you are trying to require dev, alpha, beta, or RC -> versions of a package. Read more about stability flags and the `minimum-stability` -> key on the [schema page](04-schema.md). - -## Installing dependencies - -To initially install the defined dependencies for your project, you should run the -[`update`](03-cli.md#update-u) command. - -```shell -php composer.phar update -``` - -This will make Composer do two things: - -- It resolves all dependencies listed in your `composer.json` file and writes all of the - packages and their exact versions to the `composer.lock` file, locking the project to - those specific versions. You should commit the `composer.lock` file to your project repo - so that all people working on the project are locked to the same versions of dependencies - (more below). This is the main role of the `update` command. -- It then implicitly runs the [`install`](03-cli.md#install-i) command. This will download - the dependencies' files into the `vendor` directory in your project. (The `vendor` - directory is the conventional location for all third-party code in a project). In our - example from above, you would end up with the Monolog source files in - `vendor/monolog/monolog/`. As Monolog has a dependency on `psr/log`, that package's files - can also be found inside `vendor/`. - -> **Tip:** If you are using git for your project, you probably want to add -> `vendor` in your `.gitignore`. You really don't want to add all of that -> third-party code to your versioned repository. - -### Commit your `composer.lock` file to version control - -Committing this file to version control is important because it will cause anyone -who sets up the project to use the exact same -versions of the dependencies that you are using. Your CI server, production -machines, other developers in your team, everything and everyone runs on the -same dependencies, which mitigates the potential for bugs affecting only some -parts of the deployments. Even if you develop alone, in six months when -reinstalling the project you can feel confident the dependencies installed are -still working even if your dependencies released many new versions since then. -(See note below about using the `update` command.) - -> **Note:** For libraries it is not necessary to commit the lock -> file, see also: [Libraries - Lock file](02-libraries.md#lock-file). - -### Installing from `composer.lock` - -If there is already a `composer.lock` file in the project folder, it means either -you ran the `update` command before, or someone else on the project ran the `update` -command and committed the `composer.lock` file to the project (which is good). - -Either way, running `install` when a `composer.lock` file is present resolves and installs -all dependencies that you listed in `composer.json`, but Composer uses the exact versions listed -in `composer.lock` to ensure that the package versions are consistent for everyone -working on your project. As a result you will have all dependencies requested by your -`composer.json` file, but they may not all be at the very latest available versions -(some of the dependencies listed in the `composer.lock` file may have released newer versions since -the file was created). This is by design, it ensures that your project does not break because of -unexpected changes in dependencies. - -So after fetching new changes from your VCS repository it is recommended to run -a Composer `install` to make sure the vendor directory is up in sync with your -`composer.lock` file. - -```shell -php composer.phar install -``` - -## Updating dependencies to their latest versions - -As mentioned above, the `composer.lock` file prevents you from automatically getting -the latest versions of your dependencies. To update to the latest versions, use the -[`update`](03-cli.md#update-u) command. This will fetch the latest matching -versions (according to your `composer.json` file) and update the lock file -with the new versions. - -```shell -php composer.phar update -``` - -> **Note:** Composer will display a Warning when executing an `install` command -> if the `composer.lock` has not been updated since changes were made to the -> `composer.json` that might affect dependency resolution. - -If you only want to install, upgrade or remove one dependency, you can explicitly list it as an argument: - -```shell -php composer.phar update monolog/monolog [...] -``` - -## Packagist - -[Packagist.org](https://packagist.org/) is the main Composer repository. A Composer -repository is basically a package source: a place where you can get packages -from. Packagist aims to be the central repository that everybody uses. This -means that you can automatically `require` any package that is available there, -without further specifying where Composer should look for the package. - -If you go to the [Packagist.org website](https://packagist.org/), -you can browse and search for packages. - -Any open source project using Composer is recommended to publish their packages -on Packagist. A library does not need to be on Packagist to be used by Composer, -but it enables discovery and adoption by other developers more quickly. - -## Platform packages - -Composer has platform packages, which are virtual packages for things that are -installed on the system but are not actually installable by Composer. This -includes PHP itself, PHP extensions and some system libraries. - -* `php` represents the PHP version of the user, allowing you to apply - constraints, e.g. `^7.1`. To require a 64bit version of php, you can - require the `php-64bit` package. - -* `hhvm` represents the version of the HHVM runtime and allows you to apply - a constraint, e.g., `^2.3`. - -* `ext-` allows you to require PHP extensions (includes core - extensions). Versioning can be quite inconsistent here, so it's often - a good idea to set the constraint to `*`. An example of an extension - package name is `ext-gd`. - -* `lib-` allows constraints to be made on versions of libraries used by - PHP. The following are available: `curl`, `iconv`, `icu`, `libxml`, - `openssl`, `pcre`, `uuid`, `xsl`. - -You can use [`show --platform`](03-cli.md#show) to get a list of your locally -available platform packages. - -## Autoloading - -For libraries that specify autoload information, Composer generates a -`vendor/autoload.php` file. You can include this file and start -using the classes that those libraries provide without any extra work: - -```php -require __DIR__ . '/vendor/autoload.php'; - -$log = new Monolog\Logger('name'); -$log->pushHandler(new Monolog\Handler\StreamHandler('app.log', Monolog\Logger::WARNING)); -$log->warning('Foo'); -``` - -You can even add your own code to the autoloader by adding an -[`autoload`](04-schema.md#autoload) field to `composer.json`. - -```json -{ - "autoload": { - "psr-4": {"Acme\\": "src/"} - } -} -``` - -Composer will register a [PSR-4](https://www.php-fig.org/psr/psr-4/) autoloader -for the `Acme` namespace. - -You define a mapping from namespaces to directories. The `src` directory would -be in your project root, on the same level as the `vendor` directory. An example -filename would be `src/Foo.php` containing an `Acme\Foo` class. - -After adding the [`autoload`](04-schema.md#autoload) field, you have to re-run -this command: - -```shell -php composer.phar dump-autoload -``` - -This command will re-generate the `vendor/autoload.php` file. -See the [`dump-autoload`](03-cli.md#dump-autoload-dumpautoload-) section for -more information. - -Including that file will also return the autoloader instance, so you can store -the return value of the include call in a variable and add more namespaces. -This can be useful for autoloading classes in a test suite, for example. - -```php -$loader = require __DIR__ . '/vendor/autoload.php'; -$loader->addPsr4('Acme\\Test\\', __DIR__); -``` - -In addition to PSR-4 autoloading, Composer also supports PSR-0, classmap and -files autoloading. See the [`autoload`](04-schema.md#autoload) reference for -more information. - -See also the docs on [optimizing the autoloader](articles/autoloader-optimization.md). - -> **Note:** Composer provides its own autoloader. If you don't want to use that -> one, you can include `vendor/composer/autoload_*.php` files, which return -> associative arrays allowing you to configure your own autoloader. - -← [Intro](00-intro.md) | [Libraries](02-libraries.md) → diff --git a/app/vendor/composer/composer/doc/02-libraries.md b/app/vendor/composer/composer/doc/02-libraries.md deleted file mode 100644 index c731f105d..000000000 --- a/app/vendor/composer/composer/doc/02-libraries.md +++ /dev/null @@ -1,153 +0,0 @@ -# Libraries - -This chapter will tell you how to make your library installable through -Composer. - -## Every project is a package - -As soon as you have a `composer.json` in a directory, that directory is a -package. When you add a [`require`](04-schema.md#require) to a project, you are -making a package that depends on other packages. The only difference between -your project and a library is that your project is a package without a name. - -In order to make that package installable you need to give it a name. You do -this by adding the [`name`](04-schema.md#name) property in `composer.json`: - -```json -{ - "name": "acme/hello-world", - "require": { - "monolog/monolog": "1.0.*" - } -} -``` - -In this case the project name is `acme/hello-world`, where `acme` is the vendor -name. Supplying a vendor name is mandatory. - -> **Note:** If you don't know what to use as a vendor name, your GitHub -> username is usually a good bet. Package names must be lowercase, and the -> convention is to use dashes for word separation. - -## Library Versioning - -In the vast majority of cases, you will be maintaining your library using some -sort of version control system like git, svn, hg or fossil. In these cases, -Composer infers versions from your VCS, and you **should not** specify a version -in your `composer.json` file. (See the [Versions article](articles/versions.md) -to learn about how Composer uses VCS branches and tags to resolve version -constraints.) - -If you are maintaining packages by hand (i.e., without a VCS), you'll need to -specify the version explicitly by adding a `version` value in your `composer.json` -file: - -```json -{ - "version": "1.0.0" -} -``` - -> **Note:** When you add a hardcoded version to a VCS, the version will conflict -> with tag names. Composer will not be able to determine the version number. - -### VCS Versioning - -Composer uses your VCS's branch and tag features to resolve the version -constraints you specify in your [`require`](04-schema.md#require) field to specific sets of files. -When determining valid available versions, Composer looks at all of your tags -and branches and translates their names into an internal list of options that -it then matches against the version constraint you provided. - -For more on how Composer treats tags and branches and how it resolves package -version constraints, read the [versions](articles/versions.md) article. - -## Lock file - -For your library you may commit the `composer.lock` file if you want to. This -can help your team to always test against the same dependency versions. -However, this lock file will not have any effect on other projects that depend -on it. It only has an effect on the main project. - -If you do not want to commit the lock file, and you are using git, add it to -the `.gitignore`. - -## Publishing to a VCS - -Once you have a VCS repository (version control system, e.g. git) containing a -`composer.json` file, your library is already composer-installable. In this -example we will publish the `acme/hello-world` library on GitHub under -`github.com/username/hello-world`. - -Now, to test installing the `acme/hello-world` package, we create a new -project locally. We will call it `acme/blog`. This blog will depend on -`acme/hello-world`, which in turn depends on `monolog/monolog`. We can -accomplish this by creating a new `blog` directory somewhere, containing a -`composer.json`: - -```json -{ - "name": "acme/blog", - "require": { - "acme/hello-world": "dev-master" - } -} -``` - -The name is not needed in this case, since we don't want to publish the blog -as a library. It is added here to clarify which `composer.json` is being -described. - -Now we need to tell the blog app where to find the `hello-world` dependency. -We do this by adding a package repository specification to the blog's -`composer.json`: - -```json -{ - "name": "acme/blog", - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/username/hello-world" - } - ], - "require": { - "acme/hello-world": "dev-master" - } -} -``` - -For more details on how package repositories work and what other types are -available, see [Repositories](05-repositories.md). - -That's all. You can now install the dependencies by running Composer's -[`install`](03-cli.md#install) command! - -**Recap:** Any git/svn/hg/fossil repository containing a `composer.json` can be -added to your project by specifying the package repository and declaring the -dependency in the [`require`](04-schema.md#require) field. - -## Publishing to packagist - -Alright, so now you can publish packages. But specifying the VCS repository -every time is cumbersome. You don't want to force all your users to do that. - -The other thing that you may have noticed is that we did not specify a package -repository for `monolog/monolog`. How did that work? The answer is Packagist. - -[Packagist](https://packagist.org/) is the main package repository for -Composer, and it is enabled by default. Anything that is published on -Packagist is available automatically through Composer. Since -[Monolog is on Packagist](https://packagist.org/packages/monolog/monolog), we -can depend on it without having to specify any additional repositories. - -If we wanted to share `hello-world` with the world, we would publish it on -Packagist as well. - -You visit [Packagist](https://packagist.org) and hit the "Submit" -button. This will prompt you to sign up if you haven't already, and then -allows you to submit the URL to your VCS repository, at which point Packagist -will start crawling it. Once it is done, your package will be available to -anyone! - -← [Basic usage](01-basic-usage.md) | [Command-line interface](03-cli.md) → diff --git a/app/vendor/composer/composer/doc/03-cli.md b/app/vendor/composer/composer/doc/03-cli.md deleted file mode 100644 index 26c66c84d..000000000 --- a/app/vendor/composer/composer/doc/03-cli.md +++ /dev/null @@ -1,1299 +0,0 @@ -# Command-line interface / Commands - -You've already learned how to use the command-line interface to do some -things. This chapter documents all the available commands. - -To get help from the command-line, call `composer` or `composer list` -to see the complete list of commands, then `--help` combined with any of those -can give you more information. - -As Composer uses [symfony/console](https://github.com/symfony/console) you can call commands by short name if it's not ambiguous. -```shell -php composer.phar dump -``` -calls `composer dump-autoload`. - -## Bash Completions - -To install bash completions you can run `composer completion bash > completion.bash`. -This will create a `completion.bash` file in the current directory. - -Then execute `source completion.bash` to enable it in the current terminal session. - -Move and rename the `completion.bash` file to `/etc/bash_completion.d/composer` to make -it load automatically in new terminals. - -## Global Options - -The following options are available with every command: - -* **--verbose (-v):** Increase verbosity of messages. -* **--help (-h):** Display help information. -* **--quiet (-q):** Do not output any message. -* **--no-interaction (-n):** Do not ask any interactive question. -* **--no-plugins:** Disables plugins. -* **--no-scripts:** Skips execution of scripts defined in `composer.json`. -* **--no-cache:** Disables the use of the cache directory. Same as setting the COMPOSER_CACHE_DIR - env var to /dev/null (or NUL on Windows). -* **--working-dir (-d):** If specified, use the given directory as working directory. -* **--profile:** Display timing and memory usage information -* **--ansi:** Force ANSI output. -* **--no-ansi:** Disable ANSI output. -* **--version (-V):** Display this application version. - -## Process Exit Codes - -* **0:** OK -* **1:** Generic/unknown error code -* **2:** Dependency solving error code - -## init - -In the [Libraries](02-libraries.md) chapter we looked at how to create a -`composer.json` by hand. There is also an `init` command available to do this. - -When you run the command it will interactively ask you to fill in the fields, -while using some smart defaults. - -```shell -php composer.phar init -``` - -### Options - -* **--name:** Name of the package. -* **--description:** Description of the package. -* **--author:** Author name of the package. -* **--type:** Type of package. -* **--homepage:** Homepage of the package. -* **--require:** Package to require with a version constraint. Should be - in format `foo/bar:1.0.0`. -* **--require-dev:** Development requirements, see **--require**. -* **--stability (-s):** Value for the `minimum-stability` field. -* **--license (-l):** License of package. -* **--repository:** Provide one (or more) custom repositories. They will be stored - in the generated composer.json, and used for auto-completion when prompting for - the list of requires. Every repository can be either an HTTP URL pointing - to a `composer` repository or a JSON string which similar to what the - [repositories](04-schema.md#repositories) key accepts. -* **--autoload (-a):** Add a PSR-4 autoload mapping to the composer.json. Automatically maps your package's namespace to the provided directory. (Expects a relative path, e.g. src/) See also [PSR-4 autoload](04-schema.md#psr-4). - -## install / i - -The `install` command reads the `composer.json` file from the current -directory, resolves the dependencies, and installs them into `vendor`. - -```shell -php composer.phar install -``` - -If there is a `composer.lock` file in the current directory, it will use the -exact versions from there instead of resolving them. This ensures that -everyone using the library will get the same versions of the dependencies. - -If there is no `composer.lock` file, Composer will create one after dependency -resolution. - -### Options - -* **--prefer-install:** There are two ways of downloading a package: `source` - and `dist`. Composer uses `dist` by default. If you pass - `--prefer-install=source` (or `--prefer-source`) Composer will install from - `source` if there is one. This is useful if you want to make a bugfix to a - project and get a local git clone of the dependency directly. - To get the legacy behavior where Composer use `source` automatically for dev - versions of packages, use `--prefer-install=auto`. See also [config.preferred-install](06-config.md#preferred-install). - Passing this flag will override the config value. -* **--dry-run:** If you want to run through an installation without actually - installing a package, you can use `--dry-run`. This will simulate the - installation and show you what would happen. -* **--download-only:** Download only, do not install packages. -* **--dev:** Install packages listed in `require-dev` (this is the default behavior). -* **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader - generation skips the `autoload-dev` rules. Also see [COMPOSER_NO_DEV](#composer-no-dev). -* **--no-autoloader:** Skips autoloader generation. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--audit:** Run an audit after installation is complete. -* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster - autoloader. This is recommended especially for production, but can take - a bit of time to run so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize-autoloader`. -* **--apcu-autoloader:** Use APCu to cache found/not-found classes. -* **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu-autoloader`. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. Appending - a `+` makes it only ignore the upper-bound of the requirements. For example, if a package - requires `php: ^7`, then the option `--ignore-platform-req=php+` would allow installing on PHP 8, - but installation on PHP 5.6 would still fail. - -## update / u / upgrade - -In order to get the latest versions of the dependencies and to update the -`composer.lock` file, you should use the `update` command. This command is also -aliased as `upgrade` as it does the same as `upgrade` does if you are thinking -of `apt-get` or similar package managers. - -```shell -php composer.phar update -``` - -This will resolve all dependencies of the project and write the exact versions -into `composer.lock`. - -If you only want to update a few packages and not all, you can list them as such: - -```shell -php composer.phar update vendor/package vendor/package2 -``` - -You can also use wildcards to update a bunch of packages at once: - -```shell -php composer.phar update "vendor/*" -``` - - -If you want to downgrade a package to a specific version without changing your -composer.json you can use `--with` and provide a custom version constraint: - -```shell -php composer.phar update --with vendor/package:2.0.1 -``` - -Note that with the above all packages will be updated. If you only want to -update the package(s) for which you provide custom constraints using `--with`, -you can skip `--with` and instead use constraints with the partial update syntax: - -```shell -php composer.phar update vendor/package:2.0.1 vendor/package2:3.0.* -``` - -> **Note:** For packages also required in your composer.json the custom constraint -> must be a subset of the existing constraint. The composer.json constraints still -> apply and the composer.json is not modified by these temporary update constraints. - - -### Options - -* **--prefer-install:** There are two ways of downloading a package: `source` - and `dist`. Composer uses `dist` by default. If you pass - `--prefer-install=source` (or `--prefer-source`) Composer will install from - `source` if there is one. This is useful if you want to make a bugfix to a - project and get a local git clone of the dependency directly. - To get the legacy behavior where Composer use `source` automatically for dev - versions of packages, use `--prefer-install=auto`. See also [config.preferred-install](06-config.md#preferred-install). - Passing this flag will override the config value. -* **--dry-run:** Simulate the command without actually doing anything. -* **--dev:** Install packages listed in `require-dev` (this is the default behavior). -* **--no-dev:** Skip installing packages listed in `require-dev`. The autoloader generation skips the `autoload-dev` rules. Also see [COMPOSER_NO_DEV](#composer-no-dev). -* **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after updating the composer.lock file. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). -* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--lock:** Only updates the lock file hash to suppress warning about the - lock file being out of date. -* **--with:** Temporary version constraint to add, e.g. foo/bar:1.0.0 or foo/bar=1.0.0 -* **--no-autoloader:** Skips autoloader generation. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--with-dependencies (-w):** Update also dependencies of packages in the argument list, except those which are root requirements. -* **--with-all-dependencies (-W):** Update also dependencies of packages in the argument list, including those which are root requirements. -* **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster - autoloader. This is recommended especially for production, but can take - a bit of time to run, so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize-autoloader`. -* **--apcu-autoloader:** Use APCu to cache found/not-found classes. -* **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu-autoloader`. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. Appending - a `+` makes it only ignore the upper-bound of the requirements. For example, if a package - requires `php: ^7`, then the option `--ignore-platform-req=php+` would allow installing on PHP 8, - but installation on PHP 5.6 would still fail. -* **--prefer-stable:** Prefer stable versions of dependencies. Can also be set via the - COMPOSER_PREFER_STABLE=1 env var. -* **--prefer-lowest:** Prefer lowest versions of dependencies. Useful for testing minimal - versions of requirements, generally used with `--prefer-stable`. Can also be set via the - COMPOSER_PREFER_LOWEST=1 env var. -* **--interactive:** Interactive interface with autocompletion to select the packages to update. -* **--root-reqs:** Restricts the update to your first degree dependencies. - -Specifying one of the words `mirrors`, `lock`, or `nothing` as an argument has the same effect as specifying the option `--lock`, for example `composer update mirrors` is exactly the same as `composer update --lock`. - -## require / r - -The `require` command adds new packages to the `composer.json` file from -the current directory. If no file exists one will be created on the fly. - -```shell -php composer.phar require -``` - -After adding/changing the requirements, the modified requirements will be -installed or updated. - -If you do not want to choose requirements interactively, you can pass them -to the command. - -```shell -php composer.phar require "vendor/package:2.*" vendor/package2:dev-master -``` - -If you do not specify a package, Composer will prompt you to search for a package, and given results, provide a list of matches to require. - -### Options - -* **--dev:** Add packages to `require-dev`. -* **--dry-run:** Simulate the command without actually doing anything. -* **--prefer-install:** There are two ways of downloading a package: `source` - and `dist`. Composer uses `dist` by default. If you pass - `--prefer-install=source` (or `--prefer-source`) Composer will install from - `source` if there is one. This is useful if you want to make a bugfix to a - project and get a local git clone of the dependency directly. - To get the legacy behavior where Composer use `source` automatically for dev - versions of packages, use `--prefer-install=auto`. See also [config.preferred-install](06-config.md#preferred-install). - Passing this flag will override the config value. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--no-update:** Disables the automatic update of the dependencies (implies --no-install). -* **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after updating the composer.lock file. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). -* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--update-no-dev:** Run the dependency update with the `--no-dev` option. Also see [COMPOSER_NO_DEV](#composer-no-dev). -* **--update-with-dependencies (-w):** Also update dependencies of the newly required packages, except those that are root requirements. -* **--update-with-all-dependencies (-W):** Also update dependencies of the newly required packages, including those that are root requirements. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. -* **--prefer-stable:** Prefer stable versions of dependencies. Can also be set via the - COMPOSER_PREFER_STABLE=1 env var. -* **--prefer-lowest:** Prefer lowest versions of dependencies. Useful for testing minimal - versions of requirements, generally used with `--prefer-stable`. Can also be set via the - COMPOSER_PREFER_LOWEST=1 env var. -* **--sort-packages:** Keep packages sorted in `composer.json`. -* **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to - get a faster autoloader. This is recommended especially for production, but - can take a bit of time to run, so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize-autoloader`. -* **--apcu-autoloader:** Use APCu to cache found/not-found classes. -* **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu-autoloader`. - -## remove - -The `remove` command removes packages from the `composer.json` file from -the current directory. - -```shell -php composer.phar remove vendor/package vendor/package2 -``` - -After removing the requirements, the modified requirements will be -uninstalled. - -### Options - -* **--unused** Remove unused packages that are not a direct or indirect dependency (anymore) -* **--dev:** Remove packages from `require-dev`. -* **--dry-run:** Simulate the command without actually doing anything. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--no-update:** Disables the automatic update of the dependencies (implies --no-install). -* **--no-install:** Does not run the install step after updating the composer.lock file. -* **--no-audit:** Does not run the audit steps after installation is complete. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). -* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--update-no-dev:** Run the dependency update with the --no-dev option. Also see [COMPOSER_NO_DEV](#composer-no-dev). -* **--update-with-dependencies (-w):** Also update dependencies of the removed packages. - (Deprecated, is now default behavior) -* **--update-with-all-dependencies (-W):** Allows all inherited dependencies to be updated, - including those that are root requirements. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. -* **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to - get a faster autoloader. This is recommended especially for production, but - can take a bit of time to run so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize-autoloader`. -* **--apcu-autoloader:** Use APCu to cache found/not-found classes. -* **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu-autoloader`. - -## bump - -The `bump` command increases the lower limit of your composer.json requirements -to the currently installed versions. This helps to ensure your dependencies do not -accidentally get downgraded due to some other conflict, and can slightly improve -dependency resolution performance as it limits the amount of package versions -Composer has to look at. - -Running this blindly on libraries is **NOT** recommended as it will narrow down -your allowed dependencies, which may cause dependency hell for your users. -Running it with `--dev-only` on libraries may be fine however as dev requirements -are local to the library and do not affect consumers of the package. - -### Options - -* **--dev-only:** Only bump requirements in "require-dev". -* **--no-dev-only:** Only bump requirements in "require". -* **--dry-run:** Outputs the packages to bump, but will not execute anything. - -## reinstall - -The `reinstall` command looks up installed packages by name, -uninstalls them and reinstalls them. This lets you do a clean install -of a package if you messed with its files, or if you wish to change -the installation type using --prefer-install. - -```shell -php composer.phar reinstall acme/foo acme/bar -``` - -You can specify more than one package name to reinstall, or use a -wildcard to select several packages at once: - -```shell -php composer.phar reinstall "acme/*" -``` - -### Options - -* **--prefer-install:** There are two ways of downloading a package: `source` - and `dist`. Composer uses `dist` by default. If you pass - `--prefer-install=source` (or `--prefer-source`) Composer will install from - `source` if there is one. This is useful if you want to make a bugfix to a - project and get a local git clone of the dependency directly. - To get the legacy behavior where Composer use `source` automatically for dev - versions of packages, use `--prefer-install=auto`. See also [config.preferred-install](06-config.md#preferred-install). - Passing this flag will override the config value. -* **--no-autoloader:** Skips autoloader generation. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--optimize-autoloader (-o):** Convert PSR-0/4 autoloading to classmap to get a faster - autoloader. This is recommended especially for production, but can take - a bit of time to run so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize-autoloader`. -* **--apcu-autoloader:** Use APCu to cache found/not-found classes. -* **--apcu-autoloader-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu-autoloader`. -* **--ignore-platform-reqs:** ignore all platform requirements. This only - has an effect in the context of the autoloader generation for the - reinstall command. -* **--ignore-platform-req:** ignore a specific platform requirement. This only - has an effect in the context of the autoloader generation for the - reinstall command. Multiple requirements can be ignored via wildcard. - -## check-platform-reqs - -The check-platform-reqs command checks that your PHP and extensions versions -match the platform requirements of the installed packages. This can be used -to verify that a production server has all the extensions needed to run a -project after installing it for example. - -Unlike update/install, this command will ignore config.platform settings and -check the real platform packages so you can be certain you have the required -platform dependencies. - -### Options - -* **--lock:** Checks requirements only from the lock file, not from installed packages. -* **--no-dev:** Disables checking of require-dev packages requirements. -* **--format (-f):** Format of the output: text (default) or json - -## global - -The global command allows you to run other commands like `install`, `remove`, `require` -or `update` as if you were running them from the [COMPOSER_HOME](#composer-home) -directory. - -This is merely a helper to manage a project stored in a central location that -can hold CLI tools or Composer plugins that you want to have available everywhere. - -This can be used to install CLI utilities globally. Here is an example: - -```shell -php composer.phar global require friendsofphp/php-cs-fixer -``` - -Now the `php-cs-fixer` binary is available globally. Make sure your global -[vendor binaries](articles/vendor-binaries.md) directory is in your `$PATH` -environment variable, you can get its location with the following command : - -```shell -php composer.phar global config bin-dir --absolute -``` - -If you wish to update the binary later on you can run a global update: - -```shell -php composer.phar global update -``` - -## search - -The search command allows you to search through the current project's package -repositories. Usually this will be packagist. You pass it the terms you want -to search for. - -```shell -php composer.phar search monolog -``` - -You can also search for more than one term by passing multiple arguments. - -### Options - -* **--only-name (-N):** Search only in package names. -* **--only-vendor (-O):** Search only for vendor / organization names, returns only "vendor" - as a result. -* **--type (-t):** Search for a specific package type. -* **--format (-f):** Lets you pick between text (default) or json output format. - Note that in the json, only the name and description keys are guaranteed to be - present. The rest (`url`, `repository`, `downloads` and `favers`) are available - for Packagist.org search results and other repositories may return more or less - data. - -## show / info - -To list all of the available packages, you can use the `show` command. - -```shell -php composer.phar show -``` - -To filter the list you can pass a package mask using wildcards. - -```shell -php composer.phar show "monolog/*" -``` -```text -monolog/monolog 2.4.0 Sends your logs to files, sockets, inboxes, databases and various web services -``` - -If you want to see the details of a certain package, you can pass the package -name. - -```shell -php composer.phar show monolog/monolog -``` -```text -name : monolog/monolog -descrip. : Sends your logs to files, sockets, inboxes, databases and various web services -keywords : log, logging, psr-3 -versions : * 1.27.1 -type : library -license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText -homepage : http://github.com/Seldaek/monolog -source : [git] https://github.com/Seldaek/monolog.git 904713c5929655dc9b97288b69cfeedad610c9a1 -dist : [zip] https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1 904713c5929655dc9b97288b69cfeedad610c9a1 -names : monolog/monolog, psr/log-implementation - -support -issues : https://github.com/Seldaek/monolog/issues -source : https://github.com/Seldaek/monolog/tree/1.27.1 - -autoload -psr-4 -Monolog\ => src/Monolog - -requires -php >=5.3.0 -psr/log ~1.0 -``` - -You can even pass the package version, which will tell you the details of that -specific version. - -```shell -php composer.phar show monolog/monolog 1.0.2 -``` - -### Options - -* **--all:** List all packages available in all your repositories. -* **--installed (-i):** List the packages that are installed (this is enabled by default, and deprecated). -* **--locked:** List the locked packages from composer.lock. -* **--platform (-p):** List only platform packages (php & extensions). -* **--available (-a):** List available packages only. -* **--self (-s):** List the root package info. -* **--name-only (-N):** List package names only. -* **--path (-P):** List package paths. -* **--tree (-t):** List your dependencies as a tree. If you pass a package name it will show the dependency tree for that package. -* **--latest (-l):** List all installed packages including their latest version. -* **--outdated (-o):** Implies --latest, but this lists *only* packages that have a newer version available. -* **--ignore:** Ignore specified package(s). Use it with the --outdated option if you don't want to be informed about new versions of some packages -* **--no-dev:** Filters dev dependencies from the package list. -* **--major-only (-M):** Use with --latest or --outdated. Only shows packages that have major SemVer-compatible updates. -* **--minor-only (-m):** Use with --latest or --outdated. Only shows packages that have minor SemVer-compatible updates. -* **--patch-only:** Use with --latest or --outdated. Only shows packages that have patch-level SemVer-compatible updates. -* **--direct (-D):** Restricts the list of packages to your direct dependencies. -* **--strict:** Return a non-zero exit code when there are outdated packages. -* **--format (-f):** Lets you pick between text (default) or json output format. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. Use with the --outdated option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. Use with - the --outdated option. - -## outdated - -The `outdated` command shows a list of installed packages that have updates available, -including their current and latest versions. This is basically an alias for -`composer show -lo`. - -The color coding is as such: - -- **green (=)**: Dependency is in the latest version and is up to date. -- **yellow (`~`)**: Dependency has a new version available that includes backwards compatibility breaks according to semver, so upgrade when - you can but it may involve work. -- **red (!)**: Dependency has a new version that is semver-compatible and you should upgrade it. - -### Options - -* **--all (-a):** Show all packages, not just outdated (alias for `composer show --latest`). -* **--direct (-D):** Restricts the list of packages to your direct dependencies. -* **--strict:** Returns non-zero exit code if any package is outdated. -* **--ignore:** Ignore specified package(s). Use it if you don't want to be informed about new versions of some packages -* **--major-only (-M):** Only shows packages that have major SemVer-compatible updates. -* **--minor-only (-m):** Only shows packages that have minor SemVer-compatible updates. -* **--patch-only (-p):** Only shows packages that have patch-level SemVer-compatible updates. -* **--format (-f):** Lets you pick between text (default) or json output format. -* **--no-dev:** Do not show outdated dev dependencies. -* **--locked:** Shows updates for packages from the lock file, regardless of what is currently in vendor dir. -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. - -## browse / home - -The `browse` (aliased to `home`) opens a package's repository URL or homepage -in your browser. - -### Options - -* **--homepage (-H):** Open the homepage instead of the repository URL. -* **--show (-s):** Only show the homepage or repository URL. - -## suggests - -Lists all packages suggested by the currently installed set of packages. You can -optionally pass one or multiple package names in the format of `vendor/package` -to limit output to suggestions made by those packages only. - -Use the `--by-package` (default) or `--by-suggestion` flags to group the output by -the package offering the suggestions or the suggested packages respectively. - -If you only want a list of suggested package names, use `--list`. - -### Options - -* **--by-package:** Groups output by suggesting package (default). -* **--by-suggestion:** Groups output by suggested package. -* **--all:** Show suggestions from all dependencies, including transitive ones (by - default only direct dependencies' suggestions are shown). -* **--list:** Show only list of suggested package names. -* **--no-dev:** Excludes suggestions from `require-dev` packages. - -## fund - -Discover how to help fund the maintenance of your dependencies. This lists -all funding links from the installed dependencies. Use `--format=json` to -get machine-readable output. - -### Options - -* **--format (-f):** Lets you pick between text (default) or json output format. - -## depends / why - -The `depends` command tells you which other packages depend on a certain -package. As with installation `require-dev` relationships are only considered -for the root package. - -```shell -php composer.phar depends doctrine/lexer -``` -```text -doctrine/annotations 1.13.3 requires doctrine/lexer (1.*) -doctrine/common 2.13.3 requires doctrine/lexer (^1.0) -``` - -You can optionally specify a version constraint after the package to limit the -search. - -Add the `--tree` or `-t` flag to show a recursive tree of why the package is -depended upon, for example: - -```shell -php composer.phar depends psr/log -t -``` -```text -psr/log 1.1.4 Common interface for logging libraries -├──composer/composer 2.4.x-dev (requires psr/log ^1.0 || ^2.0 || ^3.0) -├──composer/composer dev-main (requires psr/log ^1.0 || ^2.0 || ^3.0) -├──composer/xdebug-handler 3.0.3 (requires psr/log ^1 || ^2 || ^3) -│ ├──composer/composer 2.4.x-dev (requires composer/xdebug-handler ^2.0.2 || ^3.0.3) -│ └──composer/composer dev-main (requires composer/xdebug-handler ^2.0.2 || ^3.0.3) -└──symfony/console v5.4.11 (conflicts psr/log >=3) (circular dependency aborted here) -``` - -### Options - -* **--recursive (-r):** Recursively resolves up to the root package. -* **--tree (-t):** Prints the results as a nested tree, implies -r. - -## prohibits / why-not - -The `prohibits` command tells you which packages are blocking a given package -from being installed. Specify a version constraint to verify whether upgrades -can be performed in your project, and if not why not. See the following -example: - -```shell -php composer.phar prohibits symfony/symfony 3.1 -``` -```text -laravel/framework v5.2.16 requires symfony/var-dumper (2.8.*|3.0.*) -``` - -Note that you can also specify platform requirements, for example to check -whether you can upgrade your server to PHP 8.0: - -```shell -php composer.phar prohibits php 8 -``` -```text -doctrine/cache v1.6.0 requires php (~5.5|~7.0) -doctrine/common v2.6.1 requires php (~5.5|~7.0) -doctrine/instantiator 1.0.5 requires php (>=5.3,<8.0-DEV) -``` - -As with `depends` you can request a recursive lookup, which will list all -packages depending on the packages that cause the conflict. - -### Options - -* **--recursive (-r):** Recursively resolves up to the root package. -* **--tree (-t):** Prints the results as a nested tree, implies -r. - -## validate - -You should always run the `validate` command before you commit your -`composer.json` file, and before you tag a release. It will check if your -`composer.json` is valid. - -```shell -php composer.phar validate -``` - -### Options - -* **--no-check-all:** Do not emit a warning if requirements in `composer.json` use unbound or overly strict version constraints. -* **--no-check-lock:** Do not emit an error if `composer.lock` exists and is not up to date. -* **--no-check-publish:** Do not emit an error if `composer.json` is unsuitable for publishing as a package on Packagist but is otherwise valid. -* **--with-dependencies:** Also validate the composer.json of all installed dependencies. -* **--strict:** Return a non-zero exit code for warnings as well as errors. - -## status - -If you often need to modify the code of your dependencies and they are -installed from source, the `status` command allows you to check if you have -local changes in any of them. - -```shell -php composer.phar status -``` - -With the `--verbose` option you get some more information about what was -changed: - -```shell -php composer.phar status -v -``` -```text -You have changes in the following dependencies: -vendor/seld/jsonlint: - M README.mdown -``` - -## self-update / selfupdate - -To update Composer itself to the latest version, run the `self-update` -command. It will replace your `composer.phar` with the latest version. - -```shell -php composer.phar self-update -``` - -If you would like to instead update to a specific release specify it: - -```shell -php composer.phar self-update 2.4.0-RC1 -``` - -If you have installed Composer for your entire system (see [global installation](00-intro.md#globally)), -you may have to run the command with `root` privileges - -```shell -sudo -H composer self-update -``` - -If Composer was not installed as a PHAR, this command is not available. -(This is sometimes the case when Composer was installed by an operating system package manager.) - -### Options - -* **--rollback (-r):** Rollback to the last version you had installed. -* **--clean-backups:** Delete old backups during an update. This makes the - current version of Composer the only backup available after the update. -* **--no-progress:** Do not output download progress. -* **--update-keys:** Prompt user for a key update. -* **--stable:** Force an update to the stable channel. -* **--preview:** Force an update to the preview channel. -* **--snapshot:** Force an update to the snapshot channel. -* **--1:** Force an update to the stable channel, but only use 1.x versions -* **--2:** Force an update to the stable channel, but only use 2.x versions -* **--set-channel-only:** Only store the channel as the default one and then exit - -## config - -The `config` command allows you to edit Composer config settings and repositories -in either the local `composer.json` file or the global `config.json` file. - -Additionally it lets you edit most properties in the local `composer.json`. - -```shell -php composer.phar config --list -``` - -### Usage - -`config [options] [setting-key] [setting-value1] ... [setting-valueN]` - -`setting-key` is a configuration option name and `setting-value1` is a -configuration value. For settings that can take an array of values (like -`github-protocols`), multiple setting-value arguments are allowed. - -You can also edit the values of the following properties: - -`description`, `homepage`, `keywords`, `license`, `minimum-stability`, -`name`, `prefer-stable`, `type` and `version`. - -See the [Config](06-config.md) chapter for valid configuration options. - -### Options - -* **--global (-g):** Operate on the global config file located at - `$COMPOSER_HOME/config.json` by default. Without this option, this command - affects the local composer.json file or a file specified by `--file`. -* **--editor (-e):** Open the local composer.json file using in a text editor as - defined by the `EDITOR` env variable. With the `--global` option, this opens - the global config file. -* **--auth (-a):** Affect auth config file (only used for --editor). -* **--unset:** Remove the configuration element named by `setting-key`. -* **--list (-l):** Show the list of current config variables. With the `--global` - option this lists the global configuration only. -* **--file="..." (-f):** Operate on a specific file instead of composer.json. Note - that this cannot be used in conjunction with the `--global` option. -* **--absolute:** Returns absolute paths when fetching `*-dir` config values - instead of relative. -* **--json:** JSON decode the setting value, to be used with `extra.*` keys. -* **--merge:** Merge the setting value with the current value, to be used with `extra.*` keys in combination with `--json`. -* **--append:** When adding a repository, append it (lowest priority) to the existing ones instead of prepending it (highest priority). -* **--source:** Display where the config value is loaded from. - -### Modifying Repositories - -In addition to modifying the config section, the `config` command also supports making -changes to the repositories section by using it the following way: - -```shell -php composer.phar config repositories.foo vcs https://github.com/foo/bar -``` - -If your repository requires more configuration options, you can instead pass its JSON representation : - -```shell -php composer.phar config repositories.foo '{"type": "vcs", "url": "http://svn.example.org/my-project/", "trunk-path": "master"}' -``` - -### Modifying Extra Values - -In addition to modifying the config section, the `config` command also supports making -changes to the extra section by using it the following way: - -```shell -php composer.phar config extra.foo.bar value -``` - -The dots indicate array nesting, a max depth of 3 levels is allowed though. The above -would set `"extra": { "foo": { "bar": "value" } }`. - -If you have a complex value to add/modify, you can use the `--json` and `--merge` flags -to edit extra fields as json: - -```shell -php composer.phar config --json extra.foo.bar '{"baz": true, "qux": []}' -``` - -## create-project - -You can use Composer to create new projects from an existing package. This is -the equivalent of doing a git clone/svn checkout followed by a `composer install` -of the vendors. - -There are several applications for this: - -1. You can deploy application packages. -2. You can check out any package and start developing on patches for example. -3. Projects with multiple developers can use this feature to bootstrap the - initial application for development. - -To create a new project using Composer you can use the `create-project` command. -Pass it a package name, and the directory to create the project in. You can also -provide a version as a third argument, otherwise the latest version is used. - -If the directory does not currently exist, it will be created during installation. - -```shell -php composer.phar create-project doctrine/orm path "2.2.*" -``` - -It is also possible to run the command without params in a directory with an -existing `composer.json` file to bootstrap a project. - -By default the command checks for the packages on packagist.org. - -### Options - -* **--stability (-s):** Minimum stability of package. Defaults to `stable`. -* **--prefer-install:** There are two ways of downloading a package: `source` - and `dist`. Composer uses `dist` by default. If you pass - `--prefer-install=source` (or `--prefer-source`) Composer will install from - `source` if there is one. This is useful if you want to make a bugfix to a - project and get a local git clone of the dependency directly. - To get the legacy behavior where Composer use `source` automatically for dev - versions of packages, use `--prefer-install=auto`. See also [config.preferred-install](06-config.md#preferred-install). - Passing this flag will override the config value. -* **--repository:** Provide a custom repository to search for the package, - which will be used instead of packagist. Can be either an HTTP URL pointing - to a `composer` repository, a path to a local `packages.json` file, or a - JSON string which similar to what the [repositories](04-schema.md#repositories) - key accepts. You can use this multiple times to configure multiple repositories. -* **--add-repository:** Add the custom repository in the composer.json. If a lock - file is present, it will be deleted and an update will be run instead of an install. -* **--dev:** Install packages listed in `require-dev`. -* **--no-dev:** Disables installation of require-dev packages. -* **--no-scripts:** Disables the execution of the scripts defined in the root - package. -* **--no-progress:** Removes the progress display that can mess with some - terminals or scripts which don't handle backspace characters. -* **--no-secure-http:** Disable the secure-http config option temporarily while - installing the root package. Use at your own risk. Using this flag is a bad - idea. -* **--keep-vcs:** Skip the deletion of the VCS metadata for the created - project. This is mostly useful if you run the command in non-interactive - mode. -* **--remove-vcs:** Force-remove the VCS metadata without prompting. -* **--no-install:** Disables installation of the vendors. -* **--no-audit:** Does not run the audit steps after installation is complete. Also see [COMPOSER_NO_AUDIT](#composer-no-audit). -* **--audit-format:** Audit output format. Must be "table", "plain", "json", or "summary" (default). -* **--ignore-platform-reqs:** ignore all platform requirements (`php`, `hhvm`, - `lib-*` and `ext-*`) and force the installation even if the local machine does - not fulfill these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement(`php`, - `hhvm`, `lib-*` and `ext-*`) and force the installation even if the local machine - does not fulfill it. Multiple requirements can be ignored via wildcard. -* **--ask:** Ask the user to provide a target directory for the new project. - -## dump-autoload / dumpautoload - -If you need to update the autoloader because of new classes in a classmap -package for example, you can use `dump-autoload` to do that without having to -go through an install or update. - -Additionally, it can dump an optimized autoloader that converts PSR-0/4 packages -into classmap ones for performance reasons. In large applications with many -classes, the autoloader can take up a substantial portion of every request's -time. Using classmaps for everything is less convenient in development, but -using this option you can still use PSR-0/4 for convenience and classmaps for -performance. - -### Options -* **--optimize (-o):** Convert PSR-0/4 autoloading to classmap to get a faster - autoloader. This is recommended especially for production, but can take - a bit of time to run, so it is currently not done by default. -* **--classmap-authoritative (-a):** Autoload classes from the classmap only. - Implicitly enables `--optimize`. -* **--apcu:** Use APCu to cache found/not-found classes. -* **--apcu-prefix:** Use a custom prefix for the APCu autoloader cache. - Implicitly enables `--apcu`. -* **--no-dev:** Disables autoload-dev rules. Composer will by default infer this - automatically according to the last `install` or `update` `--no-dev` state. -* **--dev:** Enables autoload-dev rules. Composer will by default infer this - automatically according to the last `install` or `update` `--no-dev` state. -* **--ignore-platform-reqs:** ignore all `php`, `hhvm`, `lib-*` and `ext-*` - requirements and skip the [platform check](07-runtime.md#platform-check) for these. - See also the [`platform`](06-config.md#platform) config option. -* **--ignore-platform-req:** ignore a specific platform requirement (`php`, `hhvm`, - `lib-*` and `ext-*`) and skip the [platform check](07-runtime.md#platform-check) for it. - Multiple requirements can be ignored via wildcard. -* **--strict-psr:** Return a failed status code (1) if PSR-4 or PSR-0 mapping errors - are present. Requires --optimize to work. - -## clear-cache / clearcache / cc - -Deletes all content from Composer's cache directories. - -### Options - -* **--gc:** Only run garbage collection, not a full cache clear - -## licenses - -Lists the name, version and license of every package installed. Use -`--format=json` to get machine-readable output. - -### Options - -* **--format:** Format of the output: text, json or summary (default: "text") -* **--no-dev:** Remove dev dependencies from the output - -## run-script / run - -### Options - -* **--timeout:** Set the script timeout in seconds, or 0 for no timeout. -* **--dev:** Sets the dev mode. -* **--no-dev:** Disable dev mode. -* **--list (-l):** List user defined scripts. - -To run [scripts](articles/scripts.md) manually you can use this command, -give it the script name and optionally any required arguments. - -## exec - -Executes a vendored binary/script. You can execute any command and this will -ensure that the Composer bin-dir is pushed on your PATH before the command -runs. - -### Options - -* **--list (-l):** List the available Composer binaries. - -## diagnose - -If you think you found a bug, or something is behaving strangely, you might -want to run the `diagnose` command to perform automated checks for many common -problems. - -```shell -php composer.phar diagnose -``` - -## archive - -This command is used to generate a zip/tar archive for a given package in a -given version. It can also be used to archive your entire project without -excluded/ignored files. - -```shell -php composer.phar archive vendor/package 2.0.21 --format=zip -``` - -### Options - -* **--format (-f):** Format of the resulting archive: tar, tar.gz, tar.bz2 - or zip (default: "tar"). -* **--dir:** Write the archive to this directory (default: ".") -* **--file:** Write the archive with the given file name. - -## audit - -This command is used to audit the packages you have installed -for possible security issues. It checks for and -lists security vulnerability advisories according to the -[Packagist.org api](https://packagist.org/apidoc#list-security-advisories). - -The audit command returns the amount of vulnerabilities found. `0` if successful, and up to `255` otherwise. - -```shell -php composer.phar audit -``` - -### Options - -* **--no-dev:** Disables auditing of require-dev packages. -* **--format (-f):** Audit output format. Must be "table" (default), "plain", "json", or "summary". -* **--locked:** Audit packages from the lock file, regardless of what is currently in vendor dir. - -## help - -To get more information about a certain command, you can use `help`. - -```shell -php composer.phar help install -``` - -## Command-line completion - -Command-line completion can be enabled by following instructions -[on this page](https://github.com/bamarni/symfony-console-autocomplete). - -## Environment variables - -You can set a number of environment variables that override certain settings. -Whenever possible it is recommended to specify these settings in the `config` -section of `composer.json` instead. It is worth noting that the env vars will -always take precedence over the values specified in `composer.json`. - -### COMPOSER - -By setting the `COMPOSER` env variable it is possible to set the filename of -`composer.json` to something else. - -For example: - -```shell -COMPOSER=composer-other.json php composer.phar install -``` - -The generated lock file will use the same name: `composer-other.lock` in this example. - -### COMPOSER_ALLOW_SUPERUSER - -If set to 1, this env disables the warning about running commands as root/super user. -It also disables automatic clearing of sudo sessions, so you should really only set this -if you use Composer as a super user at all times like in docker containers. - -### COMPOSER_ALLOW_XDEBUG - -If set to 1, this env allows running Composer when the Xdebug extension is enabled, without restarting PHP without it. - -### COMPOSER_AUTH - -The `COMPOSER_AUTH` var allows you to set up authentication as an environment variable. -The contents of the variable should be a JSON formatted object containing [http-basic, -github-oauth, bitbucket-oauth, ... objects as needed](articles/authentication-for-private-packages.md), -and following the -[spec from the config](06-config.md). - -### COMPOSER_BIN_DIR - -By setting this option you can change the `bin` ([Vendor Binaries](articles/vendor-binaries.md)) -directory to something other than `vendor/bin`. - -### COMPOSER_CACHE_DIR - -The `COMPOSER_CACHE_DIR` var allows you to change the Composer cache directory, -which is also configurable via the [`cache-dir`](06-config.md#cache-dir) option. - -By default, it points to `C:\Users\\AppData\Local\Composer` (or `%LOCALAPPDATA%/Composer`) on Windows. -On \*nix systems that follow the [XDG Base -Directory Specifications](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html), -it points to `$XDG_CACHE_HOME/composer`. On other \*nix systems and on macOS, it points to -`$COMPOSER_HOME/cache`. - -### COMPOSER_CAFILE - -By setting this environmental value, you can set a path to a certificate bundle -file to be used during SSL/TLS peer verification. - -### COMPOSER_DISABLE_XDEBUG_WARN - -If set to 1, this env suppresses a warning when Composer is running with the Xdebug extension enabled. - -### COMPOSER_DISCARD_CHANGES - -This env var controls the [`discard-changes`](06-config.md#discard-changes) config option. - -### COMPOSER_HOME - -The `COMPOSER_HOME` var allows you to change the Composer home directory. This -is a hidden, global (per-user on the machine) directory that is shared between -all projects. - -Use `composer config --global home` to see the location of the home directory. - -By default, it points to `C:\Users\\AppData\Roaming\Composer` on Windows -and `/Users//.composer` on macOS. On \*nix systems that follow the [XDG Base -Directory Specifications](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html), -it points to `$XDG_CONFIG_HOME/composer`. On other \*nix systems, it points to -`/home//.composer`. - -#### COMPOSER_HOME/config.json - -You may put a `config.json` file into the location which `COMPOSER_HOME` points -to. Composer will partially (only `config` and `repositories` keys) merge this -configuration with your project's `composer.json` when you run the `install` and -`update` commands. - -This file allows you to set [repositories](05-repositories.md) and -[configuration](06-config.md) for the user's projects. - -In case global configuration matches _local_ configuration, the _local_ -configuration in the project's `composer.json` always wins. - -### COMPOSER_HTACCESS_PROTECT - -Defaults to `1`. If set to `0`, Composer will not create `.htaccess` files in the -Composer home, cache, and data directories. - -### COMPOSER_MEMORY_LIMIT - -If set, the value is used as php's memory_limit. - -### COMPOSER_MIRROR_PATH_REPOS - -If set to 1, this env changes the default path repository strategy to `mirror` instead -of `symlink`. As it is the default strategy being set it can still be overwritten by -repository options. - -### COMPOSER_NO_INTERACTION - -If set to 1, this env var will make Composer behave as if you passed the -`--no-interaction` flag to every command. This can be set on build boxes/CI. - -### COMPOSER_PROCESS_TIMEOUT - -This env var controls the time Composer waits for commands (such as git -commands) to finish executing. The default value is 300 seconds (5 minutes). - -### COMPOSER_ROOT_VERSION - -By setting this var you can specify the version of the root package, if it -cannot be guessed from VCS info and is not present in `composer.json`. - -### COMPOSER_VENDOR_DIR - -By setting this var you can make Composer install the dependencies into a -directory other than `vendor`. - -### COMPOSER_RUNTIME_ENV - -This lets you hint under which environment Composer is running, which can help Composer -work around some environment specific issues. The only value currently supported is -`virtualbox`, which then enables some short `sleep()` calls to wait for the filesystem -to have written files properly before we attempt reading them. You can set the -environment variable if you use Vagrant or VirtualBox and experience issues with files not -being found during installation even though they should be present. - -### http_proxy or HTTP_PROXY - -If you are using Composer from behind an HTTP proxy, you can use the standard -`http_proxy` or `HTTP_PROXY` env vars. Set it to the URL of your proxy. -Many operating systems already set this variable for you. - -Using `http_proxy` (lowercased) or even defining both might be preferable since -some tools like git or curl will only use the lower-cased `http_proxy` version. -Alternatively you can also define the git proxy using -`git config --global http.proxy `. - -If you are using Composer in a non-CLI context (i.e. integration into a CMS or -similar use case), and need to support proxies, please provide the `CGI_HTTP_PROXY` -environment variable instead. See [httpoxy.org](https://httpoxy.org/) for further -details. - -### COMPOSER_MAX_PARALLEL_HTTP - -Set to an integer to configure how many files can be downloaded in parallel. This -defaults to 12 and must be between 1 and 50. If your proxy has issues with -concurrency maybe you want to lower this. Increasing it should generally not result -in performance gains. - -### HTTP_PROXY_REQUEST_FULLURI - -If you use a proxy, but it does not support the request_fulluri flag, then you -should set this env var to `false` or `0` to prevent Composer from setting the -request_fulluri option. - -### HTTPS_PROXY_REQUEST_FULLURI - -If you use a proxy, but it does not support the request_fulluri flag for HTTPS -requests, then you should set this env var to `false` or `0` to prevent Composer -from setting the request_fulluri option. - -### COMPOSER_SELF_UPDATE_TARGET - -If set, makes the self-update command write the new Composer phar file into that path instead of overwriting itself. Useful for updating Composer on a read-only filesystem. - -### no_proxy or NO_PROXY - -If you are behind a proxy and would like to disable it for certain domains, you -can use the `no_proxy` or `NO_PROXY` env var. Set it to a comma separated list of -domains the proxy should *not* be used for. - -The env var accepts domains, IP addresses, and IP address blocks in CIDR -notation. You can restrict the filter to a particular port (e.g. `:80`). You -can also set it to `*` to ignore the proxy for all HTTP requests. - -### COMPOSER_DISABLE_NETWORK - -If set to `1`, disables network access (best effort). This can be used for debugging or -to run Composer on a plane or a starship with poor connectivity. - -If set to `prime`, GitHub VCS repositories will prime the cache, so it can then be used -fully offline with `1`. - -### COMPOSER_DEBUG_EVENTS - -If set to `1`, outputs information about events being dispatched, which can be -useful for plugin authors to identify what is firing when exactly. - -### COMPOSER_NO_AUDIT - -If set to `1`, it is the equivalent of passing the `--no-audit` option to `require`, `update`, `remove` or `create-project` command. - -### COMPOSER_NO_DEV - -If set to `1`, it is the equivalent of passing the `--no-dev` option to `install` or -`update`. You can override this for a single command by setting `COMPOSER_NO_DEV=0`. - -### COMPOSER_PREFER_STABLE - -If set to `1`, it is the equivalent of passing the `--prefer-stable` option to -`update` or `require`. - -### COMPOSER_PREFER_LOWEST - -If set to `1`, it is the equivalent of passing the `--prefer-lowest` option to -`update` or `require`. - -### COMPOSER_IGNORE_PLATFORM_REQ or COMPOSER_IGNORE_PLATFORM_REQS - -If `COMPOSER_IGNORE_PLATFORM_REQS` set to `1`, it is the equivalent of passing the `--ignore-platform-reqs` argument. -Otherwise, specifying a comma separated list in `COMPOSER_IGNORE_PLATFORM_REQ` will ignore those specific requirements. - -For example, if a development workstation will never run database queries, this can be used to ignore the requirement for the database extensions to be available. If you set `COMPOSER_IGNORE_PLATFORM_REQ=ext-oci8`, then composer will allow packages to be installed even if the `oci8` PHP extension is not enabled. - -← [Libraries](02-libraries.md) | [Schema](04-schema.md) → diff --git a/app/vendor/composer/composer/doc/04-schema.md b/app/vendor/composer/composer/doc/04-schema.md deleted file mode 100644 index 4278edc91..000000000 --- a/app/vendor/composer/composer/doc/04-schema.md +++ /dev/null @@ -1,1002 +0,0 @@ -# The composer.json schema - -This chapter will explain all of the fields available in `composer.json`. - -## JSON schema - -We have a [JSON schema](https://json-schema.org) that documents the format and -can also be used to validate your `composer.json`. In fact, it is used by the -`validate` command. You can find it at: https://getcomposer.org/schema.json - -## Root Package - -The root package is the package defined by the `composer.json` at the root of -your project. It is the main `composer.json` that defines your project -requirements. - -Certain fields only apply when in the root package context. One example of -this is the `config` field. Only the root package can define configuration. -The config of dependencies is ignored. This makes the `config` field -`root-only`. - -> **Note:** A package can be the root package or not, depending on the context. -> For example, if your project depends on the `monolog` library, your project -> is the root package. However, if you clone `monolog` from GitHub in order to -> fix a bug in it, then `monolog` is the root package. - -## Properties - -### name - -The name of the package. It consists of vendor name and project name, -separated by `/`. Examples: - -* monolog/monolog -* igorw/event-source - -The name must be lowercase and consist of words separated by `-`, `.` or `_`. -The complete name should match `^[a-z0-9]([_.-]?[a-z0-9]+)*/[a-z0-9](([_.]?|-{0,2})[a-z0-9]+)*$`. - -The `name` property is required for published packages (libraries). - -> **Note:** Before Composer version 2.0, a name could contain any character, including white spaces. - -### description - -A short description of the package. Usually this is one line long. - -Required for published packages (libraries). - -### version - -The version of the package. In most cases this is not required and should -be omitted (see below). - -This must follow the format of `X.Y.Z` or `vX.Y.Z` with an optional suffix -of `-dev`, `-patch` (`-p`), `-alpha` (`-a`), `-beta` (`-b`) or `-RC`. -The patch, alpha, beta and RC suffixes can also be followed by a number. - -Examples: - -- 1.0.0 -- 1.0.2 -- 1.1.0 -- 0.2.5 -- 1.0.0-dev -- 1.0.0-alpha3 -- 1.0.0-beta2 -- 1.0.0-RC5 -- v2.0.4-p1 - -Optional if the package repository can infer the version from somewhere, such -as the VCS tag name in the VCS repository. In that case it is also recommended -to omit it. - -> **Note:** Packagist uses VCS repositories, so the statement above is very -> much true for Packagist as well. Specifying the version yourself will -> most likely end up creating problems at some point due to human error. - -### type - -The type of the package. It defaults to `library`. - -Package types are used for custom installation logic. If you have a package -that needs some special logic, you can define a custom type. This could be a -`symfony-bundle`, a `wordpress-plugin` or a `typo3-cms-extension`. These types -will all be specific to certain projects, and they will need to provide an -installer capable of installing packages of that type. - -Out of the box, Composer supports four types: - -- **library:** This is the default. It will copy the files to `vendor`. -- **project:** This denotes a project rather than a library. For example - application shells like the [Symfony standard edition](https://github.com/symfony/symfony-standard), - CMSs like the [SilverStripe installer](https://github.com/silverstripe/silverstripe-installer) - or full fledged applications distributed as packages. This can for example - be used by IDEs to provide listings of projects to initialize when creating - a new workspace. -- **metapackage:** An empty package that contains requirements and will trigger - their installation, but contains no files and will not write anything to the - filesystem. As such, it does not require a dist or source key to be - installable. -- **composer-plugin:** A package of type `composer-plugin` may provide an - installer for other packages that have a custom type. Read more in the - [dedicated article](articles/custom-installers.md). - -Only use a custom type if you need custom logic during installation. It is -recommended to omit this field and have it default to `library`. - -### keywords - -An array of keywords that the package is related to. These can be used for -searching and filtering. - -Examples: - -- logging -- events -- database -- redis -- templating - -> **Note**: Some special keywords trigger `composer require` without the -> `--dev` option to prompt users if they would like to add these packages to -> `require-dev` instead of `require`. These are: `dev`, `testing`, `static analysis`. - -Optional. - -### homepage - -A URL to the website of the project. - -Optional. - -### readme - -A relative path to the readme document. - -Optional. - -### time - -Release date of the version. - -Must be in `YYYY-MM-DD` or `YYYY-MM-DD HH:MM:SS` format. - -Optional. - -### license - -The license of the package. This can be either a string or an array of strings. - -The recommended notation for the most common licenses is (alphabetical): - -- Apache-2.0 -- BSD-2-Clause -- BSD-3-Clause -- BSD-4-Clause -- GPL-2.0-only / GPL-2.0-or-later -- GPL-3.0-only / GPL-3.0-or-later -- LGPL-2.1-only / LGPL-2.1-or-later -- LGPL-3.0-only / LGPL-3.0-or-later -- MIT - -Optional, but it is highly recommended to supply this. More identifiers are -listed at the [SPDX Open Source License Registry](https://spdx.org/licenses/). - -> **Note:** For closed-source software, you may use `"proprietary"` as the license identifier. - -An Example: - -```json -{ - "license": "MIT" -} -``` - -For a package, when there is a choice between licenses ("disjunctive license"), -multiple can be specified as an array. - -An Example for disjunctive licenses: - -```json -{ - "license": [ - "LGPL-2.1-only", - "GPL-3.0-or-later" - ] -} -``` - -Alternatively they can be separated with "or" and enclosed in parentheses; - -```json -{ - "license": "(LGPL-2.1-only or GPL-3.0-or-later)" -} -``` - -Similarly, when multiple licenses need to be applied ("conjunctive license"), -they should be separated with "and" and enclosed in parentheses. - -### authors - -The authors of the package. This is an array of objects. - -Each author object can have following properties: - -* **name:** The author's name. Usually their real name. -* **email:** The author's email address. -* **homepage:** URL to the author's website. -* **role:** The author's role in the project (e.g. developer or translator) - -An example: - -```json -{ - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de", - "role": "Developer" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be", - "role": "Developer" - } - ] -} -``` - -Optional, but highly recommended. - -### support - -Various information to get support about the project. - -Support information includes the following: - -* **email:** Email address for support. -* **issues:** URL to the issue tracker. -* **forum:** URL to the forum. -* **wiki:** URL to the wiki. -* **irc:** IRC channel for support, as irc://server/channel. -* **source:** URL to browse or download the sources. -* **docs:** URL to the documentation. -* **rss:** URL to the RSS feed. -* **chat:** URL to the chat channel. - -An example: - -```json -{ - "support": { - "email": "support@example.org", - "irc": "irc://irc.freenode.org/composer" - } -} -``` - -Optional. - -### funding - -A list of URLs to provide funding to the package authors for maintenance and -development of new functionality. - -Each entry consists of the following - -* **type:** The type of funding, or the platform through which funding can be provided, e.g. patreon, opencollective, tidelift or github. -* **url:** URL to a website with details, and a way to fund the package. - -An example: - -```json -{ - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/phpdoctrine" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/packagist-doctrine_doctrine-bundle" - }, - { - "type": "other", - "url": "https://www.doctrine-project.org/sponsorship.html" - } - ] -} -``` - -Optional. - -### Package links - -All of the following take an object which maps package names to -versions of the package via version constraints. Read more about -versions [here](articles/versions.md). - -Example: - -```json -{ - "require": { - "monolog/monolog": "1.0.*" - } -} -``` - -All links are optional fields. - -`require` and `require-dev` additionally support _stability flags_ ([root-only](04-schema.md#root-package)). -They take the form "_constraint_@_stability flag_". -These allow you to further restrict or expand the stability of a package beyond -the scope of the [minimum-stability](#minimum-stability) setting. You can apply -them to a constraint, or apply them to an empty _constraint_ if you want to -allow unstable packages of a dependency for example. - -Example: - -```json -{ - "require": { - "monolog/monolog": "1.0.*@beta", - "acme/foo": "@dev" - } -} -``` - -If one of your dependencies has a dependency on an unstable package you need to -explicitly require it as well, along with its sufficient stability flag. - -Example: - -Assuming `doctrine/doctrine-fixtures-bundle` requires `"doctrine/data-fixtures": "dev-master"` -then inside the root composer.json you need to add the second line below to allow dev -releases for the `doctrine/data-fixtures` package : - -```json -{ - "require": { - "doctrine/doctrine-fixtures-bundle": "dev-master", - "doctrine/data-fixtures": "@dev" - } -} -``` - -`require` and `require-dev` additionally support explicit references (i.e. -commit) for dev versions to make sure they are locked to a given state, even -when you run update. These only work if you explicitly require a dev version -and append the reference with `#`. This is also a -[root-only](04-schema.md#root-package) feature and will be ignored in -dependencies. - -Example: - -```json -{ - "require": { - "monolog/monolog": "dev-master#2eb0c0978d290a1c45346a1955188929cb4e5db7", - "acme/foo": "1.0.x-dev#abc123" - } -} -``` - -> **Note:** This feature has severe technical limitations, as the -> composer.json metadata will still be read from the branch name you specify -> before the hash. You should therefore only use this as a temporary solution -> during development to remediate transient issues, until you can switch to -> tagged releases. The Composer team does not actively support this feature -> and will not accept bug reports related to it. - -It is also possible to inline-alias a package constraint so that it matches -a constraint that it otherwise would not. For more information [see the -aliases article](articles/aliases.md). - -`require` and `require-dev` also support references to specific PHP versions -and PHP extensions your project needs to run successfully. - -Example: - -```json -{ - "require": { - "php": ">=7.4", - "ext-mbstring": "*" - } -} -``` - -> **Note:** It is important to list PHP extensions your project requires. -> Not all PHP installations are created equal: some may miss extensions you -> may consider as standard (such as `ext-mysqli` which is not installed by -> default in Fedora/CentOS minimal installation systems). Failure to list -> required PHP extensions may lead to a bad user experience: Composer will -> install your package without any errors but it will then fail at run-time. -> The `composer show --platform` command lists all PHP extensions available on -> your system. You may use it to help you compile the list of extensions you -> use and require. Alternatively you may use third party tools to analyze -> your project for the list of extensions used. - -#### require - -Map of packages required by this package. The package will not be installed -unless those requirements can be met. - -#### require-dev ([root-only](04-schema.md#root-package)) - -Map of packages required for developing this package, or running -tests, etc. The dev requirements of the root package are installed by default. -Both `install` or `update` support the `--no-dev` option that prevents dev -dependencies from being installed. - -#### conflict - -Map of packages that conflict with this version of this package. They -will not be allowed to be installed together with your package. - -Note that when specifying ranges like `<1.0 >=1.1` in a `conflict` link, -this will state a conflict with all versions that are less than 1.0 *and* equal -or newer than 1.1 at the same time, which is probably not what you want. You -probably want to go for `<1.0 || >=1.1` in this case. - -#### replace - -Map of packages that are replaced by this package. This allows you to fork a -package, publish it under a different name with its own version numbers, while -packages requiring the original package continue to work with your fork because -it replaces the original package. - -This is also useful for packages that contain sub-packages, for example the main -symfony/symfony package contains all the Symfony Components which are also -available as individual packages. If you require the main package it will -automatically fulfill any requirement of one of the individual components, -since it replaces them. - -Caution is advised when using replace for the sub-package purpose explained -above. You should then typically only replace using `self.version` as a version -constraint, to make sure the main package only replaces the sub-packages of -that exact version, and not any other version, which would be incorrect. - -#### provide - -Map of packages that are provided by this package. This is mostly -useful for implementations of common interfaces. A package could depend on -some virtual package e.g. `psr/logger-implementation`, any library that implements -this logger interface would list it in `provide`. Implementors can then -be [found on Packagist.org](https://packagist.org/providers/psr/log-implementation). - -Using `provide` with the name of an actual package rather than a virtual one -implies that the code of that package is also shipped, in which case `replace` -is generally a better choice. A common convention for packages providing an -interface and relying on other packages to provide an implementation (for -instance the PSR interfaces) is to use a `-implementation` suffix for the -name of the virtual package corresponding to the interface package. - -#### suggest - -Suggested packages that can enhance or work well with this package. These are -informational and are displayed after the package is installed, to give -your users a hint that they could add more packages, even though they are not -strictly required. - -The format is like package links above, except that the values are free text -and not version constraints. - -Example: - -```json -{ - "suggest": { - "monolog/monolog": "Allows more advanced logging of the application flow", - "ext-xml": "Needed to support XML format in class Foo" - } -} -``` - -### autoload - -Autoload mapping for a PHP autoloader. - -[`PSR-4`](https://www.php-fig.org/psr/psr-4/) and [`PSR-0`](http://www.php-fig.org/psr/psr-0/) -autoloading, `classmap` generation and `files` includes are supported. - -PSR-4 is the recommended way since it offers greater ease of use (no need -to regenerate the autoloader when you add classes). - -#### PSR-4 - -Under the `psr-4` key you define a mapping from namespaces to paths, relative to the -package root. When autoloading a class like `Foo\\Bar\\Baz` a namespace prefix -`Foo\\` pointing to a directory `src/` means that the autoloader will look for a -file named `src/Bar/Baz.php` and include it if present. Note that as opposed to -the older PSR-0 style, the prefix (`Foo\\`) is **not** present in the file path. - -Namespace prefixes must end in `\\` to avoid conflicts between similar prefixes. -For example `Foo` would match classes in the `FooBar` namespace so the trailing -backslashes solve the problem: `Foo\\` and `FooBar\\` are distinct. - -The PSR-4 references are all combined, during install/update, into a single -key => value array which may be found in the generated file -`vendor/composer/autoload_psr4.php`. - -Example: - -```json -{ - "autoload": { - "psr-4": { - "Monolog\\": "src/", - "Vendor\\Namespace\\": "" - } - } -} -``` - -If you need to search for a same prefix in multiple directories, -you can specify them as an array as such: - -```json -{ - "autoload": { - "psr-4": { "Monolog\\": ["src/", "lib/"] } - } -} -``` - -If you want to have a fallback directory where any namespace will be looked for, -you can use an empty prefix like: - -```json -{ - "autoload": { - "psr-4": { "": "src/" } - } -} -``` - -#### PSR-0 - -Under the `psr-0` key you define a mapping from namespaces to paths, relative to the -package root. Note that this also supports the PEAR-style non-namespaced convention. - -Please note namespace declarations should end in `\\` to make sure the autoloader -responds exactly. For example `Foo` would match in `FooBar` so the trailing -backslashes solve the problem: `Foo\\` and `FooBar\\` are distinct. - -The PSR-0 references are all combined, during install/update, into a single key => value -array which may be found in the generated file `vendor/composer/autoload_namespaces.php`. - -Example: - -```json -{ - "autoload": { - "psr-0": { - "Monolog\\": "src/", - "Vendor\\Namespace\\": "src/", - "Vendor_Namespace_": "src/" - } - } -} -``` - -If you need to search for a same prefix in multiple directories, -you can specify them as an array as such: - -```json -{ - "autoload": { - "psr-0": { "Monolog\\": ["src/", "lib/"] } - } -} -``` - -The PSR-0 style is not limited to namespace declarations only but may be -specified right down to the class level. This can be useful for libraries with -only one class in the global namespace. If the php source file is also located -in the root of the package, for example, it may be declared like this: - -```json -{ - "autoload": { - "psr-0": { "UniqueGlobalClass": "" } - } -} -``` - -If you want to have a fallback directory where any namespace can be, you can -use an empty prefix like: - -```json -{ - "autoload": { - "psr-0": { "": "src/" } - } -} -``` - -#### Classmap - -The `classmap` references are all combined, during install/update, into a single -key => value array which may be found in the generated file -`vendor/composer/autoload_classmap.php`. This map is built by scanning for -classes in all `.php` and `.inc` files in the given directories/files. - -You can use the classmap generation support to define autoloading for all libraries -that do not follow PSR-0/4. To configure this you specify all directories or files -to search for classes. - -Example: - -```json -{ - "autoload": { - "classmap": ["src/", "lib/", "Something.php"] - } -} -``` - -Wildcards (`*`) are also supported in a classmap paths, and expand to match any directory name: - -Example: - -```json -{ - "autoload": { - "classmap": ["src/addons/*/lib/", "3rd-party/*", "Something.php"] - } -} -``` - -#### Files - -If you want to require certain files explicitly on every request then you can use -the `files` autoloading mechanism. This is useful if your package includes PHP functions -that cannot be autoloaded by PHP. - -Example: - -```json -{ - "autoload": { - "files": ["src/MyLibrary/functions.php"] - } -} -``` - -Files autoload rules are included whenever `vendor/autoload.php` is included, right after -the autoloader is registered. The order of inclusion depends on package dependencies so that -if package A depends on B, files in package B will be included first to ensure package B is fully -initialized and ready to be used when files from package A are included. - -If two packages have the same amount of dependents or no dependencies, the order is alphabetical. - -Files from the root package are always loaded last, and you cannot use files autoloading -yourself to override functions from your dependencies. If you want to achieve that we recommend -you include your own functions *before* including Composer's `vendor/autoload.php`. - -#### Exclude files from classmaps - -If you want to exclude some files or folders from the classmap you can use the `exclude-from-classmap` property. -This might be useful to exclude test classes in your live environment, for example, as those will be skipped -from the classmap even when building an optimized autoloader. - -The classmap generator will ignore all files in the paths configured here. The paths are absolute from the package -root directory (i.e. composer.json location), and support `*` to match anything but a slash, and `**` to -match anything. `**` is implicitly added to the end of the paths. - -Example: - -```json -{ - "autoload": { - "exclude-from-classmap": ["/Tests/", "/test/", "/tests/"] - } -} -``` - -#### Optimizing the autoloader - -The autoloader can have quite a substantial impact on your request time -(50-100ms per request in large frameworks using a lot of classes). See the -[article about optimizing the autoloader](articles/autoloader-optimization.md) -for more details on how to reduce this impact. - -### autoload-dev ([root-only](04-schema.md#root-package)) - -This section allows defining autoload rules for development purposes. - -Classes needed to run the test suite should not be included in the main autoload -rules to avoid polluting the autoloader in production and when other people use -your package as a dependency. - -Therefore, it is a good idea to rely on a dedicated path for your unit tests -and to add it within the autoload-dev section. - -Example: - -```json -{ - "autoload": { - "psr-4": { "MyLibrary\\": "src/" } - }, - "autoload-dev": { - "psr-4": { "MyLibrary\\Tests\\": "tests/" } - } -} -``` - -### include-path - -> **DEPRECATED**: This is only present to support legacy projects, and all new code -> should preferably use autoloading. As such it is a deprecated practice, but the -> feature itself will not likely disappear from Composer. - -A list of paths which should get appended to PHP's `include_path`. - -Example: - -```json -{ - "include-path": ["lib/"] -} -``` - -Optional. - -### target-dir - -> **DEPRECATED**: This is only present to support legacy PSR-0 style autoloading, -> and all new code should preferably use PSR-4 without target-dir and projects -> using PSR-0 with PHP namespaces are encouraged to migrate to PSR-4 instead. - -Defines the installation target. - -In case the package root is below the namespace declaration you cannot -autoload properly. `target-dir` solves this problem. - -An example is Symfony. There are individual packages for the components. The -Yaml component is under `Symfony\Component\Yaml`. The package root is that -`Yaml` directory. To make autoloading possible, we need to make sure that it -is not installed into `vendor/symfony/yaml`, but instead into -`vendor/symfony/yaml/Symfony/Component/Yaml`, so that the autoloader can load -it from `vendor/symfony/yaml`. - -To do that, `autoload` and `target-dir` are defined as follows: - -```json -{ - "autoload": { - "psr-0": { "Symfony\\Component\\Yaml\\": "" } - }, - "target-dir": "Symfony/Component/Yaml" -} -``` - -Optional. - -### minimum-stability ([root-only](04-schema.md#root-package)) - -This defines the default behavior for filtering packages by stability. This -defaults to `stable`, so if you rely on a `dev` package, you should specify -it in your file to avoid surprises. - -All versions of each package are checked for stability, and those that are less -stable than the `minimum-stability` setting will be ignored when resolving -your project dependencies. (Note that you can also specify stability requirements -on a per-package basis using stability flags in the version constraints that you -specify in a `require` block (see [package links](#package-links) for more details). - -Available options (in order of stability) are `dev`, `alpha`, `beta`, `RC`, -and `stable`. - -### prefer-stable ([root-only](04-schema.md#root-package)) - -When this is enabled, Composer will prefer more stable packages over unstable -ones when finding compatible stable packages is possible. If you require a -dev version or only alphas are available for a package, those will still be -selected granted that the minimum-stability allows for it. - -Use `"prefer-stable": true` to enable. - -### repositories ([root-only](04-schema.md#root-package)) - -Custom package repositories to use. - -By default Composer only uses the packagist repository. By specifying -repositories you can get packages from elsewhere. - -Repositories are not resolved recursively. You can only add them to your main -`composer.json`. Repository declarations of dependencies' `composer.json`s are -ignored. - -The following repository types are supported: - -* **composer:** A Composer repository is a `packages.json` file served - via the network (HTTP, FTP, SSH), that contains a list of `composer.json` - objects with additional `dist` and/or `source` information. The `packages.json` - file is loaded using a PHP stream. You can set extra options on that stream - using the `options` parameter. -* **vcs:** The version control system repository can fetch packages from git, - svn, fossil and hg repositories. -* **package:** If you depend on a project that does not have any support for - Composer whatsoever you can define the package inline using a `package` - repository. You basically inline the `composer.json` object. - -For more information on any of these, see [Repositories](05-repositories.md). - -Example: - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "http://packages.example.com" - }, - { - "type": "composer", - "url": "https://packages.example.com", - "options": { - "ssl": { - "verify_peer": "true" - } - } - }, - { - "type": "vcs", - "url": "https://github.com/Seldaek/monolog" - }, - { - "type": "package", - "package": { - "name": "smarty/smarty", - "version": "3.1.7", - "dist": { - "url": "https://www.smarty.net/files/Smarty-3.1.7.zip", - "type": "zip" - }, - "source": { - "url": "https://smarty-php.googlecode.com/svn/", - "type": "svn", - "reference": "tags/Smarty_3_1_7/distribution/" - } - } - } - ] -} -``` - -> **Note:** Order is significant here. When looking for a package, Composer -will look from the first to the last repository, and pick the first match. -By default Packagist is added last which means that custom repositories can -override packages from it. - -Using JSON object notation is also possible. However, JSON key/value pairs -are to be considered unordered so consistent behaviour cannot be guaranteed. - -```json -{ - "repositories": { - "foo": { - "type": "composer", - "url": "http://packages.foo.com" - } - } -} -``` - -### config ([root-only](04-schema.md#root-package)) - -A set of configuration options. It is only used for projects. See -[Config](06-config.md) for a description of each individual option. - -### scripts ([root-only](04-schema.md#root-package)) - -Composer allows you to hook into various parts of the installation process -through the use of scripts. - -See [Scripts](articles/scripts.md) for events details and examples. - -### extra - -Arbitrary extra data for consumption by `scripts`. - -This can be virtually anything. To access it from within a script event -handler, you can do: - -```php -$extra = $event->getComposer()->getPackage()->getExtra(); -``` - -Optional. - -### bin - -A set of files that should be treated as binaries and made available -into the `bin-dir` (from config). - -See [Vendor Binaries](articles/vendor-binaries.md) for more details. - -Optional. - -### archive - -A set of options for creating package archives. - -The following options are supported: - -* **name:** Allows configuring base name for archive. - By default (if not configured, and `--file` is not passed as command-line argument), - `preg_replace('#[^a-z0-9-_]#i', '-', name)` is used. - -Example: - -```json -{ - "name": "org/strangeName", - "archive": { - "name": "Strange_name" - } -} -``` - -* **exclude:** Allows configuring a list of patterns for excluded paths. The - pattern syntax matches .gitignore files. A leading exclamation mark (!) will - result in any matching files to be included even if a previous pattern - excluded them. A leading slash will only match at the beginning of the project - relative path. An asterisk will not expand to a directory separator. - -Example: - -```json -{ - "archive": { - "exclude": ["/foo/bar", "baz", "/*.test", "!/foo/bar/baz"] - } -} -``` - -The example will include `/dir/foo/bar/file`, `/foo/bar/baz`, `/file.php`, -`/foo/my.test` but it will exclude `/foo/bar/any`, `/foo/baz`, and `/my.test`. - -Optional. - -### abandoned - -Indicates whether this package has been abandoned. - -It can be boolean or a package name/URL pointing to a recommended alternative. - -Examples: - -Use `"abandoned": true` to indicate this package is abandoned. -Use `"abandoned": "monolog/monolog"` to indicate this package is abandoned, and that -the recommended alternative is `monolog/monolog`. - -Defaults to false. - -Optional. - -### non-feature-branches - -A list of regex patterns of branch names that are non-numeric (e.g. "latest" or something), -that will NOT be handled as feature branches. This is an array of strings. - -If you have non-numeric branch names, for example like "latest", "current", "latest-stable" -or something, that do not look like a version number, then Composer handles such branches -as feature branches. This means it searches for parent branches, that look like a version -or ends at special branches (like master), and the root package version number becomes the -version of the parent branch or at least master or something. - -To handle non-numeric named branches as versions instead of searching for a parent branch -with a valid version or special branch name like master, you can set patterns for branch -names that should be handled as dev version branches. - -This is really helpful when you have dependencies using "self.version", so that not dev-master, -but the same branch is installed (in the example: latest-testing). - -An example: - -If you have a testing branch, that is heavily maintained during a testing phase and is -deployed to your staging environment, normally `composer show -s` will give you `versions : * dev-master`. - -If you configure `latest-.*` as a pattern for non-feature-branches like this: - -```json -{ - "non-feature-branches": ["latest-.*"] -} -``` - -Then `composer show -s` will give you `versions : * dev-latest-testing`. - -Optional. - -← [Command-line interface](03-cli.md) | [Repositories](05-repositories.md) → diff --git a/app/vendor/composer/composer/doc/05-repositories.md b/app/vendor/composer/composer/doc/05-repositories.md deleted file mode 100644 index 460b3df3e..000000000 --- a/app/vendor/composer/composer/doc/05-repositories.md +++ /dev/null @@ -1,805 +0,0 @@ -# Repositories - -This chapter will explain the concept of packages and repositories, what kinds -of repositories are available, and how they work. - -## Concepts - -Before we look at the different types of repositories that exist, we need to -understand some basic concepts that Composer is built on. - -### Package - -Composer is a dependency manager. It installs packages locally. A package is -essentially a directory containing something. In this case it is PHP -code, but in theory it could be anything. And it contains a package -description which has a name and a version. The name and the version are used -to identify the package. - -In fact, internally Composer sees every version as a separate package. While -this distinction does not matter when you are using Composer, it's quite -important when you want to change it. - -In addition to the name and the version, there is useful metadata. The -information most relevant for installation is the source definition, which -describes where to get the package contents. The package data points to the -contents of the package. And there are two options here: dist and source. - -**Dist:** The dist is a packaged version of the package data. Usually a -released version, usually a stable release. - -**Source:** The source is used for development. This will usually originate -from a source code repository, such as git. You can fetch this when you want -to modify the downloaded package. - -Packages can supply either of these, or even both. Depending on certain -factors, such as user-supplied options and stability of the package, one will -be preferred. - -### Repository - -A repository is a package source. It's a list of packages/versions. Composer -will look in all your repositories to find the packages your project requires. - -By default, only the Packagist.org repository is registered in Composer. You can -add more repositories to your project by declaring them in `composer.json`. - -Repositories are only available to the root package and the repositories -defined in your dependencies will not be loaded. Read the -[FAQ entry](faqs/why-cant-composer-load-repositories-recursively.md) if you -want to learn why. - -When resolving dependencies, packages are looked up from repositories from -top to bottom, and by default, as soon as a package is found in one, Composer -stops looking in other repositories. Read the -[repository priorities](articles/repository-priorities.md) article for more -details and to see how to change this behavior. - -## Types - -### Composer - -The main repository type is the `composer` repository. It uses a single -`packages.json` file that contains all of the package metadata. - -This is also the repository type that packagist uses. To reference a -`composer` repository, supply the path before the `packages.json` file. -In the case of packagist, that file is located at `/packages.json`, so the URL of -the repository would be `repo.packagist.org`. For `example.org/packages.json` the -repository URL would be `example.org`. - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org" - } - ] -} -``` - -#### packages - -The only required field is `packages`. The JSON structure is as follows: - -```json -{ - "packages": { - "vendor/package-name": { - "dev-master": { @composer.json }, - "1.0.x-dev": { @composer.json }, - "0.0.1": { @composer.json }, - "1.0.0": { @composer.json } - } - } -} -``` - -The `@composer.json` marker would be the contents of the `composer.json` from -that package version including as a minimum: - -* name -* version -* dist or source - -Here is a minimal package definition: - -```json -{ - "name": "smarty/smarty", - "version": "3.1.7", - "dist": { - "url": "https://www.smarty.net/files/Smarty-3.1.7.zip", - "type": "zip" - } -} -``` - -It may include any of the other fields specified in the [schema](04-schema.md). - -#### notify-batch - -The `notify-batch` field allows you to specify a URL that will be called -every time a user installs a package. The URL can be either an absolute path -(that will use the same domain as the repository), or a fully qualified URL. - -An example value: - -```json -{ - "notify-batch": "/downloads/" -} -``` - -For `example.org/packages.json` containing a `monolog/monolog` package, this -would send a `POST` request to `example.org/downloads/` with following -JSON request body: - -```json -{ - "downloads": [ - {"name": "monolog/monolog", "version": "1.2.1.0"} - ] -} -``` - -The version field will contain the normalized representation of the version -number. - -This field is optional. - -#### metadata-url, available-packages and available-package-patterns - -The `metadata-url` field allows you to provide a URL template to serve all -packages which are in the repository. It must contain the placeholder -`%package%`. - -This field is new in Composer v2, and is prioritised over the -`provider-includes` and `providers-url` fields if both are present. -For compatibility with both Composer v1 and v2 you ideally want -to provide both. New repository implementations may only need to -support v2 however. - -An example: - -```json -{ - "metadata-url": "/p2/%package%.json" -} -``` - -Whenever Composer looks for a package, it will replace `%package%` by the -package name, and fetch that URL. If dev stability is allowed for the package, -it will also load the URL again with `$packageName~dev` (e.g. -`/p2/foo/bar~dev.json` to look for `foo/bar`'s dev versions). - -The `foo/bar.json` and `foo/bar~dev.json` files containing package versions -MUST contain only versions for the foo/bar package, as -`{"packages":{"foo/bar":[ ... versions here ... ]}}`. - -Caching is done via the use of If-Modified-Since header, so make sure you -return Last-Modified headers and that they are accurate. - -The array of versions can also optionally be minified using -`Composer\MetadataMinifier\MetadataMinifier::minify()` from -[composer/metadata-minifier](https://packagist.org/packages/composer/metadata-minifier). -If you do that, you should add a `"minified": "composer/2.0"` key -at the top level to indicate to Composer it must expand the version -list back into the original data. See -https://repo.packagist.org/p2/monolog/monolog.json for an example. - -Any requested package which does not exist MUST return a 404 status code, -which will indicate to Composer that this package does not exist in your -repository. Make sure the 404 response is fast to avoid blocking Composer. -Avoid redirects to alternative 404 pages. - -If your repository only has a small number of packages, and you want to avoid -the 404-requests, you can also specify an `"available-packages"` key in -`packages.json` which should be an array with all the package names that your -repository contains. Alternatively you can specify an -`"available-package-patterns"` key which is an array of package name patterns -(with `*` matching any string, e.g. `vendor/*` would make Composer look up -every matching package name in this repository). - -This field is optional. - -#### providers-api - -The `providers-api` field allows you to provide a URL template to serve all -packages which provide a given package name, but not the package which has -that name. It must contain the placeholder `%package%`. - -For example https://packagist.org/providers/monolog/monolog.json lists some -package which have a "provide" rule for monolog/monolog, but it does not list -monolog/monolog itself. - -```json -{ - "providers-api": "https://packagist.org/providers/%package%.json", -} -``` - -This field is optional. - -#### list - -The `list` field allows you to return the names of packages which match a -given field (or all names if no filter is present). It should accept an -optional `?filter=xx` query param, which can contain `*` as wildcards matching -any substring. - -Replace/provide rules should not be considered here. - -It must return an array of package names: -```json -{ - "packageNames": [ - "a/b", - "c/d" - ] -} -``` - -See for example. - -This field is optional. - -#### provider-includes and providers-url - -The `provider-includes` field allows you to list a set of files that list -package names provided by this repository. The hash should be a sha256 of -the files in this case. - -The `providers-url` describes how provider files are found on the server. It -is an absolute path from the repository root. It must contain the placeholders -`%package%` and `%hash%`. - -These fields are used by Composer v1, or if your repository does not have the -`metadata-url` field set. - -An example: - -```json -{ - "provider-includes": { - "providers-a.json": { - "sha256": "f5b4bc0b354108ef08614e569c1ed01a2782e67641744864a74e788982886f4c" - }, - "providers-b.json": { - "sha256": "b38372163fac0573053536f5b8ef11b86f804ea8b016d239e706191203f6efac" - } - }, - "providers-url": "/p/%package%$%hash%.json" -} -``` - -Those files contain lists of package names and hashes to verify the file -integrity, for example: - -```json -{ - "providers": { - "acme/foo": { - "sha256": "38968de1305c2e17f4de33aea164515bc787c42c7e2d6e25948539a14268bb82" - }, - "acme/bar": { - "sha256": "4dd24c930bd6e1103251306d6336ac813b563a220d9ca14f4743c032fb047233" - } - } -} -``` - -The file above declares that acme/foo and acme/bar can be found in this -repository, by loading the file referenced by `providers-url`, replacing -`%package%` by the vendor namespaced package name and `%hash%` by the -sha256 field. Those files themselves contain package definitions as -described [above](#packages). - -These fields are optional. You probably don't need them for your own custom -repository. - -#### cURL or stream options - -The repository is accessed either using cURL (Composer 2 with ext-curl enabled) -or PHP streams. You can set extra options using the `options` parameter. For -PHP streams, you can set any valid PHP stream context option. See [Context -options and parameters](https://php.net/manual/en/context.php) for more -information. When cURL is used, only a limited set of `http` and `ssl` options -can be configured. - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org", - "options": { - "http": { - "timeout": 60 - } - } - } - ], - "require": { - "acme/package": "^1.0" - } -} -``` - -### VCS - -VCS stands for version control system. This includes versioning systems like -git, svn, fossil or hg. Composer has a repository type for installing packages -from these systems. - -#### Loading a package from a VCS repository - -There are a few use cases for this. The most common one is maintaining your -own fork of a third party library. If you are using a certain library for your -project, and you decide to change something in the library, you will want your -project to use the patched version. If the library is on GitHub (this is the -case most of the time), you can fork it there and push your changes to -your fork. After that you update the project's `composer.json`. All you have -to do is add your fork as a repository and update the version constraint to -point to your custom branch. In `composer.json` only, you should prefix your -custom branch name with `"dev-"` (without making it part of the actual branch -name). For version constraint naming conventions see -[Libraries](02-libraries.md) for more information. - -Example assuming you patched monolog to fix a bug in the `bugfix` branch: - -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/igorw/monolog" - } - ], - "require": { - "monolog/monolog": "dev-bugfix" - } -} -``` - -When you run `php composer.phar update`, you should get your modified version -of `monolog/monolog` instead of the one from packagist. - -Note that you should not rename the package unless you really intend to fork -it in the long term, and completely move away from the original package. -Composer will correctly pick your package over the original one since the -custom repository has priority over packagist. If you want to rename the -package, you should do so in the default (often master) branch and not in a -feature branch, since the package name is taken from the default branch. - -Also note that the override will not work if you change the `name` property -in your forked repository's `composer.json` file as this needs to match the -original for the override to work. - -If other dependencies rely on the package you forked, it is possible to -inline-alias it so that it matches a constraint that it otherwise would not. -For more information [see the aliases article](articles/aliases.md). - -#### Using private repositories - -Exactly the same solution allows you to work with your private repositories at -GitHub and Bitbucket: - -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "git@bitbucket.org:vendor/my-private-repo.git" - } - ], - "require": { - "vendor/my-private-repo": "dev-master" - } -} -``` - -The only requirement is the installation of SSH keys for a git client. - -#### Git alternatives - -Git is not the only version control system supported by the VCS repository. -The following are supported: - -* **Git:** [git-scm.com](https://git-scm.com) -* **Subversion:** [subversion.apache.org](https://subversion.apache.org) -* **Mercurial:** [mercurial-scm.org](https://www.mercurial-scm.org) -* **Fossil**: [fossil-scm.org](https://www.fossil-scm.org/) - -To get packages from these systems you need to have their respective clients -installed. That can be inconvenient. And for this reason there is special -support for GitHub and Bitbucket that use the APIs provided by these sites, to -fetch the packages without having to install the version control system. The -VCS repository provides `dist`s for them that fetch the packages as zips. - -* **GitHub:** [github.com](https://github.com) (Git) -* **Bitbucket:** [bitbucket.org](https://bitbucket.org) (Git) - -The VCS driver to be used is detected automatically based on the URL. However, -should you need to specify one for whatever reason, you can use `bitbucket`, -`github`, `gitlab`, `perforce`, `fossil`, `git`, `svn` or `hg` -as the repository type instead of `vcs`. - -If you set the `no-api` key to `true` on a github repository it will clone the -repository as it would with any other git repository instead of using the -GitHub API. But unlike using the `git` driver directly, Composer will still -attempt to use github's zip files. - -Please note: -* **To let Composer choose which driver to use** the repository type needs to be defined as "vcs" -* **If you already used a private repository**, this means Composer should have cloned it in cache. If you want to install the same package with drivers, remember to launch the command `composer clearcache` followed by the command `composer update` to update Composer cache and install the package from dist. -* VCS driver `git-bitbucket` is deprecated in favor of `bitbucket` - -#### Bitbucket Driver Configuration - -> **Note that the repository endpoint for Bitbucket needs to be https rather than git.** - -After setting up your bitbucket repository, you will also need to -[set up authentication](articles/authentication-for-private-packages.md#bitbucket-oauth). - -#### Subversion Options - -Since Subversion has no native concept of branches and tags, Composer assumes -by default that code is located in `$url/trunk`, `$url/branches` and -`$url/tags`. If your repository has a different layout you can change those -values. For example if you used capitalized names you could configure the -repository like this: - -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "http://svn.example.org/projectA/", - "trunk-path": "Trunk", - "branches-path": "Branches", - "tags-path": "Tags" - } - ] -} -``` - -If you have no branches or tags directory you can disable them entirely by -setting the `branches-path` or `tags-path` to `false`. - -If the package is in a subdirectory, e.g. `/trunk/foo/bar/composer.json` and -`/tags/1.0/foo/bar/composer.json`, then you can make Composer access it by -setting the `"package-path"` option to the sub-directory, in this example it -would be `"package-path": "foo/bar/"`. - -If you have a private Subversion repository you can save credentials in the -http-basic section of your config (See [Schema](04-schema.md)): - -```json -{ - "http-basic": { - "svn.example.org": { - "username": "username", - "password": "password" - } - } -} -``` - -If your Subversion client is configured to store credentials by default these -credentials will be saved for the current user and existing saved credentials -for this server will be overwritten. To change this behavior by setting the -`"svn-cache-credentials"` option in your repository configuration: - -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "http://svn.example.org/projectA/", - "svn-cache-credentials": false - } - ] -} -``` - -### Package - -If you want to use a project that does not support Composer through any of the -means above, you still can define the package yourself by using a `package` -repository. - -Basically, you define the same information that is included in the `composer` -repository's `packages.json`, but only for a single package. Again, the -minimum required fields are `name`, `version`, and either of `dist` or -`source`. - -Here is an example for the smarty template engine: - -```json -{ - "repositories": [ - { - "type": "package", - "package": { - "name": "smarty/smarty", - "version": "3.1.7", - "dist": { - "url": "https://www.smarty.net/files/Smarty-3.1.7.zip", - "type": "zip" - }, - "source": { - "url": "http://smarty-php.googlecode.com/svn/", - "type": "svn", - "reference": "tags/Smarty_3_1_7/distribution/" - }, - "autoload": { - "classmap": ["libs/"] - } - } - } - ], - "require": { - "smarty/smarty": "3.1.*" - } -} -``` - -Typically, you would leave the source part off, as you don't really need it. - -> **Note**: This repository type has a few limitations and should be avoided -> whenever possible: -> -> - Composer will not update the package unless you change the `version` field. -> - Composer will not update the commit references, so if you use `master` as -> reference you will have to delete the package to force an update, and will -> have to deal with an unstable lock file. - -The `"package"` key in a `package` repository may be set to an array to define multiple versions of a package: - -```json -{ - "repositories": [ - { - "type": "package", - "package": [ - { - "name": "foo/bar", - "version": "1.0.0", - ... - }, - { - "name": "foo/bar", - "version": "2.0.0", - ... - } - ] - } - ] -} -``` - -## Hosting your own - -While you will probably want to put your packages on packagist most of the -time, there are some use cases for hosting your own repository. - -* **Private company packages:** If you are part of a company that uses Composer - for their packages internally, you might want to keep those packages private. - -* **Separate ecosystem:** If you have a project which has its own ecosystem, - and the packages aren't really reusable by the greater PHP community, you - might want to keep them separate to packagist. An example of this would be - WordPress plugins. - -For hosting your own packages, a native `composer` type of repository is -recommended, which provides the best performance. - -There are a few tools that can help you create a `composer` repository. - -### Private Packagist - -[Private Packagist](https://packagist.com/) is a hosted or self-hosted -application providing private package hosting as well as mirroring of -GitHub, Packagist.org and other package repositories. - -Check out [Packagist.com](https://packagist.com/) for more information. - -### Satis - -Satis is a static `composer` repository generator. It is a bit like an ultra- -lightweight, static file-based version of packagist. - -You give it a `composer.json` containing repositories, typically VCS and -package repository definitions. It will fetch all the packages that are -`require`d and dump a `packages.json` that is your `composer` repository. - -Check [the satis GitHub repository](https://github.com/composer/satis) and -the [handling private packages article](articles/handling-private-packages.md) for more -information. - -### Artifact - -There are some cases, when there is no ability to have one of the previously -mentioned repository types online, even the VCS one. A typical example could be -cross-organisation library exchange through build artifacts. Of course, most -of the time these are private. To use these archives as-is, one can use a -repository of type `artifact` with a folder containing ZIP or TAR archives of -those private packages: - -```json -{ - "repositories": [ - { - "type": "artifact", - "url": "path/to/directory/with/zips/" - } - ], - "require": { - "private-vendor-one/core": "15.6.2", - "private-vendor-two/connectivity": "*", - "acme-corp/parser": "10.3.5" - } -} -``` - -Each zip artifact is a ZIP archive with `composer.json` in root folder: - -```shell -unzip -l acme-corp-parser-10.3.5.zip -``` -```text -composer.json -... -``` - -If there are two archives with different versions of a package, they are both -imported. When an archive with a newer version is added in the artifact folder -and you run `update`, that version will be imported as well and Composer will -update to the latest version. - -### Path - -In addition to the artifact repository, you can use the path one, which allows -you to depend on a local directory, either absolute or relative. This can be -especially useful when dealing with monolithic repositories. - -For instance, if you have the following directory structure in your repository: -```text -... -├── apps -│ └── my-app -│ └── composer.json -├── packages -│ └── my-package -│ └── composer.json -... -``` - -Then, to add the package `my/package` as a dependency, in your -`apps/my-app/composer.json` file, you can use the following configuration: - -```json -{ - "repositories": [ - { - "type": "path", - "url": "../../packages/my-package" - } - ], - "require": { - "my/package": "*" - } -} -``` - -If the package is a local VCS repository, the version may be inferred by -the branch or tag that is currently checked out. Otherwise, the version should -be explicitly defined in the package's `composer.json` file. If the version -cannot be resolved by these means, it is assumed to be `dev-master`. - -When the version cannot be inferred from the local VCS repository, or when you -want to override the version, you can use the `versions` option when declaring -the repository: - -```json -{ - "repositories": [ - { - "type": "path", - "url": "../../packages/my-package", - "options": { - "versions": { - "my/package": "4.2-dev" - } - } - } - ] -} -``` - -The local package will be symlinked if possible, in which case the output in -the console will read `Symlinking from ../../packages/my-package`. If symlinking -is _not_ possible the package will be copied. In that case, the console will -output `Mirrored from ../../packages/my-package`. - -Instead of default fallback strategy you can force to use symlink with -`"symlink": true` or mirroring with `"symlink": false` option. Forcing -mirroring can be useful when deploying or generating package from a -monolithic repository. - -> **Note:** On Windows, directory symlinks are implemented using NTFS junctions -> because they can be created by non-admin users. Mirroring will always be used -> on versions below Windows 7 or if `proc_open` has been disabled. - -```json -{ - "repositories": [ - { - "type": "path", - "url": "../../packages/my-package", - "options": { - "symlink": false - } - } - ] -} -``` - -Leading tildes are expanded to the current user's home folder, and environment -variables are parsed in both Windows and Linux/Mac notations. For example -`~/git/mypackage` will automatically load the mypackage clone from -`/home//git/mypackage`, equivalent to `$HOME/git/mypackage` or -`%USERPROFILE%/git/mypackage`. - -> **Note:** Repository paths can also contain wildcards like `*` and `?`. -> For details, see the [PHP glob function](https://php.net/glob). - -You can configure the way the package's dist reference (which appears in -the composer.lock file) is built. - -The following modes exist: -- `none` - reference will be always null. This can help reduce lock file conflicts - in the lock file but reduces clarity as to when the last update happened and whether - the package is in the latest state. -- `config` - reference is built based on a hash of the package's composer.json and repo config -- `auto` (used by default) - reference is built basing on the hash like with `config`, but if - the package folder contains a git repository, the HEAD commit's hash is used as reference instead. - -```json -{ - "repositories": [ - { - "type": "path", - "url": "../../packages/my-package", - "options": { - "reference": "config" - } - } - ] -} -``` - -## Disabling Packagist.org - -You can disable the default Packagist.org repository by adding this to your -`composer.json`: - -```json -{ - "repositories": [ - { - "packagist.org": false - } - ] -} -``` - -You can disable Packagist.org globally by using the global config flag: - -```shell -php composer.phar config -g repo.packagist false -``` - -← [Schema](04-schema.md) | [Config](06-config.md) → diff --git a/app/vendor/composer/composer/doc/06-config.md b/app/vendor/composer/composer/doc/06-config.md deleted file mode 100644 index 70caf4432..000000000 --- a/app/vendor/composer/composer/doc/06-config.md +++ /dev/null @@ -1,423 +0,0 @@ -# Config - -This chapter will describe the `config` section of the `composer.json` -[schema](04-schema.md). - -## process-timeout - -The timeout in seconds for process executions, defaults to 300 (5mins). -The duration processes like git clones can run before -Composer assumes they died out. You may need to make this higher if you have a -slow connection or huge vendors. - -To disable the process timeout on a custom command under `scripts`, a static -helper is available: - -```json -{ - "scripts": { - "test": [ - "Composer\\Config::disableProcessTimeout", - "phpunit" - ] - } -} -``` - -## allow-plugins - -Defaults to `{}` which does not allow any plugins to be loaded. - -As of Composer 2.2.0, the `allow-plugins` option adds a layer of security -allowing you to restrict which Composer plugins are able to execute code during -a Composer run. - -When a new plugin is first activated, which is not yet listed in the config option, -Composer will print a warning. If you run Composer interactively it will -prompt you to decide if you want to execute the plugin or not. - -Use this setting to allow only packages you trust to execute code. Set it to -an object with package name patterns as keys. The values are **true** to allow -and **false** to disallow while suppressing further warnings and prompts. - -```json -{ - "config": { - "allow-plugins": { - "third-party/required-plugin": true, - "my-organization/*": true, - "unnecessary/plugin": false - } - } -} -``` - -You can also set the config option itself to `false` to disallow all plugins, or `true` to allow all plugins to run (NOT recommended). For example: - -```json -{ - "config": { - "allow-plugins": false - } -} -``` - -## use-include-path - -Defaults to `false`. If `true`, the Composer autoloader will also look for classes -in the PHP include path. - -## preferred-install - -Defaults to `dist` and can be any of `source`, `dist` or `auto`. This option -allows you to set the install method Composer will prefer to use. Can -optionally be an object with package name patterns for keys for more granular install preferences. - -```json -{ - "config": { - "preferred-install": { - "my-organization/stable-package": "dist", - "my-organization/*": "source", - "partner-organization/*": "auto", - "*": "dist" - } - } -} -``` - -- `source` means Composer will install packages from their `source` if there - is one. This is typically a git clone or equivalent checkout of the version - control system the package uses. This is useful if you want to make a bugfix - to a project and get a local git clone of the dependency directly. -- `auto` is the legacy behavior where Composer uses `source` automatically - for dev versions, and `dist` otherwise. -- `dist` (the default as of Composer 2.1) means Composer installs from `dist`, - where possible. This is typically a zip file download, which is faster than - cloning the entire repository. - -> **Note:** Order matters. More specific patterns should be earlier than -> more relaxed patterns. When mixing the string notation with the hash -> configuration in global and package configurations the string notation -> is translated to a `*` package pattern. - -## use-parent-dir - -When running Composer in a directory where there is no composer.json, if there -is one present in a directory above Composer will by default ask you whether -you want to use that directory's composer.json instead. - -If you always want to answer yes to this prompt, you can set this config value -to `true`. To never be prompted, set it to `false`. The default is `"prompt"`. - -> **Note:** This config must be set in your global user-wide config for it -> to work. Use for example `php composer.phar config --global use-parent-dir true` -> to set it. - -## store-auths - -What to do after prompting for authentication, one of: `true` (always store), -`false` (do not store) and `"prompt"` (ask every time), defaults to `"prompt"`. - -## github-protocols - -Defaults to `["https", "ssh", "git"]`. A list of protocols to use when cloning -from github.com, in priority order. By default `git` is present but only if [secure-http](#secure-http) -is disabled, as the git protocol is not encrypted. If you want your origin remote -push URLs to be using https and not ssh (`git@github.com:...`), then set the protocol -list to be only `["https"]` and Composer will stop overwriting the push URL to an ssh -URL. - -## github-oauth - -A list of domain names and oauth keys. For example using `{"github.com": -"oauthtoken"}` as the value of this option will use `oauthtoken` to access -private repositories on github and to circumvent the low IP-based rate limiting -of their API. Composer may prompt for credentials when needed, but these can also be -manually set. Read more on how to get an OAuth token for GitHub and cli syntax -[here](articles/authentication-for-private-packages.md#github-oauth). - -## gitlab-domains - -Defaults to `["gitlab.com"]`. A list of domains of GitLab servers. -This is used if you use the `gitlab` repository type. - -## gitlab-oauth - -A list of domain names and oauth keys. For example using `{"gitlab.com": -"oauthtoken"}` as the value of this option will use `oauthtoken` to access -private repositories on gitlab. Please note: If the package is not hosted at -gitlab.com the domain names must be also specified with the -[`gitlab-domains`](06-config.md#gitlab-domains) option. -Further info can also be found [here](articles/authentication-for-private-packages.md#gitlab-oauth) - -## gitlab-token - -A list of domain names and private tokens. Private token can be either simple -string, or array with username and token. For example using `{"gitlab.com": -"privatetoken"}` as the value of this option will use `privatetoken` to access -private repositories on gitlab. Using `{"gitlab.com": {"username": "gitlabuser", - "token": "privatetoken"}}` will use both username and token for gitlab deploy -token functionality (https://docs.gitlab.com/ee/user/project/deploy_tokens/) -Please note: If the package is not hosted at -gitlab.com the domain names must be also specified with the -[`gitlab-domains`](06-config.md#gitlab-domains) option. The token must have -`api` or `read_api` scope. -Further info can also be found [here](articles/authentication-for-private-packages.md#gitlab-token) - -## gitlab-protocol - -A protocol to force use of when creating a repository URL for the `source` -value of the package metadata. One of `git` or `http`. (`https` is treated -as a synonym for `http`.) Helpful when working with projects referencing -private repositories which will later be cloned in GitLab CI jobs with a -[GitLab CI_JOB_TOKEN](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-reference) -using HTTP basic auth. By default, Composer will generate a git-over-SSH -URL for private repositories and HTTP(S) only for public. - -## disable-tls - -Defaults to `false`. If set to true all HTTPS URLs will be tried with HTTP -instead and no network level encryption is performed. Enabling this is a -security risk and is NOT recommended. The better way is to enable the -php_openssl extension in php.ini. Enabling this will implicitly disable the -`secure-http` option. - -## secure-http - -Defaults to `true`. If set to true only HTTPS URLs are allowed to be -downloaded via Composer. If you really absolutely need HTTP access to something -then you can disable it, but using [Let's Encrypt](https://letsencrypt.org/) to -get a free SSL certificate is generally a better alternative. - -## bitbucket-oauth - -A list of domain names and consumers. For example using `{"bitbucket.org": -{"consumer-key": "myKey", "consumer-secret": "mySecret"}}`. -Read more [here](articles/authentication-for-private-packages.md#bitbucket-oauth). - -## cafile - -Location of Certificate Authority file on local filesystem. In PHP 5.6+ you -should rather set this via openssl.cafile in php.ini, although PHP 5.6+ should -be able to detect your system CA file automatically. - -## capath - -If cafile is not specified or if the certificate is not found there, the -directory pointed to by capath is searched for a suitable certificate. -capath must be a correctly hashed certificate directory. - -## http-basic - -A list of domain names and username/passwords to authenticate against them. For -example using `{"example.org": {"username": "alice", "password": "foo"}}` as the -value of this option will let Composer authenticate against example.org. -More info can be found [here](articles/authentication-for-private-packages.md#http-basic). - -## bearer - -A list of domain names and tokens to authenticate against them. For example using -`{"example.org": "foo"}` as the value of this option will let Composer authenticate -against example.org using an `Authorization: Bearer foo` header. - -## platform - -Lets you fake platform packages (PHP and extensions) so that you can emulate a -production env or define your target platform in the config. Example: `{"php": -"7.0.3", "ext-something": "4.0.3"}`. - -This will make sure that no package requiring more than PHP 7.0.3 can be installed -regardless of the actual PHP version you run locally. However it also means -the dependencies are not checked correctly anymore, if you run PHP 5.6 it will -install fine as it assumes 7.0.3, but then it will fail at runtime. This also means if -`{"php":"7.4"}` is specified; no packages will be used that define `7.4.1` as minimum. - -Therefore if you use this it is recommended, and safer, to also run the -[`check-platform-reqs`](03-cli.md#check-platform-reqs) command as part of your -deployment strategy. - -If a dependency requires some extension that you do not have installed locally -you may ignore it instead by passing `--ignore-platform-req=ext-foo` to `update`, -`install` or `require`. In the long run though you should install required -extensions as if you ignore one now and a new package you add a month later also -requires it, you may introduce issues in production unknowingly. - -If you have an extension installed locally but *not* on production, you may want -to artificially hide it from Composer using `{"ext-foo": false}`. - -## vendor-dir - -Defaults to `vendor`. You can install dependencies into a different directory if -you want to. `$HOME` and `~` will be replaced by your home directory's path in -vendor-dir and all `*-dir` options below. - -## bin-dir - -Defaults to `vendor/bin`. If a project includes binaries, they will be symlinked -into this directory. - -## data-dir - -Defaults to `C:\Users\\AppData\Roaming\Composer` on Windows, -`$XDG_DATA_HOME/composer` on unix systems that follow the XDG Base Directory -Specifications, and `$COMPOSER_HOME` on other unix systems. Right now it is only -used for storing past composer.phar files to be able to roll back to older -versions. See also [COMPOSER_HOME](03-cli.md#composer-home). - -## cache-dir - -Defaults to `C:\Users\\AppData\Local\Composer` on Windows, -`/Users//Library/Caches/composer` on macOS, `$XDG_CACHE_HOME/composer` -on unix systems that follow the XDG Base Directory Specifications, and -`$COMPOSER_HOME/cache` on other unix systems. Stores all the caches used by -Composer. See also [COMPOSER_HOME](03-cli.md#composer-home). - -## cache-files-dir - -Defaults to `$cache-dir/files`. Stores the zip archives of packages. - -## cache-repo-dir - -Defaults to `$cache-dir/repo`. Stores repository metadata for the `composer` -type and the VCS repos of type `svn`, `fossil`, `github` and `bitbucket`. - -## cache-vcs-dir - -Defaults to `$cache-dir/vcs`. Stores VCS clones for loading VCS repository -metadata for the `git`/`hg` types and to speed up installs. - -## cache-files-ttl - -Defaults to `15552000` (6 months). Composer caches all dist (zip, tar, ...) -packages that it downloads. Those are purged after six months of being unused by -default. This option allows you to tweak this duration (in seconds) or disable -it completely by setting it to 0. - -## cache-files-maxsize - -Defaults to `300MiB`. Composer caches all dist (zip, tar, ...) packages that it -downloads. When the garbage collection is periodically ran, this is the maximum -size the cache will be able to use. Older (less used) files will be removed -first until the cache fits. - -## cache-read-only - -Defaults to `false`. Whether to use the Composer cache in read-only mode. - -## bin-compat - -Defaults to `auto`. Determines the compatibility of the binaries to be installed. -If it is `auto` then Composer only installs .bat proxy files when on Windows or WSL. If -set to `full` then both .bat files for Windows and scripts for Unix-based -operating systems will be installed for each binary. This is mainly useful if you -run Composer inside a linux VM but still want the `.bat` proxies available for use -in the Windows host OS. If set to `proxy` Composer will only create bash/Unix-style -proxy files and no .bat files even on Windows/WSL. - -## prepend-autoloader - -Defaults to `true`. If `false`, the Composer autoloader will not be prepended to -existing autoloaders. This is sometimes required to fix interoperability issues -with other autoloaders. - -## autoloader-suffix - -Defaults to `null`. Non-empty string to be used as a suffix for the generated -Composer autoloader. When null a random one will be generated. - -## optimize-autoloader - -Defaults to `false`. If `true`, always optimize when dumping the autoloader. - -## sort-packages - -Defaults to `false`. If `true`, the `require` command keeps packages sorted -by name in `composer.json` when adding a new package. - -## classmap-authoritative - -Defaults to `false`. If `true`, the Composer autoloader will only load classes -from the classmap. Implies `optimize-autoloader`. - -## apcu-autoloader - -Defaults to `false`. If `true`, the Composer autoloader will check for APCu and -use it to cache found/not-found classes when the extension is enabled. - -## github-domains - -Defaults to `["github.com"]`. A list of domains to use in github mode. This is -used for GitHub Enterprise setups. - -## github-expose-hostname - -Defaults to `true`. If `false`, the OAuth tokens created to access the -github API will have a date instead of the machine hostname. - -## use-github-api - -Defaults to `true`. Similar to the `no-api` key on a specific repository, -setting `use-github-api` to `false` will define the global behavior for all -GitHub repositories to clone the repository as it would with any other git -repository instead of using the GitHub API. But unlike using the `git` -driver directly, Composer will still attempt to use GitHub's zip files. - -## notify-on-install - -Defaults to `true`. Composer allows repositories to define a notification URL, -so that they get notified whenever a package from that repository is installed. -This option allows you to disable that behavior. - -## discard-changes - -Defaults to `false` and can be any of `true`, `false` or `"stash"`. This option -allows you to set the default style of handling dirty updates when in -non-interactive mode. `true` will always discard changes in vendors, while -`"stash"` will try to stash and reapply. Use this for CI servers or deploy -scripts if you tend to have modified vendors. - -## archive-format - -Defaults to `tar`. Overrides the default format used by the archive command. - -## archive-dir - -Defaults to `.`. Default destination for archives created by the archive -command. - -Example: - -```json -{ - "config": { - "archive-dir": "/home/user/.composer/repo" - } -} -``` - -## htaccess-protect - -Defaults to `true`. If set to `false`, Composer will not create `.htaccess` files -in the Composer home, cache, and data directories. - -## lock - -Defaults to `true`. If set to `false`, Composer will not create a `composer.lock` -file and will ignore it if one is present. - -## platform-check - -Defaults to `php-only` which only checks the PHP version. Set to `true` to also -check the presence of extension. If set to `false`, Composer will not create and -require a `platform_check.php` file as part of the autoloader bootstrap. - -## secure-svn-domains - -Defaults to `[]`. Lists domains which should be trusted/marked as using a secure -Subversion/SVN transport. By default svn:// protocol is seen as insecure and will -throw, but you can set this config option to `["example.org"]` to allow using svn -URLs on that hostname. This is a better/safer alternative to disabling `secure-http` -altogether. - -← [Repositories](05-repositories.md) | [Runtime](07-runtime.md) → diff --git a/app/vendor/composer/composer/doc/07-runtime.md b/app/vendor/composer/composer/doc/07-runtime.md deleted file mode 100644 index 12f512f89..000000000 --- a/app/vendor/composer/composer/doc/07-runtime.md +++ /dev/null @@ -1,178 +0,0 @@ -# Runtime Composer utilities - -While Composer is mostly used around your project to install its dependencies, -there are a few things which are made available to you at runtime. - -If you need to rely on some of these in a specific version, you can require -the `composer-runtime-api` package. - -## Autoload - -The autoloader is the most used one, and is already covered in our -[basic usage guide](01-basic-usage.md#autoloading). It is available in all -Composer versions. - -## Installed versions - -composer-runtime-api 2.0 introduced a new `Composer\InstalledVersions` class which offers -a few static methods to inspect which versions are currently installed. This is -automatically available to your code as long as you include the Composer autoloader. - -The main use cases for this class are the following: - -### Knowing whether package X (or virtual package) is present - -```php -\Composer\InstalledVersions::isInstalled('vendor/package'); // returns bool -\Composer\InstalledVersions::isInstalled('psr/log-implementation'); // returns bool -``` - -As of Composer 2.1, you may also check if something was installed via require-dev or not by -passing false as second argument: - -```php -\Composer\InstalledVersions::isInstalled('vendor/package'); // returns true assuming this package is installed -\Composer\InstalledVersions::isInstalled('vendor/package', false); // returns true if vendor/package is in require, false if in require-dev -``` - -Note that this can not be used to check whether platform packages are installed. - -### Knowing whether package X is installed in version Y - -> **Note:** To use this, your package must require `"composer/semver": "^3.0"`. - -```php -use Composer\Semver\VersionParser; - -\Composer\InstalledVersions::satisfies(new VersionParser, 'vendor/package', '2.0.*'); -\Composer\InstalledVersions::satisfies(new VersionParser, 'psr/log-implementation', '^1.0'); -``` - -This will return true if e.g. vendor/package is installed in a version matching -`2.0.*`, but also if the given package name is replaced or provided by some other -package. - -### Knowing the version of package X - -> **Note:** This will return `null` if the package name you ask for is not itself installed -> but merely provided or replaced by another package. We therefore recommend using satisfies() -> in library code at least. In application code you have a bit more control and it is less -> important. - -```php -// returns a normalized version (e.g. 1.2.3.0) if vendor/package is installed, -// or null if it is provided/replaced, -// or throws OutOfBoundsException if the package is not installed at all -\Composer\InstalledVersions::getVersion('vendor/package'); -``` - -```php -// returns the original version (e.g. v1.2.3) if vendor/package is installed, -// or null if it is provided/replaced, -// or throws OutOfBoundsException if the package is not installed at all -\Composer\InstalledVersions::getPrettyVersion('vendor/package'); -``` - -```php -// returns the package dist or source reference (e.g. a git commit hash) if vendor/package is installed, -// or null if it is provided/replaced, -// or throws OutOfBoundsException if the package is not installed at all -\Composer\InstalledVersions::getReference('vendor/package'); -``` - -### Knowing a package's own installed version - -If you are only interested in getting a package's own version, e.g. in the source of acme/foo you want -to know which version acme/foo is currently running to display that to the user, then it is -acceptable to use getVersion/getPrettyVersion/getReference. - -The warning in the section above does not apply in this case as you are sure the package is present -and not being replaced if your code is running. - -It is nonetheless a good idea to make sure you handle the `null` return value as gracefully as -possible for safety. - ----- - -A few other methods are available for more complex usages, please refer to the -source/docblocks of [the class itself](https://github.com/composer/composer/blob/main/src/Composer/InstalledVersions.php). - -### Knowing the path in which a package is installed - -The `getInstallPath` method to retrieve a package's absolute install path. - -> **Note:** The path, while absolute, may contain `../` or symlinks. It is -> not guaranteed to be equivalent to a `realpath()` so you should run a -> realpath on it if that matters to you. - -```php -// returns an absolute path to the package installation location if vendor/package is installed, -// or null if it is provided/replaced, or the package is a metapackage -// or throws OutOfBoundsException if the package is not installed at all -\Composer\InstalledVersions::getInstallPath('vendor/package'); -``` - -> Available as of Composer 2.1 (i.e. `composer-runtime-api ^2.1`) - -### Knowing which packages of a given type are installed - -The `getInstalledPackagesByType` method accepts a package type (e.g. foo-plugin) and lists -the packages of that type which are installed. You can then use the methods above to retrieve -more information about each package if needed. - -This method should alleviate the need for custom installers placing plugins in a specific path -instead of leaving them in the vendor dir. You can then find plugins to initialize at runtime -via InstalledVersions, including their paths via getInstallPath if needed. - -```php -\Composer\InstalledVersions::getInstalledPackagesByType('foo-plugin'); -``` - -> Available as of Composer 2.1 (i.e. `composer-runtime-api ^2.1`) - -## Platform check - -composer-runtime-api 2.0 introduced a new `vendor/composer/platform_check.php` file, which -is included automatically when you include the Composer autoloader. - -It verifies that platform requirements (i.e. php and php extensions) are fulfilled -by the PHP process currently running. If the requirements are not met, the script -prints a warning with the missing requirements and exits with code 104. - -To avoid an unexpected white page of death with some obscure PHP extension warning in -production, you can run `composer check-platform-reqs` as part of your -deployment/build and if that returns a non-0 code you should abort. - -The default value is `php-only` which only checks the PHP version. - -If you for some reason do not want to use this safety check, and would rather -risk runtime errors when your code executes, you can disable this by setting the -[`platform-check`](06-config.md#platform-check) config option to `false`. - -If you want the check to include verifying the presence of PHP extensions, -set the config option to `true`. `ext-*` requirements will then be verified -but for performance reasons Composer only checks the extension is present, -not its exact version. - -`lib-*` requirements are never supported/checked by the platform check feature. - -## Autoloader path in binaries - -composer-runtime-api 2.2 introduced a new `$_composer_autoload_path` global -variable set when running binaries installed with Composer. Read more -about this [on the vendor binaries docs](articles/vendor-binaries.md#finding-the-composer-autoloader-from-a-binary). - -This is set by the binary proxy and as such is not made available to projects -by Composer's `vendor/autoload.php`, which would be useless as it would point back -to itself. - -## Binary (bin-dir) path in binaries - -composer-runtime-api 2.2.2 introduced a new `$_composer_bin_dir` global -variable set when running binaries installed with Composer. Read more -about this [on the vendor binaries docs](articles/vendor-binaries.md#finding-the-composer-bin-dir-from-a-binary). - -This is set by the binary proxy and as such is not made available to projects -by Composer's `vendor/autoload.php`. - -← [Config](06-config.md) | [Community](08-community.md) → diff --git a/app/vendor/composer/composer/doc/08-community.md b/app/vendor/composer/composer/doc/08-community.md deleted file mode 100644 index caba743ea..000000000 --- a/app/vendor/composer/composer/doc/08-community.md +++ /dev/null @@ -1,36 +0,0 @@ -# Community - -There are many people using Composer already, and quite a few of them are -contributing. - -## Contributing - -If you would like to contribute to Composer, please read the -[README](https://github.com/composer/composer) and -[CONTRIBUTING](https://github.com/composer/composer/blob/main/.github/CONTRIBUTING.md) -documents. - -The most important guidelines are described as follows: - -> All code contributions - including those of people having commit access - must -> go through a pull request and approved by a core developer before being -> merged. This is to ensure proper review of all the code. -> -> Fork the project, create a feature branch, and send us a pull request. -> -> To ensure a consistent code base, you should make sure the code follows -> the [PSR-12 Coding Standards](https://www.php-fig.org/psr/psr-12/). - -## Support - -The IRC channel is on irc.libera.chat: [#composer](ircs://irc.libera.chat:6697/composer). - -[Stack Overflow](https://stackoverflow.com/questions/tagged/composer-php) and -[GitHub Discussions](https://github.com/composer/composer/discussions) both have a -collection of Composer related questions. - -For paid support, we do provide Composer-related support via chat and email to -[Private Packagist](https://packagist.com) customers. - - -← [Runtime](07-runtime.md) diff --git a/app/vendor/composer/composer/doc/articles/aliases.md b/app/vendor/composer/composer/doc/articles/aliases.md deleted file mode 100644 index ce5a5b71d..000000000 --- a/app/vendor/composer/composer/doc/articles/aliases.md +++ /dev/null @@ -1,111 +0,0 @@ - - -# Aliases - -## Why aliases? - -When you are using a VCS repository, you will only get comparable versions for -branches that look like versions, such as `2.0` or `2.0.x`. For your `master` branch, you -will get a `dev-master` version. For your `bugfix` branch, you will get a -`dev-bugfix` version. - -If your `master` branch is used to tag releases of the `1.0` development line, -i.e. `1.0.1`, `1.0.2`, `1.0.3`, etc., any package depending on it will -probably require version `1.0.*`. - -If anyone wants to require the latest `dev-master`, they have a problem: Other -packages may require `1.0.*`, so requiring that dev version will lead to -conflicts, since `dev-master` does not match the `1.0.*` constraint. - -Enter aliases. - -## Branch alias - -The `dev-master` branch is one in your main VCS repo. It is rather common that -someone will want the latest master dev version. Thus, Composer allows you to -alias your `dev-master` branch to a `1.0.x-dev` version. It is done by -specifying a `branch-alias` field under `extra` in `composer.json`: - -```json -{ - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - } -} -``` - -If you alias a non-comparable version (such as dev-develop) `dev-` must prefix the -branch name. You may also alias a comparable version (i.e. start with numbers, -and end with `.x-dev`), but only as a more specific version. -For example, 1.x-dev could be aliased as 1.2.x-dev. - -The alias must be a comparable dev version, and the `branch-alias` must be present on -the branch that it references. For `dev-master`, you need to commit it on the -`master` branch. - -As a result, anyone can now require `1.0.*` and it will happily install -`dev-master`. - -In order to use branch aliasing, you must own the repository of the package -being aliased. If you want to alias a third party package without maintaining -a fork of it, use inline aliases as described below. - -## Require inline alias - -Branch aliases are great for aliasing main development lines. But in order to -use them you need to have control over the source repository, and you need to -commit changes to version control. - -This is not really fun when you want to try a bugfix of some library that -is a dependency of your local project. - -For this reason, you can alias packages in your `require` and `require-dev` -fields. Let's say you found a bug in the `monolog/monolog` package. You cloned -[Monolog](https://github.com/Seldaek/monolog) on GitHub and fixed the issue in -a branch named `bugfix`. Now you want to install that version of monolog in your -local project. - -You are using `symfony/monolog-bundle` which requires `monolog/monolog` version -`1.*`. So you need your `dev-bugfix` to match that constraint. - -Add this to your project's root `composer.json`: - -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/you/monolog" - } - ], - "require": { - "symfony/monolog-bundle": "2.0", - "monolog/monolog": "dev-bugfix as 1.0.x-dev" - } -} -``` - -Or let Composer add it for you with: - -```shell -php composer.phar require "monolog/monolog:dev-bugfix as 1.0.x-dev" -``` - -That will fetch the `dev-bugfix` version of `monolog/monolog` from your GitHub -and alias it to `1.0.x-dev`. - -> **Note:** Inline aliasing is a root-only feature. If a package with inline -> aliases is required, the alias (right of the `as`) is used as the version -> constraint. The part left of the `as` is discarded. As a consequence, if -> A requires B and B requires `monolog/monolog` version `dev-bugfix as 1.0.x-dev`, -> installing A will make B require `1.0.x-dev`, which may exist as a branch -> alias or an actual `1.0` branch. If it does not, it must be -> inline-aliased again in A's `composer.json`. - -> **Note:** Inline aliasing should be avoided, especially for published -> packages/libraries. If you found a bug, try to get your fix merged upstream. -> This helps to avoid issues for users of your package. diff --git a/app/vendor/composer/composer/doc/articles/authentication-for-private-packages.md b/app/vendor/composer/composer/doc/articles/authentication-for-private-packages.md deleted file mode 100644 index f84a9afa1..000000000 --- a/app/vendor/composer/composer/doc/articles/authentication-for-private-packages.md +++ /dev/null @@ -1,362 +0,0 @@ - - -# Authentication for privately hosted packages and repositories - -Your [private package server](handling-private-packages.md) or version control system is probably secured with one -or more authentication options. In order to allow your project to have access to these -packages and repositories you will have to tell Composer how to authenticate with the server that hosts them. - -# Authentication principles - -Whenever Composer encounters a protected Composer repository it will try to authenticate -using already defined credentials first. When none of those credentials apply it will prompt -for credentials and save them (or a token if Composer is able to retrieve one). - -|type|Generated by Prompt?| -|---|---| -|[http-basic](#http-basic)|yes| -|[Inline http-basic](#inline-http-basic)|no| -|[HTTP Bearer](#http-bearer)|no| -|[Custom header](#custom-token-authentication)|no| -|[gitlab-oauth](#gitlab-oauth)|yes| -|[gitlab-token](#gitlab-token)|yes| -|[github-oauth](#github-oauth)|yes| -|[bitbucket-oauth](#bitbucket-oauth)|yes| - -Sometimes automatic authentication is not possible, or you may want to predefine -authentication credentials. - -Credentials can be stored on 3 different places; in an `auth.json` for the project, a global -`auth.json` or in the `composer.json` itself. - -## Authentication in auth.json per project - -In this authentication storage method, an `auth.json` file will be present in the same folder -as the projects' `composer.json` file. You can either create and edit this file using the -command line or manually edit or create it. - -> **Note: Make sure the `auth.json` file is in `.gitignore`** to avoid -> leaking credentials into your git history. - -## Global authentication credentials - -If you don't want to supply credentials for every project you work on, storing your credentials -globally might be a better idea. These credentials are stored in a global `auth.json` in your -Composer home directory. - -### Command line global credential editing - -For all authentication methods it is possible to edit them using the command line; - - [http-basic](#command-line-http-basic) - - [Inline http-basic](#command-line-inline-http-basic) - - [HTTP Bearer](#http-bearer) - - [gitlab-oauth](#command-line-gitlab-oauth) - - [gitlab-token](#command-line-gitlab-token) - - [github-oauth](#command-line-github-oauth) - - [bitbucket-oauth](#command-line-bitbucket-oauth) - -### Manually editing global authentication credentials - -> **Note:** It is not recommended to manually edit your authentication options as this might -> result in invalid json. Instead preferably use [the command line](#command-line-global-credential-editing). - -To manually edit it, run: - -```shell -php composer.phar config --global --editor [--auth] -``` - -For specific authentication implementations, see their sections; - - [http-basic](#manual-http-basic) - - [Inline http-basic](#manual-inline-http-basic) - - [HTTP Bearer](#http-bearer) - - [custom header](#manual-custom-token-authentication) - - [gitlab-oauth](#manual-gitlab-oauth) - - [gitlab-token](#manual-gitlab-token) - - [github-oauth](#manual-github-oauth) - - [bitbucket-oauth](#manual-bitbucket-oauth) - -Manually editing this file instead of using the command line may result in invalid json errors. -To fix this you need to open the file in an editor and fix the error. To find the location of -your global `auth.json`, execute: - -```shell -php composer.phar config --global home -``` - -The folder will contain your global `auth.json` if it exists. - -You can open this file in your favorite editor and fix the error. - -## Authentication in composer.json file itself - -> **Note:** **This is not recommended** as these credentials are visible -> to anyone who has access to the composer.json, either when it is shared through -> a version control system like git or when an attacker gains (read) access to -> your production server files. - -It is also possible to add credentials to a `composer.json` on a per-project basis in the `config` -section or directly in the repository definition. - -## Authentication using the COMPOSER_AUTH environment variable - -> **Note:** Using the command line environment variable method also has security implications. -> These credentials will most likely be stored in memory, -> and may be persisted to a file like `~/.bash_history` (linux) or `ConsoleHost_history.txt` -> (PowerShell on Windows) when closing a session. - -The final option to supply Composer with credentials is to use the `COMPOSER_AUTH` environment variable. -These variables can be either passed as command line variables or set in actual environment variables. -Read more about the usage of this environment variable [here](../03-cli.md#composer-auth). - -# Authentication methods - -## http-basic - -### Command line http-basic - -```shell -php composer.phar config [--global] http-basic.repo.example.org username password -``` - -In the above command, the config key `http-basic.repo.example.org` consists of two parts: - -- `http-basic` is the authentication method. -- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. - -### Manual http-basic - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "http-basic": { - "example.org": { - "username": "username", - "password": "password" - } - } -} -``` - -## Inline http-basic - -For the inline http-basic authentication method the credentials are not stored in a separate -`auth.json` in the project or globally, but in the `composer.json` or global configuration -in the same place where the Composer repository definition is defined. - -Make sure that the username and password are encoded according to [RFC 3986](http://www.faqs.org/rfcs/rfc3986.html) (2.1. Percent-Encoding). -If the username e.g. is an email address it needs to be passed as `name%40example.com`. - -### Command line inline http-basic - -```shell -php composer.phar config [--global] repositories composer.unique-name https://username:password@repo.example.org -``` - -### Manual inline http-basic - -```shell -php composer.phar config [--global] --editor -``` - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://username:password@example.org" - } - ] -} -``` - -## HTTP Bearer - -### Command line HTTP Bearer authentication - -```shell -php composer.phar config [--global] bearer.repo.example.org token -``` - -In the above command, the config key `bearer.repo.example.org` consists of two parts: - -- `bearer` is the authentication method. -- `repo.example.org` is the repository host name, you should replace it with the host name of your repository. - -### Manual HTTP Bearer authentication - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "bearer": { - "example.org": "TOKEN" - } -} -``` - - -## Custom token authentication - -### Manual custom token authentication - -```shell -php composer.phar config [--global] --editor -``` - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org", - "options": { - "http": { - "header": [ - "API-TOKEN: YOUR-API-TOKEN" - ] - } - } - } - ] -} -``` - -## gitlab-oauth - -> **Note:** For the gitlab authentication to work on private gitlab instances, the -> [`gitlab-domains`](../06-config.md#gitlab-domains) section should also contain the url. - -### Command line gitlab-oauth - -```shell -php composer.phar config [--global] gitlab-oauth.gitlab.example.org token -``` - -In the above command, the config key `gitlab-oauth.gitlab.example.org` consists of two parts: - -- `gitlab-oauth` is the authentication method. -- `gitlab.example.org` is the host name of your GitLab instance, you should replace it with the host name of your GitLab instance or use `gitlab.com` if you don't have a self-hosted GitLab instance. - -### Manual gitlab-oauth - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "gitlab-oauth": { - "example.org": "token" - } -} -``` - -## gitlab-token - -> **Note:** For the gitlab authentication to work on private gitlab instances, the -> [`gitlab-domains`](../06-config.md#gitlab-domains) section should also contain the url. - -To create a new access token, go to your [access tokens section on GitLab](https://gitlab.com/-/profile/personal_access_tokens) -(or the equivalent URL on your private instance) and create a new token. See also [the GitLab access token documentation](https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#creating-a-personal-access-token) for more information. - -When creating a gitlab token manually, make sure it has either the `read_api` or `api` scope. - -### Command line gitlab-token - -```shell -php composer.phar config [--global] gitlab-token.gitlab.example.org token -``` - -In the above command, the config key `gitlab-token.gitlab.example.org` consists of two parts: - -- `gitlab-token` is the authentication method. -- `gitlab.example.org` is the host name of your GitLab instance, you should replace it with the host name of your GitLab instance or use `gitlab.com` if you don't have a self-hosted GitLab instance. - -### Manual gitlab-token - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "gitlab-token": { - "example.org": "token" - } -} -``` - -## github-oauth - -To create a new access token, head to your [token settings section on Github](https://github.com/settings/tokens) and [generate a new token](https://github.com/settings/tokens/new). - -For public repositories when rate limited, a token *without* any particular scope is sufficient (see `(no scope)` in the [scopes documentation](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps)). Such tokens grant read-only access to public information. - -For private repositories, the `repo` scope is needed. Note that the token will be given broad read/write access to all of your private repositories and much more - see the [scopes documentation](https://docs.github.com/en/developers/apps/building-oauth-apps/scopes-for-oauth-apps) for a complete list. As of writing (November 2021), it seems not to be possible to further limit permissions for such tokens. - -Read more about [Personal Access Tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token), or subscribe to the [roadmap item for better scoped tokens in GitHub](https://github.com/github/roadmap/issues/184). - -### Command line github-oauth - -```shell -php composer.phar config [--global] github-oauth.github.com token -``` - -In the above command, the config key `github-oauth.github.com` consists of two parts: - -- `github-oauth` is the authentication method. -- `github.com` is the host name for which this token applies. For GitHub you most likely do not need to change this. - -### Manual github-oauth - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "github-oauth": { - "github.com": "token" - } -} -``` - -## bitbucket-oauth - -The BitBucket driver uses OAuth to access your private repositories via the BitBucket REST APIs, and you will need to create an OAuth consumer to use the driver, please refer to [Atlassian's Documentation](https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/). You will need to fill the callback url with something to satisfy BitBucket, but the address does not need to go anywhere and is not used by Composer. - -### Command line bitbucket-oauth - -```shell -php composer.phar config [--global] bitbucket-oauth.bitbucket.org consumer-key consumer-secret -``` - -In the above command, the config key `bitbucket-oauth.bitbucket.org` consists of two parts: - -- `bitbucket-oauth` is the authentication method. -- `bitbucket.org` is the host name for which this token applies. Unless you have a private instance you don't need to change this. - -### Manual bitbucket-oauth - -```shell -php composer.phar config [--global] --editor --auth -``` - -```json -{ - "bitbucket-oauth": { - "bitbucket.org": { - "consumer-key": "key", - "consumer-secret": "secret" - } - } -} -``` diff --git a/app/vendor/composer/composer/doc/articles/autoloader-optimization.md b/app/vendor/composer/composer/doc/articles/autoloader-optimization.md deleted file mode 100644 index 07a0739bf..000000000 --- a/app/vendor/composer/composer/doc/articles/autoloader-optimization.md +++ /dev/null @@ -1,111 +0,0 @@ - - -# Autoloader optimization - -By default, the Composer autoloader runs relatively fast. However, due to the way -PSR-4 and PSR-0 autoloading rules are set up, it needs to check the filesystem -before resolving a classname conclusively. This slows things down quite a bit, -but it is convenient in development environments because when you add a new class -it can immediately be discovered/used without having to rebuild the autoloader -configuration. - -The problem however is in production you generally want things to happen as fast -as possible, as you can rebuild the configuration every time you deploy and -new classes do not appear at random between deploys. - -For this reason, Composer offers a few strategies to optimize the autoloader. - -> **Note:** You **should not** enable any of these optimizations in **development** as -> they all will cause various problems when adding/removing classes. The performance -> gains are not worth the trouble in a development setting. - -## Optimization Level 1: Class map generation - -### How to run it? - -There are a few options to enable this: - -- Set `"optimize-autoloader": true` inside the config key of composer.json -- Call `install` or `update` with `-o` / `--optimize-autoloader` -- Call `dump-autoload` with `-o` / `--optimize` - -### What does it do? - -Class map generation essentially converts PSR-4/PSR-0 rules into classmap rules. -This makes everything quite a bit faster as for known classes the class map -returns instantly the path, and Composer can guarantee the class is in there so -there is no filesystem check needed. - -On PHP 5.6+, the class map is also cached in opcache which improves the initialization -time greatly. If you make sure opcache is enabled, then the class map should load -almost instantly and then class loading is fast. - -### Trade-offs - -There are no real trade-offs with this method. It should always be enabled in -production. - -The only issue is it does not keep track of autoload misses (i.e. when -it cannot find a given class), so those fallback to PSR-4 rules and can still -result in slow filesystem checks. To solve this issue two Level 2 optimization -options exist, and you can decide to enable either if you have a lot of -class_exists checks that are done for classes that do not exist in your project. - -## Optimization Level 2/A: Authoritative class maps - -### How to run it? - -There are a few options to enable this: - -- Set `"classmap-authoritative": true` inside the config key of composer.json -- Call `install` or `update` with `-a` / `--classmap-authoritative` -- Call `dump-autoload` with `-a` / `--classmap-authoritative` - -### What does it do? - -Enabling this automatically enables Level 1 class map optimizations. - -This option says that if something is not found in the classmap, -then it does not exist and the autoloader should not attempt to look on the -filesystem according to PSR-4 rules. - -### Trade-offs - -This option makes the autoloader always return very quickly. On the flipside it -also means that in case a class is generated at runtime for some reason, it will -not be allowed to be autoloaded. If your project or any of your dependencies does that -then you might experience "class not found" issues in production. Enable this with care. - -> Note: This cannot be combined with Level 2/B optimizations. You have to choose one as -> they address the same issue in different ways. - -## Optimization Level 2/B: APCu cache - -### How to run it? - -There are a few options to enable this: - -- Set `"apcu-autoloader": true` inside the config key of composer.json -- Call `install` or `update` with `--apcu-autoloader` -- Call `dump-autoload` with `--apcu` - -### What does it do? - -This option adds an APCu cache as a fallback for the class map. It will not -automatically generate the class map though, so you should still enable Level 1 -optimizations manually if you so desire. - -Whether a class is found or not, that fact is always cached in APCu, so it can be -returned quickly on the next request. - -### Trade-offs - -This option requires APCu which may or may not be available to you. It also -uses APCu memory for autoloading purposes, but it is safe to use and cannot -result in classes not being found like the authoritative class map -optimization above. - -> Note: This cannot be combined with Level 2/A optimizations. You have to choose one as -> they address the same issue in different ways. diff --git a/app/vendor/composer/composer/doc/articles/composer-platform-dependencies.md b/app/vendor/composer/composer/doc/articles/composer-platform-dependencies.md deleted file mode 100644 index e166d6f4a..000000000 --- a/app/vendor/composer/composer/doc/articles/composer-platform-dependencies.md +++ /dev/null @@ -1,77 +0,0 @@ - - -# Composer platform dependencies - -## What are platform dependencies - -Composer makes information about the environment Composer runs in available as virtual packages. This allows other -packages to define dependencies ([require](../04-schema.md#require), [conflict](../04-schema.md#conflict), -[provide](../04-schema.md#provide), [replace](../04-schema.md#replace)) on different aspects of the platform, like PHP, -extensions or system libraries, including version constraints. - -When you require one of the platform packages no code is installed. The version numbers of platform packages are -derived from the environment Composer is executed in and they cannot be updated or removed. They can however be -overwritten for the purposes of dependency resolution with a [platform configuration](../06-config.md#platform). - -**For example:** If you are executing `composer update` with a PHP interpreter in version -`7.4.42`, then Composer automatically adds a package to the pool of available packages -called `php` and assigns version `7.4.42` to it. - -That's how packages can add a dependency on the used PHP version: - -```json -{ - "require": { - "php": ">=7.4" - } -} -``` - -Composer will check this requirement against the currently used PHP version when running the composer command. - -### Different types of platform packages - -The following types of platform packages exist and can be depended on: - -1. PHP (`php` and the subtypes: `php-64bit`, `php-ipv6`, `php-zts` `php-debug`) -2. PHP Extensions (`ext-*`, e.g. `ext-mbstring`) -3. PHP Libraries (`lib-*`, e.g. `lib-curl`) -4. Composer (`composer`, `composer-plugin-api`, `composer-runtime-api`) - -To see the complete list of platform packages available in your environment -you can run `php composer.phar show --platform` (or `show -p` for short). - -The differences between the various Composer platform packages are explained further in this document. - -## Plugin package `composer-plugin-api` - -You can modify Composer's behavior with [plugin](plugins.md) packages. Composer provides a set of versioned APIs for -plugins. Because internal Composer changes may **not** change the plugin APIs, the API version may not increase every -time the Composer version increases. E.g. In Composer version `2.3.12`, the `composer-plugin-api` version could still -be `2.2.0`. - -## Runtime package `composer-runtime-api` - -When applications which were installed with Composer are run (either on CLI or through a web request), they require the -`vendor/autoload.php` file, typically as one of the first lines of executed code. Invocations of the Composer -autoloader are considered the application "runtime". - -Starting with version 2.0, Composer makes [additional features](../07-runtime.md) (besides registering the class autoloader) available to the application runtime environment. - -Similar to `composer-plugin-api`, not every Composer release adds new runtime features, -thus the version of `composer-runtimeapi` is also increased independently from Composer's version. - -## Composer package `composer` - -Starting with Composer 2.2.0, a new platform package called `composer` is available, which represents the exact -Composer version that is executed. Packages depending on this platform package can therefore depend on (or conflict -with) individual Composer versions to cover edge cases where neither the `composer-runtime-api` version nor the -`composer-plugin-api` was changed. - -Because this option was introduced with Composer 2.2.0, it is recommended to add a `composer-plugin-api` dependency on -at least `>=2.2.0` to provide a more meaningful error message for users running older Composer versions. - -In general, depending on `composer-plugin-api` or `composer-runtime-api` is always recommended -over depending on concrete Composer versions with the `composer` platform package. diff --git a/app/vendor/composer/composer/doc/articles/custom-installers.md b/app/vendor/composer/composer/doc/articles/custom-installers.md deleted file mode 100644 index 6e2ad8670..000000000 --- a/app/vendor/composer/composer/doc/articles/custom-installers.md +++ /dev/null @@ -1,215 +0,0 @@ - - -# Setting up and using custom installers - -## Synopsis - -At times, it may be necessary for a package to require additional actions during -installation, such as installing packages outside of the default `vendor` -library. - -In these cases you could consider creating a Custom Installer to handle your -specific logic. - -## Alternative to custom installers with Composer 2.1+ - -As of Composer 2.1, the `Composer\InstalledVersions` class has a -[`getInstalledPackagesByType`](https://getcomposer.org/doc/07-runtime.md#knowing-which-packages-of-a-given-type-are-installed) -method which can let you figure out at runtime which plugins/modules/extensions are installed. - -It is highly recommended to use that instead of building new custom -installers if you are building a new application. This has the advantage of leaving -all vendor code in the vendor directory, and not requiring custom installer code. - -## Calling a Custom Installer - -Suppose that your project already has a Custom Installer for specific modules -then invoking that installer is a matter of defining the correct [type][1] in -your package file. - -> _See the next chapter for an instruction how to create Custom Installers._ - -Every Custom Installer defines which [type][1] string it will recognize. Once -recognized it will completely override the default installer and only apply its -own logic. - -An example use-case would be: - -> phpDocumentor features Templates that need to be installed outside of the -> default /vendor folder structure. As such they have chosen to adopt the -> `phpdocumentor-template` [type][1] and create a plugin providing the Custom -> Installer to send these templates to the correct folder. - -An example composer.json of such a template package would be: - -```json -{ - "name": "phpdocumentor/template-responsive", - "type": "phpdocumentor-template", - "require": { - "phpdocumentor/template-installer-plugin": "*" - } -} -``` - -> **IMPORTANT**: to make sure that the template installer is present at the -> time the template package is installed, template packages should require -> the plugin package. - -## Creating an Installer - -A Custom Installer is defined as a class that implements the -[`Composer\Installer\InstallerInterface`][4] and is usually distributed in a -Composer Plugin. - -A basic Installer Plugin would thus compose of three files: - -1. the package file: composer.json -2. The Plugin class, e.g.: `My\Project\Composer\Plugin.php`, containing a class that implements `Composer\Plugin\PluginInterface`. -3. The Installer class, e.g.: `My\Project\Composer\Installer.php`, containing a class that implements `Composer\Installer\InstallerInterface`. - -### composer.json - -The package file is the same as any other package file but with the following -requirements: - -1. the [type][1] attribute must be `composer-plugin`. -2. the [extra][2] attribute must contain an element `class` defining the - class name of the plugin (including namespace). If a package contains - multiple plugins, this can be an array of class names. - -Example: - -```json -{ - "name": "phpdocumentor/template-installer-plugin", - "type": "composer-plugin", - "license": "MIT", - "autoload": { - "psr-0": {"phpDocumentor\\Composer": "src/"} - }, - "extra": { - "class": "phpDocumentor\\Composer\\TemplateInstallerPlugin" - }, - "require": { - "composer-plugin-api": "^1.0" - }, - "require-dev": { - "composer/composer": "^1.3" - } -} -``` - -The example above has Composer itself in its require-dev, which allows you to use -the Composer classes in your test suite for example. - -### The Plugin class - -The class defining the Composer plugin must implement the -[`Composer\Plugin\PluginInterface`][3]. It can then register the Custom -Installer in its `activate()` method. - -The class may be placed in any location and have any name, as long as it is -autoloadable and matches the `extra.class` element in the package definition. - -Example: - -```php -getInstallationManager()->addInstaller($installer); - } -} -``` - -### The Custom Installer class - -The class that executes the custom installation should implement the -[`Composer\Installer\InstallerInterface`][4] (or extend another installer that -implements that interface). It defines the [type][1] string as it will be -recognized by packages that will use this installer in the `supports()` method. - -> **NOTE**: _choose your [type][1] name carefully, it is recommended to follow -> the format: `vendor-type`_. For example: `phpdocumentor-template`. - -The InstallerInterface class defines the following methods (please see the -source for the exact signature): - -* **supports()**, here you test whether the passed [type][1] matches the name - that you declared for this installer (see the example). -* **isInstalled()**, determines whether a supported package is installed or not. -* **install()**, here you can determine the actions that need to be executed - upon installation. -* **update()**, here you define the behavior that is required when Composer is - invoked with the update argument. -* **uninstall()**, here you can determine the actions that need to be executed - when the package needs to be removed. -* **getInstallPath()**, this method should return the location where the - package is to be installed, _relative from the location of composer.json._ - The path _must not end with a slash._ - -Example: - -```php -getPrettyName(), 0, 23); - if ('phpdocumentor/template-' !== $prefix) { - throw new \InvalidArgumentException( - 'Unable to install template, phpdocumentor templates ' - .'should always start their package name with ' - .'"phpdocumentor/template-"' - ); - } - - return 'data/templates/'.substr($package->getPrettyName(), 23); - } - - /** - * @inheritDoc - */ - public function supports($packageType) - { - return 'phpdocumentor-template' === $packageType; - } -} -``` - -The example demonstrates that it is possible to extend the -[`Composer\Installer\LibraryInstaller`][5] class to strip a prefix -(`phpdocumentor/template-`) and use the remaining part to assemble a completely -different installation path. - -> _Instead of being installed in `/vendor` any package installed using this -> Installer will be put in the `/data/templates/` folder._ - -[1]: ../04-schema.md#type -[2]: ../04-schema.md#extra -[3]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/PluginInterface.php -[4]: https://github.com/composer/composer/blob/main/src/Composer/Installer/InstallerInterface.php -[5]: https://github.com/composer/composer/blob/main/src/Composer/Installer/LibraryInstaller.php diff --git a/app/vendor/composer/composer/doc/articles/handling-private-packages.md b/app/vendor/composer/composer/doc/articles/handling-private-packages.md deleted file mode 100644 index 9548809f9..000000000 --- a/app/vendor/composer/composer/doc/articles/handling-private-packages.md +++ /dev/null @@ -1,342 +0,0 @@ - - -# Handling private packages - -# Private Packagist - -[Private Packagist](https://packagist.com) is a commercial package hosting product -offering professional support and web based management of private and public packages, -and granular access permissions. Private Packagist provides mirroring for packages' zip -files which makes installs faster and independent from third party systems - e.g. -you can deploy even if GitHub is down because your zip files are mirrored. - -Private Packagist is available as a hosted SaaS solution or as an on-premise self-hosted -package, providing an interactive set up experience. - -Some of Private Packagist's revenue is used to pay for Composer and Packagist.org -development and hosting so using it is a good way to support the maintenance of -these open source projects financially. You can find more information about how to -set up your own package archive on [Packagist.com](https://packagist.com). - -# Satis - -Satis on the other hand is open source but only a static `composer` repository -generator. It is a bit like an ultra-lightweight, static file-based version of -packagist and can be used to host the metadata of your company's private -packages, or your own. You can get it from -[GitHub](https://github.com/composer/satis) or install via CLI: - - php composer.phar create-project composer/satis --stability=dev --keep-vcs - -## Setup - -For example let's assume you have a few packages you want to reuse across your -company but don't really want to open-source. You would first define a Satis -configuration: a json file that lists your curated -[repositories](../05-repositories.md). - -The default file name is satis.json but it could be anything you like. - -Here is an example configuration, you see that it holds a few VCS repositories, -but those could be any types of [repositories](../05-repositories.md). Then it -uses `"require-all": true` which selects all versions of all packages in the -repositories you defined. - -The default file Satis looks for is `satis.json` in the root of the repository. - -```json -{ - "name": "my/repository", - "homepage": "http://packages.example.org", - "repositories": [ - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ], - "require-all": true -} -``` - -If you want to cherry pick which packages you want, you can list all the -packages you want to have in your satis repository inside the classic composer -`require` key, using a `"*"` constraint to make sure all versions are selected, -or another constraint if you want really specific versions. - -```json -{ - "repositories": [ - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ], - "require": { - "company/package": "*", - "company/package2": "*", - "company/package3": "2.0.0" - } -} -``` - -Once you've done this, you run: - - php bin/satis build - -When you ironed out that process, what you would typically do is run this -command as a cron job on a server. It would then update all your package info -much like Packagist does. - -Note that if your private packages are hosted on GitHub, your server should -have an ssh key that gives it access to those packages, and then you should add -the `--no-interaction` (or `-n`) flag to the command to make sure it falls back -to ssh key authentication instead of prompting for a password. This is also a -good trick for continuous integration servers. - -Set up a virtual-host that points to that `web/` directory, let's say it is -`packages.example.org`. Alternatively, with PHP >= 5.4.0, you can use the -built-in CLI server `php -S localhost:port -t satis-output-dir/` for a -temporary solution. - -### Partial Updates - -You can tell Satis to selectively update only particular packages or process -only a repository with a given URL. This cuts down the time it takes to rebuild -the `package.json` file and is helpful if you use (custom) webhooks to trigger -rebuilds whenever code is pushed into one of your repositories. - -To rebuild only particular packages, pass the package names on the command line -like so: - - php bin/satis build satis.json web/ this/package that/other-package - -Note that this will still need to pull and scan all of your VCS repositories -because any VCS repository might contain (on any branch) one of the selected -packages. - -If you want to scan only the selected package and not all VCS repositories you need -to declare a *name* for all your package (this only work on VCS repositories type) : - -```json -{ - "repositories": [ - { "name": "company/privaterepo", "type": "vcs", "url": "https://github.com/mycompany/privaterepo" }, - { "name": "private/repo", "type": "vcs", "url": "http://svn.example.org/private/repo" }, - { "name": "mycompany/privaterepo2", "type": "vcs", "url": "https://github.com/mycompany/privaterepo2" } - ] -} -``` - -If you want to scan only a single repository and update all packages found in -it, pass the VCS repository URL as an optional argument: - - php bin/satis build --repository-url https://only.my/repo.git satis.json web/ - -## Usage - -In your projects all you need to add now is your own Composer repository using -the `packages.example.org` as URL, then you can require your private packages -and everything should work smoothly. You don't need to copy all your -repositories in every project anymore. Only that one unique repository that -will update itself. - -```json -{ - "repositories": [ { "type": "composer", "url": "http://packages.example.org/" } ], - "require": { - "company/package": "1.2.0", - "company/package2": "1.5.2", - "company/package3": "dev-master" - } -} -``` - -### Security - -To secure your private repository you can host it over SSH or SSL using a client -certificate. In your project you can use the `options` parameter to specify the -connection options for the server. - -Example using a custom repository using SSH (requires the SSH2 PECL extension): - -```json -{ - "repositories": [{ - "type": "composer", - "url": "ssh2.sftp://example.org", - "options": { - "ssh2": { - "username": "composer", - "pubkey_file": "/home/composer/.ssh/id_rsa.pub", - "privkey_file": "/home/composer/.ssh/id_rsa" - } - } - }] -} -``` - -> **Tip:** See [ssh2 context options] for more information. - -Example using SSL/TLS (HTTPS) using a client certificate: - -```json -{ - "repositories": [{ - "type": "composer", - "url": "https://example.org", - "options": { - "ssl": { - "local_cert": "/home/composer/.ssl/composer.pem" - } - } - }] -} -``` - -> **Tip:** See [ssl context options] for more information. - -Example using a custom HTTP Header field for token authentication: - -```json -{ - "repositories": [{ - "type": "composer", - "url": "https://example.org", - "options": { - "http": { - "header": [ - "API-TOKEN: YOUR-API-TOKEN" - ] - } - } - }] -} -``` - -### Authentication - -Authentication can be handled in [several different ways](authentication-for-private-packages.md). - -### Downloads - -When GitHub, GitLab or BitBucket repositories are mirrored on your local satis, the -build process will include the location of the downloads these platforms make -available. This means that the repository and your setup depend on the -availability of these services. - -At the same time, this implies that all code which is hosted somewhere else (on -another service or for example in Subversion) will not have downloads available -and thus installations usually take a lot longer. - -To enable your satis installation to create downloads for all (Git, Mercurial -and Subversion) your packages, add the following to your `satis.json`: - -```json -{ - "archive": { - "directory": "dist", - "format": "tar", - "prefix-url": "https://amazing.cdn.example.org", - "skip-dev": true - } -} -``` - -#### Options explained - - * `directory`: required, the location of the dist files (inside the - `output-dir`) - * `format`: optional, `zip` (default) or `tar` - * `prefix-url`: optional, location of the downloads, homepage (from - `satis.json`) followed by `directory` by default - * `skip-dev`: optional, `false` by default, when enabled (`true`) satis will - not create downloads for branches - * `absolute-directory`: optional, a _local_ directory where the dist files are - dumped instead of `output-dir`/`directory` - * `whitelist`: optional, if set as a list of package names, satis will only - dump the dist files of these packages - * `blacklist`: optional, if set as a list of package names, satis will not - dump the dist files of these packages - * `checksum`: optional, `true` by default, when disabled (`false`) satis will - not provide the sha1 checksum for the dist files - -Once enabled, all downloads (include those from GitHub and BitBucket) will be -replaced with a _local_ version. - -#### prefix-url - -Prefixing the URL with another host is especially helpful if the downloads end -up in a private Amazon S3 bucket or on a CDN host. A CDN would drastically -improve download times and therefore package installation. - -Example: A `prefix-url` of `https://my-bucket.s3.amazonaws.com` (and -`directory` set to `dist`) creates download URLs which look like the following: -`https://my-bucket.s3.amazonaws.com/dist/vendor-package-version-ref.zip`. - -### Web outputs - - * `output-html`: optional, `true` by default, when disabled (`false`) satis - will not generate the `output-dir`/index.html page. - * `twig-template`: optional, a path to a personalized [Twig] template for - the `output-dir`/index.html page. - -### Abandoned packages - -To enable your satis installation to indicate that some packages are abandoned, -add the following to your `satis.json`: - -```json -{ - "abandoned": { - "company/package": true, - "company/package2": "company/newpackage" - } -} -``` - -The `true` value indicates that the package is truly abandoned while the -`"company/newpackage"` value specifies that the package is replaced by the -`company/newpackage` package. - -Note that all packages set as abandoned in their own `composer.json` file will -be marked abandoned as well. - -### Resolving dependencies - -It is possible to make satis automatically resolve and add all dependencies for -your projects. This can be used with the Downloads functionality to have a -complete local mirror of packages. Add the following to your `satis.json`: - -```json -{ - "require-dependencies": true, - "require-dev-dependencies": true -} -``` - -When searching for packages, satis will attempt to resolve all the required -packages from the listed repositories. Therefore, if you are requiring a -package from Packagist, you will need to define it in your `satis.json`. - -Dev dependencies are packaged only if the `require-dev-dependencies` parameter -is set to true. - -### Other options - - * `providers`: optional, `false` by default, when enabled (`true`) each - package will be dumped into a separate include file which will be only - loaded by Composer when the package is really required. Speeds up composer - handling for repositories with huge number of packages like f.i. packagist. - * `output-dir`: optional, defines where to output the repository files if not - provided as an argument when calling the `build` command. - * `config`: optional, lets you define all config options from composer, except - `archive-format` and `archive-dir` as the configuration is done through - [archive](#downloads) instead. See docs on [config schema] for more details. - * `notify-batch`: optional, specify a URL that will be called every time a - user installs a package. See [notify-batch]. - -[ssh2 context options]: https://secure.php.net/manual/en/wrappers.ssh2.php#refsect1-wrappers.ssh2-options -[ssl context options]: https://secure.php.net/manual/en/context.ssl.php -[Twig]: https://twig.sensiolabs.org/ -[config schema]: https://getcomposer.org/doc/04-schema.md#config -[notify-batch]: https://getcomposer.org/doc/05-repositories.md#notify-batch diff --git a/app/vendor/composer/composer/doc/articles/plugins.md b/app/vendor/composer/composer/doc/articles/plugins.md deleted file mode 100644 index 818011887..000000000 --- a/app/vendor/composer/composer/doc/articles/plugins.md +++ /dev/null @@ -1,387 +0,0 @@ - - -# Setting up and using plugins - -## Synopsis - -You may wish to alter or expand Composer's functionality with your own. For -example if your environment poses special requirements on the behaviour of -Composer which do not apply to the majority of its users or if you wish to -accomplish something with Composer in a way that is not desired by most users. - -In these cases you could consider creating a plugin to handle your -specific logic. - -## Creating a Plugin - -A plugin is a regular Composer package which ships its code as part of the -package and may also depend on further packages. - -### Plugin Package - -The package file is the same as any other package file but with the following -requirements: - -1. The [type][1] attribute must be `composer-plugin`. -2. The [extra][2] attribute must contain an element `class` defining the - class name of the plugin (including namespace). If a package contains - multiple plugins, this can be an array of class names. -3. You must require the special package called `composer-plugin-api` - to define which Plugin API versions your plugin is compatible with. - Requiring this package doesn't actually include any extra dependencies, - it only specifies which version of the plugin API to use. - -> **Note:** When developing a plugin, although not required, it's useful to add -> a require-dev dependency on `composer/composer` to have IDE autocompletion on Composer classes. - -The required version of the `composer-plugin-api` follows the same [rules][7] -as a normal package's rules. - -The current Composer plugin API version is `2.3.0`. - -An example of a valid plugin `composer.json` file (with the autoloading -part omitted and an optional require-dev dependency on `composer/composer` for IDE auto completion): - -```json -{ - "name": "my/plugin-package", - "type": "composer-plugin", - "require": { - "composer-plugin-api": "^2.0" - }, - "require-dev": { - "composer/composer": "^2.0" - }, - "extra": { - "class": "My\\Plugin" - } -} -``` - -### Plugin Class - -Every plugin has to supply a class which implements the -[`Composer\Plugin\PluginInterface`][3]. The `activate()` method of the plugin -is called after the plugin is loaded and receives an instance of -[`Composer\Composer`][4] as well as an instance of -[`Composer\IO\IOInterface`][5]. Using these two objects all configuration can -be read and all internal objects and state can be manipulated as desired. - -Example: - -```php -getInstallationManager()->addInstaller($installer); - } -} -``` - -## Event Handler - -Furthermore plugins may implement the -[`Composer\EventDispatcher\EventSubscriberInterface`][6] in order to have its -event handlers automatically registered with the `EventDispatcher` when the -plugin is loaded. - -To register a method to an event, implement the method `getSubscribedEvents()` -and have it return an array. The array key must be the -[event name](https://getcomposer.org/doc/articles/scripts.md#event-names) -and the value is the name of the method in this class to be called. - -> **Note:** If you don't know which event to listen to, you can run a Composer -> command with the COMPOSER_DEBUG_EVENTS=1 environment variable set, which might -> help you identify what event you are looking for. - -```php -public static function getSubscribedEvents() -{ - return array( - 'post-autoload-dump' => 'methodToBeCalled', - // ^ event name ^ ^ method name ^ - ); -} -``` - -By default, the priority of an event handler is set to 0. The priority can be -changed by attaching a tuple where the first value is the method name, as -before, and the second value is an integer representing the priority. -Higher integers represent higher priorities. Priority 2 is called before -priority 1, etc. - -```php -public static function getSubscribedEvents() -{ - return array( - // Will be called before events with priority 0 - 'post-autoload-dump' => array('methodToBeCalled', 1) - ); -} -``` - -If multiple methods should be called, then an array of tuples can be attached -to each event. The tuples do not need to include the priority. If it is -omitted, it will default to 0. - -```php -public static function getSubscribedEvents() -{ - return array( - 'post-autoload-dump' => array( - array('methodToBeCalled' ), // Priority defaults to 0 - array('someOtherMethodName', 1), // This fires first - ) - ); -} -``` - -Here's a complete example: - -```php -composer = $composer; - $this->io = $io; - } - - public function deactivate(Composer $composer, IOInterface $io) - { - } - - public function uninstall(Composer $composer, IOInterface $io) - { - } - - public static function getSubscribedEvents() - { - return array( - PluginEvents::PRE_FILE_DOWNLOAD => array( - array('onPreFileDownload', 0) - ), - ); - } - - public function onPreFileDownload(PreFileDownloadEvent $event) - { - $protocol = parse_url($event->getProcessedUrl(), PHP_URL_SCHEME); - - if ($protocol === 's3') { - // ... - } - } -} -``` - -## Plugin capabilities - -Composer defines a standard set of capabilities which may be implemented by plugins. -Their goal is to make the plugin ecosystem more stable as it reduces the need to mess -with [`Composer\Composer`][4]'s internal state, by providing explicit extension points -for common plugin requirements. - -Capable Plugins classes must implement the [`Composer\Plugin\Capable`][8] interface -and declare their capabilities in the `getCapabilities()` method. -This method must return an array, with the _key_ as a Composer Capability class name, -and the _value_ as the Plugin's own implementation class name of said Capability: - -```php - 'My\Composer\CommandProvider', - ); - } -} -``` - -### Command provider - -The [`Composer\Plugin\Capability\CommandProvider`][9] capability allows to register -additional commands for Composer: - -```php -setName('custom-plugin-command'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $output->writeln('Executing'); - } -} -``` - -Now the `custom-plugin-command` is available alongside Composer commands. - -> _Composer commands are based on the [Symfony Console Component][10]._ - -## Running plugins manually - -Plugins for an event can be run manually by the `run-script` command. This works the same way as -[running scripts manually](scripts.md#running-scripts-manually). - -## Using Plugins - -Plugin packages are automatically loaded as soon as they are installed and will -be loaded when Composer starts up if they are found in the current project's -list of installed packages. Additionally all plugin packages installed in the -`COMPOSER_HOME` directory using the Composer global command are loaded before -local project plugins are loaded. - -> You may pass the `--no-plugins` option to Composer commands to disable all -> installed plugins. This may be particularly helpful if any of the plugins -> causes errors and you wish to update or uninstall it. - -## Plugin Helpers - -As of Composer 2, due to the fact that DownloaderInterface can sometimes return Promises -and have been split up in more steps than they used to, we provide a [SyncHelper][11] -to make downloading and installing packages easier. - -## Plugin Extra Attributes - -A few special plugin capabilities can be unlocked using extra attributes in the plugin's composer.json. - -### class - -[See above](#plugin-package) for an explanation of the class attribute and how it works. - -### plugin-modifies-downloads - -Some special plugins need to update package download URLs before they get downloaded. - -As of Composer 2.0, all packages are downloaded before they get installed. This means -on the first installation, your plugin is not yet installed when the download occurs, -and it does not get a chance to update the URLs on time. - -Specifying `{"extra": {"plugin-modifies-downloads": true}}` in your composer.json will -hint to Composer that the plugin should be installed on its own before proceeding with -the rest of the package downloads. This slightly slows down the overall installation -process however, so do not use it in plugins which do not absolutely require it. - -### plugin-modifies-install-path - -Some special plugins modify the install path of packages. - -As of Composer 2.2.9, you can specify `{"extra": {"plugin-modifies-install-path": true}}` -in your composer.json to hint to Composer that the plugin should be activated as soon -as possible to prevent any bad side-effects from Composer assuming packages are installed -in another location than they actually are. - -### plugin-optional - -Because Composer plugins can be used to perform actions which are necessary for installing -a working application, like modifying which path files get stored in, skipping required -plugins unintentionally can result in broken applications. So, in non-interactive mode, -Composer will fail if a new plugin is not listed in ["allow-plugins"](../06-config.md#allow-plugins) -to force users to decide if they want to execute the plugin, to avoid silent failures. - -As of Composer 2.5.3, you can use the setting `{"extra": {"plugin-optional": true}}` on -your plugin, to tell Composer that skipping the plugin has no catastrophic consequences, -and it can safely be disabled in non-interactive mode if it is not yet listed in -"allow-plugins". The next interactive run of Composer will still prompt users to choose if -they want to enable or disable the plugin. - -## Plugin Autoloading - -Due to plugins being loaded by Composer at runtime, and to ensure that plugins which -depend on other packages can function correctly, a runtime autoloader is created whenever -a plugin is loaded. That autoloader is only configured to load with the plugin dependencies, -so you may not have access to all the packages which are installed. - -## Static Analysis support - -As of Composer 2.3.7 we ship a `phpstan/rules.neon` PHPStan config file, which provides additional error checking when working on Composer plugins. - -### Usage with [PHPStan Extension Installer][13] - -The necessary configuration files are automatically loaded, in case your plugin projects declares a dependency to `phpstan/extension-installer`. - -### Alternative manual installation - -To make use of it, your Composer plugin project needs a [PHPStan config file][12], which includes the `phpstan/rules.neon` file: - -```neon -includes: - - vendor/composer/composer/phpstan/rules.neon - -// your remaining config.. -``` - -[1]: ../04-schema.md#type -[2]: ../04-schema.md#extra -[3]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/PluginInterface.php -[4]: https://github.com/composer/composer/blob/main/src/Composer/Composer.php -[5]: https://github.com/composer/composer/blob/main/src/Composer/IO/IOInterface.php -[6]: https://github.com/composer/composer/blob/main/src/Composer/EventDispatcher/EventSubscriberInterface.php -[7]: ../01-basic-usage.md#package-versions -[8]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/Capable.php -[9]: https://github.com/composer/composer/blob/main/src/Composer/Plugin/Capability/CommandProvider.php -[10]: https://symfony.com/doc/current/components/console.html -[11]: https://github.com/composer/composer/blob/main/src/Composer/Util/SyncHelper.php -[12]: https://phpstan.org/config-reference#multiple-files -[13]: https://github.com/phpstan/extension-installer#usage diff --git a/app/vendor/composer/composer/doc/articles/repository-priorities.md b/app/vendor/composer/composer/doc/articles/repository-priorities.md deleted file mode 100644 index baaefb314..000000000 --- a/app/vendor/composer/composer/doc/articles/repository-priorities.md +++ /dev/null @@ -1,95 +0,0 @@ - - -# Repository priorities - -## Canonical repositories - -When Composer resolves dependencies, it will look up a given package in the -topmost repository. If that repository does not contain the package, it -goes on to the next one, until one repository contains it and the process ends. - -Canonical repositories are better for a few reasons: - -- Performance wise, it is more efficient to stop looking for a package once it - has been found somewhere. It also avoids loading duplicate packages in case - the same package is present in several of your repositories. -- Security wise, it is safer to treat them canonically as it means that packages you - expect to come from your most important repositories will never be loaded from - another repository instead. Let's - say you have a private repository which is not canonical, and you require your - private package `foo/bar ^2.0` for example. Now if someone publishes - `foo/bar 2.999` to packagist.org, suddenly Composer will pick that package as it - has a higher version than your latest release (say 2.4.3), and you end up installing - something you may not have meant to. However, if the private repository is canonical, - that 2.999 version from packagist.org will not be considered at all. - -There are however a few cases where you may want to specifically load some packages -from a given repository, but not all. Or you may want a given repository to not be -canonical, and to be only preferred if it has higher package versions than the -repositories defined below. - -## Default behavior - -By default in Composer 2.x all repositories are canonical. Composer 1.x treated -all repositories as non-canonical. - -Another default is that the packagist.org repository is always added implicitly -as the last repository, unless you [disable it](../05-repositories.md#disabling-packagist-org). - -## Making repositories non-canonical - -You can add the canonical option to any repository to disable this default behavior -and make sure Composer keeps looking in other repositories, even if that repository -contains a given package. - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org", - "canonical": false - } - ] -} -``` - -## Filtering packages - -You can also filter packages which a repository will be able to load, either by -selecting which ones you want, or by excluding those you do not want. - -For example here we want to pick only the package `foo/bar` and all the packages from -`some-vendor/` from this Composer repository. - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org", - "only": ["foo/bar", "some-vendor/*"] - } - ] -} -``` - -And in this other example we exclude `toy/package` from a repository, which -we may not want to load in this project. - -```json -{ - "repositories": [ - { - "type": "composer", - "url": "https://example.org", - "exclude": ["toy/package"] - } - ] -} -``` - -Both `only` and `exclude` should be arrays of package names, which can also -contain wildcards (`*`), which will match any character. diff --git a/app/vendor/composer/composer/doc/articles/resolving-merge-conflicts.md b/app/vendor/composer/composer/doc/articles/resolving-merge-conflicts.md deleted file mode 100644 index 6daf98cdc..000000000 --- a/app/vendor/composer/composer/doc/articles/resolving-merge-conflicts.md +++ /dev/null @@ -1,154 +0,0 @@ - - -# Resolving merge conflicts - -When working as a team on the same Composer project, you will eventually run into a scenario -where multiple people added, updated or removed something in the `composer.json` and -`composer.lock` files in multiple branches. When those branches are eventually merged -together, you will get merge conflicts. Resolving these merge conflicts is not as straight -forward as on other files, especially not regarding the `composer.lock` file. - -> **Note:** It might not immediately be obvious why text based merging is not possible for -> lock files, so let's imagine the following example where we want to merge two branches; -> -> - Branch 1 has added package A which requires package B. Package B is locked at version `1.0.0`. -> - Branch 2 has added package C which conflicts with all versions below `1.2.0` of package B. -> -> A text based merge would result in package A version `1.0.0`, package B version `1.0.0` -> and package C version `1.0.0`. This is an invalid result, as the conflict of package C -> was not considered and would require an upgrade of package B. - -## 1. Reapplying changes - -The safest method to merge Composer files is to accept the version from one branch and apply -the changes from the other branch. - -An example where we have two branches: - -1. Package 'A' has been added -2. Package 'B' has been removed and package 'C' is added. - -To resolve the conflict when we merge these two branches: - -- We choose the branch that has the most changes, and accept the `composer.json` and `composer.lock` - files from that branch. In this case, we choose the Composer files from branch 2. -- We reapply the changes from the other branch (branch 1). In this case we have to run - `composer require package/A` again. - -## 2. Validating your merged files - -Before committing, make sure the resulting `composer.json` and `composer.lock` files are valid. -To do this, run the following commands: - -```shell -php composer.phar validate -php composer.phar install [--dry-run] -``` - -## Automating merge conflict resolving with git - -Some improvement _could_ be made to git's conflict resolving by using a custom git merge driver. - -An example of this can be found at [balbuf's composer git merge driver](https://github.com/balbuf/composer-git-merge-driver). - -## Important considerations - -Keep in mind that whenever merge conflicts occur on the lock file, the information, about the exact version -new packages were locked on for one of the branches, is lost. When package A in branch 1 is constrained -as `^1.2.0` and locked as `1.2.0`, it might get updated when branch 2 is used as baseline and a new -`composer require package/A:^1.2.0` is executed, as that will use the most recent version that the -constraint allows when possible. There might be a version 1.3.0 for that package available by now, which -will now be used instead. - -Choosing the correct [version constraints](../articles/versions.md) and making sure the packages adhere -to [semantic versioning](https://semver.org/) when using -[next significant release operators](versions.md#next-significant-release-operators) should make sure -that merging branches does not break anything by accidentally updating a dependency. - -# Recovering from incorrectly resolved merge conflicts - -If the above steps aren't followed and text based merges have been done anyway, -your Composer project might be in a state where unexpected behaviour is observed -because the `composer.lock` file is not (fully) in sync with the `composer.json` file. - -There are two things that can happen here: - -1. There are packages in the `require` or `require-dev` section of the `composer.json` file that are not in the lock file and as a result never installed - -> **Note:** Starting from Composer release 2.5, having packages that are required but not present in `composer.lock` results in an error when running `install` - -2. There are packages in the `composer.lock` file that are not a direct or indirect dependency of any of the packages required. As a result, a package is installed, even though running `composer why vendor/package` says it is not required. - -There are several ways to fix these issues; - -## A. Start from scratch - -The easiest but most impactful option is run a `composer update` to resolve to a correct state from scratch. - -A drawback to this is that previously locked package versions are now updated, as the information about previous package versions has been lost. If all your dependencies follow [semantic versioning](https://semver.org/) and your [version constraints](../articles/versions.md) are using [next significant release operators](versions.md#next-significant-release-operators) this should not be an issue, otherwise you might inadvertently break your application. - -## B. Reconstruct from the git history - -An option that is probably not very feasible in a lot of situations but that deserves an honorable mention; - -It might be possible to reconstruct the correct package state by going back into the git history and finding the most recent valid `composer.lock` file, and re-requiring the new dependencies from there. - -## C. Resolve issues manually - -There is an option to recover from a discrepancy between the `composer.json` and `composer.lock` file without having to dig through the git history or starting from scratch. For that, we need to solve issue 1 and 2 separately. - -### 1. Detecting and fixing missing required packages - -To detect any package that is required but not installed, you can simply run: - -```shell -php composer.phar validate -``` - -If there are packages that are required but not installed, you should get output similar to this: - -```shell -./composer.json is valid but your composer.lock has some errors -# Lock file errors -- Required package "vendor/package-name" is not present in the lock file. -This usually happens when composer files are incorrectly merged or the composer.json file is manually edited. -Read more about correctly resolving merge conflicts https://getcomposer.org/doc/articles/resolving-merge-conflicts.md -and prefer using the "require" command over editing the composer.json file directly https://getcomposer.org/doc/03-cli.md#require -``` - -To recover from this, simply run `composer update vendor/package-name` for each package listed here. After doing this for each package listed here, running `composer validate` again should result in no lock file errors: - -```shell -./composer.json is valid -``` - -### 2. Detecting and fixing superfluous packages - -To detect and fix packages that are locked but not a direct/indirect dependency, you can run the following command: - -```shell -php composer.phar remove --unused -``` - -If there are no packages locked that are not a dependency, the command will have the following output: - -```shell -No unused packages to remove -``` - -If there are packages to be cleaned up, the output will be as follows: - -```shell -vendor/package-name is not required in your composer.json and has not been removed -./composer.json has been updated -Running composer update vendor/package-name -Loading composer repositories with package information -Updating dependencies -Lock file operations: 0 installs, 0 updates, 1 removal - - Removing vendor/package-name (1.0) -Writing lock file -Installing dependencies from lock file (including require-dev) -Nothing to install, update or remove -``` diff --git a/app/vendor/composer/composer/doc/articles/scripts.md b/app/vendor/composer/composer/doc/articles/scripts.md deleted file mode 100644 index f83db4072..000000000 --- a/app/vendor/composer/composer/doc/articles/scripts.md +++ /dev/null @@ -1,443 +0,0 @@ - - -# Scripts - -## What is a script? - -A script, in Composer's terms, can either be a PHP callback (defined as a -static method) or any command-line executable command. Scripts are useful -for executing a package's custom code or package-specific commands during -the Composer execution process. - -As of Composer 2.5 scripts can also be Symfony Console Command classes, -which allows you to easily run them including passing options. This is -however not recommended for handling events. - -> **Note:** Only scripts defined in the root package's `composer.json` are -> executed. If a dependency of the root package specifies its own scripts, -> Composer does not execute those additional scripts. - -## Event names - -Composer fires the following named events during its execution process: - -### Command Events - -- **pre-install-cmd**: occurs before the `install` command is executed with a - lock file present. -- **post-install-cmd**: occurs after the `install` command has been executed - with a lock file present. -- **pre-update-cmd**: occurs before the `update` command is executed, or before - the `install` command is executed without a lock file present. -- **post-update-cmd**: occurs after the `update` command has been executed, or - after the `install` command has been executed without a lock file present. -- **pre-status-cmd**: occurs before the `status` command is executed. -- **post-status-cmd**: occurs after the `status` command has been executed. -- **pre-archive-cmd**: occurs before the `archive` command is executed. -- **post-archive-cmd**: occurs after the `archive` command has been executed. -- **pre-autoload-dump**: occurs before the autoloader is dumped, either during - `install`/`update`, or via the `dump-autoload` command. -- **post-autoload-dump**: occurs after the autoloader has been dumped, either - during `install`/`update`, or via the `dump-autoload` command. -- **post-root-package-install**: occurs after the root package has been - installed during the `create-project` command (but before its - dependencies are installed). -- **post-create-project-cmd**: occurs after the `create-project` command has - been executed. - -### Installer Events - -- **pre-operations-exec**: occurs before the install/upgrade/.. operations - are executed when installing a lock file. Plugins that need to hook into - this event will need to be installed globally to be usable, as otherwise - they would not be loaded yet when a fresh install of a project happens. - -### Package Events - -- **pre-package-install**: occurs before a package is installed. -- **post-package-install**: occurs after a package has been installed. -- **pre-package-update**: occurs before a package is updated. -- **post-package-update**: occurs after a package has been updated. -- **pre-package-uninstall**: occurs before a package is uninstalled. -- **post-package-uninstall**: occurs after a package has been uninstalled. - -### Plugin Events - -- **init**: occurs after a Composer instance is done being initialized. -- **command**: occurs before any Composer Command is executed on the CLI. It - provides you with access to the input and output objects of the program. -- **pre-file-download**: occurs before files are downloaded and allows - you to manipulate the `HttpDownloader` object prior to downloading files - based on the URL to be downloaded. -- **post-file-download**: occurs after package dist files are downloaded and - allows you to perform additional checks on the file if required. -- **pre-command-run**: occurs before a command is executed and allows you to - manipulate the `InputInterface` object's options and arguments to tweak - a command's behavior. -- **pre-pool-create**: occurs before the Pool of packages is created, and lets - you filter the list of packages that is going to enter the Solver. - -> **Note:** Composer makes no assumptions about the state of your dependencies -> prior to `install` or `update`. Therefore, you should not specify scripts -> that require Composer-managed dependencies in the `pre-update-cmd` or -> `pre-install-cmd` event hooks. If you need to execute scripts prior to -> `install` or `update` please make sure they are self-contained within your -> root package. - -## Defining scripts - -The root JSON object in `composer.json` should have a property called -`"scripts"`, which contains pairs of named events and each event's -corresponding scripts. An event's scripts can be defined as either a string -(only for a single script) or an array (for single or multiple scripts.) - -For any given event: - -- Scripts execute in the order defined when their corresponding event is fired. -- An array of scripts wired to a single event can contain both PHP callbacks -and command-line executable commands. -- PHP classes and commands containing defined callbacks must be autoloadable -via Composer's autoload functionality. -- Callbacks can only autoload classes from psr-0, psr-4 and classmap -definitions. If a defined callback relies on functions defined outside of a -class, the callback itself is responsible for loading the file containing these -functions. - -Script definition example: - -```json -{ - "scripts": { - "post-update-cmd": "MyVendor\\MyClass::postUpdate", - "post-package-install": [ - "MyVendor\\MyClass::postPackageInstall" - ], - "post-install-cmd": [ - "MyVendor\\MyClass::warmCache", - "phpunit -c app/" - ], - "post-autoload-dump": [ - "MyVendor\\MyClass::postAutoloadDump" - ], - "post-create-project-cmd": [ - "php -r \"copy('config/local-example.php', 'config/local.php');\"" - ] - } -} -``` - -Using the previous definition example, here's the class `MyVendor\MyClass` -that might be used to execute the PHP callbacks: - -```php -getComposer(); - // do stuff - } - - public static function postAutoloadDump(Event $event) - { - $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir'); - require $vendorDir . '/autoload.php'; - - some_function_from_an_autoloaded_file(); - } - - public static function postPackageInstall(PackageEvent $event) - { - $installedPackage = $event->getOperation()->getPackage(); - // do stuff - } - - public static function warmCache(Event $event) - { - // make cache toasty - } -} -``` - -**Note:** During a Composer `install` or `update` command run, a variable named -`COMPOSER_DEV_MODE` will be added to the environment. If the command was run -with the `--no-dev` flag, this variable will be set to 0, otherwise it will be -set to 1. The variable is also available while `dump-autoload` runs, and it -will be set to the same as the last `install` or `update` was run in. - -## Event classes - -When an event is fired, your PHP callback receives as first argument a -`Composer\EventDispatcher\Event` object. This object has a `getName()` method -that lets you retrieve the event name. - -Depending on the [script types](#event-names) you will get various event -subclasses containing various getters with relevant data and associated -objects: - -- Base class: [`Composer\EventDispatcher\Event`](https://github.com/composer/composer/blob/main/src/Composer/EventDispatcher/Event.php) -- Command Events: [`Composer\Script\Event`](https://github.com/composer/composer/blob/main/src/Composer/Script/Event.php) -- Installer Events: [`Composer\Installer\InstallerEvent`](https://github.com/composer/composer/blob/main/src/Composer/Installer/InstallerEvent.php) -- Package Events: [`Composer\Installer\PackageEvent`](https://github.com/composer/composer/blob/main/src/Composer/Installer/PackageEvent.php) -- Plugin Events: - - init: [`Composer\EventDispatcher\Event`](https://github.com/composer/composer/blob/main/src/Composer/EventDispatcher/Event.php) - - command: [`Composer\Plugin\CommandEvent`](https://github.com/composer/composer/blob/main/src/Composer/Plugin/CommandEvent.php) - - pre-file-download: [`Composer\Plugin\PreFileDownloadEvent`](https://github.com/composer/composer/blob/main/src/Composer/Plugin/PreFileDownloadEvent.php) - - post-file-download: [`Composer\Plugin\PostFileDownloadEvent`](https://github.com/composer/composer/blob/main/src/Composer/Plugin/PostFileDownloadEvent.php) - -## Running scripts manually - -If you would like to run the scripts for an event manually, the syntax is: - -```shell -php composer.phar run-script [--dev] [--no-dev] script -``` - -For example `composer run-script post-install-cmd` will run any -**post-install-cmd** scripts and [plugins](plugins.md) that have been defined. - -You can also give additional arguments to the script handler by appending `--` -followed by the handler arguments. e.g. -`composer run-script post-install-cmd -- --check` will pass`--check` along to -the script handler. Those arguments are received as CLI arg by CLI handlers, -and can be retrieved as an array via `$event->getArguments()` by PHP handlers. - -## Writing custom commands - -If you add custom scripts that do not fit one of the predefined event name -above, you can either run them with run-script or also run them as native -Composer commands. For example the handler defined below is executable by -running `composer test`: - -```json -{ - "scripts": { - "test": "phpunit", - "do-something": "MyVendor\\MyClass::doSomething" - "my-cmd": "MyVendor\\MyCommand" - } -} -``` - -Similar to the `run-script` command you can give additional arguments to scripts, -e.g. `composer test -- --filter ` will pass `--filter ` along -to the `phpunit` script. - -Using a PHP method via `composer do-something arg` lets you execute a -`static function doSomething(\Composer\Script\Event $event)` and `arg` becomes -available in `$event->getArguments()`. This however does not let you easily pass -custom options in the form of `--flags`. - -Using a [symfony/console](https://packagist.org/packages/symfony/console) `Command` -class you can define and access arguments and options more easily. - -For example with the command below you can then simply call `composer my-cmd ---arbitrary-flag` without even the need for a `--` separator. To be detected -as symfony/console commands the class name must end with `Command` and extend -symfony's `Command` class. Also note that this will run using Composer's built-in -symfony/console version which may not match the one you have required in your -project, and may change between Composer minor releases. If you need more -safety guarantees you should rather use your own binary file that runs your own -symfony/console version in isolation in its own process then. - -```php -setDefinition([ - new InputOption('arbitrary-flag', null, InputOption::VALUE_NONE, 'Example flag'), - new InputArgument('foo', InputArgument::OPTIONAL, 'Optional arg'), - ]); - } - - public function execute(InputInterface $input, OutputInterface $output): int - { - if ($input->getOption('arbitrary-flag')) { - $output->writeln('The flag was used') - } - - return 0; - } -} -``` - -> **Note:** Before executing scripts, Composer's bin-dir is temporarily pushed -> on top of the PATH environment variable so that binaries of dependencies -> are directly accessible. In this example no matter if the `phpunit` binary is -> actually in `vendor/bin/phpunit` or `bin/phpunit` it will be found and executed. - - -## Managing the process timeout - -Although Composer is not intended to manage long-running processes and other -such aspects of PHP projects, it can sometimes be handy to disable the process -timeout on custom commands. This timeout defaults to 300 seconds and can be -overridden in a variety of ways depending on the desired effect: - -- disable it for all commands using the config key `process-timeout`, -- disable it for the current or future invocations of composer using the - environment variable `COMPOSER_PROCESS_TIMEOUT`, -- for a specific invocation using the `--timeout` flag of the `run-script` command, -- using a static helper for specific scripts. - -To disable the timeout for specific scripts with the static helper directly in -composer.json: - -```json -{ - "scripts": { - "test": [ - "Composer\\Config::disableProcessTimeout", - "phpunit" - ] - } -} -``` - -To disable the timeout for every script on a given project, you can use the -composer.json configuration: - -```json -{ - "config": { - "process-timeout": 0 - } -} -``` - -It's also possible to set the global environment variable to disable the timeout -of all following scripts in the current terminal environment: - -```shell -export COMPOSER_PROCESS_TIMEOUT=0 -``` - -To disable the timeout of a single script call, you must use the `run-script` composer -command and specify the `--timeout` parameter: - -```shell -php composer.phar run-script --timeout=0 test -``` - -## Referencing scripts - -To enable script re-use and avoid duplicates, you can call a script from another -one by prefixing the command name with `@`: - -```json -{ - "scripts": { - "test": [ - "@clearCache", - "phpunit" - ], - "clearCache": "rm -rf cache/*" - } -} -``` - -You can also refer a script and pass it new arguments: - -```json -{ - "scripts": { - "tests": "phpunit", - "testsVerbose": "@tests -vvv" - } -} -``` - -## Calling Composer commands - -To call Composer commands, you can use `@composer` which will automatically -resolve to whatever composer.phar is currently being used: - -```json -{ - "scripts": { - "test": [ - "@composer install", - "phpunit" - ] - } -} -``` - -One limitation of this is that you can not call multiple composer commands in -a row like `@composer install && @composer foo`. You must split them up in a -JSON array of commands. - -## Executing PHP scripts - -To execute PHP scripts, you can use `@php` which will automatically -resolve to whatever php process is currently being used: - -```json -{ - "scripts": { - "test": [ - "@php script.php", - "phpunit" - ] - } -} -``` - -One limitation of this is that you can not call multiple commands in -a row like `@php install && @php foo`. You must split them up in a -JSON array of commands. - -You can also call a shell/bash script, which will have the path to -the PHP executable available in it as a `PHP_BINARY` env var. - -## Setting environment variables - -To set an environment variable in a cross-platform way, you can use `@putenv`: - -```json -{ - "scripts": { - "install-phpstan": [ - "@putenv COMPOSER=phpstan-composer.json", - "composer install --prefer-dist" - ] - } -} -``` - -## Custom descriptions. - -You can set custom script descriptions with the following in your `composer.json`: - -```json -{ - "scripts-descriptions": { - "test": "Run all tests!" - } -} -``` - -The descriptions are used in `composer list` or `composer run -l` commands to -describe what the scripts do when the command is run. - -> **Note:** You can only set custom descriptions of custom commands. diff --git a/app/vendor/composer/composer/doc/articles/troubleshooting.md b/app/vendor/composer/composer/doc/articles/troubleshooting.md deleted file mode 100644 index b90a17385..000000000 --- a/app/vendor/composer/composer/doc/articles/troubleshooting.md +++ /dev/null @@ -1,393 +0,0 @@ - -# Troubleshooting - -This is a list of common pitfalls on using Composer, and how to avoid them. - - -## General - -1. When facing any kind of problems using Composer, be sure to **work with the - latest version**. See [self-update](../03-cli.md#self-update) for details. - -2. Before asking anyone, run [`composer diagnose`](../03-cli.md#diagnose) to check - for common problems. If it all checks out, proceed to the next steps. - -3. Make sure you have no problems with your setup by running the installer's - checks via `curl -sS https://getcomposer.org/installer | php -- --check`. - -4. Try clearing Composer's cache by running `composer clear-cache`. - -5. Ensure you're **installing vendors straight from your `composer.json`** via - `rm -rf vendor && composer update -v` when troubleshooting, excluding any - possible interferences with existing vendor installations or `composer.lock` - entries. - - -## Package not found - -1. Double-check you **don't have typos** in your `composer.json` or repository - branches and tag names. - -2. Be sure to **set the right - [minimum-stability](../04-schema.md#minimum-stability)**. To get started or be - sure this is no issue, set `minimum-stability` to "dev". - -3. Packages **not coming from [Packagist](https://packagist.org/)** should - always be **defined in the root package** (the package depending on all - vendors). - -4. Use the **same vendor and package name** throughout all branches and tags of - your repository, especially when maintaining a third party fork and using - `replace`. - -5. If you are updating to a recently published version of a package, be aware that - Packagist has a delay of up to 1 minute before new packages are visible to Composer. - -6. If you are updating a single package, it may depend on newer versions itself. - In this case add the `--with-dependencies` argument **or** add all dependencies which - need an update to the command. - - -## Package is not updating to the expected version - -Try running `php composer.phar why-not [package-name] [expected-version]`. - - -## Dependencies on the root package - -When your root package depends on a package which ends up depending (directly or -indirectly) back on the root package itself, issues can occur in two cases: - -1. During development, if you are on a branch like `dev-main` and the branch has no - [branch-alias](aliases.md#branch-alias) defined, and the dependency on the root package - requires version `^2.0` for example, the `dev-main` version will not satisfy it. - The best solution here is to make sure you first define a branch alias. - -2. In CI (Continuous Integration) runs, the problem might be that Composer is not able - to detect the version of the root package properly. If it is a git clone it is - generally alright and Composer will detect the version of the current branch, - but some CIs do shallow clones so that process can fail when testing pull requests - and feature branches. In these cases the branch alias may then not be recognized. - The best solution is to define the version you are on via an environment variable - called COMPOSER_ROOT_VERSION. You set it to `dev-main` for example to define - the root package's version as `dev-main`. - Use for example: `COMPOSER_ROOT_VERSION=dev-main composer install` to export - the variable only for the call to composer, or you can define it globally in the - CI env vars. - - -## Network timeout issues, curl error - -If you see something along the lines of: - -``` -Failed to download * curl error 28 while downloading * Operation timed out after 300000 milliseconds -``` - -It means your network is probably so slow that a request took over 300seconds to complete. This is the -minimum timeout Composer will use, but you can increase it by increasing the `default_socket_timeout` -value in your php.ini to something higher. - - -## Package not found in a Jenkins-build - -1. Check the ["Package not found"](#package-not-found) item above. - -2. The git-clone / checkout within Jenkins leaves the branch in a "detached HEAD"-state. As - a result, Composer may not able to identify the version of the current checked out branch - and may not be able to resolve a [dependency on the root package](#dependencies-on-the-root-package). - To solve this problem, you can use the "Additional Behaviours" -> "Check out to specific local - branch" in your Git-settings for your Jenkins-job, where your "local branch" shall be the same - branch as you are checking out. Using this, the checkout will not be in detached state any more - and the dependency on the root package should become satisfied. - - -## I have a dependency which contains a "repositories" definition in its composer.json, but it seems to be ignored. - -The [`repositories`](../04-schema.md#repositories) configuration property is defined as [root-only](../04-schema.md#root-package). It is not inherited. You can read more about the reasons behind this in the "[why can't -Composer load repositories recursively?](../faqs/why-cant-composer-load-repositories-recursively.md)" article. -The simplest work-around to this limitation, is moving or duplicating the `repositories` definition into your root -composer.json. - - -## I have locked a dependency to a specific commit but get unexpected results. - -While Composer supports locking dependencies to a specific commit using the `#commit-ref` syntax, there are certain -caveats that one should take into account. The most important one is [documented](../04-schema.md#package-links), but -frequently overlooked: - -> **Note:** While this is convenient at times, it should not be how you use -> packages in the long term because it comes with a technical limitation. The -> composer.json metadata will still be read from the branch name you specify -> before the hash. Because of that in some cases it will not be a practical -> workaround, and you should always try to switch to tagged releases as soon -> as you can. - -There is no simple work-around to this limitation. It is therefore strongly recommended that you do not use it. - - -## Need to override a package version - -Let's say your project depends on package A, which in turn depends on a specific -version of package B (say 0.1). But you need a different version of said package B (say 0.11). - -You can fix this by aliasing version 0.11 to 0.1: - -composer.json: - -```json -{ - "require": { - "A": "0.2", - "B": "0.11 as 0.1" - } -} -``` - -See [aliases](aliases.md) for more information. - - -## Figuring out where a config value came from - -Use `php composer.phar config --list --source` to see where each config value originated from. - - -## Memory limit errors - -The first thing to do is to make sure you are running Composer 2, and if possible 2.2.0 or above. - -Composer 1 used much more memory and upgrading to the latest version will give you much better and faster results. - -Composer may sometimes fail on some commands with this message: - -`PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>` - -In this case, the PHP `memory_limit` should be increased. - -> **Note:** Composer internally increases the `memory_limit` to `1.5G`. - -To get the current `memory_limit` value, run: - -```shell -php -r "echo ini_get('memory_limit').PHP_EOL;" -``` - -Try increasing the limit in your `php.ini` file (ex. `/etc/php5/cli/php.ini` for -Debian-like systems): - -```ini -; Use -1 for unlimited or define an explicit value like 2G -memory_limit = -1 -``` - -Composer also respects a memory limit defined by the `COMPOSER_MEMORY_LIMIT` environment variable: - -```shell -COMPOSER_MEMORY_LIMIT=-1 composer.phar <...> -``` - -Or, you can increase the limit with a command-line argument: - -```shell -php -d memory_limit=-1 composer.phar <...> -``` - -This issue can also happen on cPanel instances, when the shell fork bomb protection is activated. For more information, see the [documentation](https://documentation.cpanel.net/display/68Docs/Shell+Fork+Bomb+Protection) of the fork bomb feature on the cPanel site. - - -## Xdebug impact on Composer - -To improve performance when the Xdebug extension is enabled, Composer automatically restarts PHP without it. -You can override this behavior by using an environment variable: `COMPOSER_ALLOW_XDEBUG=1`. - -Composer will always show a warning if Xdebug is being used, but you can override this with an environment variable: -`COMPOSER_DISABLE_XDEBUG_WARN=1`. If you see this warning unexpectedly, then the restart process has failed: -please report this [issue](https://github.com/composer/composer/issues). - - -## "The system cannot find the path specified" (Windows) - -1. Open regedit. -2. Search for an `AutoRun` key inside `HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor`, - `HKEY_CURRENT_USER\Software\Microsoft\Command Processor` - or `HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Command Processor`. -3. Check if it contains any path to a non-existent file, if it's the case, remove them. - - -## API rate limit and OAuth tokens - -Because of GitHub's rate limits on their API it can happen that Composer prompts -for authentication asking your username and password so it can go ahead with its work. - -If you would prefer not to provide your GitHub credentials to Composer you can -manually create a token using the [procedure documented here](authentication-for-private-packages.md#github-oauth). - -Now Composer should install/update without asking for authentication. - - -## proc_open(): fork failed errors - -If Composer shows proc_open() fork failed on some commands: - -`PHP Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar` - -This could be happening because the VPS runs out of memory and has no Swap space enabled. - -```shell -free -m -``` -```text -total used free shared buffers cached -Mem: 2048 357 1690 0 0 237 --/+ buffers/cache: 119 1928 -Swap: 0 0 0 -``` - -To enable the swap you can use for example: - -```shell -/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 -/sbin/mkswap /var/swap.1 -/bin/chmod 0600 /var/swap.1 -/sbin/swapon /var/swap.1 -``` -You can make a permanent swap file following this [tutorial](https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04). - - -## proc_open(): failed to open stream errors (Windows) - -If Composer shows proc_open(NUL) errors on Windows: - -`proc_open(NUL): failed to open stream: No such file or directory` - -This could be happening because you are working in a _OneDrive_ directory and -using a version of PHP that does not support the file system semantics of this -service. The issue was fixed in PHP 7.2.23 and 7.3.10. - -Alternatively it could be because the Windows Null Service is not enabled. For -more information, see this [issue](https://github.com/composer/composer/issues/7186#issuecomment-373134916). - - -## Degraded Mode - -Due to some intermittent issues on Travis and other systems, we introduced a -degraded network mode which helps Composer finish successfully but disables -a few optimizations. This is enabled automatically when an issue is first -detected. If you see this issue sporadically you probably don't have to worry -(a slow or overloaded network can also cause those time outs), but if it -appears repeatedly you might want to look at the options below to identify -and resolve it. - -If you have been pointed to this page, you want to check a few things: - -- If you are using ESET antivirus, go in "Advanced Settings" and disable "HTTP-scanner" - under "web access protection" -- If you are using IPv6, try disabling it. If that solves your issues, get in touch - with your ISP or server host, the problem is not at the Packagist level but in the - routing rules between you and Packagist (i.e. the internet at large). The best way to get - these fixed is to raise awareness to the network engineers that have the power to fix it. - Take a look at the next section for IPv6 workarounds. -- If none of the above helped, please report the error. - - -## Operation timed out (IPv6 issues) - -You may run into errors if IPv6 is not configured correctly. A common error is: - -```text -The "https://getcomposer.org/version" file could not be downloaded: failed to -open stream: Operation timed out -``` - -We recommend you fix your IPv6 setup. If that is not possible, you can try the -following workarounds: - -**Workaround Linux:** - -On linux, it seems that running this command helps to make ipv4 traffic have a -higher priority than ipv6, which is a better alternative than disabling ipv6 entirely: - -```shell -sudo sh -c "echo 'precedence ::ffff:0:0/96 100' >> /etc/gai.conf" -``` - -**Workaround Windows:** - -On windows the only way is to disable ipv6 entirely I am afraid (either in windows or in your home router). - -**Workaround Mac OS X:** - -Get name of your network device: - -```shell -networksetup -listallnetworkservices -``` - -Disable IPv6 on that device (in this case "Wi-Fi"): - -```shell -networksetup -setv6off Wi-Fi -``` - -Run Composer ... - -You can enable IPv6 again with: - -```shell -networksetup -setv6automatic Wi-Fi -``` - -That said, if this fixes your problem, please talk to your ISP about it to -try to resolve the routing errors. That's the best way to get things resolved -for everyone. - - -## Composer hangs with SSH ControlMaster - -When you try to install packages from a Git repository and you use the `ControlMaster` -setting for your SSH connection, Composer might hang endlessly and you see a `sh` -process in the `defunct` state in your process list. - -The reason for this is a SSH Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1988 - -As a workaround, open a SSH connection to your Git host before running Composer: - -```shell -ssh -t git@mygitserver.tld -php composer.phar update -``` - -See also https://github.com/composer/composer/issues/4180 for more information. - - -## Zip archives are not unpacked correctly. - -Composer can unpack zipballs using either a system-provided `unzip` or `7z` (7-Zip) utility, or PHP's -native `ZipArchive` class. On OSes where ZIP files can contain permissions and symlinks, we recommend -installing `unzip` or `7z` as these features are not supported by `ZipArchive`. - - -## Disabling the pool optimizer - -In Composer, the `Pool` class contains all the packages that are relevant for the dependency -resolving process. That is what is used to generate all the rules which are then -passed on to the dependency solver. -In order to improve performance, Composer tries to optimize this `Pool` by removing useless -package information early on. - -If all goes well, you should never notice any issues with it but in case you run into -an unexpected result such as an unresolvable set of dependencies or conflicts where you -think Composer is wrong, you might want to disable the optimizer by using the environment -variable `COMPOSER_POOL_OPTIMIZER` and run the update again like so: - -```shell -COMPOSER_POOL_OPTIMIZER=0 php composer.phar update -``` - -Now double check if the result is still the same. It will take significantly longer and use -a lot more memory to run the dependency resolving process. - -If the result is different, you likely hit a problem in the pool optimizer. -Please [report this issue](https://github.com/composer/composer/issues) so it can be fixed. diff --git a/app/vendor/composer/composer/doc/articles/vendor-binaries.md b/app/vendor/composer/composer/doc/articles/vendor-binaries.md deleted file mode 100644 index 9c0de3240..000000000 --- a/app/vendor/composer/composer/doc/articles/vendor-binaries.md +++ /dev/null @@ -1,165 +0,0 @@ - - -# Vendor binaries and the `vendor/bin` directory - -## What is a vendor binary? - -Any command line script that a Composer package would like to pass along -to a user who installs the package should be listed as a vendor binary. - -If a package contains other scripts that are not needed by the package -users (like build or compile scripts) that code should not be listed -as a vendor binary. - -## How is it defined? - -It is defined by adding the `bin` key to a project's `composer.json`. -It is specified as an array of files so multiple binaries can be added -for any given project. - -```json -{ - "bin": ["bin/my-script", "bin/my-other-script"] -} -``` - -## What does defining a vendor binary in composer.json do? - -It instructs Composer to install the package's binaries to `vendor/bin` -for any project that **depends** on that project. - -This is a convenient way to expose useful scripts that would -otherwise be hidden deep in the `vendor/` directory. - -## What happens when Composer is run on a composer.json that defines vendor binaries? - -For the binaries that a package defines directly, nothing happens. - -## What happens when Composer is run on a composer.json that has dependencies with vendor binaries listed? - -Composer looks for the binaries defined in all of the dependencies. A -proxy file (or two on Windows/WSL) is created from each dependency's -binaries to `vendor/bin`. - -Say package `my-vendor/project-a` has binaries setup like this: - -```json -{ - "name": "my-vendor/project-a", - "bin": ["bin/project-a-bin"] -} -``` - -Running `composer install` for this `composer.json` will not do -anything with `bin/project-a-bin`. - -Say project `my-vendor/project-b` has requirements setup like this: - -```json -{ - "name": "my-vendor/project-b", - "require": { - "my-vendor/project-a": "*" - } -} -``` - -Running `composer install` for this `composer.json` will look at -all of project-a's binaries and install them to `vendor/bin`. - -In this case, Composer will make `vendor/my-vendor/project-a/bin/project-a-bin` -available as `vendor/bin/project-a-bin`. - -## Finding the Composer autoloader from a binary - -As of Composer 2.2, a new `$_composer_autoload_path` global variable -is defined by the bin proxy file, so that when your binary gets executed -it can use it to easily locate the project's autoloader. - -This global will not be available however when running binaries defined -by the root package itself, so you need to have a fallback in place. - -This can look like this for example: - -```php - - -# Versions and constraints - -## Composer Versions vs VCS Versions - -Because Composer is heavily geared toward utilizing version control systems -like git, the term "version" can be a little ambiguous. In the sense of a -version control system, a "version" is a specific set of files that contain -specific data. In git terminology, this is a "ref", or a specific commit, -which may be represented by a branch HEAD or a tag. When you check out that -version in your VCS -- for example, tag `v1.1` or commit `e35fa0d` --, you're -asking for a single, known set of files, and you always get the same files back. - -In Composer, what's often referred to casually as a version -- that is, -the string that follows the package name in a require line (e.g., `~1.1` or -`1.2.*`) -- is actually more specifically a version constraint. Composer -uses version constraints to figure out which refs in a VCS it should be -checking out (or to verify that a given library is acceptable in -the case of a statically-maintained library with a `version` specification -in `composer.json`). - -## VCS Tags and Branches - -*For the following discussion, let's assume the following sample library -repository:* - -```shell -~/my-library$ git branch -``` -```text -v1 -v2 -my-feature -another-feature -``` - -```shell -~/my-library$ git tag -``` -```text -v1.0 -v1.0.1 -v1.0.2 -v1.1-BETA -v1.1-RC1 -v1.1-RC2 -v1.1 -v1.1.1 -v2.0-BETA -v2.0-RC1 -v2.0 -v2.0.1 -v2.0.2 -``` - -### Tags - -Normally, Composer deals with tags (as opposed to branches -- if you don't -know what this means, read up on -[version control systems](https://en.wikipedia.org/wiki/Version_control#Common_terminology)). -When you write a version constraint, it may reference a specific tag (e.g., -`1.1`) or it may reference a valid range of tags (e.g., `>=1.1 <2.0`, or -`~4.0`). To resolve these constraints, Composer first asks the VCS to list -all available tags, then creates an internal list of available versions based -on these tags. In the above example, composer's internal list includes versions -`1.0`, `1.0.1`, `1.0.2`, the beta release of `1.1`, the first and second -release candidates of `1.1`, the final release version `1.1`, etc.... (Note -that Composer automatically removes the 'v' prefix in the actual tagname to -get a valid final version number.) - -When Composer has a complete list of available versions from your VCS, it then -finds the highest version that matches all version constraints in your project -(it's possible that other packages require more specific versions of the -library than you do, so the version it chooses may not always be the highest -available version) and it downloads a zip archive of that tag to unpack in the -correct location in your `vendor` directory. - -### Branches - -If you want Composer to check out a branch instead of a tag, you need to point it to the branch using the special `dev-*` prefix (or sometimes suffix; see below). If you're checking out a branch, it's assumed that you want to *work* on the branch and Composer actually clones the repo into the correct place in your `vendor` directory. For tags, it copies the right files without actually cloning the repo. (You can modify this behavior with --prefer-source and --prefer-dist, see [install options](../03-cli.md#install).) - -In the above example, if you wanted to check out the `my-feature` branch, you would specify `dev-my-feature` as the version constraint in your `require` clause. This would result in Composer cloning the `my-library` repository into my `vendor` directory and checking out the `my-feature` branch. - -When branch names look like versions, we have to clarify for Composer that we're trying to check out a branch and not a tag. In the above example, we have two version branches: `v1` and `v2`. To get Composer to check out one of these branches, you must specify a version constraint that looks like this: `v1.x-dev`. The `.x` is an arbitrary string that Composer requires to tell it that we're talking about the `v1` branch and not a `v1` tag (alternatively, you can name the branch `v1.x` instead of `v1`). In the case of a branch with a version-like name (`v1`, in this case), you append `-dev` as a suffix, rather than using `dev-` as a prefix. - -### Stabilities - -Composer recognizes the following stabilities (in order of stability): dev, -alpha, beta, RC, and stable where RC stands for release candidate. The stability -of a version is defined by its suffix e.g version `v1.1-BETA` has a stability of -`beta` and `v1.1-RC1` has a stability of `RC`. If such a suffix is missing -e.g. version `v1.1` then Composer considers that version `stable`. In addition -to that Composer automatically adds a `-dev` suffix to all numeric branches and -prefixes all other branches imported from a VCS repository with `dev-`. In both -cases the stability `dev` gets assigned. - -Keeping this in mind will help you in the next section. - -### Minimum Stability - -There's one more thing that will affect which files are checked out of a library's VCS and added to your project: Composer allows you to specify stability constraints to limit which tags are considered valid. In the above example, note that the library released a beta and two release candidates for version `1.1` before the final official release. To receive these versions when running `composer install` or `composer update`, we have to explicitly tell Composer that we are ok with release candidates and beta releases (and alpha releases, if we want those). This can be done using either a project-wide `minimum-stability` value in `composer.json` or using "stability flags" in version constraints. Read more on the [schema page](../04-schema.md#minimum-stability). - -## Writing Version Constraints - -Now that you have an idea of how Composer sees versions, let's talk about how -to specify version constraints for your project dependencies. - -### Exact Version Constraint - -You can specify the exact version of a package. This will tell Composer to -install this version and this version only. If other dependencies require -a different version, the solver will ultimately fail and abort any install -or update procedures. - -Example: `1.0.2` - -### Version Range - -By using comparison operators you can specify ranges of valid versions. Valid -operators are `>`, `>=`, `<`, `<=`, `!=`. - -You can define multiple ranges. Ranges separated by a space ( ) -or comma (`,`) will be treated as a **logical AND**. A double pipe (`||`) -will be treated as a **logical OR**. AND has higher precedence than OR. - -> **Note:** Be careful when using unbounded ranges as you might end up -> unexpectedly installing versions that break backwards compatibility. -> Consider using the [caret](#caret-version-range-) operator instead for safety. - - -> **Note:** In older versions of Composer the single pipe (`|`) was the -> recommended alternative to the **logical OR**. Thus for backwards compatibility -> the single pipe (`|`) will still be treated as a **logical OR**. - -Examples: - -* `>=1.0` -* `>=1.0 <2.0` -* `>=1.0 <1.1 || >=1.2` - -### Hyphenated Version Range (` - `) - -Inclusive set of versions. Partial versions on the right include are completed -with a wildcard. For example `1.0 - 2.0` is equivalent to `>=1.0.0 <2.1` as the -`2.0` becomes `2.0.*`. On the other hand `1.0.0 - 2.1.0` is equivalent to -`>=1.0.0 <=2.1.0`. - -Example: `1.0 - 2.0` - -### Wildcard Version Range (`.*`) - -You can specify a pattern with a `*` wildcard. `1.0.*` is the equivalent of -`>=1.0 <1.1`. - -Example: `1.0.*` - -## Next Significant Release Operators - -### Tilde Version Range (`~`) - -The `~` operator is best explained by example: `~1.2` is equivalent to -`>=1.2 <2.0.0`, while `~1.2.3` is equivalent to `>=1.2.3 <1.3.0`. As you can see -it is mostly useful for projects respecting [semantic -versioning](https://semver.org/). A common usage would be to mark the minimum -minor version you depend on, like `~1.2` (which allows anything up to, but not -including, 2.0). Since in theory there should be no backwards compatibility -breaks until 2.0, that works well. Another way of looking at it is that using -`~` specifies a minimum version, but allows the last digit specified to go up. - -Example: `~1.2` - -> **Note:** Although `2.0-beta.1` is strictly before `2.0`, a version constraint -> like `~1.2` would not install it. As said above `~1.2` only means the `.2` -> can change but the `1.` part is fixed. - -> **Note:** The `~` operator has an exception on its behavior for the major -> release number. This means for example that `~1` is the same as `~1.0` as -> it will not allow the major number to increase trying to keep backwards -> compatibility. - -### Caret Version Range (`^`) - -The `^` operator behaves very similarly, but it sticks closer to semantic -versioning, and will always allow non-breaking updates. For example `^1.2.3` -is equivalent to `>=1.2.3 <2.0.0` as none of the releases until 2.0 should -break backwards compatibility. For pre-1.0 versions it also acts with safety -in mind and treats `^0.3` as `>=0.3.0 <0.4.0` and `^0.0.3` as `>=0.0.3 <0.0.4`. - -This is the recommended operator for maximum interoperability when writing -library code. - -Example: `^1.2.3` - -## Stability Constraints - -If you are using a constraint that does not explicitly define a stability, -Composer will default internally to `-dev` or `-stable`, depending on the -operator(s) used. This happens transparently. - -If you wish to explicitly consider only the stable release in the comparison, -add the suffix `-stable`. - -Examples: - - Constraint | Internally -------------------- | ------------------------ - `1.2.3` | `=1.2.3.0-stable` - `>1.2` | `>1.2.0.0-stable` - `>=1.2` | `>=1.2.0.0-dev` - `>=1.2-stable` | `>=1.2.0.0-stable` - `<1.3` | `<1.3.0.0-dev` - `<=1.3` | `<=1.3.0.0-stable` - `1 - 2` | `>=1.0.0.0-dev <3.0.0.0-dev` - `~1.3` | `>=1.3.0.0-dev <2.0.0.0-dev` - `1.4.*` | `>=1.4.0.0-dev <1.5.0.0-dev` - -To allow various stabilities without enforcing them at the constraint level -however, you may use [stability-flags](../04-schema.md#package-links) like -`@` (e.g. `@dev`) to let Composer know that a given package -can be installed in a different stability than your default minimum-stability -setting. All available stability flags are listed on the minimum-stability -section of the [schema page](../04-schema.md#minimum-stability). - -## Summary -```jsonc -"require": { - "vendor/package": "1.3.2", // exactly 1.3.2 - - // >, <, >=, <= | specify upper / lower bounds - "vendor/package": ">=1.3.2", // anything above or equal to 1.3.2 - "vendor/package": "<1.3.2", // anything below 1.3.2 - - // * | wildcard - "vendor/package": "1.3.*", // >=1.3.0 <1.4.0 - - // ~ | allows last digit specified to go up - "vendor/package": "~1.3.2", // >=1.3.2 <1.4.0 - "vendor/package": "~1.3", // >=1.3.0 <2.0.0 - - // ^ | doesn't allow breaking changes (major version fixed - following semver) - "vendor/package": "^1.3.2", // >=1.3.2 <2.0.0 - "vendor/package": "^0.3.2", // >=0.3.2 <0.4.0 // except if major version is 0 -} -``` - -## Testing Version Constraints - -You can test version constraints using [semver.madewithlove.com](https://semver.madewithlove.com). -Fill in a package name and it will autofill the default version constraint -which Composer would add to your `composer.json` file. You can adjust the -version constraint and the tool will highlight all releases that match. diff --git a/app/vendor/composer/composer/doc/dev/DefaultPolicy.md b/app/vendor/composer/composer/doc/dev/DefaultPolicy.md deleted file mode 100644 index 65d0710df..000000000 --- a/app/vendor/composer/composer/doc/dev/DefaultPolicy.md +++ /dev/null @@ -1,55 +0,0 @@ -# Default Solver Policy - -A solver policy defines behaviour variables of the dependency solver. It decides -which versions are considered newer than others, which packages should be -preferred over others and whether operations like downgrades or uninstall are -allowed. - -## Selection of preferred Packages - -The following describe package pool situations with user requests and the -resulting order in which the solver will try to install them. - -The rules are to be applied in the order of these descriptions. - -### Repository priorities - -Packages Repo1.Av1, Repo2.Av1 - -* priority(Repo1) >= priority(Repo2) => (Repo1.Av1, Repo2.Av1) -* priority(Repo1) < priority(Repo2) => (Repo2.Av1, Repo1.Av1) - -### Package versions - -Packages: Av1, Av2, Av3 - -* Installed: Av2 - -Request: install A - -* (Av3) - -### Virtual Packages (provides) - -Packages Av1, Bv1 - -* Av1 provides Xv1 -* Bv1 provides Xv1 - -Request: install X - -* priority(Av1.repo) >= priority(Bv1.repo) => (Av1, Bv1) -* priority(Av1.repo) < priority(Bv1.repo) => (Bv1, Av1) - -### Package replacements - -Packages: Av1, Bv2 - -* Bv2 replaces Av1 - -Request: install A - -* priority(Av1.repo) >= priority(Bv2.repo) => (Av1, Bv2) -* priority(Av1.repo) < priority(Bv2.repo) => (Bv2, Av1) - -Bv2 version is ignored, only the replacement version for A matters. diff --git a/app/vendor/composer/composer/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md b/app/vendor/composer/composer/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md deleted file mode 100644 index 845204873..000000000 --- a/app/vendor/composer/composer/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md +++ /dev/null @@ -1,55 +0,0 @@ -# How do I install a package to a custom path for my framework? - -Each framework may have one or many different required package installation -paths. Composer can be configured to install packages to a folder other than -the default `vendor` folder by using -[composer/installers](https://github.com/composer/installers). - -If you are a **package author** and want your package installed to a custom -directory, require `composer/installers` and set the appropriate `type`. -Specifying the package type, will override the default installer path. -This is common if your package is intended for a specific framework such as -CakePHP, Drupal or WordPress. Here is an example composer.json file for a -WordPress theme: - -```json -{ - "name": "you/themename", - "type": "wordpress-theme", - "require": { - "composer/installers": "~1.0" - } -} -``` - -Now when your theme is installed with Composer it will be placed into -`wp-content/themes/themename/` folder. Check the -[current supported types](https://github.com/composer/installers#current-supported-package-types) -for your package. - -As a **package consumer** you can set or override the install path for a package -that requires composer/installers by configuring the `installer-paths` extra. A -useful example would be for a Drupal multisite setup where the package should be -installed into your site's subdirectory. Here we are overriding the install path -for a module that uses composer/installers, as well as putting all packages of type -`drupal-theme` into a themes folder: - -```json -{ - "extra": { - "installer-paths": { - "sites/example.com/modules/{$name}": ["vendor/package"], - "sites/example.com/themes/{$name}": ["type:drupal-theme"] - } - } -} -``` - -Now the package would be installed to your folder location, rather than the default -composer/installers determined location. In addition, `installer-paths` is -order-dependent, which means moving a package by name should come before the installer -path of a `type:*` that matches the same package. - -> **Note:** You cannot use this to change the path of any package. This is only -> applicable to packages that require `composer/installers` and use a custom type -> that it handles. diff --git a/app/vendor/composer/composer/doc/faqs/how-to-install-composer-programmatically.md b/app/vendor/composer/composer/doc/faqs/how-to-install-composer-programmatically.md deleted file mode 100644 index 7363c47c1..000000000 --- a/app/vendor/composer/composer/doc/faqs/how-to-install-composer-programmatically.md +++ /dev/null @@ -1,42 +0,0 @@ -# How do I install Composer programmatically? - -As noted on the download page, the installer script contains a -checksum which changes when the installer code changes and as such -it should not be relied upon in the long term. - -An alternative is to use this script which only works with UNIX utilities: - -```shell -#!/bin/sh - -EXPECTED_CHECKSUM="$(php -r 'copy("https://composer.github.io/installer.sig", "php://stdout");')" -php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" -ACTUAL_CHECKSUM="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" - -if [ "$EXPECTED_CHECKSUM" != "$ACTUAL_CHECKSUM" ] -then - >&2 echo 'ERROR: Invalid installer checksum' - rm composer-setup.php - exit 1 -fi - -php composer-setup.php --quiet -RESULT=$? -rm composer-setup.php -exit $RESULT -``` - -The script will exit with 1 in case of failure, or 0 on success, and is quiet -if no error occurs. - -Alternatively, if you want to rely on an exact copy of the installer, you can fetch -a specific version from GitHub's history. The commit hash should be enough to -give it uniqueness and authenticity as long as you can trust the GitHub servers. -For example: - -```shell -wget https://raw.githubusercontent.com/composer/getcomposer.org/76a7060ccb93902cd7576b67264ad91c8a2700e2/web/installer -O - -q | php -- --quiet -``` - -You may replace the commit hash by whatever the last commit hash is on -https://github.com/composer/getcomposer.org/commits/main diff --git a/app/vendor/composer/composer/doc/faqs/how-to-install-untrusted-packages-safely.md b/app/vendor/composer/composer/doc/faqs/how-to-install-untrusted-packages-safely.md deleted file mode 100644 index 27a8b7efd..000000000 --- a/app/vendor/composer/composer/doc/faqs/how-to-install-untrusted-packages-safely.md +++ /dev/null @@ -1,41 +0,0 @@ -# How do I install untrusted packages safely? Is it safe to run Composer as superuser or root? - -## Why am I seeing a "Do not run Composer as root/super user" warning/error? - -It was always discouraged to run Composer as root for the reasons detailed below. - -As of Composer 2.4.2, plugins are disabled automatically when running as root and -there is no sign that the user is consciously doing this. There are two ways this user consent -can be given: - -- If you run interactively, Composer will prompt if you are sure that you want to continue - running as root. If you run non-interactively, plugins will be disabled, unless.. -- If you set the [COMPOSER_ALLOW_SUPERUSER](../03-cli.md#composer-allow-superuser) environment - variable to `1`, this also indicates that you intended to run Composer as root and are accepting - the risks of doing so. - -## Is it safe to run Composer as superuser or root? - -Certain Composer commands, including `exec`, `install`, and `update` allow third party code to -execute on your system. This is from its "plugins" and "scripts" features. Plugins and scripts have -full access to the user account which runs Composer. For this reason, it is strongly advised to -**avoid running Composer as super-user/root**. All commands also dispatch events which can be -caught by plugins so unless explicitly disabled installed plugins will be loaded/executed by **every** -Composer command. - -You can disable plugins and scripts during package installation or updates with the following -syntax so only Composer's code, and no third party code, will execute: - -```shell -php composer.phar install --no-plugins --no-scripts ... -php composer.phar update --no-plugins --no-scripts ... -``` - -Depending on the operating system we have seen cases where it is possible to trigger execution -of files in the repository using specially crafted `composer.json`. So in general if you do want -to install untrusted dependencies you should sandbox them completely in a container or equivalent. - -Also note that the `exec` command will always run third party code as the user which runs `composer`. - -See the [COMPOSER_ALLOW_SUPERUSER](../03-cli.md#composer-allow-superuser) environment variable for -more info on how to disable the warnings. diff --git a/app/vendor/composer/composer/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md b/app/vendor/composer/composer/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md deleted file mode 100644 index 32552e067..000000000 --- a/app/vendor/composer/composer/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md +++ /dev/null @@ -1,32 +0,0 @@ -# Should I commit the dependencies in my vendor directory? - -The general recommendation is **no**. The vendor directory (or wherever your -dependencies are installed) should be added to `.gitignore`/`svn:ignore`/etc. - -The best practice is to then have all the developers use Composer to install -the dependencies. Similarly, the build server, CI, deployment tools etc should -be adapted to run Composer as part of their project bootstrapping. - -While it can be tempting to commit it in some environment, it leads to a few -problems: - -- Large VCS repository size and diffs when you update code. -- Duplication of the history of all your dependencies in your own VCS. -- Adding dependencies installed via git to a git repo will show them as - submodules. This is problematic because they are not real submodules, and you - will run into issues. - -If you really feel like you must do this, you have a few options: - -1. Limit yourself to installing tagged releases (no dev versions), so that you - only get zipped installs, and avoid problems with the git "submodules". -2. Use --prefer-dist or set `preferred-install` to `dist` in your - [config](../04-schema.md#config). -3. Remove the `.git` directory of every dependency after the installation, then - you can add them to your git repo. You can do that with `rm -rf vendor/**/.git` - in ZSH or `find vendor/ -type d -name ".git" -exec rm -rf {} \;` in Bash. - But this means you will have to delete those dependencies from disk before - running `composer update`. -4. Add a .gitignore rule (`/vendor/**/.git`) to ignore all the vendor `.git` folders. - This approach does not require that you delete dependencies from disk prior to - running a `composer update`. diff --git a/app/vendor/composer/composer/doc/faqs/which-version-numbering-system-does-composer-itself-use.md b/app/vendor/composer/composer/doc/faqs/which-version-numbering-system-does-composer-itself-use.md deleted file mode 100644 index 20095bb01..000000000 --- a/app/vendor/composer/composer/doc/faqs/which-version-numbering-system-does-composer-itself-use.md +++ /dev/null @@ -1,4 +0,0 @@ -# Which version numbering system does Composer itself use? - -Composer uses [Semantic Versioning (aka SemVer) -2.0.0](https://semver.org/spec/v2.0.0.html). diff --git a/app/vendor/composer/composer/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md b/app/vendor/composer/composer/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md deleted file mode 100644 index d9df4e5d8..000000000 --- a/app/vendor/composer/composer/doc/faqs/why-are-unbound-version-constraints-a-bad-idea.md +++ /dev/null @@ -1,21 +0,0 @@ -# Why are unbound version constraints a bad idea? - -A version constraint without an upper bound such as `*`, `>=3.4` or -`dev-master` will allow updates to any future version of the dependency. -This includes major versions breaking backward compatibility. - -Once a release of your package is tagged, you cannot tweak its dependencies -anymore in case a dependency breaks BC - you have to do a new release, but the -previous one stays broken. - -The only good alternative is to define an upper bound on your constraints, -which you can increase in a new release after testing that your package is -compatible with the new major version of your dependency. - -For example instead of using `>=3.4` you should use `^3.4` which allows all -versions up to `3.999` but does not include `4.0` and above. The `^` operator -works very well with libraries following [semantic versioning](https://semver.org). - -**Note:** As a package maintainer, you can help your users -by providing an [alias version](../articles/aliases.md) for your development -branch to allow it to match bound constraints. diff --git a/app/vendor/composer/composer/doc/faqs/why-are-version-constraints-combining-comparisons-and-wildcards-a-bad-idea.md b/app/vendor/composer/composer/doc/faqs/why-are-version-constraints-combining-comparisons-and-wildcards-a-bad-idea.md deleted file mode 100644 index 12927fbfa..000000000 --- a/app/vendor/composer/composer/doc/faqs/why-are-version-constraints-combining-comparisons-and-wildcards-a-bad-idea.md +++ /dev/null @@ -1,21 +0,0 @@ -# Why are version constraints combining comparisons and wildcards a bad idea? - -This is a fairly common mistake people make, defining version constraints in -their package requires like `>=2.*` or `>=1.1.*`. - -If you think about it and what it really means though, you will quickly -realize that it does not make much sense. If we decompose `>=2.*`, you -have two parts: - -- `>=2` which says the package should be in version 2.0.0 or above. -- `2.*` which says the package should be between version 2.0.0 (inclusive) - and 3.0.0 (exclusive). - -As you see, both rules agree on the fact that the package must be >=2.0.0, -but it is not possible to determine if when you wrote that you were thinking -of a package in version 3.0.0 or not. Should it match because you asked for -`>=2` or should it not match because you asked for a `2.*`? - -For this reason, Composer throws an error and says that this is invalid. -The way to fix it is to think about what you really mean, and use only -one of those rules. diff --git a/app/vendor/composer/composer/doc/faqs/why-cant-composer-load-repositories-recursively.md b/app/vendor/composer/composer/doc/faqs/why-cant-composer-load-repositories-recursively.md deleted file mode 100644 index 1dff52c40..000000000 --- a/app/vendor/composer/composer/doc/faqs/why-cant-composer-load-repositories-recursively.md +++ /dev/null @@ -1,35 +0,0 @@ -# Why can't Composer load repositories recursively? - -You may run into problems when using custom repositories because Composer does -not load the repositories of your requirements, so you have to redefine those -repositories in all your `composer.json` files. - -Before going into details as to why this is like that, you have to understand -that the main use of custom VCS & package repositories is to temporarily try -some things, or use a fork of a project until your pull request is merged, etc. -You should not use them to keep track of private packages. For that you should -rather look into [Private Packagist](https://packagist.com) which lets you -configure all your private packages in one place, and avoids the slow-downs -associated with inline VCS repositories. - -There are three ways the dependency solver could work with custom repositories: - -- Fetch the repositories of root package, get all the packages from the defined -repositories, then resolve requirements. This is the current state and it works well -except for the limitation of not loading repositories recursively. - -- Fetch the repositories of root package, while initializing packages from the -defined repos, initialize recursively all repos found in those packages, and -their package's packages, etc, then resolve requirements. It could work, but it -slows down the initialization a lot since VCS repos can each take a few seconds, -and it could end up in a completely broken state since many versions of a package -could define the same packages inside a package repository, but with different -dist/source. There are many ways this could go wrong. - -- Fetch the repositories of root package, then fetch the repositories of the -first level dependencies, then fetch the repositories of their dependencies, etc, -then resolve requirements. This sounds more efficient, but it suffers from the -same problems as the second solution, because loading the repositories of the -dependencies is not as easy as it sounds. You need to load all the repos of all -the potential matches for a requirement, which again might have conflicting -package definitions. diff --git a/app/vendor/composer/composer/doc/fixtures/fixtures.md b/app/vendor/composer/composer/doc/fixtures/fixtures.md deleted file mode 100644 index 051d5aad3..000000000 --- a/app/vendor/composer/composer/doc/fixtures/fixtures.md +++ /dev/null @@ -1,21 +0,0 @@ -# `Composer` type repository fixtures - -This directory contains some examples of what `composer` type repositories can -look like. They serve as illustrating examples accompanying the docs, but can -also be used as (initial) fixtures for tests. - -* `repo-composer-plain` is a basic, plain `packages.json` file -* `repo-composer-with-includes` uses the `includes` mechanism -* `repo-composer-with-providers` uses the `providers` mechanism - -## Sample Packages used in these fixtures - -All these repositories contain the following packages. - -* `foo/bar` versions `1.0.0`, `1.0.1` and `1.1.0`; `dev-default` and `1.0.x-dev` branches. - On `dev-default` and in `1.1.0`, `bar/baz` `~1.0` is required. -* `qux/quux` only has a `dev-default` branch. It `replace`s `gar/nix`. -* `gar/nix` has a `1.0.0` version and a `dev-default` branch. It is being replaced - by `qux/quux`. -* `bar/baz` has a `1.0.0` version and `1.0.x-dev` as well as `dev-default` branches. - Additionally, `1.1.x-dev` is a branch alias for `dev-default`. diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-plain/packages.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-plain/packages.json deleted file mode 100644 index 219051998..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-plain/packages.json +++ /dev/null @@ -1,158 +0,0 @@ -{ - "packages": { - "bar/baz": { - "1.0.0": { - "name": "bar/baz", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "35810817c14d" - }, - "time": "2014-10-13 12:04:55", - "type": "library" - }, - "1.0.x-dev": { - "name": "bar/baz", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "ffff9aae6ed5" - }, - "time": "2014-10-13 12:05:37", - "type": "library" - }, - "dev-default": { - "name": "bar/baz", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "f317e556f2e2" - }, - "time": "2014-10-13 12:06:45", - "type": "library", - "extra": { - "branch-alias": { - "dev-default": "1.1.x-dev" - } - } - } - }, - "foo/bar": { - "1.0.0": { - "name": "foo/bar", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "249dec95a52a" - }, - "time": "2014-10-11 15:42:00", - "type": "library" - }, - "1.0.1": { - "name": "foo/bar", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "21e3328295d4" - }, - "time": "2014-10-11 15:45:56", - "type": "library" - }, - "1.0.x-dev": { - "name": "foo/bar", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "14dc17c8e860" - }, - "time": "2014-10-11 15:45:59", - "type": "library" - }, - "1.1.0": { - "name": "foo/bar", - "version": "1.1.0", - "version_normalized": "1.1.0.0", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "d2fa3e69ad5b" - }, - "require": { - "bar/baz": "~1.0" - }, - "time": "2014-10-11 15:43:16", - "type": "library" - }, - "dev-default": { - "name": "foo/bar", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "8e5a5c224336" - }, - "require": { - "bar/baz": "~1.0" - }, - "time": "2014-10-11 15:43:18", - "type": "library" - } - }, - "gar/nix": { - "1.0.0": { - "name": "gar/nix", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "44977145d64e" - }, - "time": "2014-10-13 12:03:33", - "type": "library" - }, - "dev-default": { - "name": "gar/nix", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "51cca95a31c2" - }, - "time": "2014-10-13 12:03:35", - "type": "library" - } - }, - "qux/quux": { - "dev-default": { - "name": "qux/quux", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http://some.where/over/the/rainbow/", - "reference": "4a10a567baa5" - }, - "replace": { - "gar/nix": "1.0.*" - }, - "time": "2014-10-11 15:48:15", - "type": "library" - } - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/bar/baz$923363b3c22e73abb2e3fd891c8156dd4d0821a97fd3e428bc910833e3e46dbe.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/bar/baz$923363b3c22e73abb2e3fd891c8156dd4d0821a97fd3e428bc910833e3e46dbe.json deleted file mode 100644 index 77739fece..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/bar/baz$923363b3c22e73abb2e3fd891c8156dd4d0821a97fd3e428bc910833e3e46dbe.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "packages": { - "bar\/baz": { - "1.0.0": { - "name": "bar\/baz", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "35810817c14d" - }, - "time": "2014-10-13 12:04:55", - "type": "library", - "uid": 0 - }, - "1.0.x-dev": { - "name": "bar\/baz", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "ffff9aae6ed5" - }, - "time": "2014-10-13 12:05:37", - "type": "library", - "uid": 1 - }, - "dev-default": { - "name": "bar\/baz", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "f317e556f2e2" - }, - "time": "2014-10-13 12:06:45", - "type": "library", - "extra": { - "branch-alias": { - "dev-default": "1.1.x-dev" - } - }, - "uid": 2 - } - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/foo/bar$4baabb3303afa3e34a4d3af18fb138e5f3b79029c1f8d9ab5b477ea15776ba0a.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/foo/bar$4baabb3303afa3e34a4d3af18fb138e5f3b79029c1f8d9ab5b477ea15776ba0a.json deleted file mode 100644 index 378b04003..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/foo/bar$4baabb3303afa3e34a4d3af18fb138e5f3b79029c1f8d9ab5b477ea15776ba0a.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "packages": { - "foo\/bar": { - "1.0.0": { - "name": "foo\/bar", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "249dec95a52a" - }, - "time": "2014-10-11 15:42:00", - "type": "library", - "uid": 3 - }, - "1.0.1": { - "name": "foo\/bar", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "21e3328295d4" - }, - "time": "2014-10-11 15:45:56", - "type": "library", - "uid": 4 - }, - "1.0.x-dev": { - "name": "foo\/bar", - "version": "1.0.x-dev", - "version_normalized": "1.0.9999999.9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "14dc17c8e860" - }, - "time": "2014-10-11 15:45:59", - "type": "library", - "uid": 5 - }, - "1.1.0": { - "name": "foo\/bar", - "version": "1.1.0", - "version_normalized": "1.1.0.0", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "d2fa3e69ad5b" - }, - "require": { - "bar\/baz": "~1.0" - }, - "time": "2014-10-11 15:43:16", - "type": "library", - "uid": 6 - }, - "dev-default": { - "name": "foo\/bar", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "8e5a5c224336" - }, - "require": { - "bar\/baz": "~1.0" - }, - "time": "2014-10-11 15:43:18", - "type": "library", - "uid": 7 - } - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/gar/nix$5d210670cb46c8364c8e3fb449967b9bea558b971e5b082f330ae4f1d484c321.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/gar/nix$5d210670cb46c8364c8e3fb449967b9bea558b971e5b082f330ae4f1d484c321.json deleted file mode 100644 index 68e399351..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/gar/nix$5d210670cb46c8364c8e3fb449967b9bea558b971e5b082f330ae4f1d484c321.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "packages": { - "qux\/quux": { - "dev-default": { - "name": "qux\/quux", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "4a10a567baa5" - }, - "replace": { - "gar\/nix": "1.0.*" - }, - "time": "2014-10-11 15:48:15", - "type": "library", - "uid": 10 - } - }, - "gar\/nix": { - "1.0.0": { - "name": "gar\/nix", - "version": "1.0.0", - "version_normalized": "1.0.0.0", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "44977145d64e" - }, - "time": "2014-10-13 12:03:33", - "type": "library", - "uid": 8 - }, - "dev-default": { - "name": "gar\/nix", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "51cca95a31c2" - }, - "time": "2014-10-13 12:03:35", - "type": "library", - "uid": 9 - } - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/provider-active$1893a061e579543822389ecd12d791c612db0c05e22d90e9286e233cacd86ed8.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/provider-active$1893a061e579543822389ecd12d791c612db0c05e22d90e9286e233cacd86ed8.json deleted file mode 100644 index 6c45294f8..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/provider-active$1893a061e579543822389ecd12d791c612db0c05e22d90e9286e233cacd86ed8.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "providers": { - "bar\/baz": { - "sha256": "923363b3c22e73abb2e3fd891c8156dd4d0821a97fd3e428bc910833e3e46dbe" - }, - "foo\/bar": { - "sha256": "4baabb3303afa3e34a4d3af18fb138e5f3b79029c1f8d9ab5b477ea15776ba0a" - }, - "gar\/nix": { - "sha256": "5d210670cb46c8364c8e3fb449967b9bea558b971e5b082f330ae4f1d484c321" - }, - "qux\/quux": { - "sha256": "c142d1a07ca354be46b613f59f1d601923a5a00ccc5fcce50a77ecdd461eb72d" - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/qux/quux$c142d1a07ca354be46b613f59f1d601923a5a00ccc5fcce50a77ecdd461eb72d.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/qux/quux$c142d1a07ca354be46b613f59f1d601923a5a00ccc5fcce50a77ecdd461eb72d.json deleted file mode 100644 index dc1b84dce..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/p/qux/quux$c142d1a07ca354be46b613f59f1d601923a5a00ccc5fcce50a77ecdd461eb72d.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "packages": { - "qux\/quux": { - "dev-default": { - "name": "qux\/quux", - "version": "dev-default", - "version_normalized": "9999999-dev", - "source": { - "type": "hg", - "url": "http:\/\/some.where\/over\/the\/rainbow\/", - "reference": "4a10a567baa5" - }, - "replace": { - "gar\/nix": "1.0.*" - }, - "time": "2014-10-11 15:48:15", - "type": "library", - "uid": 10 - } - } - } -} diff --git a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/packages.json b/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/packages.json deleted file mode 100644 index 35fd6e30b..000000000 --- a/app/vendor/composer/composer/doc/fixtures/repo-composer-with-providers/packages.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "packages": [], - "providers-url": "\/p\/%package%$%hash%.json", - "provider-includes": { - "p\/provider-active$1893a061e579543822389ecd12d791c612db0c05e22d90e9286e233cacd86ed8.json": { - "sha256": "1893a061e579543822389ecd12d791c612db0c05e22d90e9286e233cacd86ed8" - } - } -} diff --git a/app/vendor/composer/composer/res/composer-schema.json b/app/vendor/composer/composer/res/composer-schema.json index c384e5b1f..47c087b3e 100644 --- a/app/vendor/composer/composer/res/composer-schema.json +++ b/app/vendor/composer/composer/res/composer-schema.json @@ -111,6 +111,11 @@ "type": "string", "description": "URL to the RSS feed.", "format": "uri" + }, + "security": { + "type": "string", + "description": "URL to the vulnerability disclosure policy (VDP).", + "format": "uri" } } }, @@ -320,6 +325,34 @@ "type": ["string"] } }, + "audit": { + "type": "object", + "description": "Security audit configuration options", + "properties": { + "ignore": { + "anyOf": [ + { + "type": "object", + "description": "A list of advisory ids, remote ids or CVE ids (keys) and the explanations (values) for why they're being ignored. The listed items are reported but let the audit command pass.", + "additionalProperties": { + "type": ["string", "string"] + } + }, + { + "type": "array", + "description": "A set of advisory ids, remote ids or CVE ids that are reported but let the audit command pass.", + "items": { + "type": "string" + } + } + ] + }, + "abandoned": { + "enum": ["ignore", "report", "fail"], + "description": "Whether abandoned packages should be ignored, reported as problems or cause an audit failure." + } + } + }, "notify-on-install": { "type": "boolean", "description": "Composer allows repositories to define a notification URL, so that they get notified whenever a package from that repository is installed. This option allows you to disable that behaviour, defaults to true." diff --git a/app/vendor/composer/composer/src/Composer/Advisory/Auditor.php b/app/vendor/composer/composer/src/Composer/Advisory/Auditor.php index 9ddb5b04b..7d55be5dc 100644 --- a/app/vendor/composer/composer/src/Composer/Advisory/Auditor.php +++ b/app/vendor/composer/composer/src/Composer/Advisory/Auditor.php @@ -15,8 +15,10 @@ use Composer\IO\ConsoleIO; use Composer\IO\IOInterface; use Composer\Json\JsonFile; +use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; use Composer\Repository\RepositorySet; +use Composer\Util\PackageInfo; use InvalidArgumentException; use Symfony\Component\Console\Formatter\OutputFormatter; @@ -40,37 +42,161 @@ class Auditor self::FORMAT_SUMMARY, ]; + public const ABANDONED_IGNORE = 'ignore'; + public const ABANDONED_REPORT = 'report'; + public const ABANDONED_FAIL = 'fail'; + /** * @param PackageInterface[] $packages * @param self::FORMAT_* $format The format that will be used to output audit results. * @param bool $warningOnly If true, outputs a warning. If false, outputs an error. + * @param string[] $ignoreList List of advisory IDs, remote IDs or CVE IDs that reported but not listed as vulnerabilities. + * @param self::ABANDONED_* $abandoned + * * @return int Amount of packages with vulnerabilities found * @throws InvalidArgumentException If no packages are passed in */ - public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, string $format, bool $warningOnly = true): int + public function audit(IOInterface $io, RepositorySet $repoSet, array $packages, string $format, bool $warningOnly = true, array $ignoreList = [], string $abandoned = self::ABANDONED_REPORT): int { - $advisories = $repoSet->getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); + if ($abandoned === 'default' && $format !== self::FORMAT_SUMMARY) { + $io->writeError('The new audit.abandoned setting (currently defaulting to "report" will default to "fail" in Composer 2.7, make sure to set it to "report" or "ignore" explicitly by then if you do not want this.'); + } + + $allAdvisories = $repoSet->getMatchingSecurityAdvisories($packages, $format === self::FORMAT_SUMMARY); + // we need the CVE & remote IDs set to filter ignores correctly so if we have any matches using the optimized codepath above + // and ignores are set then we need to query again the full data to make sure it can be filtered + if (count($allAdvisories) > 0 && $ignoreList !== [] && $format === self::FORMAT_SUMMARY) { + $allAdvisories = $repoSet->getMatchingSecurityAdvisories($packages, false); + } + ['advisories' => $advisories, 'ignoredAdvisories' => $ignoredAdvisories] = $this->processAdvisories($allAdvisories, $ignoreList); + + $abandonedCount = 0; + $affectedPackagesCount = 0; + if ($abandoned === self::ABANDONED_IGNORE) { + $abandonedPackages = []; + } else { + $abandonedPackages = $this->filterAbandonedPackages($packages); + if ($abandoned === self::ABANDONED_FAIL) { + $abandonedCount = count($abandonedPackages); + } + } + if (self::FORMAT_JSON === $format) { - $io->write(JsonFile::encode(['advisories' => $advisories])); + $json = ['advisories' => $advisories]; + if ($ignoredAdvisories !== []) { + $json['ignored-advisories'] = $ignoredAdvisories; + } + $json['abandoned'] = $abandonedPackages; - return count($advisories); + $io->write(JsonFile::encode($json)); + + return count($advisories) + $abandonedCount; } $errorOrWarn = $warningOnly ? 'warning' : 'error'; - if (count($advisories) > 0) { - [$affectedPackages, $totalAdvisories] = $this->countAdvisories($advisories); - $plurality = $totalAdvisories === 1 ? 'y' : 'ies'; - $pkgPlurality = $affectedPackages === 1 ? '' : 's'; - $punctuation = $format === 'summary' ? '.' : ':'; - $io->writeError("<$errorOrWarn>Found $totalAdvisories security vulnerability advisor{$plurality} affecting $affectedPackages package{$pkgPlurality}{$punctuation}"); - $this->outputAdvisories($io, $advisories, $format); + if (count($advisories) > 0 || count($ignoredAdvisories) > 0) { + $passes = [ + [$ignoredAdvisories, "Found %d ignored security vulnerability advisor%s affecting %d package%s%s"], + // this has to run last to allow $affectedPackagesCount in the return statement to be correct + [$advisories, "<$errorOrWarn>Found %d security vulnerability advisor%s affecting %d package%s%s"], + ]; + foreach ($passes as [$advisoriesToOutput, $message]) { + [$affectedPackagesCount, $totalAdvisoryCount] = $this->countAdvisories($advisoriesToOutput); + if ($affectedPackagesCount > 0) { + $plurality = $totalAdvisoryCount === 1 ? 'y' : 'ies'; + $pkgPlurality = $affectedPackagesCount === 1 ? '' : 's'; + $punctuation = $format === 'summary' ? '.' : ':'; + $io->writeError(sprintf($message, $totalAdvisoryCount, $plurality, $affectedPackagesCount, $pkgPlurality, $punctuation)); + $this->outputAdvisories($io, $advisoriesToOutput, $format); + } + } + + if ($format === self::FORMAT_SUMMARY) { + $io->writeError('Run "composer audit" for a full list of advisories.'); + } + } else { + $io->writeError('No security vulnerability advisories found.'); + } + + if (count($abandonedPackages) > 0 && $format !== self::FORMAT_SUMMARY) { + $this->outputAbandonedPackages($io, $abandonedPackages, $format); + } - return $affectedPackages; + return $affectedPackagesCount + $abandonedCount; + } + + /** + * @param array $packages + * @return array + */ + private function filterAbandonedPackages(array $packages): array + { + return array_filter($packages, function (PackageInterface $pkg) { + return $pkg instanceof CompletePackageInterface && $pkg->isAbandoned(); + }); + } + + /** + * @phpstan-param array> $allAdvisories + * @param array|array $ignoreList List of advisory IDs, remote IDs or CVE IDs that reported but not listed as vulnerabilities. + * @phpstan-return array{advisories: array>, ignoredAdvisories: array>} + */ + private function processAdvisories(array $allAdvisories, array $ignoreList): array + { + if ($ignoreList === []) { + return ['advisories' => $allAdvisories, 'ignoredAdvisories' => []]; + } + + if (\count($ignoreList) > 0 && !\array_is_list($ignoreList)) { + $ignoredIds = array_keys($ignoreList); + } else { + $ignoredIds = $ignoreList; } - $io->writeError('No security vulnerability advisories found'); + $advisories = []; + $ignored = []; + $ignoreReason = null; + + foreach ($allAdvisories as $package => $pkgAdvisories) { + foreach ($pkgAdvisories as $advisory) { + $isActive = true; + + if (in_array($advisory->advisoryId, $ignoredIds, true)) { + $isActive = false; + $ignoreReason = $ignoreList[$advisory->advisoryId] ?? null; + } + + if ($advisory instanceof SecurityAdvisory) { + if (in_array($advisory->cve, $ignoredIds, true)) { + $isActive = false; + $ignoreReason = $ignoreList[$advisory->cve] ?? null; + } + + foreach ($advisory->sources as $source) { + if (in_array($source['remoteId'], $ignoredIds, true)) { + $isActive = false; + $ignoreReason = $ignoreList[$source['remoteId']] ?? null; + break; + } + } + } + + if ($isActive) { + $advisories[$package][] = $advisory; + continue; + } + + // Partial security advisories only used in summary mode + // and in that case we do not need to cast the object. + if ($advisory instanceof SecurityAdvisory) { + $advisory = $advisory->toIgnoredAdvisory($ignoreReason); + } - return 0; + $ignored[$package][] = $advisory; + } + } + + return ['advisories' => $advisories, 'ignoredAdvisories' => $ignored]; } /** @@ -106,8 +232,6 @@ private function outputAdvisories(IOInterface $io, array $advisories, string $fo return; case self::FORMAT_SUMMARY: - // We've already output the number of advisories in audit() - $io->writeError('Run composer audit for a full list of advisories.'); return; default: @@ -122,24 +246,30 @@ private function outputAdvisoriesTable(ConsoleIO $io, array $advisories): void { foreach ($advisories as $packageAdvisories) { foreach ($packageAdvisories as $advisory) { + $headers = [ + 'Package', + 'CVE', + 'Title', + 'URL', + 'Affected versions', + 'Reported at', + ]; + $row = [ + $advisory->packageName, + $this->getCVE($advisory), + $advisory->title, + $this->getURL($advisory), + $advisory->affectedVersions->getPrettyString(), + $advisory->reportedAt->format(DATE_ATOM), + ]; + if ($advisory instanceof IgnoredSecurityAdvisory) { + $headers[] = 'Ignore reason'; + $row[] = $advisory->ignoreReason ?? 'None specified'; + } $io->getTable() ->setHorizontal() - ->setHeaders([ - 'Package', - 'CVE', - 'Title', - 'URL', - 'Affected versions', - 'Reported at', - ]) - ->addRow([ - $advisory->packageName, - $this->getCVE($advisory), - $advisory->title, - $this->getURL($advisory), - $advisory->affectedVersions->getPrettyString(), - $advisory->reportedAt->format(DATE_ATOM), - ]) + ->setHeaders($headers) + ->addRow($row) ->setColumnWidth(1, 80) ->setColumnMaxWidth(1, 80) ->render(); @@ -165,12 +295,70 @@ private function outputAdvisoriesPlain(IOInterface $io, array $advisories): void $error[] = "URL: ".$this->getURL($advisory); $error[] = "Affected versions: ".OutputFormatter::escape($advisory->affectedVersions->getPrettyString()); $error[] = "Reported at: ".$advisory->reportedAt->format(DATE_ATOM); + if ($advisory instanceof IgnoredSecurityAdvisory) { + $error[] = "Ignore reason: ".($advisory->ignoreReason ?? 'None specified'); + } $firstAdvisory = false; } } $io->writeError($error); } + /** + * @param array $packages + * @param self::FORMAT_PLAIN|self::FORMAT_TABLE $format + */ + private function outputAbandonedPackages(IOInterface $io, array $packages, string $format): void + { + $io->writeError(sprintf('Found %d abandoned package%s:', count($packages), count($packages) > 1 ? 's' : '')); + + if ($format === self::FORMAT_PLAIN) { + foreach ($packages as $pkg) { + if (!$pkg instanceof CompletePackageInterface) { + continue; + } + + $replacement = $pkg->getReplacementPackage() !== null + ? 'Use '.$pkg->getReplacementPackage().' instead' + : 'No replacement was suggested'; + $io->writeError(sprintf( + '%s is abandoned. %s.', + $this->getPackageNameWithLink($pkg), + $replacement + )); + } + + return; + } + + if (!($io instanceof ConsoleIO)) { + throw new InvalidArgumentException('Cannot use table format with ' . get_class($io)); + } + + $table = $io->getTable() + ->setHeaders(['Abandoned Package', 'Suggested Replacement']) + ->setColumnWidth(1, 80) + ->setColumnMaxWidth(1, 80); + + foreach ($packages as $pkg) { + if (!$pkg instanceof CompletePackageInterface) { + continue; + } + + $replacement = $pkg->getReplacementPackage() !== null ? $pkg->getReplacementPackage() : 'none'; + $table->addRow([$this->getPackageNameWithLink($pkg), $replacement]); + } + + $table->render(); + } + + private function getPackageNameWithLink(PackageInterface $package): string + { + $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); + + return $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); + } + private function getCVE(SecurityAdvisory $advisory): string { if ($advisory->cve === null) { @@ -188,4 +376,5 @@ private function getURL(SecurityAdvisory $advisory): string return 'link).'>'.OutputFormatter::escape($advisory->link).''; } + } diff --git a/app/vendor/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.php b/app/vendor/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.php new file mode 100644 index 000000000..ba9079287 --- /dev/null +++ b/app/vendor/composer/composer/src/Composer/Advisory/IgnoredSecurityAdvisory.php @@ -0,0 +1,50 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Advisory; + +use Composer\Semver\Constraint\ConstraintInterface; +use DateTimeImmutable; + +class IgnoredSecurityAdvisory extends SecurityAdvisory +{ + /** + * @var string|null + * @readonly + */ + public $ignoreReason; + + /** + * @param non-empty-array $sources + */ + public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null, ?string $ignoreReason = null) + { + parent::__construct($packageName, $advisoryId, $affectedVersions, $title, $sources, $reportedAt, $cve, $link); + + $this->ignoreReason = $ignoreReason; + } + + /** + * @return mixed + */ + #[\ReturnTypeWillChange] + public function jsonSerialize() + { + $data = parent::jsonSerialize(); + if ($this->ignoreReason === NULL) { + unset($data['ignoreReason']); + } + + return $data; + } + +} diff --git a/app/vendor/composer/composer/src/Composer/Advisory/SecurityAdvisory.php b/app/vendor/composer/composer/src/Composer/Advisory/SecurityAdvisory.php index 8fdf4dd55..e88228d60 100644 --- a/app/vendor/composer/composer/src/Composer/Advisory/SecurityAdvisory.php +++ b/app/vendor/composer/composer/src/Composer/Advisory/SecurityAdvisory.php @@ -42,14 +42,13 @@ class SecurityAdvisory extends PartialSecurityAdvisory public $reportedAt; /** - * @var array + * @var non-empty-array * @readonly */ public $sources; /** * @param non-empty-array $sources - * @readonly */ public function __construct(string $packageName, string $advisoryId, ConstraintInterface $affectedVersions, string $title, array $sources, DateTimeImmutable $reportedAt, ?string $cve = null, ?string $link = null) { @@ -62,6 +61,24 @@ public function __construct(string $packageName, string $advisoryId, ConstraintI $this->link = $link; } + /** + * @internal + */ + public function toIgnoredAdvisory(?string $ignoreReason): IgnoredSecurityAdvisory + { + return new IgnoredSecurityAdvisory( + $this->packageName, + $this->advisoryId, + $this->affectedVersions, + $this->title, + $this->sources, + $this->reportedAt, + $this->cve, + $this->link, + $ignoreReason + ); + } + /** * @return mixed */ diff --git a/app/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php b/app/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php index a16e6b67b..3e2faa3eb 100644 --- a/app/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php +++ b/app/vendor/composer/composer/src/Composer/Autoload/AutoloadGenerator.php @@ -70,6 +70,11 @@ class AutoloadGenerator */ private $apcuPrefix; + /** + * @var bool + */ + private $dryRun = false; + /** * @var bool */ @@ -114,7 +119,7 @@ public function setClassMapAuthoritative(bool $classMapAuthoritative) public function setApcu(bool $apcu, ?string $apcuPrefix = null) { $this->apcu = $apcu; - $this->apcuPrefix = $apcuPrefix !== null ? $apcuPrefix : $apcuPrefix; + $this->apcuPrefix = $apcuPrefix; } /** @@ -127,6 +132,14 @@ public function setRunScripts(bool $runScripts = true) $this->runScripts = $runScripts; } + /** + * Whether to run in drymode or not + */ + public function setDryRun(bool $dryRun = true): void + { + $this->dryRun = $dryRun; + } + /** * Whether platform requirements should be ignored. * @@ -398,6 +411,10 @@ public static function autoload(\$class) } } + if ($this->dryRun) { + return $classMap; + } + $filesystem->filePutContentsIfModified($targetDir.'/autoload_namespaces.php', $namespacesFile); $filesystem->filePutContentsIfModified($targetDir.'/autoload_psr4.php', $psr4File); $filesystem->filePutContentsIfModified($targetDir.'/autoload_classmap.php', $classmapFile); @@ -473,7 +490,7 @@ private function buildExclusionRegex(string $dir, ?array $excluded): ?string /** * @param PackageInterface[] $packages - * @return array + * @return non-empty-array */ public function buildPackageMap(InstallationManager $installationManager, PackageInterface $rootPackage, array $packages) { @@ -485,7 +502,6 @@ public function buildPackageMap(InstallationManager $installationManager, Packag continue; } $this->validatePackage($package); - $packageMap[] = [ $package, $installationManager->getInstallPath($package), @@ -519,7 +535,7 @@ protected function validatePackage(PackageInterface $package) /** * Compiles an ordered list of namespace => path mappings * - * @param array $packageMap array of array(package, installDir-relative-to-composer.json) + * @param non-empty-array $packageMap array of array(package, installDir-relative-to-composer.json or null for metapackages) * @param RootPackageInterface $rootPackage root package instance * @param bool|string[] $filteredDevPackages If an array, the list of packages that must be removed. If bool, whether to filter out require-dev packages * @return array @@ -609,7 +625,7 @@ public function createLoader(array $autoloads, ?string $vendorDir = null) } /** - * @param array $packageMap + * @param array $packageMap * @return ?string */ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) @@ -619,6 +635,11 @@ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem foreach ($packageMap as $item) { [$package, $installPath] = $item; + // packages that are not installed cannot autoload anything + if (null === $installPath) { + continue; + } + if (null !== $package->getTargetDir() && strlen($package->getTargetDir()) > 0) { $installPath = substr($installPath, 0, -strlen('/'.$package->getTargetDir())); } @@ -658,10 +679,26 @@ protected function getIncludePathsFile(array $packageMap, Filesystem $filesystem */ protected function getIncludeFilesFile(array $files, Filesystem $filesystem, string $basePath, string $vendorPath, string $vendorPathCode, string $appBaseDirCode) { + // Get the path to each file, and make sure these paths are unique. + $files = array_map( + function (string $functionFile) use ($filesystem, $basePath, $vendorPath): string { + return $this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile); + }, + $files + ); + $uniqueFiles = array_unique($files); + if (count($uniqueFiles) < count($files)) { + $this->io->writeError('The following "files" autoload rules are included multiple times, this may cause issues and should be resolved:'); + foreach (array_unique(array_diff_assoc($files, $uniqueFiles)) as $duplicateFile) { + $this->io->writeError(' - '.$duplicateFile.''); + } + } + unset($uniqueFiles); + $filesCode = ''; + foreach ($files as $fileIdentifier => $functionFile) { - $filesCode .= ' ' . var_export($fileIdentifier, true) . ' => ' - . $this->getPathCode($filesystem, $basePath, $vendorPath, $functionFile) . ",\n"; + $filesCode .= ' ' . var_export($fileIdentifier, true) . ' => ' . $functionFile . ",\n"; } if (!$filesCode) { @@ -712,7 +749,7 @@ protected function getPathCode(Filesystem $filesystem, string $basePath, string } /** - * @param array $packageMap + * @param array $packageMap * @param bool|'php-only' $checkPlatform * @param string[] $devPackageNames * @return ?string @@ -720,6 +757,7 @@ protected function getPathCode(Filesystem $filesystem, string $basePath, string protected function getPlatformCheck(array $packageMap, $checkPlatform, array $devPackageNames) { $lowestPhpVersion = Bound::zero(); + $requiredPhp64bit = false; $requiredExtensions = []; $extensionProviders = []; @@ -744,13 +782,17 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de continue; } - if ('php' === $link->getTarget()) { + if (in_array($link->getTarget(), ['php', 'php-64bit'], true)) { $constraint = $link->getConstraint(); if ($constraint->getLowerBound()->compareTo($lowestPhpVersion, '>')) { $lowestPhpVersion = $constraint->getLowerBound(); } } + if ('php-64bit' === $link->getTarget()) { + $requiredPhp64bit = true; + } + if ($checkPlatform === true && Preg::isMatch('{^ext-(.+)$}iD', $link->getTarget(), $match)) { // skip extension checks if they have a valid provider/replacer if (isset($extensionProviders[$match[1]])) { @@ -823,6 +865,16 @@ protected function getPlatformCheck(array $packageMap, $checkPlatform, array $de \$issues[] = 'Your Composer dependencies require a PHP version $requiredPhpError. You are running ' . PHP_VERSION . '.'; } +PHP_CHECK; + } + + if ($requiredPhp64bit) { + $requiredPhp .= << $packageMap + * @param array $packageMap * @param string $type one of: 'psr-0'|'psr-4'|'classmap'|'files' * @return array|array>|array */ @@ -1156,6 +1208,11 @@ protected function parseAutoloadsType(array $packageMap, string $type, RootPacka foreach ($packageMap as $item) { [$package, $installPath] = $item; + // packages that are not installed cannot autoload anything + if (null === $installPath) { + continue; + } + $autoload = $package->getAutoload(); if ($this->devMode && $package === $rootPackage) { $autoload = array_merge_recursive($autoload, $package->getDevAutoload()); @@ -1245,10 +1302,8 @@ protected function getFileIdentifier(PackageInterface $package, string $path) /** * Filters out dev-dependencies * - * @param array $packageMap - * @return array - * - * @phpstan-param array $packageMap + * @param array $packageMap + * @return array */ protected function filterPackageMap(array $packageMap, RootPackageInterface $rootPackage) { @@ -1301,8 +1356,8 @@ static function ($item) use ($include): bool { * * Packages of equal weight are sorted alphabetically * - * @param array $packageMap - * @return array + * @param array $packageMap + * @return array */ protected function sortPackageMap(array $packageMap) { diff --git a/app/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php b/app/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php index a72151c77..7824d8f7e 100644 --- a/app/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php +++ b/app/vendor/composer/composer/src/Composer/Autoload/ClassLoader.php @@ -45,35 +45,34 @@ class ClassLoader /** @var \Closure(string):void */ private static $includeFile; - /** @var ?string */ + /** @var string|null */ private $vendorDir; // PSR-4 /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixLengthsPsr4 = array(); /** - * @var array[] - * @psalm-var array> + * @var array> */ private $prefixDirsPsr4 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr4 = array(); // PSR-0 /** - * @var array[] - * @psalm-var array> + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> */ private $prefixesPsr0 = array(); /** - * @var array[] - * @psalm-var array + * @var list */ private $fallbackDirsPsr0 = array(); @@ -81,8 +80,7 @@ class ClassLoader private $useIncludePath = false; /** - * @var string[] - * @psalm-var array + * @var array */ private $classMap = array(); @@ -90,21 +88,20 @@ class ClassLoader private $classMapAuthoritative = false; /** - * @var bool[] - * @psalm-var array + * @var array */ private $missingClasses = array(); - /** @var ?string */ + /** @var string|null */ private $apcuPrefix; /** - * @var self[] + * @var array */ private static $registeredLoaders = array(); /** - * @param ?string $vendorDir + * @param string|null $vendorDir */ public function __construct($vendorDir = null) { @@ -113,7 +110,7 @@ public function __construct($vendorDir = null) } /** - * @return string[] + * @return array> */ public function getPrefixes() { @@ -125,8 +122,7 @@ public function getPrefixes() } /** - * @return array[] - * @psalm-return array> + * @return array> */ public function getPrefixesPsr4() { @@ -134,8 +130,7 @@ public function getPrefixesPsr4() } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirs() { @@ -143,8 +138,7 @@ public function getFallbackDirs() } /** - * @return array[] - * @psalm-return array + * @return list */ public function getFallbackDirsPsr4() { @@ -152,8 +146,7 @@ public function getFallbackDirsPsr4() } /** - * @return string[] Array of classname => path - * @psalm-return array + * @return array Array of classname => path */ public function getClassMap() { @@ -161,8 +154,7 @@ public function getClassMap() } /** - * @param string[] $classMap Class to filename map - * @psalm-param array $classMap + * @param array $classMap Class to filename map * * @return void */ @@ -179,24 +171,25 @@ public function addClassMap(array $classMap) * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories * * @return void */ public function add($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, - (array) $paths + $paths ); } @@ -205,19 +198,19 @@ public function add($prefix, $paths, $prepend = false) $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; + $this->prefixesPsr0[$first][$prefix] = $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], - (array) $paths + $paths ); } } @@ -226,9 +219,9 @@ public function add($prefix, $paths, $prepend = false) * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException * @@ -236,17 +229,18 @@ public function add($prefix, $paths, $prepend = false) */ public function addPsr4($prefix, $paths, $prepend = false) { + $paths = (array) $paths; if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( - (array) $paths, + $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, - (array) $paths + $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { @@ -256,18 +250,18 @@ public function addPsr4($prefix, $paths, $prepend = false) throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; + $this->prefixDirsPsr4[$prefix] = $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, + $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], - (array) $paths + $paths ); } } @@ -276,8 +270,8 @@ public function addPsr4($prefix, $paths, $prepend = false) * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param string[]|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories * * @return void */ @@ -294,8 +288,8 @@ public function set($prefix, $paths) * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param string[]|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException * @@ -481,9 +475,9 @@ public function findFile($class) } /** - * Returns the currently registered loaders indexed by their corresponding vendor directories. + * Returns the currently registered loaders keyed by their corresponding vendor directories. * - * @return self[] + * @return array */ public static function getRegisteredLoaders() { diff --git a/app/vendor/composer/composer/src/Composer/Autoload/PhpFileCleaner.php b/app/vendor/composer/composer/src/Composer/Autoload/PhpFileCleaner.php deleted file mode 100644 index 0c00f878b..000000000 --- a/app/vendor/composer/composer/src/Composer/Autoload/PhpFileCleaner.php +++ /dev/null @@ -1,247 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -use Composer\Pcre\Preg; - -/** - * @author Jordi Boggiano - * @internal - */ -class PhpFileCleaner -{ - /** @var array */ - private static $typeConfig; - - /** @var non-empty-string */ - private static $restPattern; - - /** - * @readonly - * @var string - */ - private $contents; - - /** - * @readonly - * @var int - */ - private $len; - - /** - * @readonly - * @var int - */ - private $maxMatches; - - /** @var int */ - private $index = 0; - - /** - * @param string[] $types - */ - public static function setTypeConfig(array $types): void - { - foreach ($types as $type) { - self::$typeConfig[$type[0]] = [ - 'name' => $type, - 'length' => \strlen($type), - 'pattern' => '{.\b(?])'.$type.'\s++[a-zA-Z_\x7f-\xff:][a-zA-Z0-9_\x7f-\xff:\-]*+}Ais', - ]; - } - - self::$restPattern = '{[^?"\'contents = $contents; - $this->len = \strlen($this->contents); - $this->maxMatches = $maxMatches; - } - - public function clean(): string - { - $clean = ''; - - while ($this->index < $this->len) { - $this->skipToPhp(); - $clean .= 'index < $this->len) { - $char = $this->contents[$this->index]; - if ($char === '?' && $this->peek('>')) { - $clean .= '?>'; - $this->index += 2; - continue 2; - } - - if ($char === '"') { - $this->skipString('"'); - $clean .= 'null'; - continue; - } - - if ($char === "'") { - $this->skipString("'"); - $clean .= 'null'; - continue; - } - - if ($char === "<" && $this->peek('<') && $this->match('{<<<[ \t]*+([\'"]?)([a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*+)\\1(?:\r\n|\n|\r)}A', $match)) { - $this->index += \strlen($match[0]); - $this->skipHeredoc($match[2]); - $clean .= 'null'; - continue; - } - - if ($char === '/') { - if ($this->peek('/')) { - $this->skipToNewline(); - continue; - } - if ($this->peek('*')) { - $this->skipComment(); - continue; - } - } - - if ($this->maxMatches === 1 && isset(self::$typeConfig[$char])) { - $type = self::$typeConfig[$char]; - if ( - \substr($this->contents, $this->index, $type['length']) === $type['name'] - && Preg::isMatch($type['pattern'], $this->contents, $match, 0, $this->index - 1) - ) { - $clean .= $match[0]; - - return $clean; - } - } - - $this->index += 1; - if ($this->match(self::$restPattern, $match)) { - $clean .= $char . $match[0]; - $this->index += \strlen($match[0]); - } else { - $clean .= $char; - } - } - } - - return $clean; - } - - private function skipToPhp(): void - { - while ($this->index < $this->len) { - if ($this->contents[$this->index] === '<' && $this->peek('?')) { - $this->index += 2; - break; - } - - $this->index += 1; - } - } - - private function skipString(string $delimiter): void - { - $this->index += 1; - while ($this->index < $this->len) { - if ($this->contents[$this->index] === '\\' && ($this->peek('\\') || $this->peek($delimiter))) { - $this->index += 2; - continue; - } - if ($this->contents[$this->index] === $delimiter) { - $this->index += 1; - break; - } - $this->index += 1; - } - } - - private function skipComment(): void - { - $this->index += 2; - while ($this->index < $this->len) { - if ($this->contents[$this->index] === '*' && $this->peek('/')) { - $this->index += 2; - break; - } - - $this->index += 1; - } - } - - private function skipToNewline(): void - { - while ($this->index < $this->len) { - if ($this->contents[$this->index] === "\r" || $this->contents[$this->index] === "\n") { - return; - } - $this->index += 1; - } - } - - private function skipHeredoc(string $delimiter): void - { - $firstDelimiterChar = $delimiter[0]; - $delimiterLength = \strlen($delimiter); - $delimiterPattern = '{'.preg_quote($delimiter).'(?![a-zA-Z0-9_\x80-\xff])}A'; - - while ($this->index < $this->len) { - // check if we find the delimiter after some spaces/tabs - switch ($this->contents[$this->index]) { - case "\t": - case " ": - $this->index += 1; - continue 2; - case $firstDelimiterChar: - if ( - \substr($this->contents, $this->index, $delimiterLength) === $delimiter - && $this->match($delimiterPattern) - ) { - $this->index += $delimiterLength; - - return; - } - break; - } - - // skip the rest of the line - while ($this->index < $this->len) { - $this->skipToNewline(); - - // skip newlines - while ($this->index < $this->len && ($this->contents[$this->index] === "\r" || $this->contents[$this->index] === "\n")) { - $this->index += 1; - } - - break; - } - } - } - - private function peek(string $char): bool - { - return $this->index + 1 < $this->len && $this->contents[$this->index + 1] === $char; - } - - /** - * @param non-empty-string $regex - * @param null|array $match - */ - private function match($regex, ?array &$match = null): bool - { - return Preg::isMatch($regex, $this->contents, $match, 0, $this->index); - } -} diff --git a/app/vendor/composer/composer/src/Composer/Command/AuditCommand.php b/app/vendor/composer/composer/src/Composer/Command/AuditCommand.php index 5a91a1743..3788b8e37 100644 --- a/app/vendor/composer/composer/src/Composer/Command/AuditCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/AuditCommand.php @@ -63,7 +63,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $repoSet->addRepository($repo); } - return min(255, $auditor->audit($this->getIO(), $repoSet, $packages, $this->getAuditFormat($input, 'format'), false)); + $auditConfig = $composer->getConfig()->get('audit'); + + return min(255, $auditor->audit($this->getIO(), $repoSet, $packages, $this->getAuditFormat($input, 'format'), false, $auditConfig['ignore'] ?? [], $auditConfig['abandoned'] ?? Auditor::ABANDONED_REPORT)); } /** diff --git a/app/vendor/composer/composer/src/Composer/Command/BaseDependencyCommand.php b/app/vendor/composer/composer/src/Composer/Command/BaseDependencyCommand.php index 82662093a..d3b690eca 100644 --- a/app/vendor/composer/composer/src/Composer/Command/BaseDependencyCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/BaseDependencyCommand.php @@ -24,10 +24,12 @@ use Composer\Repository\RepositoryFactory; use Composer\Plugin\CommandEvent; use Composer\Plugin\PluginEvents; +use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Composer\Package\Version\VersionParser; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; +use Composer\Util\PackageInfo; /** * Base implementation for commands mapping dependency relationships. @@ -180,7 +182,9 @@ protected function printTable(OutputInterface $output, $results): void } $doubles[$unique] = true; $version = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '-' : $package->getPrettyVersion(); - $rows[] = [$package->getPrettyName(), $version, $link->getDescription(), sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())]; + $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); + $nameWithLink = $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); + $rows[] = [$nameWithLink, $version, $link->getDescription(), sprintf('%s (%s)', $link->getTarget(), $link->getPrettyConstraint())]; if ($children) { $queue = array_merge($queue, $children); } @@ -229,7 +233,9 @@ protected function printTree(array $results, string $prefix = '', int $level = 1 $prevColor = $this->colors[($level - 1) % count($this->colors)]; $isLast = (++$idx === $count); $versionText = $package->getPrettyVersion() === RootPackage::DEFAULT_PRETTY_VERSION ? '' : $package->getPrettyVersion(); - $packageText = rtrim(sprintf('<%s>%s %s', $color, $package->getPrettyName(), $versionText)); + $packageUrl = PackageInfo::getViewSourceOrHomepageUrl($package); + $nameWithLink = $packageUrl !== null ? '' . $package->getPrettyName() . '' : $package->getPrettyName(); + $packageText = rtrim(sprintf('<%s>%s %s', $color, $nameWithLink, $versionText)); $linkText = sprintf('%s <%s>%s %s', $link->getDescription(), $prevColor, $link->getTarget(), $link->getPrettyConstraint()); $circularWarn = $children === false ? '(circular dependency aborted here)' : ''; $this->writeTreeLine(rtrim(sprintf("%s%s%s (%s) %s", $prefix, $isLast ? '└──' : '├──', $packageText, $linkText, $circularWarn))); diff --git a/app/vendor/composer/composer/src/Composer/Command/ConfigCommand.php b/app/vendor/composer/composer/src/Composer/Command/ConfigCommand.php index bef163b3d..cbdc174bc 100644 --- a/app/vendor/composer/composer/src/Composer/Command/ConfigCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/ConfigCommand.php @@ -12,6 +12,7 @@ namespace Composer\Command; +use Composer\Advisory\Auditor; use Composer\Pcre\Preg; use Composer\Util\Filesystem; use Composer\Util\Platform; @@ -512,6 +513,14 @@ static function ($val) { return $val !== 'false' && (bool) $val; }, ], + 'audit.abandoned' => [ + static function ($val): bool { + return in_array($val, [Auditor::ABANDONED_IGNORE, Auditor::ABANDONED_REPORT, Auditor::ABANDONED_FAIL], true); + }, + static function ($val) { + return $val; + }, + ], ]; $multiConfigValues = [ 'github-protocols' => [ @@ -556,8 +565,27 @@ static function ($vals) { return $vals; }, ], + 'audit.ignore' => [ + static function ($vals) { + if (!is_array($vals)) { + return 'array expected'; + } + + return true; + }, + static function ($vals) { + return $vals; + }, + ], ]; + // allow unsetting audit config entirely + if ($input->getOption('unset') && $settingKey === 'audit') { + $this->configSource->removeConfigSetting($settingKey); + + return 0; + } + if ($input->getOption('unset') && (isset($uniqueConfigValues[$settingKey]) || isset($multiConfigValues[$settingKey]))) { if ($settingKey === 'disable-tls' && $this->config->get('disable-tls')) { $this->getIO()->writeError('You are now running Composer with SSL/TLS protection enabled.'); diff --git a/app/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php b/app/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php index 6037a9803..f0bb7dbb5 100644 --- a/app/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/CreateProjectCommand.php @@ -469,6 +469,13 @@ protected function installRootPackage(IOInterface $io, Config $config, string $p $io->writeError('Created project in ' . $directory . ''); chdir($directory); + // ensure that the env var being set does not interfere with create-project + // as it is probably not meant to be used here, so we do not use it if a composer.json can be found + // in the project + if (file_exists($directory.'/composer.json') && Platform::getEnv('COMPOSER') !== false) { + Platform::clearEnv('COMPOSER'); + } + Platform::putEnv('COMPOSER_ROOT_VERSION', $package->getPrettyVersion()); // once the root project is fully initialized, we do not need to wipe everything on user abort anymore even if it happens during deps install diff --git a/app/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php b/app/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php index 6f306d340..b1af4d6be 100644 --- a/app/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/DiagnoseCommand.php @@ -251,7 +251,7 @@ private function checkGit(): string */ private function checkHttp(string $proto, Config $config) { - $result = $this->checkConnectivity(); + $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== true) { return $result; } @@ -290,7 +290,7 @@ private function checkHttp(string $proto, Config $config) */ private function checkHttpProxy() { - $result = $this->checkConnectivity(); + $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== true) { return $result; } @@ -318,7 +318,7 @@ private function checkHttpProxy() */ private function checkGithubOauth(string $domain, string $token) { - $result = $this->checkConnectivity(); + $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== true) { return $result; } @@ -348,7 +348,7 @@ private function checkGithubOauth(string $domain, string $token) */ private function getGithubRateLimit(string $domain, ?string $token = null) { - $result = $this->checkConnectivity(); + $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== true) { return $result; } @@ -419,7 +419,7 @@ private function checkPubKeys(Config $config) */ private function checkVersion(Config $config) { - $result = $this->checkConnectivity(); + $result = $this->checkConnectivityAndComposerNetworkHttpEnablement(); if ($result !== true) { return $result; } @@ -733,7 +733,39 @@ private function checkPlatform() private function checkConnectivity() { if (!ini_get('allow_url_fopen')) { - return 'Skipped because allow_url_fopen is missing.'; + return 'SKIP Because allow_url_fopen is missing.'; + } + + return true; + } + + /** + * @return string|true + */ + private function checkConnectivityAndComposerNetworkHttpEnablement() + { + $result = $this->checkConnectivity(); + if ($result !== true) { + return $result; + } + + $result = $this->checkComposerNetworkHttpEnablement(); + if ($result !== true) { + return $result; + } + + return true; + } + + /** + * Check if Composer network is enabled for HTTP/S + * + * @return string|true + */ + private function checkComposerNetworkHttpEnablement() + { + if ((bool) Platform::getEnv('COMPOSER_DISABLE_NETWORK')) { + return 'SKIP Network is disabled by COMPOSER_DISABLE_NETWORK.'; } return true; diff --git a/app/vendor/composer/composer/src/Composer/Command/DumpAutoloadCommand.php b/app/vendor/composer/composer/src/Composer/Command/DumpAutoloadCommand.php index a6c6a5ae4..41a23cd3a 100644 --- a/app/vendor/composer/composer/src/Composer/Command/DumpAutoloadCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/DumpAutoloadCommand.php @@ -37,6 +37,7 @@ protected function configure() new InputOption('classmap-authoritative', 'a', InputOption::VALUE_NONE, 'Autoload classes from the classmap only. Implicitly enables `--optimize`.'), new InputOption('apcu', null, InputOption::VALUE_NONE, 'Use APCu to cache found/not-found classes.'), new InputOption('apcu-prefix', null, InputOption::VALUE_REQUIRED, 'Use a custom prefix for the APCu autoloader cache. Implicitly enables --apcu'), + new InputOption('dry-run', null, InputOption::VALUE_NONE, 'Outputs the operations but will not execute anything.'), new InputOption('dev', null, InputOption::VALUE_NONE, 'Enables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'), new InputOption('no-dev', null, InputOption::VALUE_NONE, 'Disables autoload-dev rules. Composer will by default infer this automatically according to the last install or update --no-dev state.'), new InputOption('ignore-platform-req', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY, 'Ignore a specific platform requirement (php & ext- packages).'), @@ -70,8 +71,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $apcuPrefix = $input->getOption('apcu-prefix'); $apcu = $apcuPrefix !== null || $input->getOption('apcu') || $config->get('apcu-autoloader'); - if ($input->getOption('strict-psr') && !$optimize) { - throw new \InvalidArgumentException('--strict-psr mode only works with optimized autoloader, use --optimize if you want a strict return value.'); + if ($input->getOption('strict-psr') && !$optimize && !$authoritative) { + throw new \InvalidArgumentException('--strict-psr mode only works with optimized autoloader, use --optimize or --classmap-authoritative if you want a strict return value.'); } if ($authoritative) { @@ -83,6 +84,9 @@ protected function execute(InputInterface $input, OutputInterface $output) } $generator = $composer->getAutoloadGenerator(); + if ($input->getOption('dry-run')) { + $generator->setDryRun(true); + } if ($input->getOption('no-dev')) { $generator->setDevMode(false); } diff --git a/app/vendor/composer/composer/src/Composer/Command/InstallCommand.php b/app/vendor/composer/composer/src/Composer/Command/InstallCommand.php index a469837bb..7ab60260c 100644 --- a/app/vendor/composer/composer/src/Composer/Command/InstallCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/InstallCommand.php @@ -136,6 +136,7 @@ protected function execute(InputInterface $input, OutputInterface $output) ->setApcuAutoloader($apcu, $apcuPrefix) ->setPlatformRequirementFilter($this->getPlatformRequirementFilter($input)) ->setAudit($input->getOption('audit')) + ->setErrorOnAudit($input->getOption('audit')) ->setAuditFormat($this->getAuditFormat($input)) ; diff --git a/app/vendor/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php b/app/vendor/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php index 1e31abaa3..d95e06de8 100644 --- a/app/vendor/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php +++ b/app/vendor/composer/composer/src/Composer/Command/PackageDiscoveryTrait.php @@ -15,6 +15,7 @@ use Composer\Factory; use Composer\Filter\PlatformRequirementFilter\IgnoreAllPlatformRequirementFilter; use Composer\Filter\PlatformRequirementFilter\PlatformRequirementFilterFactory; +use Composer\IO\IOInterface; use Composer\Package\CompletePackageInterface; use Composer\Package\PackageInterface; use Composer\Package\Version\VersionParser; @@ -100,7 +101,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte if (!isset($requirement['version'])) { // determine the best version automatically - [$name, $version] = $this->findBestVersionAndNameForPackage($input, $requirement['name'], $platformRepo, $preferredStability, $fixed); + [$name, $version] = $this->findBestVersionAndNameForPackage($this->getIO(), $input, $requirement['name'], $platformRepo, $preferredStability, $fixed); // replace package name from packagist.org $requirement['name'] = $name; @@ -243,7 +244,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte ); if (false === $constraint) { - [, $constraint] = $this->findBestVersionAndNameForPackage($input, $package, $platformRepo, $preferredStability); + [, $constraint] = $this->findBestVersionAndNameForPackage($this->getIO(), $input, $package, $platformRepo, $preferredStability); $io->writeError(sprintf( 'Using version %s for %s', @@ -273,7 +274,7 @@ final protected function determineRequirements(InputInterface $input, OutputInte * @throws \InvalidArgumentException * @return array{string, string} name version */ - private function findBestVersionAndNameForPackage(InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $fixed = false): array + private function findBestVersionAndNameForPackage(IOInterface $io, InputInterface $input, string $name, ?PlatformRepository $platformRepo = null, string $preferredStability = 'stable', bool $fixed = false): array { // handle ignore-platform-reqs flag if present if ($input->hasOption('ignore-platform-reqs') && $input->hasOption('ignore-platform-req')) { @@ -358,6 +359,13 @@ private function findBestVersionAndNameForPackage(InputInterface $input, string )); } + if ($input->isInteractive()) { + $result = $io->select("Could not find package $name.\nPick one of these or leave empty to abort:", $similar, false, 1); + if ($result !== false) { + return $this->findBestVersionAndNameForPackage($io, $input, $similar[$result], $platformRepo, $preferredStability, $fixed); + } + } + throw new \InvalidArgumentException(sprintf( "Could not find package %s.\n\nDid you mean " . (count($similar) > 1 ? 'one of these' : 'this') . "?\n %s", $name, diff --git a/app/vendor/composer/composer/src/Composer/Command/RemoveCommand.php b/app/vendor/composer/composer/src/Composer/Command/RemoveCommand.php index 3b8ed88af..e808d63ab 100644 --- a/app/vendor/composer/composer/src/Composer/Command/RemoveCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/RemoveCommand.php @@ -43,6 +43,7 @@ protected function configure() { $this ->setName('remove') + ->setAliases(['rm']) ->setDescription('Removes a package from the require or require-dev') ->setDefinition([ new InputArgument('packages', InputArgument::IS_ARRAY, 'Packages that should be removed.', null, $this->suggestRootRequirement()), @@ -73,7 +74,7 @@ protected function configure() php composer.phar remove -Read more at https://getcomposer.org/doc/03-cli.md#remove +Read more at https://getcomposer.org/doc/03-cli.md#remove-rm EOT ) ; diff --git a/app/vendor/composer/composer/src/Composer/Command/RequireCommand.php b/app/vendor/composer/composer/src/Composer/Command/RequireCommand.php index 0ef69066a..760bfdb38 100644 --- a/app/vendor/composer/composer/src/Composer/Command/RequireCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/RequireCommand.php @@ -488,7 +488,7 @@ private function doUpdate(InputInterface $input, OutputInterface $output, IOInte } $status = $install->run(); - if ($status !== 0) { + if ($status !== 0 && $status !== Installer::ERROR_AUDIT_FAILED) { if ($status === Installer::ERROR_DEPENDENCY_RESOLUTION_FAILED) { foreach ($this->normalizeRequirements($input->getArgument('packages')) as $req) { if (!isset($req['version'])) { @@ -551,10 +551,15 @@ private function updateRequirementsAfterResolution(array $requirementsToUpdate, if (false === $contents) { throw new \RuntimeException('Unable to read '.$this->json->getPath().' contents to update the lock file hash.'); } - $lock = new JsonFile(Factory::getLockFile($this->json->getPath())); + $lockFile = Factory::getLockFile($this->json->getPath()); + $lockMtime = filemtime($lockFile); + $lock = new JsonFile($lockFile); $lockData = $lock->read(); $lockData['content-hash'] = Locker::getContentHash($contents); $lock->write($lockData); + if (is_int($lockMtime)) { + @touch($lockFile, $lockMtime); + } } } diff --git a/app/vendor/composer/composer/src/Composer/Command/ShowCommand.php b/app/vendor/composer/composer/src/Composer/Command/ShowCommand.php index 5c07b4605..ea5a9db3b 100644 --- a/app/vendor/composer/composer/src/Composer/Command/ShowCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/ShowCommand.php @@ -332,7 +332,12 @@ protected function execute(InputInterface $input, OutputInterface $output) } if ($input->getOption('path')) { $io->write($package->getName(), false); - $io->write(' ' . strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n")); + $path = $composer->getInstallationManager()->getInstallPath($package); + if (is_string($path)) { + $io->write(' ' . strtok(realpath($path), "\r\n")); + } else { + $io->write(' null'); + } return $exitCode; } @@ -437,6 +442,10 @@ protected function execute(InputInterface $input, OutputInterface $output) $exitCode = 0; $viewData = []; $viewMetaData = []; + + $writeVersion = false; + $writeDescription = false; + foreach (['platform' => true, 'locked' => true, 'available' => false, 'installed' => true] as $type => $showVersion) { if (isset($packages[$type])) { ksort($packages[$type]); @@ -509,7 +518,12 @@ protected function execute(InputInterface $input, OutputInterface $output) $packageViewData['description'] = $package->getDescription(); } if ($writePath) { - $packageViewData['path'] = strtok(realpath($composer->getInstallationManager()->getInstallPath($package)), "\r\n"); + $path = $composer->getInstallationManager()->getInstallPath($package); + if (is_string($path)) { + $packageViewData['path'] = strtok(realpath($path), "\r\n"); + } else { + $packageViewData['path'] = null; + } } $packageIsAbandoned = false; @@ -606,14 +620,14 @@ protected function execute(InputInterface $input, OutputInterface $output) $io->writeError(''); $io->writeError('Direct dependencies required in composer.json:'); if (\count($directDeps) > 0) { - $this->printPackages($io, $directDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $directDeps, $indent, $writeVersion && $versionFits, $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { $io->writeError('Everything up to date'); } $io->writeError(''); $io->writeError('Transitive dependencies not required in composer.json:'); if (\count($transitiveDeps) > 0) { - $this->printPackages($io, $transitiveDeps, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $transitiveDeps, $indent, $writeVersion && $versionFits, $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } else { $io->writeError('Everything up to date'); } @@ -621,7 +635,7 @@ protected function execute(InputInterface $input, OutputInterface $output) if ($writeLatest && \count($packages) === 0) { $io->writeError('All your direct dependencies are up to date'); } else { - $this->printPackages($io, $packages, $indent, $versionFits, $latestFits, $descriptionFits, $width, $versionLength, $nameLength, $latestLength); + $this->printPackages($io, $packages, $indent, $writeVersion && $versionFits, $writeLatest && $latestFits, $writeDescription && $descriptionFits, $width, $versionLength, $nameLength, $latestLength); } } @@ -635,19 +649,22 @@ protected function execute(InputInterface $input, OutputInterface $output) } /** - * @param array $packages + * @param array $packages */ private function printPackages(IOInterface $io, array $packages, string $indent, bool $writeVersion, bool $writeLatest, bool $writeDescription, int $width, int $versionLength, int $nameLength, int $latestLength): void { + $padName = $writeVersion || $writeLatest || $writeDescription; + $padVersion = $writeLatest || $writeDescription; + $padLatest = $writeDescription; foreach ($packages as $package) { $link = $package['source'] ?? $package['homepage'] ?? ''; if ($link !== '') { - $io->write($indent . ''.$package['name'].''. str_repeat(' ', $nameLength - strlen($package['name'])), false); + $io->write($indent . ''.$package['name'].''. str_repeat(' ', ($padName ? $nameLength - strlen($package['name']) : 0)), false); } else { - $io->write($indent . str_pad($package['name'], $nameLength, ' '), false); + $io->write($indent . str_pad($package['name'], ($padName ? $nameLength : 0), ' '), false); } if (isset($package['version']) && $writeVersion) { - $io->write(' ' . str_pad($package['version'], $versionLength, ' '), false); + $io->write(' ' . str_pad($package['version'], ($padVersion ? $versionLength : 0), ' '), false); } if (isset($package['latest']) && isset($package['latest-status']) && $writeLatest) { $latestVersion = $package['latest']; @@ -656,7 +673,7 @@ private function printPackages(IOInterface $io, array $packages, string $indent, if (!$io->isDecorated()) { $latestVersion = str_replace(['up-to-date', 'semver-safe-update', 'update-possible'], ['=', '!', '~'], $updateStatus) . ' ' . $latestVersion; } - $io->write(' <' . $style . '>' . str_pad($latestVersion, $latestLength, ' ') . '', false); + $io->write(' <' . $style . '>' . str_pad($latestVersion, ($padLatest ? $latestLength : 0), ' ') . '', false); } if (isset($package['description']) && $writeDescription) { $description = strtok($package['description'], "\r\n"); @@ -669,8 +686,8 @@ private function printPackages(IOInterface $io, array $packages, string $indent, } $io->write(' ' . $description, false); } - if (isset($package['path'])) { - $io->write(' ' . $package['path'], false); + if (array_key_exists('path', $package)) { + $io->write(' '.(is_string($package['path']) ? $package['path'] : 'null'), false); } $io->write(''); if (isset($package['warning'])) { @@ -746,10 +763,14 @@ protected function getPackage(InstalledRepository $installedRepo, RepositoryInte } // select preferred package according to policy rules - if (!$matchedPackage && $matches && $preferred = $policy->selectPreferredPackages($pool, $matches)) { + if (null === $matchedPackage && $matches && $preferred = $policy->selectPreferredPackages($pool, $matches)) { $matchedPackage = $pool->literalToPackage($preferred[0]); } + if ($matchedPackage !== null && !$matchedPackage instanceof CompletePackageInterface) { + throw new \LogicException('ShowCommand::getPackage can only work with CompletePackageInterface, but got '.get_class($matchedPackage)); + } + return [$matchedPackage, $versions]; } @@ -801,8 +822,13 @@ protected function printMeta(CompletePackageInterface $package, array $versions, $io->write('homepage : ' . $package->getHomepage()); $io->write('source : ' . sprintf('[%s] %s %s', $package->getSourceType(), $package->getSourceUrl(), $package->getSourceReference())); $io->write('dist : ' . sprintf('[%s] %s %s', $package->getDistType(), $package->getDistUrl(), $package->getDistReference())); - if ($installedRepo->hasPackage($package)) { - $io->write('path : ' . sprintf('%s', realpath($this->requireComposer()->getInstallationManager()->getInstallPath($package)))); + if (!PlatformRepository::isPlatformPackage($package->getName()) && $installedRepo->hasPackage($package)) { + $path = $this->requireComposer()->getInstallationManager()->getInstallPath($package); + if (is_string($path)) { + $io->write('path : ' . realpath($path)); + } else { + $io->write('path : null'); + } } $io->write('names : ' . implode(', ', $package->getNames())); @@ -957,10 +983,15 @@ protected function printPackageInfoAsJson(CompletePackageInterface $package, arr ]; } - if ($installedRepo->hasPackage($package)) { - $path = realpath($this->requireComposer()->getInstallationManager()->getInstallPath($package)); - if ($path !== false) { - $json['path'] = $path; + if (!PlatformRepository::isPlatformPackage($package->getName()) && $installedRepo->hasPackage($package)) { + $path = $this->requireComposer()->getInstallationManager()->getInstallPath($package); + if (is_string($path)) { + $path = realpath($path); + if ($path !== false) { + $json['path'] = $path; + } + } else { + $json['path'] = null; } } @@ -1231,6 +1262,9 @@ protected function displayTree( $colorIdent = $level % count($this->colors); $color = $this->colors[$colorIdent]; + assert(is_string($require['name'])); + assert(is_string($require['version'])); + $circularWarn = in_array( $require['name'], $currentTree, diff --git a/app/vendor/composer/composer/src/Composer/Command/StatusCommand.php b/app/vendor/composer/composer/src/Composer/Command/StatusCommand.php index 42c20fcef..780f70031 100644 --- a/app/vendor/composer/composer/src/Composer/Command/StatusCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/StatusCommand.php @@ -99,6 +99,9 @@ private function doExecute(InputInterface $input): int foreach ($installedRepo->getCanonicalPackages() as $package) { $downloader = $dm->getDownloaderForPackage($package); $targetDir = $im->getInstallPath($package); + if ($targetDir === null) { + continue; + } if ($downloader instanceof ChangeReportInterface) { if (is_link($targetDir)) { diff --git a/app/vendor/composer/composer/src/Composer/Command/ValidateCommand.php b/app/vendor/composer/composer/src/Composer/Command/ValidateCommand.php index 92ff158af..a5d1e9c46 100644 --- a/app/vendor/composer/composer/src/Composer/Command/ValidateCommand.php +++ b/app/vendor/composer/composer/src/Composer/Command/ValidateCommand.php @@ -112,6 +112,9 @@ protected function execute(InputInterface $input, OutputInterface $output): int $localRepo = $composer->getRepositoryManager()->getLocalRepository(); foreach ($localRepo->getPackages() as $package) { $path = $composer->getInstallationManager()->getInstallPath($package); + if (null === $path) { + continue; + } $file = $path . '/composer.json'; if (is_dir($path) && file_exists($file)) { [$errors, $publishErrors, $warnings] = $validator->validate($file, $checkAll, $checkVersion); diff --git a/app/vendor/composer/composer/src/Composer/Composer.php b/app/vendor/composer/composer/src/Composer/Composer.php index 195e9e43c..fc180d868 100644 --- a/app/vendor/composer/composer/src/Composer/Composer.php +++ b/app/vendor/composer/composer/src/Composer/Composer.php @@ -51,9 +51,9 @@ class Composer extends PartialComposer * * @see getVersion() */ - public const VERSION = '2.5.5'; + public const VERSION = '2.6.3'; public const BRANCH_ALIAS_VERSION = ''; - public const RELEASE_DATE = '2023-03-21 11:50:05'; + public const RELEASE_DATE = '2023-09-15 09:38:21'; public const SOURCE_VERSION = ''; /** diff --git a/app/vendor/composer/composer/src/Composer/Config.php b/app/vendor/composer/composer/src/Composer/Config.php index 4555203f1..1ad622692 100644 --- a/app/vendor/composer/composer/src/Composer/Config.php +++ b/app/vendor/composer/composer/src/Composer/Config.php @@ -12,6 +12,7 @@ namespace Composer; +use Composer\Advisory\Auditor; use Composer\Config\ConfigSourceInterface; use Composer\Downloader\TransportException; use Composer\IO\IOInterface; @@ -37,6 +38,7 @@ class Config 'allow-plugins' => [], 'use-parent-dir' => 'prompt', 'preferred-install' => 'dist', + 'audit' => ['ignore' => [], 'abandoned' => 'default'], // TODO in 2.7 switch to ABANDONED_FAIL 'notify-on-install' => true, 'github-protocols' => ['https', 'ssh', 'git'], 'gitlab-protocol' => null, @@ -207,6 +209,11 @@ public function merge(array $config, string $source = self::SOURCE_UNKNOWN): voi $this->config[$key] = $val; $this->setSourceOfConfigValue($val, $key, $source); } + } elseif ('audit' === $key) { + $currentIgnores = $this->config['audit']['ignore']; + $this->config[$key] = array_merge($this->config['audit'], $val); + $this->setSourceOfConfigValue($val, $key, $source); + $this->config['audit']['ignore'] = array_merge($currentIgnores, $val['ignore'] ?? []); } else { $this->config[$key] = $val; $this->setSourceOfConfigValue($val, $key, $source); diff --git a/app/vendor/composer/composer/src/Composer/Console/Application.php b/app/vendor/composer/composer/src/Composer/Console/Application.php index 9e585e614..da77636d1 100644 --- a/app/vendor/composer/composer/src/Composer/Console/Application.php +++ b/app/vendor/composer/composer/src/Composer/Console/Application.php @@ -87,6 +87,10 @@ class Application extends BaseApplication public function __construct(string $name = 'Composer', string $version = '') { + if (method_exists($this, 'setCatchErrors')) { + $this->setCatchErrors(true); + } + static $shutdownRegistered = false; if ($version === '') { $version = Composer::getVersion(); @@ -339,7 +343,8 @@ function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknow // Check system temp folder for usability as it can cause weird runtime issues otherwise Silencer::call(static function () use ($io): void { - $tempfile = sys_get_temp_dir() . '/temp-' . getmypid() . '-' . md5(microtime()); + $pid = function_exists('getmypid') ? getmypid() . '-' : ''; + $tempfile = sys_get_temp_dir() . '/temp-' . $pid . md5(microtime()); if (!(file_put_contents($tempfile, __FILE__) && (file_get_contents($tempfile) === __FILE__) && unlink($tempfile) && !file_exists($tempfile))) { $io->writeError(sprintf('PHP temp directory (%s) does not exist or is not writable to Composer. Set sys_temp_dir in your php.ini', sys_get_temp_dir())); } @@ -394,9 +399,10 @@ function_exists('php_uname') ? php_uname('s') . ' / ' . php_uname('r') : 'Unknow $this->hintCommonErrors($e, $output); - // symfony/console does not handle \Error subtypes so we have to renderThrowable ourselves + // symfony/console <6.4 does not handle \Error subtypes so we have to renderThrowable ourselves // instead of rethrowing those for consumption by the parent class - if (!$e instanceof \Exception) { + // can be removed when Composer supports PHP 8.1+ + if (!method_exists($this, 'setCatchErrors') && !$e instanceof \Exception) { if ($output instanceof ConsoleOutputInterface) { $this->renderThrowable($e, $output->getErrorOutput()); } else { diff --git a/app/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php b/app/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php index 9de4bed71..aa6f5019b 100644 --- a/app/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php +++ b/app/vendor/composer/composer/src/Composer/DependencyResolver/PoolBuilder.php @@ -421,7 +421,10 @@ private function loadPackage(Request $request, array $repositories, BasePackage // if propagateUpdate is false we are loading a fixed or locked package, root aliases do not apply as they are // manually loaded as separate packages in this case - if ($propagateUpdate && isset($this->rootAliases[$name][$package->getVersion()])) { + // + // packages in pathRepoUnlocked however need to also load root aliases, they have propagateUpdate set to + // false because their deps should not be unlocked, but that is irrelevant for root aliases + if (($propagateUpdate || isset($this->pathRepoUnlocked[$package->getName()])) && isset($this->rootAliases[$name][$package->getVersion()])) { $alias = $this->rootAliases[$name][$package->getVersion()]; if ($package instanceof AliasPackage) { $basePackage = $package->getAliasOf(); @@ -483,7 +486,8 @@ private function loadPackage(Request $request, array $repositories, BasePackage if ($request->getUpdateAllowTransitiveRootDependencies() || !$skippedRootRequires) { $this->unlockPackage($request, $repositories, $replace); - $this->markPackageNameForLoading($request, $replace, $link->getConstraint()); + // the replaced package only needs to be loaded if something else requires it + $this->markPackageNameForLoadingIfRequired($request, $replace); } else { foreach ($skippedRootRequires as $rootRequire) { if (!isset($this->updateAllowWarned[$rootRequire])) { @@ -639,6 +643,8 @@ private function unlockPackage(Request $request, array $repositories, string $na // make sure that any requirements for this package by other locked or fixed packages are now // also loaded, as they were previously ignored because the locked (now unlocked) package already // satisfied their requirements + // and if this package is replacing another that is required by a locked or fixed package, ensure + // that we load that replaced package in case an update to this package removes the replacement foreach ($request->getFixedOrLockedPackages() as $fixedOrLockedPackage) { if ($fixedOrLockedPackage === $lockedPackage) { continue; @@ -649,6 +655,14 @@ private function unlockPackage(Request $request, array $repositories, string $na if (isset($requires[$lockedPackage->getName()])) { $this->markPackageNameForLoading($request, $lockedPackage->getName(), $requires[$lockedPackage->getName()]->getConstraint()); } + + foreach ($lockedPackage->getReplaces() as $replace) { + if (isset($requires[$replace->getTarget()], $this->skippedLoad[$replace->getTarget()])) { + $this->unlockPackage($request, $repositories, $replace->getTarget()); + // this package is in $requires so no need to call markPackageNameForLoadingIfRequired + $this->markPackageNameForLoading($request, $replace->getTarget(), $replace->getConstraint()); + } + } } } } @@ -656,6 +670,21 @@ private function unlockPackage(Request $request, array $repositories, string $na } } + private function markPackageNameForLoadingIfRequired(Request $request, string $name): void + { + if ($this->isRootRequire($request, $name)) { + $this->markPackageNameForLoading($request, $name, $request->getRequires()[$name]); + } + + foreach ($this->packages as $package) { + foreach ($package->getRequires() as $link) { + if ($name === $link->getTarget()) { + $this->markPackageNameForLoading($request, $link->getTarget(), $link->getConstraint()); + } + } + } + } + /** * @param RepositoryInterface[] $repositories */ diff --git a/app/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php b/app/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php index 5dfeb18c8..cf2cb381e 100644 --- a/app/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php +++ b/app/vendor/composer/composer/src/Composer/DependencyResolver/Problem.php @@ -453,7 +453,7 @@ private static function getPlatformPackageVersion(Pool $pool, string $packageNam } /** - * @param array $versions an array of pretty versions, with normalized versions as keys + * @param array $versions an array of pretty versions, with normalized versions as keys * @return list a list of pretty versions and '...' where versions were removed */ private static function condenseVersionList(array $versions, int $max, int $maxDev = 16): array @@ -465,10 +465,10 @@ private static function condenseVersionList(array $versions, int $max, int $maxD $filtered = []; $byMajor = []; foreach ($versions as $version => $pretty) { - if (0 === stripos($version, 'dev-')) { + if (0 === stripos((string) $version, 'dev-')) { $byMajor['dev'][] = $pretty; } else { - $byMajor[Preg::replace('{^(\d+)\..*}', '$1', $version)][] = $pretty; + $byMajor[Preg::replace('{^(\d+)\..*}', '$1', (string) $version)][] = $pretty; } } foreach ($byMajor as $majorVersion => $versionsForMajor) { @@ -557,6 +557,19 @@ private static function computeCheckForLowerPrioRepo(Pool $pool, bool $isVerbose */ protected static function constraintToText(?ConstraintInterface $constraint = null): string { + if ($constraint instanceof Constraint && $constraint->getOperator() === Constraint::STR_OP_EQ && !str_starts_with($constraint->getVersion(), 'dev-')) { + if (!Preg::isMatch('{^\d+(?:\.\d+)*$}', $constraint->getPrettyString())) { + return ' '.$constraint->getPrettyString() .' (exact version match)'; + } + + $versions = [$constraint->getPrettyString()]; + for ($i = 3 - substr_count($versions[0], '.'); $i > 0; $i--) { + $versions[] = end($versions) . '.0'; + } + + return ' ' . $constraint->getPrettyString() . ' (exact version match: ' . (count($versions) > 1 ? implode(', ', array_slice($versions, 0, -1)) . ' or ' . end($versions) : $versions[0]) . ')'; + } + return $constraint ? ' '.$constraint->getPrettyString() : ''; } } diff --git a/app/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php b/app/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php index ccfb6ebe5..373e8325d 100644 --- a/app/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php +++ b/app/vendor/composer/composer/src/Composer/DependencyResolver/Solver.php @@ -565,35 +565,6 @@ private function analyzeUnsolvable(Rule $conflictRule): int return 0; } - /** - * enable/disable learnt rules - * - * we have enabled or disabled some of our rules. We now re-enable all - * of our learnt rules except the ones that were learnt from rules that - * are now disabled. - */ - private function enableDisableLearnedRules(): void - { - foreach ($this->rules->getIteratorFor(RuleSet::TYPE_LEARNED) as $rule) { - $why = $this->learnedWhy[spl_object_hash($rule)]; - $problemRules = $this->learnedPool[$why]; - - $foundDisabled = false; - foreach ($problemRules as $problemRule) { - if ($problemRule->isDisabled()) { - $foundDisabled = true; - break; - } - } - - if ($foundDisabled && $rule->isEnabled()) { - $rule->disable(); - } elseif (!$foundDisabled && $rule->isDisabled()) { - $rule->enable(); - } - } - } - private function runSat(): void { $this->propagateIndex = 0; diff --git a/app/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php index a6648bcdf..6de51ee58 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/ArchiveDownloader.php @@ -216,6 +216,7 @@ protected function getInstallOperationAppendix(PackageInterface $package, string * * @param string $file Extracted file * @param string $path Directory + * @phpstan-return PromiseInterface * * @throws \UnexpectedValueException If can not extract downloaded file to path */ diff --git a/app/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php b/app/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php index 7f7ad2c3a..e4adfdf37 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/DownloadManager.php @@ -174,6 +174,7 @@ public function getDownloaderType(DownloaderInterface $downloader): string * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates + * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException @@ -241,6 +242,7 @@ public function download(PackageInterface $package, string $targetDir, ?PackageI * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates + * @phpstan-return PromiseInterface */ public function prepare(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null): PromiseInterface { @@ -258,6 +260,7 @@ public function prepare(string $type, PackageInterface $package, string $targetD * * @param PackageInterface $package package instance * @param string $targetDir target dir + * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if package have no urls to download from * @throws \RuntimeException @@ -279,6 +282,7 @@ public function install(PackageInterface $package, string $targetDir): PromiseIn * @param PackageInterface $initial initial package version * @param PackageInterface $target target package version * @param string $targetDir target dir + * @phpstan-return PromiseInterface * * @throws \InvalidArgumentException if initial package is not installed */ @@ -328,6 +332,7 @@ public function update(PackageInterface $initial, PackageInterface $target, stri * * @param PackageInterface $package package instance * @param string $targetDir target dir + * @phpstan-return PromiseInterface */ public function remove(PackageInterface $package, string $targetDir): PromiseInterface { @@ -347,6 +352,7 @@ public function remove(PackageInterface $package, string $targetDir): PromiseInt * @param PackageInterface $package package instance * @param string $targetDir target dir * @param PackageInterface|null $prevPackage previous package instance in case of updates + * @phpstan-return PromiseInterface */ public function cleanup(string $type, PackageInterface $package, string $targetDir, ?PackageInterface $prevPackage = null): PromiseInterface { diff --git a/app/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php b/app/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php index 8e135d725..8cb86cdbb 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/DownloaderInterface.php @@ -34,6 +34,7 @@ public function getInstallationSource(): string; * This should do any network-related tasks to prepare for an upcoming install/update * * @param string $path download path + * @phpstan-return PromiseInterface */ public function download(PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; @@ -49,6 +50,7 @@ public function download(PackageInterface $package, string $path, ?PackageInterf * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update + * @phpstan-return PromiseInterface */ public function prepare(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; @@ -57,6 +59,7 @@ public function prepare(string $type, PackageInterface $package, string $path, ? * * @param PackageInterface $package package instance * @param string $path download path + * @phpstan-return PromiseInterface */ public function install(PackageInterface $package, string $path): PromiseInterface; @@ -66,6 +69,7 @@ public function install(PackageInterface $package, string $path): PromiseInterfa * @param PackageInterface $initial initial package * @param PackageInterface $target updated package * @param string $path download path + * @phpstan-return PromiseInterface */ public function update(PackageInterface $initial, PackageInterface $target, string $path): PromiseInterface; @@ -74,6 +78,7 @@ public function update(PackageInterface $initial, PackageInterface $target, stri * * @param PackageInterface $package package instance * @param string $path download path + * @phpstan-return PromiseInterface */ public function remove(PackageInterface $package, string $path): PromiseInterface; @@ -88,6 +93,7 @@ public function remove(PackageInterface $package, string $path): PromiseInterfac * @param PackageInterface $package package instance * @param string $path download path * @param PackageInterface $prevPackage previous package instance in case of an update + * @phpstan-return PromiseInterface */ public function cleanup(string $type, PackageInterface $package, string $path, ?PackageInterface $prevPackage = null): PromiseInterface; } diff --git a/app/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php index 300a7e604..0c989a82d 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/FileDownloader.php @@ -353,7 +353,7 @@ public function install(PackageInterface $package, string $path, bool $output = $this->filesystem->emptyDirectory($path); $this->filesystem->ensureDirectoryExists($path); - $this->filesystem->rename($this->getFileName($package, $path), $path . '/' . pathinfo(parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), PATHINFO_BASENAME)); + $this->filesystem->rename($this->getFileName($package, $path), $path . '/' . $this->getDistPath($package, PATHINFO_BASENAME)); if ($package->getBinaries()) { // Single files can not have a mode set like files in archives @@ -368,6 +368,11 @@ public function install(PackageInterface $package, string $path, bool $output = return \React\Promise\resolve(null); } + protected function getDistPath(PackageInterface $package, int $component): string + { + return pathinfo((string) parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), $component); + } + protected function clearLastCacheWrite(PackageInterface $package): void { if ($this->cache && isset($this->lastCacheWrites[$package->getName()])) { @@ -431,7 +436,12 @@ public function remove(PackageInterface $package, string $path, bool $output = t */ protected function getFileName(PackageInterface $package, string $path): string { - return rtrim($this->config->get('vendor-dir').'/composer/tmp-'.md5($package.spl_object_hash($package)).'.'.pathinfo(parse_url(strtr((string) $package->getDistUrl(), '\\', '/'), PHP_URL_PATH), PATHINFO_EXTENSION), '.'); + $extension = $this->getDistPath($package, PATHINFO_EXTENSION); + if ($extension === '') { + $extension = $package->getDistType(); + } + + return rtrim($this->config->get('vendor-dir') . '/composer/tmp-' . md5($package . spl_object_hash($package)) . '.' . $extension, '.'); } /** diff --git a/app/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php index 05901a9b2..0840219d0 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/GitDownloader.php @@ -536,6 +536,7 @@ protected function getCommitLogs(string $fromReference, string $toReference, str } /** + * @phpstan-return PromiseInterface * @throws \RuntimeException */ protected function discardChanges(string $path): PromiseInterface @@ -551,6 +552,7 @@ protected function discardChanges(string $path): PromiseInterface } /** + * @phpstan-return PromiseInterface * @throws \RuntimeException */ protected function stashChanges(string $path): PromiseInterface diff --git a/app/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php index daa93dfe9..be180d63d 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/SvnDownloader.php @@ -230,6 +230,9 @@ protected function getCommitLogs(string $fromReference, string $toReference, str return "Could not retrieve changes between $fromReference and $toReference due to missing revision information"; } + /** + * @phpstan-return PromiseInterface + */ protected function discardChanges(string $path): PromiseInterface { if (0 !== $this->process->execute('svn revert -R .', $output, $path)) { diff --git a/app/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php index 15f3aeccd..a1c5979d5 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/VcsDownloader.php @@ -259,6 +259,7 @@ public function getVcsReference(PackageInterface $package, string $path): ?strin * if false (remove) the changes should be assumed to be lost if the operation is not aborted * * @throws \RuntimeException in case the operation must be aborted + * @phpstan-return PromiseInterface */ protected function cleanChanges(PackageInterface $package, string $path, bool $update): PromiseInterface { @@ -286,6 +287,7 @@ protected function reapplyChanges(string $path): void * @param string $path download path * @param string $url package url * @param PackageInterface|null $prevPackage previous package (in case of an update) + * @phpstan-return PromiseInterface */ abstract protected function doDownload(PackageInterface $package, string $path, string $url, ?PackageInterface $prevPackage = null): PromiseInterface; @@ -295,6 +297,7 @@ abstract protected function doDownload(PackageInterface $package, string $path, * @param PackageInterface $package package instance * @param string $path download path * @param string $url package url + * @phpstan-return PromiseInterface */ abstract protected function doInstall(PackageInterface $package, string $path, string $url): PromiseInterface; @@ -305,6 +308,7 @@ abstract protected function doInstall(PackageInterface $package, string $path, s * @param PackageInterface $target updated package * @param string $path download path * @param string $url package url + * @phpstan-return PromiseInterface */ abstract protected function doUpdate(PackageInterface $initial, PackageInterface $target, string $path, string $url): PromiseInterface; diff --git a/app/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php b/app/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php index 851e70de1..9d0f35353 100644 --- a/app/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Downloader/ZipDownloader.php @@ -105,6 +105,7 @@ public function download(PackageInterface $package, string $path, ?PackageInterf * * @param string $file File to extract * @param string $path Path where to extract file + * @phpstan-return PromiseInterface */ private function extractWithSystemUnzip(PackageInterface $package, string $file, string $path): PromiseInterface { @@ -194,6 +195,7 @@ private function extractWithSystemUnzip(PackageInterface $package, string $file, * * @param string $file File to extract * @param string $path Path where to extract file + * @phpstan-return PromiseInterface */ private function extractWithZipArchive(PackageInterface $package, string $file, string $path): PromiseInterface { diff --git a/app/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php b/app/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php index 95ca80d20..3326b8e31 100644 --- a/app/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php +++ b/app/vendor/composer/composer/src/Composer/EventDispatcher/EventDispatcher.php @@ -277,6 +277,9 @@ protected function doDispatch(Event $event) $app = new Application(); $app->setCatchExceptions(false); + if (method_exists($app, 'setCatchErrors')) { + $app->setCatchErrors(false); + } $app->setAutoExit(false); $cmd = new $className($event->getName()); $app->add($cmd); @@ -351,6 +354,14 @@ protected function doDispatch(Event $event) if ($matched && !file_exists($match[0])) { $finder = new ExecutableFinder; if ($pathToExec = $finder->find($match[0])) { + if (Platform::isWindows()) { + $execWithoutExt = Preg::replace('{\.(exe|bat|cmd|com)$}i', '', $pathToExec); + // prefer non-extension file if it exists when executing with PHP + if (file_exists($execWithoutExt)) { + $pathToExec = $execWithoutExt; + } + unset($execWithoutExt); + } $pathAndArgs = $pathToExec . substr($pathAndArgs, strlen($match[0])); } } diff --git a/app/vendor/composer/composer/src/Composer/Installer.php b/app/vendor/composer/composer/src/Composer/Installer.php index 57890e3cd..ebf8c76bf 100644 --- a/app/vendor/composer/composer/src/Composer/Installer.php +++ b/app/vendor/composer/composer/src/Composer/Installer.php @@ -79,6 +79,7 @@ class Installer public const ERROR_LOCK_FILE_INVALID = 4; // used/declared in SolverProblemsException, carried over here for completeness public const ERROR_DEPENDENCY_RESOLUTION_FAILED = 2; + public const ERROR_AUDIT_FAILED = 5; /** * @var IOInterface @@ -169,6 +170,8 @@ class Installer protected $executeOperations = true; /** @var bool */ protected $audit = true; + /** @var bool */ + protected $errorOnAudit = false; /** @var Auditor::FORMAT_* */ protected $auditFormat = Auditor::FORMAT_SUMMARY; @@ -400,7 +403,10 @@ public function run(): int foreach ($this->repositoryManager->getRepositories() as $repo) { $repoSet->addRepository($repo); } - $auditor->audit($this->io, $repoSet, $packages, $this->auditFormat); + + $auditConfig = $this->config->get('audit'); + + return $auditor->audit($this->io, $repoSet, $packages, $this->auditFormat, true, $auditConfig['ignore'] ?? [], $auditConfig['abandoned'] ?? Auditor::ABANDONED_REPORT) > 0 && $this->errorOnAudit ? self::ERROR_AUDIT_FAILED : 0; } catch (TransportException $e) { $this->io->error('Failed to audit '.$target.' packages.'); if ($this->io->isVerbose()) { @@ -607,16 +613,6 @@ protected function doUpdate(InstalledRepositoryInterface $localRepo, bool $doIns $this->io->writeError('Writing lock file'); } - // see https://github.com/composer/composer/issues/2764 - if ($this->executeOperations && count($lockTransaction->getOperations()) > 0) { - $vendorDir = $this->config->get('vendor-dir'); - if (is_dir($vendorDir)) { - // suppress errors as this fails sometimes on OSX for no apparent reason - // see https://github.com/composer/composer/issues/4070#issuecomment-129792748 - @touch($vendorDir); - } - } - if ($doInstall) { // TODO ensure lock is used from locker as-is, since it may not have been written to disk in case of executeOperations == false return $this->doInstall($localRepo, true); @@ -795,6 +791,16 @@ protected function doInstall(InstalledRepositoryInterface $localRepo, bool $alre if ($this->executeOperations) { $localRepo->setDevPackageNames($this->locker->getDevPackageNames()); $this->installationManager->execute($localRepo, $localRepoTransaction->getOperations(), $this->devMode, $this->runScripts, $this->downloadOnly); + + // see https://github.com/composer/composer/issues/2764 + if (count($localRepoTransaction->getOperations()) > 0) { + $vendorDir = $this->config->get('vendor-dir'); + if (is_dir($vendorDir)) { + // suppress errors as this fails sometimes on OSX for no apparent reason + // see https://github.com/composer/composer/issues/4070#issuecomment-129792748 + @touch($vendorDir); + } + } } else { foreach ($localRepoTransaction->getOperations() as $operation) { // output op, but alias op only in debug verbosity @@ -1420,6 +1426,19 @@ public function setAudit(bool $audit): self return $this; } + /** + * Should exit with status code 5 on audit error + * + * @param bool $errorOnAudit + * @return Installer + */ + public function setErrorOnAudit(bool $errorOnAudit): self + { + $this->errorOnAudit = $errorOnAudit; + + return $this; + } + /** * What format should be used for audit output? * diff --git a/app/vendor/composer/composer/src/Composer/Installer/BinaryInstaller.php b/app/vendor/composer/composer/src/Composer/Installer/BinaryInstaller.php index 827c8178c..ba50fe17f 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/BinaryInstaller.php +++ b/app/vendor/composer/composer/src/Composer/Installer/BinaryInstaller.php @@ -337,8 +337,7 @@ public function url_stat(\$path, \$flags) (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://" . $binPathExported); - exit(0); + return include("phpvfscomposer://" . $binPathExported); } } @@ -360,7 +359,7 @@ public function url_stat(\$path, \$flags) $globalsCode $streamProxyCode -include $binPathExported; +return include $binPathExported; PROXY; } diff --git a/app/vendor/composer/composer/src/Composer/Installer/InstallationManager.php b/app/vendor/composer/composer/src/Composer/Installer/InstallationManager.php index 0fcd462a1..74f356826 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/InstallationManager.php +++ b/app/vendor/composer/composer/src/Composer/Installer/InstallationManager.php @@ -180,7 +180,7 @@ public function ensureBinariesPresence(PackageInterface $package): void */ public function execute(InstalledRepositoryInterface $repo, array $operations, bool $devMode = true, bool $runScripts = true, bool $downloadOnly = false): void { - /** @var array */ + /** @var array> */ $cleanupPromises = []; $signalHandler = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGTERM, SignalHandler::SIGHUP], function (string $signal, SignalHandler $handler) use (&$cleanupPromises) { @@ -237,8 +237,8 @@ public function execute(InstalledRepositoryInterface $repo, array $operations, b /** * @param OperationInterface[] $operations List of operations to execute in this batch - * @param array $cleanupPromises * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners + * @phpstan-param array> $cleanupPromises */ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, array $operations, array &$cleanupPromises, bool $devMode, bool $runScripts, bool $downloadOnly, array $allOperations): void { @@ -275,7 +275,7 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr if ($opType !== 'uninstall') { $promise = $installer->download($package, $initialPackage); - if ($promise) { + if (null !== $promise) { $promises[] = $promise; } } @@ -322,8 +322,8 @@ private function downloadAndExecuteBatch(InstalledRepositoryInterface $repo, arr /** * @param OperationInterface[] $operations List of operations to execute in this batch - * @param array $cleanupPromises * @param OperationInterface[] $allOperations Complete list of operations to be executed in the install job, used for event listeners + * @phpstan-param array> $cleanupPromises */ private function executeBatch(InstalledRepositoryInterface $repo, array $operations, array $cleanupPromises, bool $devMode, bool $runScripts, array $allOperations): void { @@ -413,7 +413,7 @@ private function executeBatch(InstalledRepositoryInterface $repo, array $operati } /** - * @param PromiseInterface[] $promises + * @param array> $promises */ private function waitOnPromises(array $promises): void { @@ -440,7 +440,7 @@ private function waitOnPromises(array $promises): void /** * Executes download operation. * - * $param PackageInterface $package + * @phpstan-return PromiseInterface|null */ public function download(PackageInterface $package): ?PromiseInterface { @@ -455,6 +455,7 @@ public function download(PackageInterface $package): ?PromiseInterface * * @param InstalledRepositoryInterface $repo repository in which to check * @param InstallOperation $operation operation instance + * @phpstan-return PromiseInterface|null */ public function install(InstalledRepositoryInterface $repo, InstallOperation $operation): ?PromiseInterface { @@ -471,6 +472,7 @@ public function install(InstalledRepositoryInterface $repo, InstallOperation $op * * @param InstalledRepositoryInterface $repo repository in which to check * @param UpdateOperation $operation operation instance + * @phpstan-return PromiseInterface|null */ public function update(InstalledRepositoryInterface $repo, UpdateOperation $operation): ?PromiseInterface { @@ -509,6 +511,7 @@ public function update(InstalledRepositoryInterface $repo, UpdateOperation $oper * * @param InstalledRepositoryInterface $repo repository in which to check * @param UninstallOperation $operation operation instance + * @phpstan-return PromiseInterface|null */ public function uninstall(InstalledRepositoryInterface $repo, UninstallOperation $operation): ?PromiseInterface { @@ -549,9 +552,9 @@ public function markAliasUninstalled(InstalledRepositoryInterface $repo, MarkAli /** * Returns the installation path of a package * - * @return string path + * @return string|null absolute path to install to, which does not end with a slash, or null if the package does not have anything installed on disk */ - public function getInstallPath(PackageInterface $package): string + public function getInstallPath(PackageInterface $package): ?string { $installer = $this->getInstaller($package->getType()); @@ -638,8 +641,8 @@ private function markForNotification(PackageInterface $package): void } /** - * @param array $cleanupPromises * @return void + * @phpstan-param array> $cleanupPromises */ private function runCleanup(array $cleanupPromises): void { @@ -648,13 +651,13 @@ private function runCleanup(array $cleanupPromises): void $this->loop->abortJobs(); foreach ($cleanupPromises as $cleanup) { - $promises[] = new \React\Promise\Promise(static function ($resolve, $reject) use ($cleanup): void { + $promises[] = new \React\Promise\Promise(static function ($resolve) use ($cleanup): void { $promise = $cleanup(); if (!$promise instanceof PromiseInterface) { - $resolve(); + $resolve(null); } else { $promise->then(static function () use ($resolve): void { - $resolve(); + $resolve(null); }); } }); diff --git a/app/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php b/app/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php index bfa73e18d..7c92e91d4 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php +++ b/app/vendor/composer/composer/src/Composer/Installer/InstallerInterface.php @@ -48,6 +48,7 @@ public function isInstalled(InstalledRepositoryInterface $repo, PackageInterface * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function download(PackageInterface $package, ?PackageInterface $prevPackage = null); @@ -63,6 +64,7 @@ public function download(PackageInterface $package, ?PackageInterface $prevPacka * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function prepare(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); @@ -72,6 +74,7 @@ public function prepare(string $type, PackageInterface $package, ?PackageInterfa * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function install(InstalledRepositoryInterface $repo, PackageInterface $package); @@ -83,6 +86,7 @@ public function install(InstalledRepositoryInterface $repo, PackageInterface $pa * @param PackageInterface $target updated version * @throws InvalidArgumentException if $initial package is not installed * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function update(InstalledRepositoryInterface $repo, PackageInterface $initial, PackageInterface $target); @@ -92,6 +96,7 @@ public function update(InstalledRepositoryInterface $repo, PackageInterface $ini * @param InstalledRepositoryInterface $repo repository in which to check * @param PackageInterface $package package instance * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package); @@ -106,13 +111,14 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ * @param PackageInterface $package package instance * @param PackageInterface $prevPackage previous package instance in case of an update * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ public function cleanup(string $type, PackageInterface $package, ?PackageInterface $prevPackage = null); /** * Returns the absolute installation path of a package. * - * @return string absolute path to install to, which MUST not end with a slash + * @return string|null absolute path to install to, which MUST not end with a slash, or null if the package does not have anything installed on disk */ public function getInstallPath(PackageInterface $package); } diff --git a/app/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php b/app/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php index 8fa39bf1e..0626fb189 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php +++ b/app/vendor/composer/composer/src/Composer/Installer/LibraryInstaller.php @@ -227,6 +227,8 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ /** * @inheritDoc + * + * @return string */ public function getInstallPath(PackageInterface $package) { @@ -270,6 +272,7 @@ protected function getPackageBasePath(PackageInterface $package) /** * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ protected function installCode(PackageInterface $package) { @@ -280,6 +283,7 @@ protected function installCode(PackageInterface $package) /** * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ protected function updateCode(PackageInterface $initial, PackageInterface $target) { @@ -314,6 +318,7 @@ protected function updateCode(PackageInterface $initial, PackageInterface $targe /** * @return PromiseInterface|null + * @phpstan-return PromiseInterface|null */ protected function removeCode(PackageInterface $package) { diff --git a/app/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php b/app/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php index 952993e58..f61a537fb 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php +++ b/app/vendor/composer/composer/src/Composer/Installer/MetapackageInstaller.php @@ -124,9 +124,11 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ /** * @inheritDoc + * + * @return null */ public function getInstallPath(PackageInterface $package) { - return ''; + return null; } } diff --git a/app/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php b/app/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php index 3ee3aceaf..ccf439bfa 100644 --- a/app/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php +++ b/app/vendor/composer/composer/src/Composer/Installer/ProjectInstaller.php @@ -115,7 +115,7 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ /** * Returns the installation path of a package * - * @return string path + * @return string configured install path */ public function getInstallPath(PackageInterface $package): string { diff --git a/app/vendor/composer/composer/src/Composer/Json/JsonFile.php b/app/vendor/composer/composer/src/Composer/Json/JsonFile.php index d4f851f8a..7f9814d61 100644 --- a/app/vendor/composer/composer/src/Composer/Json/JsonFile.php +++ b/app/vendor/composer/composer/src/Composer/Json/JsonFile.php @@ -42,12 +42,16 @@ class JsonFile public const COMPOSER_SCHEMA_PATH = __DIR__ . '/../../../res/composer-schema.json'; + public const INDENT_DEFAULT = ' '; + /** @var string */ private $path; /** @var ?HttpDownloader */ private $httpDownloader; /** @var ?IOInterface */ private $io; + /** @var string */ + private $indent = self::INDENT_DEFAULT; /** * Initializes json file reader/parser. @@ -117,6 +121,8 @@ public function read() throw new \RuntimeException('Could not read '.$this->path); } + $this->indent = self::detectIndenting($json); + return static::parseJson($json, $this->path); } @@ -131,7 +137,7 @@ public function read() public function write(array $hash, int $options = JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) { if ($this->path === 'php://memory') { - file_put_contents($this->path, static::encode($hash, $options)); + file_put_contents($this->path, static::encode($hash, $options, $this->indent)); return; } @@ -153,7 +159,7 @@ public function write(array $hash, int $options = JSON_UNESCAPED_SLASHES | JSON_ $retries = 3; while ($retries--) { try { - $this->filePutContentsIfModified($this->path, static::encode($hash, $options). ($options & JSON_PRETTY_PRINT ? "\n" : '')); + $this->filePutContentsIfModified($this->path, static::encode($hash, $options, $this->indent). ($options & JSON_PRETTY_PRINT ? "\n" : '')); break; } catch (\Exception $e) { if ($retries > 0) { @@ -262,15 +268,28 @@ public static function validateJsonSchema(string $source, $data, int $schema, ?s * * @param mixed $data Data to encode into a formatted JSON string * @param int $options json_encode options (defaults to JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) + * @param string $indent Indentation string * @return string Encoded json */ - public static function encode($data, int $options = 448) + public static function encode($data, int $options = 448, string $indent = self::INDENT_DEFAULT): string { $json = json_encode($data, $options); + if (false === $json) { self::throwEncodeError(json_last_error()); } + if (($options & JSON_PRETTY_PRINT) > 0 && $indent !== self::INDENT_DEFAULT ) { + // Pretty printing and not using default indentation + return Preg::replaceCallback( + '#^ {4,}#m', + static function ($match) use ($indent): string { + return str_repeat($indent, (int)(strlen($match[0] ?? '') / 4)); + }, + $json + ); + } + return $json; } @@ -279,6 +298,7 @@ public static function encode($data, int $options = 448) * * @param int $code return code of json_last_error function * @throws \RuntimeException + * @return never */ private static function throwEncodeError(int $code): void { @@ -338,12 +358,30 @@ protected static function validateSyntax(string $json, ?string $file = null): bo $result = $parser->lint($json); if (null === $result) { if (defined('JSON_ERROR_UTF8') && JSON_ERROR_UTF8 === json_last_error()) { - throw new \UnexpectedValueException('"'.$file.'" is not UTF-8, could not parse as JSON'); + if ($file === null) { + throw new \UnexpectedValueException('The input is not UTF-8, could not parse as JSON'); + } else { + throw new \UnexpectedValueException('"' . $file . '" is not UTF-8, could not parse as JSON'); + } } return true; } - throw new ParsingException('"'.$file.'" does not contain valid JSON'."\n".$result->getMessage(), $result->getDetails()); + if ($file === null) { + throw new ParsingException('The input does not contain valid JSON' . "\n" . $result->getMessage(), + $result->getDetails()); + } else { + throw new ParsingException('"' . $file . '" does not contain valid JSON' . "\n" . $result->getMessage(), + $result->getDetails()); + } + } + + public static function detectIndenting(?string $json): string + { + if (Preg::isMatchStrictGroups('#^([ \t]+)"#m', $json ?? '', $match)) { + return $match[1]; + } + return self::INDENT_DEFAULT; } } diff --git a/app/vendor/composer/composer/src/Composer/Json/JsonManipulator.php b/app/vendor/composer/composer/src/Composer/Json/JsonManipulator.php index d6caffeba..8d6759671 100644 --- a/app/vendor/composer/composer/src/Composer/Json/JsonManipulator.php +++ b/app/vendor/composer/composer/src/Composer/Json/JsonManipulator.php @@ -561,10 +561,6 @@ public function format($data, int $depth = 0): string protected function detectIndenting(): void { - if (Preg::isMatchStrictGroups('{^([ \t]+)"}m', $this->contents, $match)) { - $this->indent = $match[1]; - } else { - $this->indent = ' '; - } + $this->indent = JsonFile::detectIndenting($this->contents); } } diff --git a/app/vendor/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php b/app/vendor/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php index 46d373509..e7ff6e52e 100644 --- a/app/vendor/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php +++ b/app/vendor/composer/composer/src/Composer/PHPStan/ConfigReturnTypeExtension.php @@ -30,6 +30,7 @@ use PHPStan\Type\StringType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; +use PHPStan\Type\TypeUtils; use PHPStan\Type\UnionType; final class ConfigReturnTypeExtension implements DynamicMethodReturnTypeExtension @@ -64,20 +65,32 @@ public function getTypeFromMethodCall(MethodReflection $methodReflection, Method { $args = $methodCall->getArgs(); + $defaultReturn = ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + if (count($args) < 1) { - return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + return $defaultReturn; } $keyType = $scope->getType($args[0]->value); - if (count($keyType->getConstantStrings()) > 0) { - foreach ($keyType->getConstantStrings() as $constantString) { - if (isset($this->properties[$constantString->getValue()])) { - return $this->properties[$constantString->getValue()]; + if (method_exists($keyType, 'getConstantStrings')) { // @phpstan-ignore-line - depending on PHPStan version, this method will always exist, or not. + $strings = $keyType->getConstantStrings(); + } else { + // for compat with old phpstan versions, we use a deprecated phpstan method. + $strings = TypeUtils::getConstantStrings($keyType); // @phpstan-ignore-line ignore deprecation + } + if ($strings !== []) { + $types = []; + foreach($strings as $string) { + if (!isset($this->properties[$string->getValue()])) { + return $defaultReturn; } + $types[] = $this->properties[$string->getValue()]; } + + return TypeCombinator::union(...$types); } - return ParametersAcceptorSelector::selectSingle($methodReflection->getVariants())->getReturnType(); + return $defaultReturn; } /** diff --git a/app/vendor/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php b/app/vendor/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php index f8495e26b..5ab5bd55b 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php +++ b/app/vendor/composer/composer/src/Composer/Package/Archiver/ZipArchiver.php @@ -31,6 +31,11 @@ class ZipArchiver implements ArchiverInterface public function archive(string $sources, string $target, string $format, array $excludes = [], bool $ignoreFilters = false): string { $fs = new Filesystem(); + $sourcesRealpath = realpath($sources); + if (false !== $sourcesRealpath) { + $sources = $sourcesRealpath; + } + unset($sourcesRealpath); $sources = $fs->normalizePath($sources); $zip = new ZipArchive(); diff --git a/app/vendor/composer/composer/src/Composer/Package/CompletePackage.php b/app/vendor/composer/composer/src/Composer/Package/CompletePackage.php index 66a5a127c..0d87082d7 100644 --- a/app/vendor/composer/composer/src/Composer/Package/CompletePackage.php +++ b/app/vendor/composer/composer/src/Composer/Package/CompletePackage.php @@ -33,7 +33,7 @@ class CompletePackage extends Package implements CompletePackageInterface protected $homepage = null; /** @var array Map of script name to array of handlers */ protected $scripts = []; - /** @var array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string} */ + /** @var array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} */ protected $support = []; /** @var array */ protected $funding = []; diff --git a/app/vendor/composer/composer/src/Composer/Package/CompletePackageInterface.php b/app/vendor/composer/composer/src/Composer/Package/CompletePackageInterface.php index b24a0f9fc..e4db57d42 100644 --- a/app/vendor/composer/composer/src/Composer/Package/CompletePackageInterface.php +++ b/app/vendor/composer/composer/src/Composer/Package/CompletePackageInterface.php @@ -118,14 +118,14 @@ public function setAuthors(array $authors): void; /** * Returns the support information * - * @return array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string} + * @return array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} */ public function getSupport(): array; /** * Set the support information * - * @param array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string} $support + * @param array{issues?: string, forum?: string, wiki?: string, source?: string, email?: string, irc?: string, docs?: string, rss?: string, chat?: string, security?: string} $support */ public function setSupport(array $support): void; diff --git a/app/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php b/app/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php index d33f1bc3f..44b778f29 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php +++ b/app/vendor/composer/composer/src/Composer/Package/Loader/ArrayLoader.php @@ -282,7 +282,7 @@ private function configureObject(PackageInterface $package, array $config): Base $package->setAuthors($config['authors']); } - if (isset($config['support'])) { + if (isset($config['support']) && \is_array($config['support'])) { $package->setSupport($config['support']); } @@ -455,7 +455,7 @@ public function getBranchAlias(array $config): ?string if ( isset($config['default-branch']) && $config['default-branch'] === true - && false === $this->versionParser->parseNumericAliasPrefix($config['version']) + && false === $this->versionParser->parseNumericAliasPrefix(Preg::replace('{^v}', '', $config['version'])) ) { return VersionParser::DEFAULT_BRANCH_ALIAS; } diff --git a/app/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php b/app/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php index 396ab23ae..dc50a84d0 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php +++ b/app/vendor/composer/composer/src/Composer/Package/Loader/ValidatingArrayLoader.php @@ -191,7 +191,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa } if ($this->validateArray('support') && !empty($this->config['support'])) { - foreach (['issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat'] as $key) { + foreach (['issues', 'forum', 'wiki', 'source', 'email', 'irc', 'docs', 'rss', 'chat', 'security'] as $key) { if (isset($this->config['support'][$key]) && !is_string($this->config['support'][$key])) { $this->errors[] = 'support.'.$key.' : invalid value, must be a string'; unset($this->config['support'][$key]); @@ -208,7 +208,7 @@ public function load(array $config, string $class = 'Composer\Package\CompletePa unset($this->config['support']['irc']); } - foreach (['issues', 'forum', 'wiki', 'source', 'docs', 'chat'] as $key) { + foreach (['issues', 'forum', 'wiki', 'source', 'docs', 'chat', 'security'] as $key) { if (isset($this->config['support'][$key]) && !$this->filterUrl($this->config['support'][$key])) { $this->warnings[] = 'support.'.$key.' : invalid value ('.$this->config['support'][$key].'), must be an http/https URL'; unset($this->config['support'][$key]); diff --git a/app/vendor/composer/composer/src/Composer/Package/Locker.php b/app/vendor/composer/composer/src/Composer/Package/Locker.php index c58947014..f832e797c 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Locker.php +++ b/app/vendor/composer/composer/src/Composer/Package/Locker.php @@ -18,6 +18,7 @@ use Composer\Repository\InstalledRepository; use Composer\Repository\LockArrayRepository; use Composer\Repository\PlatformRepository; +use Composer\Repository\RootPackageRepository; use Composer\Util\ProcessExecutor; use Composer\Package\Dumper\ArrayDumper; use Composer\Package\Loader\ArrayLoader; @@ -473,7 +474,11 @@ private function getPackageTime(PackageInterface $package): ?string return null; } - $path = realpath($this->installationManager->getInstallPath($package)); + $path = $this->installationManager->getInstallPath($package); + if ($path === null) { + return null; + } + $path = realpath($path); $sourceType = $package->getSourceType(); $datetime = null; @@ -510,9 +515,10 @@ public function getMissingRequirementInfo(RootPackageInterface $package, bool $i if ($includeDev === true) { $sets[] = ['repo' => $this->getLockedRepository(true), 'method' => 'getDevRequires', 'description' => 'Required (in require-dev)']; } + $rootRepo = new RootPackageRepository(clone $package); foreach ($sets as $set) { - $installedRepo = new InstalledRepository([$set['repo']]); + $installedRepo = new InstalledRepository([$set['repo'], $rootRepo]); foreach (call_user_func([$package, $set['method']]) as $link) { if (PlatformRepository::isPlatformPackage($link->getTarget())) { @@ -523,9 +529,21 @@ public function getMissingRequirementInfo(RootPackageInterface $package, bool $i } if ($installedRepo->findPackagesWithReplacersAndProviders($link->getTarget(), $link->getConstraint()) === []) { $results = $installedRepo->findPackagesWithReplacersAndProviders($link->getTarget()); + if ($results !== []) { $provider = reset($results); - $missingRequirementInfo[] = '- ' . $set['description'].' package "' . $link->getTarget() . '" is in the lock file as "'.$provider->getPrettyVersion().'" but that does not satisfy your constraint "'.$link->getPrettyConstraint().'".'; + $description = $provider->getPrettyVersion(); + if ($provider->getName() !== $link->getTarget()) { + foreach (['getReplaces' => 'replaced as %s by %s', 'getProvides' => 'provided as %s by %s'] as $method => $text) { + foreach (call_user_func([$provider, $method]) as $providerLink) { + if ($providerLink->getTarget() === $link->getTarget()) { + $description = sprintf($text, $providerLink->getPrettyConstraint(), $provider->getPrettyName().' '.$provider->getPrettyVersion()); + break 2; + } + } + } + } + $missingRequirementInfo[] = '- ' . $set['description'].' package "' . $link->getTarget() . '" is in the lock file as "'.$description.'" but that does not satisfy your constraint "'.$link->getPrettyConstraint().'".'; } else { $missingRequirementInfo[] = '- ' . $set['description'].' package "' . $link->getTarget() . '" is not present in the lock file.'; } diff --git a/app/vendor/composer/composer/src/Composer/Package/Version/VersionBumper.php b/app/vendor/composer/composer/src/Composer/Package/Version/VersionBumper.php index 1129efaa0..690dfbeed 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Version/VersionBumper.php +++ b/app/vendor/composer/composer/src/Composer/Package/Version/VersionBumper.php @@ -83,7 +83,7 @@ public function bumpRequirement(ConstraintInterface $constraint, PackageInterfac (?<=,|\ |\||^) # leading separator (?P \^'.$major.'(?:\.\d+)* # e.g. ^2.anything - | ~'.$major.'(?:\.\d+)? # e.g. ~2 or ~2.2 but no more + | ~'.$major.'(?:\.\d+){0,2} # e.g. ~2 or ~2.2 or ~2.2.2 but no more | '.$major.'(?:\.[*x])+ # e.g. 2.* or 2.*.* or 2.x.x.x etc | >=\d(?:\.\d+)* # e.g. >=2 or >=1.2 etc ) @@ -97,7 +97,9 @@ public function bumpRequirement(ConstraintInterface $constraint, PackageInterfac if (substr_count($match[0], '.') === 2 && substr_count($versionWithoutSuffix, '.') === 1) { $suffix = '.0'; } - if (str_starts_with($match[0], '>=')) { + if (str_starts_with($match[0], '~') && substr_count($match[0], '.') === 2) { + $replacement = '~'.$versionWithoutSuffix.$suffix; + } elseif (str_starts_with($match[0], '>=')) { $replacement = '>='.$versionWithoutSuffix.$suffix; } else { $replacement = $newPrettyConstraint.$suffix; diff --git a/app/vendor/composer/composer/src/Composer/Package/Version/VersionGuesser.php b/app/vendor/composer/composer/src/Composer/Package/Version/VersionGuesser.php index 46116f0b7..2b2b19706 100644 --- a/app/vendor/composer/composer/src/Composer/Package/Version/VersionGuesser.php +++ b/app/vendor/composer/composer/src/Composer/Package/Version/VersionGuesser.php @@ -322,9 +322,8 @@ private function guessFeatureVersion(array $packageConfig, ?string $version, arr $prettyVersion = 'dev-' . $candidateVersion; if ($length === 0) { foreach ($promises as $promise) { - if ($promise instanceof CancellablePromiseInterface) { - $promise->cancel(); - } + // to support react/promise 2.x we wrap the promise in a resolve() call for safety + \React\Promise\resolve($promise)->cancel(); } } } diff --git a/app/vendor/composer/composer/src/Composer/Plugin/PluginInterface.php b/app/vendor/composer/composer/src/Composer/Plugin/PluginInterface.php index 8ceb4825d..22cdf7845 100644 --- a/app/vendor/composer/composer/src/Composer/Plugin/PluginInterface.php +++ b/app/vendor/composer/composer/src/Composer/Plugin/PluginInterface.php @@ -32,7 +32,7 @@ interface PluginInterface * * @var string */ - public const PLUGIN_API_VERSION = '2.3.0'; + public const PLUGIN_API_VERSION = '2.6.0'; /** * Apply plugin modifications to Composer diff --git a/app/vendor/composer/composer/src/Composer/Plugin/PluginManager.php b/app/vendor/composer/composer/src/Composer/Plugin/PluginManager.php index 14eb40211..731a5aba0 100644 --- a/app/vendor/composer/composer/src/Composer/Plugin/PluginManager.php +++ b/app/vendor/composer/composer/src/Composer/Plugin/PluginManager.php @@ -236,8 +236,11 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl continue; } - $downloadPath = $this->getInstallPath($autoloadPackage, $globalRepo && $globalRepo->hasPackage($autoloadPackage)); - $autoloads[] = [$autoloadPackage, $downloadPath]; + $installPath = $this->getInstallPath($autoloadPackage, $globalRepo && $globalRepo->hasPackage($autoloadPackage)); + if ($installPath === null) { + continue; + } + $autoloads[] = [$autoloadPackage, $installPath]; } $map = $generator->parseAutoloads($autoloads, $rootPackage); @@ -264,7 +267,7 @@ public function registerPackage(PackageInterface $package, bool $failOnMissingCl if ($separatorPos) { $className = substr($class, $separatorPos + 1); } - $code = Preg::replace('{^((?:final\s+)?(?:\s*))class\s+('.preg_quote($className).')}mi', '$1class $2_composer_tmp'.self::$classCounter, $code, 1); + $code = Preg::replace('{^((?:(?:final|readonly)\s+)*(?:\s*))class\s+('.preg_quote($className).')}mi', '$1class $2_composer_tmp'.self::$classCounter, $code, 1); $code = strtr($code, [ '__FILE__' => var_export($path, true), '__DIR__' => var_export(dirname($path), true), @@ -524,9 +527,9 @@ private function collectDependencies(InstalledRepository $installedRepo, array $ * * @param bool $global Whether this is a global package * - * @return string Install path + * @return string|null Install path */ - private function getInstallPath(PackageInterface $package, bool $global = false): string + private function getInstallPath(PackageInterface $package, bool $global = false): ?string { if (!$global) { return $this->composer->getInstallationManager()->getInstallPath($package); diff --git a/app/vendor/composer/composer/src/Composer/Repository/ArtifactRepository.php b/app/vendor/composer/composer/src/Composer/Repository/ArtifactRepository.php index 0e7c4cecf..f73f4e9e1 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/ArtifactRepository.php +++ b/app/vendor/composer/composer/src/Composer/Repository/ArtifactRepository.php @@ -17,6 +17,7 @@ use Composer\Package\BasePackage; use Composer\Package\Loader\ArrayLoader; use Composer\Package\Loader\LoaderInterface; +use Composer\Util\Platform; use Composer\Util\Tar; use Composer\Util\Zip; @@ -46,7 +47,7 @@ public function __construct(array $repoConfig, IOInterface $io) } $this->loader = new ArrayLoader(); - $this->lookup = $repoConfig['url']; + $this->lookup = Platform::expandPath($repoConfig['url']); $this->io = $io; $this->repoConfig = $repoConfig; } diff --git a/app/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php b/app/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php index ea87e5c4b..1dcf991aa 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php +++ b/app/vendor/composer/composer/src/Composer/Repository/ComposerRepository.php @@ -139,8 +139,13 @@ public function __construct(array $repoConfig, IOInterface $io, Config $config, { parent::__construct(); if (!Preg::isMatch('{^[\w.]+\??://}', $repoConfig['url'])) { - // assume http as the default protocol - $repoConfig['url'] = 'http://'.$repoConfig['url']; + if (($localFilePath = realpath($repoConfig['url'])) !== false) { + // it is a local path, add file scheme + $repoConfig['url'] = 'file://'.$localFilePath; + } else { + // otherwise, assume http as the default protocol + $repoConfig['url'] = 'http://'.$repoConfig['url']; + } } $repoConfig['url'] = rtrim($repoConfig['url'], '/'); if ($repoConfig['url'] === '') { @@ -685,14 +690,15 @@ static function ($data) use ($name, $create) { } if ($apiUrl !== null && count($packageConstraintMap) > 0) { - $options = [ - 'http' => [ - 'method' => 'POST', - 'header' => ['Content-type: application/x-www-form-urlencoded'], - 'timeout' => 10, - 'content' => http_build_query(['packages' => array_keys($packageConstraintMap)]), - ], - ]; + $options = $this->options; + $options['http']['method'] = 'POST'; + if (isset($options['http']['header'])) { + $options['http']['header'] = (array) $options['http']['header']; + } + $options['http']['header'][] = 'Content-type: application/x-www-form-urlencoded'; + $options['http']['timeout'] = 10; + $options['http']['content'] = http_build_query(['packages' => array_keys($packageConstraintMap)]); + $response = $this->httpDownloader->get($apiUrl, $options); /** @var string $name */ foreach ($response->decodeJson()['advisories'] as $name => $list) { @@ -1065,6 +1071,9 @@ private function loadAsyncPackages(array $packageNames, ?array $acceptableStabil return ['namesFound' => $namesFound, 'packages' => $packages]; } + /** + * @phpstan-return PromiseInterface + */ private function startCachedAsyncDownload(string $fileName, ?string $packageName = null): PromiseInterface { if (null === $this->lazyProvidersUrl) { @@ -1593,6 +1602,9 @@ private function fetchFileIfLastModified(string $filename, string $cacheKey, str } } + /** + * @phpstan-return PromiseInterface|true> true if the response was a 304 and the cache is fresh, otherwise it returns the decoded json + */ private function asyncFetchFile(string $filename, string $cacheKey, ?string $lastModifiedTime = null): PromiseInterface { if ('' === $filename) { @@ -1605,7 +1617,10 @@ private function asyncFetchFile(string $filename, string $cacheKey, ?string $las if (isset($this->freshMetadataUrls[$filename]) && $lastModifiedTime) { // make it look like we got a 304 response - return \React\Promise\resolve(true); + /** @var PromiseInterface $promise */ + $promise = \React\Promise\resolve(true); + + return $promise; } $httpDownloader = $this->httpDownloader; diff --git a/app/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php b/app/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php index 116f2b2dc..9ab0f6c6b 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php +++ b/app/vendor/composer/composer/src/Composer/Repository/PlatformRepository.php @@ -238,7 +238,12 @@ protected function initialize(): void $parsedVersion = Version::parseOpenssl($sslMatches['version'], $isFips); $this->addLibrary($name.'-openssl'.($isFips ? '-fips' : ''), $parsedVersion, 'curl OpenSSL version ('.$parsedVersion.')', [], $isFips ? ['curl-openssl'] : []); } else { - $this->addLibrary($name.'-'.$library, $sslMatches['version'], 'curl '.$library.' version ('.$sslMatches['version'].')', ['curl-openssl']); + if ($library === '(securetransport) openssl') { + $shortlib = 'securetransport'; + } else { + $shortlib = $library; + } + $this->addLibrary($name.'-'.$shortlib, $sslMatches['version'], 'curl '.$library.' version ('.$sslMatches['version'].')', ['curl-openssl']); } } @@ -333,8 +338,10 @@ protected function initialize(): void // Add a separate version for the CLDR library version if ($this->runtime->hasClass('ResourceBundle')) { - $cldrVersion = $this->runtime->invoke(['ResourceBundle', 'create'], ['root', 'ICUDATA', false])->get('Version'); - $this->addLibrary('icu-cldr', $cldrVersion, 'ICU CLDR project version'); + $resourceBundle = $this->runtime->invoke(['ResourceBundle', 'create'], ['root', 'ICUDATA', false]); + if ($resourceBundle !== null) { + $this->addLibrary('icu-cldr', $resourceBundle->get('Version'), 'ICU CLDR project version'); + } } if ($this->runtime->hasClass('IntlChar')) { @@ -450,6 +457,32 @@ protected function initialize(): void } break; + case 'pq': + $info = $this->runtime->getExtensionInfo($name); + + // Used Library => Compiled => Linked + // libpq => 14.3 (Ubuntu 14.3-1.pgdg22.04+1) => 15.0.2 + if (Preg::isMatch('/^libpq => (?.+) => (?.+)$/im', $info, $matches)) { + $this->addLibrary($name.'-libpq', $matches['linked'], 'libpq for '.$name); + } + break; + + case 'rdkafka': + if ($this->runtime->hasConstant('RD_KAFKA_VERSION')) { + /** + * Interpreted as hex \c MM.mm.rr.xx: + * - MM = Major + * - mm = minor + * - rr = revision + * - xx = pre-release id (0xff is the final release) + * + * pre-release ID in practice is always 0xff even for RCs etc, so we ignore it + */ + $libRdKafkaVersionInt = $this->runtime->getConstant('RD_KAFKA_VERSION'); + $this->addLibrary($name.'-librdkafka', sprintf('%d.%d.%d', ($libRdKafkaVersionInt & 0xFF000000) >> 24, ($libRdKafkaVersionInt & 0x00FF0000) >> 16, ($libRdKafkaVersionInt & 0x0000FF00) >> 8), 'librdkafka for '.$name); + } + break; + case 'libsodium': case 'sodium': if ($this->runtime->hasConstant('SODIUM_LIBRARY_VERSION')) { diff --git a/app/vendor/composer/composer/src/Composer/Repository/RepositorySet.php b/app/vendor/composer/composer/src/Composer/Repository/RepositorySet.php index 34164e453..81280b204 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/RepositorySet.php +++ b/app/vendor/composer/composer/src/Composer/Repository/RepositorySet.php @@ -257,20 +257,18 @@ public function getMatchingSecurityAdvisories(array $packages, bool $allowPartia */ private function getSecurityAdvisoriesForConstraints(array $packageConstraintMap, bool $allowPartialAdvisories): array { - $advisories = []; + $repoAdvisories = []; foreach ($this->repositories as $repository) { if (!$repository instanceof AdvisoryProviderInterface || !$repository->hasSecurityAdvisories()) { continue; } - $result = $repository->getSecurityAdvisories($packageConstraintMap, $allowPartialAdvisories); - foreach ($result['namesFound'] as $nameFound) { - unset($packageConstraintMap[$nameFound]); - } - - $advisories = array_merge($advisories, $result['advisories']); + $repoAdvisories[] = $repository->getSecurityAdvisories($packageConstraintMap, $allowPartialAdvisories)['advisories']; } + $advisories = array_merge_recursive([], ...$repoAdvisories); + ksort($advisories); + return $advisories; } diff --git a/app/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php b/app/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php index 122b03fa7..44766a185 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php +++ b/app/vendor/composer/composer/src/Composer/Repository/Vcs/GitHubDriver.php @@ -310,7 +310,7 @@ public function getFileContent(string $file, string $identifier): ?string $resource = $this->getContents($resource['git_url'])->decodeJson(); } - if (empty($resource['content']) || $resource['encoding'] !== 'base64' || !($content = base64_decode($resource['content']))) { + if (!isset($resource['content']) || $resource['encoding'] !== 'base64' || false === ($content = base64_decode($resource['content']))) { throw new \RuntimeException('Could not retrieve ' . $file . ' for '.$identifier); } diff --git a/app/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php b/app/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php index f2bfad0f7..ea8158e34 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php +++ b/app/vendor/composer/composer/src/Composer/Repository/Vcs/SvnDriver.php @@ -236,14 +236,19 @@ public function getTags(): array if ($this->tagsPath !== false) { $output = $this->execute('svn ls --verbose', $this->baseUrl . '/' . $this->tagsPath); if ($output) { + $lastRev = 0; foreach ($this->process->splitLines($output) as $line) { $line = trim($line); if ($line && Preg::isMatch('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) { - if (isset($match[1], $match[2]) && $match[2] !== './') { - $tags[rtrim($match[2], '/')] = $this->buildIdentifier( - '/' . $this->tagsPath . '/' . $match[2], - $match[1] - ); + if (isset($match[1], $match[2])) { + if ($match[2] === './') { + $lastRev = (int) $match[1]; + } else { + $tags[rtrim($match[2], '/')] = $this->buildIdentifier( + '/' . $this->tagsPath . '/' . $match[2], + max($lastRev, (int) $match[1]) + ); + } } } } @@ -278,7 +283,7 @@ public function getBranches(): array if (isset($match[1], $match[2]) && $match[2] === './') { $branches['trunk'] = $this->buildIdentifier( '/' . $this->trunkPath, - $match[1] + (int) $match[1] ); $this->rootIdentifier = $branches['trunk']; break; @@ -291,14 +296,19 @@ public function getBranches(): array if ($this->branchesPath !== false) { $output = $this->execute('svn ls --verbose', $this->baseUrl . '/' . $this->branchesPath); if ($output) { + $lastRev = 0; foreach ($this->process->splitLines(trim($output)) as $line) { $line = trim($line); if ($line && Preg::isMatch('{^\s*(\S+).*?(\S+)\s*$}', $line, $match)) { - if (isset($match[1], $match[2]) && $match[2] !== './') { - $branches[rtrim($match[2], '/')] = $this->buildIdentifier( - '/' . $this->branchesPath . '/' . $match[2], - $match[1] - ); + if (isset($match[1], $match[2])) { + if ($match[2] === './') { + $lastRev = (int) $match[1]; + } else { + $branches[rtrim($match[2], '/')] = $this->buildIdentifier( + '/' . $this->branchesPath . '/' . $match[2], + max($lastRev, (int) $match[1]) + ); + } } } } @@ -399,9 +409,9 @@ protected function execute(string $command, string $url): string * Build the identifier respecting "package-path" config option * * @param string $baseDir The path to trunk/branch/tag - * @param string $revision The revision mark to add to identifier + * @param int $revision The revision mark to add to identifier */ - protected function buildIdentifier(string $baseDir, string $revision): string + protected function buildIdentifier(string $baseDir, int $revision): string { return rtrim($baseDir, '/') . $this->packagePath . '/@' . $revision; } diff --git a/app/vendor/composer/composer/src/Composer/Repository/VcsRepository.php b/app/vendor/composer/composer/src/Composer/Repository/VcsRepository.php index d110c38d4..02a5f9627 100644 --- a/app/vendor/composer/composer/src/Composer/Repository/VcsRepository.php +++ b/app/vendor/composer/composer/src/Composer/Repository/VcsRepository.php @@ -21,6 +21,7 @@ use Composer\Package\Loader\InvalidPackageException; use Composer\Package\Loader\LoaderInterface; use Composer\EventDispatcher\EventDispatcher; +use Composer\Util\Platform; use Composer\Util\ProcessExecutor; use Composer\Util\HttpDownloader; use Composer\Util\Url; @@ -90,7 +91,7 @@ public function __construct(array $repoConfig, IOInterface $io, Config $config, 'svn' => 'Composer\Repository\Vcs\SvnDriver', ]; - $this->url = $repoConfig['url']; + $this->url = Platform::expandPath($repoConfig['url']); $this->io = $io; $this->type = $repoConfig['type'] ?? 'vcs'; $this->isVerbose = $io->isVerbose(); diff --git a/app/vendor/composer/composer/src/Composer/Util/AuthHelper.php b/app/vendor/composer/composer/src/Composer/Util/AuthHelper.php index ec3476670..3f0312602 100644 --- a/app/vendor/composer/composer/src/Composer/Util/AuthHelper.php +++ b/app/vendor/composer/composer/src/Composer/Util/AuthHelper.php @@ -28,6 +28,8 @@ class AuthHelper protected $config; /** @var array Map of origins to message displayed */ private $displayedOriginAuthentications = []; + /** @var array Map of URLs and whether they already retried with authentication from Bitbucket */ + private $bitbucketRetry = []; public function __construct(IOInterface $io, Config $config) { @@ -164,6 +166,12 @@ public function promptAuthIfNeeded(string $url, string $origin, int $statusCode, $this->io->setAuthentication($origin, 'x-token-auth', $accessToken); $askForOAuthToken = false; } + } elseif (!isset($this->bitbucketRetry[$url])) { + // when multiple requests fire at the same time, they will all fail and the first one resets the token to be correct above but then the others + // reach the code path and without this fallback they would end up throwing below + // see https://github.com/composer/composer/pull/11464 for more details + $askForOAuthToken = false; + $this->bitbucketRetry[$url] = true; } else { throw new TransportException('Could not authenticate against ' . $origin, 401); } diff --git a/app/vendor/composer/composer/src/Composer/Util/Filesystem.php b/app/vendor/composer/composer/src/Composer/Util/Filesystem.php index e0f008d14..19e0efa8a 100644 --- a/app/vendor/composer/composer/src/Composer/Util/Filesystem.php +++ b/app/vendor/composer/composer/src/Composer/Util/Filesystem.php @@ -133,6 +133,7 @@ public function removeDirectory(string $directory) * * @throws \RuntimeException * @return PromiseInterface + * @phpstan-return PromiseInterface */ public function removeDirectoryAsync(string $directory) { @@ -784,6 +785,12 @@ public function junction(string $target, string $junction) if (!is_dir($target)) { throw new IOException(sprintf('Cannot junction to "%s" as it is not a directory.', $target), 0, null, $target); } + + // Removing any previously junction to ensure clean execution. + if (!is_dir($junction) || $this->isJunction($junction)) { + @rmdir($junction); + } + $cmd = sprintf( 'mklink /J %s %s', ProcessExecutor::escape(str_replace('/', DIRECTORY_SEPARATOR, $junction)), diff --git a/app/vendor/composer/composer/src/Composer/Util/Git.php b/app/vendor/composer/composer/src/Composer/Util/Git.php index c1da74d42..f8e503d82 100644 --- a/app/vendor/composer/composer/src/Composer/Util/Git.php +++ b/app/vendor/composer/composer/src/Composer/Util/Git.php @@ -223,6 +223,7 @@ public function runCommand(callable $commandCallable, string $url, ?string $cwd, } $this->io->writeError(' Authentication required (' . $match[2] . '):'); + $this->io->writeError('' . trim($errorMsg) . '', true, IOInterface::VERBOSE); $auth = [ 'username' => $this->io->ask(' Username: ', $defaultUsername), 'password' => $this->io->askAndHideAnswer(' Password: '), diff --git a/app/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php b/app/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php index edc668a60..967aed2e7 100644 --- a/app/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Util/Http/CurlDownloader.php @@ -349,7 +349,7 @@ public function tick(): void (!isset($job['options']['http']['method']) || $job['options']['http']['method'] === 'GET') && ( in_array($errno, [7 /* CURLE_COULDNT_CONNECT */, 16 /* CURLE_HTTP2 */, 92 /* CURLE_HTTP2_STREAM */, 6 /* CURLE_COULDNT_RESOLVE_HOST */], true) - || ($errno === 35 /* CURLE_SSL_CONNECT_ERROR */ && false !== strpos($error, 'Connection reset by peer')) + || (in_array($errno, [56 /* CURLE_RECV_ERROR */, 35 /* CURLE_SSL_CONNECT_ERROR */], true) && str_contains((string) $error, 'Connection reset by peer')) ) && $job['attributes']['retries'] < $this->maxRetries ) { $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to curl error '. $errno, true, IOInterface::DEBUG); @@ -357,6 +357,13 @@ public function tick(): void continue; } + // TODO: Remove this as soon as https://github.com/curl/curl/issues/10591 is resolved + if ($errno === 55 /* CURLE_SEND_ERROR */) { + $this->io->writeError('Retrying ('.($job['attributes']['retries'] + 1).') ' . Url::sanitize($job['url']) . ' due to curl error '. $errno, true, IOInterface::DEBUG); + $this->restartJobWithDelay($job, $job['url'], ['retries' => $job['attributes']['retries'] + 1]); + continue; + } + if ($errno === 28 /* CURLE_OPERATION_TIMEDOUT */ && PHP_VERSION_ID >= 70300 && $progress['namelookup_time'] === 0.0 && !$timeoutWarning) { $timeoutWarning = true; $this->io->writeError('A connection timeout was encountered. If you intend to run Composer without connecting to the internet, run the command again prefixed with COMPOSER_DISABLE_NETWORK=1 to make Composer run in offline mode.'); diff --git a/app/vendor/composer/composer/src/Composer/Util/HttpDownloader.php b/app/vendor/composer/composer/src/Composer/Util/HttpDownloader.php index 58a64b663..723ff0287 100644 --- a/app/vendor/composer/composer/src/Composer/Util/HttpDownloader.php +++ b/app/vendor/composer/composer/src/Composer/Util/HttpDownloader.php @@ -28,7 +28,7 @@ /** * @author Jordi Boggiano * @phpstan-type Request array{url: non-empty-string, options: mixed[], copyTo: string|null} - * @phpstan-type Job array{id: int, status: int, request: Request, sync: bool, origin: string, resolve?: callable, reject?: callable, curl_id?: int, response?: Response, exception?: TransportException} + * @phpstan-type Job array{id: int, status: int, request: Request, sync: bool, origin: string, resolve?: callable, reject?: callable, curl_id?: int, response?: Response, exception?: \Throwable} */ class HttpDownloader { @@ -107,7 +107,10 @@ public function get(string $url, array $options = []) if ('' === $url) { throw new \InvalidArgumentException('$url must not be an empty string'); } - [$job] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null], true); + [$job, $promise] = $this->addJob(['url' => $url, 'options' => $options, 'copyTo' => null], true); + $promise->then(null, function (\Throwable $e) { + // suppress error as it is rethrown to the caller by getResponse() a few lines below + }); $this->wait($job['id']); $response = $this->getResponse($job['id']); @@ -123,6 +126,7 @@ public function get(string $url, array $options = []) * although not all options are supported when using the default curl downloader * @throws TransportException * @return PromiseInterface + * @phpstan-return PromiseInterface */ public function add(string $url, array $options = []) { @@ -164,6 +168,7 @@ public function copy(string $url, string $to, array $options = []) * although not all options are supported when using the default curl downloader * @throws TransportException * @return PromiseInterface + * @phpstan-return PromiseInterface */ public function addCopy(string $url, string $to, array $options = []) { @@ -199,6 +204,7 @@ public function setOptions(array $options) /** * @phpstan-param Request $request * @return array{Job, PromiseInterface} + * @phpstan-return array{Job, PromiseInterface} */ private function addJob(array $request, bool $sync = false): array { diff --git a/app/vendor/composer/composer/src/Composer/Util/Loop.php b/app/vendor/composer/composer/src/Composer/Util/Loop.php index a1abed9a5..ca24e69b4 100644 --- a/app/vendor/composer/composer/src/Composer/Util/Loop.php +++ b/app/vendor/composer/composer/src/Composer/Util/Loop.php @@ -25,7 +25,7 @@ class Loop private $httpDownloader; /** @var ProcessExecutor|null */ private $processExecutor; - /** @var PromiseInterface[][] */ + /** @var array>> */ private $currentPromises = []; /** @var int */ private $waitIndex = 0; @@ -52,18 +52,17 @@ public function getProcessExecutor(): ?ProcessExecutor } /** - * @param PromiseInterface[] $promises - * @param ?ProgressBar $progress + * @param array> $promises + * @param ProgressBar|null $progress */ public function wait(array $promises, ?ProgressBar $progress = null): void { - /** @var \Exception|null */ $uncaught = null; \React\Promise\all($promises)->then( static function (): void { }, - static function ($e) use (&$uncaught): void { + static function (\Throwable $e) use (&$uncaught): void { $uncaught = $e; } ); @@ -107,7 +106,7 @@ static function ($e) use (&$uncaught): void { } unset($this->currentPromises[$waitIndex]); - if ($uncaught) { + if (null !== $uncaught) { throw $uncaught; } } @@ -116,9 +115,8 @@ public function abortJobs(): void { foreach ($this->currentPromises as $promiseGroup) { foreach ($promiseGroup as $promise) { - if ($promise instanceof CancellablePromiseInterface) { - $promise->cancel(); - } + // to support react/promise 2.x we wrap the promise in a resolve() call for safety + \React\Promise\resolve($promise)->cancel(); } } } diff --git a/app/vendor/composer/composer/src/Composer/Util/PackageInfo.php b/app/vendor/composer/composer/src/Composer/Util/PackageInfo.php index 0b2607ac9..e93c58447 100644 --- a/app/vendor/composer/composer/src/Composer/Util/PackageInfo.php +++ b/app/vendor/composer/composer/src/Composer/Util/PackageInfo.php @@ -19,7 +19,7 @@ class PackageInfo { public static function getViewSourceUrl(PackageInterface $package): ?string { - if ($package instanceof CompletePackageInterface && isset($package->getSupport()['source'])) { + if ($package instanceof CompletePackageInterface && isset($package->getSupport()['source']) && '' !== $package->getSupport()['source']) { return $package->getSupport()['source']; } @@ -28,6 +28,12 @@ public static function getViewSourceUrl(PackageInterface $package): ?string public static function getViewSourceOrHomepageUrl(PackageInterface $package): ?string { - return self::getViewSourceUrl($package) ?? ($package instanceof CompletePackageInterface ? $package->getHomepage() : null); + $url = self::getViewSourceUrl($package) ?? ($package instanceof CompletePackageInterface ? $package->getHomepage() : null); + + if ($url === '') { + return null; + } + + return $url; } } diff --git a/app/vendor/composer/composer/src/Composer/Util/Platform.php b/app/vendor/composer/composer/src/Composer/Util/Platform.php index 2d0c89d88..3c971d105 100644 --- a/app/vendor/composer/composer/src/Composer/Util/Platform.php +++ b/app/vendor/composer/composer/src/Composer/Util/Platform.php @@ -148,7 +148,7 @@ public static function isWindowsSubsystemForLinux(): bool if ( !ini_get('open_basedir') && is_readable('/proc/version') - && false !== stripos(Silencer::call('file_get_contents', '/proc/version'), 'microsoft') + && false !== stripos((string)Silencer::call('file_get_contents', '/proc/version'), 'microsoft') && !file_exists('/.dockerenv') // docker running inside WSL should not be seen as WSL ) { return self::$isWindowsSubsystemForLinux = true; diff --git a/app/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php b/app/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php index a8f69eceb..25e4c903b 100644 --- a/app/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php +++ b/app/vendor/composer/composer/src/Composer/Util/ProcessExecutor.php @@ -155,6 +155,7 @@ private function doExecute($command, ?string $cwd, bool $tty, &$output = null): * * @param string|list $command the command to execute * @param string $cwd the working directory + * @phpstan-return PromiseInterface */ public function executeAsync($command, ?string $cwd = null): PromiseInterface { diff --git a/app/vendor/composer/composer/src/Composer/Util/SyncHelper.php b/app/vendor/composer/composer/src/Composer/Util/SyncHelper.php index 198169212..9a7398cc0 100644 --- a/app/vendor/composer/composer/src/Composer/Util/SyncHelper.php +++ b/app/vendor/composer/composer/src/Composer/Util/SyncHelper.php @@ -13,6 +13,7 @@ namespace Composer\Util; use Composer\Downloader\DownloaderInterface; +use Composer\Downloader\DownloadManager; use Composer\Package\PackageInterface; use React\Promise\PromiseInterface; @@ -23,22 +24,24 @@ class SyncHelper * * This executes all the required steps and waits for promises to complete * - * @param Loop $loop Loop instance which you can get from $composer->getLoop() - * @param DownloaderInterface $downloader Downloader instance you can get from $composer->getDownloadManager()->getDownloader('zip') for example - * @param string $path the installation path for the package - * @param PackageInterface $package the package to install - * @param PackageInterface|null $prevPackage the previous package if this is an update and not an initial installation + * @param Loop $loop Loop instance which you can get from $composer->getLoop() + * @param DownloaderInterface|DownloadManager $downloader DownloadManager instance or Downloader instance you can get from $composer->getDownloadManager()->getDownloader('zip') for example + * @param string $path The installation path for the package + * @param PackageInterface $package The package to install + * @param PackageInterface|null $prevPackage The previous package if this is an update and not an initial installation */ - public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInterface $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null): void + public static function downloadAndInstallPackageSync(Loop $loop, $downloader, string $path, PackageInterface $package, ?PackageInterface $prevPackage = null): void { - $type = $prevPackage ? 'update' : 'install'; + assert($downloader instanceof DownloaderInterface || $downloader instanceof DownloadManager); + + $type = $prevPackage !== null ? 'update' : 'install'; try { self::await($loop, $downloader->download($package, $path, $prevPackage)); self::await($loop, $downloader->prepare($type, $package, $path, $prevPackage)); - if ($type === 'update') { + if ($type === 'update' && $prevPackage !== null) { self::await($loop, $downloader->update($package, $prevPackage, $path)); } else { self::await($loop, $downloader->install($package, $path)); @@ -55,10 +58,11 @@ public static function downloadAndInstallPackageSync(Loop $loop, DownloaderInter * Waits for a promise to resolve * * @param Loop $loop Loop instance which you can get from $composer->getLoop() + * @phpstan-param PromiseInterface|null $promise */ public static function await(Loop $loop, ?PromiseInterface $promise = null): void { - if ($promise) { + if ($promise !== null) { $loop->wait([$promise]); } } diff --git a/app/vendor/composer/installed.json b/app/vendor/composer/installed.json index 790977d2f..3412dc260 100644 --- a/app/vendor/composer/installed.json +++ b/app/vendor/composer/installed.json @@ -114,17 +114,17 @@ }, { "name": "cakephp/cakephp", - "version": "4.4.12", - "version_normalized": "4.4.12.0", + "version": "4.4.17", + "version_normalized": "4.4.17.0", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp.git", - "reference": "ecacba23d96a5e5052716bf19fe8b96c5549acf3" + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp/zipball/ecacba23d96a5e5052716bf19fe8b96c5549acf3", - "reference": "ecacba23d96a5e5052716bf19fe8b96c5549acf3", + "url": "https://api.github.com/repos/cakephp/cakephp/zipball/9ff254d6d60720089dec1e10aa1907e24e39a98e", + "reference": "9ff254d6d60720089dec1e10aa1907e24e39a98e", "shasum": "" }, "require": { @@ -178,10 +178,10 @@ "suggest": { "ext-curl": "To enable more efficient network calls in Http\\Client.", "ext-openssl": "To use Security::encrypt() or have secure CSRF token generation.", - "lib-ICU": "The intl PHP library, to use Text::transliterate() or Text::slug()", + "lib-ICU": "To use locale-aware features in the I18n and Database packages", "paragonie/csp-builder": "CSP builder, to use the CSP Middleware" }, - "time": "2023-03-24T01:27:09+00:00", + "time": "2023-08-20T02:36:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -229,28 +229,28 @@ }, { "name": "cakephp/cakephp-codesniffer", - "version": "4.6.0", - "version_normalized": "4.6.0.0", + "version": "4.7.0", + "version_normalized": "4.7.0.0", "source": { "type": "git", "url": "https://github.com/cakephp/cakephp-codesniffer.git", - "reference": "5a64e6e6434128f6a1549318de86c564737d5cda" + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/5a64e6e6434128f6a1549318de86c564737d5cda", - "reference": "5a64e6e6434128f6a1549318de86c564737d5cda", + "url": "https://api.github.com/repos/cakephp/cakephp-codesniffer/zipball/24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", + "reference": "24fa2321d54e5251ac2f59dd92dd2066f0b0bdae", "shasum": "" }, "require": { "php": ">=7.2.0", - "slevomat/coding-standard": "^6.3.6 || ^7.0 || ^8.0", + "slevomat/coding-standard": "^7.0 || ^8.0", "squizlabs/php_codesniffer": "^3.6" }, "require-dev": { "phpunit/phpunit": "^7.1" }, - "time": "2022-07-04T03:29:58+00:00", + "time": "2023-04-10T06:35:04+00:00", "type": "phpcodesniffer-standard", "installation-source": "dist", "autoload": { @@ -284,17 +284,17 @@ }, { "name": "cakephp/chronos", - "version": "2.3.2", - "version_normalized": "2.3.2.0", + "version": "2.4.1", + "version_normalized": "2.4.1.0", "source": { "type": "git", "url": "https://github.com/cakephp/chronos.git", - "reference": "a21b7b633f483c4cf525d200219d200f551ee38b" + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/a21b7b633f483c4cf525d200219d200f551ee38b", - "reference": "a21b7b633f483c4cf525d200219d200f551ee38b", + "url": "https://api.github.com/repos/cakephp/chronos/zipball/dd583900b26971e84d56c482d6c5fc16961bd103", + "reference": "dd583900b26971e84d56c482d6c5fc16961bd103", "shasum": "" }, "require": { @@ -304,7 +304,7 @@ "cakephp/cakephp-codesniffer": "^4.5", "phpunit/phpunit": "^8.0 || ^9.0" }, - "time": "2022-11-08T02:17:04+00:00", + "time": "2023-09-12T03:12:29+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -345,17 +345,17 @@ }, { "name": "cakephp/debug_kit", - "version": "4.9.3", - "version_normalized": "4.9.3.0", + "version": "4.9.4", + "version_normalized": "4.9.4.0", "source": { "type": "git", "url": "https://github.com/cakephp/debug_kit.git", - "reference": "db848e787bf53483069cba2feb449c2e8523f525" + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/db848e787bf53483069cba2feb449c2e8523f525", - "reference": "db848e787bf53483069cba2feb449c2e8523f525", + "url": "https://api.github.com/repos/cakephp/debug_kit/zipball/663491edec4a6b9111f1cf4733ebd471450df71e", + "reference": "663491edec4a6b9111f1cf4733ebd471450df71e", "shasum": "" }, "require": { @@ -373,7 +373,7 @@ "suggest": { "ext-pdo_sqlite": "DebugKit needs to store panel data in a database. SQLite is simple and easy to use." }, - "time": "2023-01-25T04:49:08+00:00", + "time": "2023-07-05T16:04:04+00:00", "type": "cakephp-plugin", "installation-source": "dist", "autoload": { @@ -405,7 +405,7 @@ "kit" ], "support": { - "forum": "http://stackoverflow.com/tags/cakephp", + "forum": "https://stackoverflow.com/tags/cakephp", "irc": "irc://irc.freenode.org/cakephp", "issues": "https://github.com/cakephp/debug_kit/issues", "source": "https://github.com/cakephp/debug_kit" @@ -414,17 +414,17 @@ }, { "name": "cakephp/migrations", - "version": "3.8.0", - "version_normalized": "3.8.0.0", + "version": "3.9.0", + "version_normalized": "3.9.0.0", "source": { "type": "git", "url": "https://github.com/cakephp/migrations.git", - "reference": "8eaf51d88fc4350a66fd98118828f9a75ff1e0d2" + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/migrations/zipball/8eaf51d88fc4350a66fd98118828f9a75ff1e0d2", - "reference": "8eaf51d88fc4350a66fd98118828f9a75ff1e0d2", + "url": "https://api.github.com/repos/cakephp/migrations/zipball/58446fdd096087ddf7752c0317731b8725d1dc28", + "reference": "58446fdd096087ddf7752c0317731b8725d1dc28", "shasum": "" }, "require": { @@ -443,7 +443,7 @@ "cakephp/bake": "If you want to generate migrations.", "dereuromark/cakephp-ide-helper": "If you want to have IDE suggest/autocomplete when creating migrations." }, - "time": "2023-03-22T18:19:12+00:00", + "time": "2023-09-22T08:39:18+00:00", "type": "cakephp-plugin", "installation-source": "dist", "autoload": { @@ -707,17 +707,17 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.5", - "version_normalized": "1.3.5.0", + "version": "1.3.7", + "version_normalized": "1.3.7.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd" + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/74780ccf8c19d6acb8d65c5f39cd72110e132bbd", - "reference": "74780ccf8c19d6acb8d65c5f39cd72110e132bbd", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", + "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", "shasum": "" }, "require": { @@ -731,7 +731,7 @@ "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, - "time": "2023-01-11T08:27:00+00:00", + "time": "2023-08-30T09:31:38+00:00", "type": "library", "extra": { "branch-alias": { @@ -766,7 +766,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.5" + "source": "https://github.com/composer/ca-bundle/tree/1.3.7" }, "funding": [ { @@ -786,23 +786,23 @@ }, { "name": "composer/class-map-generator", - "version": "1.0.0", - "version_normalized": "1.0.0.0", + "version": "1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/953cc4ea32e0c31f2185549c7d216d7921f03da9", + "reference": "953cc4ea32e0c31f2185549c7d216d7921f03da9", "shasum": "" }, "require": { - "composer/pcre": "^2 || ^3", + "composer/pcre": "^2.1 || ^3.1", "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.6", @@ -812,7 +812,7 @@ "symfony/filesystem": "^5.4 || ^6", "symfony/phpunit-bridge": "^5" }, - "time": "2022-06-19T11:31:27+00:00", + "time": "2023-06-30T13:58:57+00:00", "type": "library", "extra": { "branch-alias": { @@ -842,7 +842,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" + "source": "https://github.com/composer/class-map-generator/tree/1.1.0" }, "funding": [ { @@ -862,17 +862,17 @@ }, { "name": "composer/composer", - "version": "2.5.5", - "version_normalized": "2.5.5.0", + "version": "2.6.3", + "version_normalized": "2.6.3.0", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f" + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/c7cffaad16a60636a776017eac5bd8cd0095c32f", - "reference": "c7cffaad16a60636a776017eac5bd8cd0095c32f", + "url": "https://api.github.com/repos/composer/composer/zipball/ff477832e6d838a736556d4a39a3b80f4412abfd", + "reference": "ff477832e6d838a736556d4a39a3b80f4412abfd", "shasum": "" }, "require": { @@ -880,23 +880,23 @@ "composer/class-map-generator": "^1.0", "composer/metadata-minifier": "^1.0", "composer/pcre": "^2.1 || ^3.1", - "composer/semver": "^3.0", + "composer/semver": "^3.2.5", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", "justinrainbow/json-schema": "^5.2.11", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", + "react/promise": "^2.8 || ^3", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", + "symfony/console": "^5.4.11 || ^6.0.11 || ^7", + "symfony/filesystem": "^5.4 || ^6.0 || ^7", + "symfony/finder": "^5.4 || ^6.0 || ^7", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0" + "symfony/process": "^5.4 || ^6.0 || ^7" }, "require-dev": { "phpstan/phpstan": "^1.9.3", @@ -904,21 +904,21 @@ "phpstan/phpstan-phpunit": "^1.0", "phpstan/phpstan-strict-rules": "^1", "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" + "symfony/phpunit-bridge": "^6.0 || ^7" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", "ext-zip": "Enabling the zip extension allows you to unzip archives", "ext-zlib": "Allow gzip compression of HTTP requests" }, - "time": "2023-03-21T10:50:05+00:00", + "time": "2023-09-15T07:38:22+00:00", "bin": [ "bin/composer" ], "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.6-dev" }, "phpstan": { "includes": [ @@ -929,7 +929,7 @@ "installation-source": "dist", "autoload": { "psr-4": { - "Composer\\": "src/Composer" + "Composer\\": "src/Composer/" } }, "notification-url": "https://packagist.org/downloads/", @@ -958,7 +958,8 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.5.5" + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.6.3" }, "funding": [ { @@ -1124,17 +1125,17 @@ }, { "name": "composer/semver", - "version": "3.3.2", - "version_normalized": "3.3.2.0", + "version": "3.4.0", + "version_normalized": "3.4.0.0", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", "shasum": "" }, "require": { @@ -1144,7 +1145,7 @@ "phpstan/phpstan": "^1.4", "symfony/phpunit-bridge": "^4.2 || ^5" }, - "time": "2022-04-01T19:23:25+00:00", + "time": "2023-08-31T09:50:34+00:00", "type": "library", "extra": { "branch-alias": { @@ -1186,9 +1187,9 @@ "versioning" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" + "source": "https://github.com/composer/semver/tree/3.4.0" }, "funding": [ { @@ -1537,17 +1538,17 @@ }, { "name": "doctrine/dbal", - "version": "3.6.1", - "version_normalized": "3.6.1.0", + "version": "3.7.0", + "version_normalized": "3.7.0.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e" + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/57815c7bbcda3cd18871d253c1dd8cbe56f8526e", - "reference": "57815c7bbcda3cd18871d253c1dd8cbe56f8526e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/00d03067f07482f025d41ab55e4ba0db5eca2cdf", + "reference": "00d03067f07482f025d41ab55e4ba0db5eca2cdf", "shasum": "" }, "require": { @@ -1560,13 +1561,14 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "11.1.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.3", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.35", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.4", + "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", @@ -1575,7 +1577,7 @@ "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." }, - "time": "2023-03-02T19:26:24+00:00", + "time": "2023-09-26T20:56:55+00:00", "bin": [ "bin/doctrine-dbal" ], @@ -1632,7 +1634,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.6.1" + "source": "https://github.com/doctrine/dbal/tree/3.7.0" }, "funding": [ { @@ -1652,31 +1654,35 @@ }, { "name": "doctrine/deprecations", - "version": "v1.0.0", - "version_normalized": "1.0.0.0", + "version": "v1.1.1", + "version_normalized": "1.1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de" + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", - "reference": "0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", + "reference": "612a3ee5ab0d5dd97b7cf3874a6efe24325efac3", "shasum": "" }, "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/coding-standard": "^9", - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3" + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, - "time": "2022-05-02T15:47:09+00:00", + "time": "2023-06-03T09:27:29+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1692,7 +1698,7 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/v1.0.0" + "source": "https://github.com/doctrine/deprecations/tree/v1.1.1" }, "install-path": "../doctrine/deprecations" }, @@ -2118,23 +2124,23 @@ }, { "name": "laminas/laminas-diactoros", - "version": "2.24.0", - "version_normalized": "2.24.0.0", + "version": "2.25.2", + "version_normalized": "2.25.2.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-diactoros.git", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902" + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/6028af6c3b5ced4d063a680d2483cce67578b902", - "reference": "6028af6c3b5ced4d063a680d2483cce67578b902", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", + "reference": "9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e", "shasum": "" }, "require": { "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1" }, "conflict": { "zendframework/zend-diactoros": "*" @@ -2149,13 +2155,13 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.4.0", + "laminas/laminas-coding-standard": "^2.5", "php-http/psr7-integration-tests": "^1.2", - "phpunit/phpunit": "^9.5.27", + "phpunit/phpunit": "^9.5.28", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.4" + "vimeo/psalm": "^5.6" }, - "time": "2022-12-20T12:22:40+00:00", + "time": "2023-04-17T15:44:17+00:00", "type": "library", "extra": { "laminas": { @@ -2218,33 +2224,33 @@ }, { "name": "laminas/laminas-httphandlerrunner", - "version": "2.5.0", - "version_normalized": "2.5.0.0", + "version": "2.9.0", + "version_normalized": "2.9.0.0", "source": { "type": "git", "url": "https://github.com/laminas/laminas-httphandlerrunner.git", - "reference": "7a47834aaad7852816d2ec4fdbb0492163b039ae" + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/7a47834aaad7852816d2ec4fdbb0492163b039ae", - "reference": "7a47834aaad7852816d2ec4fdbb0492163b039ae", + "url": "https://api.github.com/repos/laminas/laminas-httphandlerrunner/zipball/d3e84755a17e563b1c5f8290cbfb150210501a77", + "reference": "d3e84755a17e563b1c5f8290cbfb150210501a77", "shasum": "" }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-message-implementation": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "require-dev": { - "laminas/laminas-coding-standard": "~2.4.0", - "laminas/laminas-diactoros": "^2.18", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.0", - "vimeo/psalm": "^5.0.0" + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-diactoros": "^3.0.0", + "phpunit/phpunit": "^10.1.2", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.11" }, - "time": "2023-01-05T21:54:03+00:00", + "time": "2023-09-04T10:43:03+00:00", "type": "library", "extra": { "laminas": { @@ -2559,17 +2565,17 @@ }, { "name": "nikic/php-parser", - "version": "v4.15.4", - "version_normalized": "4.15.4.0", + "version": "v4.17.1", + "version_normalized": "4.17.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", - "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", "shasum": "" }, "require": { @@ -2580,7 +2586,7 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, - "time": "2023-03-05T19:49:14+00:00", + "time": "2023-08-13T19:53:39+00:00", "bin": [ "bin/php-parse" ], @@ -2612,7 +2618,7 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" }, "install-path": "../nikic/php-parser" }, @@ -2735,23 +2741,25 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.16.1", - "version_normalized": "1.16.1.0", + "version": "1.24.2", + "version_normalized": "1.24.2.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571" + "reference": "bcad8d995980440892759db0c32acae7c8e79442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/e27e92d939e2e3636f0a1f0afaba59692c0bf571", - "reference": "e27e92d939e2e3636f0a1f0afaba59692c0bf571", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/bcad8d995980440892759db0c32acae7c8e79442", + "reference": "bcad8d995980440892759db0c32acae7c8e79442", "shasum": "" }, "require": { "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", @@ -2760,7 +2768,7 @@ "phpunit/phpunit": "^9.5", "symfony/process": "^5.2" }, - "time": "2023-02-07T18:11:17+00:00", + "time": "2023-09-26T12:28:12+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2777,7 +2785,7 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.16.1" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.2" }, "install-path": "../phpstan/phpdoc-parser" }, @@ -2846,17 +2854,17 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.26", - "version_normalized": "9.2.26.0", + "version": "9.2.29", + "version_normalized": "9.2.29.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", - "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", "shasum": "" }, "require": { @@ -2881,7 +2889,7 @@ "ext-pcov": "PHP extension that provides line coverage", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, - "time": "2023-03-06T12:58:08+00:00", + "time": "2023-09-19T04:57:46+00:00", "type": "library", "extra": { "branch-alias": { @@ -2914,7 +2922,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" }, "funding": [ { @@ -3179,17 +3188,17 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.6", - "version_normalized": "9.6.6.0", + "version": "9.6.13", + "version_normalized": "9.6.13.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115" + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b65d59a059d3004a040c16a82e07bbdf6cfdd115", - "reference": "b65d59a059d3004a040c16a82e07bbdf6cfdd115", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", + "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", "shasum": "" }, "require": { @@ -3204,7 +3213,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -3225,7 +3234,7 @@ "ext-soap": "To be able to generate mocks based on WSDL files", "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, - "time": "2023-03-27T11:43:46+00:00", + "time": "2023-09-19T05:39:22+00:00", "bin": [ "phpunit" ], @@ -3265,7 +3274,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.6" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" }, "funding": [ { @@ -3393,24 +3402,24 @@ }, { "name": "psr/http-client", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.0.3", + "version_normalized": "1.0.3.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-client.git", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", - "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", "shasum": "" }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, - "time": "2020-06-29T06:28:15+00:00", + "time": "2023-09-23T14:17:50+00:00", "type": "library", "extra": { "branch-alias": { @@ -3430,7 +3439,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP clients", @@ -3442,30 +3451,30 @@ "psr-18" ], "support": { - "source": "https://github.com/php-fig/http-client/tree/master" + "source": "https://github.com/php-fig/http-client" }, "install-path": "../psr/http-client" }, { "name": "psr/http-factory", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.0.2", + "version_normalized": "1.0.2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + "reference": "e616d01114759c4c489f93b099585439f795fe35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", - "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", "shasum": "" }, "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, - "time": "2019-04-30T12:38:16+00:00", + "time": "2023-04-10T20:10:41+00:00", "type": "library", "extra": { "branch-alias": { @@ -3485,7 +3494,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for PSR-7 HTTP message factories", @@ -3500,33 +3509,33 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/master" + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" }, "install-path": "../psr/http-factory" }, { "name": "psr/http-message", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.1", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, - "time": "2016-08-06T14:39:51+00:00", + "time": "2023-04-04T09:50:52+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "installation-source": "dist", @@ -3555,28 +3564,31 @@ "request", "response" ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/1.1" + }, "install-path": "../psr/http-message" }, { "name": "psr/http-server-handler", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.0.2", + "version_normalized": "1.0.2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-handler.git", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7" + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/aff2f80e33b7f026ec96bb42f63242dc50ffcae7", - "reference": "aff2f80e33b7f026ec96bb42f63242dc50ffcae7", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, - "time": "2018-10-30T16:46:14+00:00", + "time": "2023-04-10T20:06:20+00:00", "type": "library", "extra": { "branch-alias": { @@ -3596,7 +3608,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side request handler", @@ -3612,32 +3624,31 @@ "server" ], "support": { - "issues": "https://github.com/php-fig/http-server-handler/issues", - "source": "https://github.com/php-fig/http-server-handler/tree/master" + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" }, "install-path": "../psr/http-server-handler" }, { "name": "psr/http-server-middleware", - "version": "1.0.1", - "version_normalized": "1.0.1.0", + "version": "1.0.2", + "version_normalized": "1.0.2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-server-middleware.git", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5" + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/2296f45510945530b9dceb8bcedb5cb84d40c5f5", - "reference": "2296f45510945530b9dceb8bcedb5cb84d40c5f5", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", "shasum": "" }, "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, - "time": "2018-10-30T17:12:04+00:00", + "time": "2023-04-11T06:14:47+00:00", "type": "library", "extra": { "branch-alias": { @@ -3657,7 +3668,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP server-side middleware", @@ -3673,7 +3684,7 @@ ], "support": { "issues": "https://github.com/php-fig/http-server-middleware/issues", - "source": "https://github.com/php-fig/http-server-middleware/tree/master" + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" }, "install-path": "../psr/http-server-middleware" }, @@ -3786,17 +3797,17 @@ }, { "name": "psy/psysh", - "version": "v0.11.14", - "version_normalized": "0.11.14.0", + "version": "v0.11.21", + "version_normalized": "0.11.21.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "8c2e264def7a8263a68ef6f0b55ce90b77d41e17" + "reference": "bcb22101107f3bf770523b65630c9d547f60c540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/8c2e264def7a8263a68ef6f0b55ce90b77d41e17", - "reference": "8c2e264def7a8263a68ef6f0b55ce90b77d41e17", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/bcb22101107f3bf770523b65630c9d547f60c540", + "reference": "bcb22101107f3bf770523b65630c9d547f60c540", "shasum": "" }, "require": { @@ -3819,7 +3830,7 @@ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." }, - "time": "2023-03-28T03:41:01+00:00", + "time": "2023-09-17T21:15:54+00:00", "bin": [ "bin/psysh" ], @@ -3827,6 +3838,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "installation-source": "dist", @@ -3859,32 +3874,33 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.14" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.21" }, "install-path": "../psy/psysh" }, { "name": "react/promise", - "version": "v2.9.0", - "version_normalized": "2.9.0.0", + "version": "v3.0.0", + "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", + "url": "https://api.github.com/repos/reactphp/promise/zipball/c86753c76fd3be465d93b308f18d189f01a22be4", + "reference": "c86753c76fd3be465d93b308f18d189f01a22be4", "shasum": "" }, "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, - "time": "2022-02-11T10:27:51+00:00", + "time": "2023-07-11T16:12:49+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -3928,16 +3944,12 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" + "source": "https://github.com/reactphp/promise/tree/v3.0.0" }, "funding": [ { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" + "url": "https://opencollective.com/reactphp", + "type": "open_collective" } ], "install-path": "../react/promise" @@ -4346,17 +4358,17 @@ }, { "name": "sebastian/diff", - "version": "4.0.4", - "version_normalized": "4.0.4.0", + "version": "4.0.5", + "version_normalized": "4.0.5.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", "shasum": "" }, "require": { @@ -4366,7 +4378,7 @@ "phpunit/phpunit": "^9.3", "symfony/process": "^4.2 || ^5" }, - "time": "2020-10-26T13:10:38+00:00", + "time": "2023-05-07T05:35:17+00:00", "type": "library", "extra": { "branch-alias": { @@ -4403,7 +4415,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" }, "funding": [ { @@ -4561,17 +4573,17 @@ }, { "name": "sebastian/global-state", - "version": "5.0.5", - "version_normalized": "5.0.5.0", + "version": "5.0.6", + "version_normalized": "5.0.6.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + "reference": "bde739e7565280bda77be70044ac1047bc007e34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", + "reference": "bde739e7565280bda77be70044ac1047bc007e34", "shasum": "" }, "require": { @@ -4586,7 +4598,7 @@ "suggest": { "ext-uopz": "*" }, - "time": "2022-02-14T08:28:10+00:00", + "time": "2023-08-02T09:26:13+00:00", "type": "library", "extra": { "branch-alias": { @@ -4616,7 +4628,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" }, "funding": [ { @@ -5045,17 +5057,17 @@ }, { "name": "seld/jsonlint", - "version": "1.9.0", - "version_normalized": "1.9.0.0", + "version": "1.10.0", + "version_normalized": "1.10.0.0", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", + "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", "shasum": "" }, "require": { @@ -5065,7 +5077,7 @@ "phpstan/phpstan": "^1.5", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" }, - "time": "2022-04-01T13:37:23+00:00", + "time": "2023-05-11T13:16:46+00:00", "bin": [ "bin/jsonlint" ], @@ -5096,7 +5108,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" }, "funding": [ { @@ -5163,17 +5175,17 @@ }, { "name": "seld/signal-handler", - "version": "2.0.1", - "version_normalized": "2.0.1.0", + "version": "2.0.2", + "version_normalized": "2.0.2.0", "source": { "type": "git", "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", "shasum": "" }, "require": { @@ -5187,7 +5199,7 @@ "phpunit/phpunit": "^7.5.20 || ^8.5.23", "psr/log": "^1 || ^2 || ^3" }, - "time": "2022-07-20T18:31:45+00:00", + "time": "2023-09-03T09:24:00+00:00", "type": "library", "extra": { "branch-alias": { @@ -5221,41 +5233,41 @@ ], "support": { "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" }, "install-path": "../seld/signal-handler" }, { "name": "slevomat/coding-standard", - "version": "8.9.1", - "version_normalized": "8.9.1.0", + "version": "8.13.4", + "version_normalized": "8.13.4.0", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2" + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2", - "reference": "3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/4b2af2fb17773656d02fbfb5d18024ebd19fe322", + "reference": "4b2af2fb17773656d02fbfb5d18024ebd19fe322", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": ">=1.16.0 <1.17.0", + "phpstan/phpdoc-parser": "^1.23.0", "squizlabs/php_codesniffer": "^3.7.1" }, "require-dev": { "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.10.8", + "phpstan/phpstan": "1.10.26", "phpstan/phpstan-deprecation-rules": "1.1.3", - "phpstan/phpstan-phpunit": "1.0.0|1.3.10", - "phpstan/phpstan-strict-rules": "1.5.0", - "phpunit/phpunit": "7.5.20|8.5.21|9.6.5" + "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" }, - "time": "2023-03-27T11:00:16+00:00", + "time": "2023-07-25T10:28:55+00:00", "type": "phpcodesniffer-standard", "extra": { "branch-alias": { @@ -5279,7 +5291,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.9.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.13.4" }, "funding": [ { @@ -5355,39 +5367,37 @@ }, { "name": "symfony/config", - "version": "v6.2.7", - "version_normalized": "6.2.7.0", + "version": "v6.3.2", + "version_normalized": "6.3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "249271da6f545d6579e0663374f8249a80be2893" + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/249271da6f545d6579e0663374f8249a80be2893", - "reference": "249271da6f545d6579e0663374f8249a80be2893", + "url": "https://api.github.com/repos/symfony/config/zipball/b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", + "reference": "b47ca238b03e7b0d7880ffd1cf06e8d637ca1467", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "require-dev": { "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" - }, - "time": "2023-02-14T08:44:56+00:00", + "time": "2023-07-19T20:22:16+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5415,7 +5425,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/v6.2.7" + "source": "https://github.com/symfony/config/tree/v6.3.2" }, "funding": [ { @@ -5435,24 +5445,24 @@ }, { "name": "symfony/console", - "version": "v6.2.8", - "version_normalized": "6.2.8.0", + "version": "v6.3.4", + "version_normalized": "6.3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3582d68a64a86ec25240aaa521ec8bc2342b369b" + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3582d68a64a86ec25240aaa521ec8bc2342b369b", - "reference": "3582d68a64a86ec25240aaa521ec8bc2342b369b", + "url": "https://api.github.com/repos/symfony/console/zipball/eca495f2ee845130855ddf1cf18460c38966c8b6", + "reference": "eca495f2ee845130855ddf1cf18460c38966c8b6", "shasum": "" }, "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "conflict": { @@ -5474,13 +5484,7 @@ "symfony/process": "^5.4|^6.0", "symfony/var-dumper": "^5.4|^6.0" }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "time": "2023-03-29T21:42:15+00:00", + "time": "2023-08-16T10:10:12+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5514,7 +5518,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.2.8" + "source": "https://github.com/symfony/console/tree/v6.3.4" }, "funding": [ { @@ -5534,27 +5538,27 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.2.1", - "version_normalized": "3.2.1.0", + "version": "v3.3.0", + "version_normalized": "3.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e" + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", - "reference": "e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2023-03-01T10:25:55+00:00", + "time": "2023-05-23T14:45:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5584,7 +5588,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.0" }, "funding": [ { @@ -5604,17 +5608,17 @@ }, { "name": "symfony/filesystem", - "version": "v6.2.7", - "version_normalized": "6.2.7.0", + "version": "v6.3.1", + "version_normalized": "6.3.1.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3" + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/82b6c62b959f642d000456f08c6d219d749215b3", - "reference": "82b6c62b959f642d000456f08c6d219d749215b3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", + "reference": "edd36776956f2a6fcf577edb5b05eb0e3bdc52ae", "shasum": "" }, "require": { @@ -5622,7 +5626,7 @@ "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, - "time": "2023-02-14T08:44:56+00:00", + "time": "2023-06-01T08:30:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5650,7 +5654,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.2.7" + "source": "https://github.com/symfony/filesystem/tree/v6.3.1" }, "funding": [ { @@ -5670,17 +5674,17 @@ }, { "name": "symfony/finder", - "version": "v6.2.7", - "version_normalized": "6.2.7.0", + "version": "v6.3.3", + "version_normalized": "6.3.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb" + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/20808dc6631aecafbe67c186af5dcb370be3a0eb", - "reference": "20808dc6631aecafbe67c186af5dcb370be3a0eb", + "url": "https://api.github.com/repos/symfony/finder/zipball/9915db259f67d21eefee768c1abcf1cc61b1fc9e", + "reference": "9915db259f67d21eefee768c1abcf1cc61b1fc9e", "shasum": "" }, "require": { @@ -5689,7 +5693,7 @@ "require-dev": { "symfony/filesystem": "^6.0" }, - "time": "2023-02-16T09:57:23+00:00", + "time": "2023-07-31T08:31:44+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5717,7 +5721,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.2.7" + "source": "https://github.com/symfony/finder/tree/v6.3.3" }, "funding": [ { @@ -5737,17 +5741,17 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a" + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/5bbc823adecdae860bb64756d639ecfec17b050a", - "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", "shasum": "" }, "require": { @@ -5759,11 +5763,11 @@ "suggest": { "ext-ctype": "For best performance" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5802,7 +5806,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" }, "funding": [ { @@ -5822,17 +5826,17 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354" + "reference": "875e90aeea2777b6f135677f618529449334a612" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/511a08c03c1960e08a883f4cffcacd219b758354", - "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", + "reference": "875e90aeea2777b6f135677f618529449334a612", "shasum": "" }, "require": { @@ -5841,11 +5845,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5886,7 +5890,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" }, "funding": [ { @@ -5906,17 +5910,17 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6" + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/19bd1e4fcd5b91116f14d8533c57831ed00571b6", - "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", "shasum": "" }, "require": { @@ -5925,11 +5929,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5973,7 +5977,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" }, "funding": [ { @@ -5993,17 +5997,17 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534" + "reference": "42292d99c55abe617799667f454222c54c60e229" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534", - "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", + "reference": "42292d99c55abe617799667f454222c54c60e229", "shasum": "" }, "require": { @@ -6015,11 +6019,11 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-07-28T09:04:16+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6059,7 +6063,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" }, "funding": [ { @@ -6079,27 +6083,27 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6141,7 +6145,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -6161,27 +6165,27 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936" + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", - "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6227,7 +6231,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" }, "funding": [ { @@ -6247,27 +6251,27 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.27.0", - "version_normalized": "1.27.0.0", + "version": "v1.28.0", + "version_normalized": "1.28.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a" + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/707403074c8ea6e2edaf8794b0157a0bfa52157a", - "reference": "707403074c8ea6e2edaf8794b0157a0bfa52157a", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", + "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-11-03T14:55:06+00:00", + "time": "2023-01-26T09:26:14+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6309,7 +6313,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" }, "funding": [ { @@ -6329,23 +6333,23 @@ }, { "name": "symfony/process", - "version": "v6.2.8", - "version_normalized": "6.2.8.0", + "version": "v6.3.4", + "version_normalized": "6.3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "75ed64103df4f6615e15a7fe38b8111099f47416" + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/75ed64103df4f6615e15a7fe38b8111099f47416", - "reference": "75ed64103df4f6615e15a7fe38b8111099f47416", + "url": "https://api.github.com/repos/symfony/process/zipball/0b5c29118f2e980d455d2e34a5659f4579847c54", + "reference": "0b5c29118f2e980d455d2e34a5659f4579847c54", "shasum": "" }, "require": { "php": ">=8.1" }, - "time": "2023-03-09T16:20:02+00:00", + "time": "2023-08-07T10:39:22+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6373,7 +6377,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.2.8" + "source": "https://github.com/symfony/process/tree/v6.3.4" }, "funding": [ { @@ -6393,17 +6397,17 @@ }, { "name": "symfony/service-contracts", - "version": "v3.2.1", - "version_normalized": "3.2.1.0", + "version": "v3.3.0", + "version_normalized": "3.3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a" + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/a8c9cedf55f314f3a186041d19537303766df09a", - "reference": "a8c9cedf55f314f3a186041d19537303766df09a", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", "shasum": "" }, "require": { @@ -6413,14 +6417,11 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, - "time": "2023-03-01T10:32:47+00:00", + "time": "2023-05-23T14:45:45+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -6461,7 +6462,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.2.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.3.0" }, "funding": [ { @@ -6481,17 +6482,17 @@ }, { "name": "symfony/string", - "version": "v6.2.8", - "version_normalized": "6.2.8.0", + "version": "v6.3.2", + "version_normalized": "6.3.2.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef" + "reference": "53d1a83225002635bca3482fcbf963001313fb68" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/193e83bbd6617d6b2151c37fff10fa7168ebddef", - "reference": "193e83bbd6617d6b2151c37fff10fa7168ebddef", + "url": "https://api.github.com/repos/symfony/string/zipball/53d1a83225002635bca3482fcbf963001313fb68", + "reference": "53d1a83225002635bca3482fcbf963001313fb68", "shasum": "" }, "require": { @@ -6502,16 +6503,16 @@ "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "require-dev": { "symfony/error-handler": "^5.4|^6.0", "symfony/http-client": "^5.4|^6.0", "symfony/intl": "^6.2", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, - "time": "2023-03-20T16:06:02+00:00", + "time": "2023-07-05T08:41:27+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6550,7 +6551,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.2.8" + "source": "https://github.com/symfony/string/tree/v6.3.2" }, "funding": [ { @@ -6570,40 +6571,36 @@ }, { "name": "symfony/var-dumper", - "version": "v6.2.8", - "version_normalized": "6.2.8.0", + "version": "v6.3.4", + "version_normalized": "6.3.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0" + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d37ab6787be2db993747b6218fcc96e8e3bb4bd0", - "reference": "d37ab6787be2db993747b6218fcc96e8e3bb4bd0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2027be14f8ae8eae999ceadebcda5b4909b81d45", + "reference": "2027be14f8ae8eae999ceadebcda5b4909b81d45", "shasum": "" }, "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^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" - }, - "time": "2023-03-29T21:42:15+00:00", + "time": "2023-08-24T14:51:05+00:00", "bin": [ "Resources/bin/var-dump-server" ], @@ -6641,7 +6638,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.2.8" + "source": "https://github.com/symfony/var-dumper/tree/v6.3.4" }, "funding": [ { @@ -6714,23 +6711,23 @@ }, { "name": "twbs/bootstrap", - "version": "v5.2.3", - "version_normalized": "5.2.3.0", + "version": "v5.3.2", + "version_normalized": "5.3.2.0", "source": { "type": "git", "url": "https://github.com/twbs/bootstrap.git", - "reference": "cb021439c683d9805e2864c58095b92d405e9b11" + "reference": "344e912d04b5b6a04482113eff20ab416ff01048" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twbs/bootstrap/zipball/cb021439c683d9805e2864c58095b92d405e9b11", - "reference": "cb021439c683d9805e2864c58095b92d405e9b11", + "url": "https://api.github.com/repos/twbs/bootstrap/zipball/344e912d04b5b6a04482113eff20ab416ff01048", + "reference": "344e912d04b5b6a04482113eff20ab416ff01048", "shasum": "" }, "replace": { "twitter/bootstrap": "self.version" }, - "time": "2022-11-21T18:19:01+00:00", + "time": "2023-09-14T14:19:27+00:00", "type": "library", "installation-source": "dist", "notification-url": "https://packagist.org/downloads/", @@ -6761,23 +6758,23 @@ ], "support": { "issues": "https://github.com/twbs/bootstrap/issues", - "source": "https://github.com/twbs/bootstrap/tree/v5.2.3" + "source": "https://github.com/twbs/bootstrap/tree/v5.3.2" }, "install-path": "../twbs/bootstrap" }, { "name": "twig/markdown-extra", - "version": "v3.5.1", - "version_normalized": "3.5.1.0", + "version": "v3.7.1", + "version_normalized": "3.7.1.0", "source": { "type": "git", "url": "https://github.com/twigphp/markdown-extra.git", - "reference": "9474c89fd2787187a3809e5e964dfce2395ae5f0" + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/9474c89fd2787187a3809e5e964dfce2395ae5f0", - "reference": "9474c89fd2787187a3809e5e964dfce2395ae5f0", + "url": "https://api.github.com/repos/twigphp/markdown-extra/zipball/83dfa86a0379f784ea30bdb9c15a356b8aabf780", + "reference": "83dfa86a0379f784ea30bdb9c15a356b8aabf780", "shasum": "" }, "require": { @@ -6789,15 +6786,10 @@ "league/commonmark": "^1.0|^2.0", "league/html-to-markdown": "^4.8|^5.0", "michelf/php-markdown": "^1.8|^2.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "symfony/phpunit-bridge": "^5.4|^6.3" }, - "time": "2023-02-08T07:44:55+00:00", + "time": "2023-07-29T15:34:56+00:00", "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "installation-source": "dist", "autoload": { "psr-4": { @@ -6827,7 +6819,7 @@ "twig" ], "support": { - "source": "https://github.com/twigphp/markdown-extra/tree/v3.5.1" + "source": "https://github.com/twigphp/markdown-extra/tree/v3.7.1" }, "funding": [ { @@ -6843,17 +6835,17 @@ }, { "name": "twig/twig", - "version": "v3.5.1", - "version_normalized": "3.5.1.0", + "version": "v3.7.1", + "version_normalized": "3.7.1.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15" + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/a6e0510cc793912b451fd40ab983a1d28f611c15", - "reference": "a6e0510cc793912b451fd40ab983a1d28f611c15", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", + "reference": "a0ce373a0ca3bf6c64b9e3e2124aca502ba39554", "shasum": "" }, "require": { @@ -6862,16 +6854,11 @@ "symfony/polyfill-mbstring": "^1.3" }, "require-dev": { - "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.3" }, - "time": "2023-02-08T07:49:20+00:00", + "time": "2023-08-28T11:09:02+00:00", "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.5-dev" - } - }, "installation-source": "dist", "autoload": { "psr-4": { @@ -6906,7 +6893,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.5.1" + "source": "https://github.com/twigphp/Twig/tree/v3.7.1" }, "funding": [ { diff --git a/app/vendor/composer/installed.php b/app/vendor/composer/installed.php index b56b5eb25..0a0c7b5da 100644 --- a/app/vendor/composer/installed.php +++ b/app/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'cakephp/app', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '57cecc7e07183850c3835b21d18ab05ab3326315', + 'reference' => '1d81a94ddcb028e1a8365490ce7586adbf7f2458', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -22,7 +22,7 @@ 'cakephp/app' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '57cecc7e07183850c3835b21d18ab05ab3326315', + 'reference' => '1d81a94ddcb028e1a8365490ce7586adbf7f2458', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -40,31 +40,31 @@ 'cakephp/cache' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/cakephp' => array( - 'pretty_version' => '4.4.12', - 'version' => '4.4.12.0', - 'reference' => 'ecacba23d96a5e5052716bf19fe8b96c5549acf3', + 'pretty_version' => '4.4.17', + 'version' => '4.4.17.0', + 'reference' => '9ff254d6d60720089dec1e10aa1907e24e39a98e', 'type' => 'library', 'install_path' => __DIR__ . '/../cakephp/cakephp', 'aliases' => array(), 'dev_requirement' => false, ), 'cakephp/cakephp-codesniffer' => array( - 'pretty_version' => '4.6.0', - 'version' => '4.6.0.0', - 'reference' => '5a64e6e6434128f6a1549318de86c564737d5cda', + 'pretty_version' => '4.7.0', + 'version' => '4.7.0.0', + 'reference' => '24fa2321d54e5251ac2f59dd92dd2066f0b0bdae', 'type' => 'phpcodesniffer-standard', 'install_path' => __DIR__ . '/../cakephp/cakephp-codesniffer', 'aliases' => array(), 'dev_requirement' => true, ), 'cakephp/chronos' => array( - 'pretty_version' => '2.3.2', - 'version' => '2.3.2.0', - 'reference' => 'a21b7b633f483c4cf525d200219d200f551ee38b', + 'pretty_version' => '2.4.1', + 'version' => '2.4.1.0', + 'reference' => 'dd583900b26971e84d56c482d6c5fc16961bd103', 'type' => 'library', 'install_path' => __DIR__ . '/../cakephp/chronos', 'aliases' => array(), @@ -73,37 +73,37 @@ 'cakephp/collection' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/console' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/core' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/database' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/datasource' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/debug_kit' => array( - 'pretty_version' => '4.9.3', - 'version' => '4.9.3.0', - 'reference' => 'db848e787bf53483069cba2feb449c2e8523f525', + 'pretty_version' => '4.9.4', + 'version' => '4.9.4.0', + 'reference' => '663491edec4a6b9111f1cf4733ebd471450df71e', 'type' => 'cakephp-plugin', 'install_path' => __DIR__ . '/../cakephp/debug_kit', 'aliases' => array(), @@ -112,43 +112,43 @@ 'cakephp/event' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/filesystem' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/form' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/http' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/i18n' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/log' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/migrations' => array( - 'pretty_version' => '3.8.0', - 'version' => '3.8.0.0', - 'reference' => '8eaf51d88fc4350a66fd98118828f9a75ff1e0d2', + 'pretty_version' => '3.9.0', + 'version' => '3.9.0.0', + 'reference' => '58446fdd096087ddf7752c0317731b8725d1dc28', 'type' => 'cakephp-plugin', 'install_path' => __DIR__ . '/../cakephp/migrations', 'aliases' => array(), @@ -157,7 +157,7 @@ 'cakephp/orm' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/plugin-installer' => array( @@ -190,13 +190,13 @@ 'cakephp/utility' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'cakephp/validation' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.4.12', + 0 => '4.4.17', ), ), 'components/jquery' => array( @@ -209,27 +209,27 @@ 'dev_requirement' => false, ), 'composer/ca-bundle' => array( - 'pretty_version' => '1.3.5', - 'version' => '1.3.5.0', - 'reference' => '74780ccf8c19d6acb8d65c5f39cd72110e132bbd', + 'pretty_version' => '1.3.7', + 'version' => '1.3.7.0', + 'reference' => '76e46335014860eec1aa5a724799a00a2e47cc85', 'type' => 'library', 'install_path' => __DIR__ . '/./ca-bundle', 'aliases' => array(), 'dev_requirement' => false, ), 'composer/class-map-generator' => array( - 'pretty_version' => '1.0.0', - 'version' => '1.0.0.0', - 'reference' => '1e1cb2b791facb2dfe32932a7718cf2571187513', + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '953cc4ea32e0c31f2185549c7d216d7921f03da9', 'type' => 'library', 'install_path' => __DIR__ . '/./class-map-generator', 'aliases' => array(), 'dev_requirement' => true, ), 'composer/composer' => array( - 'pretty_version' => '2.5.5', - 'version' => '2.5.5.0', - 'reference' => 'c7cffaad16a60636a776017eac5bd8cd0095c32f', + 'pretty_version' => '2.6.3', + 'version' => '2.6.3.0', + 'reference' => 'ff477832e6d838a736556d4a39a3b80f4412abfd', 'type' => 'library', 'install_path' => __DIR__ . '/./composer', 'aliases' => array(), @@ -254,9 +254,9 @@ 'dev_requirement' => true, ), 'composer/semver' => array( - 'pretty_version' => '3.3.2', - 'version' => '3.3.2.0', - 'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9', + 'pretty_version' => '3.4.0', + 'version' => '3.4.0.0', + 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), @@ -299,18 +299,18 @@ 'dev_requirement' => false, ), 'doctrine/dbal' => array( - 'pretty_version' => '3.6.1', - 'version' => '3.6.1.0', - 'reference' => '57815c7bbcda3cd18871d253c1dd8cbe56f8526e', + 'pretty_version' => '3.7.0', + 'version' => '3.7.0.0', + 'reference' => '00d03067f07482f025d41ab55e4ba0db5eca2cdf', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/dbal', 'aliases' => array(), 'dev_requirement' => false, ), 'doctrine/deprecations' => array( - 'pretty_version' => 'v1.0.0', - 'version' => '1.0.0.0', - 'reference' => '0e2a4f1f8cdfc7a92ec3b01c9334898c806b30de', + 'pretty_version' => 'v1.1.1', + 'version' => '1.1.1.0', + 'reference' => '612a3ee5ab0d5dd97b7cf3874a6efe24325efac3', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/deprecations', 'aliases' => array(), @@ -371,18 +371,18 @@ 'dev_requirement' => true, ), 'laminas/laminas-diactoros' => array( - 'pretty_version' => '2.24.0', - 'version' => '2.24.0.0', - 'reference' => '6028af6c3b5ced4d063a680d2483cce67578b902', + 'pretty_version' => '2.25.2', + 'version' => '2.25.2.0', + 'reference' => '9f3f4bf5b99c9538b6f1dbcc20f6fec357914f9e', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-diactoros', 'aliases' => array(), 'dev_requirement' => false, ), 'laminas/laminas-httphandlerrunner' => array( - 'pretty_version' => '2.5.0', - 'version' => '2.5.0.0', - 'reference' => '7a47834aaad7852816d2ec4fdbb0492163b039ae', + 'pretty_version' => '2.9.0', + 'version' => '2.9.0.0', + 'reference' => 'd3e84755a17e563b1c5f8290cbfb150210501a77', 'type' => 'library', 'install_path' => __DIR__ . '/../laminas/laminas-httphandlerrunner', 'aliases' => array(), @@ -425,9 +425,9 @@ 'dev_requirement' => true, ), 'nikic/php-parser' => array( - 'pretty_version' => 'v4.15.4', - 'version' => '4.15.4.0', - 'reference' => '6bb5176bc4af8bcb7d926f88718db9b96a2d4290', + 'pretty_version' => 'v4.17.1', + 'version' => '4.17.1.0', + 'reference' => 'a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), @@ -458,9 +458,9 @@ 'dev_requirement' => true, ), 'phpstan/phpdoc-parser' => array( - 'pretty_version' => '1.16.1', - 'version' => '1.16.1.0', - 'reference' => 'e27e92d939e2e3636f0a1f0afaba59692c0bf571', + 'pretty_version' => '1.24.2', + 'version' => '1.24.2.0', + 'reference' => 'bcad8d995980440892759db0c32acae7c8e79442', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), @@ -476,9 +476,9 @@ 'dev_requirement' => true, ), 'phpunit/php-code-coverage' => array( - 'pretty_version' => '9.2.26', - 'version' => '9.2.26.0', - 'reference' => '443bc6912c9bd5b409254a40f4b0f4ced7c80ea1', + 'pretty_version' => '9.2.29', + 'version' => '9.2.29.0', + 'reference' => '6a3a87ac2bbe33b25042753df8195ba4aa534c76', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/php-code-coverage', 'aliases' => array(), @@ -521,9 +521,9 @@ 'dev_requirement' => true, ), 'phpunit/phpunit' => array( - 'pretty_version' => '9.6.6', - 'version' => '9.6.6.0', - 'reference' => 'b65d59a059d3004a040c16a82e07bbdf6cfdd115', + 'pretty_version' => '9.6.13', + 'version' => '9.6.13.0', + 'reference' => 'f3d767f7f9e191eab4189abe41ab37797e30b1be', 'type' => 'library', 'install_path' => __DIR__ . '/../phpunit/phpunit', 'aliases' => array(), @@ -555,9 +555,9 @@ ), ), 'psr/http-client' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621', + 'pretty_version' => '1.0.3', + 'version' => '1.0.3.0', + 'reference' => 'bb5906edc1c324c9a05aa0873d40117941e5fa90', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-client', 'aliases' => array(), @@ -570,9 +570,9 @@ ), ), 'psr/http-factory' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be', + 'pretty_version' => '1.0.2', + 'version' => '1.0.2.0', + 'reference' => 'e616d01114759c4c489f93b099585439f795fe35', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), @@ -585,9 +585,9 @@ ), ), 'psr/http-message' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363', + 'pretty_version' => '1.1', + 'version' => '1.1.0.0', + 'reference' => 'cb6ce4845ce34a8ad9e68117c10ee90a29919eba', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-message', 'aliases' => array(), @@ -600,9 +600,9 @@ ), ), 'psr/http-server-handler' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => 'aff2f80e33b7f026ec96bb42f63242dc50ffcae7', + 'pretty_version' => '1.0.2', + 'version' => '1.0.2.0', + 'reference' => '84c4fb66179be4caaf8e97bd239203245302e7d4', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-server-handler', 'aliases' => array(), @@ -615,9 +615,9 @@ ), ), 'psr/http-server-middleware' => array( - 'pretty_version' => '1.0.1', - 'version' => '1.0.1.0', - 'reference' => '2296f45510945530b9dceb8bcedb5cb84d40c5f5', + 'pretty_version' => '1.0.2', + 'version' => '1.0.2.0', + 'reference' => 'c1481f747daaa6a0782775cd6a8c26a1bf4a3829', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-server-middleware', 'aliases' => array(), @@ -661,18 +661,18 @@ ), ), 'psy/psysh' => array( - 'pretty_version' => 'v0.11.14', - 'version' => '0.11.14.0', - 'reference' => '8c2e264def7a8263a68ef6f0b55ce90b77d41e17', + 'pretty_version' => 'v0.11.21', + 'version' => '0.11.21.0', + 'reference' => 'bcb22101107f3bf770523b65630c9d547f60c540', 'type' => 'library', 'install_path' => __DIR__ . '/../psy/psysh', 'aliases' => array(), 'dev_requirement' => true, ), 'react/promise' => array( - 'pretty_version' => 'v2.9.0', - 'version' => '2.9.0.0', - 'reference' => '234f8fd1023c9158e2314fa9d7d0e6a83db42910', + 'pretty_version' => 'v3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'c86753c76fd3be465d93b308f18d189f01a22be4', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), @@ -733,9 +733,9 @@ 'dev_requirement' => true, ), 'sebastian/diff' => array( - 'pretty_version' => '4.0.4', - 'version' => '4.0.4.0', - 'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d', + 'pretty_version' => '4.0.5', + 'version' => '4.0.5.0', + 'reference' => '74be17022044ebaaecfdf0c5cd504fc9cd5a7131', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), @@ -760,9 +760,9 @@ 'dev_requirement' => true, ), 'sebastian/global-state' => array( - 'pretty_version' => '5.0.5', - 'version' => '5.0.5.0', - 'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2', + 'pretty_version' => '5.0.6', + 'version' => '5.0.6.0', + 'reference' => 'bde739e7565280bda77be70044ac1047bc007e34', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/global-state', 'aliases' => array(), @@ -832,9 +832,9 @@ 'dev_requirement' => true, ), 'seld/jsonlint' => array( - 'pretty_version' => '1.9.0', - 'version' => '1.9.0.0', - 'reference' => '4211420d25eba80712bff236a98960ef68b866b7', + 'pretty_version' => '1.10.0', + 'version' => '1.10.0.0', + 'reference' => '594fd6462aad8ecee0b45ca5045acea4776667f1', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/jsonlint', 'aliases' => array(), @@ -850,18 +850,18 @@ 'dev_requirement' => true, ), 'seld/signal-handler' => array( - 'pretty_version' => '2.0.1', - 'version' => '2.0.1.0', - 'reference' => 'f69d119511dc0360440cdbdaa71829c149b7be75', + 'pretty_version' => '2.0.2', + 'version' => '2.0.2.0', + 'reference' => '04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98', 'type' => 'library', 'install_path' => __DIR__ . '/../seld/signal-handler', 'aliases' => array(), 'dev_requirement' => true, ), 'slevomat/coding-standard' => array( - 'pretty_version' => '8.9.1', - 'version' => '8.9.1.0', - 'reference' => '3d4fe0c803ae15829ef72d90d3d4eee3dd9f79b2', + 'pretty_version' => '8.13.4', + 'version' => '8.13.4.0', + 'reference' => '4b2af2fb17773656d02fbfb5d18024ebd19fe322', 'type' => 'phpcodesniffer-standard', 'install_path' => __DIR__ . '/../slevomat/coding-standard', 'aliases' => array(), @@ -877,144 +877,144 @@ 'dev_requirement' => true, ), 'symfony/config' => array( - 'pretty_version' => 'v6.2.7', - 'version' => '6.2.7.0', - 'reference' => '249271da6f545d6579e0663374f8249a80be2893', + 'pretty_version' => 'v6.3.2', + 'version' => '6.3.2.0', + 'reference' => 'b47ca238b03e7b0d7880ffd1cf06e8d637ca1467', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/config', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/console' => array( - 'pretty_version' => 'v6.2.8', - 'version' => '6.2.8.0', - 'reference' => '3582d68a64a86ec25240aaa521ec8bc2342b369b', + 'pretty_version' => 'v6.3.4', + 'version' => '6.3.4.0', + 'reference' => 'eca495f2ee845130855ddf1cf18460c38966c8b6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'e2d1534420bd723d0ef5aec58a22c5fe60ce6f5e', + 'pretty_version' => 'v3.3.0', + 'version' => '3.3.0.0', + 'reference' => '7c3aff79d10325257a001fcf92d991f24fc967cf', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/filesystem' => array( - 'pretty_version' => 'v6.2.7', - 'version' => '6.2.7.0', - 'reference' => '82b6c62b959f642d000456f08c6d219d749215b3', + 'pretty_version' => 'v6.3.1', + 'version' => '6.3.1.0', + 'reference' => 'edd36776956f2a6fcf577edb5b05eb0e3bdc52ae', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/finder' => array( - 'pretty_version' => 'v6.2.7', - 'version' => '6.2.7.0', - 'reference' => '20808dc6631aecafbe67c186af5dcb370be3a0eb', + 'pretty_version' => 'v6.3.3', + 'version' => '6.3.3.0', + 'reference' => '9915db259f67d21eefee768c1abcf1cc61b1fc9e', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/polyfill-ctype' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '5bbc823adecdae860bb64756d639ecfec17b050a', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => 'ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '511a08c03c1960e08a883f4cffcacd219b758354', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => '875e90aeea2777b6f135677f618529449334a612', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '19bd1e4fcd5b91116f14d8533c57831ed00571b6', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => '8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '8ad114f6b39e2c98a8b0e3bd907732c207c2b534', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => '42292d99c55abe617799667f454222c54c60e229', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '9e8ecb5f92152187c4799efd3c96b78ccab18ff9', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => 'fe2f306d1d9d346a7fee353d0d5012e401e984b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => '6caa57379c4aec19c0a12a38b59b26487dcfe4b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/polyfill-php81' => array( - 'pretty_version' => 'v1.27.0', - 'version' => '1.27.0.0', - 'reference' => '707403074c8ea6e2edaf8794b0157a0bfa52157a', + 'pretty_version' => 'v1.28.0', + 'version' => '1.28.0.0', + 'reference' => '7581cd600fa9fd681b797d00b02f068e2f13263b', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/process' => array( - 'pretty_version' => 'v6.2.8', - 'version' => '6.2.8.0', - 'reference' => '75ed64103df4f6615e15a7fe38b8111099f47416', + 'pretty_version' => 'v6.3.4', + 'version' => '6.3.4.0', + 'reference' => '0b5c29118f2e980d455d2e34a5659f4579847c54', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => true, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v3.2.1', - 'version' => '3.2.1.0', - 'reference' => 'a8c9cedf55f314f3a186041d19537303766df09a', + 'pretty_version' => 'v3.3.0', + 'version' => '3.3.0.0', + 'reference' => '40da9cc13ec349d9e4966ce18b5fbcd724ab10a4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/string' => array( - 'pretty_version' => 'v6.2.8', - 'version' => '6.2.8.0', - 'reference' => '193e83bbd6617d6b2151c37fff10fa7168ebddef', + 'pretty_version' => 'v6.3.2', + 'version' => '6.3.2.0', + 'reference' => '53d1a83225002635bca3482fcbf963001313fb68', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), 'dev_requirement' => false, ), 'symfony/var-dumper' => array( - 'pretty_version' => 'v6.2.8', - 'version' => '6.2.8.0', - 'reference' => 'd37ab6787be2db993747b6218fcc96e8e3bb4bd0', + 'pretty_version' => 'v6.3.4', + 'version' => '6.3.4.0', + 'reference' => '2027be14f8ae8eae999ceadebcda5b4909b81d45', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-dumper', 'aliases' => array(), @@ -1030,27 +1030,27 @@ 'dev_requirement' => true, ), 'twbs/bootstrap' => array( - 'pretty_version' => 'v5.2.3', - 'version' => '5.2.3.0', - 'reference' => 'cb021439c683d9805e2864c58095b92d405e9b11', + 'pretty_version' => 'v5.3.2', + 'version' => '5.3.2.0', + 'reference' => '344e912d04b5b6a04482113eff20ab416ff01048', 'type' => 'library', 'install_path' => __DIR__ . '/../twbs/bootstrap', 'aliases' => array(), 'dev_requirement' => false, ), 'twig/markdown-extra' => array( - 'pretty_version' => 'v3.5.1', - 'version' => '3.5.1.0', - 'reference' => '9474c89fd2787187a3809e5e964dfce2395ae5f0', + 'pretty_version' => 'v3.7.1', + 'version' => '3.7.1.0', + 'reference' => '83dfa86a0379f784ea30bdb9c15a356b8aabf780', 'type' => 'library', 'install_path' => __DIR__ . '/../twig/markdown-extra', 'aliases' => array(), 'dev_requirement' => true, ), 'twig/twig' => array( - 'pretty_version' => 'v3.5.1', - 'version' => '3.5.1.0', - 'reference' => 'a6e0510cc793912b451fd40ab983a1d28f611c15', + 'pretty_version' => 'v3.7.1', + 'version' => '3.7.1.0', + 'reference' => 'a0ce373a0ca3bf6c64b9e3e2124aca502ba39554', 'type' => 'library', 'install_path' => __DIR__ . '/../twig/twig', 'aliases' => array(), @@ -1059,7 +1059,7 @@ 'twitter/bootstrap' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => 'v5.2.3', + 0 => 'v5.3.2', ), ), ), diff --git a/app/vendor/composer/semver/CHANGELOG.md b/app/vendor/composer/semver/CHANGELOG.md index c95147735..3b1116124 100644 --- a/app/vendor/composer/semver/CHANGELOG.md +++ b/app/vendor/composer/semver/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +### [3.4.0] 2023-08-31 + + * Support larger major version numbers (#149) + ### [3.3.2] 2022-04-01 * Fixed handling of non-string values (#134) @@ -175,6 +179,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint` * Changed: code style using php-cs-fixer. +[3.4.0]: https://github.com/composer/semver/compare/3.3.2...3.4.0 [3.3.2]: https://github.com/composer/semver/compare/3.3.1...3.3.2 [3.3.1]: https://github.com/composer/semver/compare/3.3.0...3.3.1 [3.3.0]: https://github.com/composer/semver/compare/3.2.9...3.3.0 diff --git a/app/vendor/composer/semver/README.md b/app/vendor/composer/semver/README.md index 35db99a5c..767784906 100644 --- a/app/vendor/composer/semver/README.md +++ b/app/vendor/composer/semver/README.md @@ -6,8 +6,9 @@ Semver (Semantic Versioning) library that offers utilities, version constraint p Originally written as part of [composer/composer](https://github.com/composer/composer), now extracted and made available as a stand-alone library. -[![Continuous Integration](https://github.com/composer/semver/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/composer/semver/actions) - +[![Continuous Integration](https://github.com/composer/semver/actions/workflows/continuous-integration.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/continuous-integration.yml) +[![PHP Lint](https://github.com/composer/semver/actions/workflows/lint.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/lint.yml) +[![PHPStan](https://github.com/composer/semver/actions/workflows/phpstan.yml/badge.svg?branch=main)](https://github.com/composer/semver/actions/workflows/phpstan.yml) Installation ------------ @@ -15,7 +16,7 @@ Installation Install the latest version with: ```bash -$ composer require composer/semver +composer require composer/semver ``` diff --git a/app/vendor/composer/semver/composer.json b/app/vendor/composer/semver/composer.json index ba78676dd..f3a6f4cc6 100644 --- a/app/vendor/composer/semver/composer.json +++ b/app/vendor/composer/semver/composer.json @@ -27,7 +27,7 @@ } ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues" }, "require": { diff --git a/app/vendor/composer/semver/phpstan-baseline.neon b/app/vendor/composer/semver/phpstan-baseline.neon new file mode 100644 index 000000000..933cf2031 --- /dev/null +++ b/app/vendor/composer/semver/phpstan-baseline.neon @@ -0,0 +1,11 @@ +parameters: + ignoreErrors: + - + message: "#^Parameter \\#1 \\$operator of class Composer\\\\Semver\\\\Constraint\\\\Constraint constructor expects '\\!\\='\\|'\\<'\\|'\\<\\='\\|'\\<\\>'\\|'\\='\\|'\\=\\='\\|'\\>'\\|'\\>\\=', non\\-falsy\\-string given\\.$#" + count: 1 + path: src/VersionParser.php + + - + message: "#^Strict comparison using \\=\\=\\= between null and non\\-empty\\-string will always evaluate to false\\.$#" + count: 2 + path: src/VersionParser.php diff --git a/app/vendor/composer/semver/src/VersionParser.php b/app/vendor/composer/semver/src/VersionParser.php index 202ce2473..9318629a7 100644 --- a/app/vendor/composer/semver/src/VersionParser.php +++ b/app/vendor/composer/semver/src/VersionParser.php @@ -134,15 +134,15 @@ public function normalize($version, $fullVersion = null) } // match classical versioning - if (preg_match('{^v?(\d{1,5})(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { + if (preg_match('{^v?(\d{1,5}+)(\.\d++)?(\.\d++)?(\.\d++)?' . self::$modifierRegex . '$}i', $version, $matches)) { $version = $matches[1] . (!empty($matches[2]) ? $matches[2] : '.0') . (!empty($matches[3]) ? $matches[3] : '.0') . (!empty($matches[4]) ? $matches[4] : '.0'); $index = 5; // match date(time) based versioning - } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) { - $version = preg_replace('{\D}', '.', $matches[1]); + } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3}){0,2})' . self::$modifierRegex . '$}i', $version, $matches)) { + $version = (string) preg_replace('{\D}', '.', $matches[1]); $index = 2; } @@ -260,16 +260,16 @@ public function parseConstraints($constraints) } $orGroups = array(); - foreach ($orConstraints as $constraints) { - $andConstraints = preg_split('{(?< ,]) *(?< ,]) *(? 1) { $constraintObjects = array(); - foreach ($andConstraints as $constraint) { - foreach ($this->parseConstraint($constraint) as $parsedConstraint) { - $constraintObjects[] = $parsedConstraint; + foreach ($andConstraints as $andConstraint) { + foreach ($this->parseConstraint($andConstraint) as $parsedAndConstraint) { + $constraintObjects[] = $parsedAndConstraint; } } } else { @@ -285,11 +285,11 @@ public function parseConstraints($constraints) $orGroups[] = $constraint; } - $constraint = MultiConstraint::create($orGroups, false); + $parsedConstraint = MultiConstraint::create($orGroups, false); - $constraint->setPrettyString($prettyConstraint); + $parsedConstraint->setPrettyString($prettyConstraint); - return $constraint; + return $parsedConstraint; } /** diff --git a/app/vendor/doctrine/dbal/CONTRIBUTING.md b/app/vendor/doctrine/dbal/CONTRIBUTING.md index c2555ebbd..31b6eff1f 100644 --- a/app/vendor/doctrine/dbal/CONTRIBUTING.md +++ b/app/vendor/doctrine/dbal/CONTRIBUTING.md @@ -1,4 +1,6 @@ +This repository has [guidelines specific to testing][testing guidelines], and Doctrine has [general contributing guidelines][contributor workflow], make -sure you follow them. +sure you follow both. [contributor workflow]: https://www.doctrine-project.org/contribute/index.html +[testing guidelines]: https://www.doctrine-project.org/projects/doctrine-dbal/en/stable/reference/testing.html diff --git a/app/vendor/doctrine/dbal/composer.json b/app/vendor/doctrine/dbal/composer.json index 3ba155d5f..f43549ad5 100644 --- a/app/vendor/doctrine/dbal/composer.json +++ b/app/vendor/doctrine/dbal/composer.json @@ -40,13 +40,14 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "11.1.0", + "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", - "jetbrains/phpstorm-stubs": "2022.3", - "phpstan/phpstan": "1.10.3", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.35", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "9.6.4", + "phpunit/phpunit": "9.6.13", "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", "squizlabs/php_codesniffer": "3.7.2", "symfony/cache": "^5.4|^6.0", "symfony/console": "^4.4|^5.4|^6.0", diff --git a/app/vendor/doctrine/dbal/src/ArrayParameterType.php b/app/vendor/doctrine/dbal/src/ArrayParameterType.php index 5d40a0077..65e1a29c2 100644 --- a/app/vendor/doctrine/dbal/src/ArrayParameterType.php +++ b/app/vendor/doctrine/dbal/src/ArrayParameterType.php @@ -19,12 +19,17 @@ final class ArrayParameterType */ public const ASCII = ParameterType::ASCII + Connection::ARRAY_PARAM_OFFSET; + /** + * Represents an array of ascii strings to be expanded by Doctrine SQL parsing. + */ + public const BINARY = ParameterType::BINARY + Connection::ARRAY_PARAM_OFFSET; + /** * @internal * - * @psalm-param self::INTEGER|self::STRING|self::ASCII $type + * @psalm-param self::* $type * - * @psalm-return ParameterType::INTEGER|ParameterType::STRING|ParameterType::ASCII + * @psalm-return ParameterType::INTEGER|ParameterType::STRING|ParameterType::ASCII|ParameterType::BINARY */ public static function toElementParameterType(int $type): int { diff --git a/app/vendor/doctrine/dbal/src/Cache/ArrayResult.php b/app/vendor/doctrine/dbal/src/Cache/ArrayResult.php index 93b93d176..ce1283ba9 100644 --- a/app/vendor/doctrine/dbal/src/Cache/ArrayResult.php +++ b/app/vendor/doctrine/dbal/src/Cache/ArrayResult.php @@ -30,7 +30,7 @@ public function __construct(array $data) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchNumeric() { @@ -44,7 +44,7 @@ public function fetchNumeric() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAssociative() { @@ -52,7 +52,7 @@ public function fetchAssociative() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchOne() { @@ -66,7 +66,7 @@ public function fetchOne() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllNumeric(): array { @@ -74,7 +74,7 @@ public function fetchAllNumeric(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllAssociative(): array { @@ -82,7 +82,7 @@ public function fetchAllAssociative(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchFirstColumn(): array { diff --git a/app/vendor/doctrine/dbal/src/Configuration.php b/app/vendor/doctrine/dbal/src/Configuration.php index 8d8c8ee2d..5cdae8135 100644 --- a/app/vendor/doctrine/dbal/src/Configuration.php +++ b/app/vendor/doctrine/dbal/src/Configuration.php @@ -56,6 +56,14 @@ class Configuration */ protected $autoCommit = true; + /** + * Whether type comments should be disabled to provide the same DB schema than + * will be obtained with DBAL 4.x. This is useful when relying only on the + * platform-aware schema comparison (which does not need those type comments) + * rather than the deprecated legacy tooling. + */ + private bool $disableTypeComments = false; + private ?SchemaManagerFactory $schemaManagerFactory = null; public function __construct() @@ -241,4 +249,17 @@ public function setSchemaManagerFactory(SchemaManagerFactory $schemaManagerFacto return $this; } + + public function getDisableTypeComments(): bool + { + return $this->disableTypeComments; + } + + /** @return $this */ + public function setDisableTypeComments(bool $disableTypeComments): self + { + $this->disableTypeComments = $disableTypeComments; + + return $this; + } } diff --git a/app/vendor/doctrine/dbal/src/Connection.php b/app/vendor/doctrine/dbal/src/Connection.php index a2a0a996c..d84dc3158 100644 --- a/app/vendor/doctrine/dbal/src/Connection.php +++ b/app/vendor/doctrine/dbal/src/Connection.php @@ -209,6 +209,7 @@ public function __construct( $this->platform = $params['platform']; $this->platform->setEventManager($this->_eventManager); + $this->platform->setDisableTypeComments($config->getDisableTypeComments()); } $this->_expr = $this->createExpressionBuilder(); @@ -315,6 +316,7 @@ public function getDatabasePlatform() if ($this->platform === null) { $this->platform = $this->detectDatabasePlatform(); $this->platform->setEventManager($this->_eventManager); + $this->platform->setDisableTypeComments($this->_config->getDisableTypeComments()); } return $this->platform; @@ -440,6 +442,10 @@ private function getDatabasePlatformVersion() return $this->params['serverVersion']; } + if (isset($this->params['primary']) && isset($this->params['primary']['serverVersion'])) { + return $this->params['primary']['serverVersion']; + } + // If not connected, we need to connect now to determine the platform version. if ($this->_conn === null) { try { @@ -1051,7 +1057,7 @@ public function prepare(string $sql): Statement } /** - * Executes an, optionally parametrized, SQL query. + * Executes an, optionally parameterized, SQL query. * * If the query is parametrized, a prepared statement is used. * If an SQLLogger is configured, the execution is logged. @@ -1915,6 +1921,7 @@ private function needsArrayParameterConversion(array $params, array $types): boo $type === ArrayParameterType::INTEGER || $type === ArrayParameterType::STRING || $type === ArrayParameterType::ASCII + || $type === ArrayParameterType::BINARY ) { return true; } @@ -1940,33 +1947,54 @@ private function handleDriverException( /** * BC layer for a wide-spread use-case of old DBAL APIs * - * @deprecated This API is deprecated and will be removed after 2022 + * @deprecated Use {@see executeStatement()} instead * * @param array $params The query parameters * @param array $types The parameter types */ public function executeUpdate(string $sql, array $params = [], array $types = []): int { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/4163', + '%s is deprecated, please use executeStatement() instead.', + __METHOD__, + ); + return $this->executeStatement($sql, $params, $types); } /** * BC layer for a wide-spread use-case of old DBAL APIs * - * @deprecated This API is deprecated and will be removed after 2022 + * @deprecated Use {@see executeQuery()} instead */ public function query(string $sql): Result { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/4163', + '%s is deprecated, please use executeQuery() instead.', + __METHOD__, + ); + return $this->executeQuery($sql); } /** * BC layer for a wide-spread use-case of old DBAL APIs * - * @deprecated This API is deprecated and will be removed after 2022 + * @deprecated please use {@see executeStatement()} instead */ public function exec(string $sql): int { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/4163', + '%s is deprecated, please use executeStatement() instead.', + __METHOD__, + ); + return $this->executeStatement($sql); } } diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractDB2Driver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractDB2Driver.php index 3a08312d6..79efb8650 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractDB2Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractDB2Driver.php @@ -3,23 +3,27 @@ namespace Doctrine\DBAL\Driver; use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Driver; use Doctrine\DBAL\Driver\API\ExceptionConverter as ExceptionConverterInterface; use Doctrine\DBAL\Driver\API\IBMDB2\ExceptionConverter; +use Doctrine\DBAL\Exception as DBALException; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\DBAL\Platforms\DB2111Platform; use Doctrine\DBAL\Platforms\DB2Platform; use Doctrine\DBAL\Schema\DB2SchemaManager; +use Doctrine\DBAL\VersionAwarePlatformDriver; use Doctrine\Deprecations\Deprecation; use function assert; +use function preg_match; +use function version_compare; /** * Abstract base implementation of the {@see Driver} interface for IBM DB2 based drivers. */ -abstract class AbstractDB2Driver implements Driver +abstract class AbstractDB2Driver implements VersionAwarePlatformDriver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -27,7 +31,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link DB2Platform::createSchemaManager()} instead. */ @@ -49,4 +53,48 @@ public function getExceptionConverter(): ExceptionConverterInterface { return new ExceptionConverter(); } + + /** + * {@inheritDoc} + */ + public function createDatabasePlatformForVersion($version) + { + if (version_compare($this->getVersionNumber($version), '11.1', '>=')) { + return new DB2111Platform(); + } + + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/5156', + 'IBM DB2 < 11.1 support is deprecated and will be removed in DBAL 4.' + . ' Consider upgrading to IBM DB2 11.1 or later.', + ); + + return $this->getDatabasePlatform(); + } + + /** + * Detects IBM DB2 server version + * + * @param string $versionString Version string as returned by IBM DB2 server, i.e. 'DB2/LINUXX8664 11.5.8.0' + * + * @throws DBALException + */ + private function getVersionNumber(string $versionString): string + { + if ( + preg_match( + '/^(?:[^\s]+\s)?(?P\d+)\.(?P\d+)\.(?P\d+)/i', + $versionString, + $versionParts, + ) === 0 + ) { + throw DBALException::invalidPlatformVersionSpecified( + $versionString, + '^(?:[^\s]+\s)?..', + ); + } + + return $versionParts['major'] . '.' . $versionParts['minor'] . '.' . $versionParts['patch']; + } } diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractException.php b/app/vendor/doctrine/dbal/src/Driver/AbstractException.php index d4d20aa34..389f82e70 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractException.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractException.php @@ -35,7 +35,7 @@ public function __construct($message, $sqlState = null, $code = 0, ?Throwable $p } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLState() { diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractMySQLDriver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractMySQLDriver.php index 64f239a1a..5f6ffd6f5 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractMySQLDriver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractMySQLDriver.php @@ -9,6 +9,8 @@ use Doctrine\DBAL\Platforms\AbstractMySQLPlatform; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\DBAL\Platforms\MariaDb1027Platform; +use Doctrine\DBAL\Platforms\MariaDb1043Platform; +use Doctrine\DBAL\Platforms\MariaDb1052Platform; use Doctrine\DBAL\Platforms\MySQL57Platform; use Doctrine\DBAL\Platforms\MySQL80Platform; use Doctrine\DBAL\Platforms\MySQLPlatform; @@ -27,18 +29,35 @@ abstract class AbstractMySQLDriver implements VersionAwarePlatformDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @throws Exception */ public function createDatabasePlatformForVersion($version) { $mariadb = stripos($version, 'mariadb') !== false; - if ($mariadb && version_compare($this->getMariaDbMysqlVersionNumber($version), '10.2.7', '>=')) { - return new MariaDb1027Platform(); - } - if (! $mariadb) { + if ($mariadb) { + $mariaDbVersion = $this->getMariaDbMysqlVersionNumber($version); + if (version_compare($mariaDbVersion, '10.5.2', '>=')) { + return new MariaDb1052Platform(); + } + + if (version_compare($mariaDbVersion, '10.4.3', '>=')) { + return new MariaDb1043Platform(); + } + + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6110', + 'Support for MariaDB < 10.4 is deprecated and will be removed in DBAL 4.' + . ' Consider upgrading to a more recent version of MariaDB.', + ); + + if (version_compare($mariaDbVersion, '10.2.7', '>=')) { + return new MariaDb1027Platform(); + } + } else { $oracleMysqlVersion = $this->getOracleMysqlVersionNumber($version); if (version_compare($oracleMysqlVersion, '8', '>=')) { if (! version_compare($version, '8.0.0', '>=')) { @@ -65,14 +84,14 @@ public function createDatabasePlatformForVersion($version) return new MySQL57Platform(); } - } - Deprecation::trigger( - 'doctrine/dbal', - 'https://github.com/doctrine/dbal/pull/5060', - 'MySQL 5.6 support is deprecated and will be removed in DBAL 4.' + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/5072', + 'MySQL 5.6 support is deprecated and will be removed in DBAL 4.' . ' Consider upgrading to MySQL 5.7 or later.', - ); + ); + } return $this->getDatabasePlatform(); } @@ -148,7 +167,7 @@ private function getMariaDbMysqlVersionNumber(string $versionString): string } /** - * {@inheritdoc} + * {@inheritDoc} * * @return AbstractMySQLPlatform */ @@ -158,7 +177,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link AbstractMySQLPlatform::createSchemaManager()} instead. * diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver.php index f1bec9167..b0f92453a 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractOracleDriver.php @@ -20,7 +20,7 @@ abstract class AbstractOracleDriver implements Driver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -28,7 +28,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link OraclePlatform::createSchemaManager()} instead. */ diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractPostgreSQLDriver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractPostgreSQLDriver.php index 69e4baff3..099630d33 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractPostgreSQLDriver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractPostgreSQLDriver.php @@ -24,7 +24,7 @@ abstract class AbstractPostgreSQLDriver implements VersionAwarePlatformDriver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function createDatabasePlatformForVersion($version) { @@ -55,7 +55,7 @@ public function createDatabasePlatformForVersion($version) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -63,7 +63,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link PostgreSQLPlatform::createSchemaManager()} instead. */ diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractSQLServerDriver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractSQLServerDriver.php index c5d79feef..b9a99552e 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractSQLServerDriver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractSQLServerDriver.php @@ -20,7 +20,7 @@ abstract class AbstractSQLServerDriver implements Driver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -28,7 +28,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link SQLServerPlatform::createSchemaManager()} instead. */ diff --git a/app/vendor/doctrine/dbal/src/Driver/AbstractSQLiteDriver.php b/app/vendor/doctrine/dbal/src/Driver/AbstractSQLiteDriver.php index 3c9d2c714..f8808f756 100644 --- a/app/vendor/doctrine/dbal/src/Driver/AbstractSQLiteDriver.php +++ b/app/vendor/doctrine/dbal/src/Driver/AbstractSQLiteDriver.php @@ -19,7 +19,7 @@ abstract class AbstractSQLiteDriver implements Driver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -27,7 +27,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link SqlitePlatform::createSchemaManager()} instead. */ diff --git a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Connection.php b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Connection.php index 1eb913e35..dfb11c236 100644 --- a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Connection.php @@ -43,7 +43,7 @@ public function __construct($connection) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getServerVersion() { @@ -70,7 +70,7 @@ public function query(string $sql): ResultInterface } /** - * {@inheritdoc} + * {@inheritDoc} */ public function quote($value, $type = ParameterType::STRING) { @@ -95,7 +95,7 @@ public function exec(string $sql): int } /** - * {@inheritdoc} + * {@inheritDoc} */ public function lastInsertId($name = null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Driver.php b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Driver.php index 897d8a244..7650db5f4 100644 --- a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Driver.php @@ -12,7 +12,7 @@ final class Driver extends AbstractDB2Driver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Statement.php b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Statement.php index 4cfb135d0..699e236d7 100644 --- a/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/IBMDB2/Statement.php @@ -56,7 +56,7 @@ public function __construct($stmt) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { @@ -75,7 +75,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. */ @@ -132,7 +132,7 @@ private function bind($position, &$variable, int $parameterType, int $dataType): } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { @@ -182,6 +182,8 @@ private function bindLobs(): array } else { $this->bind($param, $value, DB2_PARAM_IN, DB2_CHAR); } + + unset($value); } return $handles; diff --git a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractConnectionMiddleware.php b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractConnectionMiddleware.php index 6dab1cf13..f2809cd0a 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractConnectionMiddleware.php +++ b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractConnectionMiddleware.php @@ -34,7 +34,7 @@ public function query(string $sql): Result } /** - * {@inheritdoc} + * {@inheritDoc} */ public function quote($value, $type = ParameterType::STRING) { @@ -47,7 +47,7 @@ public function exec(string $sql): int } /** - * {@inheritdoc} + * {@inheritDoc} */ public function lastInsertId($name = null) { @@ -63,7 +63,7 @@ public function lastInsertId($name = null) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function beginTransaction() { @@ -71,7 +71,7 @@ public function beginTransaction() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function commit() { @@ -79,7 +79,7 @@ public function commit() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function rollBack() { @@ -87,7 +87,7 @@ public function rollBack() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getServerVersion() { diff --git a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractDriverMiddleware.php b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractDriverMiddleware.php index 6fb8b5950..1c9d43097 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractDriverMiddleware.php +++ b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractDriverMiddleware.php @@ -20,7 +20,7 @@ public function __construct(Driver $wrappedDriver) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function connect( #[SensitiveParameter] @@ -30,7 +30,7 @@ public function connect( } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDatabasePlatform() { @@ -38,7 +38,7 @@ public function getDatabasePlatform() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@link AbstractPlatform::createSchemaManager()} instead. */ @@ -60,7 +60,7 @@ public function getExceptionConverter(): ExceptionConverter } /** - * {@inheritdoc} + * {@inheritDoc} */ public function createDatabasePlatformForVersion($version) { diff --git a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractResultMiddleware.php b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractResultMiddleware.php index de90207b0..198d39b0d 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractResultMiddleware.php +++ b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractResultMiddleware.php @@ -14,7 +14,7 @@ public function __construct(Result $result) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchNumeric() { @@ -22,7 +22,7 @@ public function fetchNumeric() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAssociative() { @@ -30,7 +30,7 @@ public function fetchAssociative() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchOne() { @@ -38,7 +38,7 @@ public function fetchOne() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllNumeric(): array { @@ -46,7 +46,7 @@ public function fetchAllNumeric(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllAssociative(): array { @@ -54,7 +54,7 @@ public function fetchAllAssociative(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchFirstColumn(): array { diff --git a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractStatementMiddleware.php b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractStatementMiddleware.php index 70e8df637..6cd2f8f08 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractStatementMiddleware.php +++ b/app/vendor/doctrine/dbal/src/Driver/Middleware/AbstractStatementMiddleware.php @@ -19,7 +19,7 @@ public function __construct(Statement $wrappedStatement) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING) { @@ -36,7 +36,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. */ @@ -62,7 +62,7 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): Result { diff --git a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Connection.php b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Connection.php index 78112d825..d492684cc 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Connection.php @@ -71,7 +71,7 @@ public function query(string $sql): ResultInterface } /** - * {@inheritdoc} + * {@inheritDoc} */ public function quote($value, $type = ParameterType::STRING) { @@ -94,7 +94,7 @@ public function exec(string $sql): int } /** - * {@inheritdoc} + * {@inheritDoc} */ public function lastInsertId($name = null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Driver.php b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Driver.php index 1c804069d..4f5186875 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Driver.php @@ -16,7 +16,7 @@ final class Driver extends AbstractMySQLDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Result.php b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Result.php index c096e6d76..c7dc65d1d 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Result.php +++ b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Result.php @@ -85,7 +85,7 @@ public function __construct(mysqli_stmt $statement) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchNumeric() { @@ -127,7 +127,7 @@ public function fetchAssociative() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchOne() { @@ -135,7 +135,7 @@ public function fetchOne() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllNumeric(): array { @@ -143,7 +143,7 @@ public function fetchAllNumeric(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchAllAssociative(): array { @@ -151,7 +151,7 @@ public function fetchAllAssociative(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ public function fetchFirstColumn(): array { diff --git a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Statement.php b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Statement.php index 7b7c93129..fec7c95c3 100644 --- a/app/vendor/doctrine/dbal/src/Driver/Mysqli/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/Mysqli/Statement.php @@ -27,8 +27,7 @@ final class Statement implements StatementInterface { - /** @var string[] */ - private static array $paramTypeMap = [ + private const PARAM_TYPE_MAP = [ ParameterType::ASCII => 's', ParameterType::STRING => 's', ParameterType::BINARY => 's', @@ -63,9 +62,11 @@ public function __construct(mysqli_stmt $stmt) } /** - * {@inheritdoc} - * * @deprecated Use {@see bindValue()} instead. + * + * {@inheritDoc} + * + * @psalm-assert ParameterType::* $type */ public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null): bool { @@ -87,18 +88,20 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le ); } - if (! isset(self::$paramTypeMap[$type])) { + if (! isset(self::PARAM_TYPE_MAP[$type])) { throw UnknownParameterType::new($type); } $this->boundValues[$param] =& $variable; - $this->types[$param - 1] = self::$paramTypeMap[$type]; + $this->types[$param - 1] = self::PARAM_TYPE_MAP[$type]; return true; } /** - * {@inheritdoc} + * {@inheritDoc} + * + * @psalm-assert ParameterType::* $type */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { @@ -113,19 +116,19 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool ); } - if (! isset(self::$paramTypeMap[$type])) { + if (! isset(self::PARAM_TYPE_MAP[$type])) { throw UnknownParameterType::new($type); } $this->values[$param] = $value; $this->boundValues[$param] =& $this->values[$param]; - $this->types[$param - 1] = self::$paramTypeMap[$type]; + $this->types[$param - 1] = self::PARAM_TYPE_MAP[$type]; return true; } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { @@ -173,10 +176,10 @@ private function bindTypedParameters(): void assert(is_int($parameter)); if (! isset($types[$parameter - 1])) { - $types[$parameter - 1] = self::$paramTypeMap[ParameterType::STRING]; + $types[$parameter - 1] = self::PARAM_TYPE_MAP[ParameterType::STRING]; } - if ($types[$parameter - 1] === self::$paramTypeMap[ParameterType::LARGE_OBJECT]) { + if ($types[$parameter - 1] === self::PARAM_TYPE_MAP[ParameterType::LARGE_OBJECT]) { if (is_resource($value)) { if (get_resource_type($value) !== 'stream') { throw NonStreamResourceUsedAsLargeObject::new($parameter); @@ -187,7 +190,7 @@ private function bindTypedParameters(): void continue; } - $types[$parameter - 1] = self::$paramTypeMap[ParameterType::STRING]; + $types[$parameter - 1] = self::PARAM_TYPE_MAP[ParameterType::STRING]; } $values[$parameter] = $value; diff --git a/app/vendor/doctrine/dbal/src/Driver/OCI8/Connection.php b/app/vendor/doctrine/dbal/src/Driver/OCI8/Connection.php index da4f61aeb..72353fa31 100644 --- a/app/vendor/doctrine/dbal/src/Driver/OCI8/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/OCI8/Connection.php @@ -81,7 +81,7 @@ public function query(string $sql): ResultInterface } /** - * {@inheritdoc} + * {@inheritDoc} */ public function quote($value, $type = ParameterType::STRING) { @@ -104,7 +104,7 @@ public function exec(string $sql): int } /** - * {@inheritdoc} + * {@inheritDoc} * * @param string|null $name * diff --git a/app/vendor/doctrine/dbal/src/Driver/OCI8/Driver.php b/app/vendor/doctrine/dbal/src/Driver/OCI8/Driver.php index 898ecb369..53e563c63 100644 --- a/app/vendor/doctrine/dbal/src/Driver/OCI8/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/OCI8/Driver.php @@ -17,7 +17,7 @@ final class Driver extends AbstractOracleDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php b/app/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php index e707f721c..015a14b7b 100644 --- a/app/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/OCI8/Statement.php @@ -52,7 +52,7 @@ public function __construct($connection, $statement, array $parameterMap, Execut } /** - * {@inheritdoc} + * {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { @@ -69,7 +69,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. */ @@ -137,7 +137,7 @@ private function convertParameterType(int $type): int } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/Connection.php b/app/vendor/doctrine/dbal/src/Driver/PDO/Connection.php index 5eb855a78..290dcc2d2 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/Connection.php @@ -2,6 +2,7 @@ namespace Doctrine\DBAL\Driver\PDO; +use Doctrine\DBAL\Driver\Exception\UnknownParameterType; use Doctrine\DBAL\Driver\PDO\PDOException as DriverPDOException; use Doctrine\DBAL\Driver\Result as ResultInterface; use Doctrine\DBAL\Driver\ServerInfoAwareConnection; @@ -40,7 +41,7 @@ public function exec(string $sql): int } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getServerVersion() { @@ -77,7 +78,11 @@ public function query(string $sql): ResultInterface } /** - * {@inheritdoc} + * {@inheritDoc} + * + * @throws UnknownParameterType + * + * @psalm-assert ParameterType::* $type */ public function quote($value, $type = ParameterType::STRING) { @@ -85,7 +90,7 @@ public function quote($value, $type = ParameterType::STRING) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function lastInsertId($name = null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/MySQL/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PDO/MySQL/Driver.php index f0b836a0e..2492698b4 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/MySQL/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/MySQL/Driver.php @@ -12,7 +12,7 @@ final class Driver extends AbstractMySQLDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/OCI/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PDO/OCI/Driver.php index e8b9aaa9d..10ada9f0e 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/OCI/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/OCI/Driver.php @@ -12,7 +12,7 @@ final class Driver extends AbstractOracleDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/ParameterTypeMap.php b/app/vendor/doctrine/dbal/src/Driver/PDO/ParameterTypeMap.php index bc3ba8165..f17b585f7 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/ParameterTypeMap.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/ParameterTypeMap.php @@ -27,6 +27,8 @@ final class ParameterTypeMap * @psalm-return PDO::PARAM_* * * @throws UnknownParameterType + * + * @psalm-assert ParameterType::* $type */ public static function convertParamType(int $type): int { diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/PgSQL/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PDO/PgSQL/Driver.php index ca7a14d00..1c586d69d 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/PgSQL/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/PgSQL/Driver.php @@ -13,7 +13,7 @@ final class Driver extends AbstractPostgreSQLDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Driver.php index 1e9d7f7d5..63eabb71a 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Driver.php @@ -16,7 +16,7 @@ final class Driver extends AbstractSQLServerDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Statement.php b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Statement.php index edabd410a..cb2dfaedb 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLSrv/Statement.php @@ -2,6 +2,7 @@ namespace Doctrine\DBAL\Driver\PDO\SQLSrv; +use Doctrine\DBAL\Driver\Exception\UnknownParameterType; use Doctrine\DBAL\Driver\Middleware\AbstractStatementMiddleware; use Doctrine\DBAL\Driver\PDO\Statement as PDOStatement; use Doctrine\DBAL\ParameterType; @@ -23,7 +24,7 @@ public function __construct(PDOStatement $statement) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. * @@ -32,6 +33,10 @@ public function __construct(PDOStatement $statement) * @param int $type * @param int|null $length * @param mixed $driverOptions The usage of the argument is deprecated. + * + * @throws UnknownParameterType + * + * @psalm-assert ParameterType::* $type */ public function bindParam( $param, @@ -82,7 +87,11 @@ public function bindParam( } /** - * {@inheritdoc} + * @throws UnknownParameterType + * + * {@inheritDoc} + * + * @psalm-assert ParameterType::* $type */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLite/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLite/Driver.php index 92875cb9b..2e97788e6 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/SQLite/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/SQLite/Driver.php @@ -16,7 +16,7 @@ final class Driver extends AbstractSQLiteDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/PDO/Statement.php b/app/vendor/doctrine/dbal/src/Driver/PDO/Statement.php index 071decbef..64f318d2c 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PDO/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/PDO/Statement.php @@ -2,6 +2,7 @@ namespace Doctrine\DBAL\Driver\PDO; +use Doctrine\DBAL\Driver\Exception\UnknownParameterType; use Doctrine\DBAL\Driver\Result as ResultInterface; use Doctrine\DBAL\Driver\Statement as StatementInterface; use Doctrine\DBAL\ParameterType; @@ -24,7 +25,11 @@ public function __construct(PDOStatement $stmt) } /** - * {@inheritdoc} + * {@inheritDoc} + * + * @throws UnknownParameterType + * + * @psalm-assert ParameterType::* $type */ public function bindValue($param, $value, $type = ParameterType::STRING) { @@ -56,6 +61,10 @@ public function bindValue($param, $value, $type = ParameterType::STRING) * @param int $type * @param int|null $length * @param mixed $driverOptions The usage of the argument is deprecated. + * + * @throws UnknownParameterType + * + * @psalm-assert ParameterType::* $type */ public function bindParam( $param, @@ -104,7 +113,7 @@ public function bindParam( } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { diff --git a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Connection.php b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Connection.php index e316259e3..378e8ed7a 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Connection.php @@ -93,7 +93,7 @@ public function query(string $sql): Result return new Result($result); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function quote($value, $type = ParameterType::STRING) { if ($type === ParameterType::BINARY || $type === ParameterType::LARGE_OBJECT) { @@ -108,7 +108,7 @@ public function exec(string $sql): int return $this->query($sql)->rowCount(); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function lastInsertId($name = null) { if ($name !== null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Driver.php b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Driver.php index 298cac7a6..73c97cd81 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Driver.php @@ -23,7 +23,7 @@ final class Driver extends AbstractPostgreSQLDriver { - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function connect( #[SensitiveParameter] array $params diff --git a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Result.php b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Result.php index 18494bd05..d7ea1db34 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Result.php +++ b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Result.php @@ -60,7 +60,7 @@ public function __destruct() $this->free(); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchNumeric() { if ($this->result === null) { @@ -75,7 +75,7 @@ public function fetchNumeric() return $this->mapNumericRow($row, $this->fetchNumericColumnTypes()); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchAssociative() { if ($this->result === null) { @@ -90,13 +90,13 @@ public function fetchAssociative() return $this->mapAssociativeRow($row, $this->fetchAssociativeColumnTypes()); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchOne() { return FetchUtils::fetchOne($this); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchAllNumeric(): array { if ($this->result === null) { @@ -117,7 +117,7 @@ public function fetchAllNumeric(): array ); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchAllAssociative(): array { if ($this->result === null) { @@ -138,7 +138,7 @@ public function fetchAllAssociative(): array ); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function fetchFirstColumn(): array { if ($this->result === null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Statement.php b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Statement.php index 3a4c81cba..75af66f30 100644 --- a/app/vendor/doctrine/dbal/src/Driver/PgSQL/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/PgSQL/Statement.php @@ -74,7 +74,7 @@ public function __destruct() ); } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { if (! isset($this->parameterMap[$param])) { @@ -87,7 +87,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool return true; } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null): bool { Deprecation::trigger( @@ -124,7 +124,7 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le return true; } - /** {@inheritdoc} */ + /** {@inheritDoc} */ public function execute($params = null): Result { if ($params !== null) { diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Connection.php b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Connection.php index ba1c58c17..16e45d110 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Connection.php @@ -36,7 +36,7 @@ public function __construct($connection) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getServerVersion() { diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Driver.php b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Driver.php index 7ff27fad1..fcbdb7734 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Driver.php @@ -16,7 +16,7 @@ final class Driver extends AbstractSQLServerDriver { /** - * {@inheritdoc} + * {@inheritDoc} * * @return Connection */ diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Statement.php b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Statement.php index 1244ba51a..227c33456 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLSrv/Statement.php @@ -82,7 +82,7 @@ public function __construct($conn, $sql) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { @@ -104,7 +104,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. */ @@ -138,7 +138,7 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Connection.php b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Connection.php index de9a8e031..91b9b5ffe 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Connection.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Connection.php @@ -45,7 +45,7 @@ public function query(string $sql): Result return new Result($result, $this->connection->changes()); } - /** @inheritdoc */ + /** @inheritDoc */ public function quote($value, $type = ParameterType::STRING): string { return sprintf('\'%s\'', SQLite3::escapeString($value)); @@ -62,7 +62,7 @@ public function exec(string $sql): int return $this->connection->changes(); } - /** @inheritdoc */ + /** @inheritDoc */ public function lastInsertId($name = null): int { return $this->connection->lastInsertRowID(); diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Driver.php b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Driver.php index 922f6bd16..fecc4819d 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Driver.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Driver.php @@ -10,7 +10,7 @@ final class Driver extends AbstractSQLiteDriver { /** - * {@inheritdoc} + * {@inheritDoc} */ public function connect( #[SensitiveParameter] diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Result.php b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Result.php index a51bd4e8b..3881e189a 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Result.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Result.php @@ -21,7 +21,7 @@ public function __construct(SQLite3Result $result, int $changes) $this->changes = $changes; } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchNumeric() { if ($this->result === null) { @@ -31,7 +31,7 @@ public function fetchNumeric() return $this->result->fetchArray(SQLITE3_NUM); } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchAssociative() { if ($this->result === null) { @@ -41,25 +41,25 @@ public function fetchAssociative() return $this->result->fetchArray(SQLITE3_ASSOC); } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchOne() { return FetchUtils::fetchOne($this); } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchAllNumeric(): array { return FetchUtils::fetchAllNumeric($this); } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchAllAssociative(): array { return FetchUtils::fetchAllAssociative($this); } - /** @inheritdoc */ + /** @inheritDoc */ public function fetchFirstColumn(): array { return FetchUtils::fetchFirstColumn($this); diff --git a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Statement.php b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Statement.php index 878627a6a..a4166aa61 100644 --- a/app/vendor/doctrine/dbal/src/Driver/SQLite3/Statement.php +++ b/app/vendor/doctrine/dbal/src/Driver/SQLite3/Statement.php @@ -40,7 +40,13 @@ public function __construct(SQLite3 $connection, SQLite3Stmt $statement) $this->statement = $statement; } - /** @inheritdoc */ + /** + * @throws UnknownParameterType + * + * {@inheritDoc} + * + * @psalm-assert ParameterType::* $type + */ public function bindValue($param, $value, $type = ParameterType::STRING): bool { if (func_num_args() < 3) { @@ -55,7 +61,13 @@ public function bindValue($param, $value, $type = ParameterType::STRING): bool return $this->statement->bindValue($param, $value, $this->convertParamType($type)); } - /** @inheritdoc */ + /** + * @throws UnknownParameterType + * + * {@inheritDoc} + * + * @psalm-assert ParameterType::* $type + */ public function bindParam($param, &$variable, $type = ParameterType::STRING, $length = null): bool { Deprecation::trigger( @@ -77,7 +89,7 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le return $this->statement->bindParam($param, $variable, $this->convertParamType($type)); } - /** @inheritdoc */ + /** @inheritDoc */ public function execute($params = null): Result { if ($params !== null) { @@ -108,6 +120,11 @@ public function execute($params = null): Result return new Result($result, $this->connection->changes()); } + /** + * @psalm-return value-of + * + * @psalm-assert ParameterType::* $type + */ private function convertParamType(int $type): int { if (! isset(self::PARAM_TYPE_MAP[$type])) { diff --git a/app/vendor/doctrine/dbal/src/DriverManager.php b/app/vendor/doctrine/dbal/src/DriverManager.php index a57d7a222..056f42084 100644 --- a/app/vendor/doctrine/dbal/src/DriverManager.php +++ b/app/vendor/doctrine/dbal/src/DriverManager.php @@ -23,6 +23,7 @@ * Factory for creating {@see Connection} instances. * * @psalm-type OverrideParams = array{ + * application_name?: string, * charset?: string, * dbname?: string, * default_dbname?: string, @@ -32,14 +33,16 @@ * host?: string, * password?: string, * path?: string, - * pdo?: \PDO, + * persistent?: bool, * platform?: Platforms\AbstractPlatform, * port?: int, + * serverVersion?: string, * url?: string, * user?: string, * unix_socket?: string, * } * @psalm-type Params = array{ + * application_name?: string, * charset?: string, * dbname?: string, * defaultTableOptions?: array, @@ -54,7 +57,7 @@ * memory?: bool, * password?: string, * path?: string, - * pdo?: \PDO, + * persistent?: bool, * platform?: Platforms\AbstractPlatform, * port?: int, * primary?: OverrideParams, @@ -94,7 +97,8 @@ final class DriverManager * * @deprecated Use actual driver names instead. * - * @var string[] + * @var array + * @psalm-var array> */ private static array $driverSchemeAliases = [ 'db2' => 'ibm_db2', @@ -205,10 +209,10 @@ public static function getAvailableDrivers(): array } /** - * @param class-string|null $driverClass - * @param key-of|null $driver - * * @throws Exception + * + * @psalm-assert key-of|null $driver + * @psalm-assert class-string|null $driverClass */ private static function createDriver(?string $driver, ?string $driverClass): Driver { diff --git a/app/vendor/doctrine/dbal/src/Event/Listeners/OracleSessionInit.php b/app/vendor/doctrine/dbal/src/Event/Listeners/OracleSessionInit.php index 6256cdb5b..9598f43cc 100644 --- a/app/vendor/doctrine/dbal/src/Event/Listeners/OracleSessionInit.php +++ b/app/vendor/doctrine/dbal/src/Event/Listeners/OracleSessionInit.php @@ -68,7 +68,7 @@ public function postConnect(ConnectionEventArgs $args) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSubscribedEvents() { diff --git a/app/vendor/doctrine/dbal/src/Event/Listeners/SQLSessionInit.php b/app/vendor/doctrine/dbal/src/Event/Listeners/SQLSessionInit.php index 0f77e9ffc..4ce32d628 100644 --- a/app/vendor/doctrine/dbal/src/Event/Listeners/SQLSessionInit.php +++ b/app/vendor/doctrine/dbal/src/Event/Listeners/SQLSessionInit.php @@ -34,7 +34,7 @@ public function postConnect(ConnectionEventArgs $args) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSubscribedEvents() { diff --git a/app/vendor/doctrine/dbal/src/Event/Listeners/SQLiteSessionInit.php b/app/vendor/doctrine/dbal/src/Event/Listeners/SQLiteSessionInit.php index f2ee05a32..950f05f48 100644 --- a/app/vendor/doctrine/dbal/src/Event/Listeners/SQLiteSessionInit.php +++ b/app/vendor/doctrine/dbal/src/Event/Listeners/SQLiteSessionInit.php @@ -21,7 +21,7 @@ public function postConnect(ConnectionEventArgs $args) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSubscribedEvents() { diff --git a/app/vendor/doctrine/dbal/src/ExpandArrayParameters.php b/app/vendor/doctrine/dbal/src/ExpandArrayParameters.php index 7645acb86..01cccfcd4 100644 --- a/app/vendor/doctrine/dbal/src/ExpandArrayParameters.php +++ b/app/vendor/doctrine/dbal/src/ExpandArrayParameters.php @@ -101,6 +101,7 @@ private function acceptParameter($key, $value): void $type !== ArrayParameterType::INTEGER && $type !== ArrayParameterType::STRING && $type !== ArrayParameterType::ASCII + && $type !== ArrayParameterType::BINARY ) { $this->appendTypedParameter([$value], $type); diff --git a/app/vendor/doctrine/dbal/src/FetchMode.php b/app/vendor/doctrine/dbal/src/FetchMode.php index 4909bc623..d80719f25 100644 --- a/app/vendor/doctrine/dbal/src/FetchMode.php +++ b/app/vendor/doctrine/dbal/src/FetchMode.php @@ -4,6 +4,8 @@ /** * Legacy Class that keeps BC for using the legacy APIs fetch()/fetchAll(). + * + * @deprecated Use the dedicated fetch*() methods for the desired fetch mode instead. */ class FetchMode { diff --git a/app/vendor/doctrine/dbal/src/Id/TableGeneratorSchemaVisitor.php b/app/vendor/doctrine/dbal/src/Id/TableGeneratorSchemaVisitor.php index 9b4724ddf..75c9fe9cf 100644 --- a/app/vendor/doctrine/dbal/src/Id/TableGeneratorSchemaVisitor.php +++ b/app/vendor/doctrine/dbal/src/Id/TableGeneratorSchemaVisitor.php @@ -30,7 +30,7 @@ public function __construct($generatorTableName = 'sequences') } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSchema(Schema $schema) { @@ -41,35 +41,35 @@ public function acceptSchema(Schema $schema) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptColumn(Table $table, Column $column) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptIndex(Table $table, Index $index) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSequence(Sequence $sequence) { diff --git a/app/vendor/doctrine/dbal/src/Logging/DebugStack.php b/app/vendor/doctrine/dbal/src/Logging/DebugStack.php index e8539e584..1a970d060 100644 --- a/app/vendor/doctrine/dbal/src/Logging/DebugStack.php +++ b/app/vendor/doctrine/dbal/src/Logging/DebugStack.php @@ -43,7 +43,7 @@ public function __construct() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function startQuery($sql, ?array $params = null, ?array $types = null) { @@ -62,7 +62,7 @@ public function startQuery($sql, ?array $params = null, ?array $types = null) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function stopQuery() { diff --git a/app/vendor/doctrine/dbal/src/Logging/LoggerChain.php b/app/vendor/doctrine/dbal/src/Logging/LoggerChain.php index 3c62a1d8e..7a4eaa49a 100644 --- a/app/vendor/doctrine/dbal/src/Logging/LoggerChain.php +++ b/app/vendor/doctrine/dbal/src/Logging/LoggerChain.php @@ -27,7 +27,7 @@ public function __construct(iterable $loggers = []) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function startQuery($sql, ?array $params = null, ?array $types = null) { @@ -37,7 +37,7 @@ public function startQuery($sql, ?array $params = null, ?array $types = null) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function stopQuery() { diff --git a/app/vendor/doctrine/dbal/src/Logging/Statement.php b/app/vendor/doctrine/dbal/src/Logging/Statement.php index 95d603586..039b93b6a 100644 --- a/app/vendor/doctrine/dbal/src/Logging/Statement.php +++ b/app/vendor/doctrine/dbal/src/Logging/Statement.php @@ -36,7 +36,7 @@ public function __construct(StatementInterface $statement, LoggerInterface $logg } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see bindValue()} instead. */ @@ -65,7 +65,7 @@ public function bindParam($param, &$variable, $type = ParameterType::STRING, $le } /** - * {@inheritdoc} + * {@inheritDoc} */ public function bindValue($param, $value, $type = ParameterType::STRING) { @@ -85,7 +85,7 @@ public function bindValue($param, $value, $type = ParameterType::STRING) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { diff --git a/app/vendor/doctrine/dbal/src/Platforms/AbstractMySQLPlatform.php b/app/vendor/doctrine/dbal/src/Platforms/AbstractMySQLPlatform.php index cdbdbec78..d1e3e5aff 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/AbstractMySQLPlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/AbstractMySQLPlatform.php @@ -14,6 +14,7 @@ use Doctrine\DBAL\TransactionIsolationLevel; use Doctrine\DBAL\Types\BlobType; use Doctrine\DBAL\Types\TextType; +use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\Deprecation; use InvalidArgumentException; @@ -113,7 +114,7 @@ public function getConcatExpression() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -238,7 +239,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed/*, $lengt } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $lengthOmitted = false*/) { @@ -396,6 +397,18 @@ public function getListTableColumnsSQL($table, $database = null) ' ORDER BY ORDINAL_POSITION ASC'; } + /** + * The SQL snippets required to elucidate a column type + * + * Returns an array of the form [column type SELECT snippet, additional JOIN statement snippet] + * + * @return array{string, string} + */ + public function getColumnTypeSQLSnippets(string $tableAlias = 'c'): array + { + return [$tableAlias . '.COLUMN_TYPE', '']; + } + /** @deprecated The SQL used for schema introspection is an implementation detail and should not be relied upon. */ public function getListTableMetadataSQL(string $table, ?string $database = null): string { @@ -510,7 +523,7 @@ protected function _getCreateTableSQL($name, array $columns, array $options = [] } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -983,7 +996,7 @@ private function getRemainingForeignKeyConstraintsRequiringRenamedIndexes(TableD } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getPostAlterTableIndexForeignKeySQL(TableDiff $diff) { @@ -1062,7 +1075,7 @@ public function getSmallIntTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getFloatDeclarationSQL(array $column) { @@ -1070,7 +1083,7 @@ public function getFloatDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDecimalTypeDeclarationSQL(array $column) { @@ -1229,36 +1242,36 @@ public function getReadLockSQL() protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'bigint' => 'bigint', - 'binary' => 'binary', - 'blob' => 'blob', - 'char' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'decimal' => 'decimal', - 'double' => 'float', - 'float' => 'float', - 'int' => 'integer', - 'integer' => 'integer', - 'longblob' => 'blob', - 'longtext' => 'text', - 'mediumblob' => 'blob', - 'mediumint' => 'integer', - 'mediumtext' => 'text', - 'numeric' => 'decimal', - 'real' => 'float', - 'set' => 'simple_array', - 'smallint' => 'smallint', - 'string' => 'string', - 'text' => 'text', - 'time' => 'time', - 'timestamp' => 'datetime', - 'tinyblob' => 'blob', - 'tinyint' => 'boolean', - 'tinytext' => 'text', - 'varbinary' => 'binary', - 'varchar' => 'string', - 'year' => 'date', + 'bigint' => Types::BIGINT, + 'binary' => Types::BINARY, + 'blob' => Types::BLOB, + 'char' => Types::STRING, + 'date' => Types::DATE_MUTABLE, + 'datetime' => Types::DATETIME_MUTABLE, + 'decimal' => Types::DECIMAL, + 'double' => Types::FLOAT, + 'float' => Types::FLOAT, + 'int' => Types::INTEGER, + 'integer' => Types::INTEGER, + 'longblob' => Types::BLOB, + 'longtext' => Types::TEXT, + 'mediumblob' => Types::BLOB, + 'mediumint' => Types::INTEGER, + 'mediumtext' => Types::TEXT, + 'numeric' => Types::DECIMAL, + 'real' => Types::FLOAT, + 'set' => Types::SIMPLE_ARRAY, + 'smallint' => Types::SMALLINT, + 'string' => Types::STRING, + 'text' => Types::TEXT, + 'time' => Types::TIME_MUTABLE, + 'timestamp' => Types::DATETIME_MUTABLE, + 'tinyblob' => Types::BLOB, + 'tinyint' => Types::BOOLEAN, + 'tinytext' => Types::TEXT, + 'varbinary' => Types::BINARY, + 'varchar' => Types::STRING, + 'year' => Types::DATE_MUTABLE, ]; } @@ -1279,7 +1292,7 @@ public function getVarcharMaxLength() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -1368,7 +1381,7 @@ public function getBlobTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function quoteStringLiteral($str) { @@ -1378,7 +1391,7 @@ public function quoteStringLiteral($str) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDefaultTransactionIsolationLevel() { @@ -1390,7 +1403,7 @@ public function supportsColumnLengthIndexes(): bool return true; } - private function getDatabaseNameSQL(?string $databaseName): string + protected function getDatabaseNameSQL(?string $databaseName): string { if ($databaseName !== null) { return $this->quoteStringLiteral($databaseName); diff --git a/app/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php b/app/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php index 28e0782e8..eba3aefc8 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/AbstractPlatform.php @@ -103,6 +103,14 @@ abstract class AbstractPlatform */ protected $_keywords; + private bool $disableTypeComments = false; + + /** @internal */ + final public function setDisableTypeComments(bool $value): void + { + $this->disableTypeComments = $value; + } + /** * Sets the EventManager used by the Platform. * @@ -578,7 +586,7 @@ protected function getColumnComment(Column $column) $comment = $column->getComment(); - if ($column->getType()->requiresSQLCommentHint($this)) { + if (! $this->disableTypeComments && $column->getType()->requiresSQLCommentHint($this)) { $comment .= $this->getDoctrineTypeComment($column->getType()); } @@ -1705,7 +1713,7 @@ public function getDateSubYearsExpression($date, $years) * @param string $operator The arithmetic operator (+ or -). * @param int|numeric-string $interval The interval that shall be calculated into the date. * @param string $unit The unit of the interval that shall be calculated into the date. - * One of the DATE_INTERVAL_UNIT_* constants. + * One of the {@see DateIntervalUnit} constants. * * @return string * @@ -4155,7 +4163,7 @@ public function getDefaultSchemaName() */ public function supportsCreateDropDatabase() { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5513', '%s is deprecated.', @@ -4626,6 +4634,10 @@ public function columnsEqual(Column $column1, Column $column2): bool return false; } + if (! $this->columnDeclarationsMatch($column1, $column2)) { + return false; + } + // If the platform supports inline comments, all comparison is already done above if ($this->supportsInlineColumnComments()) { return true; @@ -4638,6 +4650,17 @@ public function columnsEqual(Column $column1, Column $column2): bool return $column1->getType() === $column2->getType(); } + /** + * Whether the database data type matches that expected for the doctrine type for the given colunms. + */ + private function columnDeclarationsMatch(Column $column1, Column $column2): bool + { + return ! ( + $column1->hasPlatformOption('declarationMismatch') || + $column2->hasPlatformOption('declarationMismatch') + ); + } + /** * Creates the schema manager that can be used to inspect and change the underlying * database schema according to the dialect of the platform. diff --git a/app/vendor/doctrine/dbal/src/Platforms/DB2111Platform.php b/app/vendor/doctrine/dbal/src/Platforms/DB2111Platform.php new file mode 100644 index 000000000..40ab42f6e --- /dev/null +++ b/app/vendor/doctrine/dbal/src/Platforms/DB2111Platform.php @@ -0,0 +1,40 @@ + 0) { + $query .= sprintf(' OFFSET %u ROWS', $offset); + } + + if ($limit !== null) { + if ($limit < 0) { + throw new Exception(sprintf('Limit must be a positive integer or zero, %d given', $limit)); + } + + $query .= sprintf(' FETCH %s %u ROWS ONLY', $offset === 0 ? 'FIRST' : 'NEXT', $limit); + } + + return $query; + } +} diff --git a/app/vendor/doctrine/dbal/src/Platforms/DB2Platform.php b/app/vendor/doctrine/dbal/src/Platforms/DB2Platform.php index c40a03e6d..b203ce8a0 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/DB2Platform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/DB2Platform.php @@ -23,10 +23,32 @@ use function sprintf; use function strpos; +/** + * Provides the behavior, features and SQL dialect of the IBM DB2 database platform of the oldest supported version. + */ class DB2Platform extends AbstractPlatform { + /** @see https://www.ibm.com/docs/en/db2/11.5?topic=views-syscatcolumns */ + private const SYSCAT_COLUMNS_GENERATED_DEFAULT = 'D'; + + /** @see https://www.ibm.com/docs/en/db2/11.5?topic=views-syscatindexes */ + private const SYSCAT_INDEXES_UNIQUERULE_PERMITS_DUPLICATES = 'D'; + private const SYSCAT_INDEXES_UNIQUERULE_IMPLEMENTS_PRIMARY_KEY = 'P'; + + /** @see https://www.ibm.com/docs/en/db2/11.5?topic=views-syscattabconst */ + private const SYSCAT_TABCONST_TYPE_PRIMARY_KEY = 'P'; + + /** @see https://www.ibm.com/docs/en/db2/11.5?topic=views-syscatreferences */ + private const SYSCAT_REFERENCES_UPDATERULE_RESTRICT = 'R'; + private const SYSCAT_REFERENCES_DELETERULE_CASCADE = 'C'; + private const SYSCAT_REFERENCES_DELETERULE_SET_NULL = 'N'; + private const SYSCAT_REFERENCES_DELETERULE_RESTRICT = 'R'; + + /** @see https://www.ibm.com/docs/en/db2-for-zos/11?topic=tables-systables */ + private const SYSIBM_SYSTABLES_TYPE_TABLE = 'T'; + /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -35,14 +57,15 @@ public function getCharMaxLength(): int Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3263', - 'DB2Platform::getCharMaxLength() is deprecated.', + '%s() is deprecated.', + __METHOD__, ); return 254; } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -51,14 +74,15 @@ public function getBinaryMaxLength() Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/3263', - 'DB2Platform::getBinaryMaxLength() is deprecated.', + '%s() is deprecated.', + __METHOD__, ); return 32704; } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -101,33 +125,33 @@ public function getBlobTypeDeclarationSQL(array $column) protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'bigint' => 'bigint', - 'binary' => 'binary', - 'blob' => 'blob', - 'character' => 'string', - 'clob' => 'text', - 'date' => 'date', - 'decimal' => 'decimal', - 'double' => 'float', - 'integer' => 'integer', - 'real' => 'float', - 'smallint' => 'smallint', - 'time' => 'time', - 'timestamp' => 'datetime', - 'varbinary' => 'binary', - 'varchar' => 'string', + 'bigint' => Types::BIGINT, + 'binary' => Types::BINARY, + 'blob' => Types::BLOB, + 'character' => Types::STRING, + 'clob' => Types::TEXT, + 'date' => Types::DATE_MUTABLE, + 'decimal' => Types::DECIMAL, + 'double' => Types::FLOAT, + 'integer' => Types::INTEGER, + 'real' => Types::FLOAT, + 'smallint' => Types::SMALLINT, + 'time' => Types::TIME_MUTABLE, + 'timestamp' => Types::DATETIME_MUTABLE, + 'varbinary' => Types::BINARY, + 'varchar' => Types::STRING, ]; } /** - * {@inheritdoc} + * {@inheritDoc} */ public function isCommentedDoctrineType(Type $doctrineType) { Deprecation::trigger( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5058', - '%s is deprecated and will be removed in Doctrine DBAL 4.0. Use Type::requiresSQLCommentHint() instead.', + '%s() is deprecated and will be removed in Doctrine DBAL 4.0. Use Type::requiresSQLCommentHint() instead.', __METHOD__, ); @@ -159,7 +183,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed/*, $lengt } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $lengthOmitted = false*/) { @@ -192,7 +216,8 @@ public function getName() Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/4749', - 'DB2Platform::getName() is deprecated. Identify platforms by their class.', + '%s() is deprecated. Identify platforms by their class.', + __METHOD__, ); return 'db2'; @@ -244,7 +269,7 @@ protected function _getCommonIntegerTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBitAndComparisonExpression($value1, $value2) { @@ -252,7 +277,7 @@ public function getBitAndComparisonExpression($value1, $value2) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBitOrComparisonExpression($value1, $value2) { @@ -260,7 +285,7 @@ public function getBitOrComparisonExpression($value1, $value2) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -280,7 +305,7 @@ protected function getDateArithmeticIntervalExpression($date, $operator, $interv } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDateDiffExpression($date1, $date2) { @@ -316,7 +341,7 @@ public function getTimeTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getTruncateTableSQL($tableName, $cascade = false) { @@ -362,14 +387,14 @@ public function getListTableColumnsSQL($table, $database = null) c.remarks AS comment, k.colseq, CASE - WHEN c.generated = 'D' THEN 1 + WHEN c.generated = '" . self::SYSCAT_COLUMNS_GENERATED_DEFAULT . "' THEN 1 ELSE 0 END AS autoincrement FROM syscat.columns c LEFT JOIN (syscat.keycoluse k JOIN syscat.tabconst tc ON (k.tabschema = tc.tabschema AND k.tabname = tc.tabname - AND tc.type = 'P')) + AND tc.type = '" . self::SYSCAT_TABCONST_TYPE_PRIMARY_KEY . "')) ON (c.tabschema = k.tabschema AND c.tabname = k.tabname AND c.colname = k.colname) @@ -391,7 +416,8 @@ public function getListTableColumnsSQL($table, $database = null) */ public function getListTablesSQL() { - return "SELECT NAME FROM SYSIBM.SYSTABLES WHERE TYPE = 'T' AND CREATOR = CURRENT_USER"; + return "SELECT NAME FROM SYSIBM.SYSTABLES WHERE TYPE = '" . self::SYSIBM_SYSTABLES_TYPE_TABLE . "'" + . ' AND CREATOR = CURRENT_USER'; } /** @@ -416,11 +442,13 @@ public function getListTableIndexesSQL($table, $database = null) return "SELECT idx.INDNAME AS key_name, idxcol.COLNAME AS column_name, CASE - WHEN idx.UNIQUERULE = 'P' THEN 1 + WHEN idx.UNIQUERULE = '" . self::SYSCAT_INDEXES_UNIQUERULE_IMPLEMENTS_PRIMARY_KEY . "' + THEN 1 ELSE 0 END AS primary, CASE - WHEN idx.UNIQUERULE = 'D' THEN 1 + WHEN idx.UNIQUERULE = '" . self::SYSCAT_INDEXES_UNIQUERULE_PERMITS_DUPLICATES . "' + THEN 1 ELSE 0 END AS non_unique FROM SYSCAT.INDEXES AS idx @@ -444,13 +472,13 @@ public function getListTableForeignKeysSQL($table) pkcol.COLNAME AS foreign_column, fk.CONSTNAME AS index_name, CASE - WHEN fk.UPDATERULE = 'R' THEN 'RESTRICT' + WHEN fk.UPDATERULE = '" . self::SYSCAT_REFERENCES_UPDATERULE_RESTRICT . "' THEN 'RESTRICT' ELSE NULL END AS on_update, CASE - WHEN fk.DELETERULE = 'C' THEN 'CASCADE' - WHEN fk.DELETERULE = 'N' THEN 'SET NULL' - WHEN fk.DELETERULE = 'R' THEN 'RESTRICT' + WHEN fk.DELETERULE = '" . self::SYSCAT_REFERENCES_DELETERULE_CASCADE . "' THEN 'CASCADE' + WHEN fk.DELETERULE = '" . self::SYSCAT_REFERENCES_DELETERULE_SET_NULL . "' THEN 'SET NULL' + WHEN fk.DELETERULE = '" . self::SYSCAT_REFERENCES_DELETERULE_RESTRICT . "' THEN 'RESTRICT' ELSE NULL END AS on_delete FROM SYSCAT.REFERENCES AS fk @@ -476,7 +504,7 @@ public function supportsCreateDropDatabase() Deprecation::trigger( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5513', - '%s is deprecated.', + '%s() is deprecated.', __METHOD__, ); @@ -484,7 +512,7 @@ public function supportsCreateDropDatabase() } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -653,7 +681,7 @@ public function getAlterTableSQL(TableDiff $diff) Deprecation::trigger( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5663', - 'Generation of "rename table" SQL using %s is deprecated. Use getRenameTableSQL() instead.', + 'Generation of "rename table" SQL using %s() is deprecated. Use getRenameTableSQL() instead.', __METHOD__, ); @@ -801,7 +829,7 @@ protected function getPreAlterTableIndexForeignKeySQL(TableDiff $diff) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { @@ -939,7 +967,8 @@ public function prefersIdentityColumns() Deprecation::trigger( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/1519', - 'DB2Platform::prefersIdentityColumns() is deprecated.', + '%s() is deprecated.', + __METHOD__, ); return true; @@ -985,8 +1014,10 @@ protected function getReservedKeywordsClass() Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/4510', - 'DB2Platform::getReservedKeywordsClass() is deprecated,' - . ' use DB2Platform::createReservedKeywordsList() instead.', + '%s() is deprecated,' + . ' use %s::createReservedKeywordsList() instead.', + __METHOD__, + static::class, ); return Keywords\DB2Keywords::class; diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/DB2Keywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/DB2Keywords.php index ee8cb1d67..d5dbbd734 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/DB2Keywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/DB2Keywords.php @@ -10,7 +10,7 @@ class DB2Keywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -26,7 +26,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MariaDBKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MariaDBKeywords.php index 06c561254..5417c6caa 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MariaDBKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MariaDBKeywords.php @@ -19,7 +19,7 @@ public function getName(): string } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords(): array { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL57Keywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL57Keywords.php index 65dcea500..4588aab84 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL57Keywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL57Keywords.php @@ -12,7 +12,7 @@ class MySQL57Keywords extends MySQLKeywords { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -28,7 +28,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @link http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-reservedwords-5-7.html */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL80Keywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL80Keywords.php index 1ed030afa..c62ae9e5b 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL80Keywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQL80Keywords.php @@ -12,7 +12,7 @@ class MySQL80Keywords extends MySQL57Keywords { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -28,7 +28,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @link https://dev.mysql.com/doc/refman/8.0/en/keywords.html */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQLKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQLKeywords.php index 4f7fe998d..f9505e0e1 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQLKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/MySQLKeywords.php @@ -10,7 +10,7 @@ class MySQLKeywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -26,7 +26,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/OracleKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/OracleKeywords.php index d49ddd58e..d2d0094c7 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/OracleKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/OracleKeywords.php @@ -10,7 +10,7 @@ class OracleKeywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -26,7 +26,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/PostgreSQLKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/PostgreSQLKeywords.php index 8714c6db6..1ff4142b2 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/PostgreSQLKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/PostgreSQLKeywords.php @@ -10,7 +10,7 @@ class PostgreSQLKeywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -26,7 +26,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/ReservedKeywordsValidator.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/ReservedKeywordsValidator.php index e168e8b1c..b33f3e4b3 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/ReservedKeywordsValidator.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/ReservedKeywordsValidator.php @@ -79,7 +79,7 @@ private function addViolation($asset, $violatedPlatforms): void } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptColumn(Table $table, Column $column) { @@ -90,35 +90,35 @@ public function acceptColumn(Table $table, Column $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptIndex(Table $table, Index $index) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSchema(Schema $schema) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSequence(Sequence $sequence) { } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLServerKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLServerKeywords.php index 48953baa2..76614cf95 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLServerKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLServerKeywords.php @@ -11,7 +11,7 @@ class SQLServerKeywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -27,7 +27,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @link http://msdn.microsoft.com/en-us/library/aa238507%28v=sql.80%29.aspx */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLiteKeywords.php b/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLiteKeywords.php index 65351078e..9a3edeb57 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLiteKeywords.php +++ b/app/vendor/doctrine/dbal/src/Platforms/Keywords/SQLiteKeywords.php @@ -10,7 +10,7 @@ class SQLiteKeywords extends KeywordList { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -26,7 +26,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getKeywords() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/MariaDBPlatform.php b/app/vendor/doctrine/dbal/src/Platforms/MariaDBPlatform.php index 9e3d3ddb9..1dddeccaf 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/MariaDBPlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/MariaDBPlatform.php @@ -24,7 +24,7 @@ public function getDefaultValueDeclarationSQL($column) } /** - * {@inheritdoc} + * {@inheritDoc} * * @link https://mariadb.com/kb/en/library/json-data-type/ */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/MariaDb1027Platform.php b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1027Platform.php index 93c7d3488..68f381332 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/MariaDb1027Platform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1027Platform.php @@ -8,7 +8,7 @@ * Note: Should not be used with versions prior to 10.2.7. * * @deprecated This class will be merged with {@see MariaDBPlatform} in 4.0 because support for MariaDB - * releases prior to 10.2.7 will be dropped. + * releases prior to 10.4.3 will be dropped. */ class MariaDb1027Platform extends MariaDBPlatform { diff --git a/app/vendor/doctrine/dbal/src/Platforms/MariaDb1043Platform.php b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1043Platform.php new file mode 100644 index 000000000..926c6b952 --- /dev/null +++ b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1043Platform.php @@ -0,0 +1,117 @@ +getColumnTypeSQLSnippets(); + + return sprintf( + <<getDatabaseNameSQL($database), + $this->quoteStringLiteral($table), + ); + } + + /** + * Generate SQL snippets to reverse the aliasing of JSON to LONGTEXT. + * + * MariaDb aliases columns specified as JSON to LONGTEXT and sets a CHECK constraint to ensure the column + * is valid json. This function generates the SQL snippets which reverse this aliasing i.e. report a column + * as JSON where it was originally specified as such instead of LONGTEXT. + * + * The CHECK constraints are stored in information_schema.CHECK_CONSTRAINTS so JOIN that table. + * + * @return array{string, string} + */ + public function getColumnTypeSQLSnippets(string $tableAlias = 'c'): array + { + if ($this->getJsonTypeDeclarationSQL([]) !== 'JSON') { + return parent::getColumnTypeSQLSnippets($tableAlias); + } + + $columnTypeSQL = <<getJsonTypeDeclarationSQL([]) === 'JSON' && ($column['type'] ?? null) instanceof JsonType) { + unset($column['collation']); + unset($column['charset']); + } + + return parent::getColumnDeclarationSQL($name, $column); + } +} diff --git a/app/vendor/doctrine/dbal/src/Platforms/MariaDb1052Platform.php b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1052Platform.php new file mode 100644 index 000000000..4241187fd --- /dev/null +++ b/app/vendor/doctrine/dbal/src/Platforms/MariaDb1052Platform.php @@ -0,0 +1,38 @@ +getQuotedName($this)]; + } +} diff --git a/app/vendor/doctrine/dbal/src/Platforms/MySQL57Platform.php b/app/vendor/doctrine/dbal/src/Platforms/MySQL57Platform.php index ea11ee636..f3899959d 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/MySQL57Platform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/MySQL57Platform.php @@ -17,7 +17,7 @@ class MySQL57Platform extends MySQLPlatform { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -34,7 +34,7 @@ public function hasNativeJsonType() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getJsonTypeDeclarationSQL(array $column) { @@ -47,7 +47,7 @@ public function createSQLParser(): Parser } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getPreAlterTableRenameIndexForeignKeySQL(TableDiff $diff) { @@ -55,7 +55,7 @@ protected function getPreAlterTableRenameIndexForeignKeySQL(TableDiff $diff) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getPostAlterTableRenameIndexForeignKeySQL(TableDiff $diff) { @@ -63,7 +63,7 @@ protected function getPostAlterTableRenameIndexForeignKeySQL(TableDiff $diff) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { @@ -71,7 +71,7 @@ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Implement {@see createReservedKeywordsList()} instead. */ @@ -88,7 +88,7 @@ protected function getReservedKeywordsClass() } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function initializeDoctrineTypeMappings() { diff --git a/app/vendor/doctrine/dbal/src/Platforms/MySQL80Platform.php b/app/vendor/doctrine/dbal/src/Platforms/MySQL80Platform.php index dd6599de1..9ea6ee881 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/MySQL80Platform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/MySQL80Platform.php @@ -10,7 +10,7 @@ class MySQL80Platform extends MySQL57Platform { /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Implement {@see createReservedKeywordsList()} instead. */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/OraclePlatform.php b/app/vendor/doctrine/dbal/src/Platforms/OraclePlatform.php index 306173e99..1d4578979 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/OraclePlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/OraclePlatform.php @@ -13,6 +13,7 @@ use Doctrine\DBAL\Schema\TableDiff; use Doctrine\DBAL\TransactionIsolationLevel; use Doctrine\DBAL\Types\BinaryType; +use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\Deprecation; use InvalidArgumentException; @@ -103,7 +104,7 @@ public function getLocateExpression($str, $substr, $startPos = false) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -373,7 +374,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed/*, $lengt } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $lengthOmitted = false*/) { @@ -390,7 +391,7 @@ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $length } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -798,7 +799,7 @@ public function getDropForeignKeySQL($foreignKey, $table) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -818,7 +819,7 @@ public function getAdvancedForeignKeyOptionsSQL(ForeignKeyConstraint $foreignKey } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -1001,7 +1002,7 @@ public function getAlterTableSQL(TableDiff $diff) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -1050,7 +1051,7 @@ public function getColumnDeclarationSQL($name, array $column) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { @@ -1063,7 +1064,7 @@ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -1080,7 +1081,7 @@ public function usesSequenceEmulatedIdentityColumns() } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the OraclePlatform class hierarchy. */ @@ -1240,29 +1241,29 @@ public function getDummySelectSQL() protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'binary_double' => 'float', - 'binary_float' => 'float', - 'binary_integer' => 'boolean', - 'blob' => 'blob', - 'char' => 'string', - 'clob' => 'text', - 'date' => 'date', - 'float' => 'float', - 'integer' => 'integer', - 'long' => 'string', - 'long raw' => 'blob', - 'nchar' => 'string', - 'nclob' => 'text', - 'number' => 'integer', - 'nvarchar2' => 'string', - 'pls_integer' => 'boolean', - 'raw' => 'binary', - 'rowid' => 'string', - 'timestamp' => 'datetime', - 'timestamptz' => 'datetimetz', - 'urowid' => 'string', - 'varchar' => 'string', - 'varchar2' => 'string', + 'binary_double' => Types::FLOAT, + 'binary_float' => Types::FLOAT, + 'binary_integer' => Types::BOOLEAN, + 'blob' => Types::BLOB, + 'char' => Types::STRING, + 'clob' => Types::TEXT, + 'date' => Types::DATE_MUTABLE, + 'float' => Types::FLOAT, + 'integer' => Types::INTEGER, + 'long' => Types::STRING, + 'long raw' => Types::BLOB, + 'nchar' => Types::STRING, + 'nclob' => Types::TEXT, + 'number' => Types::INTEGER, + 'nvarchar2' => Types::STRING, + 'pls_integer' => Types::BOOLEAN, + 'raw' => Types::BINARY, + 'rowid' => Types::STRING, + 'timestamp' => Types::DATETIME_MUTABLE, + 'timestamptz' => Types::DATETIMETZ_MUTABLE, + 'urowid' => Types::STRING, + 'varchar' => Types::STRING, + 'varchar2' => Types::STRING, ]; } diff --git a/app/vendor/doctrine/dbal/src/Platforms/PostgreSQLPlatform.php b/app/vendor/doctrine/dbal/src/Platforms/PostgreSQLPlatform.php index 7c4592651..9e6648cbd 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/PostgreSQLPlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/PostgreSQLPlatform.php @@ -10,9 +10,11 @@ use Doctrine\DBAL\Schema\Index; use Doctrine\DBAL\Schema\PostgreSQLSchemaManager; use Doctrine\DBAL\Schema\Sequence; +use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; use Doctrine\DBAL\Types\BinaryType; use Doctrine\DBAL\Types\BlobType; +use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\Deprecation; use UnexpectedValueException; @@ -127,7 +129,7 @@ public function getLocateExpression($str, $substr, $startPos = false) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -169,7 +171,7 @@ public function supportsSchemas() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -194,7 +196,7 @@ public function supportsIdentityColumns() } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -204,7 +206,7 @@ public function supportsPartialIndexes() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -221,7 +223,7 @@ public function usesSequenceEmulatedIdentityColumns() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -728,7 +730,7 @@ private function isUnchangedBinaryColumn(ColumnDiff $columnDiff): bool } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { @@ -741,7 +743,7 @@ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -809,6 +811,36 @@ public function getDropForeignKeySQL($foreignKey, $table) return $this->getDropConstraintSQL($foreignKey, $table); } + /** + * {@inheritDoc} + */ + public function getDropIndexSQL($index, $table = null) + { + if ($index instanceof Index && $index->isPrimary() && $table !== null) { + $constraintName = $index->getName() === 'primary' ? $this->tableName($table) . '_pkey' : $index->getName(); + + return $this->getDropConstraintSQL($constraintName, $table); + } + + if ($index === '"primary"' && $table !== null) { + $constraintName = $this->tableName($table) . '_pkey'; + + return $this->getDropConstraintSQL($constraintName, $table); + } + + return parent::getDropIndexSQL($index, $table); + } + + /** + * @param Table|string|null $table + * + * @return string + */ + private function tableName($table) + { + return $table instanceof Table ? $table->getName() : (string) $table; + } + /** * {@inheritDoc} */ @@ -821,7 +853,9 @@ protected function _getCreateTableSQL($name, array $columns, array $options = [] $queryFields .= ', PRIMARY KEY(' . implode(', ', $keyColumns) . ')'; } - $query = 'CREATE TABLE ' . $name . ' (' . $queryFields . ')'; + $unlogged = isset($options['unlogged']) && $options['unlogged'] === true ? ' UNLOGGED' : ''; + + $query = 'CREATE' . $unlogged . ' TABLE ' . $name . ' (' . $queryFields . ')'; $sql = [$query]; @@ -1092,7 +1126,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed) { @@ -1166,47 +1200,47 @@ public function getReadLockSQL() protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'bigint' => 'bigint', - 'bigserial' => 'bigint', - 'bool' => 'boolean', - 'boolean' => 'boolean', - 'bpchar' => 'string', - 'bytea' => 'blob', - 'char' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'decimal' => 'decimal', - 'double' => 'float', - 'double precision' => 'float', - 'float' => 'float', - 'float4' => 'float', - 'float8' => 'float', - 'inet' => 'string', - 'int' => 'integer', - 'int2' => 'smallint', - 'int4' => 'integer', - 'int8' => 'bigint', - 'integer' => 'integer', - 'interval' => 'string', - 'json' => 'json', - 'jsonb' => 'json', - 'money' => 'decimal', - 'numeric' => 'decimal', - 'serial' => 'integer', - 'serial4' => 'integer', - 'serial8' => 'bigint', - 'real' => 'float', - 'smallint' => 'smallint', - 'text' => 'text', - 'time' => 'time', - 'timestamp' => 'datetime', - 'timestamptz' => 'datetimetz', - 'timetz' => 'time', - 'tsvector' => 'text', - 'uuid' => 'guid', - 'varchar' => 'string', - 'year' => 'date', - '_varchar' => 'string', + 'bigint' => Types::BIGINT, + 'bigserial' => Types::BIGINT, + 'bool' => Types::BOOLEAN, + 'boolean' => Types::BOOLEAN, + 'bpchar' => Types::STRING, + 'bytea' => Types::BLOB, + 'char' => Types::STRING, + 'date' => Types::DATE_MUTABLE, + 'datetime' => Types::DATETIME_MUTABLE, + 'decimal' => Types::DECIMAL, + 'double' => Types::FLOAT, + 'double precision' => Types::FLOAT, + 'float' => Types::FLOAT, + 'float4' => Types::FLOAT, + 'float8' => Types::FLOAT, + 'inet' => Types::STRING, + 'int' => Types::INTEGER, + 'int2' => Types::SMALLINT, + 'int4' => Types::INTEGER, + 'int8' => Types::BIGINT, + 'integer' => Types::INTEGER, + 'interval' => Types::STRING, + 'json' => Types::JSON, + 'jsonb' => Types::JSON, + 'money' => Types::DECIMAL, + 'numeric' => Types::DECIMAL, + 'serial' => Types::INTEGER, + 'serial4' => Types::INTEGER, + 'serial8' => Types::BIGINT, + 'real' => Types::FLOAT, + 'smallint' => Types::SMALLINT, + 'text' => Types::TEXT, + 'time' => Types::TIME_MUTABLE, + 'timestamp' => Types::DATETIME_MUTABLE, + 'timestamptz' => Types::DATETIMETZ_MUTABLE, + 'timetz' => Types::TIME_MUTABLE, + 'tsvector' => Types::TEXT, + 'uuid' => Types::GUID, + 'varchar' => Types::STRING, + 'year' => Types::DATE_MUTABLE, + '_varchar' => Types::STRING, ]; } @@ -1227,7 +1261,7 @@ public function getVarcharMaxLength() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBinaryMaxLength() { @@ -1241,7 +1275,7 @@ public function getBinaryMaxLength() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -1257,7 +1291,7 @@ public function getBinaryDefaultLength() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -1299,7 +1333,7 @@ public function getBlobTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -1313,7 +1347,7 @@ public function getDefaultValueDeclarationSQL($column) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -1323,7 +1357,7 @@ public function supportsColumnCollation() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getJsonTypeDeclarationSQL(array $column) { diff --git a/app/vendor/doctrine/dbal/src/Platforms/SQLServerPlatform.php b/app/vendor/doctrine/dbal/src/Platforms/SQLServerPlatform.php index 027f7239c..113055ba8 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/SQLServerPlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/SQLServerPlatform.php @@ -14,6 +14,7 @@ use Doctrine\DBAL\Schema\SQLServerSchemaManager; use Doctrine\DBAL\Schema\Table; use Doctrine\DBAL\Schema\TableDiff; +use Doctrine\DBAL\Types\Types; use Doctrine\Deprecations\Deprecation; use InvalidArgumentException; @@ -49,7 +50,7 @@ class SQLServerPlatform extends AbstractPlatform { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getCurrentDateSQL() { @@ -57,7 +58,7 @@ public function getCurrentDateSQL() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getCurrentTimeSQL() { @@ -76,7 +77,7 @@ private function getConvertExpression($dataType, $expression): string } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -135,7 +136,7 @@ public function supportsReleaseSavepoints() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function supportsSchemas() { @@ -143,7 +144,7 @@ public function supportsSchemas() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -189,7 +190,7 @@ public function getCreateSequenceSQL(Sequence $sequence): string } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractSchemaManager} class hierarchy. */ @@ -206,7 +207,7 @@ public function getListSequencesSQL($database) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSequenceNextValSQL($sequence) { @@ -857,7 +858,7 @@ protected function getDropColumnCommentSQL($tableName, $columnName) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getRenameIndexSQL($oldIndexName, Index $index, $tableName) { @@ -1315,7 +1316,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed/*, $lengt } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $lengthOmitted = false*/) { @@ -1334,7 +1335,7 @@ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed/*, $length } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -1517,36 +1518,36 @@ public function getName() protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'bigint' => 'bigint', - 'binary' => 'binary', - 'bit' => 'boolean', - 'blob' => 'blob', - 'char' => 'string', - 'date' => 'date', - 'datetime' => 'datetime', - 'datetime2' => 'datetime', - 'datetimeoffset' => 'datetimetz', - 'decimal' => 'decimal', - 'double' => 'float', - 'double precision' => 'float', - 'float' => 'float', - 'image' => 'blob', - 'int' => 'integer', - 'money' => 'integer', - 'nchar' => 'string', - 'ntext' => 'text', - 'numeric' => 'decimal', - 'nvarchar' => 'string', - 'real' => 'float', - 'smalldatetime' => 'datetime', - 'smallint' => 'smallint', - 'smallmoney' => 'integer', - 'text' => 'text', - 'time' => 'time', - 'tinyint' => 'smallint', - 'uniqueidentifier' => 'guid', - 'varbinary' => 'binary', - 'varchar' => 'string', + 'bigint' => Types::BIGINT, + 'binary' => Types::BINARY, + 'bit' => Types::BOOLEAN, + 'blob' => Types::BLOB, + 'char' => Types::STRING, + 'date' => Types::DATE_MUTABLE, + 'datetime' => Types::DATETIME_MUTABLE, + 'datetime2' => Types::DATETIME_MUTABLE, + 'datetimeoffset' => Types::DATETIMETZ_MUTABLE, + 'decimal' => Types::DECIMAL, + 'double' => Types::FLOAT, + 'double precision' => Types::FLOAT, + 'float' => Types::FLOAT, + 'image' => Types::BLOB, + 'int' => Types::INTEGER, + 'money' => Types::INTEGER, + 'nchar' => Types::STRING, + 'ntext' => Types::TEXT, + 'numeric' => Types::DECIMAL, + 'nvarchar' => Types::STRING, + 'real' => Types::FLOAT, + 'smalldatetime' => Types::DATETIME_MUTABLE, + 'smallint' => Types::SMALLINT, + 'smallmoney' => Types::INTEGER, + 'text' => Types::TEXT, + 'time' => Types::TIME_MUTABLE, + 'tinyint' => Types::SMALLINT, + 'uniqueidentifier' => Types::GUID, + 'varbinary' => Types::BINARY, + 'varchar' => Types::STRING, ]; } @@ -1575,7 +1576,7 @@ public function rollbackSavePoint($savepoint) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ @@ -1659,7 +1660,7 @@ public function getBlobTypeDeclarationSQL(array $column) } /** - * {@inheritdoc} + * {@inheritDoc} * * @internal The method should be only used from within the {@see AbstractPlatform} class hierarchy. */ diff --git a/app/vendor/doctrine/dbal/src/Platforms/SqlitePlatform.php b/app/vendor/doctrine/dbal/src/Platforms/SqlitePlatform.php index 71c29f38a..5acefc5c8 100644 --- a/app/vendor/doctrine/dbal/src/Platforms/SqlitePlatform.php +++ b/app/vendor/doctrine/dbal/src/Platforms/SqlitePlatform.php @@ -141,7 +141,7 @@ public function getLocateExpression($str, $substr, $startPos = false) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getDateArithmeticIntervalExpression($date, $operator, $interval, $unit) { @@ -482,7 +482,7 @@ protected function getVarcharTypeDeclarationSQLSnippet($length, $fixed) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed) { @@ -490,7 +490,7 @@ protected function getBinaryTypeDeclarationSQLSnippet($length, $fixed) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -506,7 +506,7 @@ public function getBinaryMaxLength() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ @@ -761,38 +761,38 @@ private function getInlineTableCommentSQL(string $comment): string protected function initializeDoctrineTypeMappings() { $this->doctrineTypeMapping = [ - 'bigint' => 'bigint', - 'bigserial' => 'bigint', - 'blob' => 'blob', - 'boolean' => 'boolean', - 'char' => 'string', - 'clob' => 'text', - 'date' => 'date', - 'datetime' => 'datetime', - 'decimal' => 'decimal', - 'double' => 'float', - 'double precision' => 'float', - 'float' => 'float', - 'image' => 'string', - 'int' => 'integer', - 'integer' => 'integer', - 'longtext' => 'text', - 'longvarchar' => 'string', - 'mediumint' => 'integer', - 'mediumtext' => 'text', - 'ntext' => 'string', - 'numeric' => 'decimal', - 'nvarchar' => 'string', - 'real' => 'float', - 'serial' => 'integer', - 'smallint' => 'smallint', - 'text' => 'text', - 'time' => 'time', - 'timestamp' => 'datetime', - 'tinyint' => 'boolean', - 'tinytext' => 'text', - 'varchar' => 'string', - 'varchar2' => 'string', + 'bigint' => Types\Types::BIGINT, + 'bigserial' => Types\Types::BIGINT, + 'blob' => Types\Types::BLOB, + 'boolean' => Types\Types::BOOLEAN, + 'char' => Types\Types::STRING, + 'clob' => Types\Types::TEXT, + 'date' => Types\Types::DATE_MUTABLE, + 'datetime' => Types\Types::DATETIME_MUTABLE, + 'decimal' => Types\Types::DECIMAL, + 'double' => Types\Types::FLOAT, + 'double precision' => Types\Types::FLOAT, + 'float' => Types\Types::FLOAT, + 'image' => Types\Types::STRING, + 'int' => Types\Types::INTEGER, + 'integer' => Types\Types::INTEGER, + 'longtext' => Types\Types::TEXT, + 'longvarchar' => Types\Types::STRING, + 'mediumint' => Types\Types::INTEGER, + 'mediumtext' => Types\Types::TEXT, + 'ntext' => Types\Types::STRING, + 'numeric' => Types\Types::DECIMAL, + 'nvarchar' => Types\Types::STRING, + 'real' => Types\Types::FLOAT, + 'serial' => Types\Types::INTEGER, + 'smallint' => Types\Types::SMALLINT, + 'text' => Types\Types::TEXT, + 'time' => Types\Types::TIME_MUTABLE, + 'timestamp' => Types\Types::DATETIME_MUTABLE, + 'tinyint' => Types\Types::BOOLEAN, + 'tinytext' => Types\Types::TEXT, + 'varchar' => Types\Types::STRING, + 'varchar2' => Types\Types::STRING, ]; } @@ -941,7 +941,7 @@ public function getCreatePrimaryKeySQL(Index $index, $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table) { @@ -949,7 +949,7 @@ public function getCreateForeignKeySQL(ForeignKeyConstraint $foreignKey, $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getDropForeignKeySQL($foreignKey, $table) { diff --git a/app/vendor/doctrine/dbal/src/Portability/Converter.php b/app/vendor/doctrine/dbal/src/Portability/Converter.php index eb76eb782..d0503977b 100644 --- a/app/vendor/doctrine/dbal/src/Portability/Converter.php +++ b/app/vendor/doctrine/dbal/src/Portability/Converter.php @@ -10,8 +10,14 @@ use function is_string; use function rtrim; +use const CASE_LOWER; +use const CASE_UPPER; + final class Converter { + public const CASE_LOWER = CASE_LOWER; + public const CASE_UPPER = CASE_UPPER; + /** @var callable */ private $convertNumeric; @@ -31,10 +37,12 @@ final class Converter private $convertFirstColumn; /** - * @param bool $convertEmptyStringToNull Whether each empty string should be converted to NULL - * @param bool $rightTrimString Whether each string should right-trimmed - * @param int|null $case Convert the case of the column names - * (one of {@see CASE_LOWER} and {@see CASE_UPPER}) + * @param bool $convertEmptyStringToNull Whether each empty string should + * be converted to NULL + * @param bool $rightTrimString Whether each string should right-trimmed + * @param self::CASE_LOWER|self::CASE_UPPER|null $case Convert the case of the column names + * (one of {@see self::CASE_LOWER} and + * {@see self::CASE_UPPER}) */ public function __construct(bool $convertEmptyStringToNull, bool $rightTrimString, ?int $case) { @@ -182,8 +190,8 @@ private function createConvertValue(bool $convertEmptyStringToNull, bool $rightT /** * Creates a function that will convert each array-row retrieved from the database * - * @param callable|null $function The function that will convert each value - * @param int|null $case Column name case + * @param callable|null $function The function that will convert each value + * @param self::CASE_LOWER|self::CASE_UPPER|null $case Column name case * * @return callable|null The resulting function or NULL if no conversion is needed */ diff --git a/app/vendor/doctrine/dbal/src/Portability/Driver.php b/app/vendor/doctrine/dbal/src/Portability/Driver.php index 587c121ef..a5ac9679a 100644 --- a/app/vendor/doctrine/dbal/src/Portability/Driver.php +++ b/app/vendor/doctrine/dbal/src/Portability/Driver.php @@ -11,15 +11,19 @@ use function method_exists; -use const CASE_LOWER; -use const CASE_UPPER; - final class Driver extends AbstractDriverMiddleware { private int $mode; + /** @var 0|ColumnCase::LOWER|ColumnCase::UPPER */ private int $case; + /** + * @param 0|ColumnCase::LOWER|ColumnCase::UPPER $case Determines how the column case will be treated. + * 0: The case will be left as is in the database. + * {@see ColumnCase::LOWER}: The case will be lowercased. + * {@see ColumnCase::UPPER}: The case will be uppercased. + */ public function __construct(DriverInterface $driver, int $mode, int $case) { parent::__construct($driver); @@ -55,9 +59,12 @@ public function connect( if ($nativeConnection instanceof PDO) { $portability &= ~Connection::PORTABILITY_FIX_CASE; - $nativeConnection->setAttribute(PDO::ATTR_CASE, $this->case); + $nativeConnection->setAttribute( + PDO::ATTR_CASE, + $this->case === ColumnCase::LOWER ? PDO::CASE_LOWER : PDO::CASE_UPPER, + ); } else { - $case = $this->case === ColumnCase::LOWER ? CASE_LOWER : CASE_UPPER; + $case = $this->case === ColumnCase::LOWER ? Converter::CASE_LOWER : Converter::CASE_UPPER; } } diff --git a/app/vendor/doctrine/dbal/src/Portability/Middleware.php b/app/vendor/doctrine/dbal/src/Portability/Middleware.php index 6e4bea2f2..fae2c5567 100644 --- a/app/vendor/doctrine/dbal/src/Portability/Middleware.php +++ b/app/vendor/doctrine/dbal/src/Portability/Middleware.php @@ -4,6 +4,7 @@ namespace Doctrine\DBAL\Portability; +use Doctrine\DBAL\ColumnCase; use Doctrine\DBAL\Driver as DriverInterface; use Doctrine\DBAL\Driver\Middleware as MiddlewareInterface; @@ -11,8 +12,15 @@ final class Middleware implements MiddlewareInterface { private int $mode; + /** @var 0|ColumnCase::LOWER|ColumnCase::UPPER */ private int $case; + /** + * @param 0|ColumnCase::LOWER|ColumnCase::UPPER $case Determines how the column case will be treated. + * 0: The case will be left as is in the database. + * {@see ColumnCase::LOWER}: The case will be lowercased. + * {@see ColumnCase::UPPER}: The case will be uppercased. + */ public function __construct(int $mode, int $case) { $this->mode = $mode; diff --git a/app/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php b/app/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php index 09f528310..884a936c7 100644 --- a/app/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php +++ b/app/vendor/doctrine/dbal/src/Portability/OptimizeFlags.php @@ -17,7 +17,7 @@ final class OptimizeFlags * Platform-specific portability flags that need to be excluded from the user-provided mode * since the platform already operates in this mode to avoid unnecessary conversion overhead. * - * @var array + * @var array */ private static array $platforms = [ DB2Platform::class => 0, diff --git a/app/vendor/doctrine/dbal/src/Portability/Statement.php b/app/vendor/doctrine/dbal/src/Portability/Statement.php index 9b3e74f58..8fcd79d4a 100644 --- a/app/vendor/doctrine/dbal/src/Portability/Statement.php +++ b/app/vendor/doctrine/dbal/src/Portability/Statement.php @@ -24,7 +24,7 @@ public function __construct(DriverStatement $stmt, Converter $converter) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function execute($params = null): ResultInterface { diff --git a/app/vendor/doctrine/dbal/src/Query/QueryBuilder.php b/app/vendor/doctrine/dbal/src/Query/QueryBuilder.php index ad0ffca30..ba76fdf93 100644 --- a/app/vendor/doctrine/dbal/src/Query/QueryBuilder.php +++ b/app/vendor/doctrine/dbal/src/Query/QueryBuilder.php @@ -105,11 +105,15 @@ class QueryBuilder /** * The type of query this is. Can be select, update or delete. + * + * @psalm-var self::SELECT|self::DELETE|self::UPDATE|self::INSERT */ private int $type = self::SELECT; /** * The state of the query object. Can be dirty or clean. + * + * @psalm-var self::STATE_* */ private int $state = self::STATE_CLEAN; @@ -208,6 +212,7 @@ public function getConnection() * @deprecated The builder state is an internal concern. * * @return int Either QueryBuilder::STATE_DIRTY or QueryBuilder::STATE_CLEAN. + * @psalm-return self::STATE_* */ public function getState() { @@ -413,7 +418,6 @@ public function getSQL() break; case self::SELECT: - default: $sql = $this->getSQLForSelect(); break; } diff --git a/app/vendor/doctrine/dbal/src/Result.php b/app/vendor/doctrine/dbal/src/Result.php index 0426fd48f..fdc7daa94 100644 --- a/app/vendor/doctrine/dbal/src/Result.php +++ b/app/vendor/doctrine/dbal/src/Result.php @@ -7,6 +7,7 @@ use Doctrine\DBAL\Driver\Exception as DriverException; use Doctrine\DBAL\Driver\Result as DriverResult; use Doctrine\DBAL\Exception\NoKeyValue; +use Doctrine\Deprecations\Deprecation; use LogicException; use Traversable; @@ -261,7 +262,9 @@ private function ensureHasKeyValue(): void /** * BC layer for a wide-spread use-case of old DBAL APIs * - * @deprecated This API is deprecated and will be removed after 2022 + * @deprecated Use {@see fetchNumeric()}, {@see fetchAssociative()} or {@see fetchOne()} instead. + * + * @psalm-param FetchMode::* $mode * * @return mixed * @@ -269,6 +272,13 @@ private function ensureHasKeyValue(): void */ public function fetch(int $mode = FetchMode::ASSOCIATIVE) { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/4007', + '%s is deprecated, please use fetchNumeric(), fetchAssociative() or fetchOne() instead.', + __METHOD__, + ); + if (func_num_args() > 1) { throw new LogicException('Only invocations with one argument are still supported by this legacy API.'); } @@ -291,7 +301,9 @@ public function fetch(int $mode = FetchMode::ASSOCIATIVE) /** * BC layer for a wide-spread use-case of old DBAL APIs * - * @deprecated This API is deprecated and will be removed after 2022 + * @deprecated Use {@see fetchAllNumeric()}, {@see fetchAllAssociative()} or {@see fetchFirstColumn()} instead. + * + * @psalm-param FetchMode::* $mode * * @return list * @@ -299,6 +311,13 @@ public function fetch(int $mode = FetchMode::ASSOCIATIVE) */ public function fetchAll(int $mode = FetchMode::ASSOCIATIVE): array { + Deprecation::trigger( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/4007', + '%s is deprecated, please use fetchAllNumeric(), fetchAllAssociative() or fetchFirstColumn() instead.', + __METHOD__, + ); + if (func_num_args() > 1) { throw new LogicException('Only invocations with one argument are still supported by this legacy API.'); } diff --git a/app/vendor/doctrine/dbal/src/Schema/AbstractSchemaManager.php b/app/vendor/doctrine/dbal/src/Schema/AbstractSchemaManager.php index 445c9ff2f..7e1fd93ff 100644 --- a/app/vendor/doctrine/dbal/src/Schema/AbstractSchemaManager.php +++ b/app/vendor/doctrine/dbal/src/Schema/AbstractSchemaManager.php @@ -215,7 +215,7 @@ public function listTableColumns($table, $database = null) if ($database === null) { $database = $this->getDatabase(__METHOD__); } else { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/5284', 'Passing $database to AbstractSchemaManager::listTableColumns() is deprecated.', @@ -242,10 +242,10 @@ protected function doListTableColumns($table, $database = null): array if ($database === null) { $database = $this->getDatabase(__METHOD__); } else { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/issues/5284', - 'Passing $database to AbstractSchemaManager::listTableColumns() is deprecated.', + 'Passing $database to AbstractSchemaManager::doListTableColumns() is deprecated.', ); } @@ -442,7 +442,7 @@ protected function doListTables(): array */ public function listTableDetails($name) { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5595', '%s is deprecated. Use introspectTable() instead.', diff --git a/app/vendor/doctrine/dbal/src/Schema/Column.php b/app/vendor/doctrine/dbal/src/Schema/Column.php index 8a5703c0a..03fd686f4 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Column.php +++ b/app/vendor/doctrine/dbal/src/Schema/Column.php @@ -52,7 +52,7 @@ class Column extends AbstractAsset protected $_comment; /** - * @deprecated Use {@link $_platformOptions instead} + * @deprecated Use {@link $_platformOptions} instead * * @var mixed[] */ @@ -353,7 +353,7 @@ public function getComment() } /** - * @deprecated Use {@link setPlatformOption() instead} + * @deprecated Use {@link setPlatformOption()} instead * * @param string $name * @param mixed $value @@ -374,7 +374,7 @@ public function setCustomSchemaOption($name, $value) } /** - * @deprecated Use {@link hasPlatformOption() instead} + * @deprecated Use {@link hasPlatformOption()} instead * * @param string $name * @@ -392,7 +392,7 @@ public function hasCustomSchemaOption($name) } /** - * @deprecated Use {@link getPlatformOption() instead} + * @deprecated Use {@link getPlatformOption()} instead * * @param string $name * @@ -410,7 +410,7 @@ public function getCustomSchemaOption($name) } /** - * @deprecated Use {@link setPlatformOptions() instead} + * @deprecated Use {@link setPlatformOptions()} instead * * @param mixed[] $customSchemaOptions * @@ -430,13 +430,13 @@ public function setCustomSchemaOptions(array $customSchemaOptions) } /** - * @deprecated Use {@link getPlatformOptions() instead} + * @deprecated Use {@link getPlatformOptions()} instead * * @return mixed[] */ public function getCustomSchemaOptions() { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5476', 'Column::getCustomSchemaOptions() is deprecated. Use getPlatformOptions() instead.', diff --git a/app/vendor/doctrine/dbal/src/Schema/DB2SchemaManager.php b/app/vendor/doctrine/dbal/src/Schema/DB2SchemaManager.php index 0308d69b5..a07136fec 100644 --- a/app/vendor/doctrine/dbal/src/Schema/DB2SchemaManager.php +++ b/app/vendor/doctrine/dbal/src/Schema/DB2SchemaManager.php @@ -50,7 +50,7 @@ public function listTables() */ public function listTableDetails($name) { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5595', '%s is deprecated. Use introspectTable() instead.', @@ -85,7 +85,7 @@ public function listTableForeignKeys($table, $database = null) } /** - * {@inheritdoc} + * {@inheritDoc} * * @throws Exception */ @@ -148,17 +148,13 @@ protected function _getPortableTableColumnDefinition($tableColumn) $options = [ 'length' => $length, - 'unsigned' => false, 'fixed' => (bool) $fixed, 'default' => $default, 'autoincrement' => (bool) $tableColumn['autoincrement'], 'notnull' => $tableColumn['nulls'] === 'N', - 'scale' => null, - 'precision' => null, 'comment' => isset($tableColumn['comment']) && $tableColumn['comment'] !== '' ? $tableColumn['comment'] : null, - 'platformOptions' => [], ]; if ($scale !== null && $precision !== null) { @@ -170,7 +166,7 @@ protected function _getPortableTableColumnDefinition($tableColumn) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableDefinition($table) { @@ -180,7 +176,7 @@ protected function _getPortableTableDefinition($table) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null) { @@ -193,7 +189,7 @@ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeyDefinition($tableForeignKey) { @@ -207,7 +203,7 @@ protected function _getPortableTableForeignKeyDefinition($tableForeignKey) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeysList($tableForeignKeys) { @@ -255,7 +251,7 @@ protected function _getPortableForeignKeyRuleDef($def) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableViewDefinition($view) { diff --git a/app/vendor/doctrine/dbal/src/Schema/ForeignKeyConstraint.php b/app/vendor/doctrine/dbal/src/Schema/ForeignKeyConstraint.php index 852ad0a31..2f0311cd6 100644 --- a/app/vendor/doctrine/dbal/src/Schema/ForeignKeyConstraint.php +++ b/app/vendor/doctrine/dbal/src/Schema/ForeignKeyConstraint.php @@ -194,7 +194,7 @@ public function getUnquotedForeignColumns() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see getLocalColumns()} instead. * diff --git a/app/vendor/doctrine/dbal/src/Schema/Index.php b/app/vendor/doctrine/dbal/src/Schema/Index.php index 222f20829..84fac4146 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Index.php +++ b/app/vendor/doctrine/dbal/src/Schema/Index.php @@ -84,7 +84,7 @@ protected function _addColumn(string $column): void } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getColumns() { @@ -92,7 +92,7 @@ public function getColumns() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getQuotedColumns(AbstractPlatform $platform) { diff --git a/app/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php b/app/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php index f2305098a..5faae24fa 100644 --- a/app/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php +++ b/app/vendor/doctrine/dbal/src/Schema/MySQLSchemaManager.php @@ -73,7 +73,7 @@ public function listTables() */ public function listTableDetails($name) { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5595', '%s is deprecated. Use introspectTable() instead.', @@ -108,7 +108,7 @@ public function listTableForeignKeys($table, $database = null) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableViewDefinition($view) { @@ -116,7 +116,7 @@ protected function _getPortableViewDefinition($view) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableDefinition($table) { @@ -124,7 +124,7 @@ protected function _getPortableTableDefinition($table) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null) { @@ -154,7 +154,7 @@ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableDatabaseDefinition($database) { @@ -162,7 +162,7 @@ protected function _getPortableDatabaseDefinition($database) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableColumnDefinition($tableColumn) { @@ -183,7 +183,7 @@ protected function _getPortableTableColumnDefinition($tableColumn) $scale = null; $precision = null; - $type = $this->_platform->getDoctrineTypeMapping($dbType); + $type = $origType = $this->_platform->getDoctrineTypeMapping($dbType); // In cases where not connected to a database DESCRIBE $table does not return 'Comment' if (isset($tableColumn['comment'])) { @@ -191,6 +191,12 @@ protected function _getPortableTableColumnDefinition($tableColumn) $tableColumn['comment'] = $this->removeDoctrineTypeFromComment($tableColumn['comment'], $type); } + // Check underlying database type where doctrine type is inferred from DC2Type comment + // and set a flag if it is not as expected. + if ($origType !== $type && $this->expectedDbType($type, $tableColumn) !== $dbType) { + $tableColumn['declarationMismatch'] = true; + } + switch ($dbType) { case 'char': case 'binary': @@ -286,9 +292,35 @@ protected function _getPortableTableColumnDefinition($tableColumn) $column->setPlatformOption('collation', $tableColumn['collation']); } + if (isset($tableColumn['declarationMismatch'])) { + $column->setPlatformOption('declarationMismatch', $tableColumn['declarationMismatch']); + } + return $column; } + /** + * Returns the database data type for a given doctrine type and column + * + * Note that for data types that depend on length where length is not part of the column definition + * and therefore the $tableColumn['length'] will not be set, for example TEXT (which could be LONGTEXT, + * MEDIUMTEXT) or BLOB (LONGBLOB or TINYBLOB), the expectedDbType cannot be inferred exactly, merely + * the default type. + * + * This method is intended to be used to determine underlying database type where doctrine type is + * inferred from a DC2Type comment. + * + * @param mixed[] $tableColumn + */ + private function expectedDbType(string $type, array $tableColumn): string + { + $_type = Type::getType($type); + $expectedDbType = strtolower($_type->getSQLDeclaration($tableColumn, $this->_platform)); + $expectedDbType = strtok($expectedDbType, '(), '); + + return $expectedDbType === false ? '' : $expectedDbType; + } + /** * Return Doctrine/Mysql-compatible column default values for MariaDB 10.2.7+ servers. * @@ -330,7 +362,7 @@ private function getMariaDb1027ColumnDefault(MariaDb1027Platform $platform, ?str } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeysList($tableForeignKeys) { @@ -405,15 +437,17 @@ protected function selectTableNames(string $databaseName): Result protected function selectTableColumns(string $databaseName, ?string $tableName = null): Result { + [$columnTypeSQL, $joinCheckConstraintSQL] = $this->_platform->getColumnTypeSQLSnippets(); + $sql = 'SELECT'; if ($tableName === null) { $sql .= ' c.TABLE_NAME,'; } - $sql .= <<<'SQL' + $sql .= << $precision, 'scale' => $scale, 'fixed' => $fixed, - 'unsigned' => false, 'autoincrement' => $autoincrement, 'comment' => isset($tableColumn['comment']) && $tableColumn['comment'] !== '' ? $tableColumn['comment'] @@ -539,7 +538,7 @@ protected function _getPortableTableColumnDefinition($tableColumn) $column = new Column($tableColumn['field'], Type::getType($type), $options); - if (isset($tableColumn['collation']) && ! empty($tableColumn['collation'])) { + if (! empty($tableColumn['collation'])) { $column->setPlatformOption('collation', $tableColumn['collation']); } @@ -733,6 +732,7 @@ protected function fetchTableOptionsByTable(string $databaseName, ?string $table { $sql = <<<'SQL' SELECT c.relname, + CASE c.relpersistence WHEN 'u' THEN true ELSE false END as unlogged, obj_description(c.oid, 'pg_class') AS comment FROM pg_class c INNER JOIN pg_namespace n diff --git a/app/vendor/doctrine/dbal/src/Schema/SQLServerSchemaManager.php b/app/vendor/doctrine/dbal/src/Schema/SQLServerSchemaManager.php index 657e3651a..64538e689 100644 --- a/app/vendor/doctrine/dbal/src/Schema/SQLServerSchemaManager.php +++ b/app/vendor/doctrine/dbal/src/Schema/SQLServerSchemaManager.php @@ -55,7 +55,7 @@ public function listTables() */ public function listTableDetails($name) { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5595', '%s is deprecated. Use introspectTable() instead.', @@ -104,7 +104,7 @@ public function listSchemaNames(): array } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableSequenceDefinition($sequence) { @@ -112,7 +112,7 @@ protected function _getPortableSequenceDefinition($sequence) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableColumnDefinition($tableColumn) { @@ -209,7 +209,7 @@ private function parseDefaultExpression(string $value): ?string } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeysList($tableForeignKeys) { @@ -239,7 +239,7 @@ protected function _getPortableTableForeignKeysList($tableForeignKeys) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null) { @@ -253,7 +253,7 @@ protected function _getPortableTableIndexesList($tableIndexes, $tableName = null } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeyDefinition($tableForeignKey) { @@ -267,7 +267,7 @@ protected function _getPortableTableForeignKeyDefinition($tableForeignKey) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableDefinition($table) { @@ -279,7 +279,7 @@ protected function _getPortableTableDefinition($table) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableDatabaseDefinition($database) { @@ -287,7 +287,7 @@ protected function _getPortableDatabaseDefinition($database) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see listSchemaNames()} instead. */ @@ -304,7 +304,7 @@ protected function getPortableNamespaceDefinition(array $namespace) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableViewDefinition($view) { @@ -313,7 +313,7 @@ protected function _getPortableViewDefinition($view) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function alterTable(TableDiff $tableDiff) { @@ -403,7 +403,7 @@ protected function selectTableNames(string $databaseName): Result ORDER BY name SQL; - return $this->_conn->executeQuery($sql, [$databaseName]); + return $this->_conn->executeQuery($sql); } protected function selectTableColumns(string $databaseName, ?string $tableName = null): Result diff --git a/app/vendor/doctrine/dbal/src/Schema/SqliteSchemaManager.php b/app/vendor/doctrine/dbal/src/Schema/SqliteSchemaManager.php index c240ce212..13f5c5147 100644 --- a/app/vendor/doctrine/dbal/src/Schema/SqliteSchemaManager.php +++ b/app/vendor/doctrine/dbal/src/Schema/SqliteSchemaManager.php @@ -107,7 +107,7 @@ protected function fetchForeignKeyColumnsByTable(string $databaseName): array } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Delete the database file using the filesystem. */ @@ -127,7 +127,7 @@ public function dropDatabase($database) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated The engine will create the database file automatically. */ @@ -151,7 +151,7 @@ public function createDatabase($database) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function createForeignKey(ForeignKeyConstraint $foreignKey, $table) { @@ -163,7 +163,7 @@ public function createForeignKey(ForeignKeyConstraint $foreignKey, $table) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated Use {@see dropForeignKey()} and {@see createForeignKey()} instead. */ @@ -184,7 +184,7 @@ public function dropAndCreateForeignKey(ForeignKeyConstraint $foreignKey, $table } /** - * {@inheritdoc} + * {@inheritDoc} */ public function dropForeignKey($foreignKey, $table) { @@ -196,7 +196,7 @@ public function dropForeignKey($foreignKey, $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function listTableForeignKeys($table, $database = null) { @@ -213,7 +213,7 @@ public function listTableForeignKeys($table, $database = null) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableDefinition($table) { @@ -221,7 +221,7 @@ protected function _getPortableTableDefinition($table) } /** - * {@inheritdoc} + * {@inheritDoc} * * @link http://ezcomponents.org/docs/api/trunk/DatabaseSchema/ezcDbSchemaPgsqlReader.html */ @@ -285,7 +285,7 @@ static function (array $a, array $b): int { } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableColumnList($table, $database, $tableColumns) { @@ -352,7 +352,7 @@ protected function _getPortableTableColumnList($table, $database, $tableColumns) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableColumnDefinition($tableColumn) { @@ -417,21 +417,20 @@ protected function _getPortableTableColumnDefinition($tableColumn) } $options = [ - 'length' => $length, - 'unsigned' => $unsigned, - 'fixed' => $fixed, - 'notnull' => $notnull, - 'default' => $default, + 'length' => $length, + 'unsigned' => $unsigned, + 'fixed' => $fixed, + 'notnull' => $notnull, + 'default' => $default, 'precision' => $precision, 'scale' => $scale, - 'autoincrement' => false, ]; return new Column($tableColumn['name'], Type::getType($type), $options); } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableViewDefinition($view) { @@ -439,7 +438,7 @@ protected function _getPortableViewDefinition($view) } /** - * {@inheritdoc} + * {@inheritDoc} */ protected function _getPortableTableForeignKeysList($tableForeignKeys) { @@ -471,6 +470,16 @@ protected function _getPortableTableForeignKeysList($tableForeignKeys) $list[$id]['local'][] = $value['from']; if ($value['to'] === null) { + // Inferring a shorthand form for the foreign key constraint, where the "to" field is empty. + // @see https://www.sqlite.org/foreignkeys.html#fk_indexes. + $foreignTableIndexes = $this->_getPortableTableIndexesList([], $value['table']); + + if (! isset($foreignTableIndexes['primary'])) { + continue; + } + + $list[$id]['foreign'] = [...$list[$id]['foreign'], ...$foreignTableIndexes['primary']->getColumns()]; + continue; } diff --git a/app/vendor/doctrine/dbal/src/Schema/Table.php b/app/vendor/doctrine/dbal/src/Schema/Table.php index 7fbd6091a..ce4cc3260 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Table.php +++ b/app/vendor/doctrine/dbal/src/Schema/Table.php @@ -724,7 +724,7 @@ public function getColumns() */ public function getForeignKeyColumns() { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5731', '%s is deprecated. Use getForeignKey() and ForeignKeyConstraint::getLocalColumns() instead.', @@ -813,7 +813,7 @@ public function getPrimaryKey() */ public function getPrimaryKeyColumns() { - Deprecation::trigger( + Deprecation::triggerIfCalledFromOutside( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5731', '%s is deprecated. Use getPrimaryKey() and Index::getColumns() instead.', diff --git a/app/vendor/doctrine/dbal/src/Schema/TableDiff.php b/app/vendor/doctrine/dbal/src/Schema/TableDiff.php index 58128d75b..9aaf9e770 100644 --- a/app/vendor/doctrine/dbal/src/Schema/TableDiff.php +++ b/app/vendor/doctrine/dbal/src/Schema/TableDiff.php @@ -180,11 +180,11 @@ public function __construct( $this->changedForeignKeys = $changedForeignKeys; $this->removedForeignKeys = $removedForeignKeys; - if ($fromTable !== null) { + if ($fromTable === null) { Deprecation::trigger( 'doctrine/dbal', 'https://github.com/doctrine/dbal/pull/5678', - 'Not passing the $fromColumn to %s is deprecated.', + 'Not passing the $fromTable to %s is deprecated.', __METHOD__, ); } diff --git a/app/vendor/doctrine/dbal/src/Schema/UniqueConstraint.php b/app/vendor/doctrine/dbal/src/Schema/UniqueConstraint.php index 85502e714..f353f303a 100644 --- a/app/vendor/doctrine/dbal/src/Schema/UniqueConstraint.php +++ b/app/vendor/doctrine/dbal/src/Schema/UniqueConstraint.php @@ -57,7 +57,7 @@ public function __construct(string $name, array $columns, array $flags = [], arr } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getColumns() { @@ -65,7 +65,7 @@ public function getColumns() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getQuotedColumns(AbstractPlatform $platform) { diff --git a/app/vendor/doctrine/dbal/src/Schema/Visitor/AbstractVisitor.php b/app/vendor/doctrine/dbal/src/Schema/Visitor/AbstractVisitor.php index 3d2ad27c0..f8f3b5825 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Visitor/AbstractVisitor.php +++ b/app/vendor/doctrine/dbal/src/Schema/Visitor/AbstractVisitor.php @@ -21,7 +21,7 @@ public function acceptSchema(Schema $schema) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptNamespace($namespaceName) { diff --git a/app/vendor/doctrine/dbal/src/Schema/Visitor/CreateSchemaSqlCollector.php b/app/vendor/doctrine/dbal/src/Schema/Visitor/CreateSchemaSqlCollector.php index e7908c3ee..bab0ff982 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Visitor/CreateSchemaSqlCollector.php +++ b/app/vendor/doctrine/dbal/src/Schema/Visitor/CreateSchemaSqlCollector.php @@ -39,7 +39,7 @@ public function __construct(AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptNamespace($namespaceName) { @@ -51,7 +51,7 @@ public function acceptNamespace($namespaceName) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { @@ -59,7 +59,7 @@ public function acceptTable(Table $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { @@ -71,7 +71,7 @@ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkCons } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSequence(Sequence $sequence) { diff --git a/app/vendor/doctrine/dbal/src/Schema/Visitor/DropSchemaSqlCollector.php b/app/vendor/doctrine/dbal/src/Schema/Visitor/DropSchemaSqlCollector.php index 0c5730258..ddec6b4ae 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Visitor/DropSchemaSqlCollector.php +++ b/app/vendor/doctrine/dbal/src/Schema/Visitor/DropSchemaSqlCollector.php @@ -38,7 +38,7 @@ public function __construct(AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { @@ -46,7 +46,7 @@ public function acceptTable(Table $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { @@ -58,7 +58,7 @@ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkCons } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSequence(Sequence $sequence) { diff --git a/app/vendor/doctrine/dbal/src/Schema/Visitor/Graphviz.php b/app/vendor/doctrine/dbal/src/Schema/Visitor/Graphviz.php index e3c61411e..5eff0d945 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Visitor/Graphviz.php +++ b/app/vendor/doctrine/dbal/src/Schema/Visitor/Graphviz.php @@ -21,7 +21,7 @@ class Graphviz extends AbstractVisitor private string $output = ''; /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { @@ -37,7 +37,7 @@ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkCons } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSchema(Schema $schema) { @@ -50,7 +50,7 @@ public function acceptSchema(Schema $schema) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { diff --git a/app/vendor/doctrine/dbal/src/Schema/Visitor/RemoveNamespacedAssets.php b/app/vendor/doctrine/dbal/src/Schema/Visitor/RemoveNamespacedAssets.php index c67bf99e8..5ed349bfd 100644 --- a/app/vendor/doctrine/dbal/src/Schema/Visitor/RemoveNamespacedAssets.php +++ b/app/vendor/doctrine/dbal/src/Schema/Visitor/RemoveNamespacedAssets.php @@ -36,7 +36,7 @@ public function __construct() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSchema(Schema $schema) { @@ -44,7 +44,7 @@ public function acceptSchema(Schema $schema) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptTable(Table $table) { @@ -60,7 +60,7 @@ public function acceptTable(Table $table) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptSequence(Sequence $sequence) { @@ -76,7 +76,7 @@ public function acceptSequence(Sequence $sequence) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint) { diff --git a/app/vendor/doctrine/dbal/src/Tools/Console/Command/CommandCompatibility.php b/app/vendor/doctrine/dbal/src/Tools/Console/Command/CommandCompatibility.php new file mode 100644 index 000000000..562b5ce45 --- /dev/null +++ b/app/vendor/doctrine/dbal/src/Tools/Console/Command/CommandCompatibility.php @@ -0,0 +1,35 @@ +hasReturnType()) { + /** @internal */ + trait CommandCompatibility + { + protected function execute(InputInterface $input, OutputInterface $output): int + { + return $this->doExecute($input, $output); + } + } +} else { + /** @internal */ + trait CommandCompatibility + { + /** + * {@inheritDoc} + * + * @return int + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + return $this->doExecute($input, $output); + } + } +} diff --git a/app/vendor/doctrine/dbal/src/Tools/Console/Command/ReservedWordsCommand.php b/app/vendor/doctrine/dbal/src/Tools/Console/Command/ReservedWordsCommand.php index 4748d717b..e63315466 100644 --- a/app/vendor/doctrine/dbal/src/Tools/Console/Command/ReservedWordsCommand.php +++ b/app/vendor/doctrine/dbal/src/Tools/Console/Command/ReservedWordsCommand.php @@ -34,6 +34,8 @@ /** @deprecated Use database documentation instead. */ class ReservedWordsCommand extends Command { + use CommandCompatibility; + /** @var array */ private array $keywordLists; @@ -136,14 +138,8 @@ protected function configure() EOT); } - /** - * {@inheritdoc} - * - * @return int - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) + /** @throws Exception */ + private function doExecute(InputInterface $input, OutputInterface $output): int { $output->writeln( 'The dbal:reserved-words command is deprecated.' diff --git a/app/vendor/doctrine/dbal/src/Tools/Console/Command/RunSqlCommand.php b/app/vendor/doctrine/dbal/src/Tools/Console/Command/RunSqlCommand.php index 5f4f7a92f..4e5681e27 100644 --- a/app/vendor/doctrine/dbal/src/Tools/Console/Command/RunSqlCommand.php +++ b/app/vendor/doctrine/dbal/src/Tools/Console/Command/RunSqlCommand.php @@ -26,6 +26,8 @@ */ class RunSqlCommand extends Command { + use CommandCompatibility; + private ConnectionProvider $connectionProvider; public function __construct(ConnectionProvider $connectionProvider) @@ -55,14 +57,8 @@ protected function configure() EOT); } - /** - * {@inheritdoc} - * - * @return int - * - * @throws Exception - */ - protected function execute(InputInterface $input, OutputInterface $output) + /** @throws Exception */ + private function doExecute(InputInterface $input, OutputInterface $output): int { $conn = $this->getConnection($input); $io = new SymfonyStyle($input, $output); diff --git a/app/vendor/doctrine/dbal/src/Tools/DsnParser.php b/app/vendor/doctrine/dbal/src/Tools/DsnParser.php index f048f585e..4ac0484d1 100644 --- a/app/vendor/doctrine/dbal/src/Tools/DsnParser.php +++ b/app/vendor/doctrine/dbal/src/Tools/DsnParser.php @@ -2,12 +2,14 @@ namespace Doctrine\DBAL\Tools; +use Doctrine\DBAL\Driver; use Doctrine\DBAL\DriverManager; use Doctrine\DBAL\Exception\MalformedDsnException; use SensitiveParameter; use function array_merge; use function assert; +use function is_a; use function is_string; use function parse_str; use function parse_url; @@ -20,10 +22,10 @@ /** @psalm-import-type Params from DriverManager */ final class DsnParser { - /** @var array */ + /** @var array> */ private array $schemeMapping; - /** @param array $schemeMapping An array used to map DSN schemes to DBAL drivers */ + /** @param array> $schemeMapping An array used to map DSN schemes to DBAL drivers */ public function __construct(array $schemeMapping = []) { $this->schemeMapping = $schemeMapping; @@ -38,8 +40,8 @@ public function parse( #[SensitiveParameter] string $dsn ): array { - // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid - $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsn); + // (pdo-)?sqlite3?:///... => (pdo-)?sqlite3?://localhost/... or else the URL will be invalid + $url = preg_replace('#^((?:pdo-)?sqlite3?):///#', '$1://localhost/', $dsn); assert($url !== null); $url = parse_url($url); @@ -78,6 +80,11 @@ public function parse( $params['password'] = $url['pass']; } + if (isset($params['driver']) && is_a($params['driver'], Driver::class, true)) { + $params['driverClass'] = $params['driver']; + unset($params['driver']); + } + $params = $this->parseDatabaseUrlPath($url, $params); $params = $this->parseDatabaseUrlQuery($url, $params); diff --git a/app/vendor/doctrine/dbal/src/Types/ArrayType.php b/app/vendor/doctrine/dbal/src/Types/ArrayType.php index fb202406f..c2aa2f4de 100644 --- a/app/vendor/doctrine/dbal/src/Types/ArrayType.php +++ b/app/vendor/doctrine/dbal/src/Types/ArrayType.php @@ -23,7 +23,7 @@ class ArrayType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -31,7 +31,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToDatabaseValue($value, AbstractPlatform $platform) { @@ -40,7 +40,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -66,7 +66,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -74,7 +74,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/AsciiStringType.php b/app/vendor/doctrine/dbal/src/Types/AsciiStringType.php index ab1e0e061..4ea92d974 100644 --- a/app/vendor/doctrine/dbal/src/Types/AsciiStringType.php +++ b/app/vendor/doctrine/dbal/src/Types/AsciiStringType.php @@ -10,7 +10,7 @@ final class AsciiStringType extends StringType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { diff --git a/app/vendor/doctrine/dbal/src/Types/BigIntType.php b/app/vendor/doctrine/dbal/src/Types/BigIntType.php index 795883b3a..8d57a1121 100644 --- a/app/vendor/doctrine/dbal/src/Types/BigIntType.php +++ b/app/vendor/doctrine/dbal/src/Types/BigIntType.php @@ -11,7 +11,7 @@ class BigIntType extends Type implements PhpIntegerMappingType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -19,7 +19,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -27,7 +27,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { @@ -35,7 +35,7 @@ public function getBindingType() } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * diff --git a/app/vendor/doctrine/dbal/src/Types/BinaryType.php b/app/vendor/doctrine/dbal/src/Types/BinaryType.php index e030f1660..acbbd87ad 100644 --- a/app/vendor/doctrine/dbal/src/Types/BinaryType.php +++ b/app/vendor/doctrine/dbal/src/Types/BinaryType.php @@ -18,7 +18,7 @@ class BinaryType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -26,7 +26,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -50,7 +50,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -58,7 +58,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { diff --git a/app/vendor/doctrine/dbal/src/Types/BlobType.php b/app/vendor/doctrine/dbal/src/Types/BlobType.php index b71e7255e..cfaabec90 100644 --- a/app/vendor/doctrine/dbal/src/Types/BlobType.php +++ b/app/vendor/doctrine/dbal/src/Types/BlobType.php @@ -18,7 +18,7 @@ class BlobType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -26,7 +26,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -50,7 +50,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -58,7 +58,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { diff --git a/app/vendor/doctrine/dbal/src/Types/BooleanType.php b/app/vendor/doctrine/dbal/src/Types/BooleanType.php index 440ca72bd..7dc7f3a9d 100644 --- a/app/vendor/doctrine/dbal/src/Types/BooleanType.php +++ b/app/vendor/doctrine/dbal/src/Types/BooleanType.php @@ -13,7 +13,7 @@ class BooleanType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -21,7 +21,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToDatabaseValue($value, AbstractPlatform $platform) { @@ -29,7 +29,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -43,7 +43,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -51,7 +51,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { diff --git a/app/vendor/doctrine/dbal/src/Types/DateImmutableType.php b/app/vendor/doctrine/dbal/src/Types/DateImmutableType.php index 86f054470..da96b69d5 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateImmutableType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateImmutableType.php @@ -12,7 +12,7 @@ class DateImmutableType extends DateType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -20,7 +20,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -46,7 +46,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -74,7 +74,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/DateIntervalType.php b/app/vendor/doctrine/dbal/src/Types/DateIntervalType.php index ac4885d97..1630dc556 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateIntervalType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateIntervalType.php @@ -17,7 +17,7 @@ class DateIntervalType extends Type public const FORMAT = '%RP%YY%MM%DDT%HH%IM%SS'; /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -25,7 +25,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -35,7 +35,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -53,11 +53,11 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) return $value->format(self::FORMAT); } - throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', 'DateInterval']); + throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', DateInterval::class]); } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -92,7 +92,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/DateTimeImmutableType.php b/app/vendor/doctrine/dbal/src/Types/DateTimeImmutableType.php index cb1a17f29..a8c7fec96 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateTimeImmutableType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateTimeImmutableType.php @@ -5,8 +5,7 @@ use DateTimeImmutable; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\Deprecations\Deprecation; - -use function date_create_immutable; +use Exception; /** * Immutable type of {@see DateTimeType}. @@ -14,7 +13,7 @@ class DateTimeImmutableType extends DateTimeType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -22,7 +21,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -48,7 +47,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -64,23 +63,24 @@ public function convertToPHPValue($value, AbstractPlatform $platform) $dateTime = DateTimeImmutable::createFromFormat($platform->getDateTimeFormatString(), $value); - if ($dateTime === false) { - $dateTime = date_create_immutable($value); + if ($dateTime !== false) { + return $dateTime; } - if ($dateTime === false) { + try { + return new DateTimeImmutable($value); + } catch (Exception $e) { throw ConversionException::conversionFailedFormat( $value, $this->getName(), $platform->getDateTimeFormatString(), + $e, ); } - - return $dateTime; } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/DateTimeType.php b/app/vendor/doctrine/dbal/src/Types/DateTimeType.php index 4a75dfd7e..3ff592ae1 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateTimeType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateTimeType.php @@ -3,10 +3,13 @@ namespace Doctrine\DBAL\Types; use DateTime; +use DateTimeImmutable; use DateTimeInterface; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\Deprecations\Deprecation; +use Exception; -use function date_create; +use function get_class; /** * Type that maps an SQL DATETIME/TIMESTAMP to a PHP DateTime object. @@ -14,7 +17,7 @@ class DateTimeType extends Type implements PhpDateTimeMappingType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -22,7 +25,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -30,7 +33,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -44,15 +47,30 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) return $value; } + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateTimeImmutableType::class, + __FUNCTION__, + ); + } + if ($value instanceof DateTimeInterface) { return $value->format($platform->getDateTimeFormatString()); } - throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', 'DateTime']); + throw ConversionException::conversionFailedInvalidType( + $value, + $this->getName(), + ['null', DateTime::class, DateTimeImmutable::class], + ); } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -62,24 +80,36 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) */ public function convertToPHPValue($value, AbstractPlatform $platform) { + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateTimeImmutableType::class, + __FUNCTION__, + ); + } + if ($value === null || $value instanceof DateTimeInterface) { return $value; } - $val = DateTime::createFromFormat($platform->getDateTimeFormatString(), $value); + $dateTime = DateTime::createFromFormat($platform->getDateTimeFormatString(), $value); - if ($val === false) { - $val = date_create($value); + if ($dateTime !== false) { + return $dateTime; } - if ($val === false) { + try { + return new DateTime($value); + } catch (Exception $e) { throw ConversionException::conversionFailedFormat( $value, $this->getName(), $platform->getDateTimeFormatString(), + $e, ); } - - return $val; } } diff --git a/app/vendor/doctrine/dbal/src/Types/DateTimeTzImmutableType.php b/app/vendor/doctrine/dbal/src/Types/DateTimeTzImmutableType.php index aab826aa4..e700f68d4 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateTimeTzImmutableType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateTimeTzImmutableType.php @@ -12,7 +12,7 @@ class DateTimeTzImmutableType extends DateTimeTzType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -20,7 +20,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @psalm-param T $value * @@ -46,7 +46,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -62,19 +62,19 @@ public function convertToPHPValue($value, AbstractPlatform $platform) $dateTime = DateTimeImmutable::createFromFormat($platform->getDateTimeTzFormatString(), $value); - if ($dateTime === false) { - throw ConversionException::conversionFailedFormat( - $value, - $this->getName(), - $platform->getDateTimeTzFormatString(), - ); + if ($dateTime !== false) { + return $dateTime; } - return $dateTime; + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getDateTimeTzFormatString(), + ); } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/DateTimeTzType.php b/app/vendor/doctrine/dbal/src/Types/DateTimeTzType.php index c3f3fc9cb..1980fd334 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateTimeTzType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateTimeTzType.php @@ -3,8 +3,12 @@ namespace Doctrine\DBAL\Types; use DateTime; +use DateTimeImmutable; use DateTimeInterface; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\Deprecations\Deprecation; + +use function get_class; /** * DateTime type saving additional timezone information. @@ -25,7 +29,7 @@ class DateTimeTzType extends Type implements PhpDateTimeMappingType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -33,7 +37,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -41,7 +45,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -55,6 +59,17 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) return $value; } + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateTimeTzImmutableType::class, + __FUNCTION__, + ); + } + if ($value instanceof DateTimeInterface) { return $value->format($platform->getDateTimeTzFormatString()); } @@ -62,12 +77,12 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) throw ConversionException::conversionFailedInvalidType( $value, $this->getName(), - ['null', 'DateTime'], + ['null', DateTime::class], ); } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -77,19 +92,30 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) */ public function convertToPHPValue($value, AbstractPlatform $platform) { + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateTimeTzImmutableType::class, + __FUNCTION__, + ); + } + if ($value === null || $value instanceof DateTimeInterface) { return $value; } - $val = DateTime::createFromFormat($platform->getDateTimeTzFormatString(), $value); - if ($val === false) { - throw ConversionException::conversionFailedFormat( - $value, - $this->getName(), - $platform->getDateTimeTzFormatString(), - ); + $dateTime = DateTime::createFromFormat($platform->getDateTimeTzFormatString(), $value); + if ($dateTime !== false) { + return $dateTime; } - return $val; + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getDateTimeTzFormatString(), + ); } } diff --git a/app/vendor/doctrine/dbal/src/Types/DateType.php b/app/vendor/doctrine/dbal/src/Types/DateType.php index 7ce9656a7..842e8bd09 100644 --- a/app/vendor/doctrine/dbal/src/Types/DateType.php +++ b/app/vendor/doctrine/dbal/src/Types/DateType.php @@ -3,8 +3,12 @@ namespace Doctrine\DBAL\Types; use DateTime; +use DateTimeImmutable; use DateTimeInterface; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\Deprecations\Deprecation; + +use function get_class; /** * Type that maps an SQL DATE to a PHP Date object. @@ -12,7 +16,7 @@ class DateType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -20,7 +24,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -28,7 +32,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @psalm-param T $value * @@ -43,14 +47,25 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } if ($value instanceof DateTimeInterface) { + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateImmutableType::class, + __FUNCTION__, + ); + } + return $value->format($platform->getDateFormatString()); } - throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', 'DateTime']); + throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', DateTime::class]); } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -60,19 +75,30 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) */ public function convertToPHPValue($value, AbstractPlatform $platform) { + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + DateImmutableType::class, + __FUNCTION__, + ); + } + if ($value === null || $value instanceof DateTimeInterface) { return $value; } - $val = DateTime::createFromFormat('!' . $platform->getDateFormatString(), $value); - if ($val === false) { - throw ConversionException::conversionFailedFormat( - $value, - $this->getName(), - $platform->getDateFormatString(), - ); + $dateTime = DateTime::createFromFormat('!' . $platform->getDateFormatString(), $value); + if ($dateTime !== false) { + return $dateTime; } - return $val; + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getDateFormatString(), + ); } } diff --git a/app/vendor/doctrine/dbal/src/Types/DecimalType.php b/app/vendor/doctrine/dbal/src/Types/DecimalType.php index 144e97a04..308134b08 100644 --- a/app/vendor/doctrine/dbal/src/Types/DecimalType.php +++ b/app/vendor/doctrine/dbal/src/Types/DecimalType.php @@ -16,7 +16,7 @@ class DecimalType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -24,7 +24,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -32,7 +32,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { diff --git a/app/vendor/doctrine/dbal/src/Types/FloatType.php b/app/vendor/doctrine/dbal/src/Types/FloatType.php index d8cb33557..e01b77413 100644 --- a/app/vendor/doctrine/dbal/src/Types/FloatType.php +++ b/app/vendor/doctrine/dbal/src/Types/FloatType.php @@ -7,7 +7,7 @@ class FloatType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -15,7 +15,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -23,7 +23,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * diff --git a/app/vendor/doctrine/dbal/src/Types/GuidType.php b/app/vendor/doctrine/dbal/src/Types/GuidType.php index 6ce903e2b..3c8b7f4f8 100644 --- a/app/vendor/doctrine/dbal/src/Types/GuidType.php +++ b/app/vendor/doctrine/dbal/src/Types/GuidType.php @@ -11,7 +11,7 @@ class GuidType extends StringType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -19,7 +19,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -27,7 +27,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/IntegerType.php b/app/vendor/doctrine/dbal/src/Types/IntegerType.php index 57ba7087e..7c2d7110d 100644 --- a/app/vendor/doctrine/dbal/src/Types/IntegerType.php +++ b/app/vendor/doctrine/dbal/src/Types/IntegerType.php @@ -11,7 +11,7 @@ class IntegerType extends Type implements PhpIntegerMappingType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -19,7 +19,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -27,7 +27,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -41,7 +41,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { diff --git a/app/vendor/doctrine/dbal/src/Types/JsonType.php b/app/vendor/doctrine/dbal/src/Types/JsonType.php index 797f5bc3d..27f872c88 100644 --- a/app/vendor/doctrine/dbal/src/Types/JsonType.php +++ b/app/vendor/doctrine/dbal/src/Types/JsonType.php @@ -20,7 +20,7 @@ class JsonType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -28,7 +28,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -50,7 +50,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -70,7 +70,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -78,7 +78,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/ObjectType.php b/app/vendor/doctrine/dbal/src/Types/ObjectType.php index 1c497a3ff..497e9c407 100644 --- a/app/vendor/doctrine/dbal/src/Types/ObjectType.php +++ b/app/vendor/doctrine/dbal/src/Types/ObjectType.php @@ -20,7 +20,7 @@ class ObjectType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -28,7 +28,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param mixed $value * @@ -40,7 +40,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -62,7 +62,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -70,7 +70,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/SimpleArrayType.php b/app/vendor/doctrine/dbal/src/Types/SimpleArrayType.php index 0961ae398..ee97b9b9f 100644 --- a/app/vendor/doctrine/dbal/src/Types/SimpleArrayType.php +++ b/app/vendor/doctrine/dbal/src/Types/SimpleArrayType.php @@ -20,7 +20,7 @@ class SimpleArrayType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -28,7 +28,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param mixed $value * @@ -44,7 +44,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param mixed $value * @@ -62,7 +62,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -70,7 +70,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/SmallIntType.php b/app/vendor/doctrine/dbal/src/Types/SmallIntType.php index e38f4ca72..2c8567a11 100644 --- a/app/vendor/doctrine/dbal/src/Types/SmallIntType.php +++ b/app/vendor/doctrine/dbal/src/Types/SmallIntType.php @@ -11,7 +11,7 @@ class SmallIntType extends Type implements PhpIntegerMappingType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -19,7 +19,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -27,7 +27,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -41,7 +41,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getBindingType() { diff --git a/app/vendor/doctrine/dbal/src/Types/StringType.php b/app/vendor/doctrine/dbal/src/Types/StringType.php index e409c2a8f..1992e8fa4 100644 --- a/app/vendor/doctrine/dbal/src/Types/StringType.php +++ b/app/vendor/doctrine/dbal/src/Types/StringType.php @@ -10,7 +10,7 @@ class StringType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -18,7 +18,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { diff --git a/app/vendor/doctrine/dbal/src/Types/TextType.php b/app/vendor/doctrine/dbal/src/Types/TextType.php index b1e640b69..d060bb2da 100644 --- a/app/vendor/doctrine/dbal/src/Types/TextType.php +++ b/app/vendor/doctrine/dbal/src/Types/TextType.php @@ -13,7 +13,7 @@ class TextType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -21,7 +21,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function convertToPHPValue($value, AbstractPlatform $platform) { @@ -29,7 +29,7 @@ public function convertToPHPValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { diff --git a/app/vendor/doctrine/dbal/src/Types/TimeImmutableType.php b/app/vendor/doctrine/dbal/src/Types/TimeImmutableType.php index a3f0040b4..9373f5913 100644 --- a/app/vendor/doctrine/dbal/src/Types/TimeImmutableType.php +++ b/app/vendor/doctrine/dbal/src/Types/TimeImmutableType.php @@ -12,7 +12,7 @@ class TimeImmutableType extends TimeType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -20,7 +20,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -46,7 +46,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -62,19 +62,19 @@ public function convertToPHPValue($value, AbstractPlatform $platform) $dateTime = DateTimeImmutable::createFromFormat('!' . $platform->getTimeFormatString(), $value); - if ($dateTime === false) { - throw ConversionException::conversionFailedFormat( - $value, - $this->getName(), - $platform->getTimeFormatString(), - ); + if ($dateTime !== false) { + return $dateTime; } - return $dateTime; + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getTimeFormatString(), + ); } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/TimeType.php b/app/vendor/doctrine/dbal/src/Types/TimeType.php index 0123d4ba8..7356fc206 100644 --- a/app/vendor/doctrine/dbal/src/Types/TimeType.php +++ b/app/vendor/doctrine/dbal/src/Types/TimeType.php @@ -3,8 +3,12 @@ namespace Doctrine\DBAL\Types; use DateTime; +use DateTimeImmutable; use DateTimeInterface; use Doctrine\DBAL\Platforms\AbstractPlatform; +use Doctrine\Deprecations\Deprecation; + +use function get_class; /** * Type that maps an SQL TIME to a PHP DateTime object. @@ -12,7 +16,7 @@ class TimeType extends Type { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -20,7 +24,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} */ public function getSQLDeclaration(array $column, AbstractPlatform $platform) { @@ -28,7 +32,7 @@ public function getSQLDeclaration(array $column, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -42,15 +46,26 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) return $value; } + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + TimeImmutableType::class, + __FUNCTION__, + ); + } + if ($value instanceof DateTimeInterface) { return $value->format($platform->getTimeFormatString()); } - throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', 'DateTime']); + throw ConversionException::conversionFailedInvalidType($value, $this->getName(), ['null', DateTime::class]); } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -60,19 +75,30 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) */ public function convertToPHPValue($value, AbstractPlatform $platform) { + if ($value instanceof DateTimeImmutable) { + Deprecation::triggerIfCalledFromOutside( + 'doctrine/dbal', + 'https://github.com/doctrine/dbal/pull/6017', + 'Passing an instance of %s is deprecated, use %s::%s() instead.', + get_class($value), + TimeImmutableType::class, + __FUNCTION__, + ); + } + if ($value === null || $value instanceof DateTimeInterface) { return $value; } - $val = DateTime::createFromFormat('!' . $platform->getTimeFormatString(), $value); - if ($val === false) { - throw ConversionException::conversionFailedFormat( - $value, - $this->getName(), - $platform->getTimeFormatString(), - ); + $dateTime = DateTime::createFromFormat('!' . $platform->getTimeFormatString(), $value); + if ($dateTime !== false) { + return $dateTime; } - return $val; + throw ConversionException::conversionFailedFormat( + $value, + $this->getName(), + $platform->getTimeFormatString(), + ); } } diff --git a/app/vendor/doctrine/dbal/src/Types/Type.php b/app/vendor/doctrine/dbal/src/Types/Type.php index 536cf36f2..7613811e9 100644 --- a/app/vendor/doctrine/dbal/src/Types/Type.php +++ b/app/vendor/doctrine/dbal/src/Types/Type.php @@ -100,7 +100,8 @@ abstract public function getSQLDeclaration(array $column, AbstractPlatform $plat /** * Gets the name of this type. * - * @deprecated this method will be removed in Doctrine DBAL 4.0. + * @deprecated this method will be removed in Doctrine DBAL 4.0, + * use {@see TypeRegistry::lookupName()} instead. * * @return string */ @@ -137,6 +138,16 @@ public static function getType($name) return self::getTypeRegistry()->get($name); } + /** + * Finds a name for the given type. + * + * @throws Exception + */ + public static function lookupName(self $type): string + { + return self::getTypeRegistry()->lookupName($type); + } + /** * Adds a custom type to the type map. * diff --git a/app/vendor/doctrine/dbal/src/Types/TypeRegistry.php b/app/vendor/doctrine/dbal/src/Types/TypeRegistry.php index b5e800ad1..9b64c6faf 100644 --- a/app/vendor/doctrine/dbal/src/Types/TypeRegistry.php +++ b/app/vendor/doctrine/dbal/src/Types/TypeRegistry.php @@ -6,8 +6,7 @@ use Doctrine\DBAL\Exception; -use function array_search; -use function in_array; +use function spl_object_id; /** * The type registry is responsible for holding a map of all known DBAL types. @@ -17,11 +16,17 @@ final class TypeRegistry { /** @var array Map of type names and their corresponding flyweight objects. */ private array $instances; + /** @var array */ + private array $instancesReverseIndex; /** @param array $instances */ public function __construct(array $instances = []) { - $this->instances = $instances; + $this->instances = []; + $this->instancesReverseIndex = []; + foreach ($instances as $name => $type) { + $this->register($name, $type); + } } /** @@ -31,11 +36,12 @@ public function __construct(array $instances = []) */ public function get(string $name): Type { - if (! isset($this->instances[$name])) { + $type = $this->instances[$name] ?? null; + if ($type === null) { throw Exception::unknownColumnType($name); } - return $this->instances[$name]; + return $type; } /** @@ -77,7 +83,8 @@ public function register(string $name, Type $type): void throw Exception::typeAlreadyRegistered($type); } - $this->instances[$name] = $type; + $this->instances[$name] = $type; + $this->instancesReverseIndex[spl_object_id($type)] = $name; } /** @@ -87,15 +94,18 @@ public function register(string $name, Type $type): void */ public function override(string $name, Type $type): void { - if (! isset($this->instances[$name])) { + $origType = $this->instances[$name] ?? null; + if ($origType === null) { throw Exception::typeNotFound($name); } - if (! in_array($this->findTypeName($type), [$name, null], true)) { + if (($this->findTypeName($type) ?? $name) !== $name) { throw Exception::typeAlreadyRegistered($type); } - $this->instances[$name] = $type; + unset($this->instancesReverseIndex[spl_object_id($origType)]); + $this->instances[$name] = $type; + $this->instancesReverseIndex[spl_object_id($type)] = $name; } /** @@ -112,12 +122,6 @@ public function getMap(): array private function findTypeName(Type $type): ?string { - $name = array_search($type, $this->instances, true); - - if ($name === false) { - return null; - } - - return $name; + return $this->instancesReverseIndex[spl_object_id($type)] ?? null; } } diff --git a/app/vendor/doctrine/dbal/src/Types/VarDateTimeImmutableType.php b/app/vendor/doctrine/dbal/src/Types/VarDateTimeImmutableType.php index 9ac690514..cd6fa890b 100644 --- a/app/vendor/doctrine/dbal/src/Types/VarDateTimeImmutableType.php +++ b/app/vendor/doctrine/dbal/src/Types/VarDateTimeImmutableType.php @@ -5,8 +5,7 @@ use DateTimeImmutable; use Doctrine\DBAL\Platforms\AbstractPlatform; use Doctrine\Deprecations\Deprecation; - -use function date_create_immutable; +use Exception; /** * Immutable type of {@see VarDateTimeType}. @@ -14,7 +13,7 @@ class VarDateTimeImmutableType extends VarDateTimeType { /** - * {@inheritdoc} + * {@inheritDoc} */ public function getName() { @@ -22,7 +21,7 @@ public function getName() } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -48,7 +47,7 @@ public function convertToDatabaseValue($value, AbstractPlatform $platform) } /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -62,17 +61,17 @@ public function convertToPHPValue($value, AbstractPlatform $platform) return $value; } - $dateTime = date_create_immutable($value); - - if ($dateTime === false) { - throw ConversionException::conversionFailed($value, $this->getName()); + try { + $dateTime = new DateTimeImmutable($value); + } catch (Exception $e) { + throw ConversionException::conversionFailed($value, $this->getName(), $e); } return $dateTime; } /** - * {@inheritdoc} + * {@inheritDoc} * * @deprecated */ diff --git a/app/vendor/doctrine/dbal/src/Types/VarDateTimeType.php b/app/vendor/doctrine/dbal/src/Types/VarDateTimeType.php index 58c1208af..35ad40328 100644 --- a/app/vendor/doctrine/dbal/src/Types/VarDateTimeType.php +++ b/app/vendor/doctrine/dbal/src/Types/VarDateTimeType.php @@ -5,11 +5,10 @@ use DateTime; use DateTimeInterface; use Doctrine\DBAL\Platforms\AbstractPlatform; - -use function date_create; +use Exception; /** - * Variable DateTime Type using date_create() instead of DateTime::createFromFormat(). + * Variable DateTime Type using DateTime::__construct() instead of DateTime::createFromFormat(). * * This type has performance implications as it runs twice as long as the regular * {@see DateTimeType}, however in certain PostgreSQL configurations with @@ -18,7 +17,7 @@ class VarDateTimeType extends DateTimeType { /** - * {@inheritdoc} + * {@inheritDoc} * * @param T $value * @@ -32,11 +31,12 @@ public function convertToPHPValue($value, AbstractPlatform $platform) return $value; } - $val = date_create($value); - if ($val === false) { - throw ConversionException::conversionFailed($value, $this->getName()); + try { + $dateTime = new DateTime($value); + } catch (Exception $e) { + throw ConversionException::conversionFailed($value, $this->getName(), $e); } - return $val; + return $dateTime; } } diff --git a/app/vendor/doctrine/dbal/static-analysis/driver-manager-get-available-drivers-return-type.php b/app/vendor/doctrine/dbal/static-analysis/driver-manager-get-available-drivers-return-type.php deleted file mode 100644 index e8beff908..000000000 --- a/app/vendor/doctrine/dbal/static-analysis/driver-manager-get-available-drivers-return-type.php +++ /dev/null @@ -1,18 +0,0 @@ - $driver]); diff --git a/app/vendor/doctrine/dbal/static-analysis/driver-manager-retrieves-correct-connection-type.php b/app/vendor/doctrine/dbal/static-analysis/driver-manager-retrieves-correct-connection-type.php deleted file mode 100644 index 566db2474..000000000 --- a/app/vendor/doctrine/dbal/static-analysis/driver-manager-retrieves-correct-connection-type.php +++ /dev/null @@ -1,19 +0,0 @@ - MyConnection::class, - ]); -} diff --git a/app/vendor/doctrine/deprecations/README.md b/app/vendor/doctrine/deprecations/README.md index 22f0cced3..93caf83f8 100644 --- a/app/vendor/doctrine/deprecations/README.md +++ b/app/vendor/doctrine/deprecations/README.md @@ -19,13 +19,16 @@ Enable Doctrine deprecations to be sent to a PSR3 logger: ``` Enable Doctrine deprecations to be sent as `@trigger_error($message, E_USER_DEPRECATED)` -messages. +messages by setting the `DOCTRINE_DEPRECATIONS` environment variable to `trigger`. +Alternatively, call: ```php \Doctrine\Deprecations\Deprecation::enableWithTriggerError(); ``` -If you only want to enable deprecation tracking, without logging or calling `trigger_error` then call: +If you only want to enable deprecation tracking, without logging or calling `trigger_error` +then set the `DOCTRINE_DEPRECATIONS` environment variable to `track`. +Alternatively, call: ```php \Doctrine\Deprecations\Deprecation::enableTrackingDeprecations(); diff --git a/app/vendor/doctrine/deprecations/composer.json b/app/vendor/doctrine/deprecations/composer.json index c79e38cdc..f8319f9a2 100644 --- a/app/vendor/doctrine/deprecations/composer.json +++ b/app/vendor/doctrine/deprecations/composer.json @@ -1,22 +1,28 @@ { "name": "doctrine/deprecations", - "type": "library", "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", "license": "MIT", + "type": "library", + "homepage": "https://www.doctrine-project.org/", "require": { - "php": "^7.1|^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.5|^8.5|^9.5", - "psr/log": "^1|^2|^3", - "doctrine/coding-standard": "^9" + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" }, "suggest": { "psr/log": "Allows logging deprecations via PSR-3 logger implementation" }, "autoload": { - "psr-4": {"Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations"} + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } }, "autoload-dev": { "psr-4": { diff --git a/app/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php b/app/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php index 1029372fa..07cb43b6c 100644 --- a/app/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php +++ b/app/vendor/doctrine/deprecations/lib/Doctrine/Deprecations/Deprecation.php @@ -8,6 +8,7 @@ use function array_key_exists; use function array_reduce; +use function assert; use function debug_backtrace; use function sprintf; use function strpos; @@ -46,8 +47,8 @@ class Deprecation private const TYPE_TRIGGER_ERROR = 2; private const TYPE_PSR_LOGGER = 4; - /** @var int */ - private static $type = self::TYPE_NONE; + /** @var int-mask-of|null */ + private static $type; /** @var LoggerInterface|null */ private static $logger; @@ -56,6 +57,9 @@ class Deprecation private static $ignoredPackages = []; /** @var array */ + private static $triggeredDeprecations = []; + + /** @var array */ private static $ignoredLinks = []; /** @var bool */ @@ -68,21 +72,27 @@ class Deprecation * deprecation. It is additionally used to de-duplicate the trigger of the * same deprecation during a request. * - * @param mixed $args + * @param float|int|string $args */ public static function trigger(string $package, string $link, string $message, ...$args): void { - if (self::$type === self::TYPE_NONE) { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { + return; + } + + if (isset(self::$ignoredLinks[$link])) { return; } - if (array_key_exists($link, self::$ignoredLinks)) { - self::$ignoredLinks[$link]++; + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; } else { - self::$ignoredLinks[$link] = 1; + self::$triggeredDeprecations[$link] = 1; } - if (self::$deduplication === true && self::$ignoredLinks[$link] > 1) { + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { return; } @@ -114,18 +124,20 @@ public static function trigger(string $package, string $link, string $message, . * deprecation tracking is enabled even during deduplication, because it * needs to call {@link debug_backtrace()} * - * @param mixed $args + * @param float|int|string $args */ public static function triggerIfCalledFromOutside(string $package, string $link, string $message, ...$args): void { - if (self::$type === self::TYPE_NONE) { + $type = self::$type ?? self::getTypeFromEnv(); + + if ($type === self::TYPE_NONE) { return; } $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); // first check that the caller is not from a tests folder, in which case we always let deprecations pass - if (strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === false) { + if (isset($backtrace[1]['file'], $backtrace[0]['file']) && strpos($backtrace[1]['file'], DIRECTORY_SEPARATOR . 'tests' . DIRECTORY_SEPARATOR) === false) { $path = DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . $package . DIRECTORY_SEPARATOR; if (strpos($backtrace[0]['file'], $path) === false) { @@ -137,13 +149,17 @@ public static function triggerIfCalledFromOutside(string $package, string $link, } } - if (array_key_exists($link, self::$ignoredLinks)) { - self::$ignoredLinks[$link]++; + if (isset(self::$ignoredLinks[$link])) { + return; + } + + if (array_key_exists($link, self::$triggeredDeprecations)) { + self::$triggeredDeprecations[$link]++; } else { - self::$ignoredLinks[$link] = 1; + self::$triggeredDeprecations[$link] = 1; } - if (self::$deduplication === true && self::$ignoredLinks[$link] > 1) { + if (self::$deduplication === true && self::$triggeredDeprecations[$link] > 1) { return; } @@ -157,31 +173,35 @@ public static function triggerIfCalledFromOutside(string $package, string $link, } /** - * @param array $backtrace + * @param list $backtrace */ private static function delegateTriggerToBackend(string $message, array $backtrace, string $link, string $package): void { - if ((self::$type & self::TYPE_PSR_LOGGER) > 0) { + $type = self::$type ?? self::getTypeFromEnv(); + + if (($type & self::TYPE_PSR_LOGGER) > 0) { $context = [ - 'file' => $backtrace[0]['file'], - 'line' => $backtrace[0]['line'], + 'file' => $backtrace[0]['file'] ?? null, + 'line' => $backtrace[0]['line'] ?? null, 'package' => $package, 'link' => $link, ]; + assert(self::$logger !== null); + self::$logger->notice($message, $context); } - if (! ((self::$type & self::TYPE_TRIGGER_ERROR) > 0)) { + if (! (($type & self::TYPE_TRIGGER_ERROR) > 0)) { return; } $message .= sprintf( ' (%s:%d called by %s:%d, %s, package %s)', - self::basename($backtrace[0]['file']), - $backtrace[0]['line'], - self::basename($backtrace[1]['file']), - $backtrace[1]['line'], + self::basename($backtrace[0]['file'] ?? 'native code'), + $backtrace[0]['line'] ?? 0, + self::basename($backtrace[1]['file'] ?? 'native code'), + $backtrace[1]['line'] ?? 0, $link, $package ); @@ -205,16 +225,19 @@ private static function basename(string $filename): string public static function enableTrackingDeprecations(): void { + self::$type = self::$type ?? 0; self::$type |= self::TYPE_TRACK_DEPRECATIONS; } public static function enableWithTriggerError(): void { + self::$type = self::$type ?? 0; self::$type |= self::TYPE_TRIGGER_ERROR; } public static function enableWithPsrLogger(LoggerInterface $logger): void { + self::$type = self::$type ?? 0; self::$type |= self::TYPE_PSR_LOGGER; self::$logger = $logger; } @@ -229,9 +252,10 @@ public static function disable(): void self::$type = self::TYPE_NONE; self::$logger = null; self::$deduplication = true; + self::$ignoredLinks = []; - foreach (self::$ignoredLinks as $link => $count) { - self::$ignoredLinks[$link] = 0; + foreach (self::$triggeredDeprecations as $link => $count) { + self::$triggeredDeprecations[$link] = 0; } } @@ -243,13 +267,13 @@ public static function ignorePackage(string $packageName): void public static function ignoreDeprecations(string ...$links): void { foreach ($links as $link) { - self::$ignoredLinks[$link] = 0; + self::$ignoredLinks[$link] = true; } } public static function getUniqueTriggeredDeprecationsCount(): int { - return array_reduce(self::$ignoredLinks, static function (int $carry, int $count) { + return array_reduce(self::$triggeredDeprecations, static function (int $carry, int $count) { return $carry + $count; }, 0); } @@ -261,6 +285,28 @@ public static function getUniqueTriggeredDeprecationsCount(): int */ public static function getTriggeredDeprecations(): array { - return self::$ignoredLinks; + return self::$triggeredDeprecations; + } + + /** + * @return int-mask-of + */ + private static function getTypeFromEnv(): int + { + switch ($_SERVER['DOCTRINE_DEPRECATIONS'] ?? $_ENV['DOCTRINE_DEPRECATIONS'] ?? null) { + case 'trigger': + self::$type = self::TYPE_TRIGGER_ERROR; + break; + + case 'track': + self::$type = self::TYPE_TRACK_DEPRECATIONS; + break; + + default: + self::$type = self::TYPE_NONE; + break; + } + + return self::$type; } } diff --git a/app/vendor/doctrine/deprecations/phpstan.neon b/app/vendor/doctrine/deprecations/phpstan.neon new file mode 100644 index 000000000..4ee286b8a --- /dev/null +++ b/app/vendor/doctrine/deprecations/phpstan.neon @@ -0,0 +1,9 @@ +parameters: + level: 6 + paths: + - lib + - tests + +includes: + - vendor/phpstan/phpstan-phpunit/extension.neon + - vendor/phpstan/phpstan-phpunit/rules.neon diff --git a/app/vendor/doctrine/deprecations/psalm.xml b/app/vendor/doctrine/deprecations/psalm.xml new file mode 100644 index 000000000..ad76e32e3 --- /dev/null +++ b/app/vendor/doctrine/deprecations/psalm.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/vendor/laminas/laminas-diactoros/composer.json b/app/vendor/laminas/laminas-diactoros/composer.json index 372101110..c141b3843 100644 --- a/app/vendor/laminas/laminas-diactoros/composer.json +++ b/app/vendor/laminas/laminas-diactoros/composer.json @@ -36,7 +36,7 @@ "require": { "php": "~8.0.0 || ~8.1.0 || ~8.2.0", "psr/http-factory": "^1.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.1" }, "require-dev": { "ext-curl": "*", @@ -44,11 +44,11 @@ "ext-gd": "*", "ext-libxml": "*", "http-interop/http-factory-tests": "^0.9.0", - "laminas/laminas-coding-standard": "^2.4.0", + "laminas/laminas-coding-standard": "^2.5", "php-http/psr7-integration-tests": "^1.2", - "phpunit/phpunit": "^9.5.27", + "phpunit/phpunit": "^9.5.28", "psalm/plugin-phpunit": "^0.18.4", - "vimeo/psalm": "^5.4" + "vimeo/psalm": "^5.6" }, "provide": { "psr/http-factory-implementation": "1.0", diff --git a/app/vendor/laminas/laminas-diactoros/src/HeaderSecurity.php b/app/vendor/laminas/laminas-diactoros/src/HeaderSecurity.php index 08a5e3c3e..d12486aeb 100644 --- a/app/vendor/laminas/laminas-diactoros/src/HeaderSecurity.php +++ b/app/vendor/laminas/laminas-diactoros/src/HeaderSecurity.php @@ -154,7 +154,7 @@ public static function assertValidName(mixed $name): void is_object($name) ? $name::class : gettype($name) )); } - if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/', $name)) { + if (! preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $name)) { throw new Exception\InvalidArgumentException(sprintf( '"%s" is not valid header name', $name diff --git a/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/FilterUsingXForwardedHeaders.php b/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/FilterUsingXForwardedHeaders.php index 2327646d5..1ddcb5339 100644 --- a/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/FilterUsingXForwardedHeaders.php +++ b/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/FilterUsingXForwardedHeaders.php @@ -6,8 +6,11 @@ use Laminas\Diactoros\Exception\InvalidForwardedHeaderNameException; use Laminas\Diactoros\Exception\InvalidProxyAddressException; +use Laminas\Diactoros\UriFactory; use Psr\Http\Message\ServerRequestInterface; +use function assert; +use function count; use function explode; use function filter_var; use function in_array; @@ -76,7 +79,12 @@ public function __invoke(ServerRequestInterface $request): ServerRequestInterfac switch ($headerName) { case self::HEADER_HOST: - $uri = $uri->withHost($header); + [$host, $port] = UriFactory::marshalHostAndPortFromHeader($header); + $uri = $uri + ->withHost($host); + if ($port !== null) { + $uri = $uri->withPort($port); + } break; case self::HEADER_PORT: $uri = $uri->withPort((int) $header); @@ -224,7 +232,9 @@ private static function validateProxyCIDR(mixed $cidr): bool $address = $cidr; $mask = null; if (str_contains($cidr, '/')) { - [$address, $mask] = explode('/', $cidr, 2); + $parts = explode('/', $cidr, 2); + assert(count($parts) >= 2); + [$address, $mask] = $parts; $mask = (int) $mask; } diff --git a/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/IPRange.php b/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/IPRange.php index cdf16d0bc..fbdb65ee8 100644 --- a/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/IPRange.php +++ b/app/vendor/laminas/laminas-diactoros/src/ServerRequestFilter/IPRange.php @@ -4,6 +4,8 @@ namespace Laminas\Diactoros\ServerRequestFilter; +use function assert; +use function count; use function explode; use function inet_pton; use function intval; @@ -43,7 +45,9 @@ public static function matchesIPv4(string $ip, string $cidr): bool $subnet = $cidr; if (str_contains($cidr, '/')) { - [$subnet, $mask] = explode('/', $cidr, 2); + $parts = explode('/', $cidr, 2); + assert(count($parts) >= 2); + [$subnet, $mask] = $parts; $mask = (int) $mask; } @@ -73,7 +77,9 @@ public static function matchesIPv6(string $ip, string $cidr): bool $subnet = $cidr; if (str_contains($cidr, '/')) { - [$subnet, $mask] = explode('/', $cidr, 2); + $parts = explode('/', $cidr, 2); + assert(count($parts) >= 2); + [$subnet, $mask] = $parts; $mask = (int) $mask; } diff --git a/app/vendor/laminas/laminas-diactoros/src/Stream.php b/app/vendor/laminas/laminas-diactoros/src/Stream.php index e3ef4717f..96c0982eb 100644 --- a/app/vendor/laminas/laminas-diactoros/src/Stream.php +++ b/app/vendor/laminas/laminas-diactoros/src/Stream.php @@ -44,11 +44,11 @@ class Stream implements StreamInterface, Stringable /** @var resource|null */ protected $resource; - /** @var string|resource */ + /** @var string|object|resource|null */ protected $stream; /** - * @param string|resource $stream + * @param string|object|resource $stream * @param string $mode Mode with which to open stream * @throws Exception\InvalidArgumentException */ @@ -103,7 +103,7 @@ public function detach() /** * Attach a new stream/resource to the instance. * - * @param string|resource $resource + * @param string|object|resource $resource * @throws Exception\InvalidArgumentException For stream identifier that cannot be cast to a resource. * @throws Exception\InvalidArgumentException For non-resource stream. */ @@ -313,7 +313,7 @@ public function getMetadata($key = null) /** * Set the internal stream resource. * - * @param string|resource $stream String stream target or stream resource. + * @param string|object|resource $stream String stream target or stream resource. * @param string $mode Resource mode for stream target. * @throws Exception\InvalidArgumentException For invalid streams or resources. */ diff --git a/app/vendor/laminas/laminas-diactoros/src/Uri.php b/app/vendor/laminas/laminas-diactoros/src/Uri.php index 95c7af936..59f776eee 100644 --- a/app/vendor/laminas/laminas-diactoros/src/Uri.php +++ b/app/vendor/laminas/laminas-diactoros/src/Uri.php @@ -38,6 +38,8 @@ * might change state are implemented such that they retain the internal * state of the current instance and return a new instance that contains the * changed state. + * + * @psalm-immutable */ class Uri implements UriInterface, Stringable { @@ -67,8 +69,7 @@ class Uri implements UriInterface, Stringable private string $host = ''; - /** @var int|null */ - private $port; + private ?int $port = null; private string $path = ''; @@ -110,6 +111,7 @@ public function __toString(): string return $this->uriString; } + /** @psalm-suppress ImpureMethodCall, InaccessibleProperty */ $this->uriString = static::createUriString( $this->scheme, $this->getAuthority(), @@ -442,6 +444,9 @@ public function withFragment($fragment): UriInterface /** * Parse a URI into its parts, and set the properties + * + * @psalm-suppress InaccessibleProperty Method is only called in {@see Uri::__construct} and thus immutability is + * still given. */ private function parseUri(string $uri): void { @@ -552,8 +557,12 @@ private function filterUserInfoPart(string $part): string { $part = $this->filterInvalidUtf8($part); - // Note the addition of `%` to initial charset; this allows `|` portion - // to match and thus prevent double-encoding. + /** + * @psalm-suppress ImpureFunctionCall Even tho the callback targets this immutable class, + * psalm reports an issue here. + * Note the addition of `%` to initial charset; this allows `|` portion + * to match and thus prevent double-encoding. + */ return preg_replace_callback( '/(?:[^%' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . ']+|%(?![A-Fa-f0-9]{2}))/u', [$this, 'urlEncodeChar'], @@ -568,6 +577,10 @@ private function filterPath(string $path): string { $path = $this->filterInvalidUtf8($path); + /** + * @psalm-suppress ImpureFunctionCall Even tho the callback targets this immutable class, + * psalm reports an issue here. + */ return preg_replace_callback( '/(?:[^' . self::CHAR_UNRESERVED . ')(:@&=\+\$,\/;%]+|%(?![A-Fa-f0-9]{2}))/u', [$this, 'urlEncodeChar'], @@ -656,6 +669,10 @@ private function filterQueryOrFragment(string $value): string { $value = $this->filterInvalidUtf8($value); + /** + * @psalm-suppress ImpureFunctionCall Even tho the callback targets this immutable class, + * psalm reports an issue here. + */ return preg_replace_callback( '/(?:[^' . self::CHAR_UNRESERVED . self::CHAR_SUB_DELIMS . '%:@\/\?]+|%(?![A-Fa-f0-9]{2}))/u', [$this, 'urlEncodeChar'], diff --git a/app/vendor/laminas/laminas-diactoros/src/UriFactory.php b/app/vendor/laminas/laminas-diactoros/src/UriFactory.php index d0ce13af9..31f5a1de8 100644 --- a/app/vendor/laminas/laminas-diactoros/src/UriFactory.php +++ b/app/vendor/laminas/laminas-diactoros/src/UriFactory.php @@ -9,10 +9,11 @@ use function array_change_key_case; use function array_key_exists; +use function assert; +use function count; use function explode; use function gettype; use function implode; -use function is_array; use function is_bool; use function is_scalar; use function is_string; @@ -76,7 +77,9 @@ public static function createFromSapi(array $server, array $headers): Uri $fragment = ''; if (str_contains($path, '#')) { - [$path, $fragment] = explode('#', $path, 2); + $parts = explode('#', $path, 2); + assert(count($parts) >= 2); + [$path, $fragment] = $parts; } return $uri @@ -228,16 +231,14 @@ private static function marshalHttpsValue(mixed $https): bool } /** - * @param string|list $host + * @internal + * * @return array{string, int|null} Array of two items, host and port, in that order (can be * passed to a list() operation). + * @psalm-mutation-free */ - private static function marshalHostAndPortFromHeader($host): array + public static function marshalHostAndPortFromHeader(string $host): array { - if (is_array($host)) { - $host = implode(', ', $host); - } - $port = null; // works for regname, IPv4 & IPv6 diff --git a/app/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php b/app/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php index 124cdff4a..186d6d9af 100644 --- a/app/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php +++ b/app/vendor/laminas/laminas-diactoros/src/functions/marshal_uri_from_sapi.php @@ -6,6 +6,8 @@ use function array_change_key_case; use function array_key_exists; +use function assert; +use function count; use function explode; use function gettype; use function implode; @@ -219,7 +221,9 @@ function marshalUriFromSapi(array $server, array $headers): Uri // URI fragment $fragment = ''; if (str_contains($path, '#')) { - [$path, $fragment] = explode('#', $path, 2); + $parts = explode('#', $path, 2); + assert(count($parts) >= 2); + [$path, $fragment] = $parts; } return $uri diff --git a/app/vendor/laminas/laminas-httphandlerrunner/composer.json b/app/vendor/laminas/laminas-httphandlerrunner/composer.json index 701c89a5c..e7b5fdf20 100644 --- a/app/vendor/laminas/laminas-httphandlerrunner/composer.json +++ b/app/vendor/laminas/laminas-httphandlerrunner/composer.json @@ -21,7 +21,7 @@ "config": { "sort-packages": true, "platform": { - "php": "8.0.99" + "php": "8.1.99" }, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true @@ -33,17 +33,17 @@ } }, "require": { - "php": "~8.0.0 || ~8.1.0 || ~8.2.0", - "psr/http-message": "^1.0", - "psr/http-message-implementation": "^1.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-message-implementation": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "require-dev": { - "laminas/laminas-coding-standard": "~2.4.0", - "laminas/laminas-diactoros": "^2.18", - "phpunit/phpunit": "^9.5.26", - "psalm/plugin-phpunit": "^0.18.0", - "vimeo/psalm": "^5.0.0" + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-diactoros": "^3.0.0", + "phpunit/phpunit": "^10.1.2", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.11" }, "autoload": { "psr-4": { diff --git a/app/vendor/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php b/app/vendor/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php index 984ee1474..aaea4ef2a 100644 --- a/app/vendor/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php +++ b/app/vendor/laminas/laminas-httphandlerrunner/src/Emitter/EmitterStack.php @@ -53,7 +53,6 @@ public function emit(ResponseInterface $response): bool #[ReturnTypeWillChange] public function offsetSet($index, $emitter) { - /** @psalm-suppress RedundantConditionGivenDocblockType */ $this->validateEmitter($emitter); parent::offsetSet($index, $emitter); } @@ -68,7 +67,6 @@ public function offsetSet($index, $emitter) #[ReturnTypeWillChange] public function push($emitter) { - /** @psalm-suppress RedundantConditionGivenDocblockType */ $this->validateEmitter($emitter); parent::push($emitter); } @@ -83,7 +81,6 @@ public function push($emitter) #[ReturnTypeWillChange] public function unshift($emitter) { - /** @psalm-suppress RedundantConditionGivenDocblockType */ $this->validateEmitter($emitter); parent::unshift($emitter); } diff --git a/app/vendor/nikic/php-parser/grammar/php5.y b/app/vendor/nikic/php-parser/grammar/php5.y index 2920deadd..77e4fb7ed 100644 --- a/app/vendor/nikic/php-parser/grammar/php5.y +++ b/app/vendor/nikic/php-parser/grammar/php5.y @@ -1008,7 +1008,7 @@ array_pair: | expr { $$ = Expr\ArrayItem[$1, null, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | ampersand variable { $$ = Expr\ArrayItem[$2, null, true]; } - | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } + | T_ELLIPSIS expr { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); } ; encaps_list: diff --git a/app/vendor/nikic/php-parser/grammar/php7.y b/app/vendor/nikic/php-parser/grammar/php7.y index fc7862c37..1ef60bfe0 100644 --- a/app/vendor/nikic/php-parser/grammar/php7.y +++ b/app/vendor/nikic/php-parser/grammar/php7.y @@ -221,7 +221,10 @@ non_empty_class_const_list: ; class_const: - identifier_maybe_reserved '=' expr { $$ = Node\Const_[$1, $3]; } + T_STRING '=' expr + { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; } + | semi_reserved '=' expr + { $$ = Node\Const_[new Node\Identifier($1, stackAttributes(#1)), $3]; } ; inner_statement_list_ex: @@ -722,6 +725,9 @@ class_statement: | optional_attributes method_modifiers T_CONST class_const_list semi { $$ = new Stmt\ClassConst($4, $2, attributes(), $1); $this->checkClassConst($$, #2); } + | optional_attributes method_modifiers T_CONST type_expr class_const_list semi + { $$ = new Stmt\ClassConst($5, $2, attributes(), $1, $4); + $this->checkClassConst($$, #2); } | optional_attributes method_modifiers T_FUNCTION optional_ref identifier_maybe_reserved '(' parameter_list ')' optional_return_type method_body { $$ = Stmt\ClassMethod[$5, ['type' => $2, 'byRef' => $4, 'params' => $7, 'returnType' => $9, 'stmts' => $10, 'attrGroups' => $1]]; @@ -943,8 +949,8 @@ expr: ; anonymous_class: - optional_attributes T_CLASS ctor_arguments extends_from implements_list '{' class_statement_list '}' - { $$ = array(Stmt\Class_[null, ['type' => 0, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); + optional_attributes class_entry_type ctor_arguments extends_from implements_list '{' class_statement_list '}' + { $$ = array(Stmt\Class_[null, ['type' => $2, 'extends' => $4, 'implements' => $5, 'stmts' => $7, 'attrGroups' => $1]], $3); $this->checkClass($$[0], -1); } ; @@ -1040,6 +1046,8 @@ constant: class_constant: class_name_or_var T_PAAMAYIM_NEKUDOTAYIM identifier_maybe_reserved { $$ = Expr\ClassConstFetch[$1, $3]; } + | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM '{' expr '}' + { $$ = Expr\ClassConstFetch[$1, $4]; } /* We interpret an isolated FOO:: as an unfinished class constant fetch. It could also be an unfinished static property fetch or unfinished scoped call. */ | class_name_or_var T_PAAMAYIM_NEKUDOTAYIM error @@ -1194,7 +1202,7 @@ array_pair: | expr T_DOUBLE_ARROW expr { $$ = Expr\ArrayItem[$3, $1, false]; } | expr T_DOUBLE_ARROW ampersand variable { $$ = Expr\ArrayItem[$4, $1, true]; } | expr T_DOUBLE_ARROW list_expr { $$ = Expr\ArrayItem[$3, $1, false]; } - | T_ELLIPSIS expr { $$ = Expr\ArrayItem[$2, null, false, attributes(), true]; } + | T_ELLIPSIS expr { $$ = new Expr\ArrayItem($2, null, false, attributes(), true); } | /* empty */ { $$ = null; } ; diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php b/app/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php index f616c6270..a7fe129b0 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Builder/ClassConst.php @@ -19,6 +19,8 @@ class ClassConst implements PhpParser\Builder /** @var Node\AttributeGroup[] */ protected $attributeGroups = []; + /** @var Identifier|Node\Name|Node\ComplexType */ + protected $type; /** * Creates a class constant builder @@ -116,6 +118,19 @@ public function addAttribute($attribute) { return $this; } + /** + * Sets the constant type. + * + * @param string|Node\Name|Identifier|Node\ComplexType $type + * + * @return $this + */ + public function setType($type) { + $this->type = BuilderHelpers::normalizeType($type); + + return $this; + } + /** * Returns the built class node. * @@ -126,7 +141,8 @@ public function getNode(): PhpParser\Node { $this->constants, $this->flags, $this->attributes, - $this->attributeGroups + $this->attributeGroups, + $this->type ); } } diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php b/app/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php index de9aae7e5..69f353326 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Builder/Param.php @@ -19,6 +19,8 @@ class Param implements PhpParser\Builder protected $variadic = false; + protected $flags = 0; + /** @var Node\AttributeGroup[] */ protected $attributeGroups = []; @@ -95,6 +97,50 @@ public function makeVariadic() { return $this; } + /** + * Makes the (promoted) parameter public. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePublic() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PUBLIC); + + return $this; + } + + /** + * Makes the (promoted) parameter protected. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeProtected() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PROTECTED); + + return $this; + } + + /** + * Makes the (promoted) parameter private. + * + * @return $this The builder instance (for fluid interface) + */ + public function makePrivate() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_PRIVATE); + + return $this; + } + + /** + * Makes the (promoted) parameter readonly. + * + * @return $this The builder instance (for fluid interface) + */ + public function makeReadonly() { + $this->flags = BuilderHelpers::addModifier($this->flags, Node\Stmt\Class_::MODIFIER_READONLY); + + return $this; + } + /** * Adds an attribute group. * @@ -116,7 +162,7 @@ public function addAttribute($attribute) { public function getNode() : Node { return new Node\Param( new Node\Expr\Variable($this->name), - $this->default, $this->type, $this->byRef, $this->variadic, [], 0, $this->attributeGroups + $this->default, $this->type, $this->byRef, $this->variadic, [], $this->flags, $this->attributeGroups ); } } diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php b/app/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php index fef2579b3..af010e028 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/BuilderFactory.php @@ -349,15 +349,15 @@ public function propertyFetch(Expr $var, $name) : Expr\PropertyFetch { /** * Creates a class constant fetch node. * - * @param string|Name|Expr $class Class name - * @param string|Identifier $name Constant name + * @param string|Name|Expr $class Class name + * @param string|Identifier|Expr $name Constant name * * @return Expr\ClassConstFetch */ public function classConstFetch($class, $name): Expr\ClassConstFetch { return new Expr\ClassConstFetch( BuilderHelpers::normalizeNameOrExpr($class), - BuilderHelpers::normalizeIdentifier($name) + BuilderHelpers::normalizeIdentifierOrExpr($name) ); } diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php b/app/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php index 3eeac04a4..676322701 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Internal/PrintableNewAnonClassNode.php @@ -19,6 +19,8 @@ class PrintableNewAnonClassNode extends Expr { /** @var Node\AttributeGroup[] PHP attribute groups */ public $attrGroups; + /** @var int Modifiers */ + public $flags; /** @var Node\Arg[] Arguments */ public $args; /** @var null|Node\Name Name of extended class */ @@ -29,11 +31,12 @@ class PrintableNewAnonClassNode extends Expr public $stmts; public function __construct( - array $attrGroups, array $args, Node\Name $extends = null, array $implements, + array $attrGroups, int $flags, array $args, Node\Name $extends = null, array $implements, array $stmts, array $attributes ) { parent::__construct($attributes); $this->attrGroups = $attrGroups; + $this->flags = $flags; $this->args = $args; $this->extends = $extends; $this->implements = $implements; @@ -46,7 +49,7 @@ public static function fromNewNode(Expr\New_ $newNode) { // We don't assert that $class->name is null here, to allow consumers to assign unique names // to anonymous classes for their own purposes. We simplify ignore the name here. return new self( - $class->attrGroups, $newNode->args, $class->extends, $class->implements, + $class->attrGroups, $class->flags, $newNode->args, $class->extends, $class->implements, $class->stmts, $newNode->getAttributes() ); } @@ -56,6 +59,6 @@ public function getType() : string { } public function getSubNodeNames() : array { - return ['attrGroups', 'args', 'extends', 'implements', 'stmts']; + return ['attrGroups', 'flags', 'args', 'extends', 'implements', 'stmts']; } } diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php index faf832f93..0c45ffb4b 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Expr/ClassConstFetch.php @@ -10,15 +10,15 @@ class ClassConstFetch extends Expr { /** @var Name|Expr Class name */ public $class; - /** @var Identifier|Error Constant name */ + /** @var Identifier|Expr|Error Constant name */ public $name; /** * Constructs a class const fetch node. * - * @param Name|Expr $class Class name - * @param string|Identifier|Error $name Constant name - * @param array $attributes Additional attributes + * @param Name|Expr $class Class name + * @param string|Identifier|Expr|Error $name Constant name + * @param array $attributes Additional attributes */ public function __construct($class, $name, array $attributes = []) { $this->attributes = $attributes; @@ -29,7 +29,7 @@ public function __construct($class, $name, array $attributes = []) { public function getSubNodeNames() : array { return ['class', 'name']; } - + public function getType() : string { return 'Expr_ClassConstFetch'; } diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php index 17bd1c0f7..f0a564ff0 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Name.php @@ -6,7 +6,10 @@ class Name extends NodeAbstract { - /** @var string[] Parts of the name */ + /** + * @var string[] Parts of the name + * @deprecated Use getParts() instead + */ public $parts; private static $specialClassNames = [ @@ -30,6 +33,15 @@ public function getSubNodeNames() : array { return ['parts']; } + /** + * Get parts of name (split by the namespace separator). + * + * @return string[] Parts of name + */ + public function getParts(): array { + return $this->parts; + } + /** * Gets the first part of the name, i.e. everything before the first namespace separator. * diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php index 1fc7f3362..8abaad6de 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassConst.php @@ -10,31 +10,36 @@ class ClassConst extends Node\Stmt public $flags; /** @var Node\Const_[] Constant declarations */ public $consts; - /** @var Node\AttributeGroup[] */ + /** @var Node\AttributeGroup[] PHP attribute groups */ public $attrGroups; + /** @var Node\Identifier|Node\Name|Node\ComplexType|null Type declaration */ + public $type; /** * Constructs a class const list node. * - * @param Node\Const_[] $consts Constant declarations - * @param int $flags Modifiers - * @param array $attributes Additional attributes - * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param Node\Const_[] $consts Constant declarations + * @param int $flags Modifiers + * @param array $attributes Additional attributes + * @param Node\AttributeGroup[] $attrGroups PHP attribute groups + * @param null|string|Node\Identifier|Node\Name|Node\ComplexType $type Type declaration */ public function __construct( array $consts, int $flags = 0, array $attributes = [], - array $attrGroups = [] + array $attrGroups = [], + $type = null ) { $this->attributes = $attributes; $this->flags = $flags; $this->consts = $consts; $this->attrGroups = $attrGroups; + $this->type = \is_string($type) ? new Node\Identifier($type) : $type; } public function getSubNodeNames() : array { - return ['attrGroups', 'flags', 'consts']; + return ['attrGroups', 'flags', 'type', 'consts']; } /** diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php index 351db9ed0..a43067108 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php @@ -2627,7 +2627,7 @@ protected function initReduceCallbacks() { $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); }, 553 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php index c6b9abd02..fc895cb04 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php @@ -18,16 +18,16 @@ class Php7 extends \PhpParser\ParserAbstract { protected $tokenToSymbolMapSize = 396; - protected $actionTableSize = 1223; - protected $gotoTableSize = 626; + protected $actionTableSize = 1241; + protected $gotoTableSize = 629; protected $invalidSymbol = 168; protected $errorSymbol = 1; protected $defaultAction = -32766; protected $unexpectedTokenRule = 32767; - protected $YY2TBLSTATE = 429; - protected $numNonLeafStates = 726; + protected $YY2TBLSTATE = 434; + protected $numNonLeafStates = 736; protected $symbolToName = array( "EOF", @@ -244,262 +244,266 @@ class Php7 extends \PhpParser\ParserAbstract ); protected $action = array( - 132, 133, 134, 575, 135, 136, 0, 738, 739, 740, - 137, 37, 850, 825, 851, 476,-32766,-32766,-32766,-32767, - -32767,-32767,-32767, 101, 102, 103, 104, 105, 1097, 1098, - 1099, 1096, 1095, 1094, 1100, 732, 731,-32766, 1289,-32766, + 133, 134, 135, 579, 136, 137, 0, 748, 749, 750, + 138, 38, 327,-32766,-32766,-32766,-32766,-32766,-32766,-32767, + -32767,-32767,-32767, 102, 103, 104, 105, 106, 1109, 1110, + 1111, 1108, 1107, 1106, 1112, 742, 741,-32766, 1232,-32766, -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, - -32767, 1022, 377, 376, 2, 741,-32766,-32766,-32766,-32766, - -32766, 822, 417,-32766,-32766,-32766,-32766,-32766,-32766, 267, - 138, 399, 745, 746, 747, 748, 287,-32766, 423,-32766, - -32766,-32766,-32766,-32766,-32766, 749, 750, 751, 752, 753, - 754, 755, 756, 757, 758, 759, 779, 576, 780, 781, - 782, 783, 771, 772, 340, 341, 774, 775, 760, 761, - 762, 764, 765, 766, 351, 806, 807, 808, 809, 810, - 577, 767, 768, 578, 579, 800, 791, 789, 790, 803, - 786, 787, -327, 423, 580, 581, 785, 582, 583, 584, - 585, 586, 587, 605, -590, 477, -86, 814, 788, 588, - 589, -590, 139,-32766,-32766,-32766, 132, 133, 134, 575, - 135, 136, 1046, 738, 739, 740, 137, 37, 323, 1013, - 823, 824, 1334, 1324,-32766, 1335,-32766,-32766,-32766,-32766, - -32766,-32766,-32766, 1097, 1098, 1099, 1096, 1095, 1094, 1100, - -587, 732, 731,-32766,-32766,-32766, 12, -587, 81,-32766, - -32766,-32766, 945, 946, 322, 927, 34, 947, 1224, 1223, - 1225, 741, -86, 942,-32766, 1075,-32766,-32766,-32766,-32766, - -32766, 239,-32766,-32766,-32766, 267, 138, 399, 745, 746, - 747, 748, 461, 462, 423, 35, 247, 103, 104, 105, - 128, 749, 750, 751, 752, 753, 754, 755, 756, 757, - 758, 759, 779, 576, 780, 781, 782, 783, 771, 772, - 340, 341, 774, 775, 760, 761, 762, 764, 765, 766, - 351, 806, 807, 808, 809, 810, 577, 767, 768, 578, - 579, 800, 791, 789, 790, 803, 786, 787, -327, 144, - 580, 581, 785, 582, 583, 584, 585, 586, 587, 1222, - 82, 83, 84, -590, 788, 588, 589, -590, 148, 763, - 733, 734, 735, 736, 737, 1309, 738, 739, 740, 776, - 777, 36, 1308, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 288, 271, -587, - -193, 375, 376, -587, 976,-32766, 1021, 453, 454, 455, - 109, 417, 945, 946, 741, 712, 819, 947,-32766,-32766, - -32766, -271, 1073, 941, 1224, 1223, 1225, 288, 742, 743, - 744, 745, 746, 747, 748, -192, -365, 812, -365,-32766, - 599,-32766,-32766, 549, 749, 750, 751, 752, 753, 754, - 755, 756, 757, 758, 759, 779, 802, 780, 781, 782, - 783, 771, 772, 773, 801, 774, 775, 760, 761, 762, - 764, 765, 766, 805, 806, 807, 808, 809, 810, 811, - 767, 768, 769, 770, 800, 791, 789, 790, 803, 786, - 787, 251, 820, 778, 784, 785, 792, 793, 795, 794, - 796, 797, 732, 731, 1261, 1022, 1019, 788, 799, 798, - 49, 50, 51, 507, 52, 53, 1009, 1008, 1007, 1010, - 54, 55, -111, 56, 816, 1045, 14, -111, 1022, -111, - 287, 1305, 977, 306, 302, 1022, 238, -111, -111, -111, - -111, -111, -111, -111, -111, 106, 107, 108, 1089, 271, - -32766,-32766,-32766, 280, 284, 126, -193, 929, 57, 58, - 287, 109, 1019, -541, 59, 308, 60, 244, 245, 61, - 62, 63, 64, 65, 66, 67, 68, 1229, 27, 269, - 69, 439, 508, -341, 1022, 929, 1255, 1256, 509, 907, - 823, -192, 150, 907, 1253, 41, 24, 510, 352, 511, - 818, 512, 386, 513, 11, 699, 514, 515, 648, 25, - 814, 43, 44, 440, 372, 371, 907, 45, 516, 702, - 1220, 667, 668, 363, 334, -540, 357, -541, -541, 320, - 1215, 1249, 518, 519, 520, -581, 1074, 335, 724, -581, - 1019,-32766, -541, 336, 521, 522, 703, 1243, 1244, 1245, - 1246, 1240, 1241, 294, -541, 850, -547, 851, 823, 1247, - 1242, 365, 1022, 1224, 1223, 1225, 295, -153, -153, -153, - 369, 70, 897, 318, 319, 322, 897, 384, 149, 402, - 373, 374, -153, 435, -153, 436, -153, 280, -153, -540, - -540, 141, 1220, 378, 379, 639, 640, 322, 370, 897, - 907, 437, 438, 829, -540, -88, 151, 732, 731, 945, - 946, 153, 823,-32766, 517, -51, -540, 154, -546, 883, - 941, -111, -111, -111, 31, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 155, 74, - 27, 157, 32, 322, -85, 123, 124, 909, 129, 697, - 130, 909, 823, 697, -153, 143, 1253, 158,-32766, -544, - 1229, -542, 159, 160, 1222, 161, -79, 1134, 1136, -75, - 285,-32766,-32766,-32766, 909,-32766, 697,-32766, -539,-32766, - -301, -73,-32766, 897, -72, -71, 1220,-32766,-32766,-32766, - -16, 140, 1215,-32766,-32766, 732, 731, 322, -70,-32766, - 414, -69, -4, 907, -68, -67, 521, 522,-32766, 1243, - 1244, 1245, 1246, 1240, 1241, -66, -47, -18, 147, 270, - 281, 1247, 1242, -544, -544, -542, -542, 732, 731, 713, - 716, 906,-32766, 72, 146, 907, 319, 322, 1222, -297, - -542, 823, -539, -539, 276,-32766,-32766,-32766, 277,-32766, - -544,-32766, -542,-32766, 282, 283,-32766, -539, 909, 328, - 697,-32766,-32766,-32766,-32766, 704, 286,-32766,-32766, -539, - 1222, 923, 289,-32766, 414, 1220, 290,-32766,-32766,-32766, - 271,-32766,-32766,-32766, 47,-32766, 897, -111,-32766, 677, - 109, 814, 145,-32766,-32766,-32766,-32766, 823, 131,-32766, - -32766, 1336,-32766, 654, 670,-32766, 414, 1104, 370, 637, - 430, 551, 73, 13,-32766, 293, 555, 295, 897, 945, - 946, 649, 74, 434, 517, 458, 322, 487, 690, 842, - 941, -111, -111, -111, 301, 1022, 561, 655, 671, 1260, - 300,-32766, -539,-32766, 907, 603, 303, 1222, 296, 297, - 39, 1262, 9, 40,-32766,-32766,-32766, 0,-32766, 907, - -32766, 909,-32766, 697, -4,-32766, 0, 1229, 907, 0, - -32766,-32766,-32766,-32766, 307, 125,-32766,-32766, 0, 1222, - 907, 0,-32766, 414, 0, 0,-32766,-32766,-32766, 707, - -32766,-32766,-32766, 962,-32766, 697, -505,-32766, 714, -495, - 7, 482,-32766,-32766,-32766,-32766, -539, -539,-32766,-32766, - 16, 1222, 567, 367,-32766, 414, 925, 295,-32766,-32766, - -32766, -539,-32766,-32766,-32766, 822,-32766, 897, 721,-32766, - 722, -575, 888, -539,-32766,-32766,-32766, 986, 963, 970, - -32766,-32766, 897, -249, -249, -249,-32766, 414, 823, 370, - 960, 897, 971, 886, 958,-32766, 1078, 1081, 718, 1082, - 945, 946, 1079, 897, 1080, 517, 1086, 33, 1250, 834, - 883, 941, -111, -111, -111, 27, 1275, 1293, 1327, -248, - -248, -248, 1220, 642, 884, 370, 317, 823, 366, 698, - 701, 1253, 1331, 705, -111, 706, 945, 946, 708, 709, - 710, 517, 909,-32766, 697, -249, 883, 941, -111, -111, - -111, 711, 715, 700, -509, 1333, 845, 909, 48, 697, - -573, 1220, 844, 853, 295, 935, 909, 1215, 697, 74, - 978, 852, 1332, 322, 934, 932, 933, 936, 909, 1206, - 697, -248, 522, 916, 1243, 1244, 1245, 1246, 1240, 1241, - 926, 914, 968, 969, 1330, 1287, 1247, 1242, 1276, 1294, - -32766, 1300, 1303, 1191, -547, -546, 1222, -545, 72, -489, - 1, 319, 322,-32766,-32766,-32766, 28,-32766, 29,-32766, - 38,-32766, 298, 299,-32766, 42, 46, 71, 75,-32766, - -32766,-32766, 76, 77, 78,-32766,-32766, 368, 79, 80, - 142,-32766, 414, 152, 156, 243, 324, 352, 353, 127, - -32766, -274, 354, 355, 356, 357, 358, 359, 360, 361, - 362, 364, 431, 0, -272, -271, 18, 19, 20, 21, - 23, 401, 478, 479, 486, 489, 490, 491, 492, 496, - 497, 498, 505, 684, 1233, 1174, 1251, 1048, 1047, 1028, - 0, 1210, 1024, -276, -103, 17, 22, 26, 292, 400, - 596, 600, 628, 689, 1178, 1228, 1175, 1306, 0, 0, - 1254, 0, 322 + -32767, 2, 107, 108, 109, 751, 274, 381, 380,-32766, + -32766,-32766,-32766, 104, 105, 106, 1024, 422, 110, 265, + 139, 403, 755, 756, 757, 758, 466, 467, 428, 938, + 291,-32766, 287,-32766,-32766, 759, 760, 761, 762, 763, + 764, 765, 766, 767, 768, 769, 789, 580, 790, 791, + 792, 793, 781, 782, 344, 345, 784, 785, 770, 771, + 772, 774, 775, 776, 355, 816, 817, 818, 819, 820, + 581, 777, 778, 582, 583, 810, 801, 799, 800, 813, + 796, 797, 687, -545, 584, 585, 795, 586, 587, 588, + 589, 590, 591, -328, -593, -367, 1234, -367, 798, 592, + 593, -593, 140,-32766,-32766,-32766, 133, 134, 135, 579, + 136, 137, 1057, 748, 749, 750, 138, 38, 688, 1020, + 1019, 1018, 1021, 390,-32766, 7,-32766,-32766,-32766,-32766, + -32766,-32766,-32766,-32766,-32766,-32766, 379, 380, 1033, 689, + 690, 742, 741,-32766,-32766,-32766, 422, -545, -545, -590, + -32766,-32766,-32766, 1032,-32766, 127, -590, 1236, 1235, 1237, + 1318, 751, -545, 290,-32766, 283,-32766,-32766,-32766,-32766, + -32766, 1236, 1235, 1237, -545, 265, 139, 403, 755, 756, + 757, 758, 16, 481, 428, 458, 459, 460, 298, 722, + 35, 759, 760, 761, 762, 763, 764, 765, 766, 767, + 768, 769, 789, 580, 790, 791, 792, 793, 781, 782, + 344, 345, 784, 785, 770, 771, 772, 774, 775, 776, + 355, 816, 817, 818, 819, 820, 581, 777, 778, 582, + 583, 810, 801, 799, 800, 813, 796, 797, 129, 824, + 584, 585, 795, 586, 587, 588, 589, 590, 591, -328, + 83, 84, 85, -593, 798, 592, 593, -593, 149, 773, + 743, 744, 745, 746, 747, 824, 748, 749, 750, 786, + 787, 37, 145, 86, 87, 88, 89, 90, 91, 92, + 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 291, 274, 835, + 254, 1109, 1110, 1111, 1108, 1107, 1106, 1112, -590, 860, + 110, 861, -590, 482, 751,-32766,-32766,-32766,-32766,-32766, + 142, 603, 1085, 742, 741, 1262, 326, 987, 752, 753, + 754, 755, 756, 757, 758, 309,-32766, 822,-32766,-32766, + -32766,-32766, 242, 553, 759, 760, 761, 762, 763, 764, + 765, 766, 767, 768, 769, 789, 812, 790, 791, 792, + 793, 781, 782, 783, 811, 784, 785, 770, 771, 772, + 774, 775, 776, 815, 816, 817, 818, 819, 820, 821, + 777, 778, 779, 780, 810, 801, 799, 800, 813, 796, + 797, 311, 940, 788, 794, 795, 802, 803, 805, 804, + 806, 807, 323, 609, 1274, 1033, 833, 798, 809, 808, + 50, 51, 52, 512, 53, 54, 860, 241, 861, 918, + 55, 56, -111, 57,-32766,-32766,-32766, -111, 826, -111, + 290, 1302, 1347, 356, 305, 1348, 339, -111, -111, -111, + -111, -111, -111, -111, -111,-32766, -194,-32766,-32766,-32766, + -193, 956, 957, 829, -86, 988, 958, 834, 58, 59, + 340, 428, 952, -544, 60, 832, 61, 247, 248, 62, + 63, 64, 65, 66, 67, 68, 69, 1241, 28, 267, + 70, 444, 513, -342,-32766, 141, 1268, 1269, 514, 918, + 833, 326, -272, 918, 1266, 42, 25, 515, 940, 516, + 14, 517, 908, 518, 828, 369, 519, 520, 373, 709, + 1033, 44, 45, 445, 376, 375, 388, 46, 521, 712, + -86, 440, 1101, 367, 338, -543, 441, -544, -544, 830, + 1227, 442, 523, 524, 525, 290, 1236, 1235, 1237, 361, + 1030, 443, -544, 1087, 526, 527, 839, 1255, 1256, 1257, + 1258, 1252, 1253, 297, -544, 151, -550, -584, 833, 1259, + 1254, -584, 1033, 1236, 1235, 1237, 298, -154, -154, -154, + 152, 71, 908, 321, 322, 326, 908, 920, 1030, 707, + 833, 154, -154, 1337, -154, 155, -154, 283, -154, -543, + -543, 82, 1232, 1086, 1322, 734, 156, 326, 374, 158, + 1033, 1321, -194, -79, -543, -88, -193, 742, 741, 956, + 957, 653, 26,-32766, 522, -51, -543, 33, -549, 894, + 952, -111, -111, -111, 32, 111, 112, 113, 114, 115, + 116, 117, 118, 119, 120, 121, 122, 123, -59, 75, + 28, 672, 673, 326, -58, 36, 250, 920, 124, 707, + 125, 920, 833, 707, -154, 130, 1266, 131,-32766, -547, + 144, -542, 150, 406, 1234, 377, 378, 1146, 1148, 382, + 383,-32766,-32766,-32766, -85,-32766, 1056,-32766, -542,-32766, + 644, 645,-32766, 159, 160, 161, 1232,-32766,-32766,-32766, + 162, -79, 1227,-32766,-32766, 742, 741, 163, -302,-32766, + 419, -75, -4, 918, -73, 287, 526, 527,-32766, 1255, + 1256, 1257, 1258, 1252, 1253, -72, -71, -70, -69, -68, + -67, 1259, 1254, -547, -547, -542, -542, 742, 741, -66, + -47, -18,-32766, 73, 148, 918, 322, 326, 1234, 273, + -542, 284, -542, -542, 723,-32766,-32766,-32766, 726,-32766, + -547,-32766, -542,-32766, 917, 147,-32766, -542, 288, 289, + -298,-32766,-32766,-32766,-32766, 713, 279,-32766,-32766, -542, + 1234, 280, 285,-32766, 419, 48, 286,-32766,-32766,-32766, + 332,-32766,-32766,-32766, 292,-32766, 908, 293,-32766, 934, + 274, 1030, 918,-32766,-32766,-32766, 110, 682, 132,-32766, + -32766, 833, 146,-32766, 559,-32766, 419, 659, 374, 824, + 435, 1349, 74, 1033,-32766, 296, 654, 1116, 908, 956, + 957, 306, 714, 698, 522, 555, 303, 13, 310, 852, + 952, -111, -111, -111, 700, 463, 492, 953, 283, 299, + 300,-32766, 49, 675, 918, 304, 660, 1234, 676, 936, + 1273,-32766, 10, 1263,-32766,-32766,-32766, 642,-32766, 918, + -32766, 920,-32766, 707, -4,-32766, 126, 34, 918, 565, + -32766,-32766,-32766,-32766, 0, 908,-32766,-32766, 0, 1234, + 918, 0,-32766, 419, 0, 0,-32766,-32766,-32766, 717, + -32766,-32766,-32766, 920,-32766, 707, 1033,-32766, 724, 1275, + 0, 487,-32766,-32766,-32766,-32766, 301, 302,-32766,-32766, + -507, 1234, 571, -497,-32766, 419, 607, 8,-32766,-32766, + -32766, 372,-32766,-32766,-32766, 17,-32766, 908, 371,-32766, + 832, 298, 320, 128,-32766,-32766,-32766, 40, 370, 41, + -32766,-32766, 908, -250, -250, -250,-32766, 419, 731, 374, + 973, 908, 707, 732, 899,-32766, 997, 974, 728, 981, + 956, 957, 971, 908, 982, 522, 897, 969, 1090, 1093, + 894, 952, -111, -111, -111, 28, 1094, 1091, 1092, -249, + -249, -249, 1241, 1098, 708, 374, 844, 833, 1288, 1306, + 1340, 1266, 647, 1267, 711, 715, 956, 957, 716, 1241, + 718, 522, 920, 719, 707, -250, 894, 952, -111, -111, + -111, 720, -16, 721, 725, 710, -511, 920, 895, 707, + -578, 1232, 1344, 1346, 855, 854, 920, 1227, 707, -577, + 863, 946, 989, 862, 1345, 945, 943, 944, 920, 947, + 707, -249, 527, 1218, 1255, 1256, 1257, 1258, 1252, 1253, + 927, 937, 925, 979, 980, 631, 1259, 1254, 1343, 1300, + -32766, 1289, 1307, 833, 1316, -275, 1234, -576, 73, -550, + -549, 322, 326,-32766,-32766,-32766, -548,-32766, -491,-32766, + 833,-32766, 1, 29,-32766, 30, 39, 43, 47,-32766, + -32766,-32766, 72, 76, 77,-32766,-32766, 1232, -111, -111, + 78,-32766, 419, -111, 79, 80, 81, 143, 153, -111, + -32766, 157, 246, 328, 1232, -111, -111, 356,-32766, 357, + -111, 358, 359, 360, 361, 362, -111, 363, 364, 365, + 366, 368, 436, 0, -273,-32766, -272, 19, 20, 298, + 21, 22, 24, 405, 75, 1203, 483, 484, 326, 491, + 0, 494, 495, 496, 497, 501, 298, 502, 503, 510, + 693, 75, 0, 1245, 1186, 326, 1264, 1059, 1058, 1039, + 1222, 1035, -277, -103, 18, 23, 27, 295, 404, 600, + 604, 633, 699, 1190, 1240, 1187, 1319, 0, 0, 0, + 326 ); protected $actionCheck = array( 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, - 12, 13, 106, 1, 108, 31, 9, 10, 11, 44, + 12, 13, 70, 9, 10, 11, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, - 118, 119, 120, 121, 122, 37, 38, 30, 1, 32, + 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 138, 106, 107, 8, 57, 9, 10, 11, 9, - 10, 155, 116, 9, 10, 11, 9, 10, 11, 71, - 72, 73, 74, 75, 76, 77, 163, 30, 80, 32, - 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, + 43, 8, 53, 54, 55, 57, 57, 106, 107, 137, + 9, 10, 11, 50, 51, 52, 1, 116, 69, 71, + 72, 73, 74, 75, 76, 77, 134, 135, 80, 1, + 30, 30, 30, 32, 33, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, - 132, 133, 8, 80, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 51, 1, 161, 31, 80, 150, 151, + 132, 133, 80, 70, 136, 137, 138, 139, 140, 141, + 142, 143, 144, 8, 1, 106, 80, 108, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, - 6, 7, 164, 9, 10, 11, 12, 13, 70, 1, - 82, 159, 80, 85, 30, 83, 32, 33, 34, 35, - 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, - 1, 37, 38, 9, 10, 11, 8, 8, 161, 9, - 10, 11, 117, 118, 167, 1, 8, 122, 155, 156, - 157, 57, 97, 128, 30, 162, 32, 33, 34, 35, - 30, 14, 32, 33, 34, 71, 72, 73, 74, 75, - 76, 77, 134, 135, 80, 147, 148, 50, 51, 52, + 6, 7, 164, 9, 10, 11, 12, 13, 116, 119, + 120, 121, 122, 106, 30, 108, 32, 33, 34, 35, + 36, 37, 38, 9, 10, 11, 106, 107, 138, 137, + 138, 37, 38, 9, 10, 11, 116, 134, 135, 1, + 9, 10, 11, 137, 30, 14, 8, 155, 156, 157, + 1, 57, 149, 163, 30, 163, 32, 33, 34, 35, + 36, 155, 156, 157, 161, 71, 72, 73, 74, 75, + 76, 77, 8, 31, 80, 129, 130, 131, 158, 161, 8, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, - 126, 127, 128, 129, 130, 131, 132, 133, 164, 8, - 136, 137, 138, 139, 140, 141, 142, 143, 144, 80, + 126, 127, 128, 129, 130, 131, 132, 133, 8, 80, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 164, 9, 10, 11, 160, 150, 151, 152, 164, 154, 2, - 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, + 3, 4, 5, 6, 7, 80, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 30, 57, 160, - 8, 106, 107, 164, 31, 9, 137, 129, 130, 131, - 69, 116, 117, 118, 57, 161, 80, 122, 9, 10, - 11, 164, 1, 128, 155, 156, 157, 30, 71, 72, - 73, 74, 75, 76, 77, 8, 106, 80, 108, 30, - 1, 32, 33, 85, 87, 88, 89, 90, 91, 92, + 49, 50, 51, 52, 53, 54, 55, 30, 57, 1, + 8, 116, 117, 118, 119, 120, 121, 122, 160, 106, + 69, 108, 164, 161, 57, 9, 10, 11, 9, 10, + 161, 1, 1, 37, 38, 1, 167, 31, 71, 72, + 73, 74, 75, 76, 77, 8, 30, 80, 32, 33, + 34, 35, 14, 85, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 8, 156, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 37, 38, 146, 138, 116, 150, 151, 152, - 2, 3, 4, 5, 6, 7, 119, 120, 121, 122, - 12, 13, 101, 15, 80, 1, 101, 106, 138, 108, - 163, 1, 159, 8, 113, 138, 97, 116, 117, 118, - 119, 120, 121, 122, 123, 53, 54, 55, 123, 57, - 9, 10, 11, 163, 30, 14, 164, 122, 50, 51, - 163, 69, 116, 70, 56, 8, 58, 59, 60, 61, + 133, 8, 122, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 8, 51, 146, 138, 82, 150, 151, 152, + 2, 3, 4, 5, 6, 7, 106, 97, 108, 1, + 12, 13, 101, 15, 9, 10, 11, 106, 80, 108, + 163, 1, 80, 163, 113, 83, 8, 116, 117, 118, + 119, 120, 121, 122, 123, 30, 8, 32, 33, 34, + 8, 117, 118, 80, 31, 159, 122, 159, 50, 51, + 8, 80, 128, 70, 56, 155, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 1, 70, 71, - 72, 73, 74, 162, 138, 122, 78, 79, 80, 1, - 82, 164, 14, 1, 86, 87, 88, 89, 163, 91, - 156, 93, 106, 95, 108, 161, 98, 99, 75, 76, - 80, 103, 104, 105, 106, 107, 1, 109, 110, 31, - 116, 75, 76, 115, 116, 70, 163, 134, 135, 8, - 122, 1, 124, 125, 126, 160, 159, 8, 161, 164, - 116, 137, 149, 8, 136, 137, 31, 139, 140, 141, - 142, 143, 144, 145, 161, 106, 163, 108, 82, 151, - 152, 8, 138, 155, 156, 157, 158, 75, 76, 77, - 8, 163, 84, 165, 166, 167, 84, 8, 101, 102, - 106, 107, 90, 8, 92, 8, 94, 163, 96, 134, - 135, 161, 116, 106, 107, 111, 112, 167, 106, 84, - 1, 8, 8, 8, 149, 31, 14, 37, 38, 117, - 118, 14, 82, 137, 122, 31, 161, 14, 163, 127, + 72, 73, 74, 162, 9, 161, 78, 79, 80, 1, + 82, 167, 164, 1, 86, 87, 88, 89, 122, 91, + 101, 93, 84, 95, 156, 8, 98, 99, 8, 161, + 138, 103, 104, 105, 106, 107, 8, 109, 110, 31, + 97, 8, 123, 115, 116, 70, 8, 134, 135, 156, + 122, 8, 124, 125, 126, 163, 155, 156, 157, 163, + 116, 8, 149, 162, 136, 137, 8, 139, 140, 141, + 142, 143, 144, 145, 161, 14, 163, 160, 82, 151, + 152, 164, 138, 155, 156, 157, 158, 75, 76, 77, + 14, 163, 84, 165, 166, 167, 84, 159, 116, 161, + 82, 14, 90, 85, 92, 14, 94, 163, 96, 134, + 135, 161, 116, 159, 1, 161, 14, 167, 106, 14, + 138, 8, 164, 16, 149, 31, 164, 37, 38, 117, + 118, 75, 76, 137, 122, 31, 161, 14, 163, 127, 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 14, 163, - 70, 14, 14, 167, 31, 16, 16, 159, 16, 161, + 22, 23, 24, 25, 26, 27, 28, 29, 16, 163, + 70, 75, 76, 167, 16, 147, 148, 159, 16, 161, 16, 159, 82, 161, 162, 16, 86, 16, 74, 70, - 1, 70, 16, 16, 80, 16, 31, 59, 60, 31, - 37, 87, 88, 89, 159, 91, 161, 93, 70, 95, - 35, 31, 98, 84, 31, 31, 116, 103, 104, 105, - 31, 161, 122, 109, 110, 37, 38, 167, 31, 115, - 116, 31, 0, 1, 31, 31, 136, 137, 124, 139, + 16, 70, 101, 102, 80, 106, 107, 59, 60, 106, + 107, 87, 88, 89, 31, 91, 1, 93, 70, 95, + 111, 112, 98, 16, 16, 16, 116, 103, 104, 105, + 16, 31, 122, 109, 110, 37, 38, 16, 35, 115, + 116, 31, 0, 1, 31, 30, 136, 137, 124, 139, 140, 141, 142, 143, 144, 31, 31, 31, 31, 31, 31, 151, 152, 134, 135, 134, 135, 37, 38, 31, - 31, 31, 74, 163, 31, 1, 166, 167, 80, 35, - 149, 82, 134, 135, 35, 87, 88, 89, 35, 91, - 161, 93, 161, 95, 35, 35, 98, 149, 159, 35, - 161, 103, 104, 105, 74, 31, 37, 109, 110, 161, - 80, 38, 37, 115, 116, 116, 37, 87, 88, 89, - 57, 91, 124, 93, 70, 95, 84, 128, 98, 77, - 69, 80, 70, 103, 104, 105, 137, 82, 31, 109, - 110, 83, 85, 96, 94, 115, 116, 82, 106, 113, - 108, 85, 154, 97, 124, 113, 89, 158, 84, 117, - 118, 90, 163, 128, 122, 97, 167, 97, 92, 127, - 128, 129, 130, 131, 133, 138, 153, 100, 100, 146, - 132, 74, 70, 137, 1, 153, 114, 80, 134, 135, - 159, 146, 150, 159, 87, 88, 89, -1, 91, 1, - 93, 159, 95, 161, 162, 98, -1, 1, 1, -1, - 103, 104, 105, 74, 132, 161, 109, 110, -1, 80, + 31, 31, 74, 163, 31, 1, 166, 167, 80, 31, + 149, 31, 134, 135, 31, 87, 88, 89, 31, 91, + 161, 93, 161, 95, 31, 31, 98, 149, 37, 37, + 35, 103, 104, 105, 74, 31, 35, 109, 110, 161, + 80, 35, 35, 115, 116, 70, 35, 87, 88, 89, + 35, 91, 124, 93, 37, 95, 84, 37, 98, 38, + 57, 116, 1, 103, 104, 105, 69, 77, 31, 109, + 110, 82, 70, 85, 89, 115, 116, 96, 106, 80, + 108, 83, 154, 138, 124, 113, 90, 82, 84, 117, + 118, 114, 31, 80, 122, 85, 132, 97, 132, 127, + 128, 129, 130, 131, 92, 97, 97, 128, 163, 134, + 135, 74, 70, 94, 1, 133, 100, 80, 100, 154, + 146, 137, 150, 160, 87, 88, 89, 113, 91, 1, + 93, 159, 95, 161, 162, 98, 161, 161, 1, 153, + 103, 104, 105, 74, -1, 84, 109, 110, -1, 80, 1, -1, 115, 116, -1, -1, 87, 88, 89, 31, - 91, 124, 93, 159, 95, 161, 149, 98, 31, 149, - 149, 102, 103, 104, 105, 74, 134, 135, 109, 110, - 149, 80, 81, 149, 115, 116, 154, 158, 87, 88, - 89, 149, 91, 124, 93, 155, 95, 84, 159, 98, - 159, 163, 159, 161, 103, 104, 105, 159, 159, 159, - 109, 110, 84, 100, 101, 102, 115, 116, 82, 106, - 159, 84, 159, 159, 159, 124, 159, 159, 162, 159, - 117, 118, 159, 84, 159, 122, 159, 161, 160, 160, - 127, 128, 129, 130, 131, 70, 160, 160, 160, 100, - 101, 102, 116, 160, 162, 106, 161, 82, 161, 161, - 161, 86, 162, 161, 128, 161, 117, 118, 161, 161, - 161, 122, 159, 137, 161, 162, 127, 128, 129, 130, - 131, 161, 161, 161, 165, 162, 162, 159, 70, 161, - 163, 116, 162, 162, 158, 162, 159, 122, 161, 163, - 162, 162, 162, 167, 162, 162, 162, 162, 159, 162, + 91, 124, 93, 159, 95, 161, 138, 98, 31, 146, + -1, 102, 103, 104, 105, 74, 134, 135, 109, 110, + 149, 80, 81, 149, 115, 116, 153, 149, 87, 88, + 89, 149, 91, 124, 93, 149, 95, 84, 149, 98, + 155, 158, 161, 161, 103, 104, 105, 159, 161, 159, + 109, 110, 84, 100, 101, 102, 115, 116, 159, 106, + 159, 84, 161, 159, 159, 124, 159, 159, 162, 159, + 117, 118, 159, 84, 159, 122, 159, 159, 159, 159, + 127, 128, 129, 130, 131, 70, 159, 159, 159, 100, + 101, 102, 1, 159, 161, 106, 160, 82, 160, 160, + 160, 86, 160, 166, 161, 161, 117, 118, 161, 1, + 161, 122, 159, 161, 161, 162, 127, 128, 129, 130, + 131, 161, 31, 161, 161, 161, 165, 159, 162, 161, + 163, 116, 162, 162, 162, 162, 159, 122, 161, 163, + 162, 162, 162, 162, 162, 162, 162, 162, 159, 162, 161, 162, 137, 162, 139, 140, 141, 142, 143, 144, 162, 162, 162, 162, 162, 162, 151, 152, 162, 162, - 74, 162, 162, 165, 163, 163, 80, 163, 163, 163, + 74, 162, 162, 82, 162, 164, 80, 163, 163, 163, 163, 166, 167, 87, 88, 89, 163, 91, 163, 93, - 163, 95, 134, 135, 98, 163, 163, 163, 163, 103, - 104, 105, 163, 163, 163, 109, 110, 149, 163, 163, - 163, 115, 116, 163, 163, 163, 163, 163, 163, 161, - 124, 164, 163, 163, 163, 163, 163, 163, 163, 163, - 163, 163, 163, -1, 164, 164, 164, 164, 164, 164, + 82, 95, 163, 163, 98, 163, 163, 163, 163, 103, + 104, 105, 163, 163, 163, 109, 110, 116, 117, 118, + 163, 115, 116, 122, 163, 163, 163, 163, 163, 128, + 124, 163, 163, 163, 116, 117, 118, 163, 137, 163, + 122, 163, 163, 163, 163, 163, 128, 163, 163, 163, + 163, 163, 163, -1, 164, 137, 164, 164, 164, 158, + 164, 164, 164, 164, 163, 165, 164, 164, 167, 164, + -1, 164, 164, 164, 164, 164, 158, 164, 164, 164, + 164, 163, -1, 164, 164, 167, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - -1, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, -1, -1, - 166, -1, 167 + 164, 164, 164, 164, 164, 164, 164, -1, -1, -1, + 167 ); protected $actionBase = array( - 0, -2, 154, 542, 752, 893, 929, 580, 53, 394, - 855, 307, 307, 67, 307, 307, 307, 565, 908, 908, - 917, 908, 538, 784, 649, 649, 649, 708, 708, 708, - 708, 740, 740, 849, 849, 881, 817, 634, 1036, 1036, + 0, -2, 154, 542, 752, 893, 929, 52, 374, 431, + 398, 869, 793, 235, 307, 307, 793, 307, 784, 908, + 908, 917, 908, 538, 841, 468, 468, 468, 708, 708, + 708, 708, 740, 740, 849, 849, 881, 817, 634, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, @@ -512,65 +516,67 @@ class Php7 extends \PhpParser\ParserAbstract 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, 1036, - 1036, 1036, 12, 323, 389, 678, 1044, 1050, 1046, 1051, - 1042, 1041, 1045, 1047, 1052, 942, 943, 753, 946, 947, - 949, 950, 1048, 873, 1043, 1049, 291, 291, 291, 291, + 1036, 1036, 1036, 1036, 348, 346, 370, 653, 1063, 1069, + 1065, 1070, 1061, 1060, 1064, 1066, 1071, 946, 947, 774, + 949, 950, 943, 952, 1067, 882, 1062, 1068, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 346, 491, 50, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 54, 54, 54, 620, 620, - 359, 190, 184, 955, 955, 955, 955, 955, 955, 955, - 955, 955, 955, 658, 47, 144, 144, 7, 7, 7, - 7, 7, 371, -25, -25, -25, -25, 709, 347, 916, - 474, 526, 375, 280, 317, 245, 340, 340, 187, 187, - 396, 396, -87, -87, 396, 396, 396, 747, 747, 747, - 747, 443, 505, -94, 308, 454, 480, 480, 480, 480, - 454, 454, 454, 454, 755, 1054, 454, 454, 454, 641, - 822, 822, 998, 442, 442, 442, 822, 499, 776, 88, - 499, 88, 37, 92, 756, 85, -54, 425, 756, 639, - 764, 189, 143, 820, 524, 820, 1040, 385, 767, 413, - 735, 688, 857, 902, 1053, 787, 940, 788, 941, 228, - 98, 685, 1039, 1039, 1039, 1039, 1039, 1039, 1039, 1039, - 1039, 1039, 1039, 1055, 415, 1040, 286, 1055, 1055, 1055, - 415, 415, 415, 415, 415, 415, 415, 415, 415, 415, - 534, 286, 483, 496, 286, 774, 415, 12, 800, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 736, - -16, 12, 323, 204, 204, 427, 168, 204, 204, 204, - 204, 12, 12, 12, 524, 773, 733, 537, 742, 377, - 773, 773, 773, 115, 124, 207, 342, 695, 754, 446, - 761, 761, 775, 957, 957, 761, 765, 761, 775, 973, - 761, 761, 957, 957, 809, 232, 625, 579, 612, 627, - 957, 475, 761, 761, 761, 761, 792, 643, 761, 433, - 281, 761, 761, 792, 758, 739, 46, 751, 957, 957, - 957, 792, 603, 751, 751, 751, 819, 821, 746, 738, - 571, 507, 645, 198, 783, 738, 738, 761, 619, 746, - 738, 746, 738, 812, 738, 738, 738, 746, 738, 765, - 585, 738, 691, 644, 188, 738, 6, 974, 975, 624, - 979, 967, 980, 1009, 981, 985, 878, 956, 992, 972, - 986, 965, 963, 750, 679, 680, 801, 797, 954, 771, - 771, 771, 951, 771, 771, 771, 771, 771, 771, 771, - 771, 679, 858, 814, 745, 777, 995, 682, 684, 743, - 872, 899, 948, 994, 1030, 987, 741, 689, 1016, 999, - 846, 875, 1000, 1001, 1017, 1031, 1032, 880, 772, 903, - 904, 859, 1003, 879, 771, 974, 985, 663, 972, 986, - 965, 963, 734, 724, 720, 723, 717, 704, 700, 703, - 737, 1033, 907, 818, 866, 1002, 952, 679, 867, 1012, - 856, 1018, 1019, 877, 778, 768, 868, 910, 1004, 1005, - 1006, 882, 1034, 884, 744, 1013, 997, 1020, 780, 911, - 1021, 1022, 1023, 1024, 887, 913, 888, 889, 823, 781, - 1010, 757, 918, 528, 769, 770, 789, 1008, 642, 993, - 900, 919, 920, 1025, 1026, 1027, 922, 923, 990, 828, - 1014, 760, 1015, 1011, 829, 830, 647, 785, 1035, 759, - 763, 779, 653, 674, 924, 925, 927, 991, 748, 762, - 841, 843, 1037, 683, 1038, 931, 677, 844, 696, 938, - 1029, 697, 699, 786, 901, 811, 782, 766, 1007, 749, - 845, 939, 847, 848, 850, 1028, 853, 0, 0, 0, + 291, 291, 291, 291, 291, 525, 191, 359, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 174, 174, + 174, 620, 620, 51, 465, 356, 955, 955, 955, 955, + 955, 955, 955, 955, 955, 955, 658, 184, 144, 144, + 7, 7, 7, 7, 7, 1031, 371, 1048, -25, -25, + -25, -25, 50, 725, 526, 449, 39, 317, 80, 474, + 474, 13, 13, 512, 512, 422, 422, 512, 512, 512, + 808, 808, 808, 808, 443, 505, 360, 308, -78, 209, + 209, 209, 209, -78, -78, -78, -78, 803, 877, -78, + -78, -78, 63, 641, 641, 822, -1, -1, -1, 641, + 253, 790, 548, 253, 384, 548, 480, 402, 764, 759, + -49, 447, 764, 639, 755, 198, 143, 825, 609, 825, + 1059, 320, 768, 426, 749, 720, 874, 904, 1072, 796, + 941, 798, 942, 106, -58, 710, 1058, 1058, 1058, 1058, + 1058, 1058, 1058, 1058, 1058, 1058, 1058, 1073, 336, 1059, + 423, 1073, 1073, 1073, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 336, 619, 423, 586, 616, 423, 795, + 336, 348, 814, 348, 348, 348, 348, 348, 348, 348, + 348, 348, 348, 750, 202, 348, 346, 78, 78, 484, + 65, 78, 78, 78, 78, 348, 348, 348, 348, 609, + 783, 766, 613, 813, 492, 783, 783, 783, 473, 135, + 378, 488, 713, 775, 67, 779, 779, 785, 969, 969, + 779, 769, 779, 785, 975, 779, 779, 969, 969, 823, + 280, 563, 478, 550, 568, 969, 377, 779, 779, 779, + 779, 746, 573, 779, 342, 314, 779, 779, 746, 744, + 760, 43, 762, 969, 969, 969, 746, 547, 762, 762, + 762, 839, 844, 794, 758, 444, 433, 588, 232, 801, + 758, 758, 779, 558, 794, 758, 794, 758, 745, 758, + 758, 758, 794, 758, 769, 502, 758, 717, 583, 224, + 758, 6, 979, 980, 624, 981, 973, 987, 1019, 991, + 992, 873, 965, 999, 974, 993, 972, 970, 773, 682, + 684, 818, 811, 963, 777, 777, 777, 956, 777, 777, + 777, 777, 777, 777, 777, 777, 682, 743, 829, 765, + 1006, 689, 691, 754, 906, 901, 1030, 1004, 1049, 994, + 828, 694, 1028, 1008, 846, 821, 1009, 1010, 1029, 1050, + 1052, 910, 782, 911, 912, 876, 1012, 883, 777, 979, + 992, 693, 974, 993, 972, 970, 748, 739, 737, 738, + 736, 735, 723, 734, 753, 1053, 954, 907, 878, 1011, + 957, 682, 879, 1023, 756, 1032, 1033, 827, 788, 778, + 880, 913, 1014, 1015, 1016, 884, 1054, 887, 830, 1024, + 951, 1035, 789, 918, 1037, 1038, 1039, 1040, 889, 919, + 892, 916, 900, 845, 776, 1020, 761, 920, 591, 787, + 791, 800, 1018, 606, 1000, 902, 921, 922, 1041, 1043, + 1044, 923, 924, 995, 847, 1026, 799, 1027, 1022, 848, + 850, 617, 797, 1055, 781, 786, 772, 621, 632, 925, + 927, 931, 998, 763, 770, 853, 855, 1056, 771, 1057, + 938, 635, 857, 718, 939, 1046, 719, 724, 637, 678, + 672, 731, 792, 903, 826, 757, 780, 1017, 724, 767, + 858, 940, 859, 860, 867, 1045, 868, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 458, 458, 458, - 458, 458, 458, 307, 307, 307, 307, 0, 0, 307, - 0, 0, 0, 458, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 307, 307, 307, 307, 307, 307, 307, + 0, 0, 307, 0, 458, 458, 458, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, @@ -584,182 +590,182 @@ class Php7 extends \PhpParser\ParserAbstract 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 458, 458, 458, 458, 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, + 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 219, 219, 291, 291, 291, 219, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 0, - 291, 291, 291, 291, 291, 291, 291, 291, 809, 442, - 442, 442, 442, 219, 219, 219, 219, 219, -88, -88, - 219, 809, 219, 219, 442, 442, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 219, 219, 0, 0, 286, - 88, 219, 765, 765, 765, 765, 219, 219, 219, 219, - 88, 88, 219, 219, 219, 0, 0, 0, 0, 0, - 0, 0, 0, 286, 88, 0, 286, 0, 765, 765, - 219, 0, 809, 314, 219, 0, 0, 0, 0, 286, - 765, 286, 415, 761, 88, 761, 415, 415, 204, 12, - 314, 527, 527, 527, 527, 0, 0, 524, 809, 809, - 809, 809, 809, 809, 809, 809, 809, 809, 809, 765, - 0, 809, 0, 765, 765, 765, 0, 0, 0, 0, + 291, 291, 291, 291, 291, 291, 291, 66, 66, 291, + 291, 291, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 0, 291, 291, 291, 291, 291, 291, 291, + 291, 66, 823, 66, -1, -1, -1, -1, 66, 66, + 66, -88, -88, 66, 384, 66, 66, -1, -1, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 0, 0, 423, 548, 66, 769, 769, 769, 769, 66, + 66, 66, 66, 548, 548, 66, 66, 66, 0, 0, + 0, 0, 0, 0, 0, 0, 423, 548, 0, 423, + 0, 0, 769, 769, 66, 384, 823, 643, 66, 0, + 0, 0, 0, 423, 769, 423, 336, 779, 548, 779, + 336, 336, 78, 348, 643, 611, 611, 611, 611, 0, + 0, 609, 823, 823, 823, 823, 823, 823, 823, 823, + 823, 823, 823, 769, 0, 823, 0, 769, 769, 769, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 765, 0, 0, 957, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 973, 0, 0, 0, 0, - 0, 0, 765, 0, 0, 0, 0, 0, 0, 0, - 0, 771, 778, 0, 778, 0, 771, 771, 771, 0, - 0, 0, 0, 785, 683 + 0, 0, 0, 0, 0, 769, 0, 0, 969, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 975, + 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 777, 788, 0, 788, + 0, 777, 777, 777, 0, 0, 0, 0, 797, 771 ); protected $actionDefault = array( 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 101,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 593, 593, 593, - 593,32767,32767, 253, 103,32767,32767, 467, 385, 385, - 385,32767,32767, 537, 537, 537, 537, 537, 537,32767, - 32767,32767,32767,32767,32767, 467,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767, 101,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 596, 596, + 596, 596,32767,32767, 254, 103,32767,32767, 469, 387, + 387, 387,32767,32767, 540, 540, 540, 540, 540, 540, + 32767,32767,32767,32767,32767,32767, 469,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 101,32767, - 32767,32767, 37, 7, 8, 10, 11, 50, 17, 323, - 32767,32767,32767,32767, 103,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 101, + 32767,32767,32767, 37, 7, 8, 10, 11, 50, 17, + 324,32767,32767,32767,32767, 103,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 586,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 589,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 471, 450, 451, 453, - 454, 384, 538, 592, 326, 589, 383, 146, 338, 328, - 241, 329, 257, 472, 258, 473, 476, 477, 214, 286, - 380, 150, 414, 468, 416, 466, 470, 415, 390, 395, - 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, - 406, 407, 388, 389, 469, 447, 446, 445,32767,32767, - 412, 413, 417,32767,32767,32767,32767,32767,32767,32767, - 32767, 103,32767, 387, 420, 418, 419, 436, 437, 434, - 435, 438,32767, 439, 440, 441, 442,32767, 315,32767, - 32767,32767, 364, 362, 315, 112,32767,32767, 427, 428, + 32767,32767,32767,32767,32767,32767,32767,32767, 473, 452, + 453, 455, 456, 386, 541, 595, 327, 592, 385, 146, + 339, 329, 242, 330, 258, 474, 259, 475, 478, 479, + 215, 287, 382, 150, 151, 416, 470, 418, 468, 472, + 417, 392, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 390, 391, 471, 449, 448, + 447,32767,32767, 414, 415, 419,32767,32767,32767,32767, + 32767,32767,32767,32767, 103,32767, 389, 422, 420, 421, + 438, 439, 436, 437, 440,32767,32767,32767, 441, 442, + 443, 444, 316,32767,32767, 366, 364, 316, 112,32767, + 32767, 429, 430,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767, 534, 446,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 103, + 32767, 101, 536, 411, 413, 503, 424, 425, 423, 393, + 32767, 510,32767, 103,32767, 512,32767,32767,32767,32767, + 32767,32767,32767, 535,32767, 542, 542,32767, 496, 101, + 195,32767,32767,32767, 195, 195,32767,32767,32767,32767, + 32767,32767,32767,32767, 603, 496, 111, 111, 111, 111, + 111, 111, 111, 111, 111, 111, 111,32767, 195, 111, + 32767,32767,32767, 101, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 190,32767, 268, 270, 103, 557, + 195,32767, 515,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767, 508,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 496, + 434, 139,32767, 139, 542, 426, 427, 428, 498, 542, + 542, 542, 312, 289,32767,32767,32767,32767, 513, 513, + 101, 101, 101, 101, 508,32767,32767,32767,32767, 112, + 100, 100, 100, 100, 100, 104, 102,32767,32767,32767, + 32767, 223, 100,32767, 102, 102,32767,32767, 223, 225, + 212, 102, 227,32767, 561, 562, 223, 102, 227, 227, + 227, 247, 247, 485, 318, 102, 100, 102, 102, 197, + 318, 318,32767, 102, 485, 318, 485, 318, 199, 318, + 318, 318, 485, 318,32767, 102, 318, 214, 100, 100, + 318,32767,32767,32767, 498,32767,32767,32767,32767,32767, + 32767,32767, 222,32767,32767,32767,32767,32767,32767,32767, + 529,32767, 546, 559, 432, 433, 435, 544, 457, 458, + 459, 460, 461, 462, 463, 465, 591,32767, 502,32767, + 32767,32767, 338, 601,32767, 601,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 531, 444,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 103,32767, 101, 533, - 409, 411, 501, 422, 423, 421, 391,32767, 508,32767, - 103, 510,32767,32767,32767,32767,32767,32767,32767, 532, - 32767, 539, 539,32767, 494, 101, 194,32767,32767,32767, - 194, 194,32767,32767,32767,32767,32767,32767,32767,32767, - 600, 494, 111, 111, 111, 111, 111, 111, 111, 111, - 111, 111, 111,32767, 194, 111,32767,32767,32767, 101, - 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 189,32767, 267, 269, 103, 554, 194,32767, 513,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 506, + 32767, 602,32767, 542,32767,32767,32767,32767, 431, 9, + 76, 491, 43, 44, 52, 58, 519, 520, 521, 522, + 516, 517, 523, 518,32767,32767, 524, 567,32767,32767, + 543, 594,32767,32767,32767,32767,32767,32767, 139,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 494, 432, 139,32767, 139, 539, - 424, 425, 426, 496, 539, 539, 539, 311, 288,32767, - 32767,32767,32767, 511, 511, 101, 101, 101, 101, 506, - 32767,32767,32767,32767, 112, 100, 100, 100, 100, 100, - 104, 102,32767,32767,32767,32767, 222, 100,32767, 102, - 102,32767,32767, 222, 224, 211, 102, 226,32767, 558, - 559, 222, 102, 226, 226, 226, 246, 246, 483, 317, - 102, 100, 102, 102, 196, 317, 317,32767, 102, 483, - 317, 483, 317, 198, 317, 317, 317, 483, 317,32767, - 102, 317, 213, 100, 100, 317,32767,32767,32767, 496, - 32767,32767,32767,32767,32767,32767,32767, 221,32767,32767, - 32767,32767,32767,32767,32767, 526,32767, 543, 556, 430, - 431, 433, 541, 455, 456, 457, 458, 459, 460, 461, - 463, 588,32767, 500,32767,32767,32767,32767, 337, 598, - 32767, 598,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 599,32767, 539, - 32767,32767,32767,32767, 429, 9, 76, 489, 43, 44, - 52, 58, 517, 518, 519, 520, 514, 515, 521, 516, - 32767,32767, 522, 564,32767,32767, 540, 591,32767,32767, - 32767,32767,32767,32767, 139,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 526,32767, 137,32767, + 529,32767, 137,32767,32767,32767,32767,32767,32767,32767, + 32767, 525,32767,32767,32767, 542,32767,32767,32767,32767, + 314, 311,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 542,32767, + 32767,32767,32767,32767, 291,32767, 308,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 539,32767,32767,32767,32767, 313, 310,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 539,32767,32767,32767,32767,32767, 290, - 32767, 307,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 285,32767, - 32767, 379,32767,32767,32767,32767, 358,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 152, 152, 3, - 3, 340, 152, 152, 152, 340, 340, 152, 340, 340, - 340, 152, 152, 152, 152, 152, 152, 279, 184, 261, - 264, 246, 246, 152, 350, 152 + 32767,32767,32767, 286,32767,32767, 381, 498, 294, 296, + 297,32767,32767,32767,32767, 360,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 153, 153, 3, + 3, 341, 153, 153, 153, 341, 341, 153, 341, 341, + 341, 153, 153, 153, 153, 153, 153, 280, 185, 262, + 265, 247, 247, 153, 352, 153 ); protected $goto = array( - 194, 194, 685, 425, 653, 346, 614, 650, 419, 310, - 311, 331, 569, 316, 424, 332, 426, 630, 1200, 930, - 693, 1051, 1201, 1204, 931, 1205, 165, 165, 165, 165, - 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, - 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, - 188, 189, 190, 215, 213, 216, 529, 530, 415, 531, - 533, 534, 535, 536, 537, 538, 539, 540, 1120, 166, - 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, - 176, 212, 214, 217, 235, 240, 241, 242, 254, 255, - 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, - 278, 279, 313, 314, 315, 420, 421, 422, 574, 219, - 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, - 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, - 236, 186, 187, 188, 189, 190, 215, 1120, 199, 180, - 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, - 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, - 211, 275, 275, 275, 275, 843, 593, 646, 647, 560, - 664, 665, 666, 720, 629, 631, 840, 418, 651, 604, - 841, 350, 675, 679, 996, 683, 691, 992, 616, 616, - 817, 350, 350, 1252, 1252, 1252, 1252, 1252, 1252, 1252, - 1252, 1252, 1252, 1092, 1093, 350, 350, 874, 350, 848, - 1337, 896, 891, 892, 905, 849, 893, 846, 894, 895, - 847, 548, 900, 899, 901, 350, 391, 394, 554, 594, - 598, 1270, 1270, 1072, 1068, 1069, 1270, 1270, 1270, 1270, - 1270, 1270, 1270, 1270, 1270, 1270, 1268, 1268, 815, 347, - 348, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, - 1268, 1221, 1020, 1221, 1020, 1221, 836, 5, 1020, 6, - 1020, 1020, 1281, 961, 1020, 1020, 1020, 1020, 1020, 1020, - 1020, 1020, 1020, 1020, 1020, 349, 349, 349, 349, 1221, - 460, 460, 566, 678, 1221, 1221, 1221, 1221, 344, 460, - 1221, 1221, 1221, 1302, 1302, 1302, 1302, 602, 617, 620, - 621, 622, 623, 643, 644, 645, 695, 836, 912, 553, - 546, 1310, 913, 548, 532, 532, 821, 856, 982, 532, - 532, 532, 532, 532, 532, 532, 532, 532, 532, 543, - 473, 543, 868, 543, 928, 855, 928, 389, 475, 337, - 546, 553, 562, 563, 339, 572, 595, 609, 610, 1320, - 1320, 249, 249, 1026, 1025, 15, 821, 450, 821, 494, - 565, 495, 955, 955, 955, 955, 1320, 501, 450, 949, - 956, 839, 652, 1321, 1321, 1169, 1214, 246, 246, 246, - 246, 248, 250, 1323, 985, 959, 959, 957, 959, 719, - 1321, 545, 994, 989, 470, 1295, 1296, 953, 405, 692, - 917, 1108, 432, 541, 541, 541, 541, 612, 597, 452, - 444, 1029, 1030, 1001, 658, 444, 1292, 444, 1292, 674, - 1292, 860, 833, 656, 980, 836, 861, 547, 557, 854, - 321, 305, 547, 333, 557, 1297, 1298, 392, 456, 570, - 607, 1211, 944, 398, 858, 1304, 1304, 1304, 1304, 463, - 573, 464, 465, 608, 1004, 866, 403, 404, 1328, 1329, - 1057, 662, 1212, 663, 471, 407, 408, 409, 723, 676, - 870, 1288, 410, 624, 626, 627, 342, 427, 1216, 869, - 857, 1056, 1060, 427, 864, 1061, 1103, 966, 0, 0, - 964, 1027, 1027, 0, 0, 0, 657, 1038, 1034, 1035, - 444, 444, 444, 444, 444, 444, 444, 444, 444, 444, - 444, 0, 1059, 444, 954, 0, 1290, 1290, 1059, 592, - 1085, 0, 696, 682, 682, 0, 502, 688, 1083, 0, - 0, 0, 1217, 1218, 272, 428, 1101, 873, 0, 544, - 831, 544, 0, 0, 0, 673, 938, 0, 0, 1015, - 1031, 1032, 0, 0, 0, 0, 0, 0, 1219, 1278, - 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 196, 196, 1031, 703, 694, 430, 658, 1062, 1334, 1334, + 424, 313, 314, 335, 573, 319, 429, 336, 431, 635, + 651, 652, 850, 669, 670, 671, 1334, 167, 167, 167, + 167, 221, 197, 193, 193, 177, 179, 216, 193, 193, + 193, 193, 193, 194, 194, 194, 194, 194, 194, 188, + 189, 190, 191, 192, 218, 216, 219, 534, 535, 420, + 536, 538, 539, 540, 541, 542, 543, 544, 545, 1132, + 168, 169, 170, 195, 171, 172, 173, 166, 174, 175, + 176, 178, 215, 217, 220, 238, 243, 244, 245, 257, + 258, 259, 260, 261, 262, 263, 264, 268, 269, 270, + 271, 281, 282, 316, 317, 318, 425, 426, 427, 578, + 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 180, 237, 181, 198, 199, + 200, 239, 188, 189, 190, 191, 192, 218, 1132, 201, + 182, 183, 184, 202, 198, 185, 240, 203, 201, 165, + 204, 205, 186, 206, 207, 208, 187, 209, 210, 211, + 212, 213, 214, 853, 851, 278, 278, 278, 278, 418, + 620, 620, 350, 570, 597, 1265, 1265, 1265, 1265, 1265, + 1265, 1265, 1265, 1265, 1265, 1283, 1283, 831, 618, 655, + 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, 1283, + 353, 353, 353, 353, 866, 557, 550, 858, 825, 907, + 902, 903, 916, 859, 904, 856, 905, 906, 857, 878, + 457, 910, 865, 884, 546, 546, 546, 546, 831, 601, + 831, 1084, 1079, 1080, 1081, 341, 550, 557, 566, 567, + 343, 576, 599, 613, 614, 407, 408, 972, 465, 465, + 667, 15, 668, 1323, 411, 412, 413, 465, 681, 348, + 1233, 414, 1233, 478, 569, 346, 439, 1031, 1031, 1233, + 993, 480, 1031, 393, 1031, 1031, 1104, 1105, 1031, 1031, + 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1031, 1315, + 1315, 1315, 1315, 1233, 657, 1333, 1333, 1055, 1233, 1233, + 1233, 1233, 1037, 1036, 1233, 1233, 1233, 1034, 1034, 1181, + 354, 678, 949, 1333, 437, 1026, 1042, 1043, 337, 691, + 354, 354, 827, 923, 691, 1040, 1041, 924, 691, 663, + 1336, 939, 871, 939, 354, 354, 1281, 1281, 354, 679, + 1350, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, + 1281, 552, 537, 537, 911, 354, 912, 537, 537, 537, + 537, 537, 537, 537, 537, 537, 537, 548, 564, 548, + 574, 611, 730, 634, 636, 849, 548, 656, 475, 1308, + 1309, 680, 684, 1007, 692, 701, 1003, 252, 252, 996, + 970, 970, 968, 970, 729, 843, 549, 1005, 1000, 423, + 455, 608, 1294, 846, 955, 966, 966, 966, 966, 325, + 308, 455, 960, 967, 249, 249, 249, 249, 251, 253, + 402, 351, 352, 683, 868, 551, 561, 449, 449, 449, + 551, 1305, 561, 1305, 612, 396, 461, 1010, 1010, 1224, + 1305, 395, 398, 558, 598, 602, 1015, 468, 577, 469, + 470, 1310, 1311, 876, 552, 846, 1341, 1342, 964, 409, + 702, 733, 324, 275, 324, 1317, 1317, 1317, 1317, 606, + 621, 624, 625, 626, 627, 648, 649, 650, 705, 1068, + 596, 1097, 874, 706, 476, 1228, 507, 697, 880, 1095, + 1115, 432, 1301, 628, 630, 632, 432, 879, 867, 1067, + 1071, 5, 1072, 6, 1038, 1038, 977, 0, 975, 662, + 1049, 1045, 1046, 0, 0, 0, 0, 1226, 449, 449, + 449, 449, 449, 449, 449, 449, 449, 449, 449, 928, + 1120, 449, 965, 1070, 0, 0, 616, 1303, 1303, 1070, + 1229, 1230, 1012, 499, 0, 500, 0, 0, 841, 0, + 870, 506, 661, 991, 1113, 883, 1212, 941, 864, 0, + 1213, 1216, 942, 1217, 0, 0, 1231, 1291, 1292, 0, + 1223, 0, 0, 0, 846, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 252, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 999, 999 + 0, 0, 0, 0, 0, 0, 0, 255, 255 ); protected $gotoCheck = array( - 42, 42, 72, 65, 65, 96, 55, 55, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 78, 78, - 9, 126, 78, 78, 78, 78, 42, 42, 42, 42, + 42, 42, 72, 9, 72, 65, 65, 126, 181, 181, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 85, 85, 26, 85, 85, 85, 181, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, @@ -773,97 +779,97 @@ class Php7 extends \PhpParser\ParserAbstract 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 23, 23, 23, 23, 15, 129, 85, 85, 48, - 85, 85, 85, 48, 48, 48, 26, 13, 48, 13, - 27, 14, 48, 48, 48, 48, 48, 48, 107, 107, - 7, 14, 14, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 143, 143, 14, 14, 45, 14, 15, - 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 14, 64, 15, 64, 14, 58, 58, 58, 58, - 58, 168, 168, 15, 15, 15, 168, 168, 168, 168, - 168, 168, 168, 168, 168, 168, 169, 169, 6, 96, - 96, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 72, 72, 72, 72, 72, 22, 46, 72, 46, - 72, 72, 14, 49, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 24, 24, 24, 24, 72, - 148, 148, 170, 14, 72, 72, 72, 72, 177, 148, - 72, 72, 72, 9, 9, 9, 9, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 22, 72, 75, - 75, 179, 72, 14, 171, 171, 12, 35, 102, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 19, - 83, 19, 35, 19, 9, 35, 9, 61, 83, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 180, - 180, 5, 5, 117, 117, 75, 12, 19, 12, 154, - 103, 154, 19, 19, 19, 19, 180, 154, 19, 19, - 19, 25, 63, 181, 181, 150, 14, 5, 5, 5, - 5, 5, 5, 180, 25, 25, 25, 25, 25, 25, - 181, 25, 25, 25, 174, 174, 174, 92, 92, 92, - 17, 17, 112, 106, 106, 106, 106, 17, 106, 82, - 23, 118, 118, 17, 119, 23, 129, 23, 129, 115, - 129, 17, 18, 17, 17, 22, 39, 9, 9, 17, - 167, 167, 9, 29, 9, 176, 176, 9, 9, 2, - 2, 17, 91, 28, 37, 129, 129, 129, 129, 9, - 9, 9, 9, 79, 109, 9, 81, 81, 9, 9, - 128, 81, 159, 81, 156, 81, 81, 81, 98, 81, - 41, 129, 81, 84, 84, 84, 81, 116, 20, 16, - 16, 16, 16, 116, 9, 131, 146, 95, -1, -1, - 16, 116, 116, -1, -1, -1, 116, 116, 116, 116, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, -1, 129, 23, 16, -1, 129, 129, 129, 8, - 8, -1, 8, 8, 8, -1, 8, 8, 8, -1, - -1, -1, 20, 20, 24, 88, 16, 16, -1, 24, - 20, 24, -1, -1, -1, 88, 88, -1, -1, 88, - 88, 88, -1, -1, -1, -1, -1, -1, 20, 20, - 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 42, 42, 42, 15, 27, 23, 23, 23, 23, 43, + 107, 107, 96, 170, 129, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 168, 168, 12, 55, 55, + 168, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 24, 24, 24, 24, 35, 75, 75, 15, 6, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 35, + 82, 15, 35, 45, 106, 106, 106, 106, 12, 106, + 12, 15, 15, 15, 15, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 81, 81, 49, 148, 148, + 81, 75, 81, 179, 81, 81, 81, 148, 81, 177, + 72, 81, 72, 83, 103, 81, 82, 72, 72, 72, + 102, 83, 72, 61, 72, 72, 143, 143, 72, 72, + 72, 72, 72, 72, 72, 72, 72, 72, 72, 9, + 9, 9, 9, 72, 63, 180, 180, 113, 72, 72, + 72, 72, 117, 117, 72, 72, 72, 88, 88, 150, + 14, 88, 88, 180, 112, 88, 88, 88, 29, 7, + 14, 14, 7, 72, 7, 118, 118, 72, 7, 119, + 180, 9, 39, 9, 14, 14, 169, 169, 14, 115, + 14, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 14, 171, 171, 64, 14, 64, 171, 171, 171, + 171, 171, 171, 171, 171, 171, 171, 19, 48, 19, + 2, 2, 48, 48, 48, 25, 19, 48, 174, 174, + 174, 48, 48, 48, 48, 48, 48, 5, 5, 25, + 25, 25, 25, 25, 25, 18, 25, 25, 25, 13, + 19, 13, 14, 22, 91, 19, 19, 19, 19, 167, + 167, 19, 19, 19, 5, 5, 5, 5, 5, 5, + 28, 96, 96, 14, 37, 9, 9, 23, 23, 23, + 9, 129, 9, 129, 79, 9, 9, 106, 106, 159, + 129, 58, 58, 58, 58, 58, 109, 9, 9, 9, + 9, 176, 176, 9, 14, 22, 9, 9, 92, 92, + 92, 98, 24, 24, 24, 129, 129, 129, 129, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 128, + 8, 8, 9, 8, 156, 20, 8, 8, 41, 8, + 146, 116, 129, 84, 84, 84, 116, 16, 16, 16, + 16, 46, 131, 46, 116, 116, 95, -1, 16, 116, + 116, 116, 116, -1, -1, -1, -1, 14, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 17, + 17, 23, 16, 129, -1, -1, 17, 129, 129, 129, + 20, 20, 17, 154, -1, 154, -1, -1, 20, -1, + 17, 154, 17, 17, 16, 16, 78, 78, 17, -1, + 78, 78, 78, 78, -1, -1, 20, 20, 20, -1, + 17, -1, -1, -1, 22, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 106, 106 + -1, -1, -1, -1, -1, -1, -1, 5, 5 ); protected $gotoBase = array( - 0, 0, -250, 0, 0, 360, 235, 181, 522, 7, - 0, 0, 33, -156, -113, -178, 43, -49, 126, 72, - 100, 0, -9, 158, 282, 377, 172, 176, 120, 150, - 0, 0, 0, 0, 0, -39, 0, 119, 0, 116, - 0, 45, -1, 0, 0, 195, -456, 0, -529, 250, - 0, 0, 0, 0, 0, -33, 0, 0, 182, 0, - 0, 306, 0, 143, 203, -235, 0, 0, 0, 0, - 0, 0, -6, 0, 0, -21, 0, 0, -385, 124, - -46, -19, 144, -123, 10, -538, 0, 0, 275, 0, - 0, 127, 106, 0, 0, 60, -472, 0, 76, 0, - 0, 0, 294, 328, 0, 0, 386, -50, 0, 99, - 0, 0, 138, 0, 0, 149, 219, 87, 139, 137, - 0, 0, 0, 0, 0, 0, 19, 0, 101, 159, - 0, 59, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -69, 0, 0, 58, 0, 257, 0, - 114, 0, 0, 0, -120, 0, 40, 0, 0, 108, - 0, 0, 0, 0, 0, 0, 0, 122, -7, 8, - 264, 86, 0, 0, 107, 0, 78, 269, 0, 291, - 55, 79, 0, 0 + 0, 0, -339, 0, 0, 386, 195, 312, 472, -10, + 0, 0, -109, 62, 13, -184, 46, 65, 86, 102, + 93, 0, 125, 162, 197, 371, 18, 160, 83, 22, + 0, 0, 0, 0, 0, -166, 0, 85, 0, 9, + 0, 48, -1, 157, 0, 207, -232, 0, -340, 223, + 0, 0, 0, 0, 0, 148, 0, 0, 396, 0, + 0, 231, 0, 52, 334, -236, 0, 0, 0, 0, + 0, 0, -5, 0, 0, -139, 0, 0, 149, 91, + 112, -245, -58, -205, 15, -695, 0, 0, 28, 0, + 0, 75, 154, 0, 0, 64, -310, 0, 55, 0, + 0, 0, 235, 221, 0, 0, 196, -71, 0, 77, + 0, 0, 37, 24, 0, 56, 219, 23, 40, 39, + 0, 0, 0, 0, 0, 0, 5, 0, 106, 166, + 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 47, 0, 214, 0, + 35, 0, 0, 0, 49, 0, 45, 0, 0, 71, + 0, 0, 0, 0, 0, 0, 0, 88, -56, 95, + 144, 111, 0, 0, 78, 0, 80, 229, 0, 222, + -12, -299, 0, 0 ); protected $gotoDefault = array( - -32768, 506, 727, 4, 728, 921, 804, 813, 590, 523, - 694, 343, 618, 416, 1286, 898, 1107, 571, 832, 1230, - 1238, 451, 835, 326, 717, 880, 881, 882, 395, 381, - 387, 393, 641, 619, 488, 867, 447, 859, 480, 862, - 446, 871, 162, 413, 504, 875, 3, 877, 550, 908, - 382, 885, 383, 669, 887, 556, 889, 890, 390, 396, - 397, 1112, 564, 615, 902, 253, 558, 903, 380, 904, - 911, 385, 388, 680, 459, 499, 493, 406, 1087, 559, - 601, 638, 441, 467, 613, 625, 611, 474, 1023, 411, - 325, 943, 951, 481, 457, 965, 345, 973, 725, 1119, - 632, 483, 981, 633, 988, 991, 524, 525, 472, 1003, - 268, 1006, 484, 1044, 659, 1017, 1018, 660, 634, 1040, - 635, 661, 636, 1042, 466, 591, 1050, 448, 1058, 1274, - 449, 1062, 262, 1065, 274, 412, 429, 1070, 1071, 8, - 1077, 686, 687, 10, 273, 503, 1102, 681, 445, 1118, - 433, 1188, 1190, 552, 485, 1208, 1207, 672, 500, 1213, - 442, 1277, 443, 526, 468, 312, 527, 304, 329, 309, - 542, 291, 330, 528, 469, 1283, 1291, 327, 30, 1311, - 1322, 338, 568, 606 + -32768, 511, 737, 4, 738, 932, 814, 823, 594, 528, + 704, 347, 622, 421, 1299, 909, 1119, 575, 842, 1242, + 1250, 456, 845, 330, 727, 891, 892, 893, 399, 385, + 391, 397, 646, 623, 493, 877, 452, 869, 485, 872, + 451, 881, 164, 417, 509, 885, 3, 888, 554, 919, + 386, 896, 387, 674, 898, 560, 900, 901, 394, 400, + 401, 1124, 568, 619, 913, 256, 562, 914, 384, 915, + 922, 389, 392, 685, 464, 504, 498, 410, 1099, 563, + 605, 643, 446, 472, 617, 629, 615, 479, 433, 415, + 329, 954, 962, 486, 462, 976, 349, 984, 735, 1131, + 637, 488, 992, 638, 999, 1002, 529, 530, 477, 1014, + 272, 1017, 489, 12, 664, 1028, 1029, 665, 639, 1051, + 640, 666, 641, 1053, 471, 595, 1061, 453, 1069, 1287, + 454, 1073, 266, 1076, 277, 416, 434, 1082, 1083, 9, + 1089, 695, 696, 11, 276, 508, 1114, 686, 450, 1130, + 438, 1200, 1202, 556, 490, 1220, 1219, 677, 505, 1225, + 447, 1290, 448, 531, 473, 315, 532, 307, 333, 312, + 547, 294, 334, 533, 474, 1296, 1304, 331, 31, 1324, + 1335, 342, 572, 610 ); protected $ruleToNonTerminal = array( @@ -882,30 +888,30 @@ class Php7 extends \PhpParser\ParserAbstract 4, 4, 4, 4, 29, 29, 30, 30, 32, 34, 34, 28, 36, 36, 33, 38, 38, 35, 35, 37, 37, 39, 39, 31, 40, 40, 41, 43, 44, 44, - 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, + 45, 45, 46, 46, 48, 47, 47, 47, 47, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, - 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, - 78, 78, 79, 79, 26, 26, 27, 27, 27, 27, - 27, 87, 87, 89, 89, 82, 82, 90, 90, 91, - 91, 91, 83, 83, 86, 86, 84, 84, 92, 93, - 93, 56, 56, 64, 64, 67, 67, 67, 66, 94, - 94, 95, 57, 57, 57, 57, 96, 96, 97, 97, - 98, 98, 99, 100, 100, 101, 101, 102, 102, 54, - 54, 50, 50, 104, 52, 52, 105, 51, 51, 53, - 53, 63, 63, 63, 63, 80, 80, 108, 108, 110, - 110, 111, 111, 111, 111, 109, 109, 109, 113, 113, - 113, 113, 88, 88, 116, 116, 116, 117, 117, 114, - 114, 118, 118, 120, 120, 121, 121, 115, 122, 122, - 119, 123, 123, 123, 123, 112, 112, 81, 81, 81, - 20, 20, 20, 125, 124, 124, 126, 126, 126, 126, - 59, 127, 127, 128, 60, 130, 130, 131, 131, 132, - 132, 85, 133, 133, 133, 133, 133, 133, 138, 138, - 139, 139, 140, 140, 140, 140, 140, 141, 142, 142, - 137, 137, 134, 134, 136, 136, 144, 144, 143, 143, - 143, 143, 143, 143, 143, 135, 145, 145, 147, 146, - 146, 61, 103, 148, 148, 55, 55, 42, 42, 42, + 49, 49, 49, 25, 25, 68, 68, 71, 71, 70, + 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, + 77, 78, 78, 79, 79, 26, 26, 27, 27, 27, + 27, 27, 87, 87, 89, 89, 82, 82, 90, 90, + 91, 91, 91, 83, 83, 86, 86, 84, 84, 92, + 93, 93, 56, 56, 64, 64, 67, 67, 67, 66, + 94, 94, 95, 57, 57, 57, 57, 96, 96, 97, + 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, + 54, 54, 50, 50, 104, 52, 52, 105, 51, 51, + 53, 53, 63, 63, 63, 63, 80, 80, 108, 108, + 110, 110, 111, 111, 111, 111, 109, 109, 109, 113, + 113, 113, 113, 88, 88, 116, 116, 116, 117, 117, + 114, 114, 118, 118, 120, 120, 121, 121, 115, 122, + 122, 119, 123, 123, 123, 123, 112, 112, 81, 81, + 81, 20, 20, 20, 125, 124, 124, 126, 126, 126, + 126, 59, 127, 127, 128, 60, 130, 130, 131, 131, + 132, 132, 85, 133, 133, 133, 133, 133, 133, 133, + 138, 138, 139, 139, 140, 140, 140, 140, 140, 141, + 142, 142, 137, 137, 134, 134, 136, 136, 144, 144, + 143, 143, 143, 143, 143, 143, 143, 135, 145, 145, + 147, 146, 146, 61, 103, 148, 148, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, @@ -915,20 +921,20 @@ class Php7 extends \PhpParser\ParserAbstract 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 155, 149, 149, 154, 154, 157, 158, 158, 159, 160, - 161, 161, 161, 161, 19, 19, 72, 72, 72, 72, - 150, 150, 150, 150, 163, 163, 151, 151, 153, 153, - 153, 156, 156, 168, 168, 168, 168, 168, 168, 168, - 168, 168, 169, 169, 107, 171, 171, 171, 171, 152, - 152, 152, 152, 152, 152, 152, 152, 58, 58, 166, - 166, 166, 166, 172, 172, 162, 162, 162, 173, 173, - 173, 173, 173, 173, 73, 73, 65, 65, 65, 65, - 129, 129, 129, 129, 176, 175, 165, 165, 165, 165, - 165, 165, 165, 164, 164, 164, 174, 174, 174, 174, - 106, 170, 178, 178, 177, 177, 179, 179, 179, 179, - 179, 179, 179, 179, 167, 167, 167, 167, 181, 182, - 180, 180, 180, 180, 180, 180, 180, 180, 183, 183, - 183, 183 + 42, 42, 155, 149, 149, 154, 154, 157, 158, 158, + 159, 160, 161, 161, 161, 161, 19, 19, 72, 72, + 72, 72, 150, 150, 150, 150, 163, 163, 151, 151, + 153, 153, 153, 156, 156, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 169, 169, 169, 107, 171, 171, + 171, 171, 152, 152, 152, 152, 152, 152, 152, 152, + 58, 58, 166, 166, 166, 166, 172, 172, 162, 162, + 162, 173, 173, 173, 173, 173, 173, 73, 73, 65, + 65, 65, 65, 129, 129, 129, 129, 176, 175, 165, + 165, 165, 165, 165, 165, 165, 164, 164, 164, 174, + 174, 174, 174, 106, 170, 178, 178, 177, 177, 179, + 179, 179, 179, 179, 179, 179, 179, 167, 167, 167, + 167, 181, 182, 180, 180, 180, 180, 180, 180, 180, + 180, 183, 183, 183, 183 ); protected $ruleToLength = array( @@ -947,53 +953,53 @@ class Php7 extends \PhpParser\ParserAbstract 3, 4, 2, 3, 1, 1, 7, 6, 2, 3, 1, 2, 3, 1, 2, 3, 1, 1, 3, 1, 3, 1, 2, 2, 3, 1, 3, 2, 3, 1, - 3, 2, 0, 1, 1, 1, 1, 1, 3, 7, - 10, 5, 7, 9, 5, 3, 3, 3, 3, 3, - 3, 1, 2, 5, 7, 9, 6, 5, 6, 3, - 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, - 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, - 3, 1, 1, 1, 8, 9, 7, 8, 7, 6, - 8, 0, 2, 0, 2, 1, 2, 1, 2, 1, - 1, 1, 0, 2, 0, 2, 0, 2, 2, 1, - 3, 1, 4, 1, 4, 1, 1, 4, 2, 1, - 3, 3, 3, 4, 4, 5, 0, 2, 4, 3, - 1, 1, 7, 0, 2, 1, 3, 3, 4, 1, - 4, 0, 2, 5, 0, 2, 6, 0, 2, 0, - 3, 1, 2, 1, 1, 2, 0, 1, 3, 0, - 2, 1, 1, 1, 1, 6, 8, 6, 1, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, - 3, 1, 3, 3, 3, 3, 3, 1, 3, 3, - 1, 1, 2, 1, 1, 0, 1, 0, 2, 2, - 2, 4, 3, 1, 1, 3, 1, 2, 2, 3, - 2, 3, 1, 1, 2, 3, 1, 1, 3, 2, - 0, 1, 5, 5, 10, 3, 5, 1, 1, 3, - 0, 2, 4, 5, 4, 4, 4, 3, 1, 1, - 1, 1, 1, 1, 0, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 3, 1, 1, - 3, 2, 2, 3, 1, 0, 1, 1, 3, 3, - 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, - 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 0, 1, 1, 1, 1, 1, 3, + 7, 10, 5, 7, 9, 5, 3, 3, 3, 3, + 3, 3, 1, 2, 5, 7, 9, 6, 5, 6, + 3, 2, 1, 1, 1, 0, 2, 1, 3, 8, + 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, + 1, 3, 1, 1, 1, 8, 9, 7, 8, 7, + 6, 8, 0, 2, 0, 2, 1, 2, 1, 2, + 1, 1, 1, 0, 2, 0, 2, 0, 2, 2, + 1, 3, 1, 4, 1, 4, 1, 1, 4, 2, + 1, 3, 3, 3, 4, 4, 5, 0, 2, 4, + 3, 1, 1, 7, 0, 2, 1, 3, 3, 4, + 1, 4, 0, 2, 5, 0, 2, 6, 0, 2, + 0, 3, 1, 2, 1, 1, 2, 0, 1, 3, + 0, 2, 1, 1, 1, 1, 6, 8, 6, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 1, 3, 3, 3, 3, 3, 1, 3, + 3, 1, 1, 2, 1, 1, 0, 1, 0, 2, + 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, + 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, + 2, 0, 1, 5, 5, 6, 10, 3, 5, 1, + 1, 3, 0, 2, 4, 5, 4, 4, 4, 3, + 1, 1, 1, 1, 1, 1, 0, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 3, + 1, 1, 3, 2, 2, 3, 1, 0, 1, 1, + 3, 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 5, 4, 3, 4, 4, - 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 1, 3, 2, 1, 2, 4, - 2, 2, 8, 9, 8, 9, 9, 10, 9, 10, - 8, 3, 2, 0, 4, 2, 1, 3, 2, 1, - 2, 2, 2, 4, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 1, 1, 1, 0, 3, 0, 1, - 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 3, 3, 4, 1, 1, 3, 1, - 1, 1, 1, 1, 3, 2, 3, 0, 1, 1, - 3, 1, 1, 1, 1, 1, 3, 1, 1, 4, - 4, 1, 4, 4, 0, 1, 1, 1, 3, 3, - 1, 4, 2, 2, 1, 3, 1, 4, 4, 3, - 3, 3, 3, 1, 3, 1, 1, 3, 1, 1, - 4, 1, 1, 1, 3, 1, 1, 2, 1, 3, - 4, 3, 2, 0, 2, 2, 1, 2, 1, 1, - 1, 4, 3, 3, 3, 3, 6, 3, 1, 1, - 2, 1 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 5, 4, 3, + 4, 4, 2, 2, 4, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, + 2, 4, 2, 2, 8, 9, 8, 9, 9, 10, + 9, 10, 8, 3, 2, 0, 4, 2, 1, 3, + 2, 1, 2, 2, 2, 4, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 1, 1, 1, 0, 3, + 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 5, 3, 3, 4, 1, + 1, 3, 1, 1, 1, 1, 1, 3, 2, 3, + 0, 1, 1, 3, 1, 1, 1, 1, 1, 3, + 1, 1, 4, 4, 1, 4, 4, 0, 1, 1, + 1, 3, 3, 1, 4, 2, 2, 1, 3, 1, + 4, 4, 3, 3, 3, 3, 1, 3, 1, 1, + 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, + 2, 1, 3, 4, 3, 2, 0, 2, 2, 1, + 2, 1, 1, 1, 4, 3, 3, 3, 3, 6, + 3, 1, 1, 2, 1 ); protected function initReduceCallbacks() { @@ -1456,20 +1462,20 @@ protected function initReduceCallbacks() { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 150 => function ($stackPos) { - $this->semValue = new Node\Const_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 151 => function ($stackPos) { - if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; + $this->semValue = new Node\Const_(new Node\Identifier($this->semStack[$stackPos-(3-1)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributeStack[$stackPos-(3-1)]), $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 152 => function ($stackPos) { - $this->semValue = array(); + if (is_array($this->semStack[$stackPos-(2-2)])) { $this->semValue = array_merge($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); } else { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }; }, 153 => function ($stackPos) { - $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; - if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array(); }, 154 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; + if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 155 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -1478,9 +1484,12 @@ protected function initReduceCallbacks() { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 157 => function ($stackPos) { - throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 158 => function ($stackPos) { + throw new Error('__HALT_COMPILER() can only be used from the outermost scope', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 159 => function ($stackPos) { if ($this->semStack[$stackPos-(3-2)]) { $this->semValue = $this->semStack[$stackPos-(3-2)]; $attrs = $this->startAttributeStack[$stackPos-(3-1)]; $stmts = $this->semValue; if (!empty($attrs['comments'])) {$stmts[0]->setAttribute('comments', array_merge($attrs['comments'], $stmts[0]->getAttribute('comments', []))); }; @@ -1490,46 +1499,46 @@ protected function initReduceCallbacks() { } }, - 159 => function ($stackPos) { + 160 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(7-3)], ['stmts' => is_array($this->semStack[$stackPos-(7-5)]) ? $this->semStack[$stackPos-(7-5)] : array($this->semStack[$stackPos-(7-5)]), 'elseifs' => $this->semStack[$stackPos-(7-6)], 'else' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, - 160 => function ($stackPos) { + 161 => function ($stackPos) { $this->semValue = new Stmt\If_($this->semStack[$stackPos-(10-3)], ['stmts' => $this->semStack[$stackPos-(10-6)], 'elseifs' => $this->semStack[$stackPos-(10-7)], 'else' => $this->semStack[$stackPos-(10-8)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, - 161 => function ($stackPos) { + 162 => function ($stackPos) { $this->semValue = new Stmt\While_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, - 162 => function ($stackPos) { + 163 => function ($stackPos) { $this->semValue = new Stmt\Do_($this->semStack[$stackPos-(7-5)], is_array($this->semStack[$stackPos-(7-2)]) ? $this->semStack[$stackPos-(7-2)] : array($this->semStack[$stackPos-(7-2)]), $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, - 163 => function ($stackPos) { + 164 => function ($stackPos) { $this->semValue = new Stmt\For_(['init' => $this->semStack[$stackPos-(9-3)], 'cond' => $this->semStack[$stackPos-(9-5)], 'loop' => $this->semStack[$stackPos-(9-7)], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 164 => function ($stackPos) { + 165 => function ($stackPos) { $this->semValue = new Stmt\Switch_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, - 165 => function ($stackPos) { + 166 => function ($stackPos) { $this->semValue = new Stmt\Break_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 166 => function ($stackPos) { + 167 => function ($stackPos) { $this->semValue = new Stmt\Continue_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 167 => function ($stackPos) { + 168 => function ($stackPos) { $this->semValue = new Stmt\Return_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 168 => function ($stackPos) { + 169 => function ($stackPos) { $this->semValue = new Stmt\Global_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 169 => function ($stackPos) { + 170 => function ($stackPos) { $this->semValue = new Stmt\Static_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 170 => function ($stackPos) { + 171 => function ($stackPos) { $this->semValue = new Stmt\Echo_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 171 => function ($stackPos) { + 172 => function ($stackPos) { $this->semValue = new Stmt\InlineHTML($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, - 172 => function ($stackPos) { + 173 => function ($stackPos) { $e = $this->semStack[$stackPos-(2-1)]; if ($e instanceof Expr\Throw_) { @@ -1541,1128 +1550,1126 @@ protected function initReduceCallbacks() { } }, - 173 => function ($stackPos) { + 174 => function ($stackPos) { $this->semValue = new Stmt\Unset_($this->semStack[$stackPos-(5-3)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, - 174 => function ($stackPos) { + 175 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-5)][0], ['keyVar' => null, 'byRef' => $this->semStack[$stackPos-(7-5)][1], 'stmts' => $this->semStack[$stackPos-(7-7)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, - 175 => function ($stackPos) { + 176 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(9-3)], $this->semStack[$stackPos-(9-7)][0], ['keyVar' => $this->semStack[$stackPos-(9-5)], 'byRef' => $this->semStack[$stackPos-(9-7)][1], 'stmts' => $this->semStack[$stackPos-(9-9)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 176 => function ($stackPos) { + 177 => function ($stackPos) { $this->semValue = new Stmt\Foreach_($this->semStack[$stackPos-(6-3)], new Expr\Error($this->startAttributeStack[$stackPos-(6-4)] + $this->endAttributeStack[$stackPos-(6-4)]), ['stmts' => $this->semStack[$stackPos-(6-6)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, - 177 => function ($stackPos) { + 178 => function ($stackPos) { $this->semValue = new Stmt\Declare_($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, - 178 => function ($stackPos) { + 179 => function ($stackPos) { $this->semValue = new Stmt\TryCatch($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->checkTryCatch($this->semValue); }, - 179 => function ($stackPos) { + 180 => function ($stackPos) { $this->semValue = new Stmt\Goto_($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 180 => function ($stackPos) { + 181 => function ($stackPos) { $this->semValue = new Stmt\Label($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 181 => function ($stackPos) { + 182 => function ($stackPos) { $this->semValue = array(); /* means: no statement */ }, - 182 => function ($stackPos) { + 183 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 183 => function ($stackPos) { + 184 => function ($stackPos) { $startAttributes = $this->startAttributeStack[$stackPos-(1-1)]; if (isset($startAttributes['comments'])) { $this->semValue = new Stmt\Nop($startAttributes + $this->endAttributes); } else { $this->semValue = null; }; if ($this->semValue === null) $this->semValue = array(); /* means: no statement */ }, - 184 => function ($stackPos) { + 185 => function ($stackPos) { $this->semValue = array(); }, - 185 => function ($stackPos) { + 186 => function ($stackPos) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, - 186 => function ($stackPos) { + 187 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 187 => function ($stackPos) { + 188 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 188 => function ($stackPos) { + 189 => function ($stackPos) { $this->semValue = new Stmt\Catch_($this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-7)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, - 189 => function ($stackPos) { + 190 => function ($stackPos) { $this->semValue = null; }, - 190 => function ($stackPos) { + 191 => function ($stackPos) { $this->semValue = new Stmt\Finally_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, - 191 => function ($stackPos) { + 192 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, - 192 => function ($stackPos) { + 193 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 193 => function ($stackPos) { + 194 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 194 => function ($stackPos) { + 195 => function ($stackPos) { $this->semValue = false; }, - 195 => function ($stackPos) { + 196 => function ($stackPos) { $this->semValue = true; }, - 196 => function ($stackPos) { + 197 => function ($stackPos) { $this->semValue = false; }, - 197 => function ($stackPos) { + 198 => function ($stackPos) { $this->semValue = true; }, - 198 => function ($stackPos) { + 199 => function ($stackPos) { $this->semValue = false; }, - 199 => function ($stackPos) { + 200 => function ($stackPos) { $this->semValue = true; }, - 200 => function ($stackPos) { + 201 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, - 201 => function ($stackPos) { + 202 => function ($stackPos) { $this->semValue = []; }, - 202 => function ($stackPos) { + 203 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 203 => function ($stackPos) { + 204 => function ($stackPos) { $this->semValue = new Node\Identifier($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, - 204 => function ($stackPos) { + 205 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(8-3)], ['byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-5)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, - 205 => function ($stackPos) { + 206 => function ($stackPos) { $this->semValue = new Stmt\Function_($this->semStack[$stackPos-(9-4)], ['byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-6)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 206 => function ($stackPos) { + 207 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(7-2)], ['type' => $this->semStack[$stackPos-(7-1)], 'extends' => $this->semStack[$stackPos-(7-3)], 'implements' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos-(7-2)); }, - 207 => function ($stackPos) { + 208 => function ($stackPos) { $this->semValue = new Stmt\Class_($this->semStack[$stackPos-(8-3)], ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); $this->checkClass($this->semValue, $stackPos-(8-3)); }, - 208 => function ($stackPos) { + 209 => function ($stackPos) { $this->semValue = new Stmt\Interface_($this->semStack[$stackPos-(7-3)], ['extends' => $this->semStack[$stackPos-(7-4)], 'stmts' => $this->semStack[$stackPos-(7-6)], 'attrGroups' => $this->semStack[$stackPos-(7-1)]], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); $this->checkInterface($this->semValue, $stackPos-(7-3)); }, - 209 => function ($stackPos) { + 210 => function ($stackPos) { $this->semValue = new Stmt\Trait_($this->semStack[$stackPos-(6-3)], ['stmts' => $this->semStack[$stackPos-(6-5)], 'attrGroups' => $this->semStack[$stackPos-(6-1)]], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, - 210 => function ($stackPos) { + 211 => function ($stackPos) { $this->semValue = new Stmt\Enum_($this->semStack[$stackPos-(8-3)], ['scalarType' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); $this->checkEnum($this->semValue, $stackPos-(8-3)); }, - 211 => function ($stackPos) { - $this->semValue = null; - }, 212 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = null; }, 213 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 214 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = null; }, 215 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 216 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = 0; }, 217 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 218 => function ($stackPos) { - $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 219 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 220 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 221 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 222 => function ($stackPos) { - $this->semValue = null; + $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 223 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = null; }, 224 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 225 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = array(); }, 226 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 227 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = array(); }, 228 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 229 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 230 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 231 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 232 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 233 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 234 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 235 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 236 => function ($stackPos) { - $this->semValue = null; + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 237 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = null; }, 238 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 239 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 240 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 241 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 242 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 244 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 245 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 246 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(5-3)]; }, 247 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array(); }, 248 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 249 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 250 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 251 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos]; }, 252 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos]; }, 253 => function ($stackPos) { - $this->semValue = []; + $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); }, 254 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = []; }, 255 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 256 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 257 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 258 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 259 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 260 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 261 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 262 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array(); }, 263 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 264 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 265 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array(); }, 266 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 267 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); }, 268 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = null; }, 269 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 270 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); + $this->semValue = null; }, 271 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->fixupAlternativeElse($this->semValue); }, 272 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 273 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + $this->semValue = array($this->semStack[$stackPos-(2-2)], true); }, 274 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 275 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); }, 276 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 277 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = array(); }, 278 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 279 => function ($stackPos) { - $this->semValue = 0; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 280 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + $this->semValue = 0; }, 281 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 282 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 283 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 284 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 285 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - $this->checkParam($this->semValue); + $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 286 => function ($stackPos) { - $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); + $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); $this->checkParam($this->semValue); }, 287 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); + $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); + $this->checkParam($this->semValue); }, 288 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); }, 289 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 290 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 291 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 292 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 293 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 294 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 295 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); }, 296 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 297 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 299 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 300 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 301 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 302 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 303 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 304 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 305 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 306 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 307 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 308 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 309 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 310 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 311 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 312 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 313 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 314 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 315 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 316 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = null; }, 317 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 318 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = null; }, 319 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 320 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = null; }, 321 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = array(); }, 322 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-2)]); + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 323 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(3-2)]); }, 324 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 325 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 326 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 327 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 328 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 329 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 330 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); }, 331 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 332 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 333 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 334 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 335 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 336 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 337 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 338 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 339 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 340 => function ($stackPos) { - $this->semValue = array(); + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } }, 341 => function ($stackPos) { + $this->semValue = array(); + }, + 342 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 342 => function ($stackPos) { + 343 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); $this->checkProperty($this->semValue, $stackPos-(5-2)); }, - 343 => function ($stackPos) { + 344 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); $this->checkClassConst($this->semValue, $stackPos-(5-2)); }, - 344 => function ($stackPos) { - $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); - $this->checkClassMethod($this->semValue, $stackPos-(10-2)); - }, 345 => function ($stackPos) { - $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(6-5)], $this->semStack[$stackPos-(6-2)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-1)], $this->semStack[$stackPos-(6-4)]); + $this->checkClassConst($this->semValue, $stackPos-(6-2)); }, 346 => function ($stackPos) { - $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->checkClassMethod($this->semValue, $stackPos-(10-2)); }, 347 => function ($stackPos) { - $this->semValue = null; /* will be skipped */ + $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 348 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 349 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = null; /* will be skipped */ }, 350 => function ($stackPos) { $this->semValue = array(); }, 351 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 352 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = array(); }, 353 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 354 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 355 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 356 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 357 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 358 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 359 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 360 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 361 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); }, 362 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = null; }, 363 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 364 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 365 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = 0; }, 366 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = 0; }, 367 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 368 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 369 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 370 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 371 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 372 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 373 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 374 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 375 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 376 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 377 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 378 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 379 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 380 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 381 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 382 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 383 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 384 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 385 => function ($stackPos) { - $this->semValue = array(); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 386 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 387 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array(); }, 388 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 389 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 390 => function ($stackPos) { $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 391 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 392 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 393 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 394 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 395 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 396 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 397 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 398 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 399 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 400 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 401 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 402 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 403 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 404 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 405 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 406 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 407 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 408 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 409 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 410 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 411 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 412 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 413 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 417 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 418 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 419 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 420 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 430 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 431 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 432 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 433 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 434 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 435 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 436 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 437 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 438 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 439 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 440 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 441 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 442 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 443 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 444 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 445 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 446 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 447 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 448 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 449 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 450 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 451 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 452 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 453 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 454 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 455 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 456 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 457 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 458 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); }, - 457 => function ($stackPos) { + 459 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 458 => function ($stackPos) { + 460 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 459 => function ($stackPos) { + 461 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 460 => function ($stackPos) { + 462 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 461 => function ($stackPos) { + 463 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 462 => function ($stackPos) { + 464 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); }, - 463 => function ($stackPos) { - $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 464 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, 465 => function ($stackPos) { - $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 466 => function ($stackPos) { - $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 467 => function ($stackPos) { - $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 468 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 469 => function ($stackPos) { - $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 470 => function ($stackPos) { - $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 471 => function ($stackPos) { - $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 472 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 473 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 474 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 475 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 476 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, 477 => function ($stackPos) { - $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 478 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 479 => function ($stackPos) { - $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 480 => function ($stackPos) { - $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); - $this->checkClass($this->semValue[0], -1); + $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, 481 => function ($stackPos) { - $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, 482 => function ($stackPos) { - list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = array(new Stmt\Class_(null, ['type' => $this->semStack[$stackPos-(8-2)], 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); + $this->checkClass($this->semValue[0], -1); }, 483 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 484 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; + list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 485 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array(); }, 486 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(4-3)]; }, 487 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 488 => function ($stackPos) { - $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 489 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 490 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 491 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 492 => function ($stackPos) { $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 493 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 494 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 495 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 496 => function ($stackPos) { $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 497 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 498 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 499 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 500 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 501 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 502 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 503 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 504 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 505 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; }, 506 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 507 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 508 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = null; }, 509 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 510 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array(); }, 511 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); }, 512 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 513 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array(); }, 514 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 515 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 516 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 517 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 518 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 519 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 520 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 521 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 522 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 523 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 524 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 525 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; - $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 526 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; }, 527 => function ($stackPos) { - $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); }, 528 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; - foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); + $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; + $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); }, 529 => function ($stackPos) { - $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 530 => function ($stackPos) { - $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; + foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); }, 532 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 533 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 534 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 535 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 536 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 537 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 538 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); }, 539 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 540 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = null; }, 541 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2671,7 +2678,7 @@ protected function initReduceCallbacks() { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 543 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 544 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2680,7 +2687,7 @@ protected function initReduceCallbacks() { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 546 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 547 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2689,85 +2696,85 @@ protected function initReduceCallbacks() { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 549 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 550 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 551 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 552 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 553 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 554 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 555 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 556 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 557 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = null; }, 558 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 559 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 560 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 561 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 562 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 563 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 564 => function ($stackPos) { - $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 565 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 566 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; }, 567 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; }, 568 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 569 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 570 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 571 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 572 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 573 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 574 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 575 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 576 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2779,102 +2786,111 @@ protected function initReduceCallbacks() { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 579 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 580 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 581 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 582 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; }, 583 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 584 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); }, 585 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos]; }, 586 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ }, 587 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 588 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 589 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 590 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 592 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 593 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 594 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 595 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true); }, 596 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = null; }, 597 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 598 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 599 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 600 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); }, 601 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 602 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 603 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 604 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 605 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 606 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 607 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 608 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 609 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 610 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 611 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 612 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 613 => function ($stackPos) { + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 614 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, ]; diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php b/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php index c256e8978..7c32e5a3c 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinter/Standard.php @@ -529,7 +529,7 @@ protected function pExpr_NullsafeMethodCall(Expr\NullsafeMethodCall $node) { } protected function pExpr_StaticCall(Expr\StaticCall $node) { - return $this->pDereferenceLhs($node->class) . '::' + return $this->pStaticDereferenceLhs($node->class) . '::' . ($node->name instanceof Expr ? ($node->name instanceof Expr\Variable ? $this->p($node->name) @@ -606,7 +606,7 @@ protected function pExpr_ConstFetch(Expr\ConstFetch $node) { } protected function pExpr_ClassConstFetch(Expr\ClassConstFetch $node) { - return $this->pDereferenceLhs($node->class) . '::' . $this->p($node->name); + return $this->pStaticDereferenceLhs($node->class) . '::' . $this->pObjectProperty($node->name); } protected function pExpr_PropertyFetch(Expr\PropertyFetch $node) { @@ -618,7 +618,7 @@ protected function pExpr_NullsafePropertyFetch(Expr\NullsafePropertyFetch $node) } protected function pExpr_StaticPropertyFetch(Expr\StaticPropertyFetch $node) { - return $this->pDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); + return $this->pStaticDereferenceLhs($node->class) . '::$' . $this->pObjectProperty($node->name); } protected function pExpr_ShellExec(Expr\ShellExec $node) { @@ -814,7 +814,9 @@ protected function pStmt_ClassMethod(Stmt\ClassMethod $node) { protected function pStmt_ClassConst(Stmt\ClassConst $node) { return $this->pAttrGroups($node->attrGroups) . $this->pModifiers($node->flags) - . 'const ' . $this->pCommaSeparated($node->consts) . ';'; + . 'const ' + . (null !== $node->type ? $this->p($node->type) . ' ' : '') + . $this->pCommaSeparated($node->consts) . ';'; } protected function pStmt_Function(Stmt\Function_ $node) { @@ -1067,6 +1069,14 @@ protected function pDereferenceLhs(Node $node) { } } + protected function pStaticDereferenceLhs(Node $node) { + if (!$this->staticDereferenceLhsRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } + } + protected function pCallLhs(Node $node) { if (!$this->callLhsRequiresParens($node)) { return $this->p($node); @@ -1075,9 +1085,12 @@ protected function pCallLhs(Node $node) { } } - protected function pNewVariable(Node $node) { - // TODO: This is not fully accurate. - return $this->pDereferenceLhs($node); + protected function pNewVariable(Node $node): string { + if (!$this->newOperandRequiresParens($node)) { + return $this->p($node); + } else { + return '(' . $this->p($node) . ')'; + } } /** diff --git a/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php b/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php index 6ed936fed..770d50092 100644 --- a/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php +++ b/app/vendor/nikic/php-parser/lib/PhpParser/PrettyPrinterAbstract.php @@ -21,6 +21,8 @@ abstract class PrettyPrinterAbstract const FIXUP_BRACED_NAME = 4; // Name operand that may require bracing const FIXUP_VAR_BRACED_NAME = 5; // Name operand that may require ${} bracing const FIXUP_ENCAPSED = 6; // Encapsed string part + const FIXUP_NEW = 7; // New/instanceof operand + const FIXUP_STATIC_DEREF_LHS = 8; // LHS of static dereferencing operation protected $precedenceMap = [ // [precedence, associativity] @@ -977,6 +979,19 @@ protected function pFixup(int $fixup, Node $subNode, $parentClass, int $subStart return '(' . $this->p($subNode) . ')'; } break; + case self::FIXUP_STATIC_DEREF_LHS: + if ($this->staticDereferenceLhsRequiresParens($subNode) + && !$this->origTokens->haveParens($subStartPos, $subEndPos) + ) { + return '(' . $this->p($subNode) . ')'; + } + break; + case self::FIXUP_NEW: + if ($this->newOperandRequiresParens($subNode) + && !$this->origTokens->haveParens($subStartPos, $subEndPos)) { + return '(' . $this->p($subNode) . ')'; + } + break; case self::FIXUP_BRACED_NAME: case self::FIXUP_VAR_BRACED_NAME: if ($subNode instanceof Expr @@ -1047,13 +1062,26 @@ protected function callLhsRequiresParens(Node $node) : bool { } /** - * Determines whether the LHS of a dereferencing operation must be wrapped in parenthesis. + * Determines whether the LHS of an array/object operation must be wrapped in parentheses. * * @param Node $node LHS of dereferencing operation * * @return bool Whether parentheses are required */ protected function dereferenceLhsRequiresParens(Node $node) : bool { + // A constant can occur on the LHS of an array/object deref, but not a static deref. + return $this->staticDereferenceLhsRequiresParens($node) + && !$node instanceof Expr\ConstFetch; + } + + /** + * Determines whether the LHS of a static operation must be wrapped in parentheses. + * + * @param Node $node LHS of dereferencing operation + * + * @return bool Whether parentheses are required + */ + protected function staticDereferenceLhsRequiresParens(Node $node): bool { return !($node instanceof Expr\Variable || $node instanceof Node\Name || $node instanceof Expr\ArrayDimFetch @@ -1066,10 +1094,31 @@ protected function dereferenceLhsRequiresParens(Node $node) : bool { || $node instanceof Expr\StaticCall || $node instanceof Expr\Array_ || $node instanceof Scalar\String_ - || $node instanceof Expr\ConstFetch || $node instanceof Expr\ClassConstFetch); } + /** + * Determines whether an expression used in "new" or "instanceof" requires parentheses. + * + * @param Node $node New or instanceof operand + * + * @return bool Whether parentheses are required + */ + protected function newOperandRequiresParens(Node $node): bool { + if ($node instanceof Node\Name || $node instanceof Expr\Variable) { + return false; + } + if ($node instanceof Expr\ArrayDimFetch || $node instanceof Expr\PropertyFetch || + $node instanceof Expr\NullsafePropertyFetch + ) { + return $this->newOperandRequiresParens($node->var); + } + if ($node instanceof Expr\StaticPropertyFetch) { + return $this->newOperandRequiresParens($node->class); + } + return true; + } + /** * Print modifiers, including trailing whitespace. * @@ -1171,7 +1220,7 @@ protected function initializeFixupMap() { Expr\PostDec::class => ['var' => self::FIXUP_PREC_LEFT], Expr\Instanceof_::class => [ 'expr' => self::FIXUP_PREC_LEFT, - 'class' => self::FIXUP_PREC_RIGHT, // TODO: FIXUP_NEW_VARIABLE + 'class' => self::FIXUP_NEW, ], Expr\Ternary::class => [ 'cond' => self::FIXUP_PREC_LEFT, @@ -1179,10 +1228,13 @@ protected function initializeFixupMap() { ], Expr\FuncCall::class => ['name' => self::FIXUP_CALL_LHS], - Expr\StaticCall::class => ['class' => self::FIXUP_DEREF_LHS], + Expr\StaticCall::class => ['class' => self::FIXUP_STATIC_DEREF_LHS], Expr\ArrayDimFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\ClassConstFetch::class => ['var' => self::FIXUP_DEREF_LHS], - Expr\New_::class => ['class' => self::FIXUP_DEREF_LHS], // TODO: FIXUP_NEW_VARIABLE + Expr\ClassConstFetch::class => [ + 'class' => self::FIXUP_STATIC_DEREF_LHS, + 'name' => self::FIXUP_BRACED_NAME, + ], + Expr\New_::class => ['class' => self::FIXUP_NEW], Expr\MethodCall::class => [ 'var' => self::FIXUP_DEREF_LHS, 'name' => self::FIXUP_BRACED_NAME, @@ -1192,7 +1244,7 @@ protected function initializeFixupMap() { 'name' => self::FIXUP_BRACED_NAME, ], Expr\StaticPropertyFetch::class => [ - 'class' => self::FIXUP_DEREF_LHS, + 'class' => self::FIXUP_STATIC_DEREF_LHS, 'name' => self::FIXUP_VAR_BRACED_NAME, ], Expr\PropertyFetch::class => [ @@ -1278,6 +1330,7 @@ protected function initializeRemovalMap() { 'Param->default' => $stripEquals, 'Stmt_Break->num' => $stripBoth, 'Stmt_Catch->var' => $stripLeft, + 'Stmt_ClassConst->type' => $stripRight, 'Stmt_ClassMethod->returnType' => $stripColon, 'Stmt_Class->extends' => ['left' => \T_EXTENDS], 'Stmt_Enum->scalarType' => $stripColon, @@ -1319,6 +1372,7 @@ protected function initializeInsertionMap() { 'Stmt_Break->num' => [\T_BREAK, false, ' ', null], 'Stmt_Catch->var' => [null, false, ' ', null], 'Stmt_ClassMethod->returnType' => [')', false, ' : ', null], + 'Stmt_ClassConst->type' => [\T_CONST, false, ' ', null], 'Stmt_Class->extends' => [null, false, ' extends ', null], 'Stmt_Enum->scalarType' => [null, false, ' : ', null], 'Stmt_EnumCase->expr' => [null, false, ' = ', null], @@ -1508,6 +1562,7 @@ protected function initializeModifierChangeMap() { 'Stmt_ClassMethod->flags' => \T_FUNCTION, 'Stmt_Class->flags' => \T_CLASS, 'Stmt_Property->flags' => \T_VARIABLE, + 'Expr_PrintableNewAnonClass->flags' => \T_CLASS, 'Param->flags' => \T_VARIABLE, //'Stmt_TraitUseAdaptation_Alias->newModifier' => 0, // TODO ]; diff --git a/app/vendor/phpstan/phpdoc-parser/README.md b/app/vendor/phpstan/phpdoc-parser/README.md index 080e25ee8..3b321b228 100644 --- a/app/vendor/phpstan/phpdoc-parser/README.md +++ b/app/vendor/phpstan/phpdoc-parser/README.md @@ -1,4 +1,4 @@ -

PHPDoc-Parser for PHPStan

+

PHPDoc Parser for PHPStan

Build Status @@ -7,11 +7,102 @@ PHPStan Enabled

-* [PHPStan](https://phpstan.org) +This library `phpstan/phpdoc-parser` represents PHPDocs with an AST (Abstract Syntax Tree). It supports parsing and modifying PHPDocs. ------- +For the complete list of supported PHPDoc features check out PHPStan documentation. PHPStan is the main (but not the only) user of this library. -Next generation phpDoc parser with support for intersection types and generics. +* [PHPDoc Basics](https://phpstan.org/writing-php-code/phpdocs-basics) (list of PHPDoc tags) +* [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types) (list of PHPDoc types) +* [phpdoc-parser API Reference](https://phpstan.github.io/phpdoc-parser/namespace-PHPStan.PhpDocParser.html) with all the AST node types etc. + +This parser also supports parsing [Doctrine Annotations](https://github.com/doctrine/annotations). The AST nodes live in the [PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine namespace](https://phpstan.github.io/phpdoc-parser/namespace-PHPStan.PhpDocParser.Ast.PhpDoc.Doctrine.html). The support needs to be turned on by setting `bool $parseDoctrineAnnotations` to `true` in `Lexer` and `PhpDocParser` class constructors. + +## Installation + +``` +composer require phpstan/phpdoc-parser +``` + +## Basic usage + +```php +tokenize('/** @param Lorem $a */')); +$phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode +$paramTags = $phpDocNode->getParamTagValues(); // ParamTagValueNode[] +echo $paramTags[0]->parameterName; // '$a' +echo $paramTags[0]->type; // IdentifierTypeNode - 'Lorem' +``` + +### Format-preserving printer + +This component can be used to modify the AST +and print it again as close as possible to the original. + +It's heavily inspired by format-preserving printer component in [nikic/PHP-Parser](https://github.com/nikic/PHP-Parser). + +```php + true, 'indexes' => true]; + +$lexer = new Lexer(); +$constExprParser = new ConstExprParser(true, true, $usedAttributes); +$typeParser = new TypeParser($constExprParser, true, $usedAttributes); +$phpDocParser = new PhpDocParser($typeParser, $constExprParser, true, true, $usedAttributes); + +$tokens = new TokenIterator($lexer->tokenize('/** @param Lorem $a */')); +$phpDocNode = $phpDocParser->parse($tokens); // PhpDocNode + +$cloningTraverser = new NodeTraverser([new CloningVisitor()]); + +/** @var PhpDocNode $newPhpDocNode */ +[$newPhpDocNode] = $cloningTraverser->traverse([$phpDocNode]); + +// change something in $newPhpDocNode +$newPhpDocNode->getParamTagValues()[0]->type = new IdentifierTypeNode('Ipsum'); + +// print changed PHPDoc +$printer = new Printer(); +$newPhpDoc = $printer->printFormatPreserving($newPhpDocNode, $phpDocNode, $tokens); +echo $newPhpDoc; // '/** @param Ipsum $a */' +``` ## Code of Conduct diff --git a/app/vendor/phpstan/phpdoc-parser/composer.json b/app/vendor/phpstan/phpdoc-parser/composer.json index 3b902ae27..f1c648e51 100644 --- a/app/vendor/phpstan/phpdoc-parser/composer.json +++ b/app/vendor/phpstan/phpdoc-parser/composer.json @@ -6,6 +6,8 @@ "php": "^7.2 || ^8.0" }, "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.5", diff --git a/app/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon b/app/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon new file mode 100644 index 000000000..4596cc77b --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon @@ -0,0 +1,26 @@ +parameters: + ignoreErrors: + - + message: "#^Method PHPStan\\\\PhpDocParser\\\\Ast\\\\ConstExpr\\\\QuoteAwareConstExprStringNode\\:\\:escapeDoubleQuotedString\\(\\) should return string but returns string\\|null\\.$#" + count: 1 + path: src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php + + - + message: "#^Cannot use array destructuring on array\\\\|int\\|string\\>\\|null\\.$#" + count: 1 + path: src/Ast/NodeTraverser.php + + - + message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" + count: 1 + path: src/Ast/NodeTraverser.php + + - + message: "#^Method PHPStan\\\\PhpDocParser\\\\Parser\\\\StringUnescaper\\:\\:parseEscapeSequences\\(\\) should return string but returns string\\|null\\.$#" + count: 1 + path: src/Parser/StringUnescaper.php + + - + message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" + count: 2 + path: src/Printer/Printer.php diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php new file mode 100644 index 000000000..2b9c10ec2 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/AbstractNodeVisitor.php @@ -0,0 +1,34 @@ +value = $value; + } + + public function __toString(): string + { + return self::escape($this->value); + } + + public static function unescape(string $value): string + { + // from https://github.com/doctrine/annotations/blob/a9ec7af212302a75d1f92fa65d3abfbd16245a2a/lib/Doctrine/Common/Annotations/DocLexer.php#L103-L107 + return str_replace('""', '"', substr($value, 1, strlen($value) - 2)); + } + + private static function escape(string $value): string + { + // from https://github.com/phpstan/phpdoc-parser/issues/205#issuecomment-1662323656 + return sprintf('"%s"', str_replace('"', '""', $value)); + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php new file mode 100644 index 000000000..f2792b1bf --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/ConstExpr/QuoteAwareConstExprStringNode.php @@ -0,0 +1,78 @@ +quoteType = $quoteType; + } + + + public function __toString(): string + { + if ($this->quoteType === self::SINGLE_QUOTED) { + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1007 + return sprintf("'%s'", addcslashes($this->value, '\'\\')); + } + + // from https://github.com/nikic/PHP-Parser/blob/0ffddce52d816f72d0efc4d9b02e276d3309ef01/lib/PhpParser/PrettyPrinter/Standard.php#L1010-L1040 + return sprintf('"%s"', $this->escapeDoubleQuotedString()); + } + + private function escapeDoubleQuotedString(): string + { + $quote = '"'; + $escaped = addcslashes($this->value, "\n\r\t\f\v$" . $quote . '\\'); + + // Escape control characters and non-UTF-8 characters. + // Regex based on https://stackoverflow.com/a/11709412/385378. + $regex = '/( + [\x00-\x08\x0E-\x1F] # Control characters + | [\xC0-\xC1] # Invalid UTF-8 Bytes + | [\xF5-\xFF] # Invalid UTF-8 Bytes + | \xE0(?=[\x80-\x9F]) # Overlong encoding of prior code point + | \xF0(?=[\x80-\x8F]) # Overlong encoding of prior code point + | [\xC2-\xDF](?![\x80-\xBF]) # Invalid UTF-8 Sequence Start + | [\xE0-\xEF](?![\x80-\xBF]{2}) # Invalid UTF-8 Sequence Start + | [\xF0-\xF4](?![\x80-\xBF]{3}) # Invalid UTF-8 Sequence Start + | (?<=[\x00-\x7F\xF5-\xFF])[\x80-\xBF] # Invalid UTF-8 Sequence Middle + | (? Visitors */ + private $visitors = []; + + /** @var bool Whether traversal should be stopped */ + private $stopTraversal; + + /** + * @param list $visitors + */ + public function __construct(array $visitors) + { + $this->visitors = $visitors; + } + + /** + * Traverses an array of nodes using the registered visitors. + * + * @param Node[] $nodes Array of nodes + * + * @return Node[] Traversed array of nodes + */ + public function traverse(array $nodes): array + { + $this->stopTraversal = false; + + foreach ($this->visitors as $visitor) { + $return = $visitor->beforeTraverse($nodes); + if ($return === null) { + continue; + } + + $nodes = $return; + } + + $nodes = $this->traverseArray($nodes); + + foreach ($this->visitors as $visitor) { + $return = $visitor->afterTraverse($nodes); + if ($return === null) { + continue; + } + + $nodes = $return; + } + + return $nodes; + } + + /** + * Recursively traverse a node. + * + * @param Node $node Node to traverse. + * + * @return Node Result of traversal (may be original node or new one) + */ + private function traverseNode(Node $node): Node + { + $subNodeNames = array_keys(get_object_vars($node)); + foreach ($subNodeNames as $name) { + $subNode =& $node->$name; + + if (is_array($subNode)) { + $subNode = $this->traverseArray($subNode); + if ($this->stopTraversal) { + break; + } + } elseif ($subNode instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($subNode); + if ($return === null) { + continue; + } + + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { + $traverseChildren = false; + } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($traverseChildren) { + $subNode = $this->traverseNode($subNode); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($subNode); + + if ($return !== null) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($subNode, $return); + $subNode = $return; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } elseif (is_array($return)) { + throw new LogicException( + 'leaveNode() may only return an array ' . + 'if the parent structure is an array' + ); + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } + } + + return $node; + } + + /** + * Recursively traverse array (usually of nodes). + * + * @param mixed[] $nodes Array to traverse + * + * @return mixed[] Result of traversal (may be original array or changed one) + */ + private function traverseArray(array $nodes): array + { + $doNodes = []; + + foreach ($nodes as $i => &$node) { + if ($node instanceof Node) { + $traverseChildren = true; + $breakVisitorIndex = null; + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->enterNode($node); + if ($return === null) { + continue; + } + + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (is_array($return)) { + $doNodes[] = [$i, $return]; + continue 2; + } elseif ($return === self::REMOVE_NODE) { + $doNodes[] = [$i, []]; + continue 2; + } elseif ($return === self::DONT_TRAVERSE_CHILDREN) { + $traverseChildren = false; + } elseif ($return === self::DONT_TRAVERSE_CURRENT_AND_CHILDREN) { + $traverseChildren = false; + $breakVisitorIndex = $visitorIndex; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'enterNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($traverseChildren) { + $node = $this->traverseNode($node); + if ($this->stopTraversal) { + break; + } + } + + foreach ($this->visitors as $visitorIndex => $visitor) { + $return = $visitor->leaveNode($node); + + if ($return !== null) { + if ($return instanceof Node) { + $this->ensureReplacementReasonable($node, $return); + $node = $return; + } elseif (is_array($return)) { + $doNodes[] = [$i, $return]; + break; + } elseif ($return === self::REMOVE_NODE) { + $doNodes[] = [$i, []]; + break; + } elseif ($return === self::STOP_TRAVERSAL) { + $this->stopTraversal = true; + break 2; + } else { + throw new LogicException( + 'leaveNode() returned invalid value of type ' . gettype($return) + ); + } + } + + if ($breakVisitorIndex === $visitorIndex) { + break; + } + } + } elseif (is_array($node)) { + throw new LogicException('Invalid node structure: Contains nested arrays'); + } + } + + if (count($doNodes) > 0) { + while ([$i, $replace] = array_pop($doNodes)) { + array_splice($nodes, $i, 1, $replace); + } + } + + return $nodes; + } + + private function ensureReplacementReasonable(Node $old, Node $new): void + { + if ($old instanceof TypeNode && !$new instanceof TypeNode) { + throw new LogicException(sprintf('Trying to replace TypeNode with %s', get_class($new))); + } + + if ($old instanceof ConstExprNode && !$new instanceof ConstExprNode) { + throw new LogicException(sprintf('Trying to replace ConstExprNode with %s', get_class($new))); + } + + if ($old instanceof PhpDocChildNode && !$new instanceof PhpDocChildNode) { + throw new LogicException(sprintf('Trying to replace PhpDocChildNode with %s', get_class($new))); + } + + if ($old instanceof PhpDocTagValueNode && !$new instanceof PhpDocTagValueNode) { + throw new LogicException(sprintf('Trying to replace PhpDocTagValueNode with %s', get_class($new))); + } + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php new file mode 100644 index 000000000..bf7d784e4 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor.php @@ -0,0 +1,87 @@ + $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::DONT_TRAVERSE_CHILDREN + * => Children of $node are not traversed. $node stays as-is + * * NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN + * => Further visitors for the current node are skipped, and its children are not + * traversed. $node stays as-is. + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return Node|Node[]|NodeTraverser::*|null Replacement node (or special return value) + */ + public function enterNode(Node $node); + + /** + * Called when leaving a node. + * + * Return value semantics: + * * null + * => $node stays as-is + * * NodeTraverser::REMOVE_NODE + * => $node is removed from the parent array + * * NodeTraverser::STOP_TRAVERSAL + * => Traversal is aborted. $node stays as-is + * * array (of Nodes) + * => The return value is merged into the parent array (at the position of the $node) + * * otherwise + * => $node is set to the return value + * + * @param Node $node Node + * + * @return Node|Node[]|NodeTraverser::REMOVE_NODE|NodeTraverser::STOP_TRAVERSAL|null Replacement node (or special return value) + */ + public function leaveNode(Node $node); + + /** + * Called once after traversal. + * + * Return value semantics: + * * null: $nodes stays as-is + * * otherwise: $nodes is set to the return value + * + * @param Node[] $nodes Array of nodes + * + * @return Node[]|null Array of nodes + */ + public function afterTraverse(array $nodes): ?array; + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php new file mode 100644 index 000000000..7200f3af4 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/NodeVisitor/CloningVisitor.php @@ -0,0 +1,20 @@ +setAttribute(Attribute::ORIGINAL_NODE, $originalNode); + + return $node; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php new file mode 100644 index 000000000..3a93f5aab --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineAnnotation.php @@ -0,0 +1,35 @@ + */ + public $arguments; + + /** + * @param list $arguments + */ + public function __construct(string $name, array $arguments) + { + $this->name = $name; + $this->arguments = $arguments; + } + + public function __toString(): string + { + $arguments = implode(', ', $this->arguments); + return $this->name . '(' . $arguments . ')'; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php new file mode 100644 index 000000000..f30812cff --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArgument.php @@ -0,0 +1,43 @@ +key = $key; + $this->value = $value; + } + + + public function __toString(): string + { + if ($this->key === null) { + return (string) $this->value; + } + + return $this->key . '=' . $this->value; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php new file mode 100644 index 000000000..e740567d2 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArray.php @@ -0,0 +1,32 @@ + */ + public $items; + + /** + * @param list $items + */ + public function __construct(array $items) + { + $this->items = $items; + } + + public function __toString(): string + { + $items = implode(', ', $this->items); + + return '{' . $items . '}'; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php new file mode 100644 index 000000000..d2dbf2b67 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineArrayItem.php @@ -0,0 +1,47 @@ +key = $key; + $this->value = $value; + } + + + public function __toString(): string + { + if ($this->key === null) { + return (string) $this->value; + } + + return $this->key . '=' . $this->value; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php new file mode 100644 index 000000000..84f7b18b4 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/Doctrine/DoctrineTagValueNode.php @@ -0,0 +1,36 @@ +annotation = $annotation; + $this->description = $description; + } + + + public function __toString(): string + { + return trim("{$this->annotation} {$this->description}"); + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php index 17bf04f27..ca7b4f20a 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/InvalidTagValueNode.php @@ -31,10 +31,11 @@ public function __construct(string $value, ParserException $exception) $exception->getCurrentOffset(), $exception->getExpectedTokenType(), $exception->getExpectedTokenValue(), + $exception->getCurrentTokenLine(), ]; } - public function __get(string $name) + public function __get(string $name): ?ParserException { if ($name !== 'exception') { trigger_error(sprintf('Undefined property: %s::$%s', self::class, $name), E_USER_WARNING); diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php index 075cec04e..211510bee 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/MethodTagValueNode.php @@ -30,6 +30,10 @@ class MethodTagValueNode implements PhpDocTagValueNode /** @var string (may be empty) */ public $description; + /** + * @param MethodTagValueParameterNode[] $parameters + * @param TemplateTagValueNode[] $templateTypes + */ public function __construct(bool $isStatic, ?TypeNode $returnType, string $methodName, array $parameters, string $description, array $templateTypes = []) { $this->isStatic = $isStatic; diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php index 856cc3f1d..d20746fcf 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/PhpDoc/PhpDocTagNode.php @@ -3,6 +3,7 @@ namespace PHPStan\PhpDocParser\Ast\PhpDoc; use PHPStan\PhpDocParser\Ast\NodeAttributes; +use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineTagValueNode; use function trim; class PhpDocTagNode implements PhpDocChildNode @@ -25,6 +26,10 @@ public function __construct(string $name, PhpDocTagValueNode $value) public function __toString(): string { + if ($this->value instanceof DoctrineTagValueNode) { + return (string) $this->value; + } + return trim("{$this->name} {$this->value}"); } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php index 41941f80e..806783f98 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayShapeNode.php @@ -23,6 +23,7 @@ class ArrayShapeNode implements TypeNode public $kind; /** + * @param ArrayShapeItemNode[] $items * @param self::KIND_* $kind */ public function __construct(array $items, bool $sealed = true, string $kind = self::KIND_ARRAY) diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php index 90cb9f085..d2031032f 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ArrayTypeNode.php @@ -20,6 +20,14 @@ public function __construct(TypeNode $type) public function __toString(): string { + if ( + $this->type instanceof CallableTypeNode + || $this->type instanceof ConstTypeNode + || $this->type instanceof NullableTypeNode + ) { + return '(' . $this->type . ')[]'; + } + return $this->type . '[]'; } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php index 83ade94c2..e57e5f823 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeNode.php @@ -19,6 +19,9 @@ class CallableTypeNode implements TypeNode /** @var TypeNode */ public $returnType; + /** + * @param CallableTypeParameterNode[] $parameters + */ public function __construct(IdentifierTypeNode $identifier, array $parameters, TypeNode $returnType) { $this->identifier = $identifier; @@ -29,8 +32,12 @@ public function __construct(IdentifierTypeNode $identifier, array $parameters, T public function __toString(): string { + $returnType = $this->returnType; + if ($returnType instanceof self) { + $returnType = "({$returnType})"; + } $parameters = implode(', ', $this->parameters); - return "{$this->identifier}({$parameters}): {$this->returnType}"; + return "{$this->identifier}({$parameters}): {$returnType}"; } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php index 7ab2d7e33..c78d4c7b9 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/CallableTypeParameterNode.php @@ -41,8 +41,8 @@ public function __toString(): string $type = "{$this->type} "; $isReference = $this->isReference ? '&' : ''; $isVariadic = $this->isVariadic ? '...' : ''; - $default = $this->isOptional ? ' = default' : ''; - return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $default; + $isOptional = $this->isOptional ? '=' : ''; + return trim("{$type}{$isReference}{$isVariadic}{$this->parameterName}") . $isOptional; } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php index 179de55aa..44e1d16df 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/GenericTypeNode.php @@ -25,6 +25,10 @@ class GenericTypeNode implements TypeNode /** @var (self::VARIANCE_*)[] */ public $variances; + /** + * @param TypeNode[] $genericTypes + * @param (self::VARIANCE_*)[] $variances + */ public function __construct(IdentifierTypeNode $type, array $genericTypes, array $variances = []) { $this->type = $type; diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php index 7f9aff33c..fd761cf78 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/IntersectionTypeNode.php @@ -3,6 +3,7 @@ namespace PHPStan\PhpDocParser\Ast\Type; use PHPStan\PhpDocParser\Ast\NodeAttributes; +use function array_map; use function implode; class IntersectionTypeNode implements TypeNode @@ -13,6 +14,9 @@ class IntersectionTypeNode implements TypeNode /** @var TypeNode[] */ public $types; + /** + * @param TypeNode[] $types + */ public function __construct(array $types) { $this->types = $types; @@ -21,7 +25,13 @@ public function __construct(array $types) public function __toString(): string { - return '(' . implode(' & ', $this->types) . ')'; + return '(' . implode(' & ', array_map(static function (TypeNode $type): string { + if ($type instanceof NullableTypeNode) { + return '(' . $type . ')'; + } + + return (string) $type; + }, $this->types)) . ')'; } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php new file mode 100644 index 000000000..1ec47cf6c --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/InvalidTypeNode.php @@ -0,0 +1,38 @@ +exceptionArgs = [ + $exception->getCurrentTokenValue(), + $exception->getCurrentTokenType(), + $exception->getCurrentOffset(), + $exception->getExpectedTokenType(), + $exception->getExpectedTokenValue(), + $exception->getCurrentTokenLine(), + ]; + } + + public function getException(): ParserException + { + return new ParserException(...$this->exceptionArgs); + } + + public function __toString(): string + { + return '*Invalid type*'; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php new file mode 100644 index 000000000..2f0124066 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeItemNode.php @@ -0,0 +1,48 @@ +keyName = $keyName; + $this->optional = $optional; + $this->valueType = $valueType; + } + + + public function __toString(): string + { + if ($this->keyName !== null) { + return sprintf( + '%s%s: %s', + (string) $this->keyName, + $this->optional ? '?' : '', + (string) $this->valueType + ); + } + + return (string) $this->valueType; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php new file mode 100644 index 000000000..f418bc30b --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/ObjectShapeNode.php @@ -0,0 +1,31 @@ +items = $items; + } + + public function __toString(): string + { + $items = $this->items; + + return 'object{' . implode(', ', $items) . '}'; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php index 1d5b04efe..39e83dfec 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/OffsetAccessTypeNode.php @@ -23,6 +23,14 @@ public function __construct(TypeNode $type, TypeNode $offset) public function __toString(): string { + if ( + $this->type instanceof CallableTypeNode + || $this->type instanceof ConstTypeNode + || $this->type instanceof NullableTypeNode + ) { + return '(' . $this->type . ')[' . $this->offset . ']'; + } + return $this->type . '[' . $this->offset . ']'; } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php index 08acf56c6..c552dab5f 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Ast/Type/UnionTypeNode.php @@ -3,6 +3,7 @@ namespace PHPStan\PhpDocParser\Ast\Type; use PHPStan\PhpDocParser\Ast\NodeAttributes; +use function array_map; use function implode; class UnionTypeNode implements TypeNode @@ -13,6 +14,9 @@ class UnionTypeNode implements TypeNode /** @var TypeNode[] */ public $types; + /** + * @param TypeNode[] $types + */ public function __construct(array $types) { $this->types = $types; @@ -21,7 +25,13 @@ public function __construct(array $types) public function __toString(): string { - return '(' . implode(' | ', $this->types) . ')'; + return '(' . implode(' | ', array_map(static function (TypeNode $type): string { + if ($type instanceof NullableTypeNode) { + return '(' . $type . ')'; + } + + return (string) $type; + }, $this->types)) . ')'; } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php b/app/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php index 1b98839db..32539faf6 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Lexer/Lexer.php @@ -30,23 +30,25 @@ class Lexer public const TOKEN_OPEN_PHPDOC = 15; public const TOKEN_CLOSE_PHPDOC = 16; public const TOKEN_PHPDOC_TAG = 17; - public const TOKEN_FLOAT = 18; - public const TOKEN_INTEGER = 19; - public const TOKEN_SINGLE_QUOTED_STRING = 20; - public const TOKEN_DOUBLE_QUOTED_STRING = 21; - public const TOKEN_IDENTIFIER = 22; - public const TOKEN_THIS_VARIABLE = 23; - public const TOKEN_VARIABLE = 24; - public const TOKEN_HORIZONTAL_WS = 25; - public const TOKEN_PHPDOC_EOL = 26; - public const TOKEN_OTHER = 27; - public const TOKEN_END = 28; - public const TOKEN_COLON = 29; - public const TOKEN_WILDCARD = 30; - public const TOKEN_OPEN_CURLY_BRACKET = 31; - public const TOKEN_CLOSE_CURLY_BRACKET = 32; - public const TOKEN_NEGATED = 33; - public const TOKEN_ARROW = 34; + public const TOKEN_DOCTRINE_TAG = 18; + public const TOKEN_FLOAT = 19; + public const TOKEN_INTEGER = 20; + public const TOKEN_SINGLE_QUOTED_STRING = 21; + public const TOKEN_DOUBLE_QUOTED_STRING = 22; + public const TOKEN_DOCTRINE_ANNOTATION_STRING = 23; + public const TOKEN_IDENTIFIER = 24; + public const TOKEN_THIS_VARIABLE = 25; + public const TOKEN_VARIABLE = 26; + public const TOKEN_HORIZONTAL_WS = 27; + public const TOKEN_PHPDOC_EOL = 28; + public const TOKEN_OTHER = 29; + public const TOKEN_END = 30; + public const TOKEN_COLON = 31; + public const TOKEN_WILDCARD = 32; + public const TOKEN_OPEN_CURLY_BRACKET = 33; + public const TOKEN_CLOSE_CURLY_BRACKET = 34; + public const TOKEN_NEGATED = 35; + public const TOKEN_ARROW = 36; public const TOKEN_LABELS = [ self::TOKEN_REFERENCE => '\'&\'', @@ -72,11 +74,13 @@ class Lexer self::TOKEN_OPEN_PHPDOC => '\'/**\'', self::TOKEN_CLOSE_PHPDOC => '\'*/\'', self::TOKEN_PHPDOC_TAG => 'TOKEN_PHPDOC_TAG', + self::TOKEN_DOCTRINE_TAG => 'TOKEN_DOCTRINE_TAG', self::TOKEN_PHPDOC_EOL => 'TOKEN_PHPDOC_EOL', self::TOKEN_FLOAT => 'TOKEN_FLOAT', self::TOKEN_INTEGER => 'TOKEN_INTEGER', self::TOKEN_SINGLE_QUOTED_STRING => 'TOKEN_SINGLE_QUOTED_STRING', self::TOKEN_DOUBLE_QUOTED_STRING => 'TOKEN_DOUBLE_QUOTED_STRING', + self::TOKEN_DOCTRINE_ANNOTATION_STRING => 'TOKEN_DOCTRINE_ANNOTATION_STRING', self::TOKEN_IDENTIFIER => 'type', self::TOKEN_THIS_VARIABLE => '\'$this\'', self::TOKEN_VARIABLE => 'variable', @@ -88,10 +92,22 @@ class Lexer public const VALUE_OFFSET = 0; public const TYPE_OFFSET = 1; + public const LINE_OFFSET = 2; + + /** @var bool */ + private $parseDoctrineAnnotations; /** @var string|null */ private $regexp; + public function __construct(bool $parseDoctrineAnnotations = false) + { + $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; + } + + /** + * @return list + */ public function tokenize(string $s): array { if ($this->regexp === null) { @@ -101,11 +117,18 @@ public function tokenize(string $s): array preg_match_all($this->regexp, $s, $matches, PREG_SET_ORDER); $tokens = []; + $line = 1; foreach ($matches as $match) { - $tokens[] = [$match[0], (int) $match['MARK']]; + $type = (int) $match['MARK']; + $tokens[] = [$match[0], $type, $line]; + if ($type !== self::TOKEN_PHPDOC_EOL) { + continue; + } + + $line++; } - $tokens[] = ['', self::TOKEN_END]; + $tokens[] = ['', self::TOKEN_END, $line]; return $tokens; } @@ -149,17 +172,22 @@ private function generateRegexp(): string self::TOKEN_PHPDOC_TAG => '@(?:[a-z][a-z0-9-\\\\]+:)?[a-z][a-z0-9-\\\\]*+', self::TOKEN_PHPDOC_EOL => '\\r?+\\n[\\x09\\x20]*+(?:\\*(?!/)\\x20?+)?', - self::TOKEN_FLOAT => '(?:-?[0-9]++\\.[0-9]*+(?:e-?[0-9]++)?)|(?:-?[0-9]*+\\.[0-9]++(?:e-?[0-9]++)?)|(?:-?[0-9]++e-?[0-9]++)', - self::TOKEN_INTEGER => '-?(?:(?:0b[0-1]++)|(?:0o[0-7]++)|(?:0x[0-9a-f]++)|(?:[0-9]++))', + self::TOKEN_FLOAT => '[+\-]?(?:(?:[0-9]++(_[0-9]++)*\\.[0-9]*+(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]*+(_[0-9]++)*\\.[0-9]++(_[0-9]++)*(?:e[+\-]?[0-9]++(_[0-9]++)*)?)|(?:[0-9]++(_[0-9]++)*e[+\-]?[0-9]++(_[0-9]++)*))', + self::TOKEN_INTEGER => '[+\-]?(?:(?:0b[0-1]++(_[0-1]++)*)|(?:0o[0-7]++(_[0-7]++)*)|(?:0x[0-9a-f]++(_[0-9a-f]++)*)|(?:[0-9]++(_[0-9]++)*))', self::TOKEN_SINGLE_QUOTED_STRING => '\'(?:\\\\[^\\r\\n]|[^\'\\r\\n\\\\])*+\'', self::TOKEN_DOUBLE_QUOTED_STRING => '"(?:\\\\[^\\r\\n]|[^"\\r\\n\\\\])*+"', self::TOKEN_WILDCARD => '\\*', - - // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL - self::TOKEN_OTHER => '(?:(?!\\*/)[^\\s])++', ]; + if ($this->parseDoctrineAnnotations) { + $patterns[self::TOKEN_DOCTRINE_TAG] = '@[a-z_\\\\][a-z0-9_\:\\\\]*[a-z_][a-z0-9_]*'; + $patterns[self::TOKEN_DOCTRINE_ANNOTATION_STRING] = '"(?:""|[^"])*+"'; + } + + // anything but TOKEN_CLOSE_PHPDOC or TOKEN_HORIZONTAL_WS or TOKEN_EOL + $patterns[self::TOKEN_OTHER] = '(?:(?!\\*/)[^\\s])++'; + foreach ($patterns as $type => &$pattern) { $pattern = '(?:' . $pattern . ')(*MARK:' . $type . ')'; } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php index d78763032..f6a7306e8 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/ConstExprParser.php @@ -4,10 +4,6 @@ use PHPStan\PhpDocParser\Ast; use PHPStan\PhpDocParser\Lexer\Lexer; -use function chr; -use function hexdec; -use function octdec; -use function preg_replace_callback; use function str_replace; use function strtolower; use function substr; @@ -15,49 +11,148 @@ class ConstExprParser { - private const REPLACEMENTS = [ - '\\' => '\\', - 'n' => "\n", - 'r' => "\r", - 't' => "\t", - 'f' => "\f", - 'v' => "\v", - 'e' => "\x1B", - ]; - /** @var bool */ private $unescapeStrings; - public function __construct(bool $unescapeStrings = false) + /** @var bool */ + private $quoteAwareConstExprString; + + /** @var bool */ + private $useLinesAttributes; + + /** @var bool */ + private $useIndexAttributes; + + /** @var bool */ + private $parseDoctrineStrings; + + /** + * @param array{lines?: bool, indexes?: bool} $usedAttributes + */ + public function __construct( + bool $unescapeStrings = false, + bool $quoteAwareConstExprString = false, + array $usedAttributes = [] + ) { $this->unescapeStrings = $unescapeStrings; + $this->quoteAwareConstExprString = $quoteAwareConstExprString; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; + $this->parseDoctrineStrings = false; + } + + /** + * @internal + */ + public function toDoctrine(): self + { + $self = new self( + $this->unescapeStrings, + $this->quoteAwareConstExprString, + [ + 'lines' => $this->useLinesAttributes, + 'indexes' => $this->useIndexAttributes, + ] + ); + $self->parseDoctrineStrings = true; + return $self; } public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\ConstExpr\ConstExprNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_FLOAT)) { $value = $tokens->currentTokenValue(); $tokens->next(); - return new Ast\ConstExpr\ConstExprFloatNode($value); + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprFloatNode(str_replace('_', '', $value)), + $startLine, + $startIndex + ); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { $value = $tokens->currentTokenValue(); $tokens->next(); - return new Ast\ConstExpr\ConstExprIntegerNode($value); + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $value)), + $startLine, + $startIndex + ); + } + + if ($this->parseDoctrineStrings && $tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($value)), + $startLine, + $startIndex + ); } if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING, Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + if ($this->parseDoctrineStrings) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_DOUBLE_QUOTED_STRING, + null, + $tokens->currentTokenLine() + ); + } + + $value = $tokens->currentTokenValue(); + $tokens->next(); + + return $this->enrichWithAttributes( + $tokens, + $this->parseDoctrineString($value, $tokens), + $startLine, + $startIndex + ); + } $value = $tokens->currentTokenValue(); + $type = $tokens->currentTokenType(); if ($trimStrings) { if ($this->unescapeStrings) { - $value = self::unescapeString($value); + $value = StringUnescaper::unescapeString($value); } else { $value = substr($value, 1, -1); } } $tokens->next(); - return new Ast\ConstExpr\ConstExprStringNode($value); + + if ($this->quoteAwareConstExprString) { + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\QuoteAwareConstExprStringNode( + $value, + $type === Lexer::TOKEN_SINGLE_QUOTED_STRING + ? Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED + : Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED + ), + $startLine, + $startIndex + ); + } + + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprStringNode($value), + $startLine, + $startIndex + ); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { $identifier = $tokens->currentTokenValue(); @@ -65,14 +160,29 @@ public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\Con switch (strtolower($identifier)) { case 'true': - return new Ast\ConstExpr\ConstExprTrueNode(); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprTrueNode(), + $startLine, + $startIndex + ); case 'false': - return new Ast\ConstExpr\ConstExprFalseNode(); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprFalseNode(), + $startLine, + $startIndex + ); case 'null': - return new Ast\ConstExpr\ConstExprNullNode(); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprNullNode(), + $startLine, + $startIndex + ); case 'array': $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); - return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES); + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_PARENTHESES, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_COLON)) { @@ -106,29 +216,43 @@ public function parse(TokenIterator $tokens, bool $trimStrings = false): Ast\Con break; } - return new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstFetchNode($identifier, $classConstantName), + $startLine, + $startIndex + ); } - return new Ast\ConstExpr\ConstFetchNode('', $identifier); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstFetchNode('', $identifier), + $startLine, + $startIndex + ); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET); + return $this->parseArray($tokens, Lexer::TOKEN_CLOSE_SQUARE_BRACKET, $startIndex); } throw new ParserException( $tokens->currentTokenValue(), $tokens->currentTokenType(), $tokens->currentTokenOffset(), - Lexer::TOKEN_IDENTIFIER + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() ); } - private function parseArray(TokenIterator $tokens, int $endToken): Ast\ConstExpr\ConstExprArrayNode + private function parseArray(TokenIterator $tokens, int $endToken, int $startIndex): Ast\ConstExpr\ConstExprArrayNode { $items = []; + $startLine = $tokens->currentTokenLine(); + if (!$tokens->tryConsumeTokenType($endToken)) { do { $items[] = $this->parseArrayItem($tokens); @@ -136,12 +260,37 @@ private function parseArray(TokenIterator $tokens, int $endToken): Ast\ConstExpr $tokens->consumeTokenType($endToken); } - return new Ast\ConstExpr\ConstExprArrayNode($items); + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprArrayNode($items), + $startLine, + $startIndex + ); + } + + + /** + * This method is supposed to be called with TokenIterator after reading TOKEN_DOUBLE_QUOTED_STRING and shifting + * to the next token. + */ + public function parseDoctrineString(string $text, TokenIterator $tokens): Ast\ConstExpr\DoctrineConstExprStringNode + { + // Because of how Lexer works, a valid Doctrine string + // can consist of a sequence of TOKEN_DOUBLE_QUOTED_STRING and TOKEN_DOCTRINE_ANNOTATION_STRING + while ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING, Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { + $text .= $tokens->currentTokenValue(); + $tokens->next(); + } + + return new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($text)); } private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprArrayItemNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $expr = $this->parse($tokens); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_DOUBLE_ARROW)) { @@ -153,78 +302,32 @@ private function parseArrayItem(TokenIterator $tokens): Ast\ConstExpr\ConstExprA $value = $expr; } - return new Ast\ConstExpr\ConstExprArrayItemNode($key, $value); - } - - private static function unescapeString(string $string): string - { - $quote = $string[0]; - - if ($quote === '\'') { - return str_replace( - ['\\\\', '\\\''], - ['\\', '\''], - substr($string, 1, -1) - ); - } - - return self::parseEscapeSequences(substr($string, 1, -1), '"'); - } - - /** - * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 - */ - private static function parseEscapeSequences(string $str, string $quote): string - { - $str = str_replace('\\' . $quote, $quote, $str); - - return preg_replace_callback( - '~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\{([0-9a-fA-F]+)\})~', - static function ($matches) { - $str = $matches[1]; - - if (isset(self::REPLACEMENTS[$str])) { - return self::REPLACEMENTS[$str]; - } - if ($str[0] === 'x' || $str[0] === 'X') { - return chr(hexdec(substr($str, 1))); - } - if ($str[0] === 'u') { - return self::codePointToUtf8(hexdec($matches[2])); - } - - return chr(octdec($str)); - }, - $str + return $this->enrichWithAttributes( + $tokens, + new Ast\ConstExpr\ConstExprArrayItemNode($key, $value), + $startLine, + $startIndex ); } /** - * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 + * @template T of Ast\ConstExpr\ConstExprNode + * @param T $node + * @return T */ - private static function codePointToUtf8(int $num): string + private function enrichWithAttributes(TokenIterator $tokens, Ast\ConstExpr\ConstExprNode $node, int $startLine, int $startIndex): Ast\ConstExpr\ConstExprNode { - if ($num <= 0x7F) { - return chr($num); - } - if ($num <= 0x7FF) { - return chr(($num >> 6) + 0xC0) - . chr(($num & 0x3F) + 0x80); + if ($this->useLinesAttributes) { + $node->setAttribute(Ast\Attribute::START_LINE, $startLine); + $node->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); } - if ($num <= 0xFFFF) { - return chr(($num >> 12) + 0xE0) - . chr((($num >> 6) & 0x3F) + 0x80) - . chr(($num & 0x3F) + 0x80); - } - if ($num <= 0x1FFFFF) { - return chr(($num >> 18) + 0xF0) - . chr((($num >> 12) & 0x3F) + 0x80) - . chr((($num >> 6) & 0x3F) + 0x80) - . chr(($num & 0x3F) + 0x80); + + if ($this->useIndexAttributes) { + $node->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $node->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); } - // Invalid UTF-8 codepoint escape sequence: Codepoint too large - return "\xef\xbf\xbd"; + return $node; } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php index badcdcbb9..6ab5cc076 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/ParserException.php @@ -7,6 +7,7 @@ use function assert; use function json_encode; use function sprintf; +use const JSON_INVALID_UTF8_SUBSTITUTE; use const JSON_UNESCAPED_SLASHES; use const JSON_UNESCAPED_UNICODE; @@ -28,12 +29,16 @@ class ParserException extends Exception /** @var string|null */ private $expectedTokenValue; + /** @var int|null */ + private $currentTokenLine; + public function __construct( string $currentTokenValue, int $currentTokenType, int $currentOffset, int $expectedTokenType, - ?string $expectedTokenValue = null + ?string $expectedTokenValue = null, + ?int $currentTokenLine = null ) { $this->currentTokenValue = $currentTokenValue; @@ -41,13 +46,15 @@ public function __construct( $this->currentOffset = $currentOffset; $this->expectedTokenType = $expectedTokenType; $this->expectedTokenValue = $expectedTokenValue; + $this->currentTokenLine = $currentTokenLine; parent::__construct(sprintf( - 'Unexpected token %s, expected %s%s at offset %d', + 'Unexpected token %s, expected %s%s at offset %d%s', $this->formatValue($currentTokenValue), Lexer::TOKEN_LABELS[$expectedTokenType], $expectedTokenValue !== null ? sprintf(' (%s)', $this->formatValue($expectedTokenValue)) : '', - $currentOffset + $currentOffset, + $currentTokenLine === null ? '' : sprintf(' on line %d', $currentTokenLine) )); } @@ -82,9 +89,15 @@ public function getExpectedTokenValue(): ?string } + public function getCurrentTokenLine(): ?int + { + return $this->currentTokenLine; + } + + private function formatValue(string $value): string { - $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + $json = json_encode($value, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE); assert($json !== false); return $json; diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php index d9942b3d1..15a2aa5c3 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/PhpDocParser.php @@ -2,15 +2,25 @@ namespace PHPStan\PhpDocParser\Parser; +use LogicException; use PHPStan\PhpDocParser\Ast; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; +use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Lexer\Lexer; use PHPStan\ShouldNotHappenException; use function array_key_exists; use function array_values; use function count; +use function rtrim; +use function str_replace; use function trim; +/** + * @phpstan-import-type ValueType from Doctrine\DoctrineArgument as DoctrineValueType + */ class PhpDocParser { @@ -25,14 +35,49 @@ class PhpDocParser /** @var ConstExprParser */ private $constantExprParser; + /** @var ConstExprParser */ + private $doctrineConstantExprParser; + /** @var bool */ private $requireWhitespaceBeforeDescription; - public function __construct(TypeParser $typeParser, ConstExprParser $constantExprParser, bool $requireWhitespaceBeforeDescription = false) + /** @var bool */ + private $preserveTypeAliasesWithInvalidTypes; + + /** @var bool */ + private $parseDoctrineAnnotations; + + /** @var bool */ + private $useLinesAttributes; + + /** @var bool */ + private $useIndexAttributes; + + /** @var bool */ + private $textBetweenTagsBelongsToDescription; + + /** + * @param array{lines?: bool, indexes?: bool} $usedAttributes + */ + public function __construct( + TypeParser $typeParser, + ConstExprParser $constantExprParser, + bool $requireWhitespaceBeforeDescription = false, + bool $preserveTypeAliasesWithInvalidTypes = false, + array $usedAttributes = [], + bool $parseDoctrineAnnotations = false, + bool $textBetweenTagsBelongsToDescription = false + ) { $this->typeParser = $typeParser; $this->constantExprParser = $constantExprParser; + $this->doctrineConstantExprParser = $constantExprParser->toDoctrine(); $this->requireWhitespaceBeforeDescription = $requireWhitespaceBeforeDescription; + $this->preserveTypeAliasesWithInvalidTypes = $preserveTypeAliasesWithInvalidTypes; + $this->parseDoctrineAnnotations = $parseDoctrineAnnotations; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; + $this->textBetweenTagsBelongsToDescription = $textBetweenTagsBelongsToDescription; } @@ -43,10 +88,44 @@ public function parse(TokenIterator $tokens): Ast\PhpDoc\PhpDocNode $children = []; - if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { - $children[] = $this->parseChild($tokens); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if ($this->parseDoctrineAnnotations) { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + $lastChild = $this->parseChild($tokens); + $children[] = $lastChild; + while (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if ( + $lastChild instanceof Ast\PhpDoc\PhpDocTagNode + && ( + $lastChild->value instanceof Doctrine\DoctrineTagValueNode + || $lastChild->value instanceof Ast\PhpDoc\GenericTagValueNode + ) + ) { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + break; + } + $lastChild = $this->parseChild($tokens); + $children[] = $lastChild; + continue; + } + + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + break; + } + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + break; + } + + $lastChild = $this->parseChild($tokens); + $children[] = $lastChild; + } + } + } else { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { $children[] = $this->parseChild($tokens); + while ($tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL) && !$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + $children[] = $this->parseChild($tokens); + } } } @@ -54,30 +133,90 @@ public function parse(TokenIterator $tokens): Ast\PhpDoc\PhpDocNode $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PHPDOC); } catch (ParserException $e) { $name = ''; + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); if (count($children) > 0) { $lastChild = $children[count($children) - 1]; if ($lastChild instanceof Ast\PhpDoc\PhpDocTagNode) { $name = $lastChild->name; + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); } } + + $tag = new Ast\PhpDoc\PhpDocTagNode( + $name, + $this->enrichWithAttributes( + $tokens, + new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e), + $startLine, + $startIndex + ) + ); + $tokens->forwardToTheEnd(); - return new Ast\PhpDoc\PhpDocNode([ - new Ast\PhpDoc\PhpDocTagNode($name, new Ast\PhpDoc\InvalidTagValueNode($e->getMessage(), $e)), - ]); + + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode([$this->enrichWithAttributes($tokens, $tag, $startLine, $startIndex)]), 1, 0); } - return new Ast\PhpDoc\PhpDocNode(array_values($children)); + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocNode(array_values($children)), 1, 0); } + /** @phpstan-impure */ private function parseChild(TokenIterator $tokens): Ast\PhpDoc\PhpDocChildNode { if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { - return $this->parseTag($tokens); + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + return $this->enrichWithAttributes($tokens, $this->parseTag($tokens), $startLine, $startIndex); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_TAG)) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $tag = $tokens->currentTokenValue(); + $tokens->next(); + $tagStartLine = $tokens->currentTokenLine(); + $tagStartIndex = $tokens->currentTokenIndex(); + + return $this->enrichWithAttributes($tokens, new Ast\PhpDoc\PhpDocTagNode( + $tag, + $this->enrichWithAttributes( + $tokens, + $this->parseDoctrineTagValue($tokens, $tag), + $tagStartLine, + $tagStartIndex + ) + ), $startLine, $startIndex); } - return $this->parseText($tokens); + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $text = $this->parseText($tokens); + + return $this->enrichWithAttributes($tokens, $text, $startLine, $startIndex); + } + + /** + * @template T of Ast\Node + * @param T $tag + * @return T + */ + private function enrichWithAttributes(TokenIterator $tokens, Ast\Node $tag, int $startLine, int $startIndex): Ast\Node + { + if ($this->useLinesAttributes) { + $tag->setAttribute(Ast\Attribute::START_LINE, $startLine); + $tag->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); + } + + if ($this->useIndexAttributes) { + $tag->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $tag->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); + } + + return $tag; } @@ -85,29 +224,144 @@ private function parseText(TokenIterator $tokens): Ast\PhpDoc\PhpDocTextNode { $text = ''; - while (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { - $text .= $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END); + $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; + if ($this->textBetweenTagsBelongsToDescription) { + $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; + } + + $savepoint = false; + // if the next token is EOL, everything below is skipped and empty string is returned + while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); + $text .= $tmpText; + + // stop if we're not at EOL - meaning it's the end of PHPDoc if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { break; } + if ($this->textBetweenTagsBelongsToDescription) { + if (!$savepoint) { + $tokens->pushSavePoint(); + $savepoint = true; + } elseif ($tmpText !== '') { + $tokens->dropSavePoint(); + $tokens->pushSavePoint(); + } + } + $tokens->pushSavePoint(); $tokens->next(); - if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END)) { + // if we're at EOL, check what's next + // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { $tokens->rollback(); break; } + // otherwise if the next is text, continue building the description string + $tokens->dropSavePoint(); - $text .= "\n"; + $text .= $tokens->getDetectedNewline() ?? "\n"; + } + + if ($savepoint) { + $tokens->rollback(); + $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); } return new Ast\PhpDoc\PhpDocTextNode(trim($text, " \t")); } + private function parseOptionalDescriptionAfterDoctrineTag(TokenIterator $tokens): string + { + $text = ''; + + $endTokens = [Lexer::TOKEN_PHPDOC_EOL, Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; + if ($this->textBetweenTagsBelongsToDescription) { + $endTokens = [Lexer::TOKEN_CLOSE_PHPDOC, Lexer::TOKEN_END]; + } + + $savepoint = false; + + // if the next token is EOL, everything below is skipped and empty string is returned + while ($this->textBetweenTagsBelongsToDescription || !$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + $tmpText = $tokens->getSkippedHorizontalWhiteSpaceIfAny() . $tokens->joinUntil(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, Lexer::TOKEN_PHPDOC_EOL, ...$endTokens); + $text .= $tmpText; + + // stop if we're not at EOL - meaning it's the end of PHPDoc + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + if (!$tokens->isPrecededByHorizontalWhitespace()) { + return trim($text . $this->parseText($tokens)->text, " \t"); + } + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG)) { + $tokens->pushSavePoint(); + $child = $this->parseChild($tokens); + if ($child instanceof Ast\PhpDoc\PhpDocTagNode) { + if ( + $child->value instanceof Ast\PhpDoc\GenericTagValueNode + || $child->value instanceof Doctrine\DoctrineTagValueNode + ) { + $tokens->rollback(); + break; + } + if ($child->value instanceof Ast\PhpDoc\InvalidTagValueNode) { + $tokens->rollback(); + $tokens->pushSavePoint(); + $tokens->next(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $tokens->rollback(); + break; + } + $tokens->rollback(); + return trim($text . $this->parseText($tokens)->text, " \t"); + } + } + + $tokens->rollback(); + return trim($text . $this->parseText($tokens)->text, " \t"); + } + break; + } + + if ($this->textBetweenTagsBelongsToDescription) { + if (!$savepoint) { + $tokens->pushSavePoint(); + $savepoint = true; + } elseif ($tmpText !== '') { + $tokens->dropSavePoint(); + $tokens->pushSavePoint(); + } + } + + $tokens->pushSavePoint(); + $tokens->next(); + + // if we're at EOL, check what's next + // if next is a PHPDoc tag, EOL, or end of PHPDoc, stop + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG, ...$endTokens)) { + $tokens->rollback(); + break; + } + + // otherwise if the next is text, continue building the description string + + $tokens->dropSavePoint(); + $text .= $tokens->getDetectedNewline() ?? "\n"; + } + + if ($savepoint) { + $tokens->rollback(); + $text = rtrim($text, $tokens->getDetectedNewline() ?? "\n"); + } + + return trim($text, " \t"); + } + + public function parseTag(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagNode { $tag = $tokens->currentTokenValue(); @@ -120,6 +374,9 @@ public function parseTag(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagNode public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\PhpDocTagValueNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + try { $tokens->pushSavePoint(); @@ -236,7 +493,17 @@ public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\Ph break; default: + if ($this->parseDoctrineAnnotations) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + $tagValue = $this->parseDoctrineTagValue($tokens, $tag); + } else { + $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescriptionAfterDoctrineTag($tokens)); + } + break; + } + $tagValue = new Ast\PhpDoc\GenericTagValueNode($this->parseOptionalDescription($tokens)); + break; } @@ -247,7 +514,309 @@ public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\Ph $tagValue = new Ast\PhpDoc\InvalidTagValueNode($this->parseOptionalDescription($tokens), $e); } - return $tagValue; + return $this->enrichWithAttributes($tokens, $tagValue, $startLine, $startIndex); + } + + + private function parseDoctrineTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\PhpDocTagValueNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + return new Doctrine\DoctrineTagValueNode( + $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineAnnotation($tag, $this->parseDoctrineArguments($tokens, false)), + $startLine, + $startIndex + ), + $this->parseOptionalDescriptionAfterDoctrineTag($tokens) + ); + } + + + /** + * @return list + */ + private function parseDoctrineArguments(TokenIterator $tokens, bool $deep): array + { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { + return []; + } + + if (!$deep) { + $tokens->addEndOfLineToSkippedTokens(); + } + + $arguments = []; + + try { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES); + + do { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { + break; + } + $arguments[] = $this->parseDoctrineArgument($tokens); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + } finally { + if (!$deep) { + $tokens->removeEndOfLineFromSkippedTokens(); + } + } + + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + + return $arguments; + } + + + private function parseDoctrineArgument(TokenIterator $tokens): Doctrine\DoctrineArgument + { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), + $startLine, + $startIndex + ); + } + + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + try { + $tokens->pushSavePoint(); + $currentValue = $tokens->currentTokenValue(); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + + $key = $this->enrichWithAttributes( + $tokens, + new IdentifierTypeNode($currentValue), + $startLine, + $startIndex + ); + $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); + + $value = $this->parseDoctrineArgumentValue($tokens); + + $tokens->dropSavePoint(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArgument($key, $value), + $startLine, + $startIndex + ); + } catch (ParserException $e) { + $tokens->rollback(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArgument(null, $this->parseDoctrineArgumentValue($tokens)), + $startLine, + $startIndex + ); + } + } + + + /** + * @return DoctrineValueType + */ + private function parseDoctrineArgumentValue(TokenIterator $tokens) + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_TAG, Lexer::TOKEN_DOCTRINE_TAG)) { + $name = $tokens->currentTokenValue(); + $tokens->next(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineAnnotation($name, $this->parseDoctrineArguments($tokens, true)), + $startLine, + $startIndex + ); + } + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { + $items = []; + do { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { + break; + } + $items[] = $this->parseDoctrineArrayItem($tokens); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArray($items), + $startLine, + $startIndex + ); + } + + $currentTokenValue = $tokens->currentTokenValue(); + $tokens->pushSavePoint(); // because of ConstFetchNode + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { + $identifier = $this->enrichWithAttributes( + $tokens, + new Ast\Type\IdentifierTypeNode($currentTokenValue), + $startLine, + $startIndex + ); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + $tokens->dropSavePoint(); + return $identifier; + } + + $tokens->rollback(); // because of ConstFetchNode + } else { + $tokens->dropSavePoint(); // because of ConstFetchNode + } + + $currentTokenValue = $tokens->currentTokenValue(); + $currentTokenType = $tokens->currentTokenType(); + $currentTokenOffset = $tokens->currentTokenOffset(); + $currentTokenLine = $tokens->currentTokenLine(); + + try { + $constExpr = $this->doctrineConstantExprParser->parse($tokens, true); + if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); + } + + return $constExpr; + } catch (LogicException $e) { + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); + } + } + + + private function parseDoctrineArrayItem(TokenIterator $tokens): Doctrine\DoctrineArrayItem + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + try { + $tokens->pushSavePoint(); + + $key = $this->parseDoctrineArrayKey($tokens); + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL)) { + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_COLON)) { + $tokens->consumeTokenType(Lexer::TOKEN_EQUAL); // will throw exception + } + } + + $value = $this->parseDoctrineArgumentValue($tokens); + + $tokens->dropSavePoint(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArrayItem($key, $value), + $startLine, + $startIndex + ); + } catch (ParserException $e) { + $tokens->rollback(); + + return $this->enrichWithAttributes( + $tokens, + new Doctrine\DoctrineArrayItem(null, $this->parseDoctrineArgumentValue($tokens)), + $startLine, + $startIndex + ); + } + } + + + /** + * @return ConstExprIntegerNode|ConstExprStringNode|IdentifierTypeNode|ConstFetchNode + */ + private function parseDoctrineArrayKey(TokenIterator $tokens) + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { + $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOCTRINE_ANNOTATION_STRING)) { + $key = new Ast\ConstExpr\DoctrineConstExprStringNode(Ast\ConstExpr\DoctrineConstExprStringNode::unescape($tokens->currentTokenValue())); + + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + $value = $tokens->currentTokenValue(); + $tokens->next(); + $key = $this->doctrineConstantExprParser->parseDoctrineString($value, $tokens); + + } else { + $currentTokenValue = $tokens->currentTokenValue(); + $tokens->pushSavePoint(); // because of ConstFetchNode + if (!$tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { + $tokens->dropSavePoint(); + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() + ); + } + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + $tokens->dropSavePoint(); + + return $this->enrichWithAttributes( + $tokens, + new IdentifierTypeNode($currentTokenValue), + $startLine, + $startIndex + ); + } + + $tokens->rollback(); + $constExpr = $this->doctrineConstantExprParser->parse($tokens, true); + if (!$constExpr instanceof Ast\ConstExpr\ConstFetchNode) { + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_IDENTIFIER, + null, + $tokens->currentTokenLine() + ); + } + + return $constExpr; + } + + return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } @@ -257,9 +826,7 @@ public function parseTagValue(TokenIterator $tokens, string $tag): Ast\PhpDoc\Ph private function parseParamTagValue(TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode { if ( - $tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE) - || $tokens->isCurrentTokenType(Lexer::TOKEN_VARIADIC) - || $tokens->isCurrentTokenType(Lexer::TOKEN_VARIABLE) + $tokens->isCurrentTokenType(Lexer::TOKEN_REFERENCE, Lexer::TOKEN_VARIADIC, Lexer::TOKEN_VARIABLE) ) { $type = null; } else { @@ -329,6 +896,8 @@ private function parsePropertyTagValue(TokenIterator $tokens): Ast\PhpDoc\Proper private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueNode { $isStatic = $tokens->tryConsumeTokenValue('static'); + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); $returnTypeOrMethodName = $this->typeParser->parse($tokens); if ($tokens->isCurrentTokenType(Lexer::TOKEN_IDENTIFIER)) { @@ -337,7 +906,9 @@ private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTa $tokens->next(); } elseif ($returnTypeOrMethodName instanceof Ast\Type\IdentifierTypeNode) { - $returnType = $isStatic ? new Ast\Type\IdentifierTypeNode('static') : null; + $returnType = $isStatic + ? $this->typeParser->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('static'), $startLine, $startIndex) + : null; $methodName = $returnTypeOrMethodName->name; $isStatic = false; @@ -347,9 +918,12 @@ private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTa } $templateTypes = []; + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { do { - $templateTypes[] = $this->parseTemplateTagValue($tokens, false); + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $templateTypes[] = $this->enrichWithAttributes($tokens, $this->parseTemplateTagValue($tokens, false), $startLine, $startIndex); } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); } @@ -370,6 +944,9 @@ private function parseMethodTagValue(TokenIterator $tokens): Ast\PhpDoc\MethodTa private function parseMethodTagValueParameter(TokenIterator $tokens): Ast\PhpDoc\MethodTagValueParameterNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + switch ($tokens->currentTokenType()) { case Lexer::TOKEN_IDENTIFIER: case Lexer::TOKEN_OPEN_PARENTHESES: @@ -394,7 +971,12 @@ private function parseMethodTagValueParameter(TokenIterator $tokens): Ast\PhpDoc $defaultValue = null; } - return new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue); + return $this->enrichWithAttributes( + $tokens, + new Ast\PhpDoc\MethodTagValueParameterNode($parameterType, $isReference, $isVariadic, $parameterName, $defaultValue), + $startLine, + $startIndex + ); } private function parseTemplateTagValue(TokenIterator $tokens, bool $parseDescription): Ast\PhpDoc\TemplateTagValueNode @@ -426,10 +1008,15 @@ private function parseTemplateTagValue(TokenIterator $tokens, bool $parseDescrip private function parseExtendsTagValue(string $tagName, TokenIterator $tokens): Ast\PhpDoc\PhpDocTagValueNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); $baseType = new IdentifierTypeNode($tokens->currentTokenValue()); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); - $type = $this->typeParser->parseGeneric($tokens, $baseType); + $type = $this->typeParser->parseGeneric( + $tokens, + $this->typeParser->enrichWithAttributes($tokens, $baseType, $startLine, $startIndex) + ); $description = $this->parseOptionalDescription($tokens); @@ -453,6 +1040,34 @@ private function parseTypeAliasTagValue(TokenIterator $tokens): Ast\PhpDoc\TypeA // support psalm-type syntax $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); + if ($this->preserveTypeAliasesWithInvalidTypes) { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + try { + $type = $this->typeParser->parse($tokens); + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_PHPDOC)) { + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_PHPDOC_EOL)) { + throw new ParserException( + $tokens->currentTokenValue(), + $tokens->currentTokenType(), + $tokens->currentTokenOffset(), + Lexer::TOKEN_PHPDOC_EOL, + null, + $tokens->currentTokenLine() + ); + } + } + + return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); + } catch (ParserException $e) { + $this->parseOptionalDescription($tokens); + return new Ast\PhpDoc\TypeAliasTagValueNode( + $alias, + $this->enrichWithAttributes($tokens, new Ast\Type\InvalidTypeNode($e), $startLine, $startIndex) + ); + } + } + $type = $this->typeParser->parse($tokens); return new Ast\PhpDoc\TypeAliasTagValueNode($alias, $type); @@ -465,8 +1080,16 @@ private function parseTypeAliasImportTagValue(TokenIterator $tokens): Ast\PhpDoc $tokens->consumeTokenValue(Lexer::TOKEN_IDENTIFIER, 'from'); + $identifierStartLine = $tokens->currentTokenLine(); + $identifierStartIndex = $tokens->currentTokenIndex(); $importedFrom = $tokens->currentTokenValue(); $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + $importedFromType = $this->enrichWithAttributes( + $tokens, + new IdentifierTypeNode($importedFrom), + $identifierStartLine, + $identifierStartIndex + ); $importedAs = null; if ($tokens->tryConsumeTokenValue('as')) { @@ -474,7 +1097,7 @@ private function parseTypeAliasImportTagValue(TokenIterator $tokens): Ast\PhpDoc $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } - return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, new IdentifierTypeNode($importedFrom), $importedAs); + return new Ast\PhpDoc\TypeAliasImportTagValueNode($importedAlias, $importedFromType, $importedAs); } /** @@ -504,15 +1127,13 @@ private function parseAssertParameter(TokenIterator $tokens): array { if ($tokens->isCurrentTokenType(Lexer::TOKEN_THIS_VARIABLE)) { $parameter = '$this'; - $requirePropertyOrMethod = true; $tokens->next(); } else { $parameter = $tokens->currentTokenValue(); - $requirePropertyOrMethod = false; $tokens->consumeTokenType(Lexer::TOKEN_VARIABLE); } - if ($requirePropertyOrMethod || $tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_ARROW)) { $tokens->consumeTokenType(Lexer::TOKEN_ARROW); $propertyOrMethod = $tokens->currentTokenValue(); diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php new file mode 100644 index 000000000..705240551 --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/StringUnescaper.php @@ -0,0 +1,96 @@ + '\\', + 'n' => "\n", + 'r' => "\r", + 't' => "\t", + 'f' => "\f", + 'v' => "\v", + 'e' => "\x1B", + ]; + + public static function unescapeString(string $string): string + { + $quote = $string[0]; + + if ($quote === '\'') { + return str_replace( + ['\\\\', '\\\''], + ['\\', '\''], + substr($string, 1, -1) + ); + } + + return self::parseEscapeSequences(substr($string, 1, -1), '"'); + } + + /** + * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L90-L130 + */ + private static function parseEscapeSequences(string $str, string $quote): string + { + $str = str_replace('\\' . $quote, $quote, $str); + + return preg_replace_callback( + '~\\\\([\\\\nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3}|u\{([0-9a-fA-F]+)\})~', + static function ($matches) { + $str = $matches[1]; + + if (isset(self::REPLACEMENTS[$str])) { + return self::REPLACEMENTS[$str]; + } + if ($str[0] === 'x' || $str[0] === 'X') { + return chr((int) hexdec(substr($str, 1))); + } + if ($str[0] === 'u') { + return self::codePointToUtf8((int) hexdec($matches[2])); + } + + return chr((int) octdec($str)); + }, + $str + ); + } + + /** + * Implementation based on https://github.com/nikic/PHP-Parser/blob/b0edd4c41111042d43bb45c6c657b2e0db367d9e/lib/PhpParser/Node/Scalar/String_.php#L132-L154 + */ + private static function codePointToUtf8(int $num): string + { + if ($num <= 0x7F) { + return chr($num); + } + if ($num <= 0x7FF) { + return chr(($num >> 6) + 0xC0) + . chr(($num & 0x3F) + 0x80); + } + if ($num <= 0xFFFF) { + return chr(($num >> 12) + 0xE0) + . chr((($num >> 6) & 0x3F) + 0x80) + . chr(($num & 0x3F) + 0x80); + } + if ($num <= 0x1FFFFF) { + return chr(($num >> 18) + 0xF0) + . chr((($num >> 12) & 0x3F) + 0x80) + . chr((($num >> 6) & 0x3F) + 0x80) + . chr(($num & 0x3F) + 0x80); + } + + // Invalid UTF-8 codepoint escape sequence: Codepoint too large + return "\xef\xbf\xbd"; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php index 569a9321a..9be7593d3 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/TokenIterator.php @@ -2,17 +2,19 @@ namespace PHPStan\PhpDocParser\Parser; +use LogicException; use PHPStan\PhpDocParser\Lexer\Lexer; use function array_pop; use function assert; use function count; use function in_array; use function strlen; +use function substr; class TokenIterator { - /** @var mixed[][] */ + /** @var list */ private $tokens; /** @var int */ @@ -21,16 +23,51 @@ class TokenIterator /** @var int[] */ private $savePoints = []; + /** @var list */ + private $skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; + + /** @var string|null */ + private $newline = null; + + /** + * @param list $tokens + */ public function __construct(array $tokens, int $index = 0) { $this->tokens = $tokens; $this->index = $index; - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { - return; + $this->skipIrrelevantTokens(); + } + + + /** + * @return list + */ + public function getTokens(): array + { + return $this->tokens; + } + + + public function getContentBetween(int $startPos, int $endPos): string + { + if ($startPos < 0 || $endPos > count($this->tokens)) { + throw new LogicException(); } - $this->index++; + $content = ''; + for ($i = $startPos; $i < $endPos; $i++) { + $content .= $this->tokens[$i][Lexer::VALUE_OFFSET]; + } + + return $content; + } + + + public function getTokenCount(): int + { + return count($this->tokens); } @@ -57,6 +94,33 @@ public function currentTokenOffset(): int } + public function currentTokenLine(): int + { + return $this->tokens[$this->index][Lexer::LINE_OFFSET]; + } + + + public function currentTokenIndex(): int + { + return $this->index; + } + + + public function endIndexOfLastRelevantToken(): int + { + $endIndex = $this->currentTokenIndex(); + $endIndex--; + while (in_array($this->tokens[$endIndex][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, true)) { + if (!isset($this->tokens[$endIndex - 1])) { + break; + } + $endIndex--; + } + + return $endIndex; + } + + public function isCurrentTokenValue(string $tokenValue): bool { return $this->tokens[$this->index][Lexer::VALUE_OFFSET] === $tokenValue; @@ -84,13 +148,14 @@ public function consumeTokenType(int $tokenType): void $this->throwError($tokenType); } - $this->index++; - - if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { - return; + if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { + if ($this->newline === null) { + $this->detectNewline(); + } } $this->index++; + $this->skipIrrelevantTokens(); } @@ -104,12 +169,7 @@ public function consumeTokenValue(int $tokenType, string $tokenValue): void } $this->index++; - - if (($this->tokens[$this->index][Lexer::TYPE_OFFSET] ?? -1) !== Lexer::TOKEN_HORIZONTAL_WS) { - return; - } - - $this->index++; + $this->skipIrrelevantTokens(); } @@ -121,10 +181,7 @@ public function tryConsumeTokenValue(string $tokenValue): bool } $this->index++; - - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { - $this->index++; - } + $this->skipIrrelevantTokens(); return true; } @@ -137,16 +194,30 @@ public function tryConsumeTokenType(int $tokenType): bool return false; } - $this->index++; - - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { - $this->index++; + if ($tokenType === Lexer::TOKEN_PHPDOC_EOL) { + if ($this->newline === null) { + $this->detectNewline(); + } } + $this->index++; + $this->skipIrrelevantTokens(); + return true; } + private function detectNewline(): void + { + $value = $this->currentTokenValue(); + if (substr($value, 0, 2) === "\r\n") { + $this->newline = "\r\n"; + } elseif (substr($value, 0, 1) === "\n") { + $this->newline = "\n"; + } + } + + public function getSkippedHorizontalWhiteSpaceIfAny(): string { if ($this->index > 0 && $this->tokens[$this->index - 1][Lexer::TYPE_OFFSET] === Lexer::TOKEN_HORIZONTAL_WS) { @@ -171,12 +242,34 @@ public function joinUntil(int ...$tokenType): string public function next(): void { $this->index++; + $this->skipIrrelevantTokens(); + } - if ($this->tokens[$this->index][Lexer::TYPE_OFFSET] !== Lexer::TOKEN_HORIZONTAL_WS) { + + private function skipIrrelevantTokens(): void + { + if (!isset($this->tokens[$this->index])) { return; } - $this->index++; + while (in_array($this->tokens[$this->index][Lexer::TYPE_OFFSET], $this->skippedTokenTypes, true)) { + if (!isset($this->tokens[$this->index + 1])) { + break; + } + $this->index++; + } + } + + + public function addEndOfLineToSkippedTokens(): void + { + $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS, Lexer::TOKEN_PHPDOC_EOL]; + } + + + public function removeEndOfLineFromSkippedTokens(): void + { + $this->skippedTokenTypes = [Lexer::TOKEN_HORIZONTAL_WS]; } /** @phpstan-impure */ @@ -217,8 +310,74 @@ private function throwError(int $expectedTokenType, ?string $expectedTokenValue $this->currentTokenType(), $this->currentTokenOffset(), $expectedTokenType, - $expectedTokenValue + $expectedTokenValue, + $this->currentTokenLine() ); } + /** + * Check whether the position is directly preceded by a certain token type. + * + * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped + */ + public function hasTokenImmediatelyBefore(int $pos, int $expectedTokenType): bool + { + $tokens = $this->tokens; + $pos--; + for (; $pos >= 0; $pos--) { + $token = $tokens[$pos]; + $type = $token[Lexer::TYPE_OFFSET]; + if ($type === $expectedTokenType) { + return true; + } + if (!in_array($type, [ + Lexer::TOKEN_HORIZONTAL_WS, + Lexer::TOKEN_PHPDOC_EOL, + ], true)) { + break; + } + } + return false; + } + + /** + * Check whether the position is directly followed by a certain token type. + * + * During this check TOKEN_HORIZONTAL_WS and TOKEN_PHPDOC_EOL are skipped + */ + public function hasTokenImmediatelyAfter(int $pos, int $expectedTokenType): bool + { + $tokens = $this->tokens; + $pos++; + for ($c = count($tokens); $pos < $c; $pos++) { + $token = $tokens[$pos]; + $type = $token[Lexer::TYPE_OFFSET]; + if ($type === $expectedTokenType) { + return true; + } + if (!in_array($type, [ + Lexer::TOKEN_HORIZONTAL_WS, + Lexer::TOKEN_PHPDOC_EOL, + ], true)) { + break; + } + } + + return false; + } + + public function getDetectedNewline(): ?string + { + return $this->newline; + } + + /** + * Whether the given position is immediately surrounded by parenthesis. + */ + public function hasParentheses(int $startPos, int $endPos): bool + { + return $this->hasTokenImmediatelyBefore($startPos, Lexer::TOKEN_OPEN_PARENTHESES) + && $this->hasTokenImmediatelyAfter($endPos, Lexer::TOKEN_CLOSE_PARENTHESES); + } + } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php b/app/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php index d196eb942..46de7aaec 100644 --- a/app/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php +++ b/app/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php @@ -6,6 +6,7 @@ use PHPStan\PhpDocParser\Ast; use PHPStan\PhpDocParser\Lexer\Lexer; use function in_array; +use function str_replace; use function strpos; use function trim; @@ -15,14 +16,35 @@ class TypeParser /** @var ConstExprParser|null */ private $constExprParser; - public function __construct(?ConstExprParser $constExprParser = null) + /** @var bool */ + private $quoteAwareConstExprString; + + /** @var bool */ + private $useLinesAttributes; + + /** @var bool */ + private $useIndexAttributes; + + /** + * @param array{lines?: bool, indexes?: bool} $usedAttributes + */ + public function __construct( + ?ConstExprParser $constExprParser = null, + bool $quoteAwareConstExprString = false, + array $usedAttributes = [] + ) { $this->constExprParser = $constExprParser; + $this->quoteAwareConstExprString = $quoteAwareConstExprString; + $this->useLinesAttributes = $usedAttributes['lines'] ?? false; + $this->useIndexAttributes = $usedAttributes['indexes'] ?? false; } /** @phpstan-impure */ public function parse(TokenIterator $tokens): Ast\Type\TypeNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); @@ -37,12 +59,36 @@ public function parse(TokenIterator $tokens): Ast\Type\TypeNode } } + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + + /** + * @internal + * @template T of Ast\Node + * @param T $type + * @return T + */ + public function enrichWithAttributes(TokenIterator $tokens, Ast\Node $type, int $startLine, int $startIndex): Ast\Node + { + if ($this->useLinesAttributes) { + $type->setAttribute(Ast\Attribute::START_LINE, $startLine); + $type->setAttribute(Ast\Attribute::END_LINE, $tokens->currentTokenLine()); + } + + if ($this->useIndexAttributes) { + $type->setAttribute(Ast\Attribute::START_INDEX, $startIndex); + $type->setAttribute(Ast\Attribute::END_INDEX, $tokens->endIndexOfLastRelevantToken()); + } + return $type; } /** @phpstan-impure */ private function subParse(TokenIterator $tokens): Ast\Type\TypeNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { $type = $this->parseNullable($tokens); @@ -66,13 +112,16 @@ private function subParse(TokenIterator $tokens): Ast\Type\TypeNode } } - return $type; + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } /** @phpstan-impure */ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); $type = $this->subParse($tokens); @@ -81,26 +130,26 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - return $this->tryParseArrayOrOffsetAccess($tokens, $type); + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } - return $type; + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } if ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { - $type = new Ast\Type\ThisTypeNode(); + $type = $this->enrichWithAttributes($tokens, new Ast\Type\ThisTypeNode(), $startLine, $startIndex); if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - return $this->tryParseArrayOrOffsetAccess($tokens, $type); + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); } - return $type; + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } $currentTokenValue = $tokens->currentTokenValue(); $tokens->pushSavePoint(); // because of ConstFetchNode if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { - $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); + $type = $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode($currentTokenValue), $startLine, $startIndex); if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { $tokens->dropSavePoint(); // because of ConstFetchNode @@ -124,15 +173,22 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); - } elseif (in_array($type->name, ['array', 'list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { - $type = $this->parseArrayShape($tokens, $type, $type->name); + } elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + if ($type->name === 'object') { + $type = $this->parseObjectShape($tokens); + } else { + $type = $this->parseArrayShape($tokens, $type, $type->name); + } if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + $type = $this->tryParseArrayOrOffsetAccess( + $tokens, + $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex) + ); } } - return $type; + return $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } else { $tokens->rollback(); // because of ConstFetchNode } @@ -140,26 +196,45 @@ private function parseAtomic(TokenIterator $tokens): Ast\Type\TypeNode $tokens->dropSavePoint(); // because of ConstFetchNode } - $exception = new ParserException( - $tokens->currentTokenValue(), - $tokens->currentTokenType(), - $tokens->currentTokenOffset(), - Lexer::TOKEN_IDENTIFIER - ); + $currentTokenValue = $tokens->currentTokenValue(); + $currentTokenType = $tokens->currentTokenType(); + $currentTokenOffset = $tokens->currentTokenOffset(); + $currentTokenLine = $tokens->currentTokenLine(); if ($this->constExprParser === null) { - throw $exception; + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); } try { $constExpr = $this->constExprParser->parse($tokens, true); if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { - throw $exception; + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); } - return new Ast\Type\ConstTypeNode($constExpr); + return $this->enrichWithAttributes($tokens, new Ast\Type\ConstTypeNode($constExpr), $startLine, $startIndex); } catch (LogicException $e) { - throw $exception; + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); } } @@ -323,29 +398,34 @@ public function isHtml(TokenIterator $tokens): bool public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType): Ast\Type\GenericTypeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); $genericTypes = []; $variances = []; - [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); - - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $isFirst = true; + while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { - // trailing comma case - return new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + + // trailing comma case + if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { + break; } + $isFirst = false; + [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); } - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); + } + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); - return new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); + return $type; } @@ -355,9 +435,11 @@ public function parseGeneric(TokenIterator $tokens, Ast\Type\IdentifierTypeNode */ public function parseGenericTypeArgument(TokenIterator $tokens): array { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); if ($tokens->tryConsumeTokenType(Lexer::TOKEN_WILDCARD)) { return [ - new Ast\Type\IdentifierTypeNode('mixed'), + $this->enrichWithAttributes($tokens, new Ast\Type\IdentifierTypeNode('mixed'), $startLine, $startIndex), Ast\Type\GenericTypeNode::VARIANCE_BIVARIANT, ]; } @@ -397,7 +479,10 @@ private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNod $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); $tokens->consumeTokenType(Lexer::TOKEN_COLON); - $returnType = $this->parseCallableReturnType($tokens); + + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + $returnType = $this->enrichWithAttributes($tokens, $this->parseCallableReturnType($tokens), $startLine, $startIndex); return new Ast\Type\CallableTypeNode($identifier, $parameters, $returnType); } @@ -406,6 +491,8 @@ private function parseCallable(TokenIterator $tokens, Ast\Type\IdentifierTypeNod /** @phpstan-impure */ private function parseCallableParameter(TokenIterator $tokens): Ast\Type\CallableTypeParameterNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); $type = $this->parse($tokens); $isReference = $tokens->tryConsumeTokenType(Lexer::TOKEN_REFERENCE); $isVariadic = $tokens->tryConsumeTokenType(Lexer::TOKEN_VARIADIC); @@ -419,37 +506,158 @@ private function parseCallableParameter(TokenIterator $tokens): Ast\Type\Callabl } $isOptional = $tokens->tryConsumeTokenType(Lexer::TOKEN_EQUAL); - return new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional); + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\CallableTypeParameterNode($type, $isReference, $isVariadic, $parameterName, $isOptional), + $startLine, + $startIndex + ); } /** @phpstan-impure */ private function parseCallableReturnType(TokenIterator $tokens): Ast\Type\TypeNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); if ($tokens->isCurrentTokenType(Lexer::TOKEN_NULLABLE)) { - $type = $this->parseNullable($tokens); + return $this->parseNullable($tokens); } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - $type = $this->parse($tokens); + $type = $this->subParse($tokens); $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_PARENTHESES); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + } - } else { - $type = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); - $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + return $type; + } elseif ($tokens->tryConsumeTokenType(Lexer::TOKEN_THIS_VARIABLE)) { + $type = new Ast\Type\ThisTypeNode(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { - $type = $this->parseGeneric($tokens, $type); + return $type; + } else { + $currentTokenValue = $tokens->currentTokenValue(); + $tokens->pushSavePoint(); // because of ConstFetchNode + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_IDENTIFIER)) { + $type = new Ast\Type\IdentifierTypeNode($currentTokenValue); + + if (!$tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_COLON)) { + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET)) { + $type = $this->parseGeneric( + $tokens, + $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ) + ); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + + } elseif (in_array($type->name, ['array', 'list', 'object'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { + if ($type->name === 'object') { + $type = $this->parseObjectShape($tokens); + } else { + $type = $this->parseArrayShape($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ), $type->name); + } + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + } - } elseif (in_array($type->name, ['array', 'list'], true) && $tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET) && !$tokens->isPrecededByHorizontalWhitespace()) { - $type = $this->parseArrayShape($tokens, $type, $type->name); + return $type; + } else { + $tokens->rollback(); // because of ConstFetchNode + } + } else { + $tokens->dropSavePoint(); // because of ConstFetchNode } } - if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { - $type = $this->tryParseArrayOrOffsetAccess($tokens, $type); + $currentTokenValue = $tokens->currentTokenValue(); + $currentTokenType = $tokens->currentTokenType(); + $currentTokenOffset = $tokens->currentTokenOffset(); + $currentTokenLine = $tokens->currentTokenLine(); + + if ($this->constExprParser === null) { + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); } - return $type; + try { + $constExpr = $this->constExprParser->parse($tokens, true); + if ($constExpr instanceof Ast\ConstExpr\ConstExprArrayNode) { + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); + } + + $type = new Ast\Type\ConstTypeNode($constExpr); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { + $type = $this->tryParseArrayOrOffsetAccess($tokens, $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + )); + } + + return $type; + } catch (LogicException $e) { + throw new ParserException( + $currentTokenValue, + $currentTokenType, + $currentTokenOffset, + Lexer::TOKEN_IDENTIFIER, + null, + $currentTokenLine + ); + } } @@ -473,6 +681,8 @@ private function tryParseCallable(TokenIterator $tokens, Ast\Type\IdentifierType /** @phpstan-impure */ private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\TypeNode $type): Ast\Type\TypeNode { + $startLine = $type->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $type->getAttribute(Ast\Attribute::START_INDEX); try { while ($tokens->isCurrentTokenType(Lexer::TOKEN_OPEN_SQUARE_BRACKET)) { $tokens->pushSavePoint(); @@ -485,10 +695,28 @@ private function tryParseArrayOrOffsetAccess(TokenIterator $tokens, Ast\Type\Typ $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\OffsetAccessTypeNode($type, $offset); + + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ); + } } else { $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_SQUARE_BRACKET); $tokens->dropSavePoint(); $type = new Ast\Type\ArrayTypeNode($type); + + if ($startLine !== null && $startIndex !== null) { + $type = $this->enrichWithAttributes( + $tokens, + $type, + $startLine, + $startIndex + ); + } } } @@ -539,6 +767,8 @@ private function parseArrayShape(TokenIterator $tokens, Ast\Type\TypeNode $type, /** @phpstan-impure */ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShapeItemNode { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); try { $tokens->pushSavePoint(); $key = $this->parseArrayShapeKey($tokens); @@ -547,12 +777,22 @@ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShape $value = $this->parse($tokens); $tokens->dropSavePoint(); - return new Ast\Type\ArrayShapeItemNode($key, $optional, $value); + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\ArrayShapeItemNode($key, $optional, $value), + $startLine, + $startIndex + ); } catch (ParserException $e) { $tokens->rollback(); $value = $this->parse($tokens); - return new Ast\Type\ArrayShapeItemNode(null, false, $value); + return $this->enrichWithAttributes( + $tokens, + new Ast\Type\ArrayShapeItemNode(null, false, $value), + $startLine, + $startIndex + ); } } @@ -562,16 +802,107 @@ private function parseArrayShapeItem(TokenIterator $tokens): Ast\Type\ArrayShape */ private function parseArrayShapeKey(TokenIterator $tokens) { + $startIndex = $tokens->currentTokenIndex(); + $startLine = $tokens->currentTokenLine(); + if ($tokens->isCurrentTokenType(Lexer::TOKEN_INTEGER)) { - $key = new Ast\ConstExpr\ConstExprIntegerNode($tokens->currentTokenValue()); + $key = new Ast\ConstExpr\ConstExprIntegerNode(str_replace('_', '', $tokens->currentTokenValue())); $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + } $tokens->next(); } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { - $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + } + + $tokens->next(); + + } else { + $key = new Ast\Type\IdentifierTypeNode($tokens->currentTokenValue()); + $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); + } + + return $this->enrichWithAttributes( + $tokens, + $key, + $startLine, + $startIndex + ); + } + + /** + * @phpstan-impure + */ + private function parseObjectShape(TokenIterator $tokens): Ast\Type\ObjectShapeNode + { + $tokens->consumeTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); + + $items = []; + + do { + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + + if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { + return new Ast\Type\ObjectShapeNode($items); + } + + $items[] = $this->parseObjectShapeItem($tokens); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + } while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)); + + $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET); + + return new Ast\Type\ObjectShapeNode($items); + } + + /** @phpstan-impure */ + private function parseObjectShapeItem(TokenIterator $tokens): Ast\Type\ObjectShapeItemNode + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + $key = $this->parseObjectShapeKey($tokens); + $optional = $tokens->tryConsumeTokenType(Lexer::TOKEN_NULLABLE); + $tokens->consumeTokenType(Lexer::TOKEN_COLON); + $value = $this->parse($tokens); + + return $this->enrichWithAttributes($tokens, new Ast\Type\ObjectShapeItemNode($key, $optional, $value), $startLine, $startIndex); + } + + /** + * @phpstan-impure + * @return Ast\ConstExpr\ConstExprStringNode|Ast\Type\IdentifierTypeNode + */ + private function parseObjectShapeKey(TokenIterator $tokens) + { + $startLine = $tokens->currentTokenLine(); + $startIndex = $tokens->currentTokenIndex(); + + if ($tokens->isCurrentTokenType(Lexer::TOKEN_SINGLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::SINGLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), "'")); + } + $tokens->next(); + + } elseif ($tokens->isCurrentTokenType(Lexer::TOKEN_DOUBLE_QUOTED_STRING)) { + if ($this->quoteAwareConstExprString) { + $key = new Ast\ConstExpr\QuoteAwareConstExprStringNode(StringUnescaper::unescapeString($tokens->currentTokenValue()), Ast\ConstExpr\QuoteAwareConstExprStringNode::DOUBLE_QUOTED); + } else { + $key = new Ast\ConstExpr\ConstExprStringNode(trim($tokens->currentTokenValue(), '"')); + } $tokens->next(); } else { @@ -579,7 +910,7 @@ private function parseArrayShapeKey(TokenIterator $tokens) $tokens->consumeTokenType(Lexer::TOKEN_IDENTIFIER); } - return $key; + return $this->enrichWithAttributes($tokens, $key, $startLine, $startIndex); } } diff --git a/app/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php b/app/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php new file mode 100644 index 000000000..2684dfc7e --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Printer/DiffElem.php @@ -0,0 +1,44 @@ +type = $type; + $this->old = $old; + $this->new = $new; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php b/app/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php new file mode 100644 index 000000000..ab10be59b --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Printer/Differ.php @@ -0,0 +1,196 @@ +isEqual = $isEqual; + } + + /** + * Calculate diff (edit script) from $old to $new. + * + * @param T[] $old Original array + * @param T[] $new New array + * + * @return DiffElem[] Diff (edit script) + */ + public function diff(array $old, array $new): array + { + [$trace, $x, $y] = $this->calculateTrace($old, $new); + return $this->extractDiff($trace, $x, $y, $old, $new); + } + + /** + * Calculate diff, including "replace" operations. + * + * If a sequence of remove operations is followed by the same number of add operations, these + * will be coalesced into replace operations. + * + * @param T[] $old Original array + * @param T[] $new New array + * + * @return DiffElem[] Diff (edit script), including replace operations + */ + public function diffWithReplacements(array $old, array $new): array + { + return $this->coalesceReplacements($this->diff($old, $new)); + } + + /** + * @param T[] $old + * @param T[] $new + * @return array{array>, int, int} + */ + private function calculateTrace(array $old, array $new): array + { + $n = count($old); + $m = count($new); + $max = $n + $m; + $v = [1 => 0]; + $trace = []; + for ($d = 0; $d <= $max; $d++) { + $trace[] = $v; + for ($k = -$d; $k <= $d; $k += 2) { + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $x = $v[$k + 1]; + } else { + $x = $v[$k - 1] + 1; + } + + $y = $x - $k; + while ($x < $n && $y < $m && ($this->isEqual)($old[$x], $new[$y])) { + $x++; + $y++; + } + + $v[$k] = $x; + if ($x >= $n && $y >= $m) { + return [$trace, $x, $y]; + } + } + } + throw new Exception('Should not happen'); + } + + /** + * @param array> $trace + * @param T[] $old + * @param T[] $new + * @return DiffElem[] + */ + private function extractDiff(array $trace, int $x, int $y, array $old, array $new): array + { + $result = []; + for ($d = count($trace) - 1; $d >= 0; $d--) { + $v = $trace[$d]; + $k = $x - $y; + + if ($k === -$d || ($k !== $d && $v[$k - 1] < $v[$k + 1])) { + $prevK = $k + 1; + } else { + $prevK = $k - 1; + } + + $prevX = $v[$prevK]; + $prevY = $prevX - $prevK; + + while ($x > $prevX && $y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_KEEP, $old[$x - 1], $new[$y - 1]); + $x--; + $y--; + } + + if ($d === 0) { + break; + } + + while ($x > $prevX) { + $result[] = new DiffElem(DiffElem::TYPE_REMOVE, $old[$x - 1], null); + $x--; + } + + while ($y > $prevY) { + $result[] = new DiffElem(DiffElem::TYPE_ADD, null, $new[$y - 1]); + $y--; + } + } + return array_reverse($result); + } + + /** + * Coalesce equal-length sequences of remove+add into a replace operation. + * + * @param DiffElem[] $diff + * @return DiffElem[] + */ + private function coalesceReplacements(array $diff): array + { + $newDiff = []; + $c = count($diff); + for ($i = 0; $i < $c; $i++) { + $diffType = $diff[$i]->type; + if ($diffType !== DiffElem::TYPE_REMOVE) { + $newDiff[] = $diff[$i]; + continue; + } + + $j = $i; + while ($j < $c && $diff[$j]->type === DiffElem::TYPE_REMOVE) { + $j++; + } + + $k = $j; + while ($k < $c && $diff[$k]->type === DiffElem::TYPE_ADD) { + $k++; + } + + if ($j - $i === $k - $j) { + $len = $j - $i; + for ($n = 0; $n < $len; $n++) { + $newDiff[] = new DiffElem( + DiffElem::TYPE_REPLACE, + $diff[$i + $n]->old, + $diff[$j + $n]->new + ); + } + } else { + for (; $i < $k; $i++) { + $newDiff[] = $diff[$i]; + } + } + $i = $k - 1; + } + return $newDiff; + } + +} diff --git a/app/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php b/app/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php new file mode 100644 index 000000000..d7feaf91d --- /dev/null +++ b/app/vendor/phpstan/phpdoc-parser/src/Printer/Printer.php @@ -0,0 +1,828 @@ + */ + private $differ; + + /** + * Map From "{$class}->{$subNode}" to string that should be inserted + * between elements of this list subnode + * + * @var array + */ + private $listInsertionMap = [ + PhpDocNode::class . '->children' => "\n * ", + UnionTypeNode::class . '->types' => '|', + IntersectionTypeNode::class . '->types' => '&', + ArrayShapeNode::class . '->items' => ', ', + ObjectShapeNode::class . '->items' => ', ', + CallableTypeNode::class . '->parameters' => ', ', + GenericTypeNode::class . '->genericTypes' => ', ', + ConstExprArrayNode::class . '->items' => ', ', + MethodTagValueNode::class . '->parameters' => ', ', + DoctrineArray::class . '->items' => ', ', + DoctrineAnnotation::class . '->arguments' => ', ', + ]; + + /** + * [$find, $extraLeft, $extraRight] + * + * @var array + */ + private $emptyListInsertionMap = [ + CallableTypeNode::class . '->parameters' => ['(', '', ''], + ArrayShapeNode::class . '->items' => ['{', '', ''], + ObjectShapeNode::class . '->items' => ['{', '', ''], + DoctrineArray::class . '->items' => ['{', '', ''], + DoctrineAnnotation::class . '->arguments' => ['(', '', ''], + ]; + + /** @var array>> */ + private $parenthesesMap = [ + CallableTypeNode::class . '->returnType' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ], + ArrayTypeNode::class . '->type' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ConstTypeNode::class, + NullableTypeNode::class, + ], + OffsetAccessTypeNode::class . '->type' => [ + CallableTypeNode::class, + UnionTypeNode::class, + IntersectionTypeNode::class, + ConstTypeNode::class, + NullableTypeNode::class, + ], + ]; + + /** @var array>> */ + private $parenthesesListMap = [ + IntersectionTypeNode::class . '->types' => [ + IntersectionTypeNode::class, + UnionTypeNode::class, + NullableTypeNode::class, + ], + UnionTypeNode::class . '->types' => [ + IntersectionTypeNode::class, + UnionTypeNode::class, + NullableTypeNode::class, + ], + ]; + + public function printFormatPreserving(PhpDocNode $node, PhpDocNode $originalNode, TokenIterator $originalTokens): string + { + $this->differ = new Differ(static function ($a, $b) { + if ($a instanceof Node && $b instanceof Node) { + return $a === $b->getAttribute(Attribute::ORIGINAL_NODE); + } + + return false; + }); + + $tokenIndex = 0; + $result = $this->printArrayFormatPreserving( + $node->children, + $originalNode->children, + $originalTokens, + $tokenIndex, + PhpDocNode::class, + 'children' + ); + if ($result !== null) { + return $result . $originalTokens->getContentBetween($tokenIndex, $originalTokens->getTokenCount()); + } + + return $this->print($node); + } + + public function print(Node $node): string + { + if ($node instanceof PhpDocNode) { + return "/**\n *" . implode("\n *", array_map( + function (PhpDocChildNode $child): string { + $s = $this->print($child); + return $s === '' ? '' : ' ' . $s; + }, + $node->children + )) . "\n */"; + } + if ($node instanceof PhpDocTextNode) { + return $node->text; + } + if ($node instanceof PhpDocTagNode) { + if ($node->value instanceof DoctrineTagValueNode) { + return $this->print($node->value); + } + + return trim(sprintf('%s %s', $node->name, $this->print($node->value))); + } + if ($node instanceof PhpDocTagValueNode) { + return $this->printTagValue($node); + } + if ($node instanceof TypeNode) { + return $this->printType($node); + } + if ($node instanceof ConstExprNode) { + return $this->printConstExpr($node); + } + if ($node instanceof MethodTagValueParameterNode) { + $type = $node->type !== null ? $this->print($node->type) . ' ' : ''; + $isReference = $node->isReference ? '&' : ''; + $isVariadic = $node->isVariadic ? '...' : ''; + $default = $node->defaultValue !== null ? ' = ' . $this->print($node->defaultValue) : ''; + return "{$type}{$isReference}{$isVariadic}{$node->parameterName}{$default}"; + } + if ($node instanceof CallableTypeParameterNode) { + $type = $this->print($node->type) . ' '; + $isReference = $node->isReference ? '&' : ''; + $isVariadic = $node->isVariadic ? '...' : ''; + $isOptional = $node->isOptional ? '=' : ''; + return trim("{$type}{$isReference}{$isVariadic}{$node->parameterName}") . $isOptional; + } + if ($node instanceof DoctrineAnnotation) { + return (string) $node; + } + if ($node instanceof DoctrineArgument) { + return (string) $node; + } + if ($node instanceof DoctrineArray) { + return (string) $node; + } + if ($node instanceof DoctrineArrayItem) { + return (string) $node; + } + + throw new LogicException(sprintf('Unknown node type %s', get_class($node))); + } + + private function printTagValue(PhpDocTagValueNode $node): string + { + // only nodes that contain another node are handled here + // the rest falls back on (string) $node + + if ($node instanceof AssertTagMethodValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->method}() {$node->description}"); + } + if ($node instanceof AssertTagPropertyValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter}->{$node->property} {$node->description}"); + } + if ($node instanceof AssertTagValueNode) { + $isNegated = $node->isNegated ? '!' : ''; + $isEquality = $node->isEquality ? '=' : ''; + $type = $this->printType($node->type); + return trim("{$isNegated}{$isEquality}{$type} {$node->parameter} {$node->description}"); + } + if ($node instanceof ExtendsTagValueNode || $node instanceof ImplementsTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof MethodTagValueNode) { + $static = $node->isStatic ? 'static ' : ''; + $returnType = $node->returnType !== null ? $this->printType($node->returnType) . ' ' : ''; + $parameters = implode(', ', array_map(function (MethodTagValueParameterNode $parameter): string { + return $this->print($parameter); + }, $node->parameters)); + $description = $node->description !== '' ? " {$node->description}" : ''; + $templateTypes = count($node->templateTypes) > 0 ? '<' . implode(', ', array_map(function (TemplateTagValueNode $templateTag): string { + return $this->print($templateTag); + }, $node->templateTypes)) . '>' : ''; + return "{$static}{$returnType}{$node->methodName}{$templateTypes}({$parameters}){$description}"; + } + if ($node instanceof MixinTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof ParamOutTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->parameterName} {$node->description}"); + } + if ($node instanceof ParamTagValueNode) { + $reference = $node->isReference ? '&' : ''; + $variadic = $node->isVariadic ? '...' : ''; + $type = $this->printType($node->type); + return trim("{$type} {$reference}{$variadic}{$node->parameterName} {$node->description}"); + } + if ($node instanceof PropertyTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->propertyName} {$node->description}"); + } + if ($node instanceof ReturnTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof SelfOutTagValueNode) { + $type = $this->printType($node->type); + return trim($type . ' ' . $node->description); + } + if ($node instanceof TemplateTagValueNode) { + $bound = $node->bound !== null ? ' of ' . $this->printType($node->bound) : ''; + $default = $node->default !== null ? ' = ' . $this->printType($node->default) : ''; + return trim("{$node->name}{$bound}{$default} {$node->description}"); + } + if ($node instanceof ThrowsTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof TypeAliasImportTagValueNode) { + return trim( + "{$node->importedAlias} from " . $this->printType($node->importedFrom) + . ($node->importedAs !== null ? " as {$node->importedAs}" : '') + ); + } + if ($node instanceof TypeAliasTagValueNode) { + $type = $this->printType($node->type); + return trim("{$node->alias} {$type}"); + } + if ($node instanceof UsesTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} {$node->description}"); + } + if ($node instanceof VarTagValueNode) { + $type = $this->printType($node->type); + return trim("{$type} " . trim("{$node->variableName} {$node->description}")); + } + + return (string) $node; + } + + private function printType(TypeNode $node): string + { + if ($node instanceof ArrayShapeNode) { + $items = array_map(function (ArrayShapeItemNode $item): string { + return $this->printType($item); + }, $node->items); + + if (! $node->sealed) { + $items[] = '...'; + } + + return $node->kind . '{' . implode(', ', $items) . '}'; + } + if ($node instanceof ArrayShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType) + ); + } + + return $this->printType($node->valueType); + } + if ($node instanceof ArrayTypeNode) { + return $this->printOffsetAccessType($node->type) . '[]'; + } + if ($node instanceof CallableTypeNode) { + if ($node->returnType instanceof CallableTypeNode || $node->returnType instanceof UnionTypeNode || $node->returnType instanceof IntersectionTypeNode) { + $returnType = $this->wrapInParentheses($node->returnType); + } else { + $returnType = $this->printType($node->returnType); + } + $parameters = implode(', ', array_map(function (CallableTypeParameterNode $parameterNode): string { + return $this->print($parameterNode); + }, $node->parameters)); + return "{$node->identifier}({$parameters}): {$returnType}"; + } + if ($node instanceof ConditionalTypeForParameterNode) { + return sprintf( + '(%s %s %s ? %s : %s)', + $node->parameterName, + $node->negated ? 'is not' : 'is', + $this->printType($node->targetType), + $this->printType($node->if), + $this->printType($node->else) + ); + } + if ($node instanceof ConditionalTypeNode) { + return sprintf( + '(%s %s %s ? %s : %s)', + $this->printType($node->subjectType), + $node->negated ? 'is not' : 'is', + $this->printType($node->targetType), + $this->printType($node->if), + $this->printType($node->else) + ); + } + if ($node instanceof ConstTypeNode) { + return $this->printConstExpr($node->constExpr); + } + if ($node instanceof GenericTypeNode) { + $genericTypes = []; + + foreach ($node->genericTypes as $index => $type) { + $variance = $node->variances[$index] ?? GenericTypeNode::VARIANCE_INVARIANT; + if ($variance === GenericTypeNode::VARIANCE_INVARIANT) { + $genericTypes[] = $this->printType($type); + } elseif ($variance === GenericTypeNode::VARIANCE_BIVARIANT) { + $genericTypes[] = '*'; + } else { + $genericTypes[] = sprintf('%s %s', $variance, $this->print($type)); + } + } + + return $node->type . '<' . implode(', ', $genericTypes) . '>'; + } + if ($node instanceof IdentifierTypeNode) { + return $node->name; + } + if ($node instanceof IntersectionTypeNode || $node instanceof UnionTypeNode) { + $items = []; + foreach ($node->types as $type) { + if ( + $type instanceof IntersectionTypeNode + || $type instanceof UnionTypeNode + || $type instanceof NullableTypeNode + ) { + $items[] = $this->wrapInParentheses($type); + continue; + } + + $items[] = $this->printType($type); + } + + return implode($node instanceof IntersectionTypeNode ? '&' : '|', $items); + } + if ($node instanceof InvalidTypeNode) { + return (string) $node; + } + if ($node instanceof NullableTypeNode) { + if ($node->type instanceof IntersectionTypeNode || $node->type instanceof UnionTypeNode) { + return '?(' . $this->printType($node->type) . ')'; + } + + return '?' . $this->printType($node->type); + } + if ($node instanceof ObjectShapeNode) { + $items = array_map(function (ObjectShapeItemNode $item): string { + return $this->printType($item); + }, $node->items); + + return 'object{' . implode(', ', $items) . '}'; + } + if ($node instanceof ObjectShapeItemNode) { + if ($node->keyName !== null) { + return sprintf( + '%s%s: %s', + $this->print($node->keyName), + $node->optional ? '?' : '', + $this->printType($node->valueType) + ); + } + + return $this->printType($node->valueType); + } + if ($node instanceof OffsetAccessTypeNode) { + return $this->printOffsetAccessType($node->type) . '[' . $this->printType($node->offset) . ']'; + } + if ($node instanceof ThisTypeNode) { + return (string) $node; + } + + throw new LogicException(sprintf('Unknown node type %s', get_class($node))); + } + + private function wrapInParentheses(TypeNode $node): string + { + return '(' . $this->printType($node) . ')'; + } + + private function printOffsetAccessType(TypeNode $type): string + { + if ( + $type instanceof CallableTypeNode + || $type instanceof UnionTypeNode + || $type instanceof IntersectionTypeNode + || $type instanceof ConstTypeNode + || $type instanceof NullableTypeNode + ) { + return $this->wrapInParentheses($type); + } + + return $this->printType($type); + } + + private function printConstExpr(ConstExprNode $node): string + { + // this is fine - ConstExprNode classes do not contain nodes that need smart printer logic + return (string) $node; + } + + /** + * @param Node[] $nodes + * @param Node[] $originalNodes + */ + private function printArrayFormatPreserving(array $nodes, array $originalNodes, TokenIterator $originalTokens, int &$tokenIndex, string $parentNodeClass, string $subNodeName): ?string + { + $diff = $this->differ->diffWithReplacements($originalNodes, $nodes); + $mapKey = $parentNodeClass . '->' . $subNodeName; + $insertStr = $this->listInsertionMap[$mapKey] ?? null; + $result = ''; + $beforeFirstKeepOrReplace = true; + $delayedAdd = []; + + $insertNewline = false; + [$isMultiline, $beforeAsteriskIndent, $afterAsteriskIndent] = $this->isMultiline($tokenIndex, $originalNodes, $originalTokens); + + if ($insertStr === "\n * ") { + $insertStr = sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } + + foreach ($diff as $i => $diffElem) { + $diffType = $diffElem->type; + $newNode = $diffElem->new; + $originalNode = $diffElem->old; + if ($diffType === DiffElem::TYPE_KEEP || $diffType === DiffElem::TYPE_REPLACE) { + $beforeFirstKeepOrReplace = false; + if (!$newNode instanceof Node || !$originalNode instanceof Node) { + return null; + } + $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); + $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($itemStartPos < 0 || $itemEndPos < 0 || $itemStartPos < $tokenIndex) { + throw new LogicException(); + } + + $result .= $originalTokens->getContentBetween($tokenIndex, $itemStartPos); + + if (count($delayedAdd) > 0) { + foreach ($delayedAdd as $delayedAddNode) { + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($delayedAddNode), $this->parenthesesListMap[$mapKey], true); + if ($parenthesesNeeded) { + $result .= '('; + } + $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); + if ($parenthesesNeeded) { + $result .= ')'; + } + + if ($insertNewline) { + $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } else { + $result .= $insertStr; + } + } + + $delayedAdd = []; + } + + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], true) + && !in_array(get_class($originalNode), $this->parenthesesListMap[$mapKey], true); + $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($itemStartPos, $itemEndPos); + if ($addParentheses) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + if ($addParentheses) { + $result .= ')'; + } + $tokenIndex = $itemEndPos + 1; + + } elseif ($diffType === DiffElem::TYPE_ADD) { + if ($insertStr === null) { + return null; + } + if (!$newNode instanceof Node) { + return null; + } + + if ($insertStr === ', ' && $isMultiline) { + $insertStr = ','; + $insertNewline = true; + } + + if ($beforeFirstKeepOrReplace) { + // Will be inserted at the next "replace" or "keep" element + $delayedAdd[] = $newNode; + continue; + } + + $itemEndPos = $tokenIndex - 1; + if ($insertNewline) { + $result .= $insertStr . sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } else { + $result .= $insertStr; + } + + $parenthesesNeeded = isset($this->parenthesesListMap[$mapKey]) + && in_array(get_class($newNode), $this->parenthesesListMap[$mapKey], true); + if ($parenthesesNeeded) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($newNode, $originalTokens); + if ($parenthesesNeeded) { + $result .= ')'; + } + + $tokenIndex = $itemEndPos + 1; + + } elseif ($diffType === DiffElem::TYPE_REMOVE) { + if (!$originalNode instanceof Node) { + return null; + } + + $itemStartPos = $originalNode->getAttribute(Attribute::START_INDEX); + $itemEndPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($itemStartPos < 0 || $itemEndPos < 0) { + throw new LogicException(); + } + + if ($i === 0) { + // If we're removing from the start, keep the tokens before the node and drop those after it, + // instead of the other way around. + $originalTokensArray = $originalTokens->getTokens(); + for ($j = $tokenIndex; $j < $itemStartPos; $j++) { + if ($originalTokensArray[$j][Lexer::TYPE_OFFSET] === Lexer::TOKEN_PHPDOC_EOL) { + break; + } + $result .= $originalTokensArray[$j][Lexer::VALUE_OFFSET]; + } + } + + $tokenIndex = $itemEndPos + 1; + } + } + + if (count($delayedAdd) > 0) { + if (!isset($this->emptyListInsertionMap[$mapKey])) { + return null; + } + + [$findToken, $extraLeft, $extraRight] = $this->emptyListInsertionMap[$mapKey]; + if ($findToken !== null) { + $originalTokensArray = $originalTokens->getTokens(); + for (; $tokenIndex < count($originalTokensArray); $tokenIndex++) { + $result .= $originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET]; + if ($originalTokensArray[$tokenIndex][Lexer::VALUE_OFFSET] !== $findToken) { + continue; + } + + $tokenIndex++; + break; + } + } + $first = true; + $result .= $extraLeft; + foreach ($delayedAdd as $delayedAddNode) { + if (!$first) { + $result .= $insertStr; + if ($insertNewline) { + $result .= sprintf('%s%s*%s', $originalTokens->getDetectedNewline() ?? "\n", $beforeAsteriskIndent, $afterAsteriskIndent); + } + } + + $result .= $this->printNodeFormatPreserving($delayedAddNode, $originalTokens); + $first = false; + } + $result .= $extraRight; + } + + return $result; + } + + /** + * @param Node[] $nodes + * @return array{bool, string, string} + */ + private function isMultiline(int $initialIndex, array $nodes, TokenIterator $originalTokens): array + { + $isMultiline = count($nodes) > 1; + $pos = $initialIndex; + $allText = ''; + /** @var Node|null $node */ + foreach ($nodes as $node) { + if (!$node instanceof Node) { + continue; + } + + $endPos = $node->getAttribute(Attribute::END_INDEX) + 1; + $text = $originalTokens->getContentBetween($pos, $endPos); + $allText .= $text; + if (strpos($text, "\n") === false) { + // We require that a newline is present between *every* item. If the formatting + // is inconsistent, with only some items having newlines, we don't consider it + // as multiline + $isMultiline = false; + } + $pos = $endPos; + } + + $c = preg_match_all('~\n(?[\\x09\\x20]*)\*(?\\x20*)~', $allText, $matches, PREG_SET_ORDER); + if ($c === 0) { + return [$isMultiline, '', '']; + } + + $before = ''; + $after = ''; + foreach ($matches as $match) { + if (strlen($match['before']) > strlen($before)) { + $before = $match['before']; + } + if (strlen($match['after']) <= strlen($after)) { + continue; + } + + $after = $match['after']; + } + + return [$isMultiline, $before, $after]; + } + + private function printNodeFormatPreserving(Node $node, TokenIterator $originalTokens): string + { + /** @var Node|null $originalNode */ + $originalNode = $node->getAttribute(Attribute::ORIGINAL_NODE); + if ($originalNode === null) { + return $this->print($node); + } + + $class = get_class($node); + if ($class !== get_class($originalNode)) { + throw new LogicException(); + } + + $startPos = $originalNode->getAttribute(Attribute::START_INDEX); + $endPos = $originalNode->getAttribute(Attribute::END_INDEX); + if ($startPos < 0 || $endPos < 0) { + throw new LogicException(); + } + + $result = ''; + $pos = $startPos; + $subNodeNames = array_keys(get_object_vars($node)); + foreach ($subNodeNames as $subNodeName) { + $subNode = $node->$subNodeName; + $origSubNode = $originalNode->$subNodeName; + + if ( + (!$subNode instanceof Node && $subNode !== null) + || (!$origSubNode instanceof Node && $origSubNode !== null) + ) { + if ($subNode === $origSubNode) { + // Unchanged, can reuse old code + continue; + } + + if (is_array($subNode) && is_array($origSubNode)) { + // Array subnode changed, we might be able to reconstruct it + $listResult = $this->printArrayFormatPreserving( + $subNode, + $origSubNode, + $originalTokens, + $pos, + $class, + $subNodeName + ); + + if ($listResult === null) { + return $this->print($node); + } + + $result .= $listResult; + continue; + } + + return $this->print($node); + } + + if ($origSubNode === null) { + if ($subNode === null) { + // Both null, nothing to do + continue; + } + + return $this->print($node); + } + + $subStartPos = $origSubNode->getAttribute(Attribute::START_INDEX); + $subEndPos = $origSubNode->getAttribute(Attribute::END_INDEX); + if ($subStartPos < 0 || $subEndPos < 0) { + throw new LogicException(); + } + + if ($subNode === null) { + return $this->print($node); + } + + $result .= $originalTokens->getContentBetween($pos, $subStartPos); + $mapKey = get_class($node) . '->' . $subNodeName; + $parenthesesNeeded = isset($this->parenthesesMap[$mapKey]) + && in_array(get_class($subNode), $this->parenthesesMap[$mapKey], true); + + if ($subNode->getAttribute(Attribute::ORIGINAL_NODE) !== null) { + $parenthesesNeeded = $parenthesesNeeded + && !in_array(get_class($subNode->getAttribute(Attribute::ORIGINAL_NODE)), $this->parenthesesMap[$mapKey], true); + } + + $addParentheses = $parenthesesNeeded && !$originalTokens->hasParentheses($subStartPos, $subEndPos); + if ($addParentheses) { + $result .= '('; + } + + $result .= $this->printNodeFormatPreserving($subNode, $originalTokens); + if ($addParentheses) { + $result .= ')'; + } + + $pos = $subEndPos + 1; + } + + return $result . $originalTokens->getContentBetween($pos, $endPos + 1); + } + +} diff --git a/app/vendor/phpunit/php-code-coverage/ChangeLog-9.2.md b/app/vendor/phpunit/php-code-coverage/ChangeLog-9.2.md index 34587c058..a2c343316 100644 --- a/app/vendor/phpunit/php-code-coverage/ChangeLog-9.2.md +++ b/app/vendor/phpunit/php-code-coverage/ChangeLog-9.2.md @@ -2,6 +2,29 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [9.2.29] - 2023-09-19 + +### Fixed + +* [#1012](https://github.com/sebastianbergmann/php-code-coverage/issues/1012): Cobertura report pulls functions from report scope, not the individual element + +## [9.2.28] - 2023-09-12 + +### Changed + +* [#1011](https://github.com/sebastianbergmann/php-code-coverage/pull/1011): Avoid serialization of cache data in PHP report + +## [9.2.27] - 2023-07-26 + +### Changed + +* The result of `CodeCoverage::getReport()` is now cached + +### Fixed + +* Static analysis cache keys do not include configuration settings that affect source code parsing +* The Clover, Cobertura, Crap4j, and PHP report writers no longer create a `php:` directory when they should write to `php://stdout`, for instance + ## [9.2.26] - 2023-03-06 ### Changed @@ -476,6 +499,9 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * This component is no longer supported on PHP 7.1 +[9.2.29]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.28...9.2.29 +[9.2.28]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.27...9.2.28 +[9.2.27]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.26...9.2.27 [9.2.26]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.25...9.2.26 [9.2.25]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.24...9.2.25 [9.2.24]: https://github.com/sebastianbergmann/php-code-coverage/compare/9.2.23...9.2.24 diff --git a/app/vendor/phpunit/php-code-coverage/composer.json b/app/vendor/phpunit/php-code-coverage/composer.json index d6f107958..0f18174cd 100644 --- a/app/vendor/phpunit/php-code-coverage/composer.json +++ b/app/vendor/phpunit/php-code-coverage/composer.json @@ -17,7 +17,8 @@ } ], "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues" + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy" }, "config": { "platform": { diff --git a/app/vendor/phpunit/php-code-coverage/src/CodeCoverage.php b/app/vendor/phpunit/php-code-coverage/src/CodeCoverage.php index c35f27c8c..ba4f1f8c3 100644 --- a/app/vendor/phpunit/php-code-coverage/src/CodeCoverage.php +++ b/app/vendor/phpunit/php-code-coverage/src/CodeCoverage.php @@ -114,6 +114,11 @@ final class CodeCoverage */ private $cacheDirectory; + /** + * @var ?Directory + */ + private $cachedReport; + public function __construct(Driver $driver, Filter $filter) { $this->driver = $driver; @@ -127,7 +132,11 @@ public function __construct(Driver $driver, Filter $filter) */ public function getReport(): Directory { - return (new Builder($this->analyser()))->build($this); + if ($this->cachedReport === null) { + $this->cachedReport = (new Builder($this->analyser()))->build($this); + } + + return $this->cachedReport; } /** @@ -135,9 +144,18 @@ public function getReport(): Directory */ public function clear(): void { - $this->currentId = null; - $this->data = new ProcessedCodeCoverageData; - $this->tests = []; + $this->currentId = null; + $this->data = new ProcessedCodeCoverageData; + $this->tests = []; + $this->cachedReport = null; + } + + /** + * @internal + */ + public function clearCache(): void + { + $this->cachedReport = null; } /** @@ -202,6 +220,8 @@ public function start($id, bool $clear = false): void $this->currentId = $id; $this->driver->start(); + + $this->cachedReport = null; } /** @@ -220,7 +240,8 @@ public function stop(bool $append = true, $linesToBeCovered = [], array $linesTo $data = $this->driver->stop(); $this->append($data, null, $append, $linesToBeCovered, $linesToBeUsed); - $this->currentId = null; + $this->currentId = null; + $this->cachedReport = null; return $data; } @@ -245,6 +266,8 @@ public function append(RawCodeCoverageData $rawData, $id = null, bool $append = throw new TestIdMissingException; } + $this->cachedReport = null; + $this->applyFilter($rawData); $this->applyExecutableLinesFilter($rawData); @@ -312,6 +335,8 @@ public function merge(self $that): void $this->data->merge($that->data); $this->tests = array_merge($this->tests, $that->getTests()); + + $this->cachedReport = null; } public function enableCheckForUnintentionallyCoveredCode(): void @@ -673,7 +698,9 @@ private function analyser(): FileAnalyser if ($this->cachesStaticAnalysis()) { $this->analyser = new CachingFileAnalyser( $this->cacheDirectory, - $this->analyser + $this->analyser, + $this->useAnnotationsForIgnoringCode, + $this->ignoreDeprecatedCode ); } diff --git a/app/vendor/phpunit/php-code-coverage/src/Report/Clover.php b/app/vendor/phpunit/php-code-coverage/src/Report/Clover.php index 75c731bbe..d80ab4dee 100644 --- a/app/vendor/phpunit/php-code-coverage/src/Report/Clover.php +++ b/app/vendor/phpunit/php-code-coverage/src/Report/Clover.php @@ -16,6 +16,7 @@ use function ksort; use function max; use function range; +use function strpos; use function time; use DOMDocument; use SebastianBergmann\CodeCoverage\CodeCoverage; @@ -243,7 +244,9 @@ public function process(CodeCoverage $coverage, ?string $target = null, ?string $buffer = $xmlDocument->saveXML(); if ($target !== null) { - Filesystem::createDirectory(dirname($target)); + if (!strpos($target, '://') !== false) { + Filesystem::createDirectory(dirname($target)); + } if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); diff --git a/app/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php b/app/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php index 0d1dde760..138a31ebe 100644 --- a/app/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php +++ b/app/vendor/phpunit/php-code-coverage/src/Report/Cobertura.php @@ -16,6 +16,7 @@ use function preg_match; use function range; use function str_replace; +use function strpos; use function time; use DOMImplementation; use SebastianBergmann\CodeCoverage\CodeCoverage; @@ -193,7 +194,7 @@ public function process(CodeCoverage $coverage, ?string $target = null): string } } - if ($report->numberOfFunctions() === 0) { + if ($item->numberOfFunctions() === 0) { $packageElement->setAttribute('complexity', (string) $packageComplexity); continue; @@ -217,7 +218,7 @@ public function process(CodeCoverage $coverage, ?string $target = null): string $classElement->appendChild($classLinesElement); - $functions = $report->functions(); + $functions = $item->functions(); foreach ($functions as $functionName => $function) { if ($function['executableLines'] === 0) { @@ -294,7 +295,9 @@ public function process(CodeCoverage $coverage, ?string $target = null): string $buffer = $document->saveXML(); if ($target !== null) { - Filesystem::createDirectory(dirname($target)); + if (!strpos($target, '://') !== false) { + Filesystem::createDirectory(dirname($target)); + } if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); diff --git a/app/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php b/app/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php index 91f8ed59d..2d91567a0 100644 --- a/app/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php +++ b/app/vendor/phpunit/php-code-coverage/src/Report/Crap4j.php @@ -15,6 +15,7 @@ use function htmlspecialchars; use function is_string; use function round; +use function strpos; use DOMDocument; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; @@ -124,7 +125,9 @@ public function process(CodeCoverage $coverage, ?string $target = null, ?string $buffer = $document->saveXML(); if ($target !== null) { - Filesystem::createDirectory(dirname($target)); + if (!strpos($target, '://') !== false) { + Filesystem::createDirectory(dirname($target)); + } if (@file_put_contents($target, $buffer) === false) { throw new WriteOperationFailedException($target); diff --git a/app/vendor/phpunit/php-code-coverage/src/Report/PHP.php b/app/vendor/phpunit/php-code-coverage/src/Report/PHP.php index ccb104ce5..1f8186d04 100644 --- a/app/vendor/phpunit/php-code-coverage/src/Report/PHP.php +++ b/app/vendor/phpunit/php-code-coverage/src/Report/PHP.php @@ -12,6 +12,7 @@ use function dirname; use function file_put_contents; use function serialize; +use function strpos; use SebastianBergmann\CodeCoverage\CodeCoverage; use SebastianBergmann\CodeCoverage\Driver\WriteOperationFailedException; use SebastianBergmann\CodeCoverage\Util\Filesystem; @@ -20,11 +21,15 @@ final class PHP { public function process(CodeCoverage $coverage, ?string $target = null): string { + $coverage->clearCache(); + $buffer = " 'UNKNOWN', // PHPUnit_Runner_BaseTestRunner::STATUS_UNKNOWN 0 => 'PASSED', // PHPUnit_Runner_BaseTestRunner::STATUS_PASSED diff --git a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php index 00a6d8df1..6f8a04494 100644 --- a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php +++ b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CacheWarmer.php @@ -20,7 +20,9 @@ public function warmCache(string $cacheDirectory, bool $useAnnotationsForIgnorin new ParsingFileAnalyser( $useAnnotationsForIgnoringCode, $ignoreDeprecatedCode - ) + ), + $useAnnotationsForIgnoringCode, + $ignoreDeprecatedCode, ); foreach ($filter->files() as $file) { diff --git a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php index f53da078a..63e6e22ba 100644 --- a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php +++ b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/CachingFileAnalyser.php @@ -29,27 +29,39 @@ final class CachingFileAnalyser implements FileAnalyser */ private static $cacheVersion; + /** + * @var string + */ + private $directory; + /** * @var FileAnalyser */ private $analyser; /** - * @var array + * @var bool */ - private $cache = []; + private $useAnnotationsForIgnoringCode; /** - * @var string + * @var bool */ - private $directory; + private $ignoreDeprecatedCode; + + /** + * @var array + */ + private $cache = []; - public function __construct(string $directory, FileAnalyser $analyser) + public function __construct(string $directory, FileAnalyser $analyser, bool $useAnnotationsForIgnoringCode, bool $ignoreDeprecatedCode) { Filesystem::createDirectory($directory); - $this->analyser = $analyser; - $this->directory = $directory; + $this->analyser = $analyser; + $this->directory = $directory; + $this->useAnnotationsForIgnoringCode = $useAnnotationsForIgnoringCode; + $this->ignoreDeprecatedCode = $ignoreDeprecatedCode; } public function classesIn(string $filename): array @@ -161,7 +173,20 @@ private function write(string $filename, $data): void private function cacheFile(string $filename): string { - return $this->directory . DIRECTORY_SEPARATOR . md5($filename . "\0" . file_get_contents($filename) . "\0" . self::cacheVersion()); + $cacheKey = md5( + implode( + "\0", + [ + $filename, + file_get_contents($filename), + self::cacheVersion(), + $this->useAnnotationsForIgnoringCode, + $this->ignoreDeprecatedCode, + ] + ) + ); + + return $this->directory . DIRECTORY_SEPARATOR . $cacheKey; } private static function cacheVersion(): string diff --git a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php index 794084ff9..eadff1cf0 100644 --- a/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php +++ b/app/vendor/phpunit/php-code-coverage/src/StaticAnalysis/ExecutableLinesFindingVisitor.php @@ -101,6 +101,7 @@ public function enterNode(Node $node): void $node instanceof Node\Stmt\Else_ || $node instanceof Node\Stmt\EnumCase || $node instanceof Node\Stmt\Finally_ || + $node instanceof Node\Stmt\GroupUse || $node instanceof Node\Stmt\Label || $node instanceof Node\Stmt\Namespace_ || $node instanceof Node\Stmt\Nop || diff --git a/app/vendor/phpunit/php-code-coverage/src/Version.php b/app/vendor/phpunit/php-code-coverage/src/Version.php index 20e8e5504..9f0b1b923 100644 --- a/app/vendor/phpunit/php-code-coverage/src/Version.php +++ b/app/vendor/phpunit/php-code-coverage/src/Version.php @@ -22,7 +22,7 @@ final class Version public static function id(): string { if (self::$version === null) { - self::$version = (new VersionId('9.2.26', dirname(__DIR__)))->getVersion(); + self::$version = (new VersionId('9.2.29', dirname(__DIR__)))->getVersion(); } return self::$version; diff --git a/app/vendor/phpunit/phpunit/ChangeLog-8.5.md b/app/vendor/phpunit/phpunit/ChangeLog-8.5.md deleted file mode 100644 index a65e6a619..000000000 --- a/app/vendor/phpunit/phpunit/ChangeLog-8.5.md +++ /dev/null @@ -1,304 +0,0 @@ -# Changes in PHPUnit 8.5 - -All notable changes of the PHPUnit 8.5 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. - -## [8.5.33] - 2023-02-27 - -### Fixed - -* [#5186](https://github.com/sebastianbergmann/phpunit/issues/5186): SBOM does not validate - -## [8.5.32] - 2023-01-26 - -### Fixed - -* [#5120](https://github.com/sebastianbergmann/phpunit/issues/5120): Test Runner incorrectly treats `--testsuite` and `--list-tests` as not combinable options - -## [8.5.31] - 2022-10-28 - -### Fixed - -* [#5076](https://github.com/sebastianbergmann/phpunit/issues/5076): Test Runner does not warn about conflicting options - -## [8.5.30] - 2022-09-25 - -### Changed - -* The configuration generator now asks for a cache directory - -### Fixed - -* [#4913](https://github.com/sebastianbergmann/phpunit/issues/4913): Failed `assert()` should show a backtrace -* [#4966](https://github.com/sebastianbergmann/phpunit/issues/4966): `TestCase::assertSame()` (and related exact comparisons) must compare `float` exactly - -## [8.5.29] - 2022-08-22 - -### Changed - -* [#5033](https://github.com/sebastianbergmann/phpunit/issues/5033): Do not depend on phpspec/prophecy - -## [8.5.28] - 2022-07-29 - -### Fixed - -* [#5015](https://github.com/sebastianbergmann/phpunit/pull/5015): Ukraine banner unreadable on black background -* [#5016](https://github.com/sebastianbergmann/phpunit/issues/5016): PHPUnit 8.5.27 does not work on PHP 7.2.0-7.2.18 and PHP 7.3.0-7.3.5 - -## [8.5.27] - 2022-06-19 - -### Fixed - -* [#4950](https://github.com/sebastianbergmann/phpunit/issues/4950): False error on `atMost()` invocation rule without call -* [#4962](https://github.com/sebastianbergmann/phpunit/issues/4962): Ukraine banner unreadable on white background - -## [8.5.26] - 2022-04-01 - -### Fixed - -* [#4938](https://github.com/sebastianbergmann/phpunit/issues/4938): Test Double code generator does not handle `void` return type declaration on `__clone()` methods - -## [8.5.25] - 2022-03-16 - -### Fixed - -* [#4934](https://github.com/sebastianbergmann/phpunit/issues/4934): Code Coverage does not work with PHPUnit 8.5.24 PHAR on PHP 7 - -## [8.5.24] - 2022-03-05 - #StandWithUkraine - -### Changed - -* [#4874](https://github.com/sebastianbergmann/phpunit/pull/4874): `PHP_FLOAT_EPSILON` is now used instead of hardcoded `0.0000000001` in `PHPUnit\Framework\Constraint\IsIdentical` - -### Fixed - -* When the HTML code coverage report's configured low upper bound is larger than the high lower bound then the default values are used instead - -## [8.5.23] - 2022-01-21 - -### Fixed - -* [#4799](https://github.com/sebastianbergmann/phpunit/pull/4799): Memory leaks in `PHPUnit\Framework\TestSuite` class -* [#4857](https://github.com/sebastianbergmann/phpunit/pull/4857): Result of `debug_backtrace()` is not used correctly - -## [8.5.22] - 2021-12-25 - -### Changed - -* [#4812](https://github.com/sebastianbergmann/phpunit/issues/4812): Do not enforce time limits when a debugging session through DBGp is active -* [#4835](https://github.com/sebastianbergmann/phpunit/issues/4835): Support for `$GLOBALS['_composer_autoload_path']` introduced in Composer 2.2 - -### Fixed - -* [#4840](https://github.com/sebastianbergmann/phpunit/pull/4840): TestDox prettifying for class names does not correctly handle diacritics -* [#4846](https://github.com/sebastianbergmann/phpunit/pull/4846): Composer proxy script is not ignored - -## [8.5.21] - 2021-09-25 - -### Changed - -* PHPUnit no longer converts PHP deprecations to exceptions by default (configure `convertDeprecationsToExceptions="true"` to enable this) -* The PHPUnit XML configuration file generator now configures `convertDeprecationsToExceptions="true"` - -### Fixed - -* [#4772](https://github.com/sebastianbergmann/phpunit/pull/4772): TestDox HTML report not displayed correctly when browser has custom colour settings - -## [8.5.20] - 2021-08-31 - -### Fixed - -* [#4751](https://github.com/sebastianbergmann/phpunit/issues/4751): Configuration validation fails when using brackets in glob pattern - -## [8.5.19] - 2021-07-31 - -### Fixed - -* [#4740](https://github.com/sebastianbergmann/phpunit/issues/4740): `phpunit.phar` does not work with PHP 8.1 - -## [8.5.18] - 2021-07-19 - -### Fixed - -* [#4720](https://github.com/sebastianbergmann/phpunit/issues/4720): PHPUnit does not verify its own PHP extension requirements - -## [8.5.17] - 2021-06-23 - -### Changed - -* PHPUnit now errors out on startup when `PHP_VERSION` contains a value that is not compatible with `version_compare()`, for instance `X.Y.Z-(to be removed in future macOS)` - -## [8.5.16] - 2021-06-05 - -### Changed - -* The test result cache (the storage for which is implemented in `PHPUnit\Runner\DefaultTestResultCache`) no longer uses PHP's `serialize()` and `unserialize()` functions for persistence. It now uses a versioned JSON format instead that is independent of PHP implementation details (see [#3581](https://github.com/sebastianbergmann/phpunit/issues/3581) and [#4662](https://github.com/sebastianbergmann/phpunit/pull/4662) for examples why this is a problem). When PHPUnit tries to load the test result cache from a file that does not exist, or from a file that does not contain data in JSON format, or from a file that contains data in a JSON format version other than the one used by the currently running PHPUnit version, then this is considered to be a "cache miss". An empty `DefaultTestResultCache` object is created in this case. This should also prevent PHPUnit from crashing when trying to load a test result cache file created by a different version of PHPUnit (see [#4580](https://github.com/sebastianbergmann/phpunit/issues/4580) for example). - -### Fixed - -* [#4663](https://github.com/sebastianbergmann/phpunit/issues/4663): `TestCase::expectError()` works on PHP 7.3, but not on PHP >= 7.4 -* [#4678](https://github.com/sebastianbergmann/phpunit/pull/4678): Stubbed methods with `iterable` return types should return empty array by default -* [#4692](https://github.com/sebastianbergmann/phpunit/issues/4692): Annotations in single-line doc-comments are not handled correctly -* [#4694](https://github.com/sebastianbergmann/phpunit/issues/4694): `TestCase::getMockFromWsdl()` does not work with PHP 8.1-dev - -## [8.5.15] - 2021-03-17 - -### Fixed - -* [#4591](https://github.com/sebastianbergmann/phpunit/issues/4591): TeamCity logger logs warnings as test failures - -## [8.5.14] - 2021-01-17 - -### Fixed - -* [#4535](https://github.com/sebastianbergmann/phpunit/issues/4535): `getMockFromWsdl()` does not handle methods that do not have parameters correctly -* [#4572](https://github.com/sebastianbergmann/phpunit/issues/4572): Schema validation does not work with `%xx` sequences in path to `phpunit.xsd` -* [#4575](https://github.com/sebastianbergmann/phpunit/issues/4575): PHPUnit 8.5 incompatibility with PHP 8.1 - -## [8.5.13] - 2020-12-01 - -### Fixed - -* Running tests in isolated processes did not work with PHP 8 on Windows - -## [8.5.12] - 2020-11-30 - -### Changed - -* Changed PHP version constraint in `composer.json` from `^7.2` to `>=7.2` to allow the installation of PHPUnit 8.5 on PHP 8. Please note that the code coverage functionality is not available for PHPUnit 8.5 on PHP 8. - -### Fixed - -* [#4529](https://github.com/sebastianbergmann/phpunit/issues/4529): Debug mode of Xdebug 2 is not disabled for PHPT tests - -## [8.5.11] - 2020-11-27 - -### Changed - -* Bumped required version of `phpunit/php-code-coverage` - -## [8.5.10] - 2020-11-27 - -### Added - -* Support for Xdebug 3 - -### Fixed - -* [#4516](https://github.com/sebastianbergmann/phpunit/issues/4516): `phpunit/phpunit-selenium` does not work with PHPUnit 8.5.9 - -## [8.5.9] - 2020-11-10 - -### Fixed - -* [#3965](https://github.com/sebastianbergmann/phpunit/issues/3965): Process Isolation throws exceptions when PHPDBG is used -* [#4470](https://github.com/sebastianbergmann/phpunit/pull/4470): Infinite recursion when `--static-backup --strict-global-state` is used - -## [8.5.8] - 2020-06-22 - -### Fixed - -* [#4312](https://github.com/sebastianbergmann/phpunit/issues/4312): Fix for [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299) breaks backward compatibility - -## [8.5.7] - 2020-06-21 - -### Fixed - -* [#4299](https://github.com/sebastianbergmann/phpunit/issues/4299): "No tests executed" does not always result in exit code `1` -* [#4306](https://github.com/sebastianbergmann/phpunit/issues/4306): Exceptions during code coverage driver initialization are not handled correctly - -## [8.5.6] - 2020-06-15 - -### Fixed - -* [#4211](https://github.com/sebastianbergmann/phpunit/issues/4211): `phpdbg_*()` functions are scoped to `PHPUnit\phpdbg_*()` - -## [8.5.5] - 2020-05-22 - -### Fixed - -* [#4033](https://github.com/sebastianbergmann/phpunit/issues/4033): Unexpected behaviour when `$GLOBALS` is deleted - -## [8.5.4] - 2020-04-23 - -### Changed - -* Changed how `PHPUnit\TextUI\Command` passes warnings to `PHPUnit\TextUI\TestRunner` - -## [8.5.3] - 2020-03-31 - -### Fixed - -* [#4017](https://github.com/sebastianbergmann/phpunit/issues/4017): Do not suggest refactoring to something that is also deprecated -* [#4133](https://github.com/sebastianbergmann/phpunit/issues/4133): `expectExceptionMessageRegExp()` has been removed in PHPUnit 9 without a deprecation warning being given in PHPUnit 8 -* [#4139](https://github.com/sebastianbergmann/phpunit/issues/4139): Cannot double interfaces that declare a constructor with PHP 8 -* [#4144](https://github.com/sebastianbergmann/phpunit/issues/4144): Empty objects are converted to empty arrays in JSON comparison failure diff - -## [8.5.2] - 2020-01-08 - -### Removed - -* `eval-stdin.php` has been removed, it was not used anymore since PHPUnit 7.2.7 - -## [8.5.1] - 2019-12-25 - -### Changed - -* `eval-stdin.php` can now only be executed with `cli` and `phpdbg` - -### Fixed - -* [#3983](https://github.com/sebastianbergmann/phpunit/issues/3983): Deprecation warning given too eagerly - -## [8.5.0] - 2019-12-06 - -### Added - -* [#3911](https://github.com/sebastianbergmann/phpunit/issues/3911): Support combined use of `addMethods()` and `onlyMethods()` -* [#3949](https://github.com/sebastianbergmann/phpunit/issues/3949): Introduce specialized assertions `assertFileEqualsCanonicalizing()`, `assertFileEqualsIgnoringCase()`, `assertStringEqualsFileCanonicalizing()`, `assertStringEqualsFileIgnoringCase()`, `assertFileNotEqualsCanonicalizing()`, `assertFileNotEqualsIgnoringCase()`, `assertStringNotEqualsFileCanonicalizing()`, and `assertStringNotEqualsFileIgnoringCase()` as alternative to using `assertFileEquals()` etc. with optional parameters - -### Changed - -* [#3860](https://github.com/sebastianbergmann/phpunit/pull/3860): Deprecate invoking PHPUnit commandline test runner with just a class name -* [#3950](https://github.com/sebastianbergmann/phpunit/issues/3950): Deprecate optional parameters of `assertFileEquals()` etc. -* [#3955](https://github.com/sebastianbergmann/phpunit/issues/3955): Deprecate support for doubling multiple interfaces - -### Fixed - -* [#3953](https://github.com/sebastianbergmann/phpunit/issues/3953): Code Coverage for test executed in isolation does not work when the PHAR is used -* [#3967](https://github.com/sebastianbergmann/phpunit/issues/3967): Cannot double interface that extends interface that extends `\Throwable` -* [#3968](https://github.com/sebastianbergmann/phpunit/pull/3968): Test class run in a separate PHP process are passing when `exit` called inside - -[8.5.33]: https://github.com/sebastianbergmann/phpunit/compare/8.5.32...8.5.33 -[8.5.32]: https://github.com/sebastianbergmann/phpunit/compare/8.5.31...8.5.32 -[8.5.31]: https://github.com/sebastianbergmann/phpunit/compare/8.5.30...8.5.31 -[8.5.30]: https://github.com/sebastianbergmann/phpunit/compare/8.5.29...8.5.30 -[8.5.29]: https://github.com/sebastianbergmann/phpunit/compare/8.5.28...8.5.29 -[8.5.28]: https://github.com/sebastianbergmann/phpunit/compare/8.5.27...8.5.28 -[8.5.27]: https://github.com/sebastianbergmann/phpunit/compare/8.5.26...8.5.27 -[8.5.26]: https://github.com/sebastianbergmann/phpunit/compare/8.5.25...8.5.26 -[8.5.25]: https://github.com/sebastianbergmann/phpunit/compare/8.5.24...8.5.25 -[8.5.24]: https://github.com/sebastianbergmann/phpunit/compare/8.5.23...8.5.24 -[8.5.23]: https://github.com/sebastianbergmann/phpunit/compare/8.5.22...8.5.23 -[8.5.22]: https://github.com/sebastianbergmann/phpunit/compare/8.5.21...8.5.22 -[8.5.21]: https://github.com/sebastianbergmann/phpunit/compare/8.5.20...8.5.21 -[8.5.20]: https://github.com/sebastianbergmann/phpunit/compare/8.5.19...8.5.20 -[8.5.19]: https://github.com/sebastianbergmann/phpunit/compare/8.5.18...8.5.19 -[8.5.18]: https://github.com/sebastianbergmann/phpunit/compare/8.5.17...8.5.18 -[8.5.17]: https://github.com/sebastianbergmann/phpunit/compare/8.5.16...8.5.17 -[8.5.16]: https://github.com/sebastianbergmann/phpunit/compare/8.5.15...8.5.16 -[8.5.15]: https://github.com/sebastianbergmann/phpunit/compare/8.5.14...8.5.15 -[8.5.14]: https://github.com/sebastianbergmann/phpunit/compare/8.5.13...8.5.14 -[8.5.13]: https://github.com/sebastianbergmann/phpunit/compare/8.5.12...8.5.13 -[8.5.12]: https://github.com/sebastianbergmann/phpunit/compare/8.5.11...8.5.12 -[8.5.11]: https://github.com/sebastianbergmann/phpunit/compare/8.5.10...8.5.11 -[8.5.10]: https://github.com/sebastianbergmann/phpunit/compare/8.5.9...8.5.10 -[8.5.9]: https://github.com/sebastianbergmann/phpunit/compare/8.5.8...8.5.9 -[8.5.8]: https://github.com/sebastianbergmann/phpunit/compare/8.5.7...8.5.8 -[8.5.7]: https://github.com/sebastianbergmann/phpunit/compare/8.5.6...8.5.7 -[8.5.6]: https://github.com/sebastianbergmann/phpunit/compare/8.5.5...8.5.6 -[8.5.5]: https://github.com/sebastianbergmann/phpunit/compare/8.5.4...8.5.5 -[8.5.4]: https://github.com/sebastianbergmann/phpunit/compare/8.5.3...8.5.4 -[8.5.3]: https://github.com/sebastianbergmann/phpunit/compare/8.5.2...8.5.3 -[8.5.2]: https://github.com/sebastianbergmann/phpunit/compare/8.5.1...8.5.2 -[8.5.1]: https://github.com/sebastianbergmann/phpunit/compare/8.5.0...8.5.1 -[8.5.0]: https://github.com/sebastianbergmann/phpunit/compare/8.4.3...8.5.0 diff --git a/app/vendor/phpunit/phpunit/ChangeLog-9.6.md b/app/vendor/phpunit/phpunit/ChangeLog-9.6.md index 8303e3dea..8fb7ed9e9 100644 --- a/app/vendor/phpunit/phpunit/ChangeLog-9.6.md +++ b/app/vendor/phpunit/phpunit/ChangeLog-9.6.md @@ -2,6 +2,49 @@ All notable changes of the PHPUnit 9.6 release series are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [9.6.13] - 2023-09-19 + +### Changed + +* The child processes used for process isolation now use temporary files to communicate their result to the parent process + +## [9.6.12] - 2023-09-12 + +### Changed + +* [#5508](https://github.com/sebastianbergmann/phpunit/pull/5508): Generate code coverage report in PHP format as first in list to avoid serializing cache data + +## [9.6.11] - 2023-08-19 + +### Added + +* [#5478](https://github.com/sebastianbergmann/phpunit/pull/5478): `assertObjectHasProperty()` and `assertObjectNotHasProperty()` + +## [9.6.10] - 2023-07-10 + +### Changed + +* [#5419](https://github.com/sebastianbergmann/phpunit/pull/5419): Allow empty `` element in XML configuration + +## [9.6.9] - 2023-06-11 + +### Fixed + +* [#5405](https://github.com/sebastianbergmann/phpunit/issues/5405): XML configuration migration does not migrate `whitelist/file` elements +* Always use `X.Y.Z` version number (and not just `X.Y`) of PHPUnit's version when checking whether a PHAR-distributed extension is compatible + +## [9.6.8] - 2023-05-11 + +### Fixed + +* [#5345](https://github.com/sebastianbergmann/phpunit/issues/5345): No stack trace shown for previous exceptions during bootstrap + +## [9.6.7] - 2023-04-14 + +### Fixed + +* Tests that have `@doesNotPerformAssertions` do not contribute to code coverage + ## [9.6.6] - 2023-03-27 ### Fixed @@ -52,6 +95,13 @@ All notable changes of the PHPUnit 9.6 release series are documented in this fil * [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064): Deprecate `PHPUnit\Framework\TestCase::getMockClass()` * [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132): Deprecate `Test` suffix for abstract test case classes +[9.6.13]: https://github.com/sebastianbergmann/phpunit/compare/9.6.12...9.6.13 +[9.6.12]: https://github.com/sebastianbergmann/phpunit/compare/9.6.11...9.6.12 +[9.6.11]: https://github.com/sebastianbergmann/phpunit/compare/9.6.10...9.6.11 +[9.6.10]: https://github.com/sebastianbergmann/phpunit/compare/9.6.9...9.6.10 +[9.6.9]: https://github.com/sebastianbergmann/phpunit/compare/9.6.8...9.6.9 +[9.6.8]: https://github.com/sebastianbergmann/phpunit/compare/9.6.7...9.6.8 +[9.6.7]: https://github.com/sebastianbergmann/phpunit/compare/9.6.6...9.6.7 [9.6.6]: https://github.com/sebastianbergmann/phpunit/compare/9.6.5...9.6.6 [9.6.5]: https://github.com/sebastianbergmann/phpunit/compare/9.6.4...9.6.5 [9.6.4]: https://github.com/sebastianbergmann/phpunit/compare/9.6.3...9.6.4 diff --git a/app/vendor/phpunit/phpunit/DEPRECATIONS.md b/app/vendor/phpunit/phpunit/DEPRECATIONS.md new file mode 100644 index 000000000..b8349592b --- /dev/null +++ b/app/vendor/phpunit/phpunit/DEPRECATIONS.md @@ -0,0 +1,89 @@ +# Deprecations + +## Soft Deprecations + +This functionality is currently [soft-deprecated](https://phpunit.de/backward-compatibility.html#soft-deprecation): + +### Writing Tests + +#### Test Double API + +| Issue | Description | Since | Replacement | +|-------------------------------------------------------------------|-----------------------------------|-------|-------------| +| [#3687](https://github.com/sebastianbergmann/phpunit/issues/3687) | `MockBuilder::setMethods()` | 8.3.0 | | +| [#3687](https://github.com/sebastianbergmann/phpunit/issues/3687) | `MockBuilder::setMethodsExcept()` | 9.6.0 | | + +## Hard Deprecations + +This functionality is currently [hard-deprecated](https://phpunit.de/backward-compatibility.html#hard-deprecation): + +### Writing Tests + +#### Assertions, Constraints, and Expectations + +| Issue | Description | Since | Replacement | +|-------------------------------------------------------------------|------------------------------------------------|-------|---------------------------------------------------| +| [#4062](https://github.com/sebastianbergmann/phpunit/issues/4062) | `TestCase::assertNotIsReadable()` | 9.1.0 | `TestCase::assertIsNotReadable()` | +| [#4065](https://github.com/sebastianbergmann/phpunit/issues/4065) | `TestCase::assertNotIsWritable()` | 9.1.0 | `TestCase::assertIsNotWritable()` | +| [#4068](https://github.com/sebastianbergmann/phpunit/issues/4068) | `TestCase::assertDirectoryNotExists()` | 9.1.0 | `TestCase::assertDirectoryDoesNotExist()` | +| [#4071](https://github.com/sebastianbergmann/phpunit/issues/4071) | `TestCase::assertDirectoryNotIsReadable()` | 9.1.0 | `TestCase::assertDirectoryIsNotReadable()` | +| [#4074](https://github.com/sebastianbergmann/phpunit/issues/4074) | `TestCase::assertDirectoryNotIsWritable()` | 9.1.0 | `TestCase::assertDirectoryIsNotWritable()` | +| [#4077](https://github.com/sebastianbergmann/phpunit/issues/4077) | `TestCase::assertFileNotExists()` | 9.1.0 | `TestCase::assertFileDoesNotExist()` | +| [#4080](https://github.com/sebastianbergmann/phpunit/issues/4080) | `TestCase::assertFileNotIsReadable()` | 9.1.0 | `TestCase::assertFileIsNotReadable()` | +| [#4083](https://github.com/sebastianbergmann/phpunit/issues/4083) | `TestCase::assertFileNotIsWritable()` | 9.1.0 | `TestCase::assertFileIsNotWritable()` | +| [#4086](https://github.com/sebastianbergmann/phpunit/issues/4086) | `TestCase::assertRegExp()` | 9.1.0 | `TestCase::assertMatchesRegularExpression()` | +| [#4089](https://github.com/sebastianbergmann/phpunit/issues/4089) | `TestCase::assertNotRegExp()` | 9.1.0 | `TestCase::assertDoesNotMatchRegularExpression()` | +| [#4091](https://github.com/sebastianbergmann/phpunit/issues/4091) | `TestCase::assertEqualXMLStructure()` | 9.1.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecation()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecationMessage()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectDeprecationMessageMatches()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectError()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectErrorMessage()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectErrorMessageMatches()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNotice()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNoticeMessage()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectNoticeMessageMatches()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarning()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarningMessage()` | 9.6.0 | | +| [#5062](https://github.com/sebastianbergmann/phpunit/issues/5062) | `TestCase::expectWarningMessageMatches()` | 9.6.0 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassHasAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassNotHasAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassHasStaticAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertClassNotHasStaticAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertObjectHasAttribute()` | 9.6.1 | `TestCase::assertObjectHasProperty()` | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::assertObjectNotHasAttribute()` | 9.6.1 | `TestCase::assertObjectNotHasProperty()` | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::classHasAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::classHasStaticAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `TestCase::objectHasAttribute()` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ClassHasAttribute` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ClassHasStaticAttribute` | 9.6.1 | | +| [#4601](https://github.com/sebastianbergmann/phpunit/issues/4601) | `ObjectHasAttribute` | 9.6.1 | `ObjectHasProperty` | + +#### Test Double API + +| Issue | Description | Since | Replacement | +|-------------------------------------------------------------------|---------------------------------------|-------|-------------------------------------------------------------------------| +| [#4141](https://github.com/sebastianbergmann/phpunit/issues/4141) | `TestCase::prophesize()` | 9.1.0 | [phpspec/prophecy-phpunit](https://github.com/phpspec/prophecy-phpunit) | +| [#4297](https://github.com/sebastianbergmann/phpunit/issues/4297) | `TestCase::at()` | 9.3.0 | | +| [#4297](https://github.com/sebastianbergmann/phpunit/issues/4297) | `InvokedAtIndex` | 9.3.0 | | +| [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063) | `InvocationMocker::withConsecutive()` | 9.6.0 | | +| [#5063](https://github.com/sebastianbergmann/phpunit/issues/5063) | `ConsecutiveParameters` | 9.6.0 | | +| [#5064](https://github.com/sebastianbergmann/phpunit/issues/5064) | `TestCase::getMockClass()` | 9.6.0 | | + +#### Miscellaneous + +| Issue | Description | Since | Replacement | +|-------------------------------------------------------------------|----------------------------------------------|-------|------------------------------------------------| +| [#5132](https://github.com/sebastianbergmann/phpunit/issues/5132) | `Test` suffix for abstract test case classes | | | +| | `TestCase::$backupGlobalsBlacklist` | 9.3.0 | `TestCase::$backupGlobalsExcludeList` | +| | `TestCase::$backupStaticAttributesBlacklist` | 9.3.0 | `TestCase::$backupStaticAttributesExcludeList` | + +### Extending PHPUnit + +| Issue | Description | Since | Replacement | +|-------------------------------------------------------------------|--------------------------------------|-------|-------------------------------------------------------------| +| [#4676](https://github.com/sebastianbergmann/phpunit/issues/4676) | `TestListener` | 8.0.0 | [Event System](https://docs.phpunit.de/en/10.3/events.html) | +| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `Command::handleLoader()` | 9.1.0 | | +| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `TestSuiteLoader` | 9.1.0 | | +| [#4039](https://github.com/sebastianbergmann/phpunit/issues/4039) | `StandardTestSuiteLoader` | 9.1.0 | | +| [#4676](https://github.com/sebastianbergmann/phpunit/issues/4676) | `TestListenerDefaultImplementation` | 8.2.4 | [Event System](https://docs.phpunit.de/en/10.3/events.html) | diff --git a/app/vendor/phpunit/phpunit/README.md b/app/vendor/phpunit/phpunit/README.md index ffc8bf323..c561c5942 100644 --- a/app/vendor/phpunit/phpunit/README.md +++ b/app/vendor/phpunit/phpunit/README.md @@ -25,7 +25,7 @@ Alternatively, you may use [Composer](https://getcomposer.org/) to download and ## Contribute -Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/master/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. +Please refer to [CONTRIBUTING.md](https://github.com/sebastianbergmann/phpunit/blob/main/.github/CONTRIBUTING.md) for information on how to contribute to PHPUnit and its related projects. ## List of Contributors diff --git a/app/vendor/phpunit/phpunit/composer.json b/app/vendor/phpunit/phpunit/composer.json index 28411d9b9..42e16c6f3 100644 --- a/app/vendor/phpunit/phpunit/composer.json +++ b/app/vendor/phpunit/phpunit/composer.json @@ -33,7 +33,7 @@ "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-code-coverage": "^9.2.28", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", diff --git a/app/vendor/phpunit/phpunit/phpunit b/app/vendor/phpunit/phpunit/phpunit index 92cc3aa44..b9f5cf29d 100755 --- a/app/vendor/phpunit/phpunit/phpunit +++ b/app/vendor/phpunit/phpunit/phpunit @@ -52,9 +52,9 @@ if ([] !== $unavailableExtensions) { STDERR, sprintf( 'PHPUnit requires the "%s" extensions, but the "%s" %s not available.' . PHP_EOL, - count($unavailableExtensions) === 1 ? 'extension is' : 'extensions are', implode('", "', $requiredExtensions), - implode('", "', $unavailableExtensions) + implode('", "', $unavailableExtensions), + count($unavailableExtensions) === 1 ? 'extension is' : 'extensions are' ) ); diff --git a/app/vendor/phpunit/phpunit/phpunit.xsd b/app/vendor/phpunit/phpunit/phpunit.xsd index 7fa2f6b67..619434ef8 100644 --- a/app/vendor/phpunit/phpunit/phpunit.xsd +++ b/app/vendor/phpunit/phpunit/phpunit.xsd @@ -57,7 +57,7 @@ - + diff --git a/app/vendor/phpunit/phpunit/src/Framework/Assert.php b/app/vendor/phpunit/phpunit/src/Framework/Assert.php index 156220a51..8724fae7b 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Assert.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Assert.php @@ -73,6 +73,7 @@ use PHPUnit\Framework\Constraint\LogicalXor; use PHPUnit\Framework\Constraint\ObjectEquals; use PHPUnit\Framework\Constraint\ObjectHasAttribute; +use PHPUnit\Framework\Constraint\ObjectHasProperty; use PHPUnit\Framework\Constraint\RegularExpression; use PHPUnit\Framework\Constraint\SameSize; use PHPUnit\Framework\Constraint\StringContains; @@ -111,14 +112,14 @@ public static function assertArrayHasKey($key, $array, string $message = ''): vo if (!(is_int($key) || is_string($key))) { throw InvalidArgumentException::create( 1, - 'integer or string' + 'integer or string', ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw InvalidArgumentException::create( 2, - 'array or ArrayAccess' + 'array or ArrayAccess', ); } @@ -142,19 +143,19 @@ public static function assertArrayNotHasKey($key, $array, string $message = ''): if (!(is_int($key) || is_string($key))) { throw InvalidArgumentException::create( 1, - 'integer or string' + 'integer or string', ); } if (!(is_array($array) || $array instanceof ArrayAccess)) { throw InvalidArgumentException::create( 2, - 'array or ArrayAccess' + 'array or ArrayAccess', ); } $constraint = new LogicalNot( - new ArrayHasKey($key) + new ArrayHasKey($key), ); static::assertThat($array, $constraint, $message); @@ -191,7 +192,7 @@ public static function assertContainsEquals($needle, iterable $haystack, string public static function assertNotContains($needle, iterable $haystack, string $message = ''): void { $constraint = new LogicalNot( - new TraversableContainsIdentical($needle) + new TraversableContainsIdentical($needle), ); static::assertThat($haystack, $constraint, $message); @@ -220,9 +221,9 @@ public static function assertContainsOnly(string $type, iterable $haystack, ?boo $haystack, new TraversableContainsOnly( $type, - $isNativeType + $isNativeType, ), - $message + $message, ); } @@ -238,9 +239,9 @@ public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, new TraversableContainsOnly( $className, - false + false, ), - $message + $message, ); } @@ -261,10 +262,10 @@ public static function assertNotContainsOnly(string $type, iterable $haystack, ? new LogicalNot( new TraversableContainsOnly( $type, - $isNativeType - ) + $isNativeType, + ), ), - $message + $message, ); } @@ -290,7 +291,7 @@ public static function assertCount(int $expectedCount, $haystack, string $messag static::assertThat( $haystack, new Count($expectedCount), - $message + $message, ); } @@ -314,7 +315,7 @@ public static function assertNotCount(int $expectedCount, $haystack, string $mes } $constraint = new LogicalNot( - new Count($expectedCount) + new Count($expectedCount), ); static::assertThat($haystack, $constraint, $message); @@ -369,7 +370,7 @@ public static function assertEqualsWithDelta($expected, $actual, float $delta, s { $constraint = new IsEqualWithDelta( $expected, - $delta + $delta, ); static::assertThat($actual, $constraint, $message); @@ -384,7 +385,7 @@ public static function assertEqualsWithDelta($expected, $actual, float $delta, s public static function assertNotEquals($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( - new IsEqual($expected) + new IsEqual($expected), ); static::assertThat($actual, $constraint, $message); @@ -399,7 +400,7 @@ public static function assertNotEquals($expected, $actual, string $message = '') public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( - new IsEqualCanonicalizing($expected) + new IsEqualCanonicalizing($expected), ); static::assertThat($actual, $constraint, $message); @@ -414,7 +415,7 @@ public static function assertNotEqualsCanonicalizing($expected, $actual, string public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void { $constraint = new LogicalNot( - new IsEqualIgnoringCase($expected) + new IsEqualIgnoringCase($expected), ); static::assertThat($actual, $constraint, $message); @@ -431,8 +432,8 @@ public static function assertNotEqualsWithDelta($expected, $actual, float $delta $constraint = new LogicalNot( new IsEqualWithDelta( $expected, - $delta - ) + $delta, + ), ); static::assertThat($actual, $constraint, $message); @@ -446,7 +447,7 @@ public static function assertObjectEquals(object $expected, object $actual, stri static::assertThat( $actual, static::objectEquals($expected, $method), - $message + $message, ); } @@ -506,7 +507,7 @@ public static function assertGreaterThanOrEqual($expected, $actual, string $mess static::assertThat( $actual, static::greaterThanOrEqual($expected), - $message + $message, ); } @@ -562,7 +563,7 @@ public static function assertFileEqualsCanonicalizing(string $expected, string $ static::assertFileExists($actual, $message); $constraint = new IsEqualCanonicalizing( - file_get_contents($expected) + file_get_contents($expected), ); static::assertThat(file_get_contents($actual), $constraint, $message); @@ -598,7 +599,7 @@ public static function assertFileNotEquals(string $expected, string $actual, str static::assertFileExists($actual, $message); $constraint = new LogicalNot( - new IsEqual(file_get_contents($expected)) + new IsEqual(file_get_contents($expected)), ); static::assertThat(file_get_contents($actual), $constraint, $message); @@ -617,7 +618,7 @@ public static function assertFileNotEqualsCanonicalizing(string $expected, strin static::assertFileExists($actual, $message); $constraint = new LogicalNot( - new IsEqualCanonicalizing(file_get_contents($expected)) + new IsEqualCanonicalizing(file_get_contents($expected)), ); static::assertThat(file_get_contents($actual), $constraint, $message); @@ -636,7 +637,7 @@ public static function assertFileNotEqualsIgnoringCase(string $expected, string static::assertFileExists($actual, $message); $constraint = new LogicalNot( - new IsEqualIgnoringCase(file_get_contents($expected)) + new IsEqualIgnoringCase(file_get_contents($expected)), ); static::assertThat(file_get_contents($actual), $constraint, $message); @@ -702,7 +703,7 @@ public static function assertStringNotEqualsFile(string $expectedFile, string $a static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( - new IsEqual(file_get_contents($expectedFile)) + new IsEqual(file_get_contents($expectedFile)), ); static::assertThat($actualString, $constraint, $message); @@ -720,7 +721,7 @@ public static function assertStringNotEqualsFileCanonicalizing(string $expectedF static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( - new IsEqualCanonicalizing(file_get_contents($expectedFile)) + new IsEqualCanonicalizing(file_get_contents($expectedFile)), ); static::assertThat($actualString, $constraint, $message); @@ -738,7 +739,7 @@ public static function assertStringNotEqualsFileIgnoringCase(string $expectedFil static::assertFileExists($expectedFile, $message); $constraint = new LogicalNot( - new IsEqualIgnoringCase(file_get_contents($expectedFile)) + new IsEqualIgnoringCase(file_get_contents($expectedFile)), ); static::assertThat($actualString, $constraint, $message); @@ -1227,9 +1228,9 @@ public static function assertClassNotHasAttribute(string $attributeName, string static::assertThat( $className, new LogicalNot( - new ClassHasAttribute($attributeName) + new ClassHasAttribute($attributeName), ), - $message + $message, ); } @@ -1257,7 +1258,7 @@ public static function assertClassHasStaticAttribute(string $attributeName, stri static::assertThat( $className, new ClassHasStaticAttribute($attributeName), - $message + $message, ); } @@ -1285,9 +1286,9 @@ public static function assertClassNotHasStaticAttribute(string $attributeName, s static::assertThat( $className, new LogicalNot( - new ClassHasStaticAttribute($attributeName) + new ClassHasStaticAttribute($attributeName), ), - $message + $message, ); } @@ -1304,7 +1305,7 @@ public static function assertClassNotHasStaticAttribute(string $attributeName, s */ public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void { - self::createWarning('assertObjectHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + self::createWarning('assertObjectHasAttribute() is deprecated and will be removed in PHPUnit 10. Refactor your test to use assertObjectHasProperty() instead.'); if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); @@ -1317,7 +1318,7 @@ public static function assertObjectHasAttribute(string $attributeName, $object, static::assertThat( $object, new ObjectHasAttribute($attributeName), - $message + $message, ); } @@ -1334,7 +1335,7 @@ public static function assertObjectHasAttribute(string $attributeName, $object, */ public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void { - self::createWarning('assertObjectNotHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + self::createWarning('assertObjectNotHasAttribute() is deprecated and will be removed in PHPUnit 10. Refactor your test to use assertObjectNotHasProperty() instead.'); if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); @@ -1347,9 +1348,39 @@ public static function assertObjectNotHasAttribute(string $attributeName, $objec static::assertThat( $object, new LogicalNot( - new ObjectHasAttribute($attributeName) + new ObjectHasAttribute($attributeName), + ), + $message, + ); + } + + /** + * Asserts that an object has a specified property. + * + * @throws ExpectationFailedException + */ + final public static function assertObjectHasProperty(string $propertyName, object $object, string $message = ''): void + { + static::assertThat( + $object, + new ObjectHasProperty($propertyName), + $message, + ); + } + + /** + * Asserts that an object does not have a specified property. + * + * @throws ExpectationFailedException + */ + final public static function assertObjectNotHasProperty(string $propertyName, object $object, string $message = ''): void + { + static::assertThat( + $object, + new LogicalNot( + new ObjectHasProperty($propertyName), ), - $message + $message, ); } @@ -1372,7 +1403,7 @@ public static function assertSame($expected, $actual, string $message = ''): voi static::assertThat( $actual, new IsIdentical($expected), - $message + $message, ); } @@ -1393,9 +1424,9 @@ public static function assertNotSame($expected, $actual, string $message = ''): static::assertThat( $actual, new LogicalNot( - new IsIdentical($expected) + new IsIdentical($expected), ), - $message + $message, ); } @@ -1421,7 +1452,7 @@ public static function assertInstanceOf(string $expected, $actual, string $messa static::assertThat( $actual, new IsInstanceOf($expected), - $message + $message, ); } @@ -1447,9 +1478,9 @@ public static function assertNotInstanceOf(string $expected, $actual, string $me static::assertThat( $actual, new LogicalNot( - new IsInstanceOf($expected) + new IsInstanceOf($expected), ), - $message + $message, ); } @@ -1466,7 +1497,7 @@ public static function assertIsArray($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_ARRAY), - $message + $message, ); } @@ -1483,7 +1514,7 @@ public static function assertIsBool($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_BOOL), - $message + $message, ); } @@ -1500,7 +1531,7 @@ public static function assertIsFloat($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_FLOAT), - $message + $message, ); } @@ -1517,7 +1548,7 @@ public static function assertIsInt($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_INT), - $message + $message, ); } @@ -1534,7 +1565,7 @@ public static function assertIsNumeric($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_NUMERIC), - $message + $message, ); } @@ -1551,7 +1582,7 @@ public static function assertIsObject($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_OBJECT), - $message + $message, ); } @@ -1568,7 +1599,7 @@ public static function assertIsResource($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_RESOURCE), - $message + $message, ); } @@ -1585,7 +1616,7 @@ public static function assertIsClosedResource($actual, string $message = ''): vo static::assertThat( $actual, new IsType(IsType::TYPE_CLOSED_RESOURCE), - $message + $message, ); } @@ -1602,7 +1633,7 @@ public static function assertIsString($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_STRING), - $message + $message, ); } @@ -1619,7 +1650,7 @@ public static function assertIsScalar($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_SCALAR), - $message + $message, ); } @@ -1636,7 +1667,7 @@ public static function assertIsCallable($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_CALLABLE), - $message + $message, ); } @@ -1653,7 +1684,7 @@ public static function assertIsIterable($actual, string $message = ''): void static::assertThat( $actual, new IsType(IsType::TYPE_ITERABLE), - $message + $message, ); } @@ -1670,7 +1701,7 @@ public static function assertIsNotArray($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_ARRAY)), - $message + $message, ); } @@ -1687,7 +1718,7 @@ public static function assertIsNotBool($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_BOOL)), - $message + $message, ); } @@ -1704,7 +1735,7 @@ public static function assertIsNotFloat($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_FLOAT)), - $message + $message, ); } @@ -1721,7 +1752,7 @@ public static function assertIsNotInt($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_INT)), - $message + $message, ); } @@ -1738,7 +1769,7 @@ public static function assertIsNotNumeric($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_NUMERIC)), - $message + $message, ); } @@ -1755,7 +1786,7 @@ public static function assertIsNotObject($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_OBJECT)), - $message + $message, ); } @@ -1772,7 +1803,7 @@ public static function assertIsNotResource($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_RESOURCE)), - $message + $message, ); } @@ -1789,7 +1820,7 @@ public static function assertIsNotClosedResource($actual, string $message = ''): static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_CLOSED_RESOURCE)), - $message + $message, ); } @@ -1806,7 +1837,7 @@ public static function assertIsNotString($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_STRING)), - $message + $message, ); } @@ -1823,7 +1854,7 @@ public static function assertIsNotScalar($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_SCALAR)), - $message + $message, ); } @@ -1840,7 +1871,7 @@ public static function assertIsNotCallable($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_CALLABLE)), - $message + $message, ); } @@ -1857,7 +1888,7 @@ public static function assertIsNotIterable($actual, string $message = ''): void static::assertThat( $actual, new LogicalNot(new IsType(IsType::TYPE_ITERABLE)), - $message + $message, ); } @@ -1900,9 +1931,9 @@ public static function assertDoesNotMatchRegularExpression(string $pattern, stri static::assertThat( $string, new LogicalNot( - new RegularExpression($pattern) + new RegularExpression($pattern), ), - $message + $message, ); } @@ -1923,9 +1954,9 @@ public static function assertNotRegExp(string $pattern, string $string, string $ static::assertThat( $string, new LogicalNot( - new RegularExpression($pattern) + new RegularExpression($pattern), ), - $message + $message, ); } @@ -1961,7 +1992,7 @@ public static function assertSameSize($expected, $actual, string $message = ''): static::assertThat( $actual, new SameSize($expected), - $message + $message, ); } @@ -1997,9 +2028,9 @@ public static function assertNotSameSize($expected, $actual, string $message = ' static::assertThat( $actual, new LogicalNot( - new SameSize($expected) + new SameSize($expected), ), - $message + $message, ); } @@ -2025,9 +2056,9 @@ public static function assertStringNotMatchesFormat(string $format, string $stri static::assertThat( $string, new LogicalNot( - new StringMatchesFormatDescription($format) + new StringMatchesFormatDescription($format), ), - $message + $message, ); } @@ -2044,9 +2075,9 @@ public static function assertStringMatchesFormatFile(string $formatFile, string static::assertThat( $string, new StringMatchesFormatDescription( - file_get_contents($formatFile) + file_get_contents($formatFile), ), - $message + $message, ); } @@ -2064,10 +2095,10 @@ public static function assertStringNotMatchesFormatFile(string $formatFile, stri $string, new LogicalNot( new StringMatchesFormatDescription( - file_get_contents($formatFile) - ) + file_get_contents($formatFile), + ), ), - $message + $message, ); } @@ -2096,9 +2127,9 @@ public static function assertStringStartsNotWith($prefix, $string, string $messa static::assertThat( $string, new LogicalNot( - new StringStartsWith($prefix) + new StringStartsWith($prefix), ), - $message + $message, ); } @@ -2168,9 +2199,9 @@ public static function assertStringEndsNotWith(string $suffix, string $string, s static::assertThat( $string, new LogicalNot( - new StringEndsWith($suffix) + new StringEndsWith($suffix), ), - $message + $message, ); } @@ -2335,7 +2366,7 @@ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOME static::assertSame( $expectedElement->tagName, $actualElement->tagName, - $message + $message, ); if ($checkAttributes) { @@ -2346,8 +2377,8 @@ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOME '%s%sNumber of attributes on node "%s" does not match', $message, !empty($message) ? "\n" : '', - $expectedElement->tagName - ) + $expectedElement->tagName, + ), ); for ($i = 0; $i < $expectedElement->attributes->length; $i++) { @@ -2363,8 +2394,8 @@ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOME $message, !empty($message) ? "\n" : '', $expectedAttribute->name, - $expectedElement->tagName - ) + $expectedElement->tagName, + ), ); } } @@ -2380,8 +2411,8 @@ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOME '%s%sNumber of child nodes of "%s" differs', $message, !empty($message) ? "\n" : '', - $expectedElement->tagName - ) + $expectedElement->tagName, + ), ); for ($i = 0; $i < $expectedElement->childNodes->length; $i++) { @@ -2389,7 +2420,7 @@ public static function assertEqualXMLStructure(DOMElement $expectedElement, DOME $expectedElement->childNodes->item($i), $actualElement->childNodes->item($i), $checkAttributes, - $message + $message, ); } } @@ -2449,9 +2480,9 @@ public static function assertJsonStringNotEqualsJsonString($expectedJson, $actua static::assertThat( $actualJson, new LogicalNot( - new JsonMatches($expectedJson) + new JsonMatches($expectedJson), ), - $message + $message, ); } @@ -2489,9 +2520,9 @@ public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, s static::assertThat( $actualJson, new LogicalNot( - new JsonMatches($expectedJson) + new JsonMatches($expectedJson), ), - $message + $message, ); } @@ -2513,7 +2544,7 @@ public static function assertJsonFileEqualsJsonFile(string $expectedFile, string static::assertJson($actualJson, $message); $constraintExpected = new JsonMatches( - $expectedJson + $expectedJson, ); $constraintActual = new JsonMatches($actualJson); @@ -2540,7 +2571,7 @@ public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, str static::assertJson($actualJson, $message); $constraintExpected = new JsonMatches( - $expectedJson + $expectedJson, ); $constraintActual = new JsonMatches($actualJson); @@ -2721,7 +2752,7 @@ public static function greaterThanOrEqual($value): LogicalOr { return static::logicalOr( new IsEqual($value), - new GreaterThan($value) + new GreaterThan($value), ); } @@ -2779,7 +2810,7 @@ public static function lessThanOrEqual($value): LogicalOr { return static::logicalOr( new IsEqual($value), - new LessThan($value) + new LessThan($value), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php b/app/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php index 5b8c50ed9..2005cfdeb 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Assert/Functions.php @@ -1444,6 +1444,42 @@ function assertObjectNotHasAttribute(string $attributeName, $object, string $mes } } +if (!function_exists('PHPUnit\Framework\assertObjectHasProperty')) { + /** + * Asserts that an object has a specified property. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertObjectHasProperty + */ + function assertObjectHasProperty(string $attributeName, object $object, string $message = ''): void + { + Assert::assertObjectHasProperty(...func_get_args()); + } +} + +if (!function_exists('PHPUnit\Framework\assertObjectNotHasProperty')) { + /** + * Asserts that an object does not have a specified property. + * + * @throws ExpectationFailedException + * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException + * @throws Exception + * + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @see Assert::assertObjectNotHasProperty + */ + function assertObjectNotHasProperty(string $attributeName, object $object, string $message = ''): void + { + Assert::assertObjectNotHasProperty(...func_get_args()); + } +} + if (!function_exists('PHPUnit\Framework\assertSame')) { /** * Asserts that two variables have the same type and value. @@ -2927,7 +2963,7 @@ function never(): InvokedCountMatcher function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher { return new InvokedAtLeastCountMatcher( - $requiredInvocations + $requiredInvocations, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php index 8e27fbfd4..ff04a6981 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/Count.php @@ -40,7 +40,7 @@ public function toString(): string { return sprintf( 'count matches %d', - $this->expectedCount + $this->expectedCount, ); } @@ -76,7 +76,7 @@ protected function getCountOf($other): ?int throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } } @@ -136,7 +136,7 @@ protected function failureDescription($other): string return sprintf( 'actual size %d matches expected size %d', (int) $this->getCountOf($other), - $this->expectedCount + $this->expectedCount, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php index e6371d536..ee01e93da 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Cardinality/IsEmpty.php @@ -64,7 +64,7 @@ protected function failureDescription($other): string '%s %s %s', strpos($type, 'a') === 0 || strpos($type, 'o') === 0 ? 'an' : 'a', $type, - $this->toString() + $this->toString(), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php index 5f772b4d1..37548e566 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Constraint.php @@ -93,9 +93,8 @@ protected function matches($other): bool /** * Throws an exception for the given compared value and test description. * - * @param mixed $other evaluated value or object - * @param string $description Additional information about the test - * @param ComparisonFailure $comparisonFailure + * @param mixed $other evaluated value or object + * @param string $description Additional information about the test * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws ExpectationFailedException @@ -106,7 +105,7 @@ protected function fail($other, $description, ComparisonFailure $comparisonFailu { $failureDescription = sprintf( 'Failed asserting that %s.', - $this->failureDescription($other) + $this->failureDescription($other), ); $additionalFailureDescription = $this->additionalFailureDescription($other); @@ -121,7 +120,7 @@ protected function fail($other, $description, ComparisonFailure $comparisonFailu throw new ExpectationFailedException( $failureDescription, - $comparisonFailure + $comparisonFailure, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php index 6a61ebfba..d209444b9 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqual.php @@ -61,8 +61,6 @@ public function __construct($value, float $delta = 0.0, bool $canonicalize = fal * failure. * * @throws ExpectationFailedException - * - * @return bool */ public function evaluate($other, string $description = '', bool $returnResult = false): ?bool { @@ -78,7 +76,7 @@ public function evaluate($other, string $description = '', bool $returnResult = try { $comparator = $comparatorFactory->getComparatorFor( $this->value, - $other + $other, ); $comparator->assertEquals( @@ -86,7 +84,7 @@ public function evaluate($other, string $description = '', bool $returnResult = $other, $this->delta, $this->canonicalize, - $this->ignoreCase + $this->ignoreCase, ); } catch (ComparisonFailure $f) { if ($returnResult) { @@ -95,7 +93,7 @@ public function evaluate($other, string $description = '', bool $returnResult = throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), - $f + $f, ); } @@ -118,21 +116,21 @@ public function toString(): string return sprintf( "is equal to '%s'", - $this->value + $this->value, ); } if ($this->delta != 0) { $delta = sprintf( ' with delta <%F>', - $this->delta + $this->delta, ); } return sprintf( 'is equal to %s%s', $this->exporter()->export($this->value), - $delta + $delta, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php index 57bb91ca1..b87dadad9 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualCanonicalizing.php @@ -58,7 +58,7 @@ public function evaluate($other, string $description = '', bool $returnResult = try { $comparator = $comparatorFactory->getComparatorFor( $this->value, - $other + $other, ); $comparator->assertEquals( @@ -66,7 +66,7 @@ public function evaluate($other, string $description = '', bool $returnResult = $other, 0.0, true, - false + false, ); } catch (ComparisonFailure $f) { if ($returnResult) { @@ -75,7 +75,7 @@ public function evaluate($other, string $description = '', bool $returnResult = throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), - $f + $f, ); } @@ -96,13 +96,13 @@ public function toString(): string return sprintf( "is equal to '%s'", - $this->value + $this->value, ); } return sprintf( 'is equal to %s', - $this->exporter()->export($this->value) + $this->exporter()->export($this->value), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php index d657e96a2..3642da213 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualIgnoringCase.php @@ -58,7 +58,7 @@ public function evaluate($other, string $description = '', bool $returnResult = try { $comparator = $comparatorFactory->getComparatorFor( $this->value, - $other + $other, ); $comparator->assertEquals( @@ -66,7 +66,7 @@ public function evaluate($other, string $description = '', bool $returnResult = $other, 0.0, false, - true + true, ); } catch (ComparisonFailure $f) { if ($returnResult) { @@ -75,7 +75,7 @@ public function evaluate($other, string $description = '', bool $returnResult = throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), - $f + $f, ); } @@ -96,13 +96,13 @@ public function toString(): string return sprintf( "is equal to '%s'", - $this->value + $this->value, ); } return sprintf( 'is equal to %s', - $this->exporter()->export($this->value) + $this->exporter()->export($this->value), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php index 4f106b1e0..f7d8aced9 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Equality/IsEqualWithDelta.php @@ -62,13 +62,13 @@ public function evaluate($other, string $description = '', bool $returnResult = try { $comparator = $comparatorFactory->getComparatorFor( $this->value, - $other + $other, ); $comparator->assertEquals( $this->value, $other, - $this->delta + $this->delta, ); } catch (ComparisonFailure $f) { if ($returnResult) { @@ -77,7 +77,7 @@ public function evaluate($other, string $description = '', bool $returnResult = throw new ExpectationFailedException( trim($description . "\n" . $f->getMessage()), - $f + $f, ); } @@ -94,7 +94,7 @@ public function toString(): string return sprintf( 'is equal to %s with delta <%F>', $this->exporter()->export($this->value), - $this->delta + $this->delta, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php index 860c0030f..bbaab4af5 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/Exception.php @@ -36,7 +36,7 @@ public function toString(): string { return sprintf( 'exception of type "%s"', - $this->className + $this->className, ); } @@ -73,13 +73,13 @@ protected function failureDescription($other): string 'exception of type "%s" matches expected exception "%s"%s', get_class($other), $this->className, - $message + $message, ); } return sprintf( 'exception of type "%s" is thrown', - $this->className + $this->className, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php index b8054a949..a6fad4c75 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionCode.php @@ -61,7 +61,7 @@ protected function failureDescription($other): string return sprintf( '%s is equal to expected exception code %s', $this->exporter()->export($other->getCode()), - $this->exporter()->export($this->expectedCode) + $this->exporter()->export($this->expectedCode), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php index 030beff98..5139e7200 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessage.php @@ -65,14 +65,14 @@ protected function failureDescription($other): string if ($this->expectedMessage === '') { return sprintf( "exception message is empty but is '%s'", - $other->getMessage() + $other->getMessage(), ); } return sprintf( "exception message '%s' contains '%s'", $other->getMessage(), - $this->expectedMessage + $this->expectedMessage, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php index fd0db1c8f..bc7377091 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Exception/ExceptionMessageRegularExpression.php @@ -48,7 +48,7 @@ protected function matches($other): bool if ($match === false) { throw new \PHPUnit\Framework\Exception( - "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'" + "Invalid expected exception message regex given: '{$this->expectedMessageRegExp}'", ); } @@ -68,7 +68,7 @@ protected function failureDescription($other): string return sprintf( "exception message '%s' matches '%s'", $other->getMessage(), - $this->expectedMessageRegExp + $this->expectedMessageRegExp, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php index ef4b2baf0..24268c7d3 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/DirectoryExists.php @@ -48,7 +48,7 @@ protected function failureDescription($other): string { return sprintf( 'directory "%s" exists', - $other + $other, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php index 41b3136e9..6cae95024 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/FileExists.php @@ -48,7 +48,7 @@ protected function failureDescription($other): string { return sprintf( 'file "%s" exists', - $other + $other, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php index e33d7e045..124369386 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsReadable.php @@ -48,7 +48,7 @@ protected function failureDescription($other): string { return sprintf( '"%s" is readable', - $other + $other, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php index 93981224a..8da020764 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Filesystem/IsWritable.php @@ -48,7 +48,7 @@ protected function failureDescription($other): string { return sprintf( '"%s" is writable', - $other + $other, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php index fde43d9e5..f36d44e74 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php @@ -62,7 +62,7 @@ public function evaluate($other, string $description = '', bool $returnResult = $this->value, $other, sprintf("'%s'", $this->value), - sprintf("'%s'", $other) + sprintf("'%s'", $other), ); } @@ -72,7 +72,7 @@ public function evaluate($other, string $description = '', bool $returnResult = $this->value, $other, $this->exporter()->export($this->value), - $this->exporter()->export($other) + $this->exporter()->export($other), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php index 23a4de7e9..54de688c8 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php @@ -37,7 +37,7 @@ public function toString(): string { return sprintf( 'matches JSON string "%s"', - $this->value + $this->value, ); } @@ -69,9 +69,8 @@ protected function matches($other): bool /** * Throws an exception for the given compared value and test description. * - * @param mixed $other evaluated value or object - * @param string $description Additional information about the test - * @param ComparisonFailure $comparisonFailure + * @param mixed $other evaluated value or object + * @param string $description Additional information about the test * * @throws \PHPUnit\Framework\Exception * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException @@ -100,7 +99,7 @@ protected function fail($other, $description, ComparisonFailure $comparisonFailu Json::prettify($recodedValue), Json::prettify($recodedOther), false, - 'Failed asserting that two json values are equal.' + 'Failed asserting that two json values are equal.', ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php index a873ceaee..40e1d614e 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasAttribute.php @@ -40,7 +40,7 @@ public function toString(): string { return sprintf( 'has attribute "%s"', - $this->attributeName + $this->attributeName, ); } @@ -59,7 +59,7 @@ protected function matches($other): bool throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -79,7 +79,7 @@ protected function failureDescription($other): string '%sclass "%s" %s', is_object($other) ? 'object of ' : '', is_object($other) ? get_class($other) : $other, - $this->toString() + $this->toString(), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php index 538cbf08b..bd5eefe49 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ClassHasStaticAttribute.php @@ -28,7 +28,7 @@ public function toString(): string { return sprintf( 'has static attribute "%s"', - $this->attributeName() + $this->attributeName(), ); } @@ -51,7 +51,7 @@ protected function matches($other): bool throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php index 30f3a330c..b837b4cd1 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectEquals.php @@ -65,7 +65,7 @@ protected function matches($other): bool if (!$object->hasMethod($this->method)) { throw new ComparisonMethodDoesNotExistException( get_class($other), - $this->method + $this->method, ); } @@ -75,7 +75,7 @@ protected function matches($other): bool if (!$method->hasReturnType()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), - $this->method + $this->method, ); } @@ -84,28 +84,28 @@ protected function matches($other): bool if (!$returnType instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), - $this->method + $this->method, ); } if ($returnType->allowsNull()) { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), - $this->method + $this->method, ); } if ($returnType->getName() !== 'bool') { throw new ComparisonMethodDoesNotDeclareBoolReturnTypeException( get_class($other), - $this->method + $this->method, ); } if ($method->getNumberOfParameters() !== 1 || $method->getNumberOfRequiredParameters() !== 1) { throw new ComparisonMethodDoesNotDeclareExactlyOneParameterException( get_class($other), - $this->method + $this->method, ); } @@ -114,7 +114,7 @@ protected function matches($other): bool if (!$parameter->hasType()) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), - $this->method + $this->method, ); } @@ -123,7 +123,7 @@ protected function matches($other): bool if (!$type instanceof ReflectionNamedType) { throw new ComparisonMethodDoesNotDeclareParameterTypeException( get_class($other), - $this->method + $this->method, ); } @@ -137,7 +137,7 @@ protected function matches($other): bool throw new ComparisonMethodDoesNotAcceptParameterTypeException( get_class($other), $this->method, - get_class($this->expected) + get_class($this->expected), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php new file mode 100644 index 000000000..c41d21a14 --- /dev/null +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Object/ObjectHasProperty.php @@ -0,0 +1,84 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +namespace PHPUnit\Framework\Constraint; + +use function get_class; +use function gettype; +use function is_object; +use function sprintf; +use ReflectionObject; + +/** + * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + */ +final class ObjectHasProperty extends Constraint +{ + /** + * @var string + */ + private $propertyName; + + public function __construct(string $propertyName) + { + $this->propertyName = $propertyName; + } + + /** + * Returns a string representation of the constraint. + */ + public function toString(): string + { + return sprintf( + 'has property "%s"', + $this->propertyName, + ); + } + + /** + * Evaluates the constraint for parameter $other. Returns true if the + * constraint is met, false otherwise. + * + * @param mixed $other value or object to evaluate + */ + protected function matches($other): bool + { + if (!is_object($other)) { + return false; + } + + return (new ReflectionObject($other))->hasProperty($this->propertyName); + } + + /** + * Returns the description of the failure. + * + * The beginning of failure messages is "Failed asserting that" in most + * cases. This method should return the second part of that sentence. + * + * @param mixed $other evaluated value or object + */ + protected function failureDescription($other): string + { + if (is_object($other)) { + return sprintf( + 'object of class "%s" %s', + get_class($other), + $this->toString(), + ); + } + + return sprintf( + '"%s" (%s) %s', + $other, + gettype($other), + $this->toString(), + ); + } +} diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php index 7560ce2a1..327f85bfe 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalNot.php @@ -63,15 +63,15 @@ public static function negate(string $string): string preg_replace( $positives, $negatives, - $nonInput + $nonInput, ), - $string + $string, ); } else { $negatedString = preg_replace( $positives, $negatives, - $string + $string, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php index fbdb479bc..ee1b1c293 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Operator/LogicalXor.php @@ -57,7 +57,7 @@ static function (bool $matches, Constraint $constraint) use ($other): bool { return $matches xor $constraint->evaluate($other, '', true); }, - $initial->evaluate($other, '', true) + $initial->evaluate($other, '', true), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php index 97b294617..f90704f0a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/IsJson.php @@ -65,13 +65,13 @@ protected function failureDescription($other): string json_decode($other); $error = (string) JsonMatchesErrorMessageProvider::determineJsonError( - (string) json_last_error() + (string) json_last_error(), ); return sprintf( '%s is valid JSON (%s)', $this->exporter()->shortenedExport($other), - $error + $error, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php index 8e609e795..9ccfb9bd5 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/RegularExpression.php @@ -34,7 +34,7 @@ public function toString(): string { return sprintf( 'matches PCRE pattern "%s"', - $this->pattern + $this->pattern, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php index 6279f37ba..5aa2c8e5a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringContains.php @@ -48,7 +48,7 @@ public function toString(): string return sprintf( 'contains "%s"', - $string + $string, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php index c4f7324ec..9c01ecb9c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringMatchesFormatDescription.php @@ -33,8 +33,8 @@ public function __construct(string $string) { parent::__construct( $this->createPatternFromFormat( - $this->convertNewlines($string) - ) + $this->convertNewlines($string), + ), ); $this->string = $string; @@ -49,7 +49,7 @@ public function __construct(string $string) protected function matches($other): bool { return parent::matches( - $this->convertNewlines($other) + $this->convertNewlines($other), ); } @@ -96,7 +96,7 @@ private function createPatternFromFormat(string $string): string '%x' => '[0-9a-fA-F]+', '%f' => '[+-]?\.?\d+\.?\d*(?:[Ee][+-]?\d+)?', '%c' => '.', - ] + ], ); return '/^' . $string . '$/s'; diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php index 089545c12..8683e2722 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/String/StringStartsWith.php @@ -9,7 +9,6 @@ */ namespace PHPUnit\Framework\Constraint; -use function strlen; use function strpos; use PHPUnit\Framework\InvalidArgumentException; @@ -25,7 +24,7 @@ final class StringStartsWith extends Constraint public function __construct(string $prefix) { - if (strlen($prefix) === 0) { + if ($prefix === '') { throw InvalidArgumentException::create(1, 'non-empty string'); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php index 39660a985..d0f61f46a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContains.php @@ -52,7 +52,7 @@ protected function failureDescription($other): string return sprintf( '%s %s', is_array($other) ? 'an array' : 'a traversable', - $this->toString() + $this->toString(), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php index cf4a46b42..e5c688902 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Traversable/TraversableContainsOnly.php @@ -36,7 +36,7 @@ public function __construct(string $type, bool $isNativeType = true) $this->constraint = new IsType($type); } else { $this->constraint = new IsInstanceOf( - $type + $type, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php index f0fa02b99..ef26813f9 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsInstanceOf.php @@ -36,7 +36,7 @@ public function toString(): string return sprintf( 'is instance of %s "%s"', $this->getType(), - $this->className + $this->className, ); } @@ -67,7 +67,7 @@ protected function failureDescription($other): string '%s is an instance of %s "%s"', $this->exporter()->shortenedExport($other), $this->getType(), - $this->className + $this->className, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php index 5bc691d74..6edcc2b95 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Constraint/Type/IsType.php @@ -130,8 +130,8 @@ public function __construct(string $type) sprintf( 'Type specified for PHPUnit\Framework\Constraint\IsType <%s> ' . 'is not a valid type.', - $type - ) + $type, + ), ); } @@ -145,7 +145,7 @@ public function toString(): string { return sprintf( 'is of type "%s"', - $this->type + $this->type, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/ErrorTestCase.php b/app/vendor/phpunit/phpunit/src/Framework/ErrorTestCase.php index 841247d72..245f0336c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/ErrorTestCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/ErrorTestCase.php @@ -15,17 +15,17 @@ final class ErrorTestCase extends TestCase { /** - * @var bool + * @var ?bool */ protected $backupGlobals = false; /** - * @var bool + * @var ?bool */ protected $backupStaticAttributes = false; /** - * @var bool + * @var ?bool */ protected $runTestInSeparateProcess = false; diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php index adae28294..4364788cf 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ActualValueIsNotAnObjectException.php @@ -21,7 +21,7 @@ public function __construct() parent::__construct( 'Actual value is not an object', 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php index ebd68f34c..0c2c1afe6 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotAcceptParameterTypeException.php @@ -24,10 +24,10 @@ public function __construct(string $className, string $methodName, string $type) '%s is not an accepted argument type for comparison method %s::%s().', $type, $className, - $methodName + $methodName, ), 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php index 20189cde4..4eb9a2fde 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareBoolReturnTypeException.php @@ -23,10 +23,10 @@ public function __construct(string $className, string $methodName) sprintf( 'Comparison method %s::%s() does not declare bool return type.', $className, - $methodName + $methodName, ), 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php index bd09d87cc..e8cd9787b 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareExactlyOneParameterException.php @@ -23,10 +23,10 @@ public function __construct(string $className, string $methodName) sprintf( 'Comparison method %s::%s() does not declare exactly one parameter.', $className, - $methodName + $methodName, ), 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php index 9bbb112ea..68616ba18 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotDeclareParameterTypeException.php @@ -23,10 +23,10 @@ public function __construct(string $className, string $methodName) sprintf( 'Parameter of comparison method %s::%s() does not have a declared type.', $className, - $methodName + $methodName, ), 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php index ad0e2d088..0f1adcbcc 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/ComparisonMethodDoesNotExistException.php @@ -23,10 +23,10 @@ public function __construct(string $className, string $methodName) sprintf( 'Comparison method %s::%s() does not exist.', $className, - $methodName + $methodName, ), 0, - null + null, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php b/app/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php index 77f580799..888e9300b 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/Exception/InvalidArgumentException.php @@ -34,8 +34,8 @@ public static function create(int $argument, string $type): self $argument, $function, in_array(lcfirst($type)[0], ['a', 'e', 'i', 'o', 'u'], true) ? 'an' : 'a', - $type - ) + $type, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php b/app/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php index 09c343c16..89ecc5e2e 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php +++ b/app/vendor/phpunit/phpunit/src/Framework/ExecutionOrderDependency.php @@ -77,8 +77,8 @@ public static function filterInvalid(array $dependencies): array static function (self $d) { return $d->isValid(); - } - ) + }, + ), ); } @@ -95,7 +95,7 @@ static function ($dependency) { return $dependency->getTarget(); }, - $existing + $existing, ); foreach ($additional as $dependency) { @@ -132,7 +132,7 @@ static function ($dependency) { return $dependency->getTarget(); }, - $right + $right, ); foreach ($left as $dependency) { diff --git a/app/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php b/app/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php index ee1e3e9fe..53e031a2a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/IncompleteTestCase.php @@ -15,17 +15,17 @@ final class IncompleteTestCase extends TestCase { /** - * @var bool + * @var ?bool */ protected $backupGlobals = false; /** - * @var bool + * @var ?bool */ protected $backupStaticAttributes = false; /** - * @var bool + * @var ?bool */ protected $runTestInSeparateProcess = false; diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php index e2f0a2802..56e6b69bb 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Api.php @@ -42,7 +42,7 @@ public static function __phpunit_initConfigurableMethods(ConfigurableMethod ...$ { if (isset(static::$__phpunit_configurableMethods)) { throw new ConfigurableMethodsAlreadyInitializedException( - 'Configurable methods is already initialized and can not be reinitialized' + 'Configurable methods is already initialized and can not be reinitialized', ); } @@ -67,7 +67,7 @@ public function __phpunit_getInvocationHandler(): InvocationHandler if ($this->__phpunit_invocationMocker === null) { $this->__phpunit_invocationMocker = new InvocationHandler( static::$__phpunit_configurableMethods, - $this->__phpunit_returnValueGeneration + $this->__phpunit_returnValueGeneration, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php index f6df7533c..f8be3808c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Api/Method.php @@ -24,7 +24,7 @@ public function method() return call_user_func_array( [$expects, 'method'], - func_get_args() + func_get_args(), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php index bc3c9236f..626c33a7b 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationMocker.php @@ -241,7 +241,7 @@ static function (ConfigurableMethod $configurable) { return strtolower($configurable->getName()); }, - $this->configurableMethods + $this->configurableMethods, ); if (is_string($constraint) && !in_array(strtolower($constraint), $configurableMethodNames, true)) { @@ -300,7 +300,7 @@ private function ensureTypeOfReturnValues(array $values): void if (!$configuredMethod->mayReturn($value)) { throw new IncompatibleReturnValueException( $configuredMethod, - $value + $value, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php index f32ff0e7c..1756cfc0a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Builder/InvocationStubber.php @@ -20,46 +20,46 @@ interface InvocationStubber public function will(Stub $stub): Identity; /** @return self */ - public function willReturn($value, ...$nextValues)/*: self */; + public function willReturn($value, ...$nextValues)/* : self */; /** * @param mixed $reference * * @return self */ - public function willReturnReference(&$reference)/*: self */; + public function willReturnReference(&$reference)/* : self */; /** * @param array> $valueMap * * @return self */ - public function willReturnMap(array $valueMap)/*: self */; + public function willReturnMap(array $valueMap)/* : self */; /** * @param int $argumentIndex * * @return self */ - public function willReturnArgument($argumentIndex)/*: self */; + public function willReturnArgument($argumentIndex)/* : self */; /** * @param callable $callback * * @return self */ - public function willReturnCallback($callback)/*: self */; + public function willReturnCallback($callback)/* : self */; /** @return self */ - public function willReturnSelf()/*: self */; + public function willReturnSelf()/* : self */; /** * @param mixed $values * * @return self */ - public function willReturnOnConsecutiveCalls(...$values)/*: self */; + public function willReturnOnConsecutiveCalls(...$values)/* : self */; /** @return self */ - public function willThrowException(Throwable $exception)/*: self */; + public function willThrowException(Throwable $exception)/* : self */; } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php index 0698870bc..848746b52 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseAddMethodsException.php @@ -22,8 +22,8 @@ public function __construct(string $type, string $methodName) sprintf( 'Trying to configure method "%s" with addMethods(), but it exists in class "%s". Use onlyMethods() for methods that exist in the class', $methodName, - $type - ) + $type, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php index 35a29b731..0efcd02a3 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/CannotUseOnlyMethodsException.php @@ -22,8 +22,8 @@ public function __construct(string $type, string $methodName) sprintf( 'Trying to configure method "%s" with onlyMethods(), but it does not exist in class "%s". Use addMethods() for methods that do not exist in the class', $methodName, - $type - ) + $type, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php index 0ba9a187d..8c9c0a523 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassAlreadyExistsException.php @@ -21,8 +21,8 @@ public function __construct(string $className) parent::__construct( sprintf( 'Class "%s" already exists', - $className - ) + $className, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php index e648f0263..2bce2d882 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsFinalException.php @@ -21,8 +21,8 @@ public function __construct(string $className) parent::__construct( sprintf( 'Class "%s" is declared "final" and cannot be doubled', - $className - ) + $className, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsReadonlyException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsReadonlyException.php index aa1a74510..f73570e1d 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsReadonlyException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ClassIsReadonlyException.php @@ -21,8 +21,8 @@ public function __construct(string $className) parent::__construct( sprintf( 'Class "%s" is declared "readonly" and cannot be doubled', - $className - ) + $className, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php index 1216b45d3..f96a04ac9 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/DuplicateMethodException.php @@ -28,8 +28,8 @@ public function __construct(array $methods) sprintf( 'Cannot double using a method list that contains duplicates: "%s" (duplicate: "%s")', implode(', ', $methods), - implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods)))) - ) + implode(', ', array_unique(array_diff_assoc($methods, array_unique($methods)))), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php index eec792132..1ca8e9c94 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/IncompatibleReturnValueException.php @@ -29,8 +29,8 @@ public function __construct(ConfigurableMethod $method, $value) 'Method %s may not return value of type %s, its declared return type is "%s"', $method->getName(), is_object($value) ? get_class($value) : gettype($value), - $method->getReturnTypeDeclaration() - ) + $method->getReturnTypeDeclaration(), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php index d2444cf12..0ab74cbb6 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/InvalidMethodNameException.php @@ -21,8 +21,8 @@ public function __construct(string $method) parent::__construct( sprintf( 'Cannot double method with invalid name "%s"', - $method - ) + $method, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php index c05b2bce6..f2e1a31e8 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatchBuilderNotFoundException.php @@ -21,8 +21,8 @@ public function __construct(string $id) parent::__construct( sprintf( 'No builder found for match builder identification <%s>', - $id - ) + $id, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php index efcc13ed9..0972ffaf8 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MatcherAlreadyRegisteredException.php @@ -21,8 +21,8 @@ public function __construct(string $id) parent::__construct( sprintf( 'Matcher with id <%s> is already registered', - $id - ) + $id, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php index 707290439..2f0bb5a65 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/MethodCannotBeConfiguredException.php @@ -21,8 +21,8 @@ public function __construct(string $method) parent::__construct( sprintf( 'Trying to configure method "%s" which cannot be configured because it does not exist, has not been specified, is final, or is static', - $method - ) + $method, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php index 2c16c1dcc..2bc4e8829 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/ReturnValueNotConfiguredException.php @@ -22,8 +22,8 @@ public function __construct(Invocation $invocation) sprintf( 'Return value inference disabled and no expectation set up for %s::%s()', $invocation->getClassName(), - $invocation->getMethodName() - ) + $invocation->getMethodName(), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php index 98837c954..6ec5057ab 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/SoapExtensionNotAvailableException.php @@ -17,7 +17,7 @@ final class SoapExtensionNotAvailableException extends \PHPUnit\Framework\Except public function __construct() { parent::__construct( - 'The SOAP extension is required to generate a test double from WSDL' + 'The SOAP extension is required to generate a test double from WSDL', ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php index e124f9b18..b08dead05 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownClassException.php @@ -21,8 +21,8 @@ public function __construct(string $className) parent::__construct( sprintf( 'Class "%s" does not exist', - $className - ) + $className, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php index 90fc8d848..c689dae92 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTraitException.php @@ -21,8 +21,8 @@ public function __construct(string $traitName) parent::__construct( sprintf( 'Trait "%s" does not exist', - $traitName - ) + $traitName, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php index b1a70edd6..c50b69116 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Exception/UnknownTypeException.php @@ -21,8 +21,8 @@ public function __construct(string $type) parent::__construct( sprintf( 'Class or interface "%s" does not exist', - $type - ) + $type, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php index 4810ecae8..d61725b15 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Generator.php @@ -186,7 +186,7 @@ public function getMock(string $type, $methods = [], array $arguments = [], stri throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -207,7 +207,7 @@ public function getMock(string $type, $methods = [], array $arguments = [], stri $callOriginalClone, $callAutoload, $cloneArguments, - $callOriginalMethods + $callOriginalMethods, ); return $this->getObject( @@ -218,7 +218,7 @@ public function getMock(string $type, $methods = [], array $arguments = [], stri $arguments, $callOriginalMethods, $proxyTarget, - $returnValueGeneration + $returnValueGeneration, ); } @@ -265,7 +265,7 @@ public function getMockForInterfaces(array $interfaces, bool $callAutoload = tru $intersectionName = sprintf( 'Intersection_%s_%s', implode('_', $unqualifiedNames), - substr(md5((string) mt_rand()), 0, 8) + substr(md5((string) mt_rand()), 0, 8), ); } while (interface_exists($intersectionName, false)); @@ -275,7 +275,7 @@ public function getMockForInterfaces(array $interfaces, bool $callAutoload = tru [ 'intersection' => $intersectionName, 'interfaces' => implode(', ', $interfaces), - ] + ], ); eval($template->render()); @@ -318,7 +318,7 @@ interface_exists($originalClassName, $callAutoload)) { throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -343,7 +343,7 @@ interface_exists($originalClassName, $callAutoload)) { $callOriginalConstructor, $callOriginalClone, $callAutoload, - $cloneArguments + $cloneArguments, ); } @@ -379,7 +379,7 @@ public function getMockForTrait(string $traitName, array $arguments = [], string $className = $this->generateClassName( $traitName, '', - 'Trait_' + 'Trait_', ); $classTemplate = $this->getTemplate('trait_class.tpl'); @@ -389,7 +389,7 @@ public function getMockForTrait(string $traitName, array $arguments = [], string 'prologue' => 'abstract ', 'class_name' => $className['className'], 'trait_name' => $traitName, - ] + ], ); $mockTrait = new MockTrait($classTemplate->render(), $className['className']); @@ -416,7 +416,7 @@ public function getObjectForTrait(string $traitName, string $traitClassName = '' $className = $this->generateClassName( $traitName, $traitClassName, - 'Trait_' + 'Trait_', ); $classTemplate = $this->getTemplate('trait_class.tpl'); @@ -426,18 +426,18 @@ public function getObjectForTrait(string $traitName, string $traitClassName = '' 'prologue' => '', 'class_name' => $className['className'], 'trait_name' => $traitName, - ] + ], ); return $this->getObject( new MockTrait( $classTemplate->render(), - $className['className'] + $className['className'], ), '', $callOriginalConstructor, $callAutoload, - $arguments + $arguments, ); } @@ -457,7 +457,7 @@ public function generate(string $type, array $methods = null, string $mockClassN $callOriginalClone, $callAutoload, $cloneArguments, - $callOriginalMethods + $callOriginalMethods, ); } @@ -466,7 +466,7 @@ public function generate(string $type, array $methods = null, string $mockClassN serialize($methods) . serialize($callOriginalClone) . serialize($cloneArguments) . - serialize($callOriginalMethods) + serialize($callOriginalMethods), ); if (!isset(self::$cache[$key])) { @@ -477,7 +477,7 @@ public function generate(string $type, array $methods = null, string $mockClassN $callOriginalClone, $callAutoload, $cloneArguments, - $callOriginalMethods + $callOriginalMethods, ); } @@ -504,7 +504,7 @@ public function generateClassFromWsdl(string $wsdlFile, string $className, array throw new RuntimeException( $e->getMessage(), $e->getCode(), - $e + $e, ); } @@ -523,7 +523,7 @@ public function generateClassFromWsdl(string $wsdlFile, string $className, array if (empty($methods) || in_array($name, $methods, true)) { $args = explode( ',', - str_replace(')', '', substr($method, $nameEnd + 1)) + str_replace(')', '', substr($method, $nameEnd + 1)), ); foreach (range(0, count($args) - 1) as $i) { @@ -540,7 +540,7 @@ public function generateClassFromWsdl(string $wsdlFile, string $className, array [ 'method_name' => $name, 'arguments' => implode(', ', $args), - ] + ], ); $methodsBuffer .= $methodTemplate->render(); @@ -571,7 +571,7 @@ public function generateClassFromWsdl(string $wsdlFile, string $className, array 'wsdl' => $wsdlFile, 'options' => $optionsBuffer, 'methods' => $methodsBuffer, - ] + ], ); return $classTemplate->render(); @@ -591,7 +591,7 @@ public function getClassMethods(string $className): array throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -621,7 +621,7 @@ public function mockClassMethods(string $className, bool $callOriginalMethods, b throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -651,7 +651,7 @@ public function mockInterfaceMethods(string $interfaceName, bool $cloneArguments throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -681,7 +681,7 @@ private function userDefinedInterfaceMethods(string $interfaceName): array throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -718,7 +718,7 @@ private function getObject(MockType $mockClass, $type = '', bool $callOriginalCo throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -745,7 +745,7 @@ private function getObject(MockType $mockClass, $type = '', bool $callOriginalCo throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -784,7 +784,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc $_mockClassName = $this->generateClassName( $type, $mockClassName, - 'Mock_' + 'Mock_', ); if (class_exists($_mockClassName['fullClassName'], $callAutoload)) { @@ -813,7 +813,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -839,7 +839,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -855,7 +855,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -866,14 +866,14 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc } $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) + MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments), ); } $_mockClassName = $this->generateClassName( $actualClassName, $_mockClassName['className'], - 'Mock_' + 'Mock_', ); } @@ -884,7 +884,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc $additionalInterfaces[] = Iterator::class; $mockMethods->addMethods( - ...$this->mockClassMethods(Iterator::class, $callOriginalMethods, $cloneArguments) + ...$this->mockClassMethods(Iterator::class, $callOriginalMethods, $cloneArguments), ); } @@ -896,7 +896,7 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -915,13 +915,13 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc if ($isClass && $explicitMethods === []) { $mockMethods->addMethods( - ...$this->mockClassMethods($_mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments) + ...$this->mockClassMethods($_mockClassName['fullClassName'], $callOriginalMethods, $cloneArguments), ); } if ($isInterface && ($explicitMethods === [] || $explicitMethods === null)) { $mockMethods->addMethods( - ...$this->mockInterfaceMethods($_mockClassName['fullClassName'], $cloneArguments) + ...$this->mockInterfaceMethods($_mockClassName['fullClassName'], $cloneArguments), ); } @@ -935,14 +935,14 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd if ($this->canMockMethod($method)) { $mockMethods->addMethods( - MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments) + MockMethod::fromReflection($method, $callOriginalMethods, $cloneArguments), ); } } else { @@ -950,8 +950,8 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc MockMethod::fromName( $_mockClassName['fullClassName'], $methodName, - $cloneArguments - ) + $cloneArguments, + ), ); } } @@ -988,19 +988,19 @@ private function generateMock(string $type, ?array $explicitMethods, string $moc 'class_declaration' => $this->generateMockClassDeclaration( $_mockClassName, $isInterface, - $additionalInterfaces + $additionalInterfaces, ), 'clone' => $cloneTrait, 'mock_class_name' => $_mockClassName['className'], 'mocked_methods' => $mockedMethods, 'method' => $method, - ] + ], ); return new MockClass( $classTemplate->render(), $_mockClassName['className'], - $configurable + $configurable, ); } @@ -1047,7 +1047,7 @@ private function generateMockClassDeclaration(array $mockClassName, bool $isInte $buffer .= sprintf( '%s implements %s', $mockClassName['className'], - $interfaces + $interfaces, ); if (!in_array($mockClassName['originalClassName'], $additionalInterfaces, true)) { @@ -1065,7 +1065,7 @@ private function generateMockClassDeclaration(array $mockClassName, bool $isInte $mockClassName['className'], !empty($mockClassName['namespaceName']) ? $mockClassName['namespaceName'] . '\\' : '', $mockClassName['originalClassName'], - $interfaces + $interfaces, ); } @@ -1096,7 +1096,7 @@ private function getTemplate(string $template): Template throw new RuntimeException( $e->getMessage(), $e->getCode(), - $e + $e, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php index 418d6a077..ed8c4e92d 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Invocation.php @@ -183,7 +183,7 @@ public function generateReturnValue() throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), - $t + $t, ); } } @@ -221,7 +221,7 @@ public function generateReturnValue() throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), - $t + $t, ); } } @@ -256,8 +256,8 @@ public function generateReturnValue() 'Return value for %s::%s() cannot be generated%s, please configure a return value for this method', $this->className, $this->methodName, - $reason - ) + $reason, + ), ); } @@ -273,10 +273,10 @@ public function toString(): string ', ', array_map( [$exporter, 'shortenedExport'], - $this->parameters - ) + $this->parameters, + ), ), - $this->returnType ? sprintf(': %s', $this->returnType) : '' + $this->returnType ? sprintf(': %s', $this->returnType) : '', ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php index b9d62610a..f8ee16e0c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/InvocationHandler.php @@ -102,7 +102,7 @@ public function expects(InvocationOrder $rule): InvocationMocker return new InvocationMocker( $this, $matcher, - ...$this->configurableMethods + ...$this->configurableMethods, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php index 7c81a0ea0..a8ebe14fa 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Matcher.php @@ -117,8 +117,8 @@ public function invoked(Invocation $invocation) if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); + ->__phpunit_getInvocationHandler() + ->lookupMatcher($this->afterMatchBuilderId); if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); @@ -143,9 +143,9 @@ public function invoked(Invocation $invocation) "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), - $e->getMessage() + $e->getMessage(), ), - $e->getComparisonFailure() + $e->getComparisonFailure(), ); } @@ -167,8 +167,8 @@ public function matches(Invocation $invocation): bool { if ($this->afterMatchBuilderId !== null) { $matcher = $invocation->getObject() - ->__phpunit_getInvocationHandler() - ->lookupMatcher($this->afterMatchBuilderId); + ->__phpunit_getInvocationHandler() + ->lookupMatcher($this->afterMatchBuilderId); if (!$matcher) { throw new MatchBuilderNotFoundException($this->afterMatchBuilderId); @@ -199,9 +199,9 @@ public function matches(Invocation $invocation): bool "Expectation failed for %s when %s\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), - $e->getMessage() + $e->getMessage(), ), - $e->getComparisonFailure() + $e->getComparisonFailure(), ); } @@ -239,8 +239,8 @@ public function verify(): void "Expectation failed for %s when %s.\n%s", $this->methodNameRule->toString(), $this->invocationRule->toString(), - TestFailure::exceptionToString($e) - ) + TestFailure::exceptionToString($e), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php index 3082ab384..e5c955d3d 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MethodNameConstraint.php @@ -33,7 +33,7 @@ public function toString(): string { return sprintf( 'is "%s"', - $this->methodName + $this->methodName, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php index 4007a9f13..69ec25026 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockBuilder.php @@ -138,7 +138,7 @@ public function getMock(): MockObject $this->callOriginalMethods, $this->proxyTarget, $this->allowMockingUnknownTypes, - $this->returnValueGeneration + $this->returnValueGeneration, ); $this->testCase->registerMockObject($object); @@ -165,7 +165,7 @@ public function getMockForAbstractClass(): MockObject $this->originalClone, $this->autoload, $this->methods, - $this->cloneArguments + $this->cloneArguments, ); $this->testCase->registerMockObject($object); @@ -192,7 +192,7 @@ public function getMockForTrait(): MockObject $this->originalClone, $this->autoload, $this->methods, - $this->cloneArguments + $this->cloneArguments, ); $this->testCase->registerMockObject($object); @@ -243,7 +243,7 @@ public function onlyMethods(array $methods): self throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -285,7 +285,7 @@ public function addMethods(array $methods): self throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -313,8 +313,8 @@ public function setMethodsExcept(array $methods = []): self return $this->setMethods( array_diff( $this->generator->getClassMethods($this->type), - $methods - ) + $methods, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php index 253d78460..8f5c276d5 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockClass.php @@ -55,7 +55,7 @@ public function generate(): string $this->mockName, '__phpunit_initConfigurableMethods', ], - ...$this->configurableMethods + ...$this->configurableMethods, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php index 2cf149ad6..88462dfe0 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/MockMethod.php @@ -140,7 +140,7 @@ public static function fromReflection(ReflectionMethod $method, bool $callOrigin $reference, $callOriginalMethod, $method->isStatic(), - $deprecation + $deprecation, ); } @@ -157,7 +157,7 @@ public static function fromName(string $fullClassName, string $methodName, bool '', false, false, - null + null, ); } @@ -191,12 +191,12 @@ public function generateCode(): string } elseif ($this->returnType->isNever() || $this->returnType->isVoid()) { $templateFile = sprintf( '%s_method_never_or_void.tpl', - $this->callOriginalMethod ? 'proxied' : 'mocked' + $this->callOriginalMethod ? 'proxied' : 'mocked', ); } else { $templateFile = sprintf( '%s_method.tpl', - $this->callOriginalMethod ? 'proxied' : 'mocked' + $this->callOriginalMethod ? 'proxied' : 'mocked', ); } @@ -209,7 +209,7 @@ public function generateCode(): string $deprecationTemplate->setVar( [ 'deprecation' => var_export($deprecation, true), - ] + ], ); $deprecation = $deprecationTemplate->render(); @@ -230,7 +230,7 @@ public function generateCode(): string 'reference' => $this->reference, 'clone_arguments' => $this->cloneArguments ? 'true' : 'false', 'deprecation' => $deprecation, - ] + ], ); return $template->render(); @@ -255,7 +255,7 @@ private function getTemplate(string $template): Template throw new RuntimeException( $e->getMessage(), $e->getCode(), - $e + $e, ); } } @@ -361,18 +361,18 @@ private static function exportDefaultValue(ReflectionParameter $parameter): stri substr( substr( $parameterAsString, - strpos($parameterAsString, ' ') + strlen(' ') + strpos($parameterAsString, ' ') + strlen(' '), ), 0, - -2 - ) + -2, + ), )[1]; // @codeCoverageIgnoreStart } catch (\ReflectionException $e) { throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php index 2188ea0ff..703c14342 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/ConsecutiveParameters.php @@ -47,8 +47,8 @@ public function __construct(array $parameterGroups) sprintf( 'Parameter group #%d must be an array or Traversable, got %s', $index, - gettype($parameters) - ) + gettype($parameters), + ), ); } @@ -111,8 +111,8 @@ private function verifyInvocation(BaseInvocation $invocation, $callIndex): void throw new ExpectationFailedException( sprintf( 'Parameter count for invocation %s is too low.', - $invocation->toString() - ) + $invocation->toString(), + ), ); } @@ -124,8 +124,8 @@ private function verifyInvocation(BaseInvocation $invocation, $callIndex): void 'value.', $i, $callIndex, - $invocation->toString() - ) + $invocation->toString(), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php index 9b51f4ef7..d56618cbc 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtIndex.php @@ -64,8 +64,8 @@ public function verify(): void throw new ExpectationFailedException( sprintf( 'The expected invocation at index %s was never reached.', - $this->sequenceIndex - ) + $this->sequenceIndex, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php index a84aa6559..afc880e1f 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastCount.php @@ -48,7 +48,7 @@ public function verify(): void if ($count < $this->requiredInvocations) { throw new ExpectationFailedException( 'Expected invocation at least ' . $this->requiredInvocations . - ' times but it occurred ' . $count . ' time(s).' + ' times but it occurred ' . $count . ' time(s).', ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php index d0ad1f801..645ed309a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtLeastOnce.php @@ -34,7 +34,7 @@ public function verify(): void if ($count < 1) { throw new ExpectationFailedException( - 'Expected invocation at least once but it never occurred.' + 'Expected invocation at least once but it never occurred.', ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php index c3b815aa4..df81a6131 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedAtMostCount.php @@ -48,7 +48,7 @@ public function verify(): void if ($count > $this->allowedInvocations) { throw new ExpectationFailedException( 'Expected invocation at most ' . $this->allowedInvocations . - ' times but it occurred ' . $count . ' time(s).' + ' times but it occurred ' . $count . ' time(s).', ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php index 188326c91..a962118eb 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/InvokedCount.php @@ -62,8 +62,8 @@ public function verify(): void 'Method was expected to be called %d times, ' . 'actually called %d times.', $this->expectedCount, - $count - ) + $count, + ), ); } } @@ -92,7 +92,7 @@ protected function invokedDo(BaseInvocation $invocation): void default: $message .= sprintf( 'was not expected to be called more than %d times.', - $this->expectedCount + $this->expectedCount, ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php index 3f1cc53ae..cb71b271c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Rule/Parameters.php @@ -47,7 +47,7 @@ public function __construct(array $parameters) foreach ($parameters as $parameter) { if (!($parameter instanceof Constraint)) { $parameter = new IsEqual( - $parameter + $parameter, ); } @@ -127,7 +127,7 @@ private function doVerify(): bool } throw new ExpectationFailedException( - sprintf($message, $this->invocation->toString()) + sprintf($message, $this->invocation->toString()), ); } @@ -138,8 +138,8 @@ private function doVerify(): bool 'Parameter %s for invocation %s does not match expected ' . 'value.', $i, - $this->invocation->toString() - ) + $this->invocation->toString(), + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php index 0dcf386b3..8b01656f6 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ConsecutiveCalls.php @@ -51,7 +51,7 @@ public function toString(): string return sprintf( 'return user-specified value %s', - $exporter->export($this->value) + $exporter->export($this->value), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php index 5d64c96a5..aa9074eb6 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/Exception.php @@ -40,7 +40,7 @@ public function toString(): string return sprintf( 'raise user-specified exception %s', - $exporter->export($this->exception) + $exporter->export($this->exception), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php index e02181e90..0f24aafc5 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnCallback.php @@ -49,7 +49,7 @@ public function toString(): string 'passed arguments', $class, $type, - $this->callback[1] + $this->callback[1], ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php index 0d288cebe..ea2bb735a 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnReference.php @@ -39,7 +39,7 @@ public function toString(): string return sprintf( 'return user-specified reference %s', - $exporter->export($this->reference) + $exporter->export($this->reference), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php index fbcd0a07a..4ecbc3b92 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php +++ b/app/vendor/phpunit/phpunit/src/Framework/MockObject/Stub/ReturnStub.php @@ -39,7 +39,7 @@ public function toString(): string return sprintf( 'return user-specified value %s', - $exporter->export($this->value) + $exporter->export($this->value), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php b/app/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php index 51c00619c..6f8a267c0 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/SkippedTestCase.php @@ -15,17 +15,17 @@ final class SkippedTestCase extends TestCase { /** - * @var bool + * @var ?bool */ protected $backupGlobals = false; /** - * @var bool + * @var ?bool */ protected $backupStaticAttributes = false; /** - * @var bool + * @var ?bool */ protected $runTestInSeparateProcess = false; diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestBuilder.php b/app/vendor/phpunit/phpunit/src/Framework/TestBuilder.php index 5dd91e219..77404df08 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestBuilder.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestBuilder.php @@ -31,28 +31,28 @@ public function build(ReflectionClass $theClass, string $methodName): Test if (!$theClass->isInstantiable()) { return new ErrorTestCase( - sprintf('Cannot instantiate class "%s".', $className) + sprintf('Cannot instantiate class "%s".', $className), ); } $backupSettings = TestUtil::getBackupSettings( $className, - $methodName + $methodName, ); $preserveGlobalState = TestUtil::getPreserveGlobalStateSettings( $className, - $methodName + $methodName, ); $runTestInSeparateProcess = TestUtil::getProcessIsolationSettings( $className, - $methodName + $methodName, ); $runClassInSeparateProcess = TestUtil::getClassProcessIsolationSettings( $className, - $methodName + $methodName, ); $constructor = $theClass->getConstructor(); @@ -71,14 +71,14 @@ public function build(ReflectionClass $theClass, string $methodName): Test try { $data = TestUtil::getProvidedData( $className, - $methodName + $methodName, ); } catch (IncompleteTestError $e) { $message = sprintf( "Test for %s::%s marked incomplete by data provider\n%s", $className, $methodName, - $this->throwableToString($e) + $this->throwableToString($e), ); $data = new IncompleteTestCase($className, $methodName, $message); @@ -87,7 +87,7 @@ public function build(ReflectionClass $theClass, string $methodName): Test "Test for %s::%s skipped by data provider\n%s", $className, $methodName, - $this->throwableToString($e) + $this->throwableToString($e), ); $data = new SkippedTestCase($className, $methodName, $message); @@ -96,7 +96,7 @@ public function build(ReflectionClass $theClass, string $methodName): Test "The data provider specified for %s::%s is invalid.\n%s", $className, $methodName, - $this->throwableToString($t) + $this->throwableToString($t), ); $data = new ErrorTestCase($message); @@ -111,7 +111,7 @@ public function build(ReflectionClass $theClass, string $methodName): Test $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, - $backupSettings + $backupSettings, ); } else { $test = $this->buildTestWithoutData($className); @@ -125,7 +125,7 @@ public function build(ReflectionClass $theClass, string $methodName): Test $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, - $backupSettings + $backupSettings, ); } @@ -149,7 +149,7 @@ private function buildDataProviderTestSuite( array $backupSettings ): DataProviderTestSuite { $dataProviderTestSuite = new DataProviderTestSuite( - $className . '::' . $methodName + $className . '::' . $methodName, ); $groups = TestUtil::getGroups($className, $methodName); @@ -169,7 +169,7 @@ private function buildDataProviderTestSuite( $runTestInSeparateProcess, $preserveGlobalState, $runClassInSeparateProcess, - $backupSettings + $backupSettings, ); $dataProviderTestSuite->addTest($_test, $groups); @@ -208,7 +208,7 @@ private function configureTestCase( if ($backupSettings['backupStaticAttributes'] !== null) { $test->setBackupStaticAttributes( - $backupSettings['backupStaticAttributes'] + $backupSettings['backupStaticAttributes'], ); } } @@ -225,7 +225,7 @@ private function throwableToString(Throwable $t): string return sprintf( "%s\n%s", $message, - Filter::getFilteredStacktrace($t) + Filter::getFilteredStacktrace($t), ); } @@ -233,7 +233,7 @@ private function throwableToString(Throwable $t): string "%s: %s\n%s", get_class($t), $message, - Filter::getFilteredStacktrace($t) + Filter::getFilteredStacktrace($t), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestCase.php b/app/vendor/phpunit/phpunit/src/Framework/TestCase.php index 2d83fe018..3a67f5dd1 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestCase.php @@ -60,6 +60,8 @@ use function sprintf; use function strpos; use function substr; +use function sys_get_temp_dir; +use function tempnam; use function trim; use function var_export; use DeepCopy\DeepCopy; @@ -139,7 +141,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T protected $backupGlobalsBlacklist = []; /** - * @var bool + * @var ?bool */ protected $backupStaticAttributes; @@ -156,7 +158,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T protected $backupStaticAttributesBlacklist = []; /** - * @var bool + * @var ?bool */ protected $runTestInSeparateProcess; @@ -171,7 +173,7 @@ abstract class TestCase extends Assert implements Reorderable, SelfDescribing, T protected $providedTests = []; /** - * @var bool + * @var ?bool */ private $runClassInSeparateProcess; @@ -374,7 +376,7 @@ public static function never(): InvokedCountMatcher public static function atLeast(int $requiredInvocations): InvokedAtLeastCountMatcher { return new InvokedAtLeastCountMatcher( - $requiredInvocations + $requiredInvocations, ); } @@ -429,7 +431,7 @@ public static function at(int $index): InvokedAtIndexMatcher if (isset($frame['object']) && $frame['object'] instanceof self) { $frame['object']->addWarning( - 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.' + 'The at() matcher has been deprecated. It will be removed in PHPUnit 10. Please refactor your test to not rely on the order in which methods are invoked.', ); break; @@ -555,7 +557,7 @@ public function toString(): string throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -563,7 +565,7 @@ public function toString(): string $buffer = sprintf( '%s::%s', $class->name, - $this->getName(false) + $this->getName(false), ); return $buffer . $this->getDataSetAsString(); @@ -837,18 +839,18 @@ public function run(TestResult $result = null): TestResult throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd if ($runEntireClass) { $template = new Template( - __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl' + __DIR__ . '/../Util/PHP/Template/TestCaseClass.tpl', ); } else { $template = new Template( - __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl' + __DIR__ . '/../Util/PHP/Template/TestCaseMethod.tpl', ); } @@ -924,6 +926,7 @@ public function run(TestResult $result = null): TestResult $codeCoverageCacheDirectory = "'." . $codeCoverageCacheDirectory . ".'"; $configurationFilePath = $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] ?? ''; + $processResultFile = tempnam(sys_get_temp_dir(), 'phpunit_'); $var = [ 'composerAutoload' => $composerAutoload, @@ -950,6 +953,7 @@ public function run(TestResult $result = null): TestResult 'codeCoverageFilter' => $codeCoverageFilter, 'configurationFilePath' => $configurationFilePath, 'name' => $this->getName(false), + 'processResultFile' => $processResultFile, ]; if (!$runEntireClass) { @@ -959,7 +963,7 @@ public function run(TestResult $result = null): TestResult $template->setVar($var); $php = AbstractPhpProcess::factory(); - $php->runTestJob($template->render(), $this, $result); + $php->runTestJob($template->render(), $this, $result, $processResultFile); } else { $result->run($this); } @@ -1043,7 +1047,7 @@ public function getSize(): int { return TestUtil::getSize( static::class, - $this->getName(false) + $this->getName(false), ); } @@ -1222,8 +1226,8 @@ public function runBare(): void throw new Warning( implode( "\n", - array_unique($this->warnings) - ) + array_unique($this->warnings), + ), ); } @@ -1596,7 +1600,7 @@ protected function runTest() { if (trim($this->name) === '') { throw new Exception( - 'PHPUnit\Framework\TestCase::$name must be a non-blank string.' + 'PHPUnit\Framework\TestCase::$name must be a non-blank string.', ); } @@ -1617,15 +1621,15 @@ protected function runTest() $exception, LogicalOr::fromConstraints( new ExceptionConstraint(Error::class), - new ExceptionConstraint(\Error::class) - ) + new ExceptionConstraint(\Error::class), + ), ); } else { $this->assertThat( $exception, new ExceptionConstraint( - $this->expectedException - ) + $this->expectedException, + ), ); } } @@ -1634,8 +1638,8 @@ protected function runTest() $this->assertThat( $exception, new ExceptionMessage( - $this->expectedExceptionMessage - ) + $this->expectedExceptionMessage, + ), ); } @@ -1643,8 +1647,8 @@ protected function runTest() $this->assertThat( $exception, new ExceptionMessageRegularExpression( - $this->expectedExceptionMessageRegExp - ) + $this->expectedExceptionMessageRegExp, + ), ); } @@ -1652,8 +1656,8 @@ protected function runTest() $this->assertThat( $exception, new ExceptionCode( - $this->expectedExceptionCode - ) + $this->expectedExceptionCode, + ), ); } @@ -1664,8 +1668,8 @@ protected function runTest() $this->assertThat( null, new ExceptionConstraint( - $this->expectedException - ) + $this->expectedException, + ), ); } elseif ($this->expectedExceptionMessage !== null) { $this->numAssertions++; @@ -1673,8 +1677,8 @@ protected function runTest() throw new AssertionFailedError( sprintf( 'Failed asserting that exception with message "%s" is thrown', - $this->expectedExceptionMessage - ) + $this->expectedExceptionMessage, + ), ); } elseif ($this->expectedExceptionMessageRegExp !== null) { $this->numAssertions++; @@ -1682,8 +1686,8 @@ protected function runTest() throw new AssertionFailedError( sprintf( 'Failed asserting that exception with message matching "%s" is thrown', - $this->expectedExceptionMessageRegExp - ) + $this->expectedExceptionMessageRegExp, + ), ); } elseif ($this->expectedExceptionCode !== null) { $this->numAssertions++; @@ -1691,8 +1695,8 @@ protected function runTest() throw new AssertionFailedError( sprintf( 'Failed asserting that exception with code "%s" is thrown', - $this->expectedExceptionCode - ) + $this->expectedExceptionCode, + ), ); } @@ -1717,8 +1721,8 @@ protected function iniSet(string $varName, string $newValue): void sprintf( 'INI setting "%s" could not be set to "%s".', $varName, - $newValue - ) + $newValue, + ), ); } } @@ -1753,7 +1757,7 @@ protected function setLocale(...$args): void throw new Exception( 'The locale functionality is not implemented on your platform, ' . 'the specified locale does not exist or the category name is ' . - 'invalid.' + 'invalid.', ); } } @@ -1826,7 +1830,7 @@ protected function createPartialMock(string $originalClassName, array $methods): throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -1836,7 +1840,7 @@ protected function createPartialMock(string $originalClassName, array $methods): static function (string $method) use ($reflector) { return !$reflector->hasMethod($method); - } + }, ); if ($mockedMethodsThatDontExist) { @@ -1844,18 +1848,18 @@ static function (string $method) use ($reflector) sprintf( 'createPartialMock() called with method(s) %s that do not exist in %s. This will not be allowed in future versions of PHPUnit.', implode(', ', $mockedMethodsThatDontExist), - $originalClassName - ) + $originalClassName, + ), ); } return $this->getMockBuilder($originalClassName) - ->disableOriginalConstructor() - ->disableOriginalClone() - ->disableArgumentCloning() - ->disallowMockingUnknownTypes() - ->setMethods(empty($methods) ? null : $methods) - ->getMock(); + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->setMethods(empty($methods) ? null : $methods) + ->getMock(); } /** @@ -1870,9 +1874,9 @@ static function (string $method) use ($reflector) protected function createTestProxy(string $originalClassName, array $constructorArguments = []): MockObject { return $this->getMockBuilder($originalClassName) - ->setConstructorArgs($constructorArguments) - ->enableProxyingToOriginalMethods() - ->getMock(); + ->setConstructorArgs($constructorArguments) + ->enableProxyingToOriginalMethods() + ->getMock(); } /** @@ -1902,7 +1906,7 @@ protected function getMockClass(string $originalClassName, $methods = [], array $callOriginalConstructor, $callOriginalClone, $callAutoload, - $cloneArguments + $cloneArguments, ); return get_class($mock); @@ -1931,7 +1935,7 @@ protected function getMockForAbstractClass(string $originalClassName, array $arg $callOriginalClone, $callAutoload, $mockedMethods, - $cloneArguments + $cloneArguments, ); $this->registerMockObject($mockObject); @@ -1963,7 +1967,7 @@ protected function getMockFromWsdl(string $wsdlFile, string $originalClassName = $wsdlFile, $originalClassName, $methods, - $options + $options, ) ); } @@ -1975,7 +1979,7 @@ protected function getMockFromWsdl(string $wsdlFile, string $originalClassName = $mockClassName, $callOriginalConstructor, false, - false + false, ); $this->registerMockObject($mockObject); @@ -2002,7 +2006,7 @@ protected function getMockForTrait(string $traitName, array $arguments = [], str $callOriginalClone, $callAutoload, $mockedMethods, - $cloneArguments + $cloneArguments, ); $this->registerMockObject($mockObject); @@ -2024,7 +2028,7 @@ protected function getObjectForTrait(string $traitName, array $arguments = [], s $traitClassName, $callAutoload, $callOriginalConstructor, - $arguments + $arguments, ); } @@ -2088,7 +2092,7 @@ private function verifyMockObjects(): void } $mockObject->__phpunit_verify( - $this->shouldInvocationMockerBeReset($mockObject) + $this->shouldInvocationMockerBeReset($mockObject), ); } @@ -2121,7 +2125,7 @@ private function checkRequirements(): void $missingRequirements = TestUtil::getMissingRequirements( static::class, - $this->name + $this->name, ); if (!empty($missingRequirements)) { @@ -2187,9 +2191,9 @@ private function handleDependencies(): bool $this->result->addError( $this, new SkippedTestError( - 'This test depends on a test that is larger than itself.' + 'This test depends on a test that is larger than itself.', ), - 0 + 0, ); return false; @@ -2222,9 +2226,9 @@ private function markSkippedForNotSpecifyingDependency(): void $this->result->addError( $this, new SkippedTestError( - 'This method has an invalid @depends annotation.' + 'This method has an invalid @depends annotation.', ), - 0 + 0, ); $this->result->endTest($this, 0); @@ -2241,10 +2245,10 @@ private function markSkippedForMissingDependency(ExecutionOrderDependency $depen new SkippedTestError( sprintf( 'This test depends on "%s" to pass.', - $dependency->getTarget() - ) + $dependency->getTarget(), + ), ), - 0 + 0, ); $this->result->endTest($this, 0); @@ -2261,10 +2265,10 @@ private function markWarningForUncallableDependency(ExecutionOrderDependency $de new Warning( sprintf( 'This test depends on "%s" which does not exist.', - $dependency->getTarget() - ) + $dependency->getTarget(), + ), ), - 0 + 0, ); $this->result->endTest($this, 0); @@ -2301,7 +2305,7 @@ private function stopOutputBuffering(): void } throw new RiskyTestError( - 'Test code or tested code did not (only) close its own output buffers' + 'Test code or tested code did not (only) close its own output buffers', ); } @@ -2341,7 +2345,7 @@ private function restoreGlobalState(): void try { $this->compareGlobalStateSnapshots( $this->snapshot, - $this->createGlobalStateSnapshot($this->backupGlobals === true) + $this->createGlobalStateSnapshot($this->backupGlobals === true), ); } catch (RiskyTestError $rte) { // Intentionally left empty @@ -2419,7 +2423,7 @@ private function createGlobalStateSnapshot(bool $backupGlobals): Snapshot false, false, false, - false + false, ); } @@ -2435,13 +2439,13 @@ private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): $this->compareGlobalStateSnapshotPart( $before->globalVariables(), $after->globalVariables(), - "--- Global variables before the test\n+++ Global variables after the test\n" + "--- Global variables before the test\n+++ Global variables after the test\n", ); $this->compareGlobalStateSnapshotPart( $before->superGlobalVariables(), $after->superGlobalVariables(), - "--- Super-global variables before the test\n+++ Super-global variables after the test\n" + "--- Super-global variables before the test\n+++ Super-global variables after the test\n", ); } @@ -2449,7 +2453,7 @@ private function compareGlobalStateSnapshots(Snapshot $before, Snapshot $after): $this->compareGlobalStateSnapshotPart( $before->staticAttributes(), $after->staticAttributes(), - "--- Static attributes before the test\n+++ Static attributes after the test\n" + "--- Static attributes before the test\n+++ Static attributes after the test\n", ); } } @@ -2465,11 +2469,11 @@ private function compareGlobalStateSnapshotPart(array $before, array $after, str $diff = $differ->diff( $exporter->export($before), - $exporter->export($after) + $exporter->export($after), ); throw new RiskyTestError( - $diff + $diff, ); } } @@ -2527,7 +2531,7 @@ private function registerMockObjectsFromTestArguments(array $testArguments, arra $this->registerMockObjectsFromTestArguments( $testArgument, - $visited + $visited, ); } } @@ -2538,7 +2542,7 @@ private function setDoesNotPerformAssertionsFromAnnotation(): void { $annotations = TestUtil::parseTestMethodAnnotations( static::class, - $this->name + $this->name, ); if (isset($annotations['method']['doesNotPerformAssertions'])) { @@ -2598,7 +2602,7 @@ private function checkExceptionExpectations(Throwable $throwable): bool throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -2660,10 +2664,10 @@ private function isCallableTestMethod(string $dependency): bool private function createMockObject(string $originalClassName): MockObject { return $this->getMockBuilder($originalClassName) - ->disableOriginalConstructor() - ->disableOriginalClone() - ->disableArgumentCloning() - ->disallowMockingUnknownTypes() - ->getMock(); + ->disableOriginalConstructor() + ->disableOriginalClone() + ->disableArgumentCloning() + ->disallowMockingUnknownTypes() + ->getMock(); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestFailure.php b/app/vendor/phpunit/phpunit/src/Framework/TestFailure.php index 0764bc789..f49dfc355 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestFailure.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestFailure.php @@ -95,7 +95,7 @@ public function toString(): string return sprintf( '%s: %s', $this->testName, - $this->thrownException->getMessage() + $this->thrownException->getMessage(), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestResult.php b/app/vendor/phpunit/phpunit/src/Framework/TestResult.php index 4fde29fac..2c487255f 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestResult.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestResult.php @@ -460,7 +460,7 @@ public function endTest(Test $test, float $time): void 'result' => $test->getResult(), 'size' => TestUtil::getSize( $class, - $test->getName(false) + $test->getName(false), ), ]; @@ -646,7 +646,7 @@ public function run(Test $test): void if ($test instanceof TestCase) { $test->setRegisterMockObjectsFromTestArgumentsRecursively( - $this->registerMockObjectsFromTestArgumentsRecursively + $this->registerMockObjectsFromTestArgumentsRecursively, ); $isAnyCoverageRequired = TestUtil::requiresCodeCoverageDataCollection($test); @@ -667,7 +667,7 @@ public function run(Test $test): void $this->convertDeprecationsToExceptions, $this->convertErrorsToExceptions, $this->convertNoticesToExceptions, - $this->convertWarningsToExceptions + $this->convertWarningsToExceptions, ); $errorHandler->register(); @@ -731,9 +731,9 @@ function_exists('xdebug_start_function_monitor'); $this->addFailure( $test, new RiskyTestError( - $e->getMessage() + $e->getMessage(), ), - $_timeout + $_timeout, ); $risky = true; @@ -758,10 +758,10 @@ function_exists('xdebug_start_function_monitor'); '%s in %s:%s', $e->getMessage(), $frame['file'] ?? $e->getFile(), - $frame['line'] ?? $e->getLine() + $frame['line'] ?? $e->getLine(), ), 0, - $e + $e, ); } catch (Warning $e) { $warning = true; @@ -794,16 +794,17 @@ function_exists('xdebug_start_function_monitor'); '%s() used in %s:%s', $function['function'], $function['filename'], - $function['lineno'] - ) + $function['lineno'], + ), ), - $time + $time, ); } } } if ($this->beStrictAboutTestsThatDoNotTestAnything && + !$test->doesNotPerformAssertions() && $test->getNumAssertions() === 0) { $risky = true; } @@ -811,7 +812,7 @@ function_exists('xdebug_start_function_monitor'); if ($this->forceCoversAnnotation && !$error && !$failure && !$warning && !$incomplete && !$skipped && !$risky) { $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), - $test->getName(false) + $test->getName(false), ); if (!isset($annotations['class']['covers']) && @@ -821,9 +822,9 @@ function_exists('xdebug_start_function_monitor'); $this->addFailure( $test, new MissingCoversAnnotationException( - 'This test does not have a @covers annotation but is expected to have one' + 'This test does not have a @covers annotation but is expected to have one', ), - $time + $time, ); $risky = true; @@ -839,20 +840,20 @@ function_exists('xdebug_start_function_monitor'); try { $linesToBeCovered = TestUtil::getLinesToBeCovered( get_class($test), - $test->getName(false) + $test->getName(false), ); $linesToBeUsed = TestUtil::getLinesToBeUsed( get_class($test), - $test->getName(false) + $test->getName(false), ); } catch (InvalidCoversTargetException $cce) { $this->addWarning( $test, new Warning( - $cce->getMessage() + $cce->getMessage(), ), - $time + $time, ); } } @@ -861,12 +862,12 @@ function_exists('xdebug_start_function_monitor'); $this->codeCoverage->stop( $append, $linesToBeCovered, - $linesToBeUsed + $linesToBeUsed, ); } catch (UnintentionallyCoveredCodeException $cce) { $unintentionallyCoveredCodeError = new UnintentionallyCoveredCodeError( 'This test executed code that is not listed as code to be covered or used:' . - PHP_EOL . $cce->getMessage() + PHP_EOL . $cce->getMessage(), ); } catch (OriginalCodeCoverageException $cce) { $error = true; @@ -891,7 +892,7 @@ function_exists('xdebug_start_function_monitor'); $this->addFailure( $test, $unintentionallyCoveredCodeError, - $time + $time, ); } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && !$test->doesNotPerformAssertions() && @@ -903,7 +904,7 @@ function_exists('xdebug_start_function_monitor'); throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -918,7 +919,7 @@ function_exists('xdebug_start_function_monitor'); throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -930,10 +931,10 @@ function_exists('xdebug_start_function_monitor'); sprintf( "This test did not perform any assertions\n\n%s:%d", $reflected->getFileName(), - $reflected->getStartLine() - ) + $reflected->getStartLine(), + ), ), - $time + $time, ); } elseif ($this->beStrictAboutTestsThatDoNotTestAnything && $test->doesNotPerformAssertions() && @@ -943,10 +944,10 @@ function_exists('xdebug_start_function_monitor'); new RiskyTestError( sprintf( 'This test is annotated with "@doesNotPerformAssertions" but performed %d assertions', - $test->getNumAssertions() - ) + $test->getNumAssertions(), + ), ), - $time + $time, ); } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) { $this->addFailure( @@ -954,24 +955,24 @@ function_exists('xdebug_start_function_monitor'); new OutputError( sprintf( 'This test printed output: %s', - $test->getActualOutput() - ) + $test->getActualOutput(), + ), ), - $time + $time, ); } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof TestCase) { $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), - $test->getName(false) + $test->getName(false), ); if (isset($annotations['method']['todo'])) { $this->addFailure( $test, new RiskyTestError( - 'Test method is annotated with @todo' + 'Test method is annotated with @todo', ), - $time + $time, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php index e7cef62ee..f537eb930 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestSuite.php @@ -166,7 +166,7 @@ public function __construct($theClass = '', string $name = '') if (!is_string($theClass) && !$theClass instanceof ReflectionClass) { throw InvalidArgumentException::create( 1, - 'ReflectionClass object or string' + 'ReflectionClass object or string', ); } @@ -184,7 +184,7 @@ public function __construct($theClass = '', string $name = '') throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -215,9 +215,9 @@ public function __construct($theClass = '', string $name = '') new WarningTestCase( sprintf( 'Class "%s" has no public constructor.', - $theClass->getName() - ) - ) + $theClass->getName(), + ), + ), ); return; @@ -236,9 +236,9 @@ public function __construct($theClass = '', string $name = '') new WarningTestCase( sprintf( 'No tests found in class "%s".', - $theClass->getName() - ) - ) + $theClass->getName(), + ), + ), ); } @@ -267,7 +267,7 @@ public function addTest(Test $test, $groups = []): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -310,7 +310,7 @@ public function addTestSuite($testClass): void if (!(is_object($testClass) || (is_string($testClass) && class_exists($testClass)))) { throw InvalidArgumentException::create( 1, - 'class name or object' + 'class name or object', ); } @@ -322,7 +322,7 @@ public function addTestSuite($testClass): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -336,21 +336,21 @@ public function addTestSuite($testClass): void if (!$testClass->isAbstract() && $testClass->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { try { $method = $testClass->getMethod( - BaseTestRunner::SUITE_METHODNAME + BaseTestRunner::SUITE_METHODNAME, ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd if ($method->isStatic()) { $this->addTest( - $method->invoke(null, $testClass->getName()) + $method->invoke(null, $testClass->getName()), ); $suiteMethod = true; @@ -425,7 +425,7 @@ public function addTestFile(string $filename): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -447,7 +447,7 @@ public function addTestFile(string $filename): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -460,8 +460,8 @@ public function addTestFile(string $filename): void $this->addWarning( sprintf( 'Abstract test case classes with "Test" suffix are deprecated (%s)', - $class->getName() - ) + $class->getName(), + ), ); } @@ -469,14 +469,14 @@ public function addTestFile(string $filename): void if ($class->hasMethod(BaseTestRunner::SUITE_METHODNAME)) { try { $method = $class->getMethod( - BaseTestRunner::SUITE_METHODNAME + BaseTestRunner::SUITE_METHODNAME, ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -493,7 +493,7 @@ public function addTestFile(string $filename): void $expectedClassName = substr( $expectedClassName, 0, - $pos + $pos, ); } @@ -503,8 +503,8 @@ public function addTestFile(string $filename): void "Test case class not matching filename is deprecated\n in %s\n Class name was '%s', expected '%s'", $filename, $class->getShortName(), - $expectedClassName - ) + $expectedClassName, + ), ); } @@ -517,8 +517,8 @@ public function addTestFile(string $filename): void $this->addWarning( sprintf( "Multiple test case classes per file is deprecated\n in %s", - $filename - ) + $filename, + ), ); } @@ -573,7 +573,7 @@ static function ($key): string { return (string) $key; }, - array_keys($this->groups) + array_keys($this->groups), ); } @@ -628,7 +628,7 @@ public function run(TestResult $result = null): TestResult call_user_func([$this->name, $beforeClassMethod]); } } - } catch (SkippedTestSuiteError|SkippedTestError $error) { + } catch (SkippedTestError|SkippedTestSuiteError $error) { foreach ($this->tests() as $test) { $result->startTest($test); $result->addFailure($test, $error, 0); @@ -656,7 +656,7 @@ public function run(TestResult $result = null): TestResult $result->addFailure( $test, new SkippedTestError('Test skipped because of an error in hook method'), - 0 + 0, ); } @@ -857,7 +857,7 @@ public function requires(): array } $this->requiredTests = ExecutionOrderDependency::mergeUnique( ExecutionOrderDependency::filterInvalid($this->requiredTests), - $test->requires() + $test->requires(), ); } @@ -891,13 +891,13 @@ protected function addTestMethod(ReflectionClass $class, ReflectionMethod $metho if ($test instanceof TestCase || $test instanceof DataProviderTestSuite) { $test->setDependencies( - TestUtil::getDependencies($class->getName(), $methodName) + TestUtil::getDependencies($class->getName(), $methodName), ); } $this->addTest( $test, - TestUtil::getGroups($class->getName(), $methodName) + TestUtil::getGroups($class->getName(), $methodName), ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php b/app/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php index 76b12fcfb..27c9d8b4c 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php +++ b/app/vendor/phpunit/phpunit/src/Framework/TestSuiteIterator.php @@ -67,7 +67,7 @@ public function getChildren(): self { if (!$this->hasChildren()) { throw new NoChildTestSuiteException( - 'The current item is not a TestSuite instance and therefore does not have any children.' + 'The current item is not a TestSuite instance and therefore does not have any children.', ); } diff --git a/app/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php b/app/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php index e1e41bc44..d27c6b577 100644 --- a/app/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php +++ b/app/vendor/phpunit/phpunit/src/Framework/WarningTestCase.php @@ -15,17 +15,17 @@ final class WarningTestCase extends TestCase { /** - * @var bool + * @var ?bool */ protected $backupGlobals = false; /** - * @var bool + * @var ?bool */ protected $backupStaticAttributes = false; /** - * @var bool + * @var ?bool */ protected $runTestInSeparateProcess = false; diff --git a/app/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php b/app/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php index 75a70ca5f..bbef329fc 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php +++ b/app/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php @@ -91,7 +91,7 @@ public function getTest(string $suiteClassFile, $suffixes = ''): ?TestSuite /** @var string[] $files */ $files = (new FileIteratorFacade)->getFilesAsArray( $suiteClassFile, - $suffixes + $suffixes, ); $suite = new TestSuite($suiteClassFile); @@ -109,7 +109,7 @@ public function getTest(string $suiteClassFile, $suffixes = ''): ?TestSuite try { $testClass = $this->loadSuiteClass( - $suiteClassFile + $suiteClassFile, ); } catch (\PHPUnit\Exception $e) { $this->runFailed($e->getMessage()); @@ -122,7 +122,7 @@ public function getTest(string $suiteClassFile, $suffixes = ''): ?TestSuite if (!$suiteMethod->isStatic()) { $this->runFailed( - 'suite() method must be static.' + 'suite() method must be static.', ); return null; diff --git a/app/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php b/app/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php index cc22b2508..f9d8a90d1 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php +++ b/app/vendor/phpunit/phpunit/src/Runner/DefaultTestResultCache.php @@ -107,7 +107,7 @@ public function load(): void $data = json_decode( file_get_contents($this->cacheFilename), - true + true, ); if ($data === null) { @@ -138,8 +138,8 @@ public function persist(): void throw new Exception( sprintf( 'Cannot create directory "%s" for result cache file', - $this->cacheFilename - ) + $this->cacheFilename, + ), ); } @@ -150,9 +150,9 @@ public function persist(): void 'version' => self::VERSION, 'defects' => $this->defects, 'times' => $this->times, - ] + ], ), - LOCK_EX + LOCK_EX, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php b/app/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php index 88f7ccad0..c57e70e72 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php @@ -35,8 +35,8 @@ public function registerExtension(Extension $extensionConfiguration, TestRunner throw new Exception( sprintf( 'Class "%s" does not implement a PHPUnit\Runner\Hook interface', - $extensionConfiguration->className() - ) + $extensionConfiguration->className(), + ), ); } @@ -56,8 +56,8 @@ public function createTestListenerInstance(Extension $listenerConfiguration): Te throw new Exception( sprintf( 'Class "%s" does not implement the PHPUnit\Framework\TestListener interface', - $listenerConfiguration->className() - ) + $listenerConfiguration->className(), + ), ); } @@ -77,7 +77,7 @@ private function createInstance(Extension $extensionConfiguration): object throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } @@ -110,8 +110,8 @@ private function ensureClassExists(Extension $extensionConfiguration): void throw new Exception( sprintf( 'Class "%s" does not exist', - $extensionConfiguration->className() - ) + $extensionConfiguration->className(), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php b/app/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php index e76e12ceb..c65b19482 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Extension/PharLoader.php @@ -9,7 +9,11 @@ */ namespace PHPUnit\Runner\Extension; +use function count; +use function explode; +use function implode; use function is_file; +use function strpos; use PharIo\Manifest\ApplicationName; use PharIo\Manifest\Exception as ManifestException; use PharIo\Manifest\ManifestLoader; @@ -39,7 +43,7 @@ public function loadPharExtensionsInDirectory(string $directory): array try { $applicationName = new ApplicationName('phpunit/phpunit'); - $version = new PharIoVersion(Version::series()); + $version = new PharIoVersion($this->phpunitVersion()); $manifest = ManifestLoader::fromFile('phar://' . $file . '/manifest.xml'); if (!$manifest->isExtensionFor($applicationName)) { @@ -74,4 +78,21 @@ public function loadPharExtensionsInDirectory(string $directory): array 'notLoadedExtensions' => $notLoadedExtensions, ]; } + + private function phpunitVersion(): string + { + $version = Version::id(); + + if (strpos($version, '-') === false) { + return $version; + } + + $parts = explode('.', explode('-', $version)[0]); + + if (count($parts) === 2) { + $parts[] = 0; + } + + return implode('.', $parts); + } } diff --git a/app/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php b/app/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php index 3f79da541..b7d83b9f8 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Filter/Factory.php @@ -39,8 +39,8 @@ public function addFilter(ReflectionClass $filter, $args): void throw new Exception( sprintf( 'Class "%s" does not extend RecursiveFilterIterator', - $filter->name - ) + $filter->name, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php b/app/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php index 42ca77a38..b203c1960 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Filter/GroupFilterIterator.php @@ -35,7 +35,7 @@ public function __construct(RecursiveIterator $iterator, array $groups, TestSuit if (in_array((string) $group, $groups, true)) { $testHashes = array_map( 'spl_object_hash', - $tests + $tests, ); $this->groupTests = array_merge($this->groupTests, $testHashes); diff --git a/app/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php b/app/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php index 7057e1c47..45c62f056 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Filter/NameFilterIterator.php @@ -96,7 +96,7 @@ private function setFilter(string $filter): void if (isset($matches[3]) && $matches[2] < $matches[3]) { $filter = sprintf( '%s.*with data set #(\d+)$', - $matches[1] + $matches[1], ); $this->filterMin = (int) $matches[2]; @@ -105,7 +105,7 @@ private function setFilter(string $filter): void $filter = sprintf( '%s.*with data set #%s$', $matches[1], - $matches[2] + $matches[2], ); } } // Handles: @@ -115,7 +115,7 @@ private function setFilter(string $filter): void $filter = sprintf( '%s.*with data set "%s"$', $matches[1], - $matches[2] + $matches[2], ); } @@ -126,8 +126,8 @@ private function setFilter(string $filter): void str_replace( '/', '\\/', - $filter - ) + $filter, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php b/app/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php index 6590102d7..988b0ece4 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php +++ b/app/vendor/phpunit/phpunit/src/Runner/PhptTestCase.php @@ -91,8 +91,8 @@ public function __construct(string $filename, AbstractPhpProcess $phpUtil = null throw new Exception( sprintf( 'File "%s" does not exist.', - $filename - ) + $filename, + ), ); } @@ -223,7 +223,7 @@ public function run(TestResult $result = null): TestResult $trace[0]['file'], $trace[0]['line'], $trace, - $comparisonFailure ? $diff : '' + $comparisonFailure ? $diff : '', ); } @@ -408,7 +408,7 @@ private function runSkip(array &$sections, TestResult $result, array $settings): $result->addFailure( $this, new SyntheticSkippedError($message, 0, $trace[0]['file'], $trace[0]['line'], $trace), - 0 + 0, ); $result->endTest($this, 0); @@ -489,7 +489,7 @@ private function parse(): array foreach ($unsupportedSections as $section) { if (isset($sections[$section])) { throw new Exception( - "PHPUnit does not support PHPT {$section} sections" + "PHPUnit does not support PHPT {$section} sections", ); } } @@ -520,8 +520,8 @@ private function parseExternal(array &$sections): void sprintf( 'Could not load --%s-- %s for PHPT file', $section . '_EXTERNAL', - $testDirectory . $externalFilename - ) + $testDirectory . $externalFilename, + ), ); } @@ -579,7 +579,7 @@ private function render(string $code): string "'" . dirname($this->filename) . "'", "'" . $this->filename . "'", ], - $code + $code, ); } @@ -599,7 +599,7 @@ private function renderForCoverage(string &$job, bool $pathCoverage, ?string $co $files = $this->getCoverageFiles(); $template = new Template( - __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl' + __DIR__ . '/../Util/PHP/Template/PhptTestCase.tpl', ); $composerAutoload = '\'\''; @@ -619,7 +619,7 @@ private function renderForCoverage(string &$job, bool $pathCoverage, ?string $co if (!empty($GLOBALS['__PHPUNIT_BOOTSTRAP'])) { $globals = '$GLOBALS[\'__PHPUNIT_BOOTSTRAP\'] = ' . var_export( $GLOBALS['__PHPUNIT_BOOTSTRAP'], - true + true, ) . ";\n"; } @@ -638,7 +638,7 @@ private function renderForCoverage(string &$job, bool $pathCoverage, ?string $co 'coverageFile' => $files['coverage'], 'driverMethod' => $pathCoverage ? 'forLineAndPathCoverage' : 'forLineCoverage', 'codeCoverageCacheDirectory' => $codeCoverageCacheDirectory, - ] + ], ); file_put_contents($files['job'], $job); diff --git a/app/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php b/app/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php index 0ed8330ed..f957e81ac 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php +++ b/app/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php @@ -43,7 +43,7 @@ public function load(string $suiteClassFile): ReflectionClass FileLoader::checkAndLoad($suiteClassFile); $loadedClasses = array_values( - array_diff(get_declared_classes(), $loadedClasses) + array_diff(get_declared_classes(), $loadedClasses), ); if (empty($loadedClasses)) { @@ -51,8 +51,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Class %s could not be found in %s', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } } @@ -76,8 +76,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Class %s could not be found in %s', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } @@ -88,7 +88,7 @@ public function load(string $suiteClassFile): ReflectionClass throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -99,8 +99,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Class %s declared in %s is abstract', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } @@ -116,8 +116,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Method %s::suite() declared in %s is abstract', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } @@ -126,8 +126,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Method %s::suite() declared in %s is not public', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } @@ -136,8 +136,8 @@ public function load(string $suiteClassFile): ReflectionClass sprintf( 'Method %s::suite() declared in %s is not static', $suiteClassName, - $suiteClassFile - ) + $suiteClassFile, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php b/app/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php index 64ad845cf..9ec82b600 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php +++ b/app/vendor/phpunit/phpunit/src/Runner/TestSuiteSorter.php @@ -123,7 +123,7 @@ public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDepend if (!in_array($order, $allowedOrders, true)) { throw new Exception( - '$order must be one of TestSuiteSorter::ORDER_[DEFAULT|REVERSED|RANDOMIZED|DURATION|SIZE]' + '$order must be one of TestSuiteSorter::ORDER_[DEFAULT|REVERSED|RANDOMIZED|DURATION|SIZE]', ); } @@ -134,7 +134,7 @@ public function reorderTestsInSuite(Test $suite, int $order, bool $resolveDepend if (!in_array($orderDefects, $allowedOrderDefects, true)) { throw new Exception( - '$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST' + '$orderDefects must be one of TestSuiteSorter::ORDER_DEFAULT, TestSuiteSorter::ORDER_DEFECTS_FIRST', ); } @@ -240,7 +240,7 @@ private function sortDefectsFirst(array $tests): array function ($left, $right) { return $this->cmpDefectPriorityAndTime($left, $right); - } + }, ); return $tests; @@ -256,7 +256,7 @@ private function sortByDuration(array $tests): array function ($left, $right) { return $this->cmpDuration($left, $right); - } + }, ); return $tests; @@ -272,7 +272,7 @@ private function sortBySize(array $tests): array function ($left, $right) { return $this->cmpSize($left, $right); - } + }, ); return $tests; diff --git a/app/vendor/phpunit/phpunit/src/Runner/Version.php b/app/vendor/phpunit/phpunit/src/Runner/Version.php index ccad9a7c4..962eec7a4 100644 --- a/app/vendor/phpunit/phpunit/src/Runner/Version.php +++ b/app/vendor/phpunit/phpunit/src/Runner/Version.php @@ -41,7 +41,7 @@ public static function id(): string } if (self::$version === '') { - self::$version = (new VersionId('9.6.6', dirname(__DIR__, 2)))->getVersion(); + self::$version = (new VersionId('9.6.13', dirname(__DIR__, 2)))->getVersion(); } return self::$version; diff --git a/app/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php b/app/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php index da488082f..51f0a5131 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/CliArguments/Builder.php @@ -129,13 +129,13 @@ public function fromParameters(array $parameters, array $additionalLongOptions): $options = (new CliParser)->parse( $parameters, self::SHORT_OPTIONS, - array_merge(self::LONG_OPTIONS, $additionalLongOptions) + array_merge(self::LONG_OPTIONS, $additionalLongOptions), ); } catch (CliParserException $e) { throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } @@ -880,7 +880,7 @@ public function fromParameters(array $parameters, array $additionalLongOptions): $verbose, $version, $coverageFilter, - $xdebugFilterFile + $xdebugFilterFile, ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/Command.php b/app/vendor/phpunit/phpunit/src/TextUI/Command.php index 48243caa8..31f71795f 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/Command.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/Command.php @@ -99,7 +99,7 @@ public static function main(bool $exit = true): int throw new RuntimeException( $t->getMessage(), (int) $t->getCode(), - $t + $t, ); } } @@ -118,7 +118,7 @@ public function run(array $argv, bool $exit = true): int } else { $suite = $runner->getTest( $this->arguments['test'], - $this->arguments['testSuffixes'] + $this->arguments['testSuffixes'], ); } @@ -256,8 +256,8 @@ protected function handleArguments(array $argv): void $this->exitWithErrorMessage( sprintf( 'unrecognized --order-by option: %s', - $arguments->unrecognizedOrderBy() - ) + $arguments->unrecognizedOrderBy(), + ), ); } @@ -270,7 +270,7 @@ protected function handleArguments(array $argv): void if ($arguments->hasIncludePath()) { ini_set( 'include_path', - $arguments->includePath() . PATH_SEPARATOR . ini_get('include_path') + $arguments->includePath() . PATH_SEPARATOR . ini_get('include_path'), ); } @@ -290,8 +290,8 @@ protected function handleArguments(array $argv): void $this->exitWithErrorMessage( sprintf( 'Cannot open file "%s".', - $arguments->argument() - ) + $arguments->argument(), + ), ); } } @@ -367,7 +367,7 @@ protected function handleArguments(array $argv): void $this->arguments['printer'] = $this->handlePrinter( $phpunitConfiguration->printerClass(), - $file + $file, ); } @@ -376,7 +376,7 @@ protected function handleArguments(array $argv): void $this->arguments['loader'] = $this->handleLoader( $phpunitConfiguration->testSuiteLoaderClass(), - $file + $file, ); } @@ -388,7 +388,7 @@ protected function handleArguments(array $argv): void try { $this->arguments['test'] = (new TestSuiteMapper)->map( $this->arguments['configurationObject']->testSuite(), - $this->arguments['testsuite'] ?? '' + $this->arguments['testsuite'] ?? '', ); } catch (Exception $e) { $this->printVersionString(); @@ -429,7 +429,7 @@ protected function handleLoader(string $loaderClass, string $loaderFile = ''): ? if (!class_exists($loaderClass, false)) { if ($loaderFile == '') { $loaderFile = Filesystem::classNameToFilename( - $loaderClass + $loaderClass, ); } @@ -453,7 +453,7 @@ protected function handleLoader(string $loaderClass, string $loaderFile = ''): ? throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -474,8 +474,8 @@ protected function handleLoader(string $loaderClass, string $loaderFile = ''): ? $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as loader.', - $loaderClass - ) + $loaderClass, + ), ); return null; @@ -491,7 +491,7 @@ protected function handlePrinter(string $printerClass, string $printerFile = '') if (!class_exists($printerClass, false)) { if ($printerFile === '') { $printerFile = Filesystem::classNameToFilename( - $printerClass + $printerClass, ); } @@ -511,8 +511,8 @@ protected function handlePrinter(string $printerClass, string $printerFile = '') $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as printer: class does not exist', - $printerClass - ) + $printerClass, + ), ); } @@ -523,7 +523,7 @@ protected function handlePrinter(string $printerClass, string $printerFile = '') throw new ReflectionException( $e->getMessage(), $e->getCode(), - $e + $e, ); // @codeCoverageIgnoreEnd } @@ -533,8 +533,8 @@ protected function handlePrinter(string $printerClass, string $printerFile = '') sprintf( 'Could not use "%s" as printer: class does not implement %s', $printerClass, - ResultPrinter::class - ) + ResultPrinter::class, + ), ); } @@ -542,8 +542,8 @@ protected function handlePrinter(string $printerClass, string $printerFile = '') $this->exitWithErrorMessage( sprintf( 'Could not use "%s" as printer: class cannot be instantiated', - $printerClass - ) + $printerClass, + ), ); } @@ -568,16 +568,29 @@ protected function handleBootstrap(string $filename): void $this->exitWithErrorMessage($t->getMessage()); } - $this->exitWithErrorMessage( - sprintf( - 'Error in bootstrap script: %s:%s%s%s%s', + $message = sprintf( + 'Error in bootstrap script: %s:%s%s%s%s', + get_class($t), + PHP_EOL, + $t->getMessage(), + PHP_EOL, + $t->getTraceAsString(), + ); + + while ($t = $t->getPrevious()) { + $message .= sprintf( + '%s%sPrevious error: %s:%s%s%s%s', + PHP_EOL, + PHP_EOL, get_class($t), PHP_EOL, $t->getMessage(), PHP_EOL, - $t->getTraceAsString() - ) - ); + $t->getTraceAsString(), + ); + } + + $this->exitWithErrorMessage($message); } } @@ -592,7 +605,7 @@ protected function handleVersionCheck(): void printf( 'You are not using the latest version of PHPUnit.' . PHP_EOL . 'The latest version is PHPUnit %s.' . PHP_EOL, - $latestVersion + $latestVersion, ); } else { print 'You are using the latest version of PHPUnit.' . PHP_EOL; @@ -648,7 +661,7 @@ private function handleListGroups(TestSuite $suite, bool $exit): int 'groups', 'excludeGroups', 'testsuite', - ] + ], ); print 'Available test group(s):' . PHP_EOL; @@ -663,7 +676,7 @@ private function handleListGroups(TestSuite $suite, bool $exit): int printf( ' - %s' . PHP_EOL, - $group + $group, ); } @@ -689,7 +702,7 @@ private function handleListSuites(bool $exit): int 'groups', 'excludeGroups', 'testsuite', - ] + ], ); print 'Available test suite(s):' . PHP_EOL; @@ -697,7 +710,7 @@ private function handleListSuites(bool $exit): int foreach ($this->arguments['configurationObject']->testSuite() as $testSuite) { printf( ' - %s' . PHP_EOL, - $testSuite->name() + $testSuite->name(), ); } @@ -721,7 +734,7 @@ private function handleListTests(TestSuite $suite, bool $exit): int 'filter', 'groups', 'excludeGroups', - ] + ], ); $renderer = new TextTestListRenderer; @@ -748,7 +761,7 @@ private function handleListTestsXml(TestSuite $suite, string $target, bool $exit 'filter', 'groups', 'excludeGroups', - ] + ], ); $renderer = new XmlTestListRenderer; @@ -757,7 +770,7 @@ private function handleListTestsXml(TestSuite $suite, string $target, bool $exit printf( 'Wrote list of tests that would have been run to %s' . PHP_EOL, - $target + $target, ); if ($exit) { @@ -813,8 +826,8 @@ private function generateConfiguration(): void $bootstrapScript, $testsDirectory, $src, - $cacheDirectory - ) + $cacheDirectory, + ), ); print PHP_EOL . 'Generated phpunit.xml in ' . getcwd() . '.' . PHP_EOL; @@ -840,7 +853,7 @@ private function migrateConfiguration(string $filename): void try { file_put_contents( $filename, - (new Migrator)->migrate($filename) + (new Migrator)->migrate($filename), ); print 'Migrated configuration: ' . $filename . PHP_EOL; @@ -893,7 +906,7 @@ private function handleWarmCoverageCache(XmlConfiguration\Configuration $configu if ($configuration->codeCoverage()->hasNonEmptyListOfFilesToBeIncludedInCodeCoverageReport()) { (new FilterMapper)->map( $filter, - $configuration->codeCoverage() + $configuration->codeCoverage(), ); } elseif (isset($this->arguments['coverageFilter'])) { if (!is_array($this->arguments['coverageFilter'])) { @@ -920,7 +933,7 @@ private function handleWarmCoverageCache(XmlConfiguration\Configuration $configu $cacheDirectory, !$configuration->codeCoverage()->disableCodeCoverageIgnore(), $configuration->codeCoverage()->ignoreDeprecatedCodeUnits(), - $filter + $filter, ); print 'done [' . $timer->stop()->asString() . ']' . PHP_EOL; @@ -958,7 +971,7 @@ private function warnAboutConflictingOptions(string $key, array $keys): void 'The %s and %s options cannot be combined, %s is ignored' . PHP_EOL, $this->mapKeyToOptionForWarning($_key), $this->mapKeyToOptionForWarning($key), - $this->mapKeyToOptionForWarning($_key) + $this->mapKeyToOptionForWarning($_key), ); $warningPrinted = true; diff --git a/app/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php b/app/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php index 408fa133d..09de8588a 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/DefaultResultPrinter.php @@ -142,7 +142,7 @@ public function __construct($out = null, bool $verbose = false, string $colors = if (!in_array($colors, self::AVAILABLE_COLORS, true)) { throw InvalidArgumentException::create( 3, - vsprintf('value from "%s", "%s" or "%s"', self::AVAILABLE_COLORS) + vsprintf('value from "%s", "%s" or "%s"', self::AVAILABLE_COLORS), ); } @@ -271,8 +271,8 @@ public function startTest(Test $test): void $this->write( sprintf( "Test '%s' started\n", - \PHPUnit\Util\Test::describeAsString($test) - ) + \PHPUnit\Util\Test::describeAsString($test), + ), ); } } @@ -286,8 +286,8 @@ public function endTest(Test $test, float $time): void $this->write( sprintf( "Test '%s' ended\n", - \PHPUnit\Util\Test::describeAsString($test) - ) + \PHPUnit\Util\Test::describeAsString($test), + ), ); } @@ -326,8 +326,8 @@ protected function printDefects(array $defects, string $type): void ($count == 1) ? 'was' : 'were', $count, $type, - ($count == 1) ? '' : 's' - ) + ($count == 1) ? '' : 's', + ), ); $i = 1; @@ -355,8 +355,8 @@ protected function printDefectHeader(TestFailure $defect, int $count): void sprintf( "\n%d) %s\n", $count, - $defect->getTestName() - ) + $defect->getTestName(), + ), ); } @@ -413,7 +413,7 @@ protected function printFooter(TestResult $result): void if (count($result) === 0) { $this->writeWithColor( 'fg-black, bg-yellow', - 'No tests executed!' + 'No tests executed!', ); return; @@ -427,8 +427,8 @@ protected function printFooter(TestResult $result): void count($result), (count($result) === 1) ? '' : 's', $this->numAssertions, - ($this->numAssertions === 1) ? '' : 's' - ) + ($this->numAssertions === 1) ? '' : 's', + ), ); return; @@ -443,7 +443,7 @@ protected function printFooter(TestResult $result): void $this->writeWithColor( $color, - 'OK, but incomplete, skipped, or risky tests!' + 'OK, but incomplete, skipped, or risky tests!', ); } else { $this->write("\n"); @@ -453,21 +453,21 @@ protected function printFooter(TestResult $result): void $this->writeWithColor( $color, - 'ERRORS!' + 'ERRORS!', ); } elseif ($result->failureCount()) { $color = 'fg-white, bg-red'; $this->writeWithColor( $color, - 'FAILURES!' + 'FAILURES!', ); } elseif ($result->warningCount()) { $color = 'fg-black, bg-yellow'; $this->writeWithColor( $color, - 'WARNINGS!' + 'WARNINGS!', ); } } @@ -504,8 +504,8 @@ protected function writeProgress(string $progress): void $this->numTestsWidth . 'd (%3s%%)', $this->numTestsRun, $this->numTests, - floor(($this->numTestsRun / $this->numTests) * 100) - ) + floor(($this->numTestsRun / $this->numTests) * 100), + ), ); if ($this->column == $this->maxColumn) { @@ -574,9 +574,9 @@ private function writeCountString(int $count, string $name, string $color, bool '%s%s: %d', !$first ? ', ' : '', $name, - $count + $count, ), - false + false, ); $first = false; diff --git a/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php b/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php index 770ad8742..af387beae 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestDirectoryNotFoundException.php @@ -22,8 +22,8 @@ public function __construct(string $path) parent::__construct( sprintf( 'Test directory "%s" not found', - $path - ) + $path, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php b/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php index 7ffd2c78c..3b534f7e7 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/Exception/TestFileNotFoundException.php @@ -22,8 +22,8 @@ public function __construct(string $path) parent::__construct( sprintf( 'Test file "%s" not found', - $path - ) + $path, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/Help.php b/app/vendor/phpunit/phpunit/src/TextUI/Help.php index 82f305ddb..7df19ba54 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/Help.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/Help.php @@ -246,7 +246,7 @@ static function ($matches) { return Color::colorize('fg-cyan', $matches[0]); }, - $arg + $arg, ); $desc = explode(PHP_EOL, wordwrap($option['desc'], $this->maxDescLength, PHP_EOL)); diff --git a/app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php index 3ba298e86..a1d71300c 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/TestRunner.php @@ -307,7 +307,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -341,8 +341,8 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ new HtmlResultPrinter( $arguments['testdoxHTMLFile'], $arguments['testdoxGroups'], - $arguments['testdoxExcludeGroups'] - ) + $arguments['testdoxExcludeGroups'], + ), ); } @@ -351,22 +351,22 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ new TextResultPrinter( $arguments['testdoxTextFile'], $arguments['testdoxGroups'], - $arguments['testdoxExcludeGroups'] - ) + $arguments['testdoxExcludeGroups'], + ), ); } if (isset($arguments['testdoxXMLFile'])) { $result->addListener( new XmlResultPrinter( - $arguments['testdoxXMLFile'] - ) + $arguments['testdoxXMLFile'], + ), ); } if (isset($arguments['teamcityLogfile'])) { $result->addListener( - new TeamCity($arguments['teamcityLogfile']) + new TeamCity($arguments['teamcityLogfile']), ); } @@ -374,8 +374,8 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $result->addListener( new JUnit( $arguments['junitLogfile'], - $arguments['reportUselessTests'] - ) + $arguments['reportUselessTests'], + ), ); } @@ -432,7 +432,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ (new FilterMapper)->map( $this->codeCoverageFilter, - $codeCoverageConfiguration + $codeCoverageConfiguration, ); } } @@ -449,7 +449,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $codeCoverage = new CodeCoverage( $codeCoverageDriver, - $this->codeCoverageFilter + $this->codeCoverageFilter, ); if (isset($codeCoverageConfiguration) && $codeCoverageConfiguration->hasCacheDirectory()) { @@ -532,21 +532,21 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $this->writeMessage( 'Configuration', - $arguments['configurationObject']->filename() + $arguments['configurationObject']->filename(), ); } foreach ($arguments['loadedExtensions'] as $extension) { $this->writeMessage( 'Extension', - $extension + $extension, ); } foreach ($arguments['notLoadedExtensions'] as $extension) { $this->writeMessage( 'Extension', - $extension + $extension, ); } } @@ -554,7 +554,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ if ($arguments['executionOrder'] === TestSuiteSorter::ORDER_RANDOMIZED) { $this->writeMessage( 'Random Seed', - (string) $arguments['randomOrderSeed'] + (string) $arguments['randomOrderSeed'], ); } @@ -586,7 +586,7 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $this->writeMessage('Suggestion', 'Migrate your XML configuration using "--migrate-configuration"!'); } else { $this->write( - "\n Warning - The configuration file did not pass validation!\n The following problems have been detected:\n" + "\n Warning - The configuration file did not pass validation!\n The following problems have been detected:\n", ); $this->write($arguments['configurationObject']->validationErrors()); @@ -660,6 +660,21 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $this->printer->printResult($result); if (isset($codeCoverage)) { + if (isset($arguments['coveragePHP'])) { + $this->codeCoverageGenerationStart('PHP'); + + try { + $writer = new PhpReport; + $writer->process($codeCoverage, $arguments['coveragePHP']); + + $this->codeCoverageGenerationSucceeded(); + + unset($writer); + } catch (CodeCoverageException $e) { + $this->codeCoverageGenerationFailed($e); + } + } + if (isset($arguments['coverageClover'])) { $this->codeCoverageGenerationStart('Clover XML'); @@ -714,8 +729,8 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $arguments['reportHighLowerBound'], sprintf( ' and PHPUnit %s', - Version::id() - ) + Version::id(), + ), ); $writer->process($codeCoverage, $arguments['coverageHtml']); @@ -728,21 +743,6 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ } } - if (isset($arguments['coveragePHP'])) { - $this->codeCoverageGenerationStart('PHP'); - - try { - $writer = new PhpReport; - $writer->process($codeCoverage, $arguments['coveragePHP']); - - $this->codeCoverageGenerationSucceeded(); - - unset($writer); - } catch (CodeCoverageException $e) { - $this->codeCoverageGenerationFailed($e); - } - } - if (isset($arguments['coverageText'])) { if ($arguments['coverageText'] === 'php://stdout') { $outputStream = $this->printer; @@ -756,11 +756,11 @@ public function run(TestSuite $suite, array $arguments = [], array $warnings = [ $arguments['reportLowUpperBound'], $arguments['reportHighLowerBound'], $arguments['coverageTextShowUncoveredFiles'], - $arguments['coverageTextShowOnlySummary'] + $arguments['coverageTextShowOnlySummary'], ); $outputStream->write( - $processor->process($codeCoverage, $colors) + $processor->process($codeCoverage, $colors), ); } @@ -1023,7 +1023,7 @@ private function handleConfiguration(array &$arguments): void foreach ($arguments['unavailableExtensions'] as $extension) { $arguments['warnings'][] = sprintf( 'Extension "%s" is not available', - $extension + $extension, ); } @@ -1033,7 +1033,7 @@ private function handleConfiguration(array &$arguments): void if ($loggingConfiguration->hasText()) { $arguments['listeners'][] = new DefaultResultPrinter( $loggingConfiguration->text()->target()->path(), - true + true, ); } @@ -1147,14 +1147,14 @@ private function processSuiteFilters(TestSuite $suite, array $arguments): void if (!empty($arguments['excludeGroups'])) { $filterFactory->addFilter( new ReflectionClass(ExcludeGroupFilterIterator::class), - $arguments['excludeGroups'] + $arguments['excludeGroups'], ); } if (!empty($arguments['groups'])) { $filterFactory->addFilter( new ReflectionClass(IncludeGroupFilterIterator::class), - $arguments['groups'] + $arguments['groups'], ); } @@ -1166,8 +1166,8 @@ static function (string $name): string { return '__phpunit_covers_' . $name; }, - $arguments['testsCovering'] - ) + $arguments['testsCovering'], + ), ); } @@ -1179,15 +1179,15 @@ static function (string $name): string { return '__phpunit_uses_' . $name; }, - $arguments['testsUsing'] - ) + $arguments['testsUsing'], + ), ); } if ($arguments['filter']) { $filterFactory->addFilter( new ReflectionClass(NameFilterIterator::class), - $arguments['filter'] + $arguments['filter'], ); } @@ -1204,8 +1204,8 @@ private function writeMessage(string $type, string $message): void sprintf( "%-15s%s\n", $type . ':', - $message - ) + $message, + ), ); $this->messagePrinted = true; @@ -1219,7 +1219,7 @@ private function createPrinter(string $class, array $arguments): ResultPrinter $arguments['colors'], $arguments['debug'], $arguments['columns'], - $arguments['reverseList'] + $arguments['reverseList'], ); assert($object instanceof ResultPrinter); @@ -1232,8 +1232,8 @@ private function codeCoverageGenerationStart(string $format): void $this->write( sprintf( "\nGenerating code coverage report in %s format ... ", - $format - ) + $format, + ), ); $this->timer->start(); @@ -1244,8 +1244,8 @@ private function codeCoverageGenerationSucceeded(): void $this->write( sprintf( "done [%s]\n", - $this->timer->stop()->asString() - ) + $this->timer->stop()->asString(), + ), ); } @@ -1255,8 +1255,8 @@ private function codeCoverageGenerationFailed(\Exception $e): void sprintf( "failed [%s]\n%s\n", $this->timer->stop()->asString(), - $e->getMessage() - ) + $e->getMessage(), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php b/app/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php index 170e6602b..a0ea593ae 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/TestSuiteMapper.php @@ -60,7 +60,7 @@ public function map(TestSuiteCollection $configuration, string $filter): TestSui $directory->path(), $directory->suffix(), $directory->prefix(), - $exclude + $exclude, ); if (!empty($files)) { @@ -96,7 +96,7 @@ public function map(TestSuiteCollection $configuration, string $filter): TestSui throw new RuntimeException( $e->getMessage(), $e->getCode(), - $e + $e, ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php index 80abfac7d..191113c6e 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/CodeCoverage.php @@ -150,7 +150,7 @@ public function cacheDirectory(): Directory { if (!$this->hasCacheDirectory()) { throw new Exception( - 'No cache directory has been configured' + 'No cache directory has been configured', ); } @@ -222,7 +222,7 @@ public function clover(): Clover { if (!$this->hasClover()) { throw new Exception( - 'Code Coverage report "Clover XML" has not been configured' + 'Code Coverage report "Clover XML" has not been configured', ); } @@ -244,7 +244,7 @@ public function cobertura(): Cobertura { if (!$this->hasCobertura()) { throw new Exception( - 'Code Coverage report "Cobertura XML" has not been configured' + 'Code Coverage report "Cobertura XML" has not been configured', ); } @@ -266,7 +266,7 @@ public function crap4j(): Crap4j { if (!$this->hasCrap4j()) { throw new Exception( - 'Code Coverage report "Crap4J" has not been configured' + 'Code Coverage report "Crap4J" has not been configured', ); } @@ -288,7 +288,7 @@ public function html(): Html { if (!$this->hasHtml()) { throw new Exception( - 'Code Coverage report "HTML" has not been configured' + 'Code Coverage report "HTML" has not been configured', ); } @@ -310,7 +310,7 @@ public function php(): Php { if (!$this->hasPhp()) { throw new Exception( - 'Code Coverage report "PHP" has not been configured' + 'Code Coverage report "PHP" has not been configured', ); } @@ -332,7 +332,7 @@ public function text(): Text { if (!$this->hasText()) { throw new Exception( - 'Code Coverage report "Text" has not been configured' + 'Code Coverage report "Text" has not been configured', ); } @@ -354,7 +354,7 @@ public function xml(): Xml { if (!$this->hasXml()) { throw new Exception( - 'Code Coverage report "XML" has not been configured' + 'Code Coverage report "XML" has not been configured', ); } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php index 102c96ebc..82be60323 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/CodeCoverage/FilterMapper.php @@ -22,7 +22,7 @@ public function map(Filter $filter, CodeCoverage $configuration): void $filter->includeDirectory( $directory->path(), $directory->suffix(), - $directory->prefix() + $directory->prefix(), ); } @@ -34,7 +34,7 @@ public function map(Filter $filter, CodeCoverage $configuration): void $filter->excludeDirectory( $directory->path(), $directory->suffix(), - $directory->prefix() + $directory->prefix(), ); } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php index cc77b1a3c..9f6a812a4 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Generator.php @@ -67,7 +67,7 @@ public function generateDefaultConfiguration(string $phpunitVersion, string $boo $srcDirectory, $cacheDirectory, ], - self::TEMPLATE + self::TEMPLATE, ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php index c1877317d..adf7dce08 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Loader.php @@ -73,7 +73,7 @@ public function load(string $filename): Configuration throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } @@ -85,7 +85,7 @@ public function load(string $filename): Configuration throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } @@ -100,7 +100,7 @@ public function load(string $filename): Configuration $this->logging($filename, $xpath), $this->php($filename, $xpath), $this->phpunit($filename, $document), - $this->testSuite($filename, $xpath) + $this->testSuite($filename, $xpath), ); } @@ -118,9 +118,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -132,9 +132,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -146,9 +146,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -160,9 +160,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -174,9 +174,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -188,9 +188,9 @@ public function logging(string $filename, DOMXPath $xpath): Logging new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -200,7 +200,7 @@ public function logging(string $filename, DOMXPath $xpath): Logging $teamCity, $testDoxHtml, $testDoxText, - $testDoxXml + $testDoxXml, ); } @@ -228,42 +228,42 @@ public function legacyLogging(string $filename, DOMXPath $xpath): Logging switch ($type) { case 'plain': $text = new Text( - new File($target) + new File($target), ); break; case 'junit': $junit = new Junit( - new File($target) + new File($target), ); break; case 'teamcity': $teamCity = new TeamCity( - new File($target) + new File($target), ); break; case 'testdox-html': $testDoxHtml = new TestDoxHtml( - new File($target) + new File($target), ); break; case 'testdox-text': $testDoxText = new TestDoxText( - new File($target) + new File($target), ); break; case 'testdox-xml': $testDoxXml = new TestDoxXml( - new File($target) + new File($target), ); break; @@ -276,7 +276,7 @@ public function legacyLogging(string $filename, DOMXPath $xpath): Logging $teamCity, $testDoxHtml, $testDoxText, - $testDoxXml + $testDoxXml, ); } @@ -304,7 +304,7 @@ private function getElementConfigurationParameters(string $filename, DOMElement $file = $this->toAbsolutePath( $filename, (string) $element->getAttribute('file'), - true + true, ); } @@ -402,38 +402,38 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do if ($cacheDirectory !== null) { $cacheDirectory = new Directory( - $this->toAbsolutePath($filename, $cacheDirectory) + $this->toAbsolutePath($filename, $cacheDirectory), ); } $pathCoverage = $this->getBooleanAttribute( $element, 'pathCoverage', - false + false, ); $includeUncoveredFiles = $this->getBooleanAttribute( $element, 'includeUncoveredFiles', - true + true, ); $processUncoveredFiles = $this->getBooleanAttribute( $element, 'processUncoveredFiles', - false + false, ); $ignoreDeprecatedCodeUnits = $this->getBooleanAttribute( $element, 'ignoreDeprecatedCodeUnits', - false + false, ); $disableCodeCoverageIgnore = $this->getBooleanAttribute( $element, 'disableCodeCoverageIgnore', - false + false, ); } @@ -445,9 +445,9 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -459,9 +459,9 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -473,10 +473,10 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), ), - $this->getIntegerAttribute($element, 'threshold', 30) + $this->getIntegerAttribute($element, 'threshold', 30), ); } @@ -488,11 +488,11 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new Directory( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputDirectory') - ) + (string) $this->getStringAttribute($element, 'outputDirectory'), + ), ), $this->getIntegerAttribute($element, 'lowUpperBound', 50), - $this->getIntegerAttribute($element, 'highLowerBound', 90) + $this->getIntegerAttribute($element, 'highLowerBound', 90), ); } @@ -504,9 +504,9 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), + ), ); } @@ -518,11 +518,11 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new File( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputFile') - ) + (string) $this->getStringAttribute($element, 'outputFile'), + ), ), $this->getBooleanAttribute($element, 'showUncoveredFiles', false), - $this->getBooleanAttribute($element, 'showOnlySummary', false) + $this->getBooleanAttribute($element, 'showOnlySummary', false), ); } @@ -534,9 +534,9 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do new Directory( $this->toAbsolutePath( $filename, - (string) $this->getStringAttribute($element, 'outputDirectory') - ) - ) + (string) $this->getStringAttribute($element, 'outputDirectory'), + ), + ), ); } @@ -557,7 +557,7 @@ private function codeCoverage(string $filename, DOMXPath $xpath, DOMDocument $do $html, $php, $text, - $xml + $xml, ); } @@ -569,13 +569,13 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume $ignoreDeprecatedCodeUnits = $this->getBooleanAttribute( $document->documentElement, 'ignoreDeprecatedCodeUnitsFromCodeCoverage', - false + false, ); $disableCodeCoverageIgnore = $this->getBooleanAttribute( $document->documentElement, 'disableCodeCoverageIgnore', - false + false, ); $includeUncoveredFiles = true; @@ -587,14 +587,14 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume if ($element->hasAttribute('addUncoveredFilesFromWhitelist')) { $includeUncoveredFiles = (bool) $this->getBoolean( (string) $element->getAttribute('addUncoveredFilesFromWhitelist'), - true + true, ); } if ($element->hasAttribute('processUncoveredFilesFromWhitelist')) { $processUncoveredFiles = (bool) $this->getBoolean( (string) $element->getAttribute('processUncoveredFilesFromWhitelist'), - false + false, ); } } @@ -622,14 +622,14 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume switch ($type) { case 'coverage-clover': $clover = new Clover( - new File($target) + new File($target), ); break; case 'coverage-cobertura': $cobertura = new Cobertura( - new File($target) + new File($target), ); break; @@ -637,7 +637,7 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume case 'coverage-crap4j': $crap4j = new Crap4j( new File($target), - $this->getIntegerAttribute($log, 'threshold', 30) + $this->getIntegerAttribute($log, 'threshold', 30), ); break; @@ -646,14 +646,14 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume $html = new CodeCoverageHtml( new Directory($target), $this->getIntegerAttribute($log, 'lowUpperBound', 50), - $this->getIntegerAttribute($log, 'highLowerBound', 90) + $this->getIntegerAttribute($log, 'highLowerBound', 90), ); break; case 'coverage-php': $php = new CodeCoveragePhp( - new File($target) + new File($target), ); break; @@ -662,14 +662,14 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume $text = new CodeCoverageText( new File($target), $this->getBooleanAttribute($log, 'showUncoveredFiles', false), - $this->getBooleanAttribute($log, 'showOnlySummary', false) + $this->getBooleanAttribute($log, 'showOnlySummary', false), ); break; case 'coverage-xml': $xml = new CodeCoverageXml( - new Directory($target) + new Directory($target), ); break; @@ -693,7 +693,7 @@ private function legacyCodeCoverage(string $filename, DOMXPath $xpath, DOMDocume $html, $php, $text, - $xml + $xml, ); } @@ -737,7 +737,7 @@ private function readFilterDirectories(string $filename, DOMXPath $xpath, string $this->toAbsolutePath($filename, $directoryPath), $directoryNode->hasAttribute('prefix') ? (string) $directoryNode->getAttribute('prefix') : '', $directoryNode->hasAttribute('suffix') ? (string) $directoryNode->getAttribute('suffix') : '.php', - $directoryNode->hasAttribute('group') ? (string) $directoryNode->getAttribute('group') : 'DEFAULT' + $directoryNode->hasAttribute('group') ? (string) $directoryNode->getAttribute('group') : 'DEFAULT', ); } @@ -784,7 +784,7 @@ private function parseGroupConfiguration(DOMXPath $xpath, string $root): Groups return new Groups( GroupCollection::fromArray($include), - GroupCollection::fromArray($exclude) + GroupCollection::fromArray($exclude), ); } @@ -809,7 +809,7 @@ private function getBooleanAttribute(DOMElement $element, string $attribute, boo return (bool) $this->getBoolean( (string) $element->getAttribute($attribute), - false + false, ); } @@ -821,7 +821,7 @@ private function getIntegerAttribute(DOMElement $element, string $attribute, int return $this->getInteger( (string) $element->getAttribute($attribute), - $default + $default, ); } @@ -862,7 +862,7 @@ private function php(string $filename, DOMXPath $xpath): Php $iniSettings[] = new IniSetting( (string) $ini->getAttribute('name'), - (string) $ini->getAttribute('value') + (string) $ini->getAttribute('value'), ); } @@ -875,7 +875,7 @@ private function php(string $filename, DOMXPath $xpath): Php $constants[] = new Constant( (string) $const->getAttribute('name'), - $this->getBoolean($value, $value) + $this->getBoolean($value, $value), ); } @@ -1077,7 +1077,7 @@ private function phpunit(string $filename, DOMDocument $document): PHPUnit $this->getBooleanAttribute($document->documentElement, 'backupGlobals', false), $this->getBooleanAttribute($document->documentElement, 'backupStaticAttributes', false), $this->getBooleanAttribute($document->documentElement, 'registerMockObjectsFromTestArgumentsRecursively', false), - $conflictBetweenPrinterClassAndTestdox + $conflictBetweenPrinterClassAndTestdox, ); } @@ -1171,7 +1171,7 @@ private function testSuite(string $filename, DOMXPath $xpath): TestSuiteCollecti $prefix, $suffix, $phpVersion, - $phpVersionOperator + $phpVersionOperator, ); } @@ -1201,7 +1201,7 @@ private function testSuite(string $filename, DOMXPath $xpath): TestSuiteCollecti $files[] = new TestFile( $this->toAbsolutePath($filename, $file), $phpVersion, - $phpVersionOperator + $phpVersionOperator, ); } @@ -1209,7 +1209,7 @@ private function testSuite(string $filename, DOMXPath $xpath): TestSuiteCollecti (string) $element->getAttribute('name'), TestDirectoryCollection::fromArray($directories), TestFileCollection::fromArray($files), - FileCollection::fromArray($exclude) + FileCollection::fromArray($exclude), ); } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php index abef49f10..2bb663814 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/MigrationBuilder.php @@ -28,7 +28,7 @@ final class MigrationBuilder IntroduceCoverageElement::class, MoveAttributesFromRootToCoverage::class, MoveAttributesFromFilterWhitelistToCoverage::class, - MoveWhitelistDirectoriesToCoverage::class, + MoveWhitelistIncludesToCoverage::class, MoveWhitelistExcludesToCoverage::class, RemoveEmptyFilter::class, CoverageCloverToReport::class, @@ -51,8 +51,8 @@ public function build(string $fromVersion): array throw new MigrationBuilderException( sprintf( 'Migration from schema version %s is not supported', - $fromVersion - ) + $fromVersion, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php index 867a84417..de52857ee 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/IntroduceCoverageElement.php @@ -22,7 +22,7 @@ public function migrate(DOMDocument $document): void $document->documentElement->insertBefore( $coverage, - $document->documentElement->firstChild + $document->documentElement->firstChild, ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php index e987308b7..c07de0ec7 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/LogToReportMigration.php @@ -67,7 +67,7 @@ abstract protected function toReportFormat(DOMElement $logNode): DOMElement; private function findLogNode(DOMDocument $document): ?DOMElement { $logNode = (new DOMXPath($document))->query( - sprintf('//logging/log[@type="%s"]', $this->forType()) + sprintf('//logging/log[@type="%s"]', $this->forType()), )->item(0); if (!$logNode instanceof DOMElement) { diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php index c55315fa0..17d5f4db0 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistExcludesToCoverage.php @@ -47,7 +47,7 @@ public function migrate(DOMDocument $document): void if ($targetExclude === null) { $targetExclude = $coverage->appendChild( - $document->createElement('exclude') + $document->createElement('exclude'), ); } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistIncludesToCoverage.php similarity index 83% rename from app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php rename to app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistIncludesToCoverage.php index 14e6cec83..c75a6d84f 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistDirectoriesToCoverage.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/MoveWhitelistIncludesToCoverage.php @@ -16,7 +16,7 @@ /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ -final class MoveWhitelistDirectoriesToCoverage implements Migration +final class MoveWhitelistIncludesToCoverage implements Migration { /** * @throws MigrationException @@ -39,7 +39,11 @@ public function migrate(DOMDocument $document): void $coverage->appendChild($include); foreach (SnapshotNodeList::fromNodeList($whitelist->childNodes) as $child) { - if (!$child instanceof DOMElement || $child->nodeName !== 'directory') { + if (!$child instanceof DOMElement) { + continue; + } + + if (!($child->nodeName === 'directory' || $child->nodeName === 'file')) { continue; } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php index 2e86ab6e9..ddcfcf071 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrations/UpdateSchemaLocationTo93.php @@ -21,7 +21,7 @@ public function migrate(DOMDocument $document): void $document->documentElement->setAttributeNS( 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation', - 'https://schema.phpunit.de/9.3/phpunit.xsd' + 'https://schema.phpunit.de/9.3/phpunit.xsd', ); } } diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php index d173e7af2..57bc9f2eb 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/Migration/Migrator.php @@ -34,7 +34,7 @@ public function migrate(string $filename): string sprintf( '"%s" is not a valid PHPUnit XML configuration file that can be migrated', $filename, - ) + ), ); } @@ -42,7 +42,7 @@ public function migrate(string $filename): string $filename, false, true, - true + true, ); foreach ((new MigrationBuilder)->build($origin->version()) as $migration) { diff --git a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php index 5fb0c72b2..f5969945b 100644 --- a/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php +++ b/app/vendor/phpunit/phpunit/src/TextUI/XmlConfiguration/PHP/PhpHandler.php @@ -52,7 +52,7 @@ private function handleIncludePaths(DirectoryCollection $includePaths): void 'include_path', implode(PATH_SEPARATOR, $includePathsAsStrings) . PATH_SEPARATOR . - ini_get('include_path') + ini_get('include_path'), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php b/app/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php index 5066c4bb0..764bbbfb4 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php +++ b/app/vendor/phpunit/phpunit/src/Util/Annotation/DocBlock.php @@ -128,7 +128,7 @@ public static function ofClass(ReflectionClass $class): self $class->getEndLine(), $class->getFileName(), $className, - $className + $className, ); } @@ -145,7 +145,7 @@ public static function ofMethod(ReflectionMethod $method, string $classNameInHie $method->getEndLine(), $method->getFileName(), $method->getName(), - $classNameInHierarchy + $classNameInHierarchy, ); } @@ -263,7 +263,7 @@ public function requirements(): array array_filter([ 'setting' => $recordedSettings, 'extension_versions' => $extensionVersions, - ]) + ]), ); } @@ -290,8 +290,8 @@ public function getProvidedData(): ?array throw new InvalidDataSetException( sprintf( 'Data set %s is invalid.', - is_int($key) ? '#' . $key : '"' . $key . '"' - ) + is_int($key) ? '#' . $key : '"' . $key . '"', + ), ); } } @@ -399,14 +399,14 @@ private function getDataFromDataProviderAnnotation(string $docComment): ?array $dataProviderClass = new ReflectionClass($dataProviderClassName); $dataProviderMethod = $dataProviderClass->getMethod( - $dataProviderMethodName + $dataProviderMethodName, ); // @codeCoverageIgnoreStart } catch (ReflectionException $e) { throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); // @codeCoverageIgnoreEnd } @@ -435,8 +435,8 @@ private function getDataFromDataProviderAnnotation(string $docComment): ?array sprintf( 'The key "%s" has already been defined in the data provider "%s".', $key, - $match - ) + $match, + ), ); } else { $data[$key] = $value; @@ -478,7 +478,7 @@ private function getDataFromTestWithAnnotation(string $docComment): ?array if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception( - 'The data set for the @testWith annotation cannot be parsed: ' . json_last_error_msg() + 'The data set for the @testWith annotation cannot be parsed: ' . json_last_error_msg(), ); } @@ -494,9 +494,9 @@ private function getDataFromTestWithAnnotation(string $docComment): ?array private function cleanUpMultiLineAnnotation(string $docComment): string { - //removing initial ' * ' for docComment + // removing initial ' * ' for docComment $docComment = str_replace("\r\n", "\n", $docComment); - $docComment = preg_replace('/' . '\n' . '\s*' . '\*' . '\s?' . '/', "\n", $docComment); + $docComment = preg_replace('/\n\s*\*\s?/', "\n", $docComment); $docComment = (string) substr($docComment, 0, -1); return rtrim($docComment, "\n"); @@ -533,14 +533,14 @@ static function (ReflectionClass $trait): array { return self::parseDocBlock((string) $trait->getDocComment()); }, - array_values($reflector->getTraits()) - ) + array_values($reflector->getTraits()), + ), ); } return array_merge( $annotations, - self::parseDocBlock((string) $reflector->getDocComment()) + self::parseDocBlock((string) $reflector->getDocComment()), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php b/app/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php index 8ee6c8395..a34cb9ade 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php +++ b/app/vendor/phpunit/phpunit/src/Util/Annotation/Registry.php @@ -59,7 +59,7 @@ public function forClassName(string $class): DocBlock throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -85,7 +85,7 @@ public function forMethod(string $classInHierarchy, string $method): DocBlock throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Util/Color.php b/app/vendor/phpunit/phpunit/src/Util/Color.php index b96eb4747..ee0f412df 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Color.php +++ b/app/vendor/phpunit/phpunit/src/Util/Color.php @@ -120,7 +120,7 @@ static function ($matches) { return self::dim($matches[0]); }, - $path[$last] + $path[$last], ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/ErrorHandler.php b/app/vendor/phpunit/phpunit/src/Util/ErrorHandler.php index f8566347e..3bdf9bf1d 100644 --- a/app/vendor/phpunit/phpunit/src/Util/ErrorHandler.php +++ b/app/vendor/phpunit/phpunit/src/Util/ErrorHandler.php @@ -64,7 +64,7 @@ static function ($errorNumber, $errorString) } return false; - } + }, ); $result = $callable(); diff --git a/app/vendor/phpunit/phpunit/src/Util/ExcludeList.php b/app/vendor/phpunit/phpunit/src/Util/ExcludeList.php index 778eb3091..a00bfff08 100644 --- a/app/vendor/phpunit/phpunit/src/Util/ExcludeList.php +++ b/app/vendor/phpunit/phpunit/src/Util/ExcludeList.php @@ -161,8 +161,8 @@ public static function addDirectory(string $directory): void throw new Exception( sprintf( '"%s" is not a directory', - $directory - ) + $directory, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/FileLoader.php b/app/vendor/phpunit/phpunit/src/Util/FileLoader.php index 8abdc91cf..e0a665061 100644 --- a/app/vendor/phpunit/phpunit/src/Util/FileLoader.php +++ b/app/vendor/phpunit/phpunit/src/Util/FileLoader.php @@ -42,7 +42,7 @@ public static function checkAndLoad(string $filename): string $includePathFilename === $localFile || !self::isReadable($includePathFilename)) { throw new Exception( - sprintf('Cannot open file "%s".' . "\n", $filename) + sprintf('Cannot open file "%s".' . "\n", $filename), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/Filesystem.php b/app/vendor/phpunit/phpunit/src/Util/Filesystem.php index 35b2690b1..886829d2d 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Filesystem.php +++ b/app/vendor/phpunit/phpunit/src/Util/Filesystem.php @@ -30,7 +30,7 @@ public static function classNameToFilename(string $className): string return str_replace( ['_', '\\'], DIRECTORY_SEPARATOR, - $className + $className, ) . '.php'; } diff --git a/app/vendor/phpunit/phpunit/src/Util/Filter.php b/app/vendor/phpunit/phpunit/src/Util/Filter.php index 42563937d..94b7e77d9 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Filter.php +++ b/app/vendor/phpunit/phpunit/src/Util/Filter.php @@ -53,7 +53,7 @@ public static function getFilteredStacktrace(Throwable $t): string if (!self::frameExists($eTrace, $eFile, $eLine)) { array_unshift( $eTrace, - ['file' => $eFile, 'line' => $eLine] + ['file' => $eFile, 'line' => $eLine], ); } @@ -65,7 +65,7 @@ public static function getFilteredStacktrace(Throwable $t): string $filteredStacktrace .= sprintf( "%s:%s\n", $frame['file'], - $frame['line'] ?? '?' + $frame['line'] ?? '?', ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/GlobalState.php b/app/vendor/phpunit/phpunit/src/Util/GlobalState.php index 5cf16bcd4..18b5a6466 100644 --- a/app/vendor/phpunit/phpunit/src/Util/GlobalState.php +++ b/app/vendor/phpunit/phpunit/src/Util/GlobalState.php @@ -188,7 +188,7 @@ public static function getIniSettingsAsString(): string $result .= sprintf( '@ini_set(%s, %s);' . "\n", self::exportVariable($key), - self::exportVariable((string) $value) + self::exportVariable((string) $value), ); } @@ -206,7 +206,7 @@ public static function getConstantsAsString(): string 'if (!defined(\'%s\')) define(\'%s\', %s);' . "\n", $name, $name, - self::exportVariable($value) + self::exportVariable($value), ); } } @@ -229,7 +229,7 @@ public static function getGlobalsAsString(): string '$GLOBALS[\'%s\'][\'%s\'] = %s;' . "\n", $superGlobalArray, $key, - self::exportVariable($GLOBALS[$superGlobalArray][$key]) + self::exportVariable($GLOBALS[$superGlobalArray][$key]), ); } } @@ -243,7 +243,7 @@ public static function getGlobalsAsString(): string $result .= sprintf( '$GLOBALS[\'%s\'] = %s;' . "\n", $key, - self::exportVariable($GLOBALS[$key]) + self::exportVariable($GLOBALS[$key]), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/Json.php b/app/vendor/phpunit/phpunit/src/Util/Json.php index 752c1fd60..e200071b1 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Json.php +++ b/app/vendor/phpunit/phpunit/src/Util/Json.php @@ -37,7 +37,7 @@ public static function prettify(string $json): string if (json_last_error()) { throw new Exception( - 'Cannot prettify invalid json' + 'Cannot prettify invalid json', ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/Log/JUnit.php b/app/vendor/phpunit/phpunit/src/Util/Log/JUnit.php index 3ceb5e845..c7ba4fc56 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Log/JUnit.php +++ b/app/vendor/phpunit/phpunit/src/Util/Log/JUnit.php @@ -226,37 +226,37 @@ public function endTestSuite(TestSuite $suite): void { $this->testSuites[$this->testSuiteLevel]->setAttribute( 'tests', - (string) $this->testSuiteTests[$this->testSuiteLevel] + (string) $this->testSuiteTests[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'assertions', - (string) $this->testSuiteAssertions[$this->testSuiteLevel] + (string) $this->testSuiteAssertions[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'errors', - (string) $this->testSuiteErrors[$this->testSuiteLevel] + (string) $this->testSuiteErrors[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'warnings', - (string) $this->testSuiteWarnings[$this->testSuiteLevel] + (string) $this->testSuiteWarnings[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'failures', - (string) $this->testSuiteFailures[$this->testSuiteLevel] + (string) $this->testSuiteFailures[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'skipped', - (string) $this->testSuiteSkipped[$this->testSuiteLevel] + (string) $this->testSuiteSkipped[$this->testSuiteLevel], ); $this->testSuites[$this->testSuiteLevel]->setAttribute( 'time', - sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]) + sprintf('%F', $this->testSuiteTimes[$this->testSuiteLevel]), ); if ($this->testSuiteLevel > 1) { @@ -293,7 +293,7 @@ public function startTest(Test $test): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -308,7 +308,7 @@ public function startTest(Test $test): void throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -337,16 +337,16 @@ public function endTest(Test $test, float $time): void $this->currentTestCase->setAttribute( 'assertions', - (string) $numAssertions + (string) $numAssertions, ); $this->currentTestCase->setAttribute( 'time', - sprintf('%F', $time) + sprintf('%F', $time), ); $this->testSuites[$this->testSuiteLevel]->appendChild( - $this->currentTestCase + $this->currentTestCase, ); $this->testSuiteTests[$this->testSuiteLevel]++; @@ -361,7 +361,7 @@ public function endTest(Test $test, float $time): void if (!empty($testOutput)) { $systemOut = $this->document->createElement( 'system-out', - Xml::prepareString($testOutput) + Xml::prepareString($testOutput), ); $this->currentTestCase->appendChild($systemOut); @@ -392,12 +392,12 @@ private function doAddFault(Test $test, Throwable $t, string $type): void $buffer .= trim( TestFailure::exceptionToString($t) . "\n" . - Filter::getFilteredStacktrace($t) + Filter::getFilteredStacktrace($t), ); $fault = $this->document->createElement( $type, - Xml::prepareString($buffer) + Xml::prepareString($buffer), ); if ($t instanceof ExceptionWrapper) { diff --git a/app/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php b/app/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php index 0efe3438a..30375bd3c 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php +++ b/app/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php @@ -77,7 +77,7 @@ public function addError(Test $test, Throwable $t, float $time): void 'message' => self::getMessage($t), 'details' => self::getDetails($t), 'duration' => self::toMilliseconds($time), - ] + ], ); } @@ -169,7 +169,7 @@ public function printIgnoredTest(string $testName, Throwable $t, float $time): v 'message' => self::getMessage($t), 'details' => self::getDetails($t), 'duration' => self::toMilliseconds($time), - ] + ], ); } @@ -189,7 +189,7 @@ public function startTestSuite(TestSuite $suite): void $this->printEvent( 'testCount', - ['count' => count($suite)] + ['count' => count($suite)], ); } @@ -271,7 +271,7 @@ public function endTest(Test $test, float $time): void [ 'name' => $test->getName(), 'duration' => self::toMilliseconds($time), - ] + ], ); } @@ -351,7 +351,7 @@ private static function escapeValue(string $text): string return str_replace( ['|', "'", "\n", "\r", ']', '['], ['||', "|'", '|n', '|r', '|]', '|['], - $text + $text, ); } @@ -367,7 +367,7 @@ private static function getFileName($className): string throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php b/app/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php index 8706ae1a1..0405d1f33 100644 --- a/app/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php +++ b/app/vendor/phpunit/phpunit/src/Util/PHP/AbstractPhpProcess.php @@ -15,6 +15,8 @@ use function array_merge; use function assert; use function escapeshellarg; +use function file_exists; +use function file_get_contents; use function ini_get_all; use function restore_error_handler; use function set_error_handler; @@ -24,6 +26,7 @@ use function strrpos; use function substr; use function trim; +use function unlink; use function unserialize; use __PHP_Incomplete_Class; use ErrorException; @@ -174,17 +177,24 @@ public function getTimeout(): int * * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException */ - public function runTestJob(string $job, Test $test, TestResult $result): void + public function runTestJob(string $job, Test $test, TestResult $result, string $processResultFile): void { $result->startTest($test); - $_result = $this->runJob($job); + $processResult = ''; + $_result = $this->runJob($job); + + if (file_exists($processResultFile)) { + $processResult = file_get_contents($processResultFile); + + @unlink($processResultFile); + } $this->processChildResult( $test, $result, - $_result['stdout'], - $_result['stderr'] + $processResult, + $_result['stderr'], ); } @@ -199,15 +209,15 @@ public function getCommand(array $settings, string $file = null): string $settings = array_merge( $settings, $this->runtime->getCurrentSettings( - array_keys(ini_get_all('pcov')) - ) + array_keys(ini_get_all('pcov')), + ), ); } elseif ($this->runtime->hasXdebug()) { $settings = array_merge( $settings, $this->runtime->getCurrentSettings( - array_keys(ini_get_all('xdebug')) - ) + array_keys(ini_get_all('xdebug')), + ), ); } @@ -268,7 +278,7 @@ private function processChildResult(Test $test, TestResult $result, string $stdo $result->addError( $test, new Exception(trim($stderr)), - $time + $time, ); } else { set_error_handler( @@ -278,7 +288,7 @@ private function processChildResult(Test $test, TestResult $result, string $stdo static function ($errno, $errstr, $errfile, $errline): void { throw new ErrorException($errstr, $errno, $errno, $errfile, $errline); - } + }, ); try { @@ -293,7 +303,7 @@ static function ($errno, $errstr, $errfile, $errline): void $result->addFailure( $test, new AssertionFailedError('Test was run in child process and ended unexpectedly'), - $time + $time, ); } } catch (ErrorException $e) { @@ -303,7 +313,7 @@ static function ($errno, $errstr, $errfile, $errline): void $result->addError( $test, new Exception(trim($stdout), 0, $e), - $time + $time, ); } @@ -322,7 +332,7 @@ static function ($errno, $errstr, $errfile, $errline): void if ($result->getCollectCodeCoverageInformation()) { $result->getCodeCoverage()->merge( - $childResult->getCodeCoverage() + $childResult->getCodeCoverage(), ); } @@ -338,37 +348,37 @@ static function ($errno, $errstr, $errfile, $errline): void $result->addError( $test, $this->getException($notImplemented[0]), - $time + $time, ); } elseif (!empty($risky)) { $result->addError( $test, $this->getException($risky[0]), - $time + $time, ); } elseif (!empty($skipped)) { $result->addError( $test, $this->getException($skipped[0]), - $time + $time, ); } elseif (!empty($errors)) { $result->addError( $test, $this->getException($errors[0]), - $time + $time, ); } elseif (!empty($warnings)) { $result->addWarning( $test, $this->getException($warnings[0]), - $time + $time, ); } elseif (!empty($failures)) { $result->addFailure( $test, $this->getException($failures[0]), - $time + $time, ); } } @@ -402,12 +412,12 @@ private function getException(TestFailure $error): Exception sprintf( '%s: %s', $exceptionArray['_PHP_Incomplete_Class_Name'], - $exceptionArray['message'] + $exceptionArray['message'], ), $exceptionArray['code'], $exceptionArray['file'], $exceptionArray['line'], - $exceptionArray['trace'] + $exceptionArray['trace'], ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php b/app/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php index c4dc11146..64974f1df 100644 --- a/app/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php +++ b/app/vendor/phpunit/phpunit/src/Util/PHP/DefaultPhpProcess.php @@ -49,7 +49,7 @@ public function runJob(string $job, array $settings = []): array if (!($this->tempFile = tempnam(sys_get_temp_dir(), 'PHPUnit')) || file_put_contents($this->tempFile, $job) === false) { throw new Exception( - 'Unable to write temporary file' + 'Unable to write temporary file', ); } @@ -101,12 +101,12 @@ protected function runProcess(string $job, array $settings): array $pipeSpec, $pipes, null, - $env + $env, ); if (!is_resource($process)) { throw new Exception( - 'Unable to spawn worker process' + 'Unable to spawn worker process', ); } @@ -138,8 +138,8 @@ protected function runProcess(string $job, array $settings): array throw new Exception( sprintf( 'Job execution aborted after %d seconds', - $this->timeout - ) + $this->timeout, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl b/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl index 95035e505..0486d1164 100644 --- a/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl +++ b/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseClass.tpl @@ -58,7 +58,7 @@ function __phpunit_run_isolated_test() $test = new {className}('{name}', unserialize('{data}'), '{dataName}'); $test->setDependencyInput(unserialize('{dependencyInput}')); - $test->setInIsolation(TRUE); + $test->setInIsolation(true); ob_end_clean(); $test->run($result); @@ -68,6 +68,7 @@ function __phpunit_run_isolated_test() } ini_set('xdebug.scream', '0'); + @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ if ($stdout = @stream_get_contents(STDOUT)) { $output = $stdout . $output; @@ -78,13 +79,16 @@ function __phpunit_run_isolated_test() } } - print serialize( - [ - 'testResult' => $test->getResult(), - 'numAssertions' => $test->getNumAssertions(), - 'result' => $result, - 'output' => $output - ] + file_put_contents( + '{processResultFile}', + serialize( + [ + 'testResult' => $test->getResult(), + 'numAssertions' => $test->getNumAssertions(), + 'result' => $result, + 'output' => $output + ] + ) ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl b/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl index da824e720..067934dbc 100644 --- a/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl +++ b/app/vendor/phpunit/phpunit/src/Util/PHP/Template/TestCaseMethod.tpl @@ -71,6 +71,7 @@ function __phpunit_run_isolated_test() } ini_set('xdebug.scream', '0'); + @rewind(STDOUT); /* @ as not every STDOUT target stream is rewindable */ if ($stdout = @stream_get_contents(STDOUT)) { $output = $stdout . $output; @@ -81,13 +82,16 @@ function __phpunit_run_isolated_test() } } - print serialize( - [ - 'testResult' => $test->getResult(), - 'numAssertions' => $test->getNumAssertions(), - 'result' => $result, - 'output' => $output - ] + file_put_contents( + '{processResultFile}', + serialize( + [ + 'testResult' => $test->getResult(), + 'numAssertions' => $test->getNumAssertions(), + 'result' => $result, + 'output' => $output + ] + ) ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php b/app/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php index 9ef925556..2480bc8c1 100644 --- a/app/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php +++ b/app/vendor/phpunit/phpunit/src/Util/PHP/WindowsPhpProcess.php @@ -36,7 +36,7 @@ protected function getHandles(): array { if (false === $stdout_handle = tmpfile()) { throw new Exception( - 'A temporary file could not be created; verify that your TEMP environment variable is writable' + 'A temporary file could not be created; verify that your TEMP environment variable is writable', ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/Printer.php b/app/vendor/phpunit/phpunit/src/Util/Printer.php index 77b5745ad..311d49433 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Printer.php +++ b/app/vendor/phpunit/phpunit/src/Util/Printer.php @@ -67,8 +67,8 @@ public function __construct($out = null) throw new Exception( sprintf( '"%s" does not match "socket://hostname:port" format', - $out - ) + $out, + ), ); } @@ -81,8 +81,8 @@ public function __construct($out = null) throw new Exception( sprintf( 'Directory "%s" was not created', - dirname($out) - ) + dirname($out), + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/RegularExpression.php b/app/vendor/phpunit/phpunit/src/Util/RegularExpression.php index db1dae922..1e97d6c2f 100644 --- a/app/vendor/phpunit/phpunit/src/Util/RegularExpression.php +++ b/app/vendor/phpunit/phpunit/src/Util/RegularExpression.php @@ -25,7 +25,7 @@ public static function safeMatch(string $pattern, string $subject) static function () use ($pattern, $subject) { return preg_match($pattern, $subject); - } + }, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/Test.php b/app/vendor/phpunit/phpunit/src/Util/Test.php index d04a7683b..12c6bf16a 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Test.php +++ b/app/vendor/phpunit/phpunit/src/Util/Test.php @@ -119,7 +119,7 @@ public static function getLinesToBeCovered(string $className, string $methodName { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); if (!self::shouldCoversAnnotationBeUsed($annotations)) { @@ -145,7 +145,7 @@ public static function requiresCodeCoverageDataCollection(TestCase $test): bool { $annotations = self::parseTestMethodAnnotations( get_class($test), - $test->getName(false) + $test->getName(false), ); // If there is no @covers annotation but a @coversNothing annotation on @@ -182,7 +182,7 @@ public static function getRequirements(string $className, string $methodName): a { return self::mergeArraysRecursively( Registry::getInstance()->forClassName($className)->requirements(), - Registry::getInstance()->forMethod($className, $methodName)->requirements() + Registry::getInstance()->forMethod($className, $methodName)->requirements(), ); } @@ -213,7 +213,7 @@ public static function getMissingRequirements(string $className, string $methodN if (!$required['PHP_constraint']['constraint']->complies($version)) { $missing[] = sprintf( 'PHP version does not match the required constraint %s.', - $required['PHP_constraint']['constraint']->asString() + $required['PHP_constraint']['constraint']->asString(), ); $hint = 'PHP_constraint'; @@ -235,7 +235,7 @@ public static function getMissingRequirements(string $className, string $methodN if (!$required['PHPUnit_constraint']['constraint']->complies($phpunitVersion)) { $missing[] = sprintf( 'PHPUnit version does not match the required constraint %s.', - $required['PHPUnit_constraint']['constraint']->asString() + $required['PHPUnit_constraint']['constraint']->asString(), ); $hint = $hint ?? 'PHPUnit_constraint'; @@ -367,12 +367,12 @@ public static function getBackupSettings(string $className, string $methodName): 'backupGlobals' => self::getBooleanAnnotationSetting( $className, $methodName, - 'backupGlobals' + 'backupGlobals', ), 'backupStaticAttributes' => self::getBooleanAnnotationSetting( $className, $methodName, - 'backupStaticAttributes' + 'backupStaticAttributes', ), ]; } @@ -386,7 +386,7 @@ public static function getDependencies(string $className, string $methodName): a { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); $dependsAnnotations = $annotations['class']['depends'] ?? []; @@ -394,7 +394,7 @@ public static function getDependencies(string $className, string $methodName): a if (isset($annotations['method']['depends'])) { $dependsAnnotations = array_merge( $dependsAnnotations, - $annotations['method']['depends'] + $annotations['method']['depends'], ); } @@ -413,7 +413,7 @@ public static function getGroups(string $className, ?string $methodName = ''): a { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); $groups = []; @@ -492,7 +492,7 @@ public static function getProcessIsolationSettings(string $className, string $me { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); return isset($annotations['class']['runTestsInSeparateProcesses']) || isset($annotations['method']['runInSeparateProcess']); @@ -503,7 +503,7 @@ public static function getClassProcessIsolationSettings(string $className, strin { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); return isset($annotations['class']['runClassInSeparateProcess']); @@ -515,7 +515,7 @@ public static function getPreserveGlobalStateSettings(string $className, string return self::getBooleanAnnotationSetting( $className, $methodName, - 'preserveGlobalState' + 'preserveGlobalState', ); } @@ -537,7 +537,7 @@ public static function getHookMethods(string $className): array if ($docBlock->isHookToBeExecutedBeforeClass()) { array_unshift( self::$hookMethods[$className]['beforeClass'], - $method->getName() + $method->getName(), ); } @@ -549,14 +549,14 @@ public static function getHookMethods(string $className): array if ($docBlock->isToBeExecutedBeforeTest()) { array_unshift( self::$hookMethods[$className]['before'], - $method->getName() + $method->getName(), ); } if ($docBlock->isToBeExecutedAsPreCondition()) { array_unshift( self::$hookMethods[$className]['preCondition'], - $method->getName() + $method->getName(), ); } @@ -589,9 +589,9 @@ public static function isTestMethod(ReflectionMethod $method): bool 'test', Registry::getInstance()->forMethod( $method->getDeclaringClass()->getName(), - $method->getName() + $method->getName(), ) - ->symbolAnnotations() + ->symbolAnnotations(), ); } @@ -604,7 +604,7 @@ private static function getLinesToBeCoveredOrUsed(string $className, string $met { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); $classShortcut = null; @@ -615,8 +615,8 @@ private static function getLinesToBeCoveredOrUsed(string $className, string $met sprintf( 'More than one @%sClass annotation in class or interface "%s".', $mode, - $className - ) + $className, + ), ); } @@ -645,8 +645,8 @@ private static function getLinesToBeCoveredOrUsed(string $className, string $met throw new InvalidCoversTargetException( sprintf( 'Trying to @cover interface "%s".', - $element - ) + $element, + ), ); } @@ -657,10 +657,10 @@ private static function getLinesToBeCoveredOrUsed(string $className, string $met sprintf( '"@%s %s" is invalid', $mode, - $element + $element, ), $e->getCode(), - $e + $e, ); } } @@ -685,7 +685,7 @@ private static function getBooleanAnnotationSetting(string $className, ?string $ { $annotations = self::parseTestMethodAnnotations( $className, - $methodName + $methodName, ); if (isset($annotations['method'][$settingName])) { @@ -720,7 +720,7 @@ private static function sanitizeVersionNumber(string $version) return preg_replace( '/^(\d+\.\d+(?:.\d+)?).*$/', '$1', - $version + $version, ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php b/app/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php index b66eb8b97..031c7ed63 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php +++ b/app/vendor/phpunit/phpunit/src/Util/TestDox/CliTestDoxPrinter.php @@ -205,7 +205,7 @@ protected function writeTestResult(array $prevResult, array $result): void ' %s %s%s' . PHP_EOL, $this->colorizeTextBox($style['color'], $style['symbol']), $testName, - $this->verbose ? ' ' . $this->formatRuntime($result['time'], $style['color']) : '' + $this->verbose ? ' ' . $this->formatRuntime($result['time'], $style['color']) : '', ); $this->write($line); diff --git a/app/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php b/app/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php index 776a83bd9..d08bfad49 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php +++ b/app/vendor/phpunit/phpunit/src/Util/TestDox/HtmlResultPrinter.php @@ -122,8 +122,8 @@ protected function startClass(string $name): void $this->write( sprintf( self::CLASS_HEADER, - $this->currentTestClassPrettified - ) + $this->currentTestClassPrettified, + ), ); } @@ -136,8 +136,8 @@ protected function onTest(string $name, bool $success = true): void sprintf( "
  • %s
  • \n", $success ? 'success' : 'defect', - $name - ) + $name, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php b/app/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php index 742071498..ee0a41b1c 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php +++ b/app/vendor/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php @@ -124,7 +124,7 @@ public function prettifyTestCase(TestCase $test): string { $annotations = Test::parseTestMethodAnnotations( get_class($test), - $test->getName(false) + $test->getName(false), ); $annotationWithPlaceholders = false; @@ -243,7 +243,7 @@ private function mapTestMethodParameterNamesToProvidedDataValues(TestCase $test) throw new UtilException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd @@ -263,7 +263,7 @@ private function mapTestMethodParameterNamesToProvidedDataValues(TestCase $test) throw new UtilException( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php b/app/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php index bd64785c9..5a418998d 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php +++ b/app/vendor/phpunit/phpunit/src/Util/TestDox/TestDoxPrinter.php @@ -381,8 +381,8 @@ static function (string $text) use ($prefix) { return ' ' . $prefix . ($text ? ' ' . $text : ''); }, - preg_split('/\r\n|\r|\n/', $message) - ) + preg_split('/\r\n|\r|\n/', $message), + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php b/app/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php index 265fe41f3..544c83e73 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php +++ b/app/vendor/phpunit/phpunit/src/Util/TestDox/XmlResultPrinter.php @@ -164,7 +164,7 @@ public function endTest(Test $test, float $time): void static function ($group) { return !($group === 'small' || $group === 'medium' || $group === 'large' || strpos($group, '__phpunit_') === 0); - } + }, ); $testNode = $this->document->createElement('test'); @@ -188,7 +188,7 @@ static function ($group) $annotations = TestUtil::parseTestMethodAnnotations( get_class($test), - $test->getName(false) + $test->getName(false), ); foreach (['class', 'method'] as $type) { @@ -240,7 +240,7 @@ static function ($group) throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php b/app/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php index 67168a67f..beb0e4b07 100644 --- a/app/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php +++ b/app/vendor/phpunit/phpunit/src/Util/TextTestListRenderer.php @@ -35,7 +35,7 @@ public function render(TestSuite $suite): string $name = sprintf( '%s::%s', get_class($test), - str_replace(' with data set ', '', $test->getName()) + str_replace(' with data set ', '', $test->getName()), ); } elseif ($test instanceof PhptTestCase) { $name = $test->getName(); @@ -45,7 +45,7 @@ public function render(TestSuite $suite): string $buffer .= sprintf( ' - %s' . PHP_EOL, - $name + $name, ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php b/app/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php index 77e674707..57ca7c320 100644 --- a/app/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php +++ b/app/vendor/phpunit/phpunit/src/Util/VersionComparisonOperator.php @@ -50,8 +50,8 @@ private function ensureOperatorIsValid(string $operator): void throw new Exception( sprintf( '"%s" is not a valid version_compare() operator', - $operator - ) + $operator, + ), ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php b/app/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php index 8b10d4152..d6366eaaa 100644 --- a/app/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php +++ b/app/vendor/phpunit/phpunit/src/Util/XdebugFilterScriptGenerator.php @@ -32,10 +32,10 @@ static function ($item) { return sprintf( " '%s'", - $item + $item, ); }, - $this->getItems($filter) + $this->getItems($filter), ); $files = implode(",\n", $files); @@ -67,7 +67,7 @@ private function getItems(FilterConfiguration $filter): array if (is_string($path)) { $files[] = sprintf( addslashes('%s' . DIRECTORY_SEPARATOR), - $path + $path, ); } } diff --git a/app/vendor/phpunit/phpunit/src/Util/Xml.php b/app/vendor/phpunit/phpunit/src/Util/Xml.php index 54d721562..efdd56eff 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Xml.php +++ b/app/vendor/phpunit/phpunit/src/Util/Xml.php @@ -68,8 +68,8 @@ public static function prepareString(string $string): string '', htmlspecialchars( self::convertToUtf8($string), - ENT_QUOTES - ) + ENT_QUOTES, + ), ); } @@ -127,7 +127,7 @@ public static function xmlToVariable(DOMElement $element) throw new Exception( $e->getMessage(), $e->getCode(), - $e + $e, ); } // @codeCoverageIgnoreEnd diff --git a/app/vendor/phpunit/phpunit/src/Util/Xml/Loader.php b/app/vendor/phpunit/phpunit/src/Util/Xml/Loader.php index 8d43d3278..2ba5ace34 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Xml/Loader.php +++ b/app/vendor/phpunit/phpunit/src/Util/Xml/Loader.php @@ -38,8 +38,8 @@ public function loadFile(string $filename, bool $isHtml = false, bool $xinclude throw new Exception( sprintf( 'Could not read "%s".', - $filename - ) + $filename, + ), ); } @@ -100,8 +100,8 @@ public function load(string $actual, bool $isHtml = false, string $filename = '' sprintf( 'Could not load "%s".%s', $filename, - $message !== '' ? "\n" . $message : '' - ) + $message !== '' ? "\n" . $message : '', + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetector.php b/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetector.php index 5864695b4..46f2b947a 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetector.php +++ b/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaDetector.php @@ -23,7 +23,7 @@ public function detect(string $filename): SchemaDetectionResult $filename, false, true, - true + true, ); foreach (['9.2', '8.5'] as $candidate) { diff --git a/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaFinder.php b/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaFinder.php index 1e7b73c59..af17dfe94 100644 --- a/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaFinder.php +++ b/app/vendor/phpunit/phpunit/src/Util/Xml/SchemaFinder.php @@ -34,8 +34,8 @@ public function find(string $version): string throw new Exception( sprintf( 'Schema for PHPUnit %s is not available', - $version - ) + $version, + ), ); } diff --git a/app/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php b/app/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php index b16ef0b70..7a63b10d4 100644 --- a/app/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php +++ b/app/vendor/phpunit/phpunit/src/Util/XmlTestListRenderer.php @@ -60,8 +60,8 @@ public function render(TestSuite $suite): string str_replace( ' with data set ', '', - $test->getDataSetAsString(false) - ) + $test->getDataSetAsString(false), + ), ); } diff --git a/app/vendor/psr/http-client/CHANGELOG.md b/app/vendor/psr/http-client/CHANGELOG.md index e2dc25f51..babba7c7b 100644 --- a/app/vendor/psr/http-client/CHANGELOG.md +++ b/app/vendor/psr/http-client/CHANGELOG.md @@ -2,6 +2,14 @@ All notable changes to this project will be documented in this file, in reverse chronological order by release. +## 1.0.3 + +Add `source` link in composer.json. No code changes. + +## 1.0.2 + +Allow PSR-7 (psr/http-message) 2.0. No code changes. + ## 1.0.1 Allow installation with PHP 8. No code changes. diff --git a/app/vendor/psr/http-client/README.md b/app/vendor/psr/http-client/README.md index 6876b8403..84af5c55d 100644 --- a/app/vendor/psr/http-client/README.md +++ b/app/vendor/psr/http-client/README.md @@ -7,6 +7,6 @@ Note that this is not a HTTP Client implementation of its own. It is merely abst The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. -[psr-url]: http://www.php-fig.org/psr/psr-18 +[psr-url]: https://www.php-fig.org/psr/psr-18 [package-url]: https://packagist.org/packages/psr/http-client [implementation-url]: https://packagist.org/providers/psr/http-client-implementation diff --git a/app/vendor/psr/http-client/composer.json b/app/vendor/psr/http-client/composer.json index c195f8ff1..6fed350be 100644 --- a/app/vendor/psr/http-client/composer.json +++ b/app/vendor/psr/http-client/composer.json @@ -7,12 +7,15 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, "require": { "php": "^7.0 || ^8.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "autoload": { "psr-4": { diff --git a/app/vendor/psr/http-factory/.gitignore b/app/vendor/psr/http-factory/.gitignore deleted file mode 100644 index d8a7996ab..000000000 --- a/app/vendor/psr/http-factory/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -composer.lock -vendor/ diff --git a/app/vendor/psr/http-factory/.pullapprove.yml b/app/vendor/psr/http-factory/.pullapprove.yml deleted file mode 100644 index 8cf081942..000000000 --- a/app/vendor/psr/http-factory/.pullapprove.yml +++ /dev/null @@ -1,7 +0,0 @@ -extends: default -reviewers: - - - name: contributors - required: 1 - teams: - - http-factory-contributors diff --git a/app/vendor/psr/http-factory/README.md b/app/vendor/psr/http-factory/README.md index 41d362a62..bf8913b57 100644 --- a/app/vendor/psr/http-factory/README.md +++ b/app/vendor/psr/http-factory/README.md @@ -1,10 +1,12 @@ HTTP Factories ============== -This repository holds all interfaces related to [PSR-17 (HTTP Message Factories)][psr-17]. -Please refer to the specification for a description. +This repository holds all interfaces related to [PSR-17 (HTTP Factories)][psr-url]. -You can find implementations of the specification by looking for packages providing the -[psr/http-factory-implementation](https://packagist.org/providers/psr/http-factory-implementation) virtual package. +Note that this is not a HTTP Factory implementation of its own. It is merely interfaces that describe the components of a HTTP Factory. -[psr-17]: https://www.php-fig.org/psr/psr-17/ +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-17/ +[package-url]: https://packagist.org/packages/psr/http-factory +[implementation-url]: https://packagist.org/providers/psr/http-factory-implementation diff --git a/app/vendor/psr/http-factory/composer.json b/app/vendor/psr/http-factory/composer.json index af62b290f..d1bbddeea 100644 --- a/app/vendor/psr/http-factory/composer.json +++ b/app/vendor/psr/http-factory/composer.json @@ -15,12 +15,12 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=7.0.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "autoload": { "psr-4": { diff --git a/app/vendor/psr/http-message/README.md b/app/vendor/psr/http-message/README.md index 28185338f..2668be6c3 100644 --- a/app/vendor/psr/http-message/README.md +++ b/app/vendor/psr/http-message/README.md @@ -10,4 +10,7 @@ interface that describes a HTTP message. See the specification for more details. Usage ----- -We'll certainly need some stuff in here. \ No newline at end of file +Before reading the usage guide we recommend reading the PSR-7 interfaces method list: + +* [`PSR-7 Interfaces Method List`](docs/PSR7-Interfaces.md) +* [`PSR-7 Usage Guide`](docs/PSR7-Usage.md) \ No newline at end of file diff --git a/app/vendor/psr/http-message/composer.json b/app/vendor/psr/http-message/composer.json index b0d2937a0..56e8c0a6d 100644 --- a/app/vendor/psr/http-message/composer.json +++ b/app/vendor/psr/http-message/composer.json @@ -11,7 +11,7 @@ } ], "require": { - "php": ">=5.3.0" + "php": "^7.2 || ^8.0" }, "autoload": { "psr-4": { @@ -20,7 +20,7 @@ }, "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } } } diff --git a/app/vendor/psr/http-message/docs/PSR7-Interfaces.md b/app/vendor/psr/http-message/docs/PSR7-Interfaces.md new file mode 100644 index 000000000..3a7e7dda6 --- /dev/null +++ b/app/vendor/psr/http-message/docs/PSR7-Interfaces.md @@ -0,0 +1,130 @@ +# Interfaces + +The purpose of this list is to help in finding the methods when working with PSR-7. This can be considered as a cheatsheet for PSR-7 interfaces. + +The interfaces defined in PSR-7 are the following: + +| Class Name | Description | +|---|---| +| [Psr\Http\Message\MessageInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagemessageinterface) | Representation of a HTTP message | +| [Psr\Http\Message\RequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagerequestinterface) | Representation of an outgoing, client-side request. | +| [Psr\Http\Message\ServerRequestInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageserverrequestinterface) | Representation of an incoming, server-side HTTP request. | +| [Psr\Http\Message\ResponseInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageresponseinterface) | Representation of an outgoing, server-side response. | +| [Psr\Http\Message\StreamInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessagestreaminterface) | Describes a data stream | +| [Psr\Http\Message\UriInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuriinterface) | Value object representing a URI. | +| [Psr\Http\Message\UploadedFileInterface](http://www.php-fig.org/psr/psr-7/#psrhttpmessageuploadedfileinterface) | Value object representing a file uploaded through an HTTP request. | + +## `Psr\Http\Message\MessageInterface` Methods + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getProtocolVersion()` | Retrieve HTTP protocol version | 1.0 or 1.1 | +| `withProtocolVersion($version)` | Returns new message instance with given HTTP protocol version | | +| `getHeaders()` | Retrieve all HTTP Headers | [Request Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Request_fields), [Response Header List](https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Response_fields) | +| `hasHeader($name)` | Checks if HTTP Header with given name exists | | +| `getHeader($name)` | Retrieves a array with the values for a single header | | +| `getHeaderLine($name)` | Retrieves a comma-separated string of the values for a single header | | +| `withHeader($name, $value)` | Returns new message instance with given HTTP Header | if the header existed in the original instance, replaces the header value from the original message with the value provided when creating the new instance. | +| `withAddedHeader($name, $value)` | Returns new message instance with appended value to given header | If header already exists value will be appended, if not a new header will be created | +| `withoutHeader($name)` | Removes HTTP Header with given name| | +| `getBody()` | Retrieves the HTTP Message Body | Returns object implementing `StreamInterface`| +| `withBody(StreamInterface $body)` | Returns new message instance with given HTTP Message Body | | + + +## `Psr\Http\Message\RequestInterface` Methods + +Same methods as `Psr\Http\Message\MessageInterface` + the following methods: + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getRequestTarget()` | Retrieves the message's request target | origin-form, absolute-form, authority-form, asterisk-form ([RFC7230](https://www.rfc-editor.org/rfc/rfc7230.txt)) | +| `withRequestTarget($requestTarget)` | Return a new message instance with the specific request-target | | +| `getMethod()` | Retrieves the HTTP method of the request. | GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE (defined in [RFC7231](https://tools.ietf.org/html/rfc7231)), PATCH (defined in [RFC5789](https://tools.ietf.org/html/rfc5789)) | +| `withMethod($method)` | Returns a new message instance with the provided HTTP method | | +| `getUri()` | Retrieves the URI instance | | +| `withUri(UriInterface $uri, $preserveHost = false)` | Returns a new message instance with the provided URI | | + + +## `Psr\Http\Message\ServerRequestInterface` Methods + +Same methods as `Psr\Http\Message\RequestInterface` + the following methods: + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getServerParams() ` | Retrieve server parameters | Typically derived from `$_SERVER` | +| `getCookieParams()` | Retrieves cookies sent by the client to the server. | Typically derived from `$_COOKIES` | +| `withCookieParams(array $cookies)` | Returns a new request instance with the specified cookies | | +| `withQueryParams(array $query)` | Returns a new request instance with the specified query string arguments | | +| `getUploadedFiles()` | Retrieve normalized file upload data | | +| `withUploadedFiles(array $uploadedFiles)` | Returns a new request instance with the specified uploaded files | | +| `getParsedBody()` | Retrieve any parameters provided in the request body | | +| `withParsedBody($data)` | Returns a new request instance with the specified body parameters | | +| `getAttributes()` | Retrieve attributes derived from the request | | +| `getAttribute($name, $default = null)` | Retrieve a single derived request attribute | | +| `withAttribute($name, $value)` | Returns a new request instance with the specified derived request attribute | | +| `withoutAttribute($name)` | Returns a new request instance that without the specified derived request attribute | | + +## `Psr\Http\Message\ResponseInterface` Methods: + +Same methods as `Psr\Http\Message\MessageInterface` + the following methods: + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getStatusCode()` | Gets the response status code. | | +| `withStatus($code, $reasonPhrase = '')` | Returns a new response instance with the specified status code and, optionally, reason phrase. | | +| `getReasonPhrase()` | Gets the response reason phrase associated with the status code. | | + +## `Psr\Http\Message\StreamInterface` Methods + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `__toString()` | Reads all data from the stream into a string, from the beginning to end. | | +| `close()` | Closes the stream and any underlying resources. | | +| `detach()` | Separates any underlying resources from the stream. | | +| `getSize()` | Get the size of the stream if known. | | +| `eof()` | Returns true if the stream is at the end of the stream.| | +| `isSeekable()` | Returns whether or not the stream is seekable. | | +| `seek($offset, $whence = SEEK_SET)` | Seek to a position in the stream. | | +| `rewind()` | Seek to the beginning of the stream. | | +| `isWritable()` | Returns whether or not the stream is writable. | | +| `write($string)` | Write data to the stream. | | +| `isReadable()` | Returns whether or not the stream is readable. | | +| `read($length)` | Read data from the stream. | | +| `getContents()` | Returns the remaining contents in a string | | +| `getMetadata($key = null)()` | Get stream metadata as an associative array or retrieve a specific key. | | + +## `Psr\Http\Message\UriInterface` Methods + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getScheme()` | Retrieve the scheme component of the URI. | | +| `getAuthority()` | Retrieve the authority component of the URI. | | +| `getUserInfo()` | Retrieve the user information component of the URI. | | +| `getHost()` | Retrieve the host component of the URI. | | +| `getPort()` | Retrieve the port component of the URI. | | +| `getPath()` | Retrieve the path component of the URI. | | +| `getQuery()` | Retrieve the query string of the URI. | | +| `getFragment()` | Retrieve the fragment component of the URI. | | +| `withScheme($scheme)` | Return an instance with the specified scheme. | | +| `withUserInfo($user, $password = null)` | Return an instance with the specified user information. | | +| `withHost($host)` | Return an instance with the specified host. | | +| `withPort($port)` | Return an instance with the specified port. | | +| `withPath($path)` | Return an instance with the specified path. | | +| `withQuery($query)` | Return an instance with the specified query string. | | +| `withFragment($fragment)` | Return an instance with the specified URI fragment. | | +| `__toString()` | Return the string representation as a URI reference. | | + +## `Psr\Http\Message\UploadedFileInterface` Methods + +| Method Name | Description | Notes | +|------------------------------------| ----------- | ----- | +| `getStream()` | Retrieve a stream representing the uploaded file. | | +| `moveTo($targetPath)` | Move the uploaded file to a new location. | | +| `getSize()` | Retrieve the file size. | | +| `getError()` | Retrieve the error associated with the uploaded file. | | +| `getClientFilename()` | Retrieve the filename sent by the client. | | +| `getClientMediaType()` | Retrieve the media type sent by the client. | | + +> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + diff --git a/app/vendor/psr/http-message/docs/PSR7-Usage.md b/app/vendor/psr/http-message/docs/PSR7-Usage.md new file mode 100644 index 000000000..b6d048a34 --- /dev/null +++ b/app/vendor/psr/http-message/docs/PSR7-Usage.md @@ -0,0 +1,159 @@ +### PSR-7 Usage + +All PSR-7 applications comply with these interfaces +They were created to establish a standard between middleware implementations. + +> `RequestInterface`, `ServerRequestInterface`, `ResponseInterface` extend `MessageInterface` because the `Request` and the `Response` are `HTTP Messages`. +> When using `ServerRequestInterface`, both `RequestInterface` and `Psr\Http\Message\MessageInterface` methods are considered. + + +The following examples will illustrate how basic operations are done in PSR-7. + +##### Examples + + +For this examples to work (at least) a PSR-7 implementation package is required. (eg: zendframework/zend-diactoros, guzzlehttp/psr7, slim/slim, etc) +All PSR-7 implementations should have the same behaviour. + +The following will be assumed: +`$request` is an object of `Psr\Http\Message\RequestInterface` and + +`$response` is an object implementing `Psr\Http\Message\RequestInterface` + + +### Working with HTTP Headers + +#### Adding headers to response: + +```php +$response->withHeader('My-Custom-Header', 'My Custom Message'); +``` + +#### Appending values to headers + +```php +$response->withAddedHeader('My-Custom-Header', 'The second message'); +``` + +#### Checking if header exists: + +```php +$request->hasHeader('My-Custom-Header'); // will return false +$response->hasHeader('My-Custom-Header'); // will return true +``` + +> Note: My-Custom-Header was only added in the Response + +#### Getting comma-separated values from a header (also applies to request) + +```php +// getting value from request headers +$request->getHeaderLine('Content-Type'); // will return: "text/html; charset=UTF-8" +// getting value from response headers +$response->getHeaderLine('My-Custom-Header'); // will return: "My Custom Message; The second message" +``` + +#### Getting array of value from a header (also applies to request) +```php +// getting value from request headers +$request->getHeader('Content-Type'); // will return: ["text/html", "charset=UTF-8"] +// getting value from response headers +$response->getHeader('My-Custom-Header'); // will return: ["My Custom Message", "The second message"] +``` + +#### Removing headers from HTTP Messages +```php +// removing a header from Request, removing deprecated "Content-MD5" header +$request->withoutHeader('Content-MD5'); + +// removing a header from Response +// effect: the browser won't know the size of the stream +// the browser will download the stream till it ends +$response->withoutHeader('Content-Length'); +``` + +### Working with HTTP Message Body + +When working with the PSR-7 there are two methods of implementation: +#### 1. Getting the body separately + +> This method makes the body handling easier to understand and is useful when repeatedly calling body methods. (You only call `getBody()` once). Using this method mistakes like `$response->write()` are also prevented. + +```php +$body = $response->getBody(); +// operations on body, eg. read, write, seek +// ... +// replacing the old body +$response->withBody($body); +// this last statement is optional as we working with objects +// in this case the "new" body is same with the "old" one +// the $body variable has the same value as the one in $request, only the reference is passed +``` + +#### 2. Working directly on response + +> This method is useful when only performing few operations as the `$request->getBody()` statement fragment is required + +```php +$response->getBody()->write('hello'); +``` + +### Getting the body contents + +The following snippet gets the contents of a stream contents. +> Note: Streams must be rewinded, if content was written into streams, it will be ignored when calling `getContents()` because the stream pointer is set to the last character, which is `\0` - meaning end of stream. +```php +$body = $response->getBody(); +$body->rewind(); // or $body->seek(0); +$bodyText = $body->getContents(); +``` +> Note: If `$body->seek(1)` is called before `$body->getContents()`, the first character will be ommited as the starting pointer is set to `1`, not `0`. This is why using `$body->rewind()` is recommended. + +### Append to body + +```php +$response->getBody()->write('Hello'); // writing directly +$body = $request->getBody(); // which is a `StreamInterface` +$body->write('xxxxx'); +``` + +### Prepend to body +Prepending is different when it comes to streams. The content must be copied before writing the content to be prepended. +The following example will explain the behaviour of streams. + +```php +// assuming our response is initially empty +$body = $repsonse->getBody(); +// writing the string "abcd" +$body->write('abcd'); + +// seeking to start of stream +$body->seek(0); +// writing 'ef' +$body->write('ef'); // at this point the stream contains "efcd" +``` + +#### Prepending by rewriting separately + +```php +// assuming our response body stream only contains: "abcd" +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // abcd +// seeking the stream to beginning +$body->rewind(); +$body->write('ef'); // stream contains "efcd" +$body->write($contents); // stream contains "efabcd" +``` + +> Note: `getContents()` seeks the stream while reading it, therefore if the second `rewind()` method call was not present the stream would have resulted in `abcdefabcd` because the `write()` method appends to stream if not preceeded by `rewind()` or `seek(0)`. + +#### Prepending by using contents as a string +```php +$body = $response->getBody(); +$body->rewind(); +$contents = $body->getContents(); // efabcd +$contents = 'ef'.$contents; +$body->rewind(); +$body->write($contents); +``` diff --git a/app/vendor/psr/http-message/src/MessageInterface.php b/app/vendor/psr/http-message/src/MessageInterface.php index dd46e5ec8..8cdb4ed63 100644 --- a/app/vendor/psr/http-message/src/MessageInterface.php +++ b/app/vendor/psr/http-message/src/MessageInterface.php @@ -1,5 +1,7 @@ =7.0", - "psr/http-message": "^1.0" + "psr/http-message": "^1.0 || ^2.0" }, "autoload": { "psr-4": { diff --git a/app/vendor/psr/http-server-middleware/README.md b/app/vendor/psr/http-server-middleware/README.md index 8359bd05c..7b0a9550e 100644 --- a/app/vendor/psr/http-server-middleware/README.md +++ b/app/vendor/psr/http-server-middleware/README.md @@ -1,6 +1,12 @@ HTTP Server Middleware -====================== +============== -Provides the `MiddlewareInterface` of [PSR-15][psr-15]. +This repository holds the `MiddlewareInterface` related to [PSR-15 (HTTP Server Request Handlers)][psr-url]. -[psr-15]: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-15-request-handlers.md +Note that this is not a Middleware implementation of its own. It is merely the interface that describe a Middleware. + +The installable [package][package-url] and [implementations][implementation-url] are listed on Packagist. + +[psr-url]: https://www.php-fig.org/psr/psr-15/ +[package-url]: https://packagist.org/packages/psr/http-server-middleware +[implementation-url]: https://packagist.org/providers/psr/http-server-middleware-implementation diff --git a/app/vendor/psr/http-server-middleware/composer.json b/app/vendor/psr/http-server-middleware/composer.json index 1595513c3..151167148 100644 --- a/app/vendor/psr/http-server-middleware/composer.json +++ b/app/vendor/psr/http-server-middleware/composer.json @@ -15,12 +15,12 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "require": { "php": ">=7.0", - "psr/http-message": "^1.0", + "psr/http-message": "^1.0 || ^2.0", "psr/http-server-handler": "^1.0" }, "autoload": { diff --git a/app/vendor/psy/psysh/composer.json b/app/vendor/psy/psysh/composer.json index c076d041f..dbd9b12e3 100644 --- a/app/vendor/psy/psysh/composer.json +++ b/app/vendor/psy/psysh/composer.json @@ -49,6 +49,10 @@ "extra": { "branch-alias": { "dev-main": "0.11.x-dev" + }, + "bamarni-bin": { + "bin-links": false, + "forward-command": false } }, "conflict": { diff --git a/app/vendor/psy/psysh/src/CodeCleaner.php b/app/vendor/psy/psysh/src/CodeCleaner.php index d5f2720c3..8429847f6 100644 --- a/app/vendor/psy/psysh/src/CodeCleaner.php +++ b/app/vendor/psy/psysh/src/CodeCleaner.php @@ -50,6 +50,8 @@ class CodeCleaner { private $yolo = false; + private $strictTypes = false; + private $parser; private $printer; private $traverser; @@ -58,14 +60,16 @@ class CodeCleaner /** * CodeCleaner constructor. * - * @param Parser|null $parser A PhpParser Parser instance. One will be created if not explicitly supplied - * @param Printer|null $printer A PhpParser Printer instance. One will be created if not explicitly supplied - * @param NodeTraverser|null $traverser A PhpParser NodeTraverser instance. One will be created if not explicitly supplied - * @param bool $yolo run without input validation + * @param Parser|null $parser A PhpParser Parser instance. One will be created if not explicitly supplied + * @param Printer|null $printer A PhpParser Printer instance. One will be created if not explicitly supplied + * @param NodeTraverser|null $traverser A PhpParser NodeTraverser instance. One will be created if not explicitly supplied + * @param bool $yolo run without input validation + * @param bool $strictTypes enforce strict types by default */ - public function __construct(Parser $parser = null, Printer $printer = null, NodeTraverser $traverser = null, bool $yolo = false) + public function __construct(Parser $parser = null, Printer $printer = null, NodeTraverser $traverser = null, bool $yolo = false, bool $strictTypes = false) { $this->yolo = $yolo; + $this->strictTypes = $strictTypes; if ($parser === null) { $parserFactory = new ParserFactory(); @@ -134,7 +138,7 @@ private function getDefaultPasses(): array new MagicConstantsPass(), $namespacePass, // must run after the implicit return pass new RequirePass(), - new StrictTypesPass(), + new StrictTypesPass($this->strictTypes), // Namespace-aware validation (which depends on aforementioned shenanigans) new ValidClassNamePass(), @@ -168,7 +172,7 @@ private function getYoloPasses(): array new MagicConstantsPass(), $namespacePass, // must run after the implicit return pass new RequirePass(), - new StrictTypesPass(), + new StrictTypesPass($this->strictTypes), ]; } diff --git a/app/vendor/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php b/app/vendor/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php index d4dd6777c..d1c821023 100644 --- a/app/vendor/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php +++ b/app/vendor/psy/psysh/src/CodeCleaner/EmptyArrayDimFetchPass.php @@ -14,6 +14,8 @@ use PhpParser\Node; use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\Assign; +use PhpParser\Node\Expr\AssignRef; +use PhpParser\Node\Stmt\Foreach_; use Psy\Exception\FatalErrorException; /** @@ -34,7 +36,7 @@ public function beforeTraverse(array $nodes) } /** - * @throws FatalErrorException if the user used empty empty array dim fetch outside of assignment + * @throws FatalErrorException if the user used empty array dim fetch outside of assignment * * @param Node $node * @@ -44,6 +46,15 @@ public function enterNode(Node $node) { if ($node instanceof Assign && $node->var instanceof ArrayDimFetch) { $this->theseOnesAreFine[] = $node->var; + } elseif ($node instanceof AssignRef && $node->expr instanceof ArrayDimFetch) { + $this->theseOnesAreFine[] = $node->expr; + } elseif ($node instanceof Foreach_ && $node->valueVar instanceof ArrayDimFetch) { + $this->theseOnesAreFine[] = $node->valueVar; + } elseif ($node instanceof ArrayDimFetch && $node->var instanceof ArrayDimFetch) { + // $a[]['b'] = 'c' + if (\in_array($node, $this->theseOnesAreFine)) { + $this->theseOnesAreFine[] = $node->var; + } } if ($node instanceof ArrayDimFetch && $node->dim === null) { diff --git a/app/vendor/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php b/app/vendor/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php index 04481db99..d794bbe78 100644 --- a/app/vendor/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php +++ b/app/vendor/psy/psysh/src/CodeCleaner/ImplicitReturnPass.php @@ -80,7 +80,7 @@ private function addImplicitReturn(array $nodes): array 'startLine' => $last->getLine(), 'endLine' => $last->getLine(), ]); - // @codeCoverageIgnoreEnd + // @codeCoverageIgnoreEnd } elseif ($last instanceof Expression && !($last->expr instanceof Exit_)) { // For PHP Parser 4.x $nodes[\count($nodes) - 1] = new Return_($last->expr, [ diff --git a/app/vendor/psy/psysh/src/CodeCleaner/StrictTypesPass.php b/app/vendor/psy/psysh/src/CodeCleaner/StrictTypesPass.php index 13c35b66d..7fa0ed8e8 100644 --- a/app/vendor/psy/psysh/src/CodeCleaner/StrictTypesPass.php +++ b/app/vendor/psy/psysh/src/CodeCleaner/StrictTypesPass.php @@ -34,6 +34,14 @@ class StrictTypesPass extends CodeCleanerPass private $strictTypes = false; + /** + * @param bool $strictTypes enforce strict types by default + */ + public function __construct(bool $strictTypes = false) + { + $this->strictTypes = $strictTypes; + } + /** * If this is a standalone strict types declaration, remember it for later. * diff --git a/app/vendor/psy/psysh/src/Command/CodeArgumentParser.php b/app/vendor/psy/psysh/src/Command/CodeArgumentParser.php new file mode 100644 index 000000000..4803aec1c --- /dev/null +++ b/app/vendor/psy/psysh/src/Command/CodeArgumentParser.php @@ -0,0 +1,59 @@ +parser = $parser ?? (new ParserFactory())->createParser(); + } + + /** + * Lex and parse a string of code into statements. + * + * This is intended for code arguments, so the code string *should not* start with parser->parse($code); + } catch (\PhpParser\Error $e) { + if (\strpos($e->getMessage(), 'unexpected EOF') === false) { + throw ParseErrorException::fromParseError($e); + } + + // If we got an unexpected EOF, let's try it again with a semicolon. + try { + return $this->parser->parse($code.';'); + } catch (\PhpParser\Error $_e) { + // Throw the original error, not the semicolon one. + throw ParseErrorException::fromParseError($e); + } + } + } +} diff --git a/app/vendor/psy/psysh/src/Command/Command.php b/app/vendor/psy/psysh/src/Command/Command.php index 182e358c4..097508846 100644 --- a/app/vendor/psy/psysh/src/Command/Command.php +++ b/app/vendor/psy/psysh/src/Command/Command.php @@ -15,7 +15,6 @@ use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command as BaseCommand; use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Helper\TableHelper; use Symfony\Component\Console\Helper\TableStyle; use Symfony\Component\Console\Output\OutputInterface; @@ -231,16 +230,10 @@ private function formatDefaultValue($default): string /** * Get a Table instance. * - * Falls back to legacy TableHelper. - * - * @return Table|TableHelper + * @return Table */ protected function getTable(OutputInterface $output) { - if (!\class_exists(Table::class)) { - return $this->getTableHelper(); - } - $style = new TableStyle(); // Symfony 4.1 deprecated single-argument style setters. @@ -260,18 +253,4 @@ protected function getTable(OutputInterface $output) ->setRows([]) ->setStyle($style); } - - /** - * Legacy fallback for getTable. - */ - protected function getTableHelper(): TableHelper - { - $table = $this->getApplication()->getHelperSet()->get('table'); - - return $table - ->setRows([]) - ->setLayout(TableHelper::LAYOUT_BORDERLESS) - ->setHorizontalBorderChar('') - ->setCrossingChar(''); - } } diff --git a/app/vendor/psy/psysh/src/Command/HelpCommand.php b/app/vendor/psy/psysh/src/Command/HelpCommand.php index 5aa72fa6c..9443c550a 100644 --- a/app/vendor/psy/psysh/src/Command/HelpCommand.php +++ b/app/vendor/psy/psysh/src/Command/HelpCommand.php @@ -12,7 +12,6 @@ namespace Psy\Command; use Psy\Output\ShellOutput; -use Symfony\Component\Console\Helper\TableHelper; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -93,11 +92,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->startPaging(); } - if ($table instanceof TableHelper) { - $table->render($output); - } else { - $table->render(); - } + $table->render(); if ($output instanceof ShellOutput) { $output->stopPaging(); diff --git a/app/vendor/psy/psysh/src/Command/ListCommand.php b/app/vendor/psy/psysh/src/Command/ListCommand.php index 41f56c9c4..6910d9039 100644 --- a/app/vendor/psy/psysh/src/Command/ListCommand.php +++ b/app/vendor/psy/psysh/src/Command/ListCommand.php @@ -26,7 +26,6 @@ use Psy\VarDumper\Presenter; use Psy\VarDumper\PresenterAware; use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Helper\TableHelper; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -213,11 +212,7 @@ protected function writeLong(OutputInterface $output, array $result) $table->addRow([$this->formatItemName($item), $item['value']]); } - if ($table instanceof TableHelper) { - $table->render($output); - } else { - $table->render(); - } + $table->render(); } } diff --git a/app/vendor/psy/psysh/src/Command/ParseCommand.php b/app/vendor/psy/psysh/src/Command/ParseCommand.php index 21005f338..a62be67fe 100644 --- a/app/vendor/psy/psysh/src/Command/ParseCommand.php +++ b/app/vendor/psy/psysh/src/Command/ParseCommand.php @@ -122,13 +122,10 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $code = $input->getArgument('code'); - if (\strpos($code, 'getOption('kind'); $depth = $input->getOption('depth'); - $nodes = $this->parse($this->getParser($parserKind), $code); + + $nodes = $this->getParser($parserKind)->parse($code); $output->page($this->presenter->present($nodes, $depth)); $this->context->setReturnValue($nodes); @@ -136,37 +133,15 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } - /** - * Lex and parse a string of code into statements. - * - * @param Parser $parser - * @param string $code - * - * @return array Statements - */ - private function parse(Parser $parser, string $code): array - { - try { - return $parser->parse($code); - } catch (\PhpParser\Error $e) { - if (\strpos($e->getMessage(), 'unexpected EOF') === false) { - throw $e; - } - - // If we got an unexpected EOF, let's try it again with a semicolon. - return $parser->parse($code.';'); - } - } - /** * Get (or create) the Parser instance. * * @param string|null $kind One of Psy\ParserFactory constants (only for PHP parser 2.0 and above) */ - private function getParser(string $kind = null): Parser + private function getParser(string $kind = null): CodeArgumentParser { if (!\array_key_exists($kind, $this->parsers)) { - $this->parsers[$kind] = $this->parserFactory->createParser($kind); + $this->parsers[$kind] = new CodeArgumentParser($this->parserFactory->createParser($kind)); } return $this->parsers[$kind]; diff --git a/app/vendor/psy/psysh/src/Command/ReflectingCommand.php b/app/vendor/psy/psysh/src/Command/ReflectingCommand.php index b85b2c401..b9b21f967 100644 --- a/app/vendor/psy/psysh/src/Command/ReflectingCommand.php +++ b/app/vendor/psy/psysh/src/Command/ReflectingCommand.php @@ -11,6 +11,8 @@ namespace Psy\Command; +use PhpParser\NodeTraverser; +use PhpParser\PrettyPrinter\Standard as Printer; use Psy\CodeCleaner\NoReturnValue; use Psy\Context; use Psy\ContextAware; @@ -19,6 +21,7 @@ use Psy\Exception\UnexpectedTargetException; use Psy\Reflection\ReflectionClassConstant; use Psy\Reflection\ReflectionConstant_; +use Psy\Sudo\SudoVisitor; use Psy\Util\Mirror; /** @@ -38,6 +41,25 @@ abstract class ReflectingCommand extends Command implements ContextAware */ protected $context; + private $parser; + private $traverser; + private $printer; + + /** + * {@inheritdoc} + */ + public function __construct($name = null) + { + $this->parser = new CodeArgumentParser(); + + $this->traverser = new NodeTraverser(); + $this->traverser->addVisitor(new SudoVisitor()); + + $this->printer = new Printer(); + + parent::__construct($name); + } + /** * ContextAware interface. * @@ -170,7 +192,10 @@ protected function getTargetAndReflector(string $valueName): array protected function resolveCode(string $code) { try { - $value = $this->getApplication()->execute($code, true); + // Add an implicit `sudo` to target resolution. + $nodes = $this->traverser->traverse($this->parser->parse($code)); + $sudoCode = $this->printer->prettyPrint($nodes); + $value = $this->getApplication()->execute($sudoCode, true); } catch (\Throwable $e) { // Swallow all exceptions? } diff --git a/app/vendor/psy/psysh/src/Command/SudoCommand.php b/app/vendor/psy/psysh/src/Command/SudoCommand.php index cd9facbab..b398bd891 100644 --- a/app/vendor/psy/psysh/src/Command/SudoCommand.php +++ b/app/vendor/psy/psysh/src/Command/SudoCommand.php @@ -14,7 +14,6 @@ use PhpParser\NodeTraverser; use PhpParser\PrettyPrinter\Standard as Printer; use Psy\Input\CodeArgument; -use Psy\ParserFactory; use Psy\Readline\Readline; use Psy\Sudo\SudoVisitor; use Symfony\Component\Console\Input\InputInterface; @@ -35,8 +34,7 @@ class SudoCommand extends Command */ public function __construct($name = null) { - $parserFactory = new ParserFactory(); - $this->parser = $parserFactory->createParser(); + $this->parser = new CodeArgumentParser(); $this->traverser = new NodeTraverser(); $this->traverser->addVisitor(new SudoVisitor()); @@ -111,11 +109,7 @@ protected function execute(InputInterface $input, OutputInterface $output) $code = $history[\count($history) - 2]; } - if (\strpos($code, 'traverser->traverse($this->parse($code)); + $nodes = $this->traverser->traverse($this->parser->parse($code)); $sudoCode = $this->printer->prettyPrint($nodes); $shell = $this->getApplication(); @@ -123,25 +117,4 @@ protected function execute(InputInterface $input, OutputInterface $output) return 0; } - - /** - * Lex and parse a string of code into statements. - * - * @param string $code - * - * @return array Statements - */ - private function parse(string $code): array - { - try { - return $this->parser->parse($code); - } catch (\PhpParser\Error $e) { - if (\strpos($e->getMessage(), 'unexpected EOF') === false) { - throw $e; - } - - // If we got an unexpected EOF, let's try it again with a semicolon. - return $this->parser->parse($code.';'); - } - } } diff --git a/app/vendor/psy/psysh/src/Command/ThrowUpCommand.php b/app/vendor/psy/psysh/src/Command/ThrowUpCommand.php index ccca8776a..5d8402f54 100644 --- a/app/vendor/psy/psysh/src/Command/ThrowUpCommand.php +++ b/app/vendor/psy/psysh/src/Command/ThrowUpCommand.php @@ -22,7 +22,6 @@ use Psy\ContextAware; use Psy\Exception\ThrowUpException; use Psy\Input\CodeArgument; -use Psy\ParserFactory; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; @@ -39,9 +38,7 @@ class ThrowUpCommand extends Command implements ContextAware */ public function __construct($name = null) { - $parserFactory = new ParserFactory(); - - $this->parser = $parserFactory->createParser(); + $this->parser = new CodeArgumentParser(); $this->printer = new Printer(); parent::__construct($name); @@ -120,11 +117,7 @@ private function prepareArgs(string $code = null): array return [new Arg(new Variable('_e'))]; } - if (\strpos($code, 'parse($code); + $nodes = $this->parser->parse($code); if (\count($nodes) !== 1) { throw new \InvalidArgumentException('No idea how to throw this'); } @@ -143,25 +136,4 @@ private function prepareArgs(string $code = null): array return $args; } - - /** - * Lex and parse a string of code into statements. - * - * @param string $code - * - * @return array Statements - */ - private function parse(string $code): array - { - try { - return $this->parser->parse($code); - } catch (\PhpParser\Error $e) { - if (\strpos($e->getMessage(), 'unexpected EOF') === false) { - throw $e; - } - - // If we got an unexpected EOF, let's try it again with a semicolon. - return $this->parser->parse($code.';'); - } - } } diff --git a/app/vendor/psy/psysh/src/Command/TimeitCommand.php b/app/vendor/psy/psysh/src/Command/TimeitCommand.php index 82b9e0e72..7946e886f 100644 --- a/app/vendor/psy/psysh/src/Command/TimeitCommand.php +++ b/app/vendor/psy/psysh/src/Command/TimeitCommand.php @@ -15,7 +15,6 @@ use PhpParser\PrettyPrinter\Standard as Printer; use Psy\Command\TimeitCommand\TimeitVisitor; use Psy\Input\CodeArgument; -use Psy\ParserFactory; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; @@ -28,6 +27,8 @@ class TimeitCommand extends Command const RESULT_MSG = 'Command took %.6f seconds to complete.'; const AVG_RESULT_MSG = 'Command took %.6f seconds on average (%.6f median; %.6f total) to complete.'; + // All times stored as nanoseconds! + private static $useHrtime; private static $start = null; private static $times = []; @@ -40,8 +41,10 @@ class TimeitCommand extends Command */ public function __construct($name = null) { - $parserFactory = new ParserFactory(); - $this->parser = $parserFactory->createParser(); + // @todo Remove microtime use after we drop support for PHP < 7.3 + self::$useHrtime = \function_exists('hrtime'); + + $this->parser = new CodeArgumentParser(); $this->traverser = new NodeTraverser(); $this->traverser->addVisitor(new TimeitVisitor()); @@ -82,17 +85,17 @@ protected function configure() protected function execute(InputInterface $input, OutputInterface $output) { $code = $input->getArgument('code'); - $num = $input->getOption('num') ?: 1; + $num = (int) ($input->getOption('num') ?: 1); $shell = $this->getApplication(); $instrumentedCode = $this->instrumentCode($code); self::$times = []; - for ($i = 0; $i < $num; $i++) { + do { $_ = $shell->execute($instrumentedCode); $this->ensureEndMarked(); - } + } while (\count(self::$times) < $num); $shell->writeReturnValue($_); @@ -100,13 +103,13 @@ protected function execute(InputInterface $input, OutputInterface $output) self::$times = []; if ($num === 1) { - $output->writeln(\sprintf(self::RESULT_MSG, $times[0])); + $output->writeln(\sprintf(self::RESULT_MSG, $times[0] / 1e+9)); } else { $total = \array_sum($times); \rsort($times); $median = $times[\round($num / 2)]; - $output->writeln(\sprintf(self::AVG_RESULT_MSG, $total / $num, $median, $total)); + $output->writeln(\sprintf(self::AVG_RESULT_MSG, ($total / $num) / 1e+9, $median / 1e+9, $total / 1e+9)); } return 0; @@ -121,7 +124,7 @@ protected function execute(InputInterface $input, OutputInterface $output) */ public static function markStart() { - self::$start = \microtime(true); + self::$start = self::$useHrtime ? \hrtime(true) : (\microtime(true) * 1e+6); } /** @@ -140,7 +143,7 @@ public static function markStart() */ public static function markEnd($ret = null) { - self::$times[] = \microtime(true) - self::$start; + self::$times[] = (self::$useHrtime ? \hrtime(true) : (\microtime(true) * 1e+6)) - self::$start; self::$start = null; return $ret; @@ -164,34 +167,9 @@ private function ensureEndMarked() * * This inserts `markStart` and `markEnd` calls to ensure that (reasonably) * accurate times are recorded for just the code being executed. - * - * @param string $code */ private function instrumentCode(string $code): string { - return $this->printer->prettyPrint($this->traverser->traverse($this->parse($code))); - } - - /** - * Lex and parse a string of code into statements. - * - * @param string $code - * - * @return array Statements - */ - private function parse(string $code): array - { - $code = 'parser->parse($code); - } catch (\PhpParser\Error $e) { - if (\strpos($e->getMessage(), 'unexpected EOF') === false) { - throw $e; - } - - // If we got an unexpected EOF, let's try it again with a semicolon. - return $this->parser->parse($code.';'); - } + return $this->printer->prettyPrint($this->traverser->traverse($this->parser->parse($code))); } } diff --git a/app/vendor/psy/psysh/src/ConfigPaths.php b/app/vendor/psy/psysh/src/ConfigPaths.php index 67fab9865..8eb0e1cb1 100644 --- a/app/vendor/psy/psysh/src/ConfigPaths.php +++ b/app/vendor/psy/psysh/src/ConfigPaths.php @@ -34,7 +34,8 @@ class ConfigPaths public function __construct(array $overrides = [], EnvInterface $env = null) { $this->overrideDirs($overrides); - $this->env = $env ?: new SuperglobalsEnv(); + + $this->env = $env ?: (\PHP_SAPI === 'cli-server' ? new SystemEnv() : new SuperglobalsEnv()); } /** diff --git a/app/vendor/psy/psysh/src/Configuration.php b/app/vendor/psy/psysh/src/Configuration.php index cac00c77a..0be66ea09 100644 --- a/app/vendor/psy/psysh/src/Configuration.php +++ b/app/vendor/psy/psysh/src/Configuration.php @@ -67,6 +67,7 @@ class Configuration 'requireSemicolons', 'runtimeDir', 'startupMessage', + 'strictTypes', 'theme', 'updateCheck', 'useBracketedPaste', @@ -99,6 +100,7 @@ class Configuration private $pipedOutput; private $rawOutput = false; private $requireSemicolons = false; + private $strictTypes = false; private $useUnicode; private $useTabCompletion; private $newMatchers = []; @@ -147,6 +149,8 @@ public function __construct(array $config = []) $this->configFile = $config['configFile']; } elseif (isset($_SERVER['PSYSH_CONFIG']) && $_SERVER['PSYSH_CONFIG']) { $this->configFile = $_SERVER['PSYSH_CONFIG']; + } elseif (\PHP_SAPI === 'cli-server' && ($configFile = \getenv('PSYSH_CONFIG'))) { + $this->configFile = $configFile; } // legacy baseDir option @@ -960,6 +964,22 @@ public function requireSemicolons(): bool return $this->requireSemicolons; } + /** + * Enable or disable strict types enforcement. + */ + public function setStrictTypes($strictTypes) + { + $this->strictTypes = (bool) $strictTypes; + } + + /** + * Check whether to enforce strict types. + */ + public function strictTypes(): bool + { + return $this->strictTypes; + } + /** * Enable or disable Unicode in PsySH specific output. * @@ -1036,7 +1056,7 @@ public function setCodeCleaner(CodeCleaner $cleaner) public function getCodeCleaner(): CodeCleaner { if (!isset($this->cleaner)) { - $this->cleaner = new CodeCleaner(null, null, null, $this->yolo()); + $this->cleaner = new CodeCleaner(null, null, null, $this->yolo(), $this->strictTypes()); } return $this->cleaner; diff --git a/app/vendor/psy/psysh/src/Exception/ErrorException.php b/app/vendor/psy/psysh/src/Exception/ErrorException.php index 54abcfd70..13e24fe9e 100644 --- a/app/vendor/psy/psysh/src/Exception/ErrorException.php +++ b/app/vendor/psy/psysh/src/Exception/ErrorException.php @@ -101,7 +101,7 @@ public static function throwException($errno, $errstr, $errfile, $errline) /** * Create an ErrorException from an Error. * - * @deprecated psySH no longer wraps Errors + * @deprecated PsySH no longer wraps Errors * * @param \Error $e */ diff --git a/app/vendor/psy/psysh/src/Exception/ThrowUpException.php b/app/vendor/psy/psysh/src/Exception/ThrowUpException.php index a01c39d25..6e2da0899 100644 --- a/app/vendor/psy/psysh/src/Exception/ThrowUpException.php +++ b/app/vendor/psy/psysh/src/Exception/ThrowUpException.php @@ -36,7 +36,7 @@ public function getRawMessage(): string /** * Create a ThrowUpException from a Throwable. * - * @deprecated psySH no longer wraps Throwables + * @deprecated PsySH no longer wraps Throwables * * @param \Throwable $throwable */ diff --git a/app/vendor/psy/psysh/src/Exception/TypeErrorException.php b/app/vendor/psy/psysh/src/Exception/TypeErrorException.php index d7151ead7..cbf00eaa6 100644 --- a/app/vendor/psy/psysh/src/Exception/TypeErrorException.php +++ b/app/vendor/psy/psysh/src/Exception/TypeErrorException.php @@ -21,7 +21,7 @@ class TypeErrorException extends \Exception implements Exception /** * Constructor! * - * @deprecated psySH no longer wraps TypeErrors + * @deprecated PsySH no longer wraps TypeErrors * * @param string $message (default: "") * @param int $code (default: 0) @@ -45,7 +45,7 @@ public function getRawMessage(): string /** * Create a TypeErrorException from a TypeError. * - * @deprecated psySH no longer wraps TypeErrors + * @deprecated PsySH no longer wraps TypeErrors * * @param \TypeError $e */ diff --git a/app/vendor/psy/psysh/src/ExecutionLoop/RunkitReloader.php b/app/vendor/psy/psysh/src/ExecutionLoop/RunkitReloader.php index 74046a2e2..d84651965 100644 --- a/app/vendor/psy/psysh/src/ExecutionLoop/RunkitReloader.php +++ b/app/vendor/psy/psysh/src/ExecutionLoop/RunkitReloader.php @@ -17,6 +17,8 @@ /** * A runkit-based code reloader, which is pretty much magic. + * + * @todo Remove RunkitReloader once we drop support for PHP 7.x :( */ class RunkitReloader extends AbstractListener { diff --git a/app/vendor/psy/psysh/src/Formatter/CodeFormatter.php b/app/vendor/psy/psysh/src/Formatter/CodeFormatter.php index 43bb7fc08..d795cf1ea 100644 --- a/app/vendor/psy/psysh/src/Formatter/CodeFormatter.php +++ b/app/vendor/psy/psysh/src/Formatter/CodeFormatter.php @@ -32,7 +32,7 @@ class CodeFormatter implements ReflectorFormatter const HIGHLIGHT_CONST = 'const'; const HIGHLIGHT_NUMBER = 'number'; const HIGHLIGHT_STRING = 'string'; - const HIGHLIGHT_COMMENT = 'comment'; + const HIGHLIGHT_COMMENT = 'code_comment'; const HIGHLIGHT_INLINE_HTML = 'inline_html'; private static $tokenMap = [ diff --git a/app/vendor/psy/psysh/src/Output/Theme.php b/app/vendor/psy/psysh/src/Output/Theme.php index 76489e6d5..01023f2ec 100644 --- a/app/vendor/psy/psysh/src/Output/Theme.php +++ b/app/vendor/psy/psysh/src/Output/Theme.php @@ -57,21 +57,22 @@ class Theme 'default' => [null], // Types - 'number' => ['magenta'], - 'integer' => ['magenta'], - 'float' => ['yellow'], - 'string' => ['green'], - 'bool' => ['cyan'], - 'keyword' => ['yellow'], - 'comment' => ['blue'], - 'object' => ['blue'], - 'resource' => ['yellow'], + 'number' => ['magenta'], + 'integer' => ['magenta'], + 'float' => ['yellow'], + 'string' => ['green'], + 'bool' => ['cyan'], + 'keyword' => ['yellow'], + 'comment' => ['blue'], + 'code_comment' => ['gray'], + 'object' => ['blue'], + 'resource' => ['yellow'], // Code-specific formatting 'inline_html' => ['cyan'], ]; - const ERROR_STYLES = ['info', 'warning', 'error', 'whisper']; + const ERROR_STYLES = ['info', 'warning', 'error', 'whisper', 'class']; private $compact = false; diff --git a/app/vendor/psy/psysh/src/Readline/Hoa/Protocol.php b/app/vendor/psy/psysh/src/Readline/Hoa/Protocol.php index 51d064e02..922ddcbfb 100644 --- a/app/vendor/psy/psysh/src/Readline/Hoa/Protocol.php +++ b/app/vendor/psy/psysh/src/Readline/Hoa/Protocol.php @@ -87,7 +87,7 @@ public static function getInstance(): self protected function initialize() { $root = \dirname(__DIR__, 3); - $argv0 = \realpath($_SERVER['argv'][0]); + $argv0 = isset($_SERVER['argv'][0]) ? \realpath($_SERVER['argv'][0]) : false; $cwd = 'cli' === \PHP_SAPI diff --git a/app/vendor/psy/psysh/src/Shell.php b/app/vendor/psy/psysh/src/Shell.php index 5b52515c3..7ec2609af 100644 --- a/app/vendor/psy/psysh/src/Shell.php +++ b/app/vendor/psy/psysh/src/Shell.php @@ -27,6 +27,7 @@ use Psy\VarDumper\PresenterAware; use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command as BaseCommand; +use Symfony\Component\Console\Exception\ExceptionInterface as SymfonyConsoleException; use Symfony\Component\Console\Formatter\OutputFormatter; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Input\InputArgument; @@ -49,7 +50,7 @@ */ class Shell extends Application { - const VERSION = 'v0.11.14'; + const VERSION = 'v0.11.21'; /** @deprecated */ const PROMPT = '>>> '; @@ -626,7 +627,7 @@ public function onExecute(string $code): string $output = $output->getErrorOutput(); } - $output->writeln(\sprintf('', OutputFormatter::escape($code)), ConsoleOutput::VERBOSITY_DEBUG); + $output->writeln(\sprintf('%s', OutputFormatter::escape($code)), ConsoleOutput::VERBOSITY_DEBUG); return $code; } @@ -1319,10 +1320,21 @@ protected function getMessageLabel(\Throwable $e): string } } - if ($e instanceof PsyException) { + if ($e instanceof PsyException || $e instanceof SymfonyConsoleException) { $exceptionShortName = (new \ReflectionClass($e))->getShortName(); $typeParts = \preg_split('/(?=[A-Z])/', $exceptionShortName); - \array_pop($typeParts); // Removes "Exception" + + switch ($exceptionShortName) { + case 'RuntimeException': + case 'LogicException': + // These ones look weird without 'Exception' + break; + default: + if (\end($typeParts) === 'Exception') { + \array_pop($typeParts); + } + break; + } return \trim(\strtoupper(\implode(' ', $typeParts))); } diff --git a/app/vendor/psy/psysh/src/SystemEnv.php b/app/vendor/psy/psysh/src/SystemEnv.php new file mode 100644 index 000000000..fe2a8edcf --- /dev/null +++ b/app/vendor/psy/psysh/src/SystemEnv.php @@ -0,0 +1,34 @@ + Shell::VERSION, @@ -165,6 +168,7 @@ function info(Configuration $config = null) 'OS' => \PHP_OS, 'default includes' => $config->getDefaultIncludes(), 'require semicolons' => $config->requireSemicolons(), + 'strict types' => $config->strictTypes(), 'error logging level' => $config->errorLoggingLevel(), 'config file' => [ 'default config file' => $prettyPath($config->getConfigFile()), @@ -391,7 +395,7 @@ function bin(): \Closure } // Handle --help - if ($usageException !== null || $input->getOption('help')) { + if (!isset($config) || $usageException !== null || $input->getOption('help')) { if ($usageException !== null) { echo $usageException->getMessage().\PHP_EOL.\PHP_EOL; } diff --git a/app/vendor/react/promise/CHANGELOG.md b/app/vendor/react/promise/CHANGELOG.md index 7f785eb5c..14434944a 100644 --- a/app/vendor/react/promise/CHANGELOG.md +++ b/app/vendor/react/promise/CHANGELOG.md @@ -1,186 +1,134 @@ -CHANGELOG for 2.x -================= +# Changelog + +## 3.0.0 (2023-07-11) + +A major new feature release, see [**release announcement**](https://clue.engineering/2023/announcing-reactphp-promise-v3). + +* We'd like to emphasize that this component is production ready and battle-tested. + We plan to support all long-term support (LTS) releases for at least 24 months, + so you have a rock-solid foundation to build on top of. + +* The v3 release will be the way forward for this package. However, we will still + actively support v2 and v1 to provide a smooth upgrade path for those not yet + on the latest versions. + +This update involves some major new features and a minor BC break over the +`v2.0.0` release. We've tried hard to avoid BC breaks where possible and +minimize impact otherwise. We expect that most consumers of this package will be +affected by BC breaks, but updating should take no longer than a few minutes. +See below for more details: + +* BC break: PHP 8.1+ recommended, PHP 7.1+ required. + (#138 and #149 by @WyriHaximus) + +* Feature / BC break: The `PromiseInterface` now includes the functionality of the old ~~`ExtendedPromiseInterface`~~ and ~~`CancellablePromiseInterface`~~. + Each promise now always includes the `then()`, `catch()`, `finally()` and `cancel()` methods. + The new `catch()` and `finally()` methods replace the deprecated ~~`otherwise()`~~ and ~~`always()`~~ methods which continue to exist for BC reasons. + The old ~~`ExtendedPromiseInterface`~~ and ~~`CancellablePromiseInterface`~~ are no longer needed and have been removed as a consequence. + (#75 by @jsor and #208 by @clue and @WyriHaximus) -* 2.9.0 (2022-02-11) + ```php + // old (multiple interfaces may or may not be implemented) + assert($promise instanceof PromiseInterface); + assert(method_exists($promise, 'then')); + if ($promise instanceof ExtendedPromiseInterface) { assert(method_exists($promise, 'otherwise')); } + if ($promise instanceof ExtendedPromiseInterface) { assert(method_exists($promise, 'always')); } + if ($promise instanceof CancellablePromiseInterface) { assert(method_exists($promise, 'cancel')); } + + // new (single PromiseInterface with all methods) + assert($promise instanceof PromiseInterface); + assert(method_exists($promise, 'then')); + assert(method_exists($promise, 'catch')); + assert(method_exists($promise, 'finally')); + assert(method_exists($promise, 'cancel')); + ``` - * Feature: Support union types and address deprecation of `ReflectionType::getClass()` (PHP 8+). - (#198 by @cdosoftei and @SimonFrings) +* Feature / BC break: Improve type safety of promises. Require `mixed` fulfillment value argument and `Throwable` (or `Exception`) as rejection reason. + Add PHPStan template types to ensure strict types for `resolve(T $value): PromiseInterface` and `reject(Throwable $reason): PromiseInterface`. + It is no longer possible to resolve a promise without a value (use `null` instead) or reject a promise without a reason (use `Throwable` instead). + (#93, #141 and #142 by @jsor, #138, #149 and #247 by @WyriHaximus and #213 and #246 by @clue) - ```php - $promise->otherwise(function (OverflowException|UnderflowException $e) { - echo 'Error: ' . $e->getMessage() . PHP_EOL; - }); - ``` + ```php + // old (arguments used to be optional) + $promise = resolve(); + $promise = reject(); + + // new (already supported before) + $promise = resolve(null); + $promise = reject(new RuntimeException()); + ``` - * Feature: Support intersection types (PHP 8.1+). - (#195 by @bzikarsky) +* Feature / BC break: Report all unhandled rejections by default and remove ~~`done()`~~ method. + Add new `set_rejection_handler()` function to set the global rejection handler for unhandled promise rejections. + (#248, #249 and #224 by @clue) - ```php - $promise->otherwise(function (OverflowException&CacheException $e) { - echo 'Error: ' . $e->getMessage() . PHP_EOL; - }); - ``` + ```php + // Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 + reject(new RuntimeException('Unhandled')); + ``` - * Improve test suite, use GitHub actions for continuous integration (CI), - update to PHPUnit 9, and add full core team to the license. - (#174, #183, #186, and #201 by @SimonFrings and #211 by @clue) +* BC break: Remove all deprecated APIs and reduce API surface. + Remove ~~`some()`~~, ~~`map()`~~, ~~`reduce()`~~ functions, use `any()` and `all()` functions instead. + Remove internal ~~`FulfilledPromise`~~ and ~~`RejectedPromise`~~ classes, use `resolve()` and `reject()` functions instead. + Remove legacy promise progress API (deprecated third argument to `then()` method) and deprecated ~~`LazyPromise`~~ class. + (#32 and #98 by @jsor and #164, #219 and #220 by @clue) -* 2.8.0 (2020-05-12) +* BC break: Make all classes final to encourage composition over inheritance. + (#80 by @jsor) - * Mark `FulfilledPromise`, `RejectedPromise` and `LazyPromise` as deprecated for Promise v2 (and remove for Promise v3). - (#143 and #165 by @clue) +* Feature / BC break: Require `array` (or `iterable`) type for `all()` + `race()` + `any()` functions and bring in line with ES6 specification. + These functions now require a single argument with a variable number of promises or values as input. + (#225 by @clue and #35 by @jsor) - ```php - // deprecated - $fulfilled = new React\Promise\FulfilledPromise($value); - $rejected = new React\Promise\RejectedPromise($reason); +* Fix / BC break: Fix `race()` to return a forever pending promise when called with an empty `array` (or `iterable`) and bring in line with ES6 specification. + (#83 by @jsor and #225 by @clue) - // recommended alternatives - $fulfilled = React\Promise\resolve($value); - $rejected = React\Promise\reject($reason); - ``` +* Minor performance improvements by initializing `Deferred` in the constructor and avoiding `call_user_func()` calls. + (#151 by @WyriHaximus and #171 by @Kubo2) - * Fix: Fix checking whether cancellable promise is an object and avoid possible warning. - (#168 by @smscr and @jsor) +* Minor documentation improvements. + (#110 by @seregazhuk, #132 by @CharlotteDunois, #145 by @danielecr, #178 by @WyriHaximus, #189 by @srdante, #212 by @clue, #214, #239 and #243 by @SimonFrings and #231 by @nhedger) - * Improve documentation and add docblocks to functions and interfaces. - (#135 by @CharlotteDunois) +The following changes had to be ported to this release due to our branching +strategy, but also appeared in the [`2.x` branch](https://github.com/reactphp/promise/tree/2.x): - * Add `.gitattributes` to exclude dev files from exports. - (#154 by @reedy) +* Feature: Support union types and address deprecation of `ReflectionType::getClass()` (PHP 8+). + (#197 by @cdosoftei and @SimonFrings) - * Improve test suite, run tests on PHP 7.4 and update PHPUnit test setup. - (#163 by @clue) +* Feature: Support intersection types (PHP 8.1+). + (#209 by @bzikarsky) -* 2.7.1 (2018-01-07) +* Feature: Support DNS types (PHP 8.2+). + (#236 by @nhedger) - * Fix: file_exists warning when resolving with long strings. - (#130 by @sbesselsen) - * Improve performance by prefixing all global functions calls with \ to skip the look up and resolve process and go straight to the global function. - (#133 by @WyriHaximus) +* Feature: Port all memory improvements from `2.x` to `3.x`. + (#150 by @clue and @WyriHaximus) -* 2.7.0 (2018-06-13) +* Fix: Fix checking whether cancellable promise is an object and avoid possible warning. + (#161 by @smscr) - * Feature: Improve memory consumption for pending promises by using static internal callbacks without binding to self. - (#124 by @clue) +* Improve performance by prefixing all global functions calls with \ to skip the look up and resolve process and go straight to the global function. + (#134 by @WyriHaximus) -* 2.6.0 (2018-06-11) +* Improve test suite, update PHPUnit and PHP versions and add `.gitattributes` to exclude dev files from exports. + (#107 by @carusogabriel, #148 and #234 by @WyriHaximus, #153 by @reedy, #162, #230 and #240 by @clue, #173, #177, #185 and #199 by @SimonFrings, #193 by @woodongwong and #210 by @bzikarsky) + +The following changes were originally planned for this release but later reverted +and are not part of the final release: - * Feature: Significantly improve memory consumption and performance by only passing resolver args - to resolver and canceller if callback requires them. Also use static callbacks without - binding to promise, clean up canceller function reference when they are no longer - needed and hide resolver and canceller references from call stack on PHP 7+. - (#113, #115, #116, #117, #118, #119 and #123 by @clue) +* Add iterative callback queue handler to avoid recursion (later removed to improve Fiber support). + (#28, #82 and #86 by @jsor, #158 by @WyriHaximus and #229 and #238 by @clue) - These changes combined mean that rejecting promises with an `Exception` should - no longer cause any internal circular references which could cause some unexpected - memory growth in previous versions. By explicitly avoiding and explicitly - cleaning up said references, we can avoid relying on PHP's circular garbage collector - to kick in which significantly improves performance when rejecting many promises. +* Trigger an `E_USER_ERROR` instead of throwing an exception from `done()` (later removed entire `done()` method to globally report unhandled rejections). + (#97 by @jsor and #224 and #248 by @clue) - * Mark legacy progress support / notification API as deprecated - (#112 by @clue) +* Add type declarations for `some()` (later removed entire `some()` function). + (#172 by @WyriHaximus and #219 by @clue) - * Recommend rejecting promises by throwing an exception - (#114 by @jsor) +## 2.0.0 (2013-12-10) - * Improve documentation to properly instantiate LazyPromise - (#121 by @holtkamp) +See [`2.x` CHANGELOG](https://github.com/reactphp/promise/blob/2.x/CHANGELOG.md) for more details. - * Follower cancellation propagation was originally planned for this release - but has been reverted for now and is planned for a future release. - (#99 by @jsor and #122 by @clue) +## 1.0.0 (2012-11-07) -* 2.5.1 (2017-03-25) - - * Fix circular references when resolving with a promise which follows - itself (#94). - -* 2.5.0 (2016-12-22) - - * Revert automatic cancellation of pending collection promises once the - output promise resolves. This was introduced in 42d86b7 (PR #36, released - in [v2.3.0](https://github.com/reactphp/promise/releases/tag/v2.3.0)) and - was both unintended and backward incompatible. - - If you need automatic cancellation, you can use something like: - - ```php - function allAndCancel(array $promises) - { - return \React\Promise\all($promises) - ->always(function() use ($promises) { - foreach ($promises as $promise) { - if ($promise instanceof \React\Promise\CancellablePromiseInterface) { - $promise->cancel(); - } - } - }); - } - ``` - * `all()` and `map()` functions now preserve the order of the array (#77). - * Fix circular references when resolving a promise with itself (#71). - -* 2.4.1 (2016-05-03) - - * Fix `some()` not cancelling pending promises when too much input promises - reject (16ff799). - -* 2.4.0 (2016-03-31) - - * Support foreign thenables in `resolve()`. - Any object that provides a `then()` method is now assimilated to a trusted - promise that follows the state of this thenable (#52). - * Fix `some()` and `any()` for input arrays containing not enough items - (#34). - -* 2.3.0 (2016-03-24) - - * Allow cancellation of promises returned by functions working on promise - collections (#36). - * Handle `\Throwable` in the same way as `\Exception` (#51 by @joshdifabio). - -* 2.2.2 (2016-02-26) - - * Fix cancellation handlers called multiple times (#47 by @clue). - -* 2.2.1 (2015-07-03) - - * Fix stack error when resolving a promise in its own fulfillment or - rejection handlers. - -* 2.2.0 (2014-12-30) - - * Introduce new `ExtendedPromiseInterface` implemented by all promises. - * Add new `done()` method (part of the `ExtendedPromiseInterface`). - * Add new `otherwise()` method (part of the `ExtendedPromiseInterface`). - * Add new `always()` method (part of the `ExtendedPromiseInterface`). - * Add new `progress()` method (part of the `ExtendedPromiseInterface`). - * Rename `Deferred::progress` to `Deferred::notify` to avoid confusion with - `ExtendedPromiseInterface::progress` (a `Deferred::progress` alias is - still available for backward compatibility) - * `resolve()` now always returns a `ExtendedPromiseInterface`. - -* 2.1.0 (2014-10-15) - - * Introduce new `CancellablePromiseInterface` implemented by all promises. - * Add new `cancel()` method (part of the `CancellablePromiseInterface`). - -* 2.0.0 (2013-12-10) - - New major release. The goal is to streamline the API and to make it more - compliant with other promise libraries and especially with the new upcoming - [ES6 promises specification](https://github.com/domenic/promises-unwrapping/). - - * Add standalone Promise class. - * Add new `race()` function. - * BC break: Bump minimum PHP version to PHP 5.4. - * BC break: Remove `ResolverInterface` and `PromiseInterface` from - `Deferred`. - * BC break: Change signature of `PromiseInterface`. - * BC break: Remove `When` and `Util` classes and move static methods to - functions. - * BC break: `FulfilledPromise` and `RejectedPromise` now throw an exception - when initialized with a promise instead of a value/reason. - * BC break: `Deferred::resolve()` and `Deferred::reject()` no longer return - a promise. +See [`1.x` CHANGELOG](https://github.com/reactphp/promise/blob/1.x/CHANGELOG.md) for more details. diff --git a/app/vendor/react/promise/README.md b/app/vendor/react/promise/README.md index d904a1d8f..6b8f97220 100644 --- a/app/vendor/react/promise/README.md +++ b/app/vendor/react/promise/README.md @@ -4,7 +4,8 @@ Promise A lightweight implementation of [CommonJS Promises/A](http://wiki.commonjs.org/wiki/Promises/A) for PHP. -[![CI status](https://github.com/reactphp/promise/workflows/CI/badge.svg?branch=2.x)](https://github.com/reactphp/promise/actions) +[![CI status](https://github.com/reactphp/promise/workflows/CI/badge.svg)](https://github.com/reactphp/promise/actions) +[![installs on Packagist](https://img.shields.io/packagist/dt/react/promise?color=blue&label=installs%20on%20Packagist)](https://packagist.org/packages/react/promise) Table of Contents ----------------- @@ -18,41 +19,31 @@ Table of Contents * [Deferred::promise()](#deferredpromise) * [Deferred::resolve()](#deferredresolve) * [Deferred::reject()](#deferredreject) - * [Deferred::notify()](#deferrednotify) * [PromiseInterface](#promiseinterface) * [PromiseInterface::then()](#promiseinterfacethen) - * [ExtendedPromiseInterface](#extendedpromiseinterface) - * [ExtendedPromiseInterface::done()](#extendedpromiseinterfacedone) - * [ExtendedPromiseInterface::otherwise()](#extendedpromiseinterfaceotherwise) - * [ExtendedPromiseInterface::always()](#extendedpromiseinterfacealways) - * [ExtendedPromiseInterface::progress()](#extendedpromiseinterfaceprogress) - * [CancellablePromiseInterface](#cancellablepromiseinterface) - * [CancellablePromiseInterface::cancel()](#cancellablepromiseinterfacecancel) + * [PromiseInterface::catch()](#promiseinterfacecatch) + * [PromiseInterface::finally()](#promiseinterfacefinally) + * [PromiseInterface::cancel()](#promiseinterfacecancel) + * [~~PromiseInterface::otherwise()~~](#promiseinterfaceotherwise) + * [~~PromiseInterface::always()~~](#promiseinterfacealways) * [Promise](#promise-2) - * [FulfilledPromise](#fulfilledpromise) - * [RejectedPromise](#rejectedpromise) - * [LazyPromise](#lazypromise) * [Functions](#functions) * [resolve()](#resolve) * [reject()](#reject) * [all()](#all) * [race()](#race) * [any()](#any) - * [some()](#some) - * [map()](#map) - * [reduce()](#reduce) - * [PromisorInterface](#promisorinterface) + * [set_rejection_handler()](#set_rejection_handler) 4. [Examples](#examples) * [How to use Deferred](#how-to-use-deferred) * [How promise forwarding works](#how-promise-forwarding-works) * [Resolution forwarding](#resolution-forwarding) * [Rejection forwarding](#rejection-forwarding) * [Mixed resolution and rejection forwarding](#mixed-resolution-and-rejection-forwarding) - * [Progress event forwarding](#progress-event-forwarding) - * [done() vs. then()](#done-vs-then) 5. [Install](#install) -6. [Credits](#credits) -7. [License](#license) +6. [Tests](#tests) +7. [Credits](#credits) +8. [License](#license) Introduction ------------ @@ -94,17 +85,14 @@ $deferred = new React\Promise\Deferred(); $promise = $deferred->promise(); -$deferred->resolve(mixed $value = null); -$deferred->reject(mixed $reason = null); -$deferred->notify(mixed $update = null); +$deferred->resolve(mixed $value); +$deferred->reject(\Throwable $reason); ``` The `promise` method returns the promise of the deferred. The `resolve` and `reject` methods control the state of the deferred. -The deprecated `notify` method is for progress notification. - The constructor of the `Deferred` accepts an optional `$canceller` argument. See [Promise](#promise-2) for more information. @@ -120,7 +108,7 @@ keeping the authority to modify its state to yourself. #### Deferred::resolve() ```php -$deferred->resolve(mixed $value = null); +$deferred->resolve(mixed $value); ``` Resolves the promise returned by `promise()`. All consumers are notified by @@ -130,10 +118,12 @@ having `$onFulfilled` (which they registered via `$promise->then()`) called with If `$value` itself is a promise, the promise will transition to the state of this promise once it is resolved. +See also the [`resolve()` function](#resolve). + #### Deferred::reject() ```php -$deferred->reject(mixed $reason = null); +$deferred->reject(\Throwable $reason); ``` Rejects the promise returned by `promise()`, signalling that the deferred's @@ -141,27 +131,14 @@ computation failed. All consumers are notified by having `$onRejected` (which they registered via `$promise->then()`) called with `$reason`. -If `$reason` itself is a promise, the promise will be rejected with the outcome -of this promise regardless whether it fulfills or rejects. - -#### Deferred::notify() - -> Deprecated in v2.6.0: Progress support is deprecated and should not be used anymore. - -```php -$deferred->notify(mixed $update = null); -``` - -Triggers progress notifications, to indicate to consumers that the computation -is making progress toward its result. - -All consumers are notified by having `$onProgress` (which they registered via -`$promise->then()`) called with `$update`. +See also the [`reject()` function](#reject). ### PromiseInterface The promise interface provides the common interface for all promise implementations. +See [Promise](#promise-2) for the only public implementation exposed by this +package. A promise represents an eventual outcome, which is either fulfillment (success) and an associated value, or rejection (failure) and an associated reason. @@ -169,32 +146,22 @@ and an associated value, or rejection (failure) and an associated reason. Once in the fulfilled or rejected state, a promise becomes immutable. Neither its state nor its result (or error) can be modified. -#### Implementations - -* [Promise](#promise-2) -* [FulfilledPromise](#fulfilledpromise) (deprecated) -* [RejectedPromise](#rejectedpromise) (deprecated) -* [LazyPromise](#lazypromise) (deprecated) - #### PromiseInterface::then() ```php -$transformedPromise = $promise->then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null); +$transformedPromise = $promise->then(callable $onFulfilled = null, callable $onRejected = null); ``` Transforms a promise's value by applying a function to the promise's fulfillment or rejection value. Returns a new promise for the transformed result. -The `then()` method registers new fulfilled, rejection and progress handlers -with a promise (all parameters are optional): +The `then()` method registers new fulfilled and rejection handlers with a promise +(all parameters are optional): * `$onFulfilled` will be invoked once the promise is fulfilled and passed the result as the first argument. * `$onRejected` will be invoked once the promise is rejected and passed the reason as the first argument. - * `$onProgress` (deprecated) will be invoked whenever the producer of the promise - triggers progress notifications and passed a single argument (whatever it - wants) to indicate progress. It returns a new promise that will fulfill with the return value of either `$onFulfilled` or `$onRejected`, whichever is called, or will reject with @@ -207,51 +174,16 @@ the same call to `then()`: never both. 2. `$onFulfilled` and `$onRejected` will never be called more than once. - 3. `$onProgress` (deprecated) may be called multiple times. #### See also * [resolve()](#resolve) - Creating a resolved promise * [reject()](#reject) - Creating a rejected promise -* [ExtendedPromiseInterface::done()](#extendedpromiseinterfacedone) -* [done() vs. then()](#done-vs-then) - -### ExtendedPromiseInterface - -The ExtendedPromiseInterface extends the PromiseInterface with useful shortcut -and utility methods which are not part of the Promises/A specification. - -#### Implementations - -* [Promise](#promise-1) -* [FulfilledPromise](#fulfilledpromise) (deprecated) -* [RejectedPromise](#rejectedpromise) (deprecated) -* [LazyPromise](#lazypromise) (deprecated) - -#### ExtendedPromiseInterface::done() - -```php -$promise->done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null); -``` -Consumes the promise's ultimate value if the promise fulfills, or handles the -ultimate error. - -It will cause a fatal error if either `$onFulfilled` or `$onRejected` throw or -return a rejected promise. - -Since the purpose of `done()` is consumption rather than transformation, -`done()` always returns `null`. - -#### See also - -* [PromiseInterface::then()](#promiseinterfacethen) -* [done() vs. then()](#done-vs-then) - -#### ExtendedPromiseInterface::otherwise() +#### PromiseInterface::catch() ```php -$promise->otherwise(callable $onRejected); +$promise->catch(callable $onRejected); ``` Registers a rejection handler for promise. It is a shortcut for: @@ -265,19 +197,19 @@ only specific errors. ```php $promise - ->otherwise(function (\RuntimeException $reason) { + ->catch(function (\RuntimeException $reason) { // Only catch \RuntimeException instances // All other types of errors will propagate automatically }) - ->otherwise(function ($reason) { + ->catch(function (\Throwable $reason) { // Catch other errors - )}; + }); ``` -#### ExtendedPromiseInterface::always() +#### PromiseInterface::finally() ```php -$newPromise = $promise->always(callable $onFulfilledOrRejected); +$newPromise = $promise->finally(callable $onFulfilledOrRejected); ``` Allows you to execute "cleanup" type tasks in a promise chain. @@ -296,16 +228,16 @@ when the promise is either fulfilled or rejected. rejected promise, `$newPromise` will reject with the thrown exception or rejected promise's reason. -`always()` behaves similarly to the synchronous finally statement. When combined -with `otherwise()`, `always()` allows you to write code that is similar to the familiar +`finally()` behaves similarly to the synchronous finally statement. When combined +with `catch()`, `finally()` allows you to write code that is similar to the familiar synchronous catch/finally pair. Consider the following synchronous code: ```php try { - return doSomething(); -} catch(\Exception $e) { + return doSomething(); +} catch (\Throwable $e) { return handleError($e); } finally { cleanup(); @@ -317,48 +249,47 @@ written: ```php return doSomething() - ->otherwise('handleError') - ->always('cleanup'); + ->catch('handleError') + ->finally('cleanup'); ``` -#### ExtendedPromiseInterface::progress() - -> Deprecated in v2.6.0: Progress support is deprecated and should not be used anymore. +#### PromiseInterface::cancel() -```php -$promise->progress(callable $onProgress); +``` php +$promise->cancel(); ``` -Registers a handler for progress updates from promise. It is a shortcut for: +The `cancel()` method notifies the creator of the promise that there is no +further interest in the results of the operation. -```php -$promise->then(null, null, $onProgress); -``` +Once a promise is settled (either fulfilled or rejected), calling `cancel()` on +a promise has no effect. -### CancellablePromiseInterface +#### ~~PromiseInterface::otherwise()~~ -A cancellable promise provides a mechanism for consumers to notify the creator -of the promise that they are not longer interested in the result of an -operation. +> Deprecated since v3.0.0, see [`catch()`](#promiseinterfacecatch) instead. -#### CancellablePromiseInterface::cancel() +The `otherwise()` method registers a rejection handler for a promise. -``` php -$promise->cancel(); +This method continues to exist only for BC reasons and to ease upgrading +between versions. It is an alias for: + +```php +$promise->catch($onRejected); ``` -The `cancel()` method notifies the creator of the promise that there is no -further interest in the results of the operation. +#### ~~PromiseInterface::always()~~ -Once a promise is settled (either fulfilled or rejected), calling `cancel()` on -a promise has no effect. +> Deprecated since v3.0.0, see [`finally()`](#promiseinterfacefinally) instead. -#### Implementations +The `always()` method allows you to execute "cleanup" type tasks in a promise chain. -* [Promise](#promise-1) -* [FulfilledPromise](#fulfilledpromise) (deprecated) -* [RejectedPromise](#rejectedpromise) (deprecated) -* [LazyPromise](#lazypromise) (deprecated) +This method continues to exist only for BC reasons and to ease upgrading +between versions. It is an alias for: + +```php +$promise->finally($onFulfilledOrRejected); +``` ### Promise @@ -366,16 +297,14 @@ Creates a promise whose state is controlled by the functions passed to `$resolver`. ```php -$resolver = function (callable $resolve, callable $reject, callable $notify) { +$resolver = function (callable $resolve, callable $reject) { // Do some work, possibly asynchronously, and then - // resolve or reject. You can notify of progress events (deprecated) - // along the way if you want/need. + // resolve or reject. $resolve($awesomeResult); // or throw new Exception('Promise rejected'); // or $resolve($anotherPromise); // or $reject($nastyError); - // or $notify($progressNotification); }; $canceller = function () { @@ -398,7 +327,6 @@ function which both will be called with 3 arguments: fate will be equivalent to that of `$otherPromise`. * `$reject($reason)` - Function that rejects the promise. It is recommended to just throw an exception instead of using `$reject()`. - * `$notify($update)` - Deprecated function that issues progress events for the promise. If the resolver or canceller throw an exception, the promise will be rejected with that thrown exception as the rejection reason. @@ -406,108 +334,108 @@ with that thrown exception as the rejection reason. The resolver function will be called immediately, the canceller function only once all consumers called the `cancel()` method of the promise. -### FulfilledPromise - -> Deprecated in v2.8.0: External usage of `FulfilledPromise` is deprecated, use `resolve()` instead. - -Creates a already fulfilled promise. - -```php -$promise = React\Promise\FulfilledPromise($value); -``` - -Note, that `$value` **cannot** be a promise. It's recommended to use -[resolve()](#resolve) for creating resolved promises. +### Functions -### RejectedPromise +Useful functions for creating and joining collections of promises. -> Deprecated in v2.8.0: External usage of `RejectedPromise` is deprecated, use `reject()` instead. +All functions working on promise collections (like `all()`, `race()`, +etc.) support cancellation. This means, if you call `cancel()` on the returned +promise, all promises in the collection are cancelled. -Creates a already rejected promise. +#### resolve() ```php -$promise = React\Promise\RejectedPromise($reason); +$promise = React\Promise\resolve(mixed $promiseOrValue); ``` -Note, that `$reason` **cannot** be a promise. It's recommended to use -[reject()](#reject) for creating rejected promises. - -### LazyPromise +Creates a promise for the supplied `$promiseOrValue`. -> Deprecated in v2.8.0: LazyPromise is deprecated and should not be used anymore. +If `$promiseOrValue` is a value, it will be the resolution value of the +returned promise. -Creates a promise which will be lazily initialized by `$factory` once a consumer -calls the `then()` method. +If `$promiseOrValue` is a thenable (any object that provides a `then()` method), +a trusted promise that follows the state of the thenable is returned. -```php -$factory = function () { - $deferred = new React\Promise\Deferred(); +If `$promiseOrValue` is a promise, it will be returned as is. - // Do some heavy stuff here and resolve the deferred once completed +The resulting `$promise` implements the [`PromiseInterface`](#promiseinterface) +and can be consumed like any other promise: - return $deferred->promise(); -}; - -$promise = new React\Promise\LazyPromise($factory); +```php +$promise = React\Promise\resolve(42); -// $factory will only be executed once we call then() -$promise->then(function ($value) { +$promise->then(function (int $result): void { + var_dump($result); +}, function (\Throwable $e): void { + echo 'Error: ' . $e->getMessage() . PHP_EOL; }); ``` -### Functions - -Useful functions for creating, joining, mapping and reducing collections of -promises. - -All functions working on promise collections (like `all()`, `race()`, `some()` -etc.) support cancellation. This means, if you call `cancel()` on the returned -promise, all promises in the collection are cancelled. If the collection itself -is a promise which resolves to an array, this promise is also cancelled. - -#### resolve() +#### reject() ```php -$promise = React\Promise\resolve(mixed $promiseOrValue); +$promise = React\Promise\reject(\Throwable $reason); ``` -Creates a promise for the supplied `$promiseOrValue`. +Creates a rejected promise for the supplied `$reason`. -If `$promiseOrValue` is a value, it will be the resolution value of the -returned promise. +Note that the [`\Throwable`](https://www.php.net/manual/en/class.throwable.php) interface introduced in PHP 7 covers +both user land [`\Exception`](https://www.php.net/manual/en/class.exception.php)'s and +[`\Error`](https://www.php.net/manual/en/class.error.php) internal PHP errors. By enforcing `\Throwable` as reason to +reject a promise, any language error or user land exception can be used to reject a promise. -If `$promiseOrValue` is a thenable (any object that provides a `then()` method), -a trusted promise that follows the state of the thenable is returned. +The resulting `$promise` implements the [`PromiseInterface`](#promiseinterface) +and can be consumed like any other promise: -If `$promiseOrValue` is a promise, it will be returned as is. +```php +$promise = React\Promise\reject(new RuntimeException('Request failed')); -Note: The promise returned is always a promise implementing -[ExtendedPromiseInterface](#extendedpromiseinterface). If you pass in a custom -promise which only implements [PromiseInterface](#promiseinterface), this -promise will be assimilated to a extended promise following `$promiseOrValue`. +$promise->then(function (int $result): void { + var_dump($result); +}, function (\Throwable $e): void { + echo 'Error: ' . $e->getMessage() . PHP_EOL; +}); +``` -#### reject() +Note that rejected promises should always be handled similar to how any +exceptions should always be caught in a `try` + `catch` block. If you remove the +last reference to a rejected promise that has not been handled, it will +report an unhandled promise rejection: ```php -$promise = React\Promise\reject(mixed $promiseOrValue); -``` +function incorrect(): int +{ + $promise = React\Promise\reject(new RuntimeException('Request failed')); -Creates a rejected promise for the supplied `$promiseOrValue`. + // Commented out: No rejection handler registered here. + // $promise->then(null, function (\Throwable $e): void { /* ignore */ }); -If `$promiseOrValue` is a value, it will be the rejection value of the -returned promise. + // Returning from a function will remove all local variable references, hence why + // this will report an unhandled promise rejection here. + return 42; +} + +// Calling this function will log an error message plus its stack trace: +// Unhandled promise rejection with RuntimeException: Request failed in example.php:10 +incorrect(); +``` + +A rejected promise will be considered "handled" if you catch the rejection +reason with either the [`then()` method](#promiseinterfacethen), the +[`catch()` method](#promiseinterfacecatch), or the +[`finally()` method](#promiseinterfacefinally). Note that each of these methods +return a new promise that may again be rejected if you re-throw an exception. -If `$promiseOrValue` is a promise, its completion value will be the rejected -value of the returned promise. +A rejected promise will also be considered "handled" if you abort the operation +with the [`cancel()` method](#promiseinterfacecancel) (which in turn would +usually reject the promise if it is still pending). -This can be useful in situations where you need to reject a promise without -throwing an exception. For example, it allows you to propagate a rejection with -the value of another promise. +See also the [`set_rejection_handler()` function](#set_rejection_handler). #### all() ```php -$promise = React\Promise\all(array|React\Promise\PromiseInterface $promisesOrValues); +$promise = React\Promise\all(iterable $promisesOrValues); ``` Returns a promise that will resolve only once all the items in @@ -518,16 +446,19 @@ will be an array containing the resolution values of each of the items in #### race() ```php -$promise = React\Promise\race(array|React\Promise\PromiseInterface $promisesOrValues); +$promise = React\Promise\race(iterable $promisesOrValues); ``` Initiates a competitive race that allows one winner. Returns a promise which is resolved in the same way the first settled promise resolves. +The returned promise will become **infinitely pending** if `$promisesOrValues` +contains 0 items. + #### any() ```php -$promise = React\Promise\any(array|React\Promise\PromiseInterface $promisesOrValues); +$promise = React\Promise\any(iterable $promisesOrValues); ``` Returns a promise that will resolve when any one of the items in @@ -535,58 +466,52 @@ Returns a promise that will resolve when any one of the items in will be the resolution value of the triggering item. The returned promise will only reject if *all* items in `$promisesOrValues` are -rejected. The rejection value will be an array of all rejection reasons. +rejected. The rejection value will be a `React\Promise\Exception\CompositeException` +which holds all rejection reasons. The rejection reasons can be obtained with +`CompositeException::getThrowables()`. The returned promise will also reject with a `React\Promise\Exception\LengthException` if `$promisesOrValues` contains 0 items. -#### some() +#### set_rejection_handler() ```php -$promise = React\Promise\some(array|React\Promise\PromiseInterface $promisesOrValues, integer $howMany); +React\Promise\set_rejection_handler(?callable $callback): ?callable; ``` -Returns a promise that will resolve when `$howMany` of the supplied items in -`$promisesOrValues` resolve. The resolution value of the returned promise -will be an array of length `$howMany` containing the resolution values of the -triggering items. - -The returned promise will reject if it becomes impossible for `$howMany` items -to resolve (that is, when `(count($promisesOrValues) - $howMany) + 1` items -reject). The rejection value will be an array of -`(count($promisesOrValues) - $howMany) + 1` rejection reasons. - -The returned promise will also reject with a `React\Promise\Exception\LengthException` -if `$promisesOrValues` contains less items than `$howMany`. - -#### map() +Sets the global rejection handler for unhandled promise rejections. -```php -$promise = React\Promise\map(array|React\Promise\PromiseInterface $promisesOrValues, callable $mapFunc); -``` +Note that rejected promises should always be handled similar to how any +exceptions should always be caught in a `try` + `catch` block. If you remove +the last reference to a rejected promise that has not been handled, it will +report an unhandled promise rejection. See also the [`reject()` function](#reject) +for more details. -Traditional map function, similar to `array_map()`, but allows input to contain -promises and/or values, and `$mapFunc` may return either a value or a promise. +The `?callable $callback` argument MUST be a valid callback function that +accepts a single `Throwable` argument or a `null` value to restore the +default promise rejection handler. The return value of the callback function +will be ignored and has no effect, so you SHOULD return a `void` value. The +callback function MUST NOT throw or the program will be terminated with a +fatal error. -The map function receives each item as argument, where item is a fully resolved -value of a promise or value in `$promisesOrValues`. +The function returns the previous rejection handler or `null` if using the +default promise rejection handler. -#### reduce() +The default promise rejection handler will log an error message plus its stack +trace: ```php -$promise = React\Promise\reduce(array|React\Promise\PromiseInterface $promisesOrValues, callable $reduceFunc , $initialValue = null); +// Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 +React\Promise\reject(new RuntimeException('Unhandled')); ``` -Traditional reduce function, similar to `array_reduce()`, but input may contain -promises and/or values, and `$reduceFunc` may return either a value or a -promise, *and* `$initialValue` may be a promise or a value for the starting -value. - -### PromisorInterface - -The `React\Promise\PromisorInterface` provides a common interface for objects -that provide a promise. `React\Promise\Deferred` implements it, but since it -is part of the public API anyone can implement it. +The promise rejection handler may be used to use customize the log message or +write to custom log targets. As a rule of thumb, this function should only be +used as a last resort and promise rejections are best handled with either the +[`then()` method](#promiseinterfacethen), the +[`catch()` method](#promiseinterfacecatch), or the +[`finally()` method](#promiseinterfacefinally). +See also the [`reject()` function](#reject) for more details. Examples -------- @@ -599,7 +524,7 @@ function getAwesomeResultPromise() $deferred = new React\Promise\Deferred(); // Execute a Node.js-style function using the callback pattern - computeAwesomeResultAsynchronously(function ($error, $result) use ($deferred) { + computeAwesomeResultAsynchronously(function (\Throwable $error, $result) use ($deferred) { if ($error) { $deferred->reject($error); } else { @@ -616,11 +541,8 @@ getAwesomeResultPromise() function ($value) { // Deferred resolved, do something with $value }, - function ($reason) { + function (\Throwable $reason) { // Deferred rejected, do something with $reason - }, - function ($update) { - // Progress notification triggered, do something with $update } ); ``` @@ -688,17 +610,17 @@ $deferred->promise() ->then(function ($x) { throw new \Exception($x + 1); }) - ->otherwise(function (\Exception $x) { + ->catch(function (\Exception $x) { // Propagate the rejection throw $x; }) - ->otherwise(function (\Exception $x) { + ->catch(function (\Exception $x) { // Can also propagate by returning another rejection return React\Promise\reject( new \Exception($x->getMessage() + 1) ); }) - ->otherwise(function ($x) { + ->catch(function ($x) { echo 'Reject ' . $x->getMessage(); // 3 }); @@ -720,7 +642,7 @@ $deferred->promise() ->then(function ($x) { throw new \Exception($x + 1); }) - ->otherwise(function (\Exception $x) { + ->catch(function (\Exception $x) { // Handle the rejection, and don't propagate. // This is like catch without a rethrow return $x->getMessage() + 1; @@ -732,131 +654,57 @@ $deferred->promise() $deferred->resolve(1); // Prints "Mixed 4" ``` -#### Progress event forwarding - -> Deprecated in v2.6.0: Progress support is deprecated and should not be used anymore. - -In the same way as resolution and rejection handlers, your progress handler -**MUST** return a progress event to be propagated to the next link in the chain. -If you return nothing, `null` will be propagated. - -Also in the same way as resolutions and rejections, if you don't register a -progress handler, the update will be propagated through. - -If your progress handler throws an exception, the exception will be propagated -to the next link in the chain. The best thing to do is to ensure your progress -handlers do not throw exceptions. - -This gives you the opportunity to transform progress events at each step in the -chain so that they are meaningful to the next step. It also allows you to choose -not to transform them, and simply let them propagate untransformed, by not -registering a progress handler. +Install +------- -```php -$deferred = new React\Promise\Deferred(); +The recommended way to install this library is [through Composer](https://getcomposer.org/). +[New to Composer?](https://getcomposer.org/doc/00-intro.md) -$deferred->promise() - ->progress(function ($update) { - return $update + 1; - }) - ->progress(function ($update) { - echo 'Progress ' . $update; // 2 - }); +This project follows [SemVer](https://semver.org/). +This will install the latest supported version from this branch: -$deferred->notify(1); // Prints "Progress 2" +```bash +composer require react/promise:^3 ``` -### done() vs. then() - -The golden rule is: - - Either return your promise, or call done() on it. - -At a first glance, `then()` and `done()` seem very similar. However, there are -important distinctions. - -The intent of `then()` is to transform a promise's value and to pass or return -a new promise for the transformed value along to other parts of your code. - -The intent of `done()` is to consume a promise's value, transferring -responsibility for the value to your code. - -In addition to transforming a value, `then()` allows you to recover from, or -propagate intermediate errors. Any errors that are not handled will be caught -by the promise machinery and used to reject the promise returned by `then()`. - -Calling `done()` transfers all responsibility for errors to your code. If an -error (either a thrown exception or returned rejection) escapes the -`$onFulfilled` or `$onRejected` callbacks you provide to done, it will be -rethrown in an uncatchable way causing a fatal error. +See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. -```php -function getJsonResult() -{ - return queryApi() - ->then( - // Transform API results to an object - function ($jsonResultString) { - return json_decode($jsonResultString); - }, - // Transform API errors to an exception - function ($jsonErrorString) { - $object = json_decode($jsonErrorString); - throw new ApiErrorException($object->errorMessage); - } - ); -} +This project aims to run on any platform and thus does not require any PHP +extensions and supports running on PHP 7.1 through current PHP 8+. +It's *highly recommended to use the latest supported PHP version* for this project. -// Here we provide no rejection handler. If the promise returned has been -// rejected, the ApiErrorException will be thrown -getJsonResult() - ->done( - // Consume transformed object - function ($jsonResultObject) { - // Do something with $jsonResultObject - } - ); +We're committed to providing long-term support (LTS) options and to provide a +smooth upgrade path. If you're using an older PHP version, you may use the +[`2.x` branch](https://github.com/reactphp/promise/tree/2.x) (PHP 5.4+) or +[`1.x` branch](https://github.com/reactphp/promise/tree/1.x) (PHP 5.3+) which both +provide a compatible API but do not take advantage of newer language features. +You may target multiple versions at the same time to support a wider range of +PHP versions like this: -// Here we provide a rejection handler which will either throw while debugging -// or log the exception -getJsonResult() - ->done( - function ($jsonResultObject) { - // Do something with $jsonResultObject - }, - function (ApiErrorException $exception) { - if (isDebug()) { - throw $exception; - } else { - logException($exception); - } - } - ); +```bash +composer require "react/promise:^3 || ^2 || ^1" ``` -Note that if a rejection value is not an instance of `\Exception`, it will be -wrapped in an exception of the type `React\Promise\UnhandledRejectionException`. - -You can get the original rejection reason by calling `$exception->getReason()`. +## Tests -Install -------- +To run the test suite, you first need to clone this repo and then install all +dependencies [through Composer](https://getcomposer.org/): -The recommended way to install this library is [through Composer](https://getcomposer.org). -[New to Composer?](https://getcomposer.org/doc/00-intro.md) +```bash +composer install +``` -This project follows [SemVer](https://semver.org/). -This will install the latest supported version: +To run the test suite, go to the project root and run: ```bash -$ composer require react/promise:^2.9 +vendor/bin/phpunit ``` -See also the [CHANGELOG](CHANGELOG.md) for details about version upgrades. +On top of this, we use PHPStan on max level to ensure type safety across the project: -This project aims to run on any platform and thus does not require any PHP -extensions and supports running on legacy PHP 5.4 through current PHP 8+ and HHVM. -It's *highly recommended to use the latest supported PHP version* for this project. +```bash +vendor/bin/phpstan +``` Credits ------- diff --git a/app/vendor/react/promise/composer.json b/app/vendor/react/promise/composer.json index f933f1537..33eb2a1bf 100644 --- a/app/vendor/react/promise/composer.json +++ b/app/vendor/react/promise/composer.json @@ -25,21 +25,30 @@ } ], "require": { - "php": ">=5.4.0" + "php": ">=7.1.0" }, "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + "phpstan/phpstan": "1.10.20 || 1.4.10", + "phpunit/phpunit": "^9.5 || ^7.5" }, "autoload": { "psr-4": { "React\\Promise\\": "src/" }, - "files": ["src/functions_include.php"] + "files": [ + "src/functions_include.php" + ] }, "autoload-dev": { "psr-4": { - "React\\Promise\\": ["tests", "tests/fixtures"] - } + "React\\Promise\\": [ + "tests/fixtures/", + "tests/" + ] + }, + "files": [ + "tests/Fiber.php" + ] }, "keywords": [ "promise", diff --git a/app/vendor/react/promise/src/CancellablePromiseInterface.php b/app/vendor/react/promise/src/CancellablePromiseInterface.php deleted file mode 100644 index 6b3a8c65d..000000000 --- a/app/vendor/react/promise/src/CancellablePromiseInterface.php +++ /dev/null @@ -1,17 +0,0 @@ - + */ private $promise; + + /** @var callable */ private $resolveCallback; + + /** @var callable */ private $rejectCallback; - private $notifyCallback; - private $canceller; public function __construct(callable $canceller = null) { - $this->canceller = $canceller; + $this->promise = new Promise(function ($resolve, $reject): void { + $this->resolveCallback = $resolve; + $this->rejectCallback = $reject; + }, $canceller); } - public function promise() + /** + * @return PromiseInterface + */ + public function promise(): PromiseInterface { - if (null === $this->promise) { - $this->promise = new Promise(function ($resolve, $reject, $notify) { - $this->resolveCallback = $resolve; - $this->rejectCallback = $reject; - $this->notifyCallback = $notify; - }, $this->canceller); - $this->canceller = null; - } - return $this->promise; } - public function resolve($value = null) - { - $this->promise(); - - \call_user_func($this->resolveCallback, $value); - } - - public function reject($reason = null) - { - $this->promise(); - - \call_user_func($this->rejectCallback, $reason); - } - /** - * @deprecated 2.6.0 Progress support is deprecated and should not be used anymore. - * @param mixed $update + * @param T $value */ - public function notify($update = null) + public function resolve($value): void { - $this->promise(); - - \call_user_func($this->notifyCallback, $update); + ($this->resolveCallback)($value); } - /** - * @deprecated 2.2.0 - * @see Deferred::notify() - */ - public function progress($update = null) + public function reject(\Throwable $reason): void { - $this->notify($update); + ($this->rejectCallback)($reason); } } diff --git a/app/vendor/react/promise/src/Exception/CompositeException.php b/app/vendor/react/promise/src/Exception/CompositeException.php new file mode 100644 index 000000000..2e672a04a --- /dev/null +++ b/app/vendor/react/promise/src/Exception/CompositeException.php @@ -0,0 +1,32 @@ +throwables = $throwables; + } + + /** + * @return \Throwable[] + */ + public function getThrowables(): array + { + return $this->throwables; + } +} diff --git a/app/vendor/react/promise/src/ExtendedPromiseInterface.php b/app/vendor/react/promise/src/ExtendedPromiseInterface.php deleted file mode 100644 index 13b636917..000000000 --- a/app/vendor/react/promise/src/ExtendedPromiseInterface.php +++ /dev/null @@ -1,98 +0,0 @@ -then(null, $onRejected); - * ``` - * - * Additionally, you can type hint the `$reason` argument of `$onRejected` to catch - * only specific errors. - * - * @param callable $onRejected - * @return ExtendedPromiseInterface - */ - public function otherwise(callable $onRejected); - - /** - * Allows you to execute "cleanup" type tasks in a promise chain. - * - * It arranges for `$onFulfilledOrRejected` to be called, with no arguments, - * when the promise is either fulfilled or rejected. - * - * * If `$promise` fulfills, and `$onFulfilledOrRejected` returns successfully, - * `$newPromise` will fulfill with the same value as `$promise`. - * * If `$promise` fulfills, and `$onFulfilledOrRejected` throws or returns a - * rejected promise, `$newPromise` will reject with the thrown exception or - * rejected promise's reason. - * * If `$promise` rejects, and `$onFulfilledOrRejected` returns successfully, - * `$newPromise` will reject with the same reason as `$promise`. - * * If `$promise` rejects, and `$onFulfilledOrRejected` throws or returns a - * rejected promise, `$newPromise` will reject with the thrown exception or - * rejected promise's reason. - * - * `always()` behaves similarly to the synchronous finally statement. When combined - * with `otherwise()`, `always()` allows you to write code that is similar to the familiar - * synchronous catch/finally pair. - * - * Consider the following synchronous code: - * - * ```php - * try { - * return doSomething(); - * } catch(\Exception $e) { - * return handleError($e); - * } finally { - * cleanup(); - * } - * ``` - * - * Similar asynchronous code (with `doSomething()` that returns a promise) can be - * written: - * - * ```php - * return doSomething() - * ->otherwise('handleError') - * ->always('cleanup'); - * ``` - * - * @param callable $onFulfilledOrRejected - * @return ExtendedPromiseInterface - */ - public function always(callable $onFulfilledOrRejected); - - /** - * Registers a handler for progress updates from promise. It is a shortcut for: - * - * ```php - * $promise->then(null, null, $onProgress); - * ``` - * - * @param callable $onProgress - * @return ExtendedPromiseInterface - * @deprecated 2.6.0 Progress support is deprecated and should not be used anymore. - */ - public function progress(callable $onProgress); -} diff --git a/app/vendor/react/promise/src/FulfilledPromise.php b/app/vendor/react/promise/src/FulfilledPromise.php deleted file mode 100644 index 147275277..000000000 --- a/app/vendor/react/promise/src/FulfilledPromise.php +++ /dev/null @@ -1,71 +0,0 @@ -value = $value; - } - - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - if (null === $onFulfilled) { - return $this; - } - - try { - return resolve($onFulfilled($this->value)); - } catch (\Throwable $exception) { - return new RejectedPromise($exception); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } - - public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - if (null === $onFulfilled) { - return; - } - - $result = $onFulfilled($this->value); - - if ($result instanceof ExtendedPromiseInterface) { - $result->done(); - } - } - - public function otherwise(callable $onRejected) - { - return $this; - } - - public function always(callable $onFulfilledOrRejected) - { - return $this->then(function ($value) use ($onFulfilledOrRejected) { - return resolve($onFulfilledOrRejected())->then(function () use ($value) { - return $value; - }); - }); - } - - public function progress(callable $onProgress) - { - return $this; - } - - public function cancel() - { - } -} diff --git a/app/vendor/react/promise/src/CancellationQueue.php b/app/vendor/react/promise/src/Internal/CancellationQueue.php similarity index 66% rename from app/vendor/react/promise/src/CancellationQueue.php rename to app/vendor/react/promise/src/Internal/CancellationQueue.php index a381e9780..604b19c85 100644 --- a/app/vendor/react/promise/src/CancellationQueue.php +++ b/app/vendor/react/promise/src/Internal/CancellationQueue.php @@ -1,13 +1,19 @@ started) { return; @@ -17,7 +23,10 @@ public function __invoke() $this->drain(); } - public function enqueue($cancellable) + /** + * @param mixed $cancellable + */ + public function enqueue($cancellable): void { if (!\is_object($cancellable) || !\method_exists($cancellable, 'then') || !\method_exists($cancellable, 'cancel')) { return; @@ -30,17 +39,17 @@ public function enqueue($cancellable) } } - private function drain() + private function drain(): void { - for ($i = key($this->queue); isset($this->queue[$i]); $i++) { + for ($i = \key($this->queue); isset($this->queue[$i]); $i++) { $cancellable = $this->queue[$i]; + assert(\method_exists($cancellable, 'cancel')); $exception = null; try { $cancellable->cancel(); } catch (\Throwable $exception) { - } catch (\Exception $exception) { } unset($this->queue[$i]); diff --git a/app/vendor/react/promise/src/Internal/FulfilledPromise.php b/app/vendor/react/promise/src/Internal/FulfilledPromise.php new file mode 100644 index 000000000..3c02b4343 --- /dev/null +++ b/app/vendor/react/promise/src/Internal/FulfilledPromise.php @@ -0,0 +1,89 @@ + + */ +final class FulfilledPromise implements PromiseInterface +{ + /** @var T */ + private $value; + + /** + * @param T $value + * @throws \InvalidArgumentException + */ + public function __construct($value = null) + { + if ($value instanceof PromiseInterface) { + throw new \InvalidArgumentException('You cannot create React\Promise\FulfilledPromise with a promise. Use React\Promise\resolve($promiseOrValue) instead.'); + } + + $this->value = $value; + } + + /** + * @template TFulfilled + * @param ?(callable((T is void ? null : T)): (PromiseInterface|TFulfilled)) $onFulfilled + * @return PromiseInterface<($onFulfilled is null ? T : TFulfilled)> + */ + public function then(callable $onFulfilled = null, callable $onRejected = null): PromiseInterface + { + if (null === $onFulfilled) { + return $this; + } + + try { + /** + * @var PromiseInterface|T $result + */ + $result = $onFulfilled($this->value); + return resolve($result); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); + } + } + + public function catch(callable $onRejected): PromiseInterface + { + return $this; + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->then(function ($value) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($value) { + return $value; + }); + }); + } + + public function cancel(): void + { + } + + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->catch($onRejected); + } + + /** + * @deprecated 3.0.0 Use `finally()` instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } +} diff --git a/app/vendor/react/promise/src/Internal/RejectedPromise.php b/app/vendor/react/promise/src/Internal/RejectedPromise.php new file mode 100644 index 000000000..348ca6d22 --- /dev/null +++ b/app/vendor/react/promise/src/Internal/RejectedPromise.php @@ -0,0 +1,128 @@ + + */ +final class RejectedPromise implements PromiseInterface +{ + /** @var \Throwable */ + private $reason; + + /** @var bool */ + private $handled = false; + + /** + * @param \Throwable $reason + */ + public function __construct(\Throwable $reason) + { + $this->reason = $reason; + } + + /** @throws void */ + public function __destruct() + { + if ($this->handled) { + return; + } + + $handler = set_rejection_handler(null); + if ($handler === null) { + $message = 'Unhandled promise rejection with ' . \get_class($this->reason) . ': ' . $this->reason->getMessage() . ' in ' . $this->reason->getFile() . ':' . $this->reason->getLine() . PHP_EOL; + $message .= 'Stack trace:' . PHP_EOL . $this->reason->getTraceAsString(); + + \error_log($message); + return; + } + + try { + $handler($this->reason); + } catch (\Throwable $e) { + $message = 'Fatal error: Uncaught ' . \get_class($e) . ' from unhandled promise rejection handler: ' . $e->getMessage() . ' in ' . $e->getFile() . ':' . $e->getLine() . PHP_EOL; + $message .= 'Stack trace:' . PHP_EOL . $e->getTraceAsString(); + + \error_log($message); + exit(255); + } + } + + /** + * @template TRejected + * @param ?callable $onFulfilled + * @param ?(callable(\Throwable): (PromiseInterface|TRejected)) $onRejected + * @return PromiseInterface<($onRejected is null ? never : TRejected)> + */ + public function then(callable $onFulfilled = null, callable $onRejected = null): PromiseInterface + { + if (null === $onRejected) { + return $this; + } + + $this->handled = true; + + try { + return resolve($onRejected($this->reason)); + } catch (\Throwable $exception) { + return new RejectedPromise($exception); + } + } + + /** + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface + { + if (!_checkTypehint($onRejected, $this->reason)) { + return $this; + } + + /** + * @var callable(\Throwable):(PromiseInterface|TRejected) $onRejected + */ + return $this->then(null, $onRejected); + } + + public function finally(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->then(null, function (\Throwable $reason) use ($onFulfilledOrRejected): PromiseInterface { + return resolve($onFulfilledOrRejected())->then(function () use ($reason): PromiseInterface { + return new RejectedPromise($reason); + }); + }); + } + + public function cancel(): void + { + $this->handled = true; + } + + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface + { + return $this->catch($onRejected); + } + + /** + * @deprecated 3.0.0 Use `always()` instead + * @see self::always() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } +} diff --git a/app/vendor/react/promise/src/LazyPromise.php b/app/vendor/react/promise/src/LazyPromise.php deleted file mode 100644 index bbe9293e1..000000000 --- a/app/vendor/react/promise/src/LazyPromise.php +++ /dev/null @@ -1,66 +0,0 @@ -factory = $factory; - } - - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - return $this->promise()->then($onFulfilled, $onRejected, $onProgress); - } - - public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - return $this->promise()->done($onFulfilled, $onRejected, $onProgress); - } - - public function otherwise(callable $onRejected) - { - return $this->promise()->otherwise($onRejected); - } - - public function always(callable $onFulfilledOrRejected) - { - return $this->promise()->always($onFulfilledOrRejected); - } - - public function progress(callable $onProgress) - { - return $this->promise()->progress($onProgress); - } - - public function cancel() - { - return $this->promise()->cancel(); - } - - /** - * @internal - * @see Promise::settle() - */ - public function promise() - { - if (null === $this->promise) { - try { - $this->promise = resolve(\call_user_func($this->factory)); - } catch (\Throwable $exception) { - $this->promise = new RejectedPromise($exception); - } catch (\Exception $exception) { - $this->promise = new RejectedPromise($exception); - } - } - - return $this->promise; - } -} diff --git a/app/vendor/react/promise/src/Promise.php b/app/vendor/react/promise/src/Promise.php index 33759e6fe..1613db510 100644 --- a/app/vendor/react/promise/src/Promise.php +++ b/app/vendor/react/promise/src/Promise.php @@ -2,16 +2,28 @@ namespace React\Promise; -class Promise implements ExtendedPromiseInterface, CancellablePromiseInterface +use React\Promise\Internal\RejectedPromise; + +/** + * @template T + * @template-implements PromiseInterface + */ +final class Promise implements PromiseInterface { + /** @var ?callable */ private $canceller; + + /** @var ?PromiseInterface */ private $result; + /** @var callable[] */ private $handlers = []; - private $progressHandlers = []; + /** @var int */ private $requiredCancelRequests = 0; - private $cancelRequests = 0; + + /** @var bool */ + private $cancelled = false; public function __construct(callable $resolver, callable $canceller = null) { @@ -25,14 +37,14 @@ public function __construct(callable $resolver, callable $canceller = null) $this->call($cb); } - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) + public function then(callable $onFulfilled = null, callable $onRejected = null): PromiseInterface { if (null !== $this->result) { - return $this->result->then($onFulfilled, $onRejected, $onProgress); + return $this->result->then($onFulfilled, $onRejected); } if (null === $this->canceller) { - return new static($this->resolver($onFulfilled, $onRejected, $onProgress)); + return new static($this->resolver($onFulfilled, $onRejected)); } // This promise has a canceller, so we create a new child promise which @@ -44,9 +56,12 @@ public function then(callable $onFulfilled = null, callable $onRejected = null, ++$parent->requiredCancelRequests; return new static( - $this->resolver($onFulfilled, $onRejected, $onProgress), + $this->resolver($onFulfilled, $onRejected), static function () use (&$parent) { - if (++$parent->cancelRequests >= $parent->requiredCancelRequests) { + assert($parent instanceof self); + --$parent->requiredCancelRequests; + + if ($parent->requiredCancelRequests <= 0) { $parent->cancel(); } @@ -55,34 +70,27 @@ static function () use (&$parent) { ); } - public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - if (null !== $this->result) { - return $this->result->done($onFulfilled, $onRejected, $onProgress); - } - - $this->handlers[] = static function (ExtendedPromiseInterface $promise) use ($onFulfilled, $onRejected) { - $promise - ->done($onFulfilled, $onRejected); - }; - - if ($onProgress) { - $this->progressHandlers[] = $onProgress; - } - } - - public function otherwise(callable $onRejected) + /** + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface { return $this->then(null, static function ($reason) use ($onRejected) { if (!_checkTypehint($onRejected, $reason)) { return new RejectedPromise($reason); } + /** + * @var callable(\Throwable):(PromiseInterface|TRejected) $onRejected + */ return $onRejected($reason); }); } - public function always(callable $onFulfilledOrRejected) + public function finally(callable $onFulfilledOrRejected): PromiseInterface { return $this->then(static function ($value) use ($onFulfilledOrRejected) { return resolve($onFulfilledOrRejected())->then(function () use ($value) { @@ -95,51 +103,83 @@ public function always(callable $onFulfilledOrRejected) }); } - public function progress(callable $onProgress) + public function cancel(): void { - return $this->then(null, null, $onProgress); - } + $this->cancelled = true; + $canceller = $this->canceller; + $this->canceller = null; - public function cancel() - { - if (null === $this->canceller || null !== $this->result) { - return; + $parentCanceller = null; + + if (null !== $this->result) { + // Forward cancellation to rejected promise to avoid reporting unhandled rejection + if ($this->result instanceof RejectedPromise) { + $this->result->cancel(); + } + + // Go up the promise chain and reach the top most promise which is + // itself not following another promise + $root = $this->unwrap($this->result); + + // Return if the root promise is already resolved or a + // FulfilledPromise or RejectedPromise + if (!$root instanceof self || null !== $root->result) { + return; + } + + $root->requiredCancelRequests--; + + if ($root->requiredCancelRequests <= 0) { + $parentCanceller = [$root, 'cancel']; + } } - $canceller = $this->canceller; - $this->canceller = null; + if (null !== $canceller) { + $this->call($canceller); + } - $this->call($canceller); + // For BC, we call the parent canceller after our own canceller + if ($parentCanceller) { + $parentCanceller(); + } } - private function resolver(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) + /** + * @deprecated 3.0.0 Use `catch()` instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface { - return function ($resolve, $reject, $notify) use ($onFulfilled, $onRejected, $onProgress) { - if ($onProgress) { - $progressHandler = static function ($update) use ($notify, $onProgress) { - try { - $notify($onProgress($update)); - } catch (\Throwable $e) { - $notify($e); - } catch (\Exception $e) { - $notify($e); - } - }; - } else { - $progressHandler = $notify; - } + return $this->catch($onRejected); + } - $this->handlers[] = static function (ExtendedPromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject, $progressHandler) { - $promise - ->then($onFulfilled, $onRejected) - ->done($resolve, $reject, $progressHandler); - }; + /** + * @deprecated 3.0.0 Use `finally()` instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface + { + return $this->finally($onFulfilledOrRejected); + } - $this->progressHandlers[] = $progressHandler; + private function resolver(callable $onFulfilled = null, callable $onRejected = null): callable + { + return function ($resolve, $reject) use ($onFulfilled, $onRejected) { + $this->handlers[] = static function (PromiseInterface $promise) use ($onFulfilled, $onRejected, $resolve, $reject) { + $promise = $promise->then($onFulfilled, $onRejected); + + if ($promise instanceof self && $promise->result === null) { + $promise->handlers[] = static function (PromiseInterface $promise) use ($resolve, $reject) { + $promise->then($resolve, $reject); + }; + } else { + $promise->then($resolve, $reject); + } + }; }; } - private function reject($reason = null) + private function reject(\Throwable $reason): void { if (null !== $this->result) { return; @@ -148,48 +188,56 @@ private function reject($reason = null) $this->settle(reject($reason)); } - private function settle(ExtendedPromiseInterface $promise) + /** + * @param PromiseInterface $result + */ + private function settle(PromiseInterface $result): void { - $promise = $this->unwrap($promise); + $result = $this->unwrap($result); - if ($promise === $this) { - $promise = new RejectedPromise( + if ($result === $this) { + $result = new RejectedPromise( new \LogicException('Cannot resolve a promise with itself.') ); } + if ($result instanceof self) { + $result->requiredCancelRequests++; + } else { + // Unset canceller only when not following a pending promise + $this->canceller = null; + } + $handlers = $this->handlers; - $this->progressHandlers = $this->handlers = []; - $this->result = $promise; - $this->canceller = null; + $this->handlers = []; + $this->result = $result; foreach ($handlers as $handler) { - $handler($promise); + $handler($result); } - } - private function unwrap($promise) - { - $promise = $this->extract($promise); - - while ($promise instanceof self && null !== $promise->result) { - $promise = $this->extract($promise->result); + // Forward cancellation to rejected promise to avoid reporting unhandled rejection + if ($this->cancelled && $result instanceof RejectedPromise) { + $result->cancel(); } - - return $promise; } - private function extract($promise) + /** + * @param PromiseInterface $promise + * @return PromiseInterface + */ + private function unwrap(PromiseInterface $promise): PromiseInterface { - if ($promise instanceof LazyPromise) { - $promise = $promise->promise(); + while ($promise instanceof self && null !== $promise->result) { + /** @var PromiseInterface $promise */ + $promise = $promise->result; } return $promise; } - private function call(callable $cb) + private function call(callable $cb): void { // Explicitly overwrite argument with null value. This ensure that this // argument does not show up in the stack trace in PHP 7+ only. @@ -206,6 +254,7 @@ private function call(callable $cb) } elseif (\is_object($callback) && !$callback instanceof \Closure) { $ref = new \ReflectionMethod($callback, '__invoke'); } else { + assert($callback instanceof \Closure || \is_string($callback)); $ref = new \ReflectionFunction($callback); } $args = $ref->getNumberOfParameters(); @@ -223,34 +272,25 @@ private function call(callable $cb) // These assumptions are covered by the test suite, so if you ever feel like // refactoring this, go ahead, any alternative suggestions are welcome! $target =& $this; - $progressHandlers =& $this->progressHandlers; $callback( - static function ($value = null) use (&$target) { + static function ($value) use (&$target) { if ($target !== null) { $target->settle(resolve($value)); $target = null; } }, - static function ($reason = null) use (&$target) { + static function (\Throwable $reason) use (&$target) { if ($target !== null) { $target->reject($reason); $target = null; } - }, - static function ($update = null) use (&$progressHandlers) { - foreach ($progressHandlers as $handler) { - $handler($update); - } } ); } } catch (\Throwable $e) { $target = null; $this->reject($e); - } catch (\Exception $e) { - $target = null; - $this->reject($e); } } } diff --git a/app/vendor/react/promise/src/PromiseInterface.php b/app/vendor/react/promise/src/PromiseInterface.php index edcb00770..5869f76b6 100644 --- a/app/vendor/react/promise/src/PromiseInterface.php +++ b/app/vendor/react/promise/src/PromiseInterface.php @@ -2,6 +2,9 @@ namespace React\Promise; +/** + * @template-covariant T + */ interface PromiseInterface { /** @@ -15,9 +18,6 @@ interface PromiseInterface * the result as the first argument. * * `$onRejected` will be invoked once the promise is rejected and passed the * reason as the first argument. - * * `$onProgress` (deprecated) will be invoked whenever the producer of the promise - * triggers progress notifications and passed a single argument (whatever it - * wants) to indicate progress. * * It returns a new promise that will fulfill with the return value of either * `$onFulfilled` or `$onRejected`, whichever is called, or will reject with @@ -30,12 +30,123 @@ interface PromiseInterface * never both. * 2. `$onFulfilled` and `$onRejected` will never be called more * than once. - * 3. `$onProgress` (deprecated) may be called multiple times. * - * @param callable|null $onFulfilled - * @param callable|null $onRejected - * @param callable|null $onProgress This argument is deprecated and should not be used anymore. - * @return PromiseInterface + * @template TFulfilled + * @template TRejected + * @param ?(callable((T is void ? null : T)): (PromiseInterface|TFulfilled)) $onFulfilled + * @param ?(callable(\Throwable): (PromiseInterface|TRejected)) $onRejected + * @return PromiseInterface<($onRejected is null ? ($onFulfilled is null ? T : TFulfilled) : ($onFulfilled is null ? T|TRejected : TFulfilled|TRejected))> */ - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null); + public function then(?callable $onFulfilled = null, ?callable $onRejected = null): PromiseInterface; + + /** + * Registers a rejection handler for promise. It is a shortcut for: + * + * ```php + * $promise->then(null, $onRejected); + * ``` + * + * Additionally, you can type hint the `$reason` argument of `$onRejected` to catch + * only specific errors. + * + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + */ + public function catch(callable $onRejected): PromiseInterface; + + /** + * Allows you to execute "cleanup" type tasks in a promise chain. + * + * It arranges for `$onFulfilledOrRejected` to be called, with no arguments, + * when the promise is either fulfilled or rejected. + * + * * If `$promise` fulfills, and `$onFulfilledOrRejected` returns successfully, + * `$newPromise` will fulfill with the same value as `$promise`. + * * If `$promise` fulfills, and `$onFulfilledOrRejected` throws or returns a + * rejected promise, `$newPromise` will reject with the thrown exception or + * rejected promise's reason. + * * If `$promise` rejects, and `$onFulfilledOrRejected` returns successfully, + * `$newPromise` will reject with the same reason as `$promise`. + * * If `$promise` rejects, and `$onFulfilledOrRejected` throws or returns a + * rejected promise, `$newPromise` will reject with the thrown exception or + * rejected promise's reason. + * + * `finally()` behaves similarly to the synchronous finally statement. When combined + * with `catch()`, `finally()` allows you to write code that is similar to the familiar + * synchronous catch/finally pair. + * + * Consider the following synchronous code: + * + * ```php + * try { + * return doSomething(); + * } catch(\Exception $e) { + * return handleError($e); + * } finally { + * cleanup(); + * } + * ``` + * + * Similar asynchronous code (with `doSomething()` that returns a promise) can be + * written: + * + * ```php + * return doSomething() + * ->catch('handleError') + * ->finally('cleanup'); + * ``` + * + * @param callable(): (void|PromiseInterface) $onFulfilledOrRejected + * @return PromiseInterface + */ + public function finally(callable $onFulfilledOrRejected): PromiseInterface; + + /** + * The `cancel()` method notifies the creator of the promise that there is no + * further interest in the results of the operation. + * + * Once a promise is settled (either fulfilled or rejected), calling `cancel()` on + * a promise has no effect. + * + * @return void + */ + public function cancel(): void; + + /** + * [Deprecated] Registers a rejection handler for a promise. + * + * This method continues to exist only for BC reasons and to ease upgrading + * between versions. It is an alias for: + * + * ```php + * $promise->catch($onRejected); + * ``` + * + * @template TThrowable of \Throwable + * @template TRejected + * @param callable(TThrowable): (PromiseInterface|TRejected) $onRejected + * @return PromiseInterface + * @deprecated 3.0.0 Use catch() instead + * @see self::catch() + */ + public function otherwise(callable $onRejected): PromiseInterface; + + /** + * [Deprecated] Allows you to execute "cleanup" type tasks in a promise chain. + * + * This method continues to exist only for BC reasons and to ease upgrading + * between versions. It is an alias for: + * + * ```php + * $promise->finally($onFulfilledOrRejected); + * ``` + * + * @param callable(): (void|PromiseInterface) $onFulfilledOrRejected + * @return PromiseInterface + * @deprecated 3.0.0 Use finally() instead + * @see self::finally() + */ + public function always(callable $onFulfilledOrRejected): PromiseInterface; } diff --git a/app/vendor/react/promise/src/PromisorInterface.php b/app/vendor/react/promise/src/PromisorInterface.php deleted file mode 100644 index bd6440086..000000000 --- a/app/vendor/react/promise/src/PromisorInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -reason = $reason; - } - - public function then(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - if (null === $onRejected) { - return $this; - } - - try { - return resolve($onRejected($this->reason)); - } catch (\Throwable $exception) { - return new RejectedPromise($exception); - } catch (\Exception $exception) { - return new RejectedPromise($exception); - } - } - - public function done(callable $onFulfilled = null, callable $onRejected = null, callable $onProgress = null) - { - if (null === $onRejected) { - throw UnhandledRejectionException::resolve($this->reason); - } - - $result = $onRejected($this->reason); - - if ($result instanceof self) { - throw UnhandledRejectionException::resolve($result->reason); - } - - if ($result instanceof ExtendedPromiseInterface) { - $result->done(); - } - } - - public function otherwise(callable $onRejected) - { - if (!_checkTypehint($onRejected, $this->reason)) { - return $this; - } - - return $this->then(null, $onRejected); - } - - public function always(callable $onFulfilledOrRejected) - { - return $this->then(null, function ($reason) use ($onFulfilledOrRejected) { - return resolve($onFulfilledOrRejected())->then(function () use ($reason) { - return new RejectedPromise($reason); - }); - }); - } - - public function progress(callable $onProgress) - { - return $this; - } - - public function cancel() - { - } -} diff --git a/app/vendor/react/promise/src/UnhandledRejectionException.php b/app/vendor/react/promise/src/UnhandledRejectionException.php deleted file mode 100644 index e7fe2f7a8..000000000 --- a/app/vendor/react/promise/src/UnhandledRejectionException.php +++ /dev/null @@ -1,31 +0,0 @@ -reason = $reason; - - $message = \sprintf('Unhandled Rejection: %s', \json_encode($reason)); - - parent::__construct($message, 0); - } - - public function getReason() - { - return $this->reason; - } -} diff --git a/app/vendor/react/promise/src/functions.php b/app/vendor/react/promise/src/functions.php index 429f0e733..ac3a66c1e 100644 --- a/app/vendor/react/promise/src/functions.php +++ b/app/vendor/react/promise/src/functions.php @@ -2,6 +2,10 @@ namespace React\Promise; +use React\Promise\Exception\CompositeException; +use React\Promise\Internal\FulfilledPromise; +use React\Promise\Internal\RejectedPromise; + /** * Creates a promise for the supplied `$promiseOrValue`. * @@ -13,26 +17,26 @@ * * If `$promiseOrValue` is a promise, it will be returned as is. * - * @param mixed $promiseOrValue - * @return PromiseInterface + * @template T + * @param PromiseInterface|T $promiseOrValue + * @return PromiseInterface */ -function resolve($promiseOrValue = null) +function resolve($promiseOrValue): PromiseInterface { - if ($promiseOrValue instanceof ExtendedPromiseInterface) { + if ($promiseOrValue instanceof PromiseInterface) { return $promiseOrValue; } - // Check is_object() first to avoid method_exists() triggering - // class autoloaders if $promiseOrValue is a string. if (\is_object($promiseOrValue) && \method_exists($promiseOrValue, 'then')) { $canceller = null; if (\method_exists($promiseOrValue, 'cancel')) { $canceller = [$promiseOrValue, 'cancel']; + assert(\is_callable($canceller)); } - return new Promise(function ($resolve, $reject, $notify) use ($promiseOrValue) { - $promiseOrValue->then($resolve, $reject, $notify); + return new Promise(function ($resolve, $reject) use ($promiseOrValue): void { + $promiseOrValue->then($resolve, $reject); }, $canceller); } @@ -40,30 +44,23 @@ function resolve($promiseOrValue = null) } /** - * Creates a rejected promise for the supplied `$promiseOrValue`. + * Creates a rejected promise for the supplied `$reason`. * - * If `$promiseOrValue` is a value, it will be the rejection value of the + * If `$reason` is a value, it will be the rejection value of the * returned promise. * - * If `$promiseOrValue` is a promise, its completion value will be the rejected + * If `$reason` is a promise, its completion value will be the rejected * value of the returned promise. * * This can be useful in situations where you need to reject a promise without * throwing an exception. For example, it allows you to propagate a rejection with * the value of another promise. * - * @param mixed $promiseOrValue - * @return PromiseInterface + * @return PromiseInterface */ -function reject($promiseOrValue = null) +function reject(\Throwable $reason): PromiseInterface { - if ($promiseOrValue instanceof PromiseInterface) { - return resolve($promiseOrValue)->then(function ($value) { - return new RejectedPromise($value); - }); - } - - return new RejectedPromise($promiseOrValue); + return new RejectedPromise($reason); } /** @@ -72,14 +69,49 @@ function reject($promiseOrValue = null) * will be an array containing the resolution values of each of the items in * `$promisesOrValues`. * - * @param array $promisesOrValues - * @return PromiseInterface + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface> */ -function all($promisesOrValues) +function all(iterable $promisesOrValues): PromiseInterface { - return map($promisesOrValues, function ($val) { - return $val; - }); + $cancellationQueue = new Internal\CancellationQueue(); + + return new Promise(function ($resolve, $reject) use ($promisesOrValues, $cancellationQueue): void { + $toResolve = 0; + /** @var bool */ + $continue = true; + $values = []; + + foreach ($promisesOrValues as $i => $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + $values[$i] = null; + ++$toResolve; + + resolve($promiseOrValue)->then( + function ($value) use ($i, &$values, &$toResolve, &$continue, $resolve): void { + $values[$i] = $value; + + if (0 === --$toResolve && !$continue) { + $resolve($values); + } + }, + function (\Throwable $reason) use (&$continue, $reject): void { + $continue = false; + $reject($reason); + } + ); + + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } + + $continue = false; + if ($toResolve === 0) { + $resolve($values); + } + }, $cancellationQueue); } /** @@ -89,29 +121,28 @@ function all($promisesOrValues) * The returned promise will become **infinitely pending** if `$promisesOrValues` * contains 0 items. * - * @param array $promisesOrValues - * @return PromiseInterface + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface */ -function race($promisesOrValues) +function race(iterable $promisesOrValues): PromiseInterface { - $cancellationQueue = new CancellationQueue(); - $cancellationQueue->enqueue($promisesOrValues); - - return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $cancellationQueue) { - resolve($promisesOrValues) - ->done(function ($array) use ($cancellationQueue, $resolve, $reject, $notify) { - if (!is_array($array) || !$array) { - $resolve(); - return; - } + $cancellationQueue = new Internal\CancellationQueue(); - foreach ($array as $promiseOrValue) { - $cancellationQueue->enqueue($promiseOrValue); + return new Promise(function (callable $resolve, callable $reject) use ($promisesOrValues, $cancellationQueue): void { + $continue = true; - resolve($promiseOrValue) - ->done($resolve, $reject, $notify); - } - }, $reject, $notify); + foreach ($promisesOrValues as $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + + resolve($promiseOrValue)->then($resolve, $reject)->finally(function () use (&$continue): void { + $continue = false; + }); + + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } }, $cancellationQueue); } @@ -126,212 +157,117 @@ function race($promisesOrValues) * The returned promise will also reject with a `React\Promise\Exception\LengthException` * if `$promisesOrValues` contains 0 items. * - * @param array $promisesOrValues - * @return PromiseInterface + * @template T + * @param iterable|T> $promisesOrValues + * @return PromiseInterface */ -function any($promisesOrValues) +function any(iterable $promisesOrValues): PromiseInterface { - return some($promisesOrValues, 1) - ->then(function ($val) { - return \array_shift($val); - }); -} - -/** - * Returns a promise that will resolve when `$howMany` of the supplied items in - * `$promisesOrValues` resolve. The resolution value of the returned promise - * will be an array of length `$howMany` containing the resolution values of the - * triggering items. - * - * The returned promise will reject if it becomes impossible for `$howMany` items - * to resolve (that is, when `(count($promisesOrValues) - $howMany) + 1` items - * reject). The rejection value will be an array of - * `(count($promisesOrValues) - $howMany) + 1` rejection reasons. - * - * The returned promise will also reject with a `React\Promise\Exception\LengthException` - * if `$promisesOrValues` contains less items than `$howMany`. - * - * @param array $promisesOrValues - * @param int $howMany - * @return PromiseInterface - */ -function some($promisesOrValues, $howMany) -{ - $cancellationQueue = new CancellationQueue(); - $cancellationQueue->enqueue($promisesOrValues); - - return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $howMany, $cancellationQueue) { - resolve($promisesOrValues) - ->done(function ($array) use ($howMany, $cancellationQueue, $resolve, $reject, $notify) { - if (!\is_array($array) || $howMany < 1) { - $resolve([]); - return; - } - - $len = \count($array); - - if ($len < $howMany) { - throw new Exception\LengthException( - \sprintf( - 'Input array must contain at least %d item%s but contains only %s item%s.', - $howMany, - 1 === $howMany ? '' : 's', - $len, - 1 === $len ? '' : 's' - ) - ); + $cancellationQueue = new Internal\CancellationQueue(); + + return new Promise(function ($resolve, $reject) use ($promisesOrValues, $cancellationQueue): void { + $toReject = 0; + $continue = true; + $reasons = []; + + foreach ($promisesOrValues as $i => $promiseOrValue) { + $cancellationQueue->enqueue($promiseOrValue); + ++$toReject; + + resolve($promiseOrValue)->then( + function ($value) use ($resolve, &$continue): void { + $continue = false; + $resolve($value); + }, + function (\Throwable $reason) use ($i, &$reasons, &$toReject, $reject, &$continue): void { + $reasons[$i] = $reason; + + if (0 === --$toReject && !$continue) { + $reject(new CompositeException( + $reasons, + 'All promises rejected.' + )); + } } + ); - $toResolve = $howMany; - $toReject = ($len - $toResolve) + 1; - $values = []; - $reasons = []; - - foreach ($array as $i => $promiseOrValue) { - $fulfiller = function ($val) use ($i, &$values, &$toResolve, $toReject, $resolve) { - if ($toResolve < 1 || $toReject < 1) { - return; - } - - $values[$i] = $val; - - if (0 === --$toResolve) { - $resolve($values); - } - }; - - $rejecter = function ($reason) use ($i, &$reasons, &$toReject, $toResolve, $reject) { - if ($toResolve < 1 || $toReject < 1) { - return; - } - - $reasons[$i] = $reason; - - if (0 === --$toReject) { - $reject($reasons); - } - }; - - $cancellationQueue->enqueue($promiseOrValue); + if (!$continue && !\is_array($promisesOrValues)) { + break; + } + } - resolve($promiseOrValue) - ->done($fulfiller, $rejecter, $notify); - } - }, $reject, $notify); + $continue = false; + if ($toReject === 0 && !$reasons) { + $reject(new Exception\LengthException( + 'Must contain at least 1 item but contains only 0 items.' + )); + } elseif ($toReject === 0) { + $reject(new CompositeException( + $reasons, + 'All promises rejected.' + )); + } }, $cancellationQueue); } /** - * Traditional map function, similar to `array_map()`, but allows input to contain - * promises and/or values, and `$mapFunc` may return either a value or a promise. + * Sets the global rejection handler for unhandled promise rejections. * - * The map function receives each item as argument, where item is a fully resolved - * value of a promise or value in `$promisesOrValues`. + * Note that rejected promises should always be handled similar to how any + * exceptions should always be caught in a `try` + `catch` block. If you remove + * the last reference to a rejected promise that has not been handled, it will + * report an unhandled promise rejection. See also the [`reject()` function](#reject) + * for more details. * - * @param array $promisesOrValues - * @param callable $mapFunc - * @return PromiseInterface - */ -function map($promisesOrValues, callable $mapFunc) -{ - $cancellationQueue = new CancellationQueue(); - $cancellationQueue->enqueue($promisesOrValues); - - return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $mapFunc, $cancellationQueue) { - resolve($promisesOrValues) - ->done(function ($array) use ($mapFunc, $cancellationQueue, $resolve, $reject, $notify) { - if (!\is_array($array) || !$array) { - $resolve([]); - return; - } - - $toResolve = \count($array); - $values = []; - - foreach ($array as $i => $promiseOrValue) { - $cancellationQueue->enqueue($promiseOrValue); - $values[$i] = null; - - resolve($promiseOrValue) - ->then($mapFunc) - ->done( - function ($mapped) use ($i, &$values, &$toResolve, $resolve) { - $values[$i] = $mapped; - - if (0 === --$toResolve) { - $resolve($values); - } - }, - $reject, - $notify - ); - } - }, $reject, $notify); - }, $cancellationQueue); -} - -/** - * Traditional reduce function, similar to `array_reduce()`, but input may contain - * promises and/or values, and `$reduceFunc` may return either a value or a - * promise, *and* `$initialValue` may be a promise or a value for the starting - * value. + * The `?callable $callback` argument MUST be a valid callback function that + * accepts a single `Throwable` argument or a `null` value to restore the + * default promise rejection handler. The return value of the callback function + * will be ignored and has no effect, so you SHOULD return a `void` value. The + * callback function MUST NOT throw or the program will be terminated with a + * fatal error. + * + * The function returns the previous rejection handler or `null` if using the + * default promise rejection handler. + * + * The default promise rejection handler will log an error message plus its + * stack trace: * - * @param array $promisesOrValues - * @param callable $reduceFunc - * @param mixed $initialValue - * @return PromiseInterface + * ```php + * // Unhandled promise rejection with RuntimeException: Unhandled in example.php:2 + * React\Promise\reject(new RuntimeException('Unhandled')); + * ``` + * + * The promise rejection handler may be used to use customize the log message or + * write to custom log targets. As a rule of thumb, this function should only be + * used as a last resort and promise rejections are best handled with either the + * [`then()` method](#promiseinterfacethen), the + * [`catch()` method](#promiseinterfacecatch), or the + * [`finally()` method](#promiseinterfacefinally). + * See also the [`reject()` function](#reject) for more details. + * + * @param callable(\Throwable):void|null $callback + * @return callable(\Throwable):void|null */ -function reduce($promisesOrValues, callable $reduceFunc, $initialValue = null) +function set_rejection_handler(?callable $callback): ?callable { - $cancellationQueue = new CancellationQueue(); - $cancellationQueue->enqueue($promisesOrValues); - - return new Promise(function ($resolve, $reject, $notify) use ($promisesOrValues, $reduceFunc, $initialValue, $cancellationQueue) { - resolve($promisesOrValues) - ->done(function ($array) use ($reduceFunc, $initialValue, $cancellationQueue, $resolve, $reject, $notify) { - if (!\is_array($array)) { - $array = []; - } - - $total = \count($array); - $i = 0; + static $current = null; + $previous = $current; + $current = $callback; - // Wrap the supplied $reduceFunc with one that handles promises and then - // delegates to the supplied. - $wrappedReduceFunc = function ($current, $val) use ($reduceFunc, $cancellationQueue, $total, &$i) { - $cancellationQueue->enqueue($val); - - return $current - ->then(function ($c) use ($reduceFunc, $total, &$i, $val) { - return resolve($val) - ->then(function ($value) use ($reduceFunc, $total, &$i, $c) { - return $reduceFunc($c, $value, $i++, $total); - }); - }); - }; - - $cancellationQueue->enqueue($initialValue); - - \array_reduce($array, $wrappedReduceFunc, resolve($initialValue)) - ->done($resolve, $reject, $notify); - }, $reject, $notify); - }, $cancellationQueue); + return $previous; } /** * @internal */ -function _checkTypehint(callable $callback, $object) +function _checkTypehint(callable $callback, \Throwable $reason): bool { - if (!\is_object($object)) { - return true; - } - if (\is_array($callback)) { $callbackReflection = new \ReflectionMethod($callback[0], $callback[1]); } elseif (\is_object($callback) && !$callback instanceof \Closure) { $callbackReflection = new \ReflectionMethod($callback, '__invoke'); } else { + assert($callback instanceof \Closure || \is_string($callback)); $callbackReflection = new \ReflectionFunction($callback); } @@ -343,18 +279,9 @@ function _checkTypehint(callable $callback, $object) $expectedException = $parameters[0]; - // PHP before v8 used an easy API: - if (\PHP_VERSION_ID < 70100 || \defined('HHVM_VERSION')) { - if (!$expectedException->getClass()) { - return true; - } - - return $expectedException->getClass()->isInstance($object); - } - // Extract the type of the argument and handle different possibilities $type = $expectedException->getType(); - + $isTypeUnion = true; $types = []; @@ -379,14 +306,21 @@ function _checkTypehint(callable $callback, $object) } foreach ($types as $type) { - if (!$type instanceof \ReflectionNamedType) { - throw new \LogicException('This implementation does not support groups of intersection or union types'); - } - - // A named-type can be either a class-name or a built-in type like string, int, array, etc. - $matches = ($type->isBuiltin() && \gettype($object) === $type->getName()) - || (new \ReflectionClass($type->getName()))->isInstance($object); + if ($type instanceof \ReflectionIntersectionType) { + foreach ($type->getTypes() as $typeToMatch) { + assert($typeToMatch instanceof \ReflectionNamedType); + $name = $typeToMatch->getName(); + if (!($matches = (!$typeToMatch->isBuiltin() && $reason instanceof $name))) { + break; + } + } + assert(isset($matches)); + } else { + assert($type instanceof \ReflectionNamedType); + $name = $type->getName(); + $matches = !$type->isBuiltin() && $reason instanceof $name; + } // If we look for a single match (union), we can return early on match // If we look for a full match (intersection), we can return early on mismatch diff --git a/app/vendor/sebastian/diff/ChangeLog.md b/app/vendor/sebastian/diff/ChangeLog.md index 9bdcc5b6d..a6ccfad71 100644 --- a/app/vendor/sebastian/diff/ChangeLog.md +++ b/app/vendor/sebastian/diff/ChangeLog.md @@ -2,6 +2,13 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles. +## [4.0.5] - 2023-05-07 + +### Changed + +* [#118](https://github.com/sebastianbergmann/diff/pull/118): Improve performance of `MemoryEfficientLongestCommonSubsequenceCalculator` +* [#119](https://github.com/sebastianbergmann/diff/pull/119): Improve performance of `TimeEfficientLongestCommonSubsequenceCalculator` + ## [4.0.4] - 2020-10-26 ### Fixed @@ -76,6 +83,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt * This component is no longer supported on PHP 5.6 +[4.0.5]: https://github.com/sebastianbergmann/diff/compare/4.0.4...4.0.5 [4.0.4]: https://github.com/sebastianbergmann/diff/compare/4.0.3...4.0.4 [4.0.3]: https://github.com/sebastianbergmann/diff/compare/4.0.2...4.0.3 [4.0.2]: https://github.com/sebastianbergmann/diff/compare/4.0.1...4.0.2 diff --git a/app/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php b/app/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php index 0b626eaff..489113b6b 100644 --- a/app/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php +++ b/app/vendor/sebastian/diff/src/MemoryEfficientLongestCommonSubsequenceCalculator.php @@ -78,7 +78,12 @@ private function length(array $from, array $to): array if ($from[$i] === $to[$j]) { $current[$j + 1] = $prev[$j] + 1; } else { - $current[$j + 1] = max($current[$j], $prev[$j + 1]); + // don't use max() to avoid function call overhead + if ($current[$j] > $prev[$j + 1]) { + $current[$j + 1] = $current[$j]; + } else { + $current[$j + 1] = $prev[$j + 1]; + } } } } diff --git a/app/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php b/app/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php index fd19cac76..4e8d951d4 100644 --- a/app/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php +++ b/app/vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @@ -37,12 +37,24 @@ public function calculate(array $from, array $to): array for ($i = 1; $i <= $fromLength; ++$i) { for ($j = 1; $j <= $toLength; ++$j) { - $o = ($j * $width) + $i; - $matrix[$o] = max( - $matrix[$o - 1], - $matrix[$o - $width], - $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0 - ); + $o = ($j * $width) + $i; + + // don't use max() to avoid function call overhead + $firstOrLast = $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0; + + if ($matrix[$o - 1] > $matrix[$o - $width]) { + if ($firstOrLast > $matrix[$o - 1]) { + $matrix[$o] = $firstOrLast; + } else { + $matrix[$o] = $matrix[$o - 1]; + } + } else { + if ($firstOrLast > $matrix[$o - $width]) { + $matrix[$o] = $firstOrLast; + } else { + $matrix[$o] = $matrix[$o - $width]; + } + } } } diff --git a/app/vendor/sebastian/global-state/ChangeLog.md b/app/vendor/sebastian/global-state/ChangeLog.md index a27a5cf16..477266644 100644 --- a/app/vendor/sebastian/global-state/ChangeLog.md +++ b/app/vendor/sebastian/global-state/ChangeLog.md @@ -2,6 +2,12 @@ All notable changes in `sebastian/global-state` are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles. +## [5.0.6] - 2023-08-02 + +### Changed + +* Changed usage of `ReflectionProperty::setValue()` to be compatible with PHP 8.3 + ## [5.0.5] - 2022-02-14 ### Fixed @@ -66,6 +72,7 @@ All notable changes in `sebastian/global-state` are documented in this file usin * This component is no longer supported on PHP 7.0 and PHP 7.1 +[5.0.6]: https://github.com/sebastianbergmann/global-state/compare/5.0.5...5.0.6 [5.0.5]: https://github.com/sebastianbergmann/global-state/compare/5.0.4...5.0.5 [5.0.4]: https://github.com/sebastianbergmann/global-state/compare/5.0.3...5.0.4 [5.0.3]: https://github.com/sebastianbergmann/global-state/compare/5.0.2...5.0.3 diff --git a/app/vendor/sebastian/global-state/src/Restorer.php b/app/vendor/sebastian/global-state/src/Restorer.php index 1633fcc11..ab145ce23 100644 --- a/app/vendor/sebastian/global-state/src/Restorer.php +++ b/app/vendor/sebastian/global-state/src/Restorer.php @@ -85,7 +85,7 @@ public function restoreStaticAttributes(Snapshot $snapshot): void foreach ($staticAttributes as $name => $value) { $reflector = new ReflectionProperty($className, $name); $reflector->setAccessible(true); - $reflector->setValue($value); + $reflector->setValue(null, $value); } } @@ -109,7 +109,7 @@ public function restoreStaticAttributes(Snapshot $snapshot): void } $attribute->setAccessible(true); - $attribute->setValue($defaults[$name]); + $attribute->setValue(null, $defaults[$name]); } } } diff --git a/app/vendor/seld/jsonlint/CHANGELOG.md b/app/vendor/seld/jsonlint/CHANGELOG.md index e3550bafc..b1413473a 100644 --- a/app/vendor/seld/jsonlint/CHANGELOG.md +++ b/app/vendor/seld/jsonlint/CHANGELOG.md @@ -1,5 +1,13 @@ You can find newer changelog entries in [GitHub releases](https://github.com/Seldaek/jsonlint/releases) +### 1.10.0 (2023-05-11) + + * Added ALLOW_COMMENTS flag to parse while allowing (and ignoring) inline `//` and multiline `/* */` comments in the JSON document (#81) + +### 1.9.0 (2022-04-01) + + * Internal cleanups and type fixes + ### 1.8.1 (2020-08-13) * Added type annotations diff --git a/app/vendor/seld/jsonlint/README.md b/app/vendor/seld/jsonlint/README.md index c6597637e..a26450b0c 100644 --- a/app/vendor/seld/jsonlint/README.md +++ b/app/vendor/seld/jsonlint/README.md @@ -34,6 +34,7 @@ You can also pass additional flags to `JsonParser::lint/parse` that tweak the fu - `JsonParser::DETECT_KEY_CONFLICTS` throws an exception on duplicate keys. - `JsonParser::ALLOW_DUPLICATE_KEYS` collects duplicate keys. e.g. if you have two `foo` keys they will end up as `foo` and `foo.2`. - `JsonParser::PARSE_TO_ASSOC` parses to associative arrays instead of stdClass objects. +- `JsonParser::ALLOW_COMMENTS` parses while allowing (and ignoring) inline `//` and multiline `/* */` comments in the JSON document. Example: diff --git a/app/vendor/seld/jsonlint/phpstan.neon.dist b/app/vendor/seld/jsonlint/phpstan.neon.dist deleted file mode 100644 index aa3323d47..000000000 --- a/app/vendor/seld/jsonlint/phpstan.neon.dist +++ /dev/null @@ -1,9 +0,0 @@ -parameters: - level: 8 - - paths: - - src/ - - tests/ - - ignoreErrors: - - '/Method JsonParserTest::[a-zA-Z0-9]+\(\) has no return type/' diff --git a/app/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php b/app/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php index beee143ff..420c0fda3 100644 --- a/app/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php +++ b/app/vendor/seld/jsonlint/src/Seld/JsonLint/JsonParser.php @@ -30,13 +30,14 @@ class JsonParser const DETECT_KEY_CONFLICTS = 1; const ALLOW_DUPLICATE_KEYS = 2; const PARSE_TO_ASSOC = 4; + const ALLOW_COMMENTS = 8; /** @var Lexer */ private $lexer; /** * @var int - * @psalm-var int-mask-of + * @phpstan-var int-mask-of */ private $flags; /** @var list */ @@ -177,6 +178,8 @@ class JsonParser * @param string $input JSON string * @param int $flags Bitmask of parse/lint options (see constants of this class) * @return null|ParsingException null if no error is found, a ParsingException containing all details otherwise + * + * @phpstan-param int-mask-of $flags */ public function lint($input, $flags = 0) { @@ -193,6 +196,8 @@ public function lint($input, $flags = 0) * @param int $flags Bitmask of parse/lint options (see constants of this class) * @return mixed * @throws ParsingException + * + * @phpstan-param int-mask-of $flags */ public function parse($input, $flags = 0) { @@ -210,7 +215,7 @@ public function parse($input, $flags = 0) /** @var int<0,3> */ $recovering = 0; - $this->lexer = new Lexer(); + $this->lexer = new Lexer($flags); $this->lexer->setInput($input); $yyloc = $this->lexer->yylloc; diff --git a/app/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php b/app/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php index bb5cd5f85..fbaf4c735 100644 --- a/app/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php +++ b/app/vendor/seld/jsonlint/src/Seld/JsonLint/Lexer.php @@ -24,26 +24,38 @@ class Lexer const T_INVALID = -1; const T_SKIP_WHITESPACE = 0; const T_ERROR = 2; + /** @internal */ + const T_BREAK_LINE = 3; + /** @internal */ + const T_COMMENT = 30; + /** @internal */ + const T_OPEN_COMMENT = 31; + /** @internal */ + const T_CLOSE_COMMENT = 32; /** - * @phpstan-var array, string> + * @phpstan-var array, string> * @const */ private $rules = array( - 0 => '/\G\s+/', - 1 => '/\G-?([0-9]|[1-9][0-9]+)(\.[0-9]+)?([eE][+-]?[0-9]+)?\b/', - 2 => '{\G"(?>\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\0-\x1f\\\\"]++)*+"}', - 3 => '/\G\{/', - 4 => '/\G\}/', - 5 => '/\G\[/', - 6 => '/\G\]/', - 7 => '/\G,/', - 8 => '/\G:/', - 9 => '/\Gtrue\b/', - 10 => '/\Gfalse\b/', - 11 => '/\Gnull\b/', - 12 => '/\G$/', - 13 => '/\G./', + 0 => '/\G\s*\n\r?/', + 1 => '/\G\s+/', + 2 => '/\G-?([0-9]|[1-9][0-9]+)(\.[0-9]+)?([eE][+-]?[0-9]+)?\b/', + 3 => '{\G"(?>\\\\["bfnrt/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\0-\x1f\\\\"]++)*+"}', + 4 => '/\G\{/', + 5 => '/\G\}/', + 6 => '/\G\[/', + 7 => '/\G\]/', + 8 => '/\G,/', + 9 => '/\G:/', + 10 => '/\Gtrue\b/', + 11 => '/\Gfalse\b/', + 12 => '/\Gnull\b/', + 13 => '/\G$/', + 14 => '/\G\/\//', + 15 => '/\G\/\*/', + 16 => '/\G\*\//', + 17 => '/\G./', ); /** @var string */ @@ -54,6 +66,8 @@ class Lexer private $done; /** @var 0|positive-int */ private $offset; + /** @var int */ + private $flags; /** @var string */ public $match; @@ -67,15 +81,41 @@ class Lexer public $yylloc; /** - * @return 1|4|6|8|10|11|14|17|18|21|22|23|24|-1 + * @param int $flags + */ + public function __construct($flags = 0) + { + $this->flags = $flags; + } + + /** + * @return 0|1|4|6|8|10|11|14|17|18|21|22|23|24|30|-1 */ public function lex() { - do { + while (true) { $symbol = $this->next(); - } while ($symbol === self::T_SKIP_WHITESPACE); - - return $symbol; + switch ($symbol) { + case self::T_SKIP_WHITESPACE: + case self::T_BREAK_LINE: + break; + case self::T_COMMENT: + case self::T_OPEN_COMMENT: + if (!($this->flags & JsonParser::ALLOW_COMMENTS)) { + $this->parseError('Lexical error on line ' . ($this->yylineno+1) . ". Comments are not allowed.\n" . $this->showPosition()); + } + $this->skipUntil($symbol === self::T_COMMENT ? self::T_BREAK_LINE : self::T_CLOSE_COMMENT); + if ($this->done) { + // last symbol '/\G$/' before EOF + return 14; + } + break; + case self::T_CLOSE_COMMENT: + $this->parseError('Lexical error on line ' . ($this->yylineno+1) . ". Unexpected token.\n" . $this->showPosition()); + default: + return $symbol; + } + } } /** @@ -160,7 +200,19 @@ protected function parseError($str) } /** - * @return 0|1|4|6|8|10|11|14|17|18|21|22|23|24|-1 + * @param int $token + * @return void + */ + private function skipUntil($token) + { + $symbol = $this->next(); + while ($symbol !== $token && false === $this->done) { + $symbol = $this->next(); + } + } + + /** + * @return 0|1|3|4|6|8|10|11|14|17|18|21|22|23|24|30|31|32|-1 */ private function next() { @@ -181,7 +233,7 @@ private function next() $this->match = ''; } - $rulesLen = 14; // count($this->rules) + $rulesLen = count($this->rules); for ($i=0; $i < $rulesLen; $i++) { if (preg_match($this->rules[$i], $this->input, $match, 0, $this->offset)) { @@ -215,40 +267,47 @@ private function next() /** * @param int $rule - * @return 0|4|6|8|10|11|14|17|18|21|22|23|24|-1 + * @return 0|3|4|6|8|10|11|14|17|18|21|22|23|24|30|31|32|-1 */ private function performAction($rule) { switch ($rule) { - case 0:/* skip whitespace */ + case 0:/* skip break line */ + return self::T_BREAK_LINE; + case 1:/* skip whitespace */ return self::T_SKIP_WHITESPACE; - case 1: - return 6; case 2: + return 6; + case 3: $this->yytext = substr($this->yytext, 1, $this->yyleng-2); - return 4; - case 3: - return 17; case 4: - return 18; + return 17; case 5: - return 23; + return 18; case 6: - return 24; + return 23; case 7: - return 22; + return 24; case 8: - return 21; + return 22; case 9: - return 10; + return 21; case 10: - return 11; + return 10; case 11: - return 8; + return 11; case 12: - return 14; + return 8; case 13: + return 14; + case 14: + return self::T_COMMENT; + case 15: + return self::T_OPEN_COMMENT; + case 16: + return self::T_CLOSE_COMMENT; + case 17: return self::T_INVALID; default: throw new \LogicException('Unsupported rule '.$rule); diff --git a/app/vendor/seld/signal-handler/.github/workflows/continuous-integration.yml b/app/vendor/seld/signal-handler/.github/workflows/continuous-integration.yml deleted file mode 100644 index a6b3f760c..000000000 --- a/app/vendor/seld/signal-handler/.github/workflows/continuous-integration.yml +++ /dev/null @@ -1,56 +0,0 @@ -name: "Continuous Integration" - -on: - - push - - pull_request - -env: - COMPOSER_FLAGS: "--ansi --no-interaction" - -jobs: - tests: - name: "CI" - - runs-on: ${{ matrix.os }} - - strategy: - matrix: - os: [ubuntu-latest] - php-version: - - "7.2" - - "7.3" - - "7.4" - - "8.0" - - "8.1" - include: - - os: windows-latest - php-version: "7.4" - - os: windows-latest - php-version: "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - - - name: Get composer cache directory - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - - name: "Install latest dependencies" - run: "composer update ${{ env.COMPOSER_FLAGS }}" - - - name: "Run tests" - run: "php vendor/bin/phpunit" diff --git a/app/vendor/seld/signal-handler/.github/workflows/lint.yml b/app/vendor/seld/signal-handler/.github/workflows/lint.yml deleted file mode 100644 index 8a717c813..000000000 --- a/app/vendor/seld/signal-handler/.github/workflows/lint.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: "PHP Lint" - -on: - push: - pull_request: - -jobs: - tests: - name: "Lint" - - runs-on: ubuntu-latest - - strategy: - matrix: - php-version: - - "7.2" - - "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - - - name: "Lint PHP files" - run: "find src/ -type f -name '*.php' -print0 | xargs -0 -L1 -P4 -- php -l -f" diff --git a/app/vendor/seld/signal-handler/.github/workflows/phpstan.yml b/app/vendor/seld/signal-handler/.github/workflows/phpstan.yml deleted file mode 100644 index 1550d2805..000000000 --- a/app/vendor/seld/signal-handler/.github/workflows/phpstan.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: "PHPStan" - -on: - - push - - pull_request - -env: - COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" - -jobs: - tests: - name: "PHPStan" - - runs-on: ubuntu-latest - - strategy: - matrix: - php-version: - - "8.1" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2" - - - name: "Install PHP" - uses: "shivammathur/setup-php@v2" - with: - coverage: "none" - php-version: "${{ matrix.php-version }}" - - - name: Get composer cache directory - id: composercache - run: echo "::set-output name=dir::$(composer config cache-files-dir)" - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.composercache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} - restore-keys: ${{ runner.os }}-composer- - - - name: "Install latest dependencies" - run: "composer update ${{ env.COMPOSER_FLAGS }}" - - - name: Run PHPStan - run: composer phpstan diff --git a/app/vendor/seld/signal-handler/.gitignore b/app/vendor/seld/signal-handler/.gitignore deleted file mode 100644 index d3e95a5a5..000000000 --- a/app/vendor/seld/signal-handler/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/vendor -phpunit.xml -.php_cs.cache -composer.lock -.phpunit.result.cache \ No newline at end of file diff --git a/app/vendor/seld/signal-handler/.php_cs b/app/vendor/seld/signal-handler/.php_cs deleted file mode 100644 index c90fb289b..000000000 --- a/app/vendor/seld/signal-handler/.php_cs +++ /dev/null @@ -1,17 +0,0 @@ -files() - ->name('*.php') - ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') -; - -return Symfony\CS\Config\Config::create() - ->setUsingCache(true) - ->level(Symfony\CS\FixerInterface::NONE_LEVEL) - ->fixers(array( - 'psr0', 'encoding', 'short_tag', 'braces', 'elseif', 'eof_ending', 'function_declaration', 'indentation', 'line_after_namespace', 'linefeed', 'lowercase_constants', 'lowercase_keywords', 'multiple_use', 'php_closing_tag', 'trailing_spaces', 'visibility', 'duplicate_semicolon', 'extra_empty_lines', 'include', 'namespace_no_leading_whitespace', 'object_operator', 'operators_spaces', 'phpdoc_params', 'return', 'single_array_no_trailing_comma', 'spaces_cast', 'standardize_not_equal', 'ternary_spaces', 'unused_use', 'whitespacy_lines', 'multiline_array_tailing_comma', - )) - ->finder($finder) -; diff --git a/app/vendor/seld/signal-handler/CHANGELOG.mdown b/app/vendor/seld/signal-handler/CHANGELOG.mdown deleted file mode 100644 index c87c5e0f5..000000000 --- a/app/vendor/seld/signal-handler/CHANGELOG.mdown +++ /dev/null @@ -1,31 +0,0 @@ -### 2.0.1 (2022-07-20) - - * Fixed PHPStan type annotations - -### 2.0.0 (2022-07-20) - - * BC Break: On PHP 8.0+ the result of `SignalHandler::create()` MUST now be stored in a variable even if you handle signals via the callback, as otherwise the weak reference will be garbage collected immediately and the handler will never be called. See README for more details. - * BC Break: The `SignalHandler` class is now final - * BC Break: The `SignalHandler` constructor is now private as it should anyway only be created via `::create()` - * BC Break: `unregister()` now clears a handler instance fully and you do not need to pass which signals you want to clear anymore. - * Bumped PHP requirement to 7.2 - * Added `exitWithLastSignal` method on signal handler which you should use if you want to `exit()` the process when a signal was received/handled. This hints to the parent process which signaled that the process was terminated due to the signal. - * Added support for nesting handlers and made sure new instances' registration/unregistration does not cause issues with previous instances. See README for more details. - -### 1.3.0 (2022-02-17) - - * Dropped support for PHP <7.1 which allows dropping ticks for performance reasons (#6) - If you used `declare(ticks = 1);` previously you should now be able to remove it from your code. - * Added support for CTRL+C / CTRL+BREAK (both handled as SIGINT) on Windows on PHP 7.4+ - -### 1.2.0 (2019-07-29) - - * Added support for unregistering signal handlers - -### 1.1.0 (2016-09-14) - - * Added PHP7.1 support for async signal handling - -### 1.0.0 (2015-09-15) - - * Initial release diff --git a/app/vendor/seld/signal-handler/README.mdown b/app/vendor/seld/signal-handler/README.mdown deleted file mode 100644 index 9888eecfb..000000000 --- a/app/vendor/seld/signal-handler/README.mdown +++ /dev/null @@ -1,139 +0,0 @@ -Signal Handler -============== - -A simple cross-platform1 signal handler. - -1 Windows support is only possible on PHP 7.4+ and only supports catching -`SIGINT`/`SIGBREAK` (`ctrl+c` / `ctrl+break` respectively). On older PHP versions it -will simply silently fail to work on Windows so you can use it but signals will just -interrupt PHP as if the library was not in use. - -[![Continuous Integration](https://github.com/Seldaek/signal-handler/workflows/Continuous%20Integration/badge.svg?branch=main)](https://github.com/Seldaek/signal-handler/actions) - -Usage ------ - -> **Note**: To maximize cross-platform support all signals are available as constants -on the SignalHandler class and it is recommended to use those instead of the PHP -constants as the constants are not available on all platforms. - -### Default usage, listen to SIGTERM and SIGINT (i.e. Ctrl+C / ^C interrupts) - -```php -use Seld\Signal\SignalHandler; - -$signal = SignalHandler::create(); - -while (true) { - // do some work here ... - - // exit gracefully at the end of an iteration if the process interruption was called for - if ($signal->isTriggered()) { - $signal->exitWithLastSignal(); - } -} -``` - -### Nesting/stacking and unregistering signal handlers - -If you create multiple `SignalHandler` instances they will be kept on a stack and only -the top-most / last created one will be triggered when a signal comes in. - -When you unregister the top one the previous one becomes active again, etc. - -For this to work well however you need to make sure you properly unregister the signal handler -when you are done with it. On PHP 8.0+ this is done automatically whenever the signal handler is -garbage collected as the stack uses [WeakReference](https://www.php.net/manual/en/class.weakreference.php) -instances to keep track of the handlers. On PHP 7 however you need to call `$signal->unregister();` -explicitly to remove it from the global handler stack. - -Typically it would look something like this if you need PHP 7 support: - -```php -use Seld\Signal\SignalHandler; - -$signal = SignalHandler::create(); - -try { - // do things -} finally { - $signal->unregister(); -} -``` - -### Listen to custom signals and reset the handler to handle the same signal multiple times - -```php -use Seld\Signal\SignalHandler; - -// using strings for the constant names makes sure the code will run on Windows and -// OSX even if the signal is missing on those platforms -$signal = SignalHandler::create([SignalHandler::SIGHUP, SignalHandler::SIGUSR1]); - -while (true) { - // do some work here ... - - // reload the config when the signal was triggered - if ($signal->isTriggered()) { - $this->reloadConfiguration(); - - // reset the handler so next time you check isTriggered() it - // will be false, until SIGHUP/SIGUSR1 is signaled again - $signal->reset(); - } -} -``` - -### Passing in a [PSR-3 Logger](https://packagist.org/providers/psr/log-implementation) will make it log `->info('Received '.$signalName)` - -```php -use Seld\Signal\SignalHandler; - -$signal = SignalHandler::create(null, new PSR3Logger()); -``` - -### Passing in a callback you can react to the signal as well - -```php -use Seld\Signal\SignalHandler; - -$signal = SignalHandler::create([SignalHandler::SIGINT], function (string $signalName, SignalHandler $self) { - echo 'Received ' . $signalName . PHP_EOL; - - // you can optionally receive the SignalHandler instance as second arg to do things on it like - // resetting its state or exiting to handle the signal - $self->reset(); - $self->exitWithLastSignal(); -}); -``` - -> **Warning**: As described above on PHP 8.0+ this library uses weak references to keep track of the handlers, -> so if you do not store the result of `::create()` into a variable that you keep around as long as you need -> the handler, it will not work and your callback function will never be called. - -Installation ------------- - -For a quick install with Composer use: - - $ composer require seld/signal-handler - -Requirements ------------- - -- PHP 7.2+ (or PHP 5.4+ for v1 which is EOL now) - -Submitting bugs and feature requests ------------------------------------- - -Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/signal-handler/issues) - -Author ------- - -Jordi Boggiano - - - -License -------- - -signal-handler is licensed under the MIT License - see the LICENSE file for details diff --git a/app/vendor/seld/signal-handler/phpstan-baseline.neon b/app/vendor/seld/signal-handler/phpstan-baseline.neon deleted file mode 100644 index c24938165..000000000 --- a/app/vendor/seld/signal-handler/phpstan-baseline.neon +++ /dev/null @@ -1,6 +0,0 @@ -parameters: - ignoreErrors: - - - message: "#^Call to static method PHPUnit\\\\Framework\\\\Assert\\:\\:assertSame\\(\\) with 'SIGHUP' and null will always evaluate to false\\.$#" - count: 1 - path: tests/SignalHandlerTest.php diff --git a/app/vendor/seld/signal-handler/phpstan.neon.dist b/app/vendor/seld/signal-handler/phpstan.neon.dist deleted file mode 100644 index 140f2481a..000000000 --- a/app/vendor/seld/signal-handler/phpstan.neon.dist +++ /dev/null @@ -1,15 +0,0 @@ -parameters: - level: 8 - - paths: - - src/ - - tests/ - - treatPhpDocTypesAsCertain: false - -includes: - - ./phpstan-baseline.neon - - vendor/phpstan/phpstan-phpunit/extension.neon - - vendor/phpstan/phpstan-phpunit/rules.neon - - vendor/phpstan/phpstan-strict-rules/rules.neon - - vendor/phpstan/phpstan-deprecation-rules/rules.neon diff --git a/app/vendor/seld/signal-handler/phpunit.xml.dist b/app/vendor/seld/signal-handler/phpunit.xml.dist deleted file mode 100644 index 23987bd6d..000000000 --- a/app/vendor/seld/signal-handler/phpunit.xml.dist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - ./tests/ - - - - - - ./src/ - - - diff --git a/app/vendor/seld/signal-handler/tests/SignalHandlerTest.php b/app/vendor/seld/signal-handler/tests/SignalHandlerTest.php deleted file mode 100644 index 6bd772eac..000000000 --- a/app/vendor/seld/signal-handler/tests/SignalHandlerTest.php +++ /dev/null @@ -1,263 +0,0 @@ -getMockBuilder(LoggerInterface::class)->getMock(); - - $signal = SignalHandler::create(null, $log); - $log->expects(self::exactly(2)) - ->method('info') - ->withConsecutive( - ['Received SIGINT', []], - ['Received SIGTERM', []] - ); - - posix_kill(posix_getpid(), SIGINT); - posix_kill(posix_getpid(), SIGTERM); - posix_kill(posix_getpid(), SIGURG); - } - - /** - * @requires extension pcntl - * @requires extension posix - * @requires PHP < 8.0 - */ - public function testNoAutoGCOnPHP7(): void - { - $log = $this->getMockBuilder(LoggerInterface::class)->getMock(); - - $signal = SignalHandler::create(null, $log); - $log->expects(self::exactly(2)) - ->method('info') - ->withConsecutive( - ['Received SIGINT', []], - ['Received SIGINT', []] - ); - - posix_kill(posix_getpid(), SIGINT); - unset($signal); - posix_kill(posix_getpid(), SIGINT); - SignalHandler::unregisterAll(); - self::assertSame(SIG_DFL, pcntl_signal_get_handler(SIGINT)); - } - - /** - * @requires extension pcntl - * @requires extension posix - * @requires PHP >= 8.0 - */ - public function testAutoGCOnPHP8(): void - { - $log1 = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $signal1 = SignalHandler::create(null, $log1); - $log1->expects(self::exactly(1)) - ->method('info') - ->withConsecutive( - ['Received SIGINT', []] - ); - - $log2 = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $signal2 = SignalHandler::create(null, $log2); - $log2->expects(self::exactly(1)) - ->method('info') - ->withConsecutive( - ['Received SIGINT', []] - ); - - posix_kill(posix_getpid(), SIGINT); - unset($signal2); - posix_kill(posix_getpid(), SIGINT); - unset($signal1); - self::assertSame(SIG_DFL, pcntl_signal_get_handler(SIGINT)); - } - - /** - * @requires extension pcntl - * @requires extension posix - */ - public function testCallbackAndCustom(): void - { - pcntl_signal(SIGINT, function () { - // ignore - }); - - $sigName = null; - - $signal = SignalHandler::create([SignalHandler::SIGHUP], function ($name) use (&$sigName) { - $sigName = $name; - }); - - posix_kill(posix_getpid(), SIGINT); - self::assertNull($sigName); - - posix_kill(posix_getpid(), SIGHUP); - self::assertSame('SIGHUP', $sigName); - - $signal->unregister(); - } - - /** - * @requires extension pcntl - * @requires extension posix - */ - public function testTriggerResetCycle(): void - { - $signal = SignalHandler::create([SignalHandler::SIGUSR1, SignalHandler::SIGUSR2]); - - self::assertFalse($signal->isTriggered()); - posix_kill(posix_getpid(), SIGUSR1); - self::assertTrue($signal->isTriggered()); - - $signal->reset(); - self::assertFalse($signal->isTriggered()); - posix_kill(posix_getpid(), SIGUSR2); - self::assertTrue($signal->isTriggered()); - - $signal->unregister(); - } - - /** - * @requires extension pcntl - * @requires extension posix - */ - public function testNestingWorks(): void - { - $log1 = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $signal1 = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGHUP], $log1); - $log1->expects(self::exactly(2)) - ->method('info') - ->withConsecutive( - ['Received SIGHUP', []], - ['Received SIGINT', []] - ); - - $log2 = $this->getMockBuilder(LoggerInterface::class)->getMock(); - $signal2 = SignalHandler::create([SignalHandler::SIGINT], $log2); - $log2->expects(self::exactly(1)) - ->method('info') - ->withConsecutive( - ['Received SIGINT', []] - ); - - posix_kill(posix_getpid(), SIGINT); - posix_kill(posix_getpid(), SIGHUP); - $signal2->unregister(); - unset($signal2); - - self::assertNotSame(SIG_DFL, pcntl_signal_get_handler(SIGINT)); - self::assertNotSame(SIG_DFL, pcntl_signal_get_handler(SIGHUP)); - - posix_kill(posix_getpid(), SIGINT); - $signal1->unregister(); - unset($signal1); - self::assertSame(SIG_DFL, pcntl_signal_get_handler(SIGINT)); - self::assertSame(SIG_DFL, pcntl_signal_get_handler(SIGHUP)); - } - - /** - * @requires OSFAMILY Windows - * @requires PHP >= 7.4 - */ - public function testLoggingAndDefaultOnWindows(): void - { - $log = $this->getMockBuilder(LoggerInterface::class)->getMock(); - - $signal = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGBREAK], $log); - $log->expects(self::atLeastOnce()) - ->method('info') - ->with(self::equalTo('Received SIGBREAK')); - - $this->dispatchWindowsSignal($signal, PHP_WINDOWS_EVENT_CTRL_BREAK); - - $signal->unregister(); - } - - /** - * @requires OSFAMILY Windows - * @requires PHP >= 7.4 - */ - public function testCallbackAndCustomOnWindows(): void - { - $sigName = null; - - $signal = SignalHandler::create([SignalHandler::SIGBREAK], function ($name) use (&$sigName) { - $sigName = $name; - }); - - $this->dispatchWindowsSignal($signal, PHP_WINDOWS_EVENT_CTRL_BREAK); - self::assertSame(SignalHandler::SIGBREAK, $sigName); - - $signal->unregister(); - } - - /** - * @requires OSFAMILY Windows - * @requires PHP >= 7.4 - */ - public function testTriggerResetCycleOnWindows(): void - { - $signal = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGBREAK]); - - self::assertFalse($signal->isTriggered()); - $this->dispatchWindowsSignal($signal, PHP_WINDOWS_EVENT_CTRL_BREAK); - self::assertTrue($signal->isTriggered()); - - $signal->reset(); - self::assertFalse($signal->isTriggered()); - $this->dispatchWindowsSignal($signal, PHP_WINDOWS_EVENT_CTRL_BREAK); - self::assertTrue($signal->isTriggered()); - - $signal->unregister(); - } - - /** - * @requires OSFAMILY Windows - * @requires PHP >= 7.4 - */ - public function testNestingWorksOnWindows(): void - { - $signal1 = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGBREAK]); - - $signal2 = SignalHandler::create([SignalHandler::SIGINT, SignalHandler::SIGBREAK]); - - self::assertFalse($signal1->isTriggered()); - self::assertFalse($signal2->isTriggered()); - $this->dispatchWindowsSignal($signal2, PHP_WINDOWS_EVENT_CTRL_BREAK); - self::assertFalse($signal1->isTriggered()); - self::assertTrue($signal2->isTriggered()); - - $signal2->unregister(); - unset($signal2); - - $this->dispatchWindowsSignal($signal1, PHP_WINDOWS_EVENT_CTRL_BREAK); - self::assertTrue($signal1->isTriggered()); - - $signal1->unregister(); - unset($signal1); - } - - private function dispatchWindowsSignal(SignalHandler $handler, int $signal): void - { - sapi_windows_generate_ctrl_event($signal); - sapi_windows_generate_ctrl_event($signal); - sapi_windows_generate_ctrl_event($signal); - - // waits to try and get the signal handler to trigger - $tries = 10; - while (!$handler->isTriggered() && $tries-- > 0) { - sapi_windows_generate_ctrl_event($signal); - usleep(500000); - } - } -} diff --git a/app/vendor/slevomat/coding-standard/README.md b/app/vendor/slevomat/coding-standard/README.md index 468b0022d..b44b78e73 100644 --- a/app/vendor/slevomat/coding-standard/README.md +++ b/app/vendor/slevomat/coding-standard/README.md @@ -31,7 +31,9 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.Arrays.AlphabeticallySortedByKeys](doc/arrays.md#slevomatcodingstandardarrayalphabeticallysortedbykeys) 🔧 - [SlevomatCodingStandard.Arrays.DisallowImplicitArrayCreation](doc/arrays.md#slevomatcodingstandardarraysdisallowimplicitarraycreation) + - [SlevomatCodingStandard.Arrays.DisallowPartiallyKeyed](doc/arrays.md#slevomatcodingstandardarraysdisallowpartiallykeyed) 🚧 - [SlevomatCodingStandard.Arrays.MultiLineArrayEndBracketPlacement](doc/arrays.md#slevomatcodingstandardarraysmultilinearrayendbracketplacement-) 🔧 + - [SlevomatCodingStandard.Arrays.ArrayAccessSniff.php](doc/arrays.md#slevomatcodingstandardarraysarrayaccess-) 🔧 - [SlevomatCodingStandard.Arrays.SingleLineArrayWhitespace](doc/arrays.md#slevomatcodingstandardarrayssinglelinearraywhitespace-) 🔧 - [SlevomatCodingStandard.Arrays.TrailingArrayComma](doc/arrays.md#slevomatcodingstandardarraystrailingarraycomma-) 🔧 - [SlevomatCodingStandard.Attributes.AttributeAndTargetSpacing](doc/attributes.md#slevomatcodingstandardattributesattributeandtargetspacing-) 🔧 @@ -49,7 +51,9 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.Classes.DisallowLateStaticBindingForConstants](doc/classes.md#slevomatcodingstandardclassesdisallowlatestaticbindingforconstants-) 🔧 - [SlevomatCodingStandard.Classes.DisallowMultiConstantDefinition](doc/classes.md#slevomatcodingstandardclassesdisallowmulticonstantdefinition-) 🔧 - [SlevomatCodingStandard.Classes.DisallowMultiPropertyDefinition](doc/classes.md#slevomatcodingstandardclassesdisallowmultipropertydefinition-) 🔧 + - [SlevomatCodingStandard.Classes.DisallowStringExpressionPropertyFetch](doc/classes.md#slevomatcodingstandardclassesdisallowstringexpressionpropertyfetch-) 🔧 - [SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces](doc/classes.md#slevomatcodingstandardclassesemptylinesaroundclassbraces-) 🔧 + - [SlevomatCodingStandard.Classes.EnumCaseSpacing](doc/classes.md#slevomatcodingstandardclassesenumcasespacing-) 🔧 - [SlevomatCodingStandard.Classes.ForbiddenPublicProperty](doc/classes.md#slevomatcodingstandardclassesforbiddenpublicproperty) - [SlevomatCodingStandard.Classes.MethodSpacing](doc/classes.md#slevomatcodingstandardclassesmethodspacing-) 🔧 - [SlevomatCodingStandard.Classes.ModernClassNameReference](doc/classes.md#slevomatcodingstandardclassesmodernclassnamereference-) 🔧 @@ -59,6 +63,7 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.Classes.RequireAbstractOrFinal](doc/classes.md#slevomatcodingstandardclassesrequireabstractorfinal-) 🔧 - [SlevomatCodingStandard.Classes.RequireConstructorPropertyPromotion](doc/classes.md#slevomatcodingstandardclassesrequireconstructorpropertypromotion-) 🔧 - [SlevomatCodingStandard.Classes.RequireMultiLineMethodSignature](doc/classes.md#slevomatcodingstandardclassesrequiremultilinemethodsignature-) 🔧 + - [SlevomatCodingStandard.Classes.RequireSelfReference](doc/classes.md#slevomatcodingstandardclassesrequireselfreference-) 🔧 - [SlevomatCodingStandard.Classes.RequireSingleLineMethodSignature](doc/classes.md#slevomatcodingstandardclassesrequiresinglelinemethodsignature-) 🔧 - [SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming](doc/classes.md#slevomatcodingstandardclassessuperfluousabstractclassnaming) - [SlevomatCodingStandard.Classes.SuperfluousErrorNaming](doc/classes.md#slevomatcodingstandardclassessuperfluouserrornaming) @@ -68,6 +73,7 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.Classes.TraitUseDeclaration](doc/classes.md#slevomatcodingstandardclassestraitusedeclaration-) 🔧 - [SlevomatCodingStandard.Classes.TraitUseSpacing](doc/classes.md#slevomatcodingstandardclassestraitusespacing-) 🔧 - [SlevomatCodingStandard.Classes.UselessLateStaticBinding](doc/classes.md#slevomatcodingstandardclassesuselesslatestaticbinding-) 🔧 + - [SlevomatCodingStandard.Commenting.AnnotationName](doc/commenting.md#slevomatcodingstandardcommentingannotationname-) - [SlevomatCodingStandard.Commenting.DeprecatedAnnotationDeclaration](doc/commenting.md#slevomatcodingstandardcommentingdeprecatedannotationdeclaration) - [SlevomatCodingStandard.Commenting.DisallowCommentAfterCode](doc/commenting.md#slevomatcodingstandardcommentingdisallowcommentaftercode-) 🔧 - [SlevomatCodingStandard.Commenting.DisallowOneLinePropertyDocComment](doc/commenting.md#slevomatcodingstandardcommentingdisallowonelinepropertydoccomment-) 🔧 @@ -167,6 +173,7 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.PHP.TypeCast](doc/php.md#slevomatcodingstandardphptypecast-) 🔧 - [SlevomatCodingStandard.PHP.UselessParentheses](doc/php.md#slevomatcodingstandardphpuselessparentheses-) 🔧 - [SlevomatCodingStandard.PHP.UselessSemicolon](doc/php.md#slevomatcodingstandardphpuselesssemicolon-) 🔧 + - [SlevomatCodingStandard.Strings.DisallowVariableParsing](doc/strings.md#slevomatcodingstandardstringsdisallowvariableparsing) - [SlevomatCodingStandard.TypeHints.DeclareStrictTypes](doc/type-hints.md#slevomatcodingstandardtypehintsdeclarestricttypes-) 🔧 - [SlevomatCodingStandard.TypeHints.DisallowArrayTypeHintSyntax](doc/type-hints.md#slevomatcodingstandardtypehintsdisallowarraytypehintsyntax-) 🔧 - [SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint](doc/type-hints.md#slevomatcodingstandardtypehintsdisallowmixedtypehint) @@ -180,6 +187,7 @@ Slevomat Coding Standard for [PHP_CodeSniffer](https://github.com/squizlabs/PHP_ - [SlevomatCodingStandard.TypeHints.ReturnTypeHintSpacing](doc/type-hints.md#slevomatcodingstandardtypehintsreturntypehintspacing-) 🔧 - [SlevomatCodingStandard.TypeHints.UnionTypeHintFormat](doc/type-hints.md#slevomatcodingstandardtypehintsuniontypehintformat-) 🔧 - [SlevomatCodingStandard.TypeHints.UselessConstantTypeHint](doc/type-hints.md#slevomatcodingstandardtypehintsuselessconstanttypehint-) 🔧 + - [SlevomatCodingStandard.Variables.DisallowVariableVariable](doc/variables.md#slevomatcodingstandardvariablesdisallowvariablevariable) - [SlevomatCodingStandard.Variables.DisallowSuperGlobalVariable](doc/variables.md#slevomatcodingstandardvariablesdisallowsuperglobalvariable) - [SlevomatCodingStandard.Variables.DuplicateAssignmentToVariable](doc/variables.md#slevomatcodingstandardvariablesduplicateassignmenttovariable) - [SlevomatCodingStandard.Variables.UnusedVariable](doc/variables.md#slevomatcodingstandardvariablesunusedvariable) diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation.php new file mode 100644 index 000000000..d5b6343c0 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation.php @@ -0,0 +1,66 @@ +node = $node; + $this->startPointer = $startPointer; + $this->endPointer = $endPointer; + } + + public function getNode(): PhpDocTagNode + { + return $this->node; + } + + public function getName(): string + { + return $this->node->name; + } + + /** + * @return T + */ + public function getValue(): PhpDocTagValueNode + { + /** @phpstan-ignore-next-line */ + return $this->node->value; + } + + public function getStartPointer(): int + { + return $this->startPointer; + } + + public function getEndPointer(): int + { + return $this->endPointer; + } + + public function isInvalid(): bool + { + return $this->node->value instanceof InvalidTagValueNode; + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/Annotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/Annotation.php deleted file mode 100644 index 5c0b831c9..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/Annotation.php +++ /dev/null @@ -1,72 +0,0 @@ -name = $name; - $this->startPointer = $startPointer; - $this->endPointer = $endPointer; - $this->content = $content; - } - - public function getName(): string - { - return $this->name; - } - - public function getStartPointer(): int - { - return $this->startPointer; - } - - public function getEndPointer(): int - { - return $this->endPointer; - } - - public function getContent(): ?string - { - return $this->content; - } - - protected function fixDescription(string $description): string - { - return substr($this->getContent(), -strlen($description)); - } - - protected function errorWhenInvalid(): void - { - if ($this->isInvalid()) { - throw new LogicException(sprintf('Invalid %s annotation.', $this->name)); - } - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/AssertAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/AssertAnnotation.php deleted file mode 100644 index 0fd0ab7db..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/AssertAnnotation.php +++ /dev/null @@ -1,87 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - /** - * @return AssertTagMethodValueNode|AssertTagPropertyValueNode|AssertTagValueNode|null - */ - public function getContentNode() - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->type; - } - - public function export(): string - { - $exported = sprintf('%s %s %s', $this->name, AnnotationTypeHelper::export($this->getType()), $this->contentNode->parameter); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ExtendsAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ExtendsAnnotation.php deleted file mode 100644 index e396c38e5..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ExtendsAnnotation.php +++ /dev/null @@ -1,75 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ExtendsTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getType(): GenericTypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/GenericAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/GenericAnnotation.php deleted file mode 100644 index 7c370542b..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/GenericAnnotation.php +++ /dev/null @@ -1,48 +0,0 @@ -parameters = $parameters; - } - - public function getParameters(): ?string - { - return $this->parameters; - } - - public function isInvalid(): bool - { - return false; - } - - public function export(): string - { - $exported = $this->name; - - if ($this->parameters !== null) { - $exported .= sprintf('(%s)', $this->parameters); - } - - if ($this->content !== null) { - $exported .= sprintf(' %s', $this->content); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ImplementsAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ImplementsAnnotation.php deleted file mode 100644 index b568e28e1..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ImplementsAnnotation.php +++ /dev/null @@ -1,75 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ImplementsTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getType(): GenericTypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MethodAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MethodAnnotation.php deleted file mode 100644 index bae5ac462..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MethodAnnotation.php +++ /dev/null @@ -1,142 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): MethodTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getMethodName(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->methodName !== '' ? $this->contentNode->methodName : null; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|IdentifierTypeNode|ThisTypeNode - */ - public function getMethodReturnType(): ?TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|IdentifierTypeNode|ThisTypeNode $type */ - $type = $this->contentNode->returnType; - return $type; - } - - /** - * @return TemplateTagValueNode[] - */ - public function getMethodTemplateTypes(): array - { - $this->errorWhenInvalid(); - - return $this->contentNode->templateTypes; - } - - /** - * @return MethodTagValueParameterNode[] - */ - public function getMethodParameters(): array - { - $this->errorWhenInvalid(); - - return $this->contentNode->parameters; - } - - public function export(): string - { - $static = $this->contentNode->isStatic ? 'static ' : ''; - $returnType = $this->getMethodReturnType() !== null - ? sprintf('%s ', AnnotationTypeHelper::export($this->getMethodReturnType())) - : ''; - - $templateTypes = $this->contentNode->templateTypes !== [] ? '<' . implode(', ', $this->contentNode->templateTypes) . '>' : ''; - - $parameters = []; - foreach ($this->getMethodParameters() as $parameter) { - $type = $parameter->type !== null ? AnnotationTypeHelper::export($parameter->type) . ' ' : ''; - $isReference = $parameter->isReference ? '&' : ''; - $isVariadic = $parameter->isVariadic ? '...' : ''; - $default = $parameter->defaultValue !== null ? sprintf(' = %s', $parameter->defaultValue) : ''; - - $parameters[] = sprintf('%s%s%s%s%s', $type, $isReference, $isVariadic, $parameter->parameterName, $default); - } - - $exported = sprintf( - '%s %s%s%s%s(%s)', - $this->name, - $static, - $returnType, - $this->getMethodName(), - $templateTypes, - implode(', ', $parameters) - ); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MixinAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MixinAnnotation.php deleted file mode 100644 index 7f72c3dfd..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/MixinAnnotation.php +++ /dev/null @@ -1,81 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): MixinTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - /** - * @return GenericTypeNode|IdentifierTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|IdentifierTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterAnnotation.php deleted file mode 100644 index 422493c80..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterAnnotation.php +++ /dev/null @@ -1,114 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - /** - * @return ParamTagValueNode|TypelessParamTagValueNode|null - */ - public function getContentNode() - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getParameterName(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->parameterName; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode|null - */ - public function getType(): ?TypeNode - { - $this->errorWhenInvalid(); - - if ($this->contentNode instanceof TypelessParamTagValueNode) { - return null; - } - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf( - '%s %s %s%s', - $this->name, - AnnotationTypeHelper::export($this->getType()), - $this->contentNode->isVariadic ? '...' : '', - $this->getParameterName() - ); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterOutAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterOutAnnotation.php deleted file mode 100644 index 8343be6f6..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ParameterOutAnnotation.php +++ /dev/null @@ -1,102 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ?ParamOutTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getParameterName(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->parameterName; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf( - '%s %s %s', - $this->name, - AnnotationTypeHelper::export($this->getType()), - $this->getParameterName() - ); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/PropertyAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/PropertyAnnotation.php deleted file mode 100644 index 144838f2d..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/PropertyAnnotation.php +++ /dev/null @@ -1,99 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): PropertyTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getPropertyName(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->propertyName; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf('%s %s %s', $this->name, AnnotationTypeHelper::export($this->getType()), $this->getPropertyName()); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ReturnAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ReturnAnnotation.php deleted file mode 100644 index 4f0f55cd0..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ReturnAnnotation.php +++ /dev/null @@ -1,92 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ReturnTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode|ConditionalTypeNode|ConditionalTypeForParameterNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode|ConditionalTypeForParameterNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/SelfOutAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/SelfOutAnnotation.php deleted file mode 100644 index e1a080473..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/SelfOutAnnotation.php +++ /dev/null @@ -1,94 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ?SelfOutTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf( - '%s %s', - $this->name, - AnnotationTypeHelper::export($this->getType()) - ); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TemplateAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TemplateAnnotation.php deleted file mode 100644 index fd880c3c0..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TemplateAnnotation.php +++ /dev/null @@ -1,101 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): TemplateTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getTemplateName(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->name; - } - - public function getBound(): ?TypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->bound; - } - - public function getDefault(): ?TypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->default; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, $this->contentNode->name); - - if ($this->contentNode->bound !== null) { - $exported .= sprintf(' of %s', AnnotationTypeHelper::export($this->contentNode->bound)); - } - - if ($this->contentNode->default !== null) { - $exported .= sprintf(' = %s', AnnotationTypeHelper::export($this->contentNode->default)); - } - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ThrowsAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ThrowsAnnotation.php deleted file mode 100644 index 5a4f962ee..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/ThrowsAnnotation.php +++ /dev/null @@ -1,82 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): ThrowsTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - /** - * @return UnionTypeNode|IdentifierTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var UnionTypeNode|IdentifierTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeAliasAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeAliasAnnotation.php deleted file mode 100644 index 65e98bfd3..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeAliasAnnotation.php +++ /dev/null @@ -1,67 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): TypeAliasTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function getAlias(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->alias; - } - - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->type; - } - - public function export(): string - { - return sprintf('%s %s %s', $this->name, $this->contentNode->alias, AnnotationTypeHelper::export($this->contentNode->type)); - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeImportAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeImportAnnotation.php deleted file mode 100644 index afc3670d2..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/TypeImportAnnotation.php +++ /dev/null @@ -1,100 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): TypeAliasImportTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function getAlias(): string - { - return $this->getImportedAs() ?? $this->getImportedAlias(); - } - - public function getImportedAlias(): string - { - $this->errorWhenInvalid(); - - return $this->contentNode->importedAlias; - } - - /** - * @return IdentifierTypeNode - */ - public function getImportedFrom(): TypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->importedFrom; - } - - public function getImportedAs(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->importedAs; - } - - public function export(): string - { - $exported = sprintf( - '%s %s from %s', - $this->name, - $this->contentNode->importedAlias, - AnnotationTypeHelper::export($this->contentNode->importedFrom) - ); - - if ($this->contentNode->importedAs !== null) { - $exported .= sprintf(' as %s', $this->contentNode->importedAs); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/UseAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/UseAnnotation.php deleted file mode 100644 index 69f987bd8..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/UseAnnotation.php +++ /dev/null @@ -1,75 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): UsesTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getType(): GenericTypeNode - { - $this->errorWhenInvalid(); - - return $this->contentNode->type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/VariableAnnotation.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/VariableAnnotation.php deleted file mode 100644 index 39e52d325..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/Annotation/VariableAnnotation.php +++ /dev/null @@ -1,102 +0,0 @@ -contentNode = $contentNode; - } - - public function isInvalid(): bool - { - return $this->contentNode === null; - } - - public function getContentNode(): VarTagValueNode - { - $this->errorWhenInvalid(); - - return $this->contentNode; - } - - public function hasDescription(): bool - { - return $this->getDescription() !== null; - } - - public function getDescription(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->description !== '' ? $this->contentNode->description : null; - } - - public function getVariableName(): ?string - { - $this->errorWhenInvalid(); - - return $this->contentNode->variableName !== '' ? $this->contentNode->variableName : null; - } - - /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode - */ - public function getType(): TypeNode - { - $this->errorWhenInvalid(); - - /** @var GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode $type */ - $type = $this->contentNode->type; - return $type; - } - - public function export(): string - { - $exported = sprintf('%s %s', $this->name, AnnotationTypeHelper::export($this->getType())); - - $variableName = $this->getVariableName(); - if ($variableName !== null) { - $exported .= sprintf(' %s', $variableName); - } - - $description = $this->getDescription(); - if ($description !== null) { - $exported .= sprintf(' %s', $this->fixDescription($description)); - } - - return $exported; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationConstantExpressionHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationConstantExpressionHelper.php deleted file mode 100644 index 00acfd399..000000000 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationConstantExpressionHelper.php +++ /dev/null @@ -1,73 +0,0 @@ - - */ - public static function getConstantFetchNodes(ConstExprNode $contantExpressionNode): array - { - if ($contantExpressionNode instanceof ConstExprArrayNode) { - $constantFetchNodes = []; - foreach ($contantExpressionNode->items as $itemConstantExpressionNode) { - $constantFetchNodes = array_merge($constantFetchNodes, self::getConstantFetchNodes($itemConstantExpressionNode)); - } - return $constantFetchNodes; - } - - if ($contantExpressionNode instanceof ConstExprArrayItemNode) { - $constantFetchNodes = self::getConstantFetchNodes($contantExpressionNode->value); - if ($contantExpressionNode->key !== null) { - $constantFetchNodes = array_merge($constantFetchNodes, self::getConstantFetchNodes($contantExpressionNode->key)); - } - return $constantFetchNodes; - } - - if ($contantExpressionNode instanceof ConstFetchNode) { - return [$contantExpressionNode]; - } - - return []; - } - - public static function change(ConstExprNode $masterNode, ConstExprNode $nodeToChange, ConstExprNode $changedNode): ConstExprNode - { - if ($masterNode === $nodeToChange) { - return $changedNode; - } - - if ($masterNode instanceof ConstExprArrayNode) { - $items = []; - foreach ($masterNode->items as $itemNode) { - /** @var ConstExprArrayItemNode $changedItemNode */ - $changedItemNode = self::change($itemNode, $nodeToChange, $changedNode); - - $items[] = $changedItemNode; - } - - return new ConstExprArrayNode($items); - } - - if ($masterNode instanceof ConstExprArrayItemNode) { - $key = $masterNode->key !== null ? self::change($masterNode->key, $nodeToChange, $changedNode) : null; - $value = self::change($masterNode->value, $nodeToChange, $changedNode); - - return new ConstExprArrayItemNode($key, $value); - } - - return clone $masterNode; - } - -} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationHelper.php index de7074941..f6081af13 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationHelper.php @@ -3,12 +3,18 @@ namespace SlevomatCodingStandard\Helpers; use PHP_CodeSniffer\Files\File; -use PHP_CodeSniffer\Util\Tokens; -use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode; -use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; -use PHPStan\PhpDocParser\Ast\PhpDoc\InvalidTagValueNode; -use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; -use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; +use PHPStan\PhpDocParser\Ast\Attribute; +use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; +use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineArgument; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\TypelessParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeForParameterNode; use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeNode; @@ -16,48 +22,12 @@ use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; -use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; -use PHPStan\PhpDocParser\Ast\Type\TypeNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeItemNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use PHPStan\PhpDocParser\Lexer\Lexer; -use PHPStan\PhpDocParser\Parser\ConstExprParser; -use PHPStan\PhpDocParser\Parser\PhpDocParser; -use PHPStan\PhpDocParser\Parser\TokenIterator; -use PHPStan\PhpDocParser\Parser\TypeParser; -use SlevomatCodingStandard\Helpers\Annotation\Annotation; -use SlevomatCodingStandard\Helpers\Annotation\AssertAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ExtendsAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ImplementsAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\MethodAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\MixinAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ParameterAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ParameterOutAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\PropertyAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ReturnAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\SelfOutAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\TemplateAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ThrowsAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\TypeAliasAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\TypeImportAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\UseAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; -use function array_key_exists; -use function array_merge; -use function get_class; use function in_array; -use function max; -use function preg_match; -use function preg_match_all; -use function preg_replace; use function sprintf; use function strtolower; -use function trim; -use const T_DOC_COMMENT_CLOSE_TAG; -use const T_DOC_COMMENT_STAR; -use const T_DOC_COMMENT_STRING; -use const T_DOC_COMMENT_TAG; -use const T_DOC_COMMENT_WHITESPACE; /** * @internal @@ -65,338 +35,155 @@ class AnnotationHelper { - public const PREFIXES = ['psalm', 'phpstan']; - - private const MAPPING = [ - '@param' => ParameterAnnotation::class, - '@psalm-param' => ParameterAnnotation::class, - '@phpstan-param' => ParameterAnnotation::class, - '@return' => ReturnAnnotation::class, - '@psalm-return' => ReturnAnnotation::class, - '@phpstan-return' => ReturnAnnotation::class, - '@var' => VariableAnnotation::class, - '@psalm-var' => VariableAnnotation::class, - '@phpstan-var' => VariableAnnotation::class, - '@throws' => ThrowsAnnotation::class, - '@phpstan-throws' => ThrowsAnnotation::class, - '@property' => PropertyAnnotation::class, - '@psalm-property' => PropertyAnnotation::class, - '@phpstan-property' => PropertyAnnotation::class, - '@property-read' => PropertyAnnotation::class, - '@psalm-property-read' => PropertyAnnotation::class, - '@phpstan-property-read' => PropertyAnnotation::class, - '@property-write' => PropertyAnnotation::class, - '@psalm-property-write' => PropertyAnnotation::class, - '@phpstan-property-write' => PropertyAnnotation::class, - '@method' => MethodAnnotation::class, - '@psalm-method' => MethodAnnotation::class, - '@phpstan-method' => MethodAnnotation::class, - '@template' => TemplateAnnotation::class, - '@psalm-template' => TemplateAnnotation::class, - '@phpstan-template' => TemplateAnnotation::class, - '@template-covariant' => TemplateAnnotation::class, - '@psalm-template-covariant' => TemplateAnnotation::class, - '@phpstan-template-covariant' => TemplateAnnotation::class, - '@extends' => ExtendsAnnotation::class, - '@template-extends' => ExtendsAnnotation::class, - '@phpstan-extends' => ExtendsAnnotation::class, - '@implements' => ImplementsAnnotation::class, - '@template-implements' => ImplementsAnnotation::class, - '@phpstan-implements' => ImplementsAnnotation::class, - '@use' => UseAnnotation::class, - '@template-use' => UseAnnotation::class, - '@phpstan-use' => UseAnnotation::class, - '@psalm-type' => TypeAliasAnnotation::class, - '@phpstan-type' => TypeAliasAnnotation::class, - '@psalm-import-type' => TypeImportAnnotation::class, - '@phpstan-import-type' => TypeImportAnnotation::class, - '@mixin' => MixinAnnotation::class, - '@phpstan-assert' => AssertAnnotation::class, - '@phpstan-assert-if-true' => AssertAnnotation::class, - '@phpstan-assert-if-false' => AssertAnnotation::class, - '@psalm-assert' => AssertAnnotation::class, - '@psalm-assert-if-true' => AssertAnnotation::class, - '@psalm-assert-if-false' => AssertAnnotation::class, - '@param-out' => ParameterOutAnnotation::class, - '@psalm-param-out' => ParameterOutAnnotation::class, - '@phpstan-param-out' => ParameterOutAnnotation::class, - '@psalm-self-out' => SelfOutAnnotation::class, - '@phpstan-self-out' => SelfOutAnnotation::class, - '@psalm-this-out' => SelfOutAnnotation::class, - '@phpstan-this-out' => SelfOutAnnotation::class, - ]; + public const STATIC_ANALYSIS_PREFIXES = ['psalm', 'phpstan']; /** - * @internal - * @param VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|TypeAliasAnnotation|TypeImportAnnotation|AssertAnnotation|ParameterOutAnnotation|SelfOutAnnotation $annotation - * @return TypeNode[] + * @return list */ - public static function getAnnotationTypes(Annotation $annotation): array + public static function getAnnotations(File $phpcsFile, int $pointer, ?string $name = null): array { - $annotationTypes = []; - - if ($annotation instanceof MethodAnnotation) { - if ($annotation->getMethodReturnType() !== null) { - $annotationTypes[] = $annotation->getMethodReturnType(); - } - foreach ($annotation->getMethodTemplateTypes() as $methodTemplateType) { - if ($methodTemplateType->bound !== null) { - $annotationTypes[] = $methodTemplateType->bound; - } - if ($methodTemplateType->default !== null) { - $annotationTypes[] = $methodTemplateType->default; - } - } - foreach ($annotation->getMethodParameters() as $methodParameterAnnotation) { - if ($methodParameterAnnotation->type === null) { - continue; - } - - $annotationTypes[] = $methodParameterAnnotation->type; - } - } elseif ($annotation instanceof TemplateAnnotation) { - if ($annotation->getBound() !== null) { - $annotationTypes[] = $annotation->getBound(); - } - if ($annotation->getDefault() !== null) { - $annotationTypes[] = $annotation->getDefault(); - } - } elseif ($annotation instanceof TypeImportAnnotation) { - $annotationTypes[] = $annotation->getImportedFrom(); - } elseif ($annotation->getType() !== null) { - $annotationTypes[] = $annotation->getType(); + $docCommentOpenPointer = DocCommentHelper::findDocCommentOpenPointer($phpcsFile, $pointer); + if ($docCommentOpenPointer === null) { + return []; } - return $annotationTypes; - } - - /** - * @internal - * @param VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|AssertAnnotation|ParameterOutAnnotation|SelfOutAnnotation $annotation - * @return ConstExprNode[] - */ - public static function getAnnotationConstantExpressions(Annotation $annotation): array - { - $constantExpressions = []; + return SniffLocalCache::getAndSetIfNotCached( + $phpcsFile, + sprintf('annotations-%d-%s', $docCommentOpenPointer, $name ?? 'all'), + static function () use ($phpcsFile, $docCommentOpenPointer, $name): array { + $annotations = []; - if ($annotation instanceof MethodAnnotation) { - foreach ($annotation->getMethodParameters() as $methodParameterAnnotation) { - if ($methodParameterAnnotation->defaultValue === null) { - continue; + if ($name !== null) { + foreach (self::getAnnotations($phpcsFile, $docCommentOpenPointer) as $annotation) { + if ($annotation->getName() === $name) { + $annotations[] = $annotation; + } + } + } else { + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); + + if ($parsedDocComment !== null) { + foreach ($parsedDocComment->getNode()->getTags() as $node) { + $annotationStartPointer = $parsedDocComment->getNodeStartPointer($phpcsFile, $node); + $annotations[] = new Annotation( + $node, + $annotationStartPointer, + $parsedDocComment->getNodeEndPointer($phpcsFile, $node, $annotationStartPointer) + ); + } + } } - $constantExpressions[] = $methodParameterAnnotation->defaultValue; - } - } - - foreach (self::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getConstantTypeNodes($annotationType) as $constTypeNode) { - $constantExpressions[] = $constTypeNode->constExpr; + return $annotations; } - } - - return $constantExpressions; - } - - /** - * @internal - * @param VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|AssertAnnotation|ParameterOutAnnotation|SelfOutAnnotation $annotation - */ - public static function fixAnnotationType(File $phpcsFile, Annotation $annotation, TypeNode $typeNode, TypeNode $fixedTypeNode): string - { - $fixedAnnotation = self::fixAnnotation($annotation, $typeNode, $fixedTypeNode); - - return self::fix($phpcsFile, $annotation, $fixedAnnotation); + ); } /** - * @internal - * @param VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|AssertAnnotation|ParameterOutAnnotation|SelfOutAnnotation $annotation + * @param class-string $type + * @return list */ - public static function fixAnnotationConstantFetchNode( - File $phpcsFile, - Annotation $annotation, - ConstFetchNode $node, - ConstFetchNode $fixedNode - ): string + public static function getAnnotationNodesByType(Node $node, string $type): array { - if ($annotation instanceof MethodAnnotation) { - $fixedContentNode = clone $annotation->getContentNode(); - - foreach ($fixedContentNode->parameters as $parameterNo => $parameterNode) { - if ($parameterNode->defaultValue === null) { - continue; - } - - $fixedContentNode->parameters[$parameterNo] = clone $parameterNode; - $fixedContentNode->parameters[$parameterNo]->defaultValue = AnnotationConstantExpressionHelper::change( - $parameterNode->defaultValue, - $node, - $fixedNode - ); - } - - $fixedAnnotation = new MethodAnnotation( - $annotation->getName(), - $annotation->getStartPointer(), - $annotation->getEndPointer(), - $annotation->getContent(), - $fixedContentNode - ); - } else { - $fixedAnnotation = $annotation; - - foreach (self::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getConstantTypeNodes($annotationType) as $constTypeNode) { - foreach (AnnotationConstantExpressionHelper::getConstantFetchNodes($constTypeNode->constExpr) as $constFetchNode) { - if ($constFetchNode !== $node) { - continue; + static $visitor; + static $traverser; + + if ($visitor === null) { + $visitor = new class extends AbstractNodeVisitor { + + /** @var class-string */ + private $type; + + /** @var list */ + private $nodes = []; + + /** @var list */ + private $nodesToIgnore = []; + + /** + * @return Node|list|NodeTraverser::*|null + */ + public function enterNode(Node $node) + { + if ($this->type === IdentifierTypeNode::class) { + if ($node instanceof ArrayShapeItemNode || $node instanceof ObjectShapeItemNode) { + $this->nodesToIgnore[] = $node->keyName; + } elseif ($node instanceof DoctrineArgument) { + $this->nodesToIgnore[] = $node->key; } - - $fixedConstTypeNode = new ConstTypeNode( - AnnotationConstantExpressionHelper::change($constTypeNode->constExpr, $node, $fixedNode) - ); - $fixedAnnotation = self::fixAnnotation($annotation, $constTypeNode, $fixedConstTypeNode); - break 3; } - } - } - } - - return self::fix($phpcsFile, $annotation, $fixedAnnotation); - } - - /** - * @return (VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|AssertAnnotation|GenericAnnotation|ParameterOutAnnotation|SelfOutAnnotation)[] - */ - public static function getAnnotationsByName(File $phpcsFile, int $pointer, string $annotationName): array - { - $annotations = self::getAnnotations($phpcsFile, $pointer); - - return $annotations[$annotationName] ?? []; - } - - /** - * @return (VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|AssertAnnotation|GenericAnnotation|ParameterOutAnnotation|SelfOutAnnotation)[][] - */ - public static function getAnnotations(File $phpcsFile, int $pointer): array - { - return SniffLocalCache::getAndSetIfNotCached( - $phpcsFile, - sprintf('annotations-%d', $pointer), - static function () use ($phpcsFile, $pointer): array { - $annotations = []; - - $docCommentOpenToken = DocCommentHelper::findDocCommentOpenPointer($phpcsFile, $pointer); - if ($docCommentOpenToken === null) { - return $annotations; - } - $annotationNameCodes = array_merge([T_DOC_COMMENT_TAG], Tokens::$phpcsCommentTokens); - - $tokens = $phpcsFile->getTokens(); - $i = $docCommentOpenToken + 1; - while ($i < $tokens[$docCommentOpenToken]['comment_closer']) { - if (!in_array($tokens[$i]['code'], $annotationNameCodes, true)) { - $i++; - continue; + if ($node instanceof $this->type && !in_array($node, $this->nodesToIgnore, true)) { + $this->nodes[] = $node; } - $annotationStartPointer = $i; - $annotationEndPointer = $i; - - // Fix for wrong PHPCS parsing - $parenthesesLevel = max((int) preg_match_all('~[({]~', $tokens[$i]['content']) - (int) preg_match_all( - '~[)}]~', - $tokens[$i]['content'] - ), 0); + return null; + } - $annotationCode = $tokens[$i]['content']; + /** + * @param class-string $type + */ + public function setType(string $type): void + { + $this->type = $type; + } - for ($j = $i + 1; $j <= $tokens[$docCommentOpenToken]['comment_closer']; $j++) { - if ($tokens[$j]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - $i = $j; - break; - } + public function clean(): void + { + $this->nodes = []; + $this->nodesToIgnore = []; + } - if (in_array($tokens[$j]['code'], $annotationNameCodes, true) && $parenthesesLevel === 0) { - $i = $j; - break; - } + /** + * @return list + */ + public function getNodes(): array + { + return $this->nodes; + } - if ($tokens[$j]['code'] === T_DOC_COMMENT_STAR) { - continue; - } + }; + } - if (in_array($tokens[$j]['code'], array_merge([T_DOC_COMMENT_STRING], $annotationNameCodes), true)) { - $annotationEndPointer = $j; - } elseif ($tokens[$j]['code'] === T_DOC_COMMENT_WHITESPACE) { - if (array_key_exists($j - 1, $tokens) && $tokens[$j - 1]['code'] === T_DOC_COMMENT_STAR) { - continue; - } - if (array_key_exists($j + 1, $tokens) && $tokens[$j + 1]['code'] === T_DOC_COMMENT_STAR) { - continue; - } - } + if ($traverser === null) { + $traverser = new NodeTraverser([$visitor]); + } - $parenthesesLevel += (int) preg_match_all('~[({]~', $tokens[$j]['content']) - (int) preg_match_all( - '~[)}]~', - $tokens[$j]['content'] - ); - if ($parenthesesLevel < 0) { - $parenthesesLevel = 0; - } + $visitor->setType($type); + $visitor->clean(); - $annotationCode .= $tokens[$j]['content']; - } + $traverser->traverse([$node]); - $annotationName = $tokens[$annotationStartPointer]['content']; - $annotationParameters = null; - $annotationContent = null; - if (preg_match('~^(@[-a-zA-Z\\\\:]+)(?:\((.*)\))?(?:\\s+(.+))?(,|$)~s', trim($annotationCode), $matches) !== 0) { - $annotationName = $matches[1]; - $annotationParameters = trim($matches[2]); - if ($annotationParameters === '') { - $annotationParameters = null; - } - $annotationContent = trim($matches[3]); - if ($annotationContent === '') { - $annotationContent = null; - } - } - - if (array_key_exists($annotationName, self::MAPPING)) { - $className = self::MAPPING[$annotationName]; - - $parsedContent = null; - if ($annotationContent !== null) { - $parsedContent = self::parseAnnotationContent($annotationName, $annotationContent); - if ($parsedContent instanceof InvalidTagValueNode) { - $parsedContent = null; - } - } + return $visitor->getNodes(); + } - $annotation = new $className($annotationName, $annotationStartPointer, $annotationEndPointer, $annotationContent, $parsedContent); - } else { - $annotation = new GenericAnnotation( - $annotationName, - $annotationStartPointer, - $annotationEndPointer, - $annotationParameters, - $annotationContent - ); - } + public static function fixAnnotation( + ParsedDocComment $parsedDocComment, + Annotation $annotation, + Node $nodeToFix, + Node $fixedNode + ): string + { + $originalNode = $annotation->getNode(); - $annotations[$annotationName][] = $annotation; - } + /** @var PhpDocNode $newPhpDocNode */ + $newPhpDocNode = PhpDocParserHelper::cloneNode($parsedDocComment->getNode()); - return $annotations; + foreach ($newPhpDocNode->getTags() as $node) { + if ($node->getAttribute(Attribute::ORIGINAL_NODE) === $originalNode) { + self::changeAnnotationNode($node, $nodeToFix, $fixedNode); + break; } + } + + return PhpDocParserHelper::getPrinter()->printFormatPreserving( + $newPhpDocNode, + $parsedDocComment->getNode(), + $parsedDocComment->getTokens() ); } /** - * @param ReturnAnnotation|ParameterAnnotation|VariableAnnotation $annotation * @param array $traversableTypeHints */ public static function isAnnotationUseless( @@ -414,15 +201,18 @@ public static function isAnnotationUseless( return false; } - if ($typeHint === null || $annotation->getContent() === null) { + if ($typeHint === null) { return false; } - if ($annotation->hasDescription()) { + /** @var ParamTagValueNode|TypelessParamTagValueNode|ReturnTagValueNode|VarTagValueNode $annotationValue */ + $annotationValue = $annotation->getValue(); + + if ($annotationValue->description !== '') { return false; } - if ($annotation->getType() === null) { + if ($annotationValue instanceof TypelessParamTagValueNode) { return true; } @@ -433,28 +223,30 @@ public static function isAnnotationUseless( return false; } - if (AnnotationTypeHelper::containsStaticOrThisType($annotation->getType())) { + $annotationType = $annotationValue->type; + + if (AnnotationTypeHelper::containsStaticOrThisType($annotationType)) { return false; } if ( - AnnotationTypeHelper::containsJustTwoTypes($annotation->getType()) + AnnotationTypeHelper::containsJustTwoTypes($annotationType) || ( $enableUnionTypeHint && ( - $annotation->getType() instanceof UnionTypeNode + $annotationType instanceof UnionTypeNode || ( - $annotation->getType() instanceof IdentifierTypeNode - && TypeHintHelper::isUnofficialUnionTypeHint($annotation->getType()->name) + $annotationType instanceof IdentifierTypeNode + && TypeHintHelper::isUnofficialUnionTypeHint($annotationType->name) ) ) ) || ( $enableIntersectionTypeHint - && $annotation->getType() instanceof IntersectionTypeNode + && $annotationType instanceof IntersectionTypeNode ) ) { - $annotationTypeHint = AnnotationTypeHelper::export($annotation->getType()); + $annotationTypeHint = AnnotationTypeHelper::print($annotationType); return TypeHintHelper::typeHintEqualsAnnotation( $phpcsFile, $functionPointer, @@ -463,32 +255,33 @@ public static function isAnnotationUseless( ); } - if ($annotation->getType() instanceof ConstTypeNode) { + if ($annotationType instanceof ObjectShapeNode) { return false; } - if ($annotation->getType() instanceof GenericTypeNode) { + if ($annotationType instanceof ConstTypeNode) { return false; } - if ($annotation->getType() instanceof CallableTypeNode) { + if ($annotationType instanceof GenericTypeNode) { return false; } - if ($annotation->getType() instanceof ConditionalTypeNode) { + if ($annotationType instanceof CallableTypeNode) { return false; } - if ($annotation->getType() instanceof ConditionalTypeForParameterNode) { + if ($annotationType instanceof ConditionalTypeNode) { return false; } - /** @var GenericTypeNode|IdentifierTypeNode|ThisTypeNode $annotationTypeNode */ - $annotationTypeNode = $annotation->getType(); + if ($annotationType instanceof ConditionalTypeForParameterNode) { + return false; + } - if ($annotationTypeNode instanceof IdentifierTypeNode) { + if ($annotationType instanceof IdentifierTypeNode) { if (in_array( - strtolower($annotationTypeNode->name), + strtolower($annotationType->name), ['true', 'false', 'null'], true )) { @@ -496,7 +289,7 @@ public static function isAnnotationUseless( } if (in_array( - strtolower($annotationTypeNode->name), + strtolower($annotationType->name), ['class-string', 'trait-string', 'callable-string', 'numeric-string', 'non-empty-string', 'non-falsy-string', 'literal-string', 'positive-int', 'negative-int'], true )) { @@ -504,7 +297,7 @@ public static function isAnnotationUseless( } } - $annotationTypeHint = AnnotationTypeHelper::getTypeHintFromOneType($annotationTypeNode); + $annotationTypeHint = AnnotationTypeHelper::getTypeHintFromOneType($annotationType); return TypeHintHelper::typeHintEqualsAnnotation( $phpcsFile, $functionPointer, @@ -513,131 +306,55 @@ public static function isAnnotationUseless( ); } - /** - * @param VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|TemplateAnnotation|ExtendsAnnotation|ImplementsAnnotation|UseAnnotation|MixinAnnotation|TypeAliasAnnotation|TypeImportAnnotation|AssertAnnotation|ParameterOutAnnotation|SelfOutAnnotation $annotation - */ - private static function fixAnnotation(Annotation $annotation, TypeNode $typeNode, TypeNode $fixedTypeNode): Annotation + private static function changeAnnotationNode(PhpDocTagNode $tagNode, Node $nodeToChange, Node $changedNode): PhpDocTagNode { - if ($annotation instanceof MethodAnnotation) { - $fixedContentNode = clone $annotation->getContentNode(); + static $visitor; + static $traverser; - if ($fixedContentNode->returnType !== null) { - $fixedContentNode->returnType = AnnotationTypeHelper::change($fixedContentNode->returnType, $typeNode, $fixedTypeNode); - } - foreach ($fixedContentNode->templateTypes as $templateTypeNo => $templateTypeNode) { - $fixedContentNode->templateTypes[$templateTypeNo] = self::fixTemplateTagValueNode( - $templateTypeNode, - $typeNode, - $fixedTypeNode - ); - } - foreach ($fixedContentNode->parameters as $parameterNo => $parameterNode) { - if ($parameterNode->type === null) { - continue; - } + if ($visitor === null) { + $visitor = new class extends AbstractNodeVisitor { - $fixedContentNode->parameters[$parameterNo] = clone $parameterNode; - $fixedContentNode->parameters[$parameterNo]->type = AnnotationTypeHelper::change( - $parameterNode->type, - $typeNode, - $fixedTypeNode - ); - } - } elseif ($annotation instanceof TemplateAnnotation) { - $fixedContentNode = self::fixTemplateTagValueNode($annotation->getContentNode(), $typeNode, $fixedTypeNode); - } elseif ($annotation instanceof TypeImportAnnotation) { - $fixedContentNode = clone $annotation->getContentNode(); - /** @var IdentifierTypeNode $fixedType */ - $fixedType = AnnotationTypeHelper::change($annotation->getImportedFrom(), $typeNode, $fixedTypeNode); - $fixedContentNode->importedFrom = $fixedType; - } elseif ( - $annotation instanceof ExtendsAnnotation - || $annotation instanceof ImplementsAnnotation - || $annotation instanceof UseAnnotation - ) { - $fixedContentNode = clone $annotation->getContentNode(); - /** @var GenericTypeNode $fixedType */ - $fixedType = AnnotationTypeHelper::change($annotation->getType(), $typeNode, $fixedTypeNode); - $fixedContentNode->type = $fixedType; - } else { - $fixedContentNode = clone $annotation->getContentNode(); - $fixedContentNode->type = AnnotationTypeHelper::change($annotation->getType(), $typeNode, $fixedTypeNode); - } + /** @var Node */ + private $nodeToChange; - $annotationClassName = get_class($annotation); + /** @var Node */ + private $changedNode; - return new $annotationClassName( - $annotation->getName(), - $annotation->getStartPointer(), - $annotation->getEndPointer(), - $annotation->getContent(), - $fixedContentNode - ); - } + /** + * @return Node|list|NodeTraverser::*|null + */ + public function enterNode(Node $node) + { + if ($node->getAttribute(Attribute::ORIGINAL_NODE) === $this->nodeToChange) { + return $this->changedNode; + } - private static function fixTemplateTagValueNode( - TemplateTagValueNode $node, - TypeNode $typeNode, - TypeNode $fixedTypeNode - ): TemplateTagValueNode - { - $fixedNode = clone $node; + return null; + } - if ($fixedNode->bound !== null) { - $fixedNode->bound = AnnotationTypeHelper::change($node->bound, $typeNode, $fixedTypeNode); - } - if ($fixedNode->default !== null) { - $fixedNode->default = AnnotationTypeHelper::change($node->default, $typeNode, $fixedTypeNode); - } + public function setNodeToChange(Node $nodeToChange): void + { + $this->nodeToChange = $nodeToChange; + } - return $fixedNode; - } + public function setChangedNode(Node $changedNode): void + { + $this->changedNode = $changedNode; + } - private static function fix(File $phpcsFile, Annotation $annotation, Annotation $fixedAnnotation): string - { - $spaceAfterContent = ''; - if (preg_match( - '~(\\s+)$~', - TokenHelper::getContent($phpcsFile, $annotation->getStartPointer(), $annotation->getEndPointer()), - $matches - ) > 0) { - $spaceAfterContent = $matches[1]; + }; } - $fixedAnnotationContent = $fixedAnnotation->export() . $spaceAfterContent; - - return preg_replace('~(\r\n|\n|\r)~', '\1 * ', $fixedAnnotationContent); - } - - private static function parseAnnotationContent(string $annotationName, string $annotationContent): PhpDocTagValueNode - { - $annotationContentWithoutNewLines = preg_replace('~[\r\n]~', ' ', $annotationContent); - - $tokens = new TokenIterator(self::getPhpDocLexer()->tokenize($annotationContentWithoutNewLines)); - return self::getPhpDocParser()->parseTagValue($tokens, $annotationName); - } - - private static function getPhpDocLexer(): Lexer - { - static $phpDocLexer; - - if ($phpDocLexer === null) { - $phpDocLexer = new Lexer(); + if ($traverser === null) { + $traverser = new NodeTraverser([$visitor]); } - return $phpDocLexer; - } - - private static function getPhpDocParser(): PhpDocParser - { - static $phpDocParser; + $visitor->setNodeToChange($nodeToChange); + $visitor->setChangedNode($changedNode); - if ($phpDocParser === null) { - $constantExpressionParser = new ConstExprParser(); - $phpDocParser = new PhpDocParser(new TypeParser($constantExpressionParser), $constantExpressionParser); - } + [$changedTagNode] = $traverser->traverse([$tagNode]); - return $phpDocParser; + return $changedTagNode; } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php index f85294153..058c5b33e 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/AnnotationTypeHelper.php @@ -6,11 +6,9 @@ use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprFloatNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprStringNode; -use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; -use PHPStan\PhpDocParser\Ast\Type\CallableTypeParameterNode; use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeForParameterNode; use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeNode; use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; @@ -18,17 +16,13 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; -use PHPStan\PhpDocParser\Ast\Type\OffsetAccessTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeNode; use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use function array_merge; use function count; use function in_array; -use function preg_replace; -use function sprintf; use function strtolower; -use function substr; /** * @internal @@ -36,454 +30,9 @@ class AnnotationTypeHelper { - /** - * @return IdentifierTypeNode[]|ThisTypeNode[] - */ - public static function getIdentifierTypeNodes(TypeNode $typeNode): array - { - if ($typeNode instanceof ArrayTypeNode) { - return self::getIdentifierTypeNodes($typeNode->type); - } - - if ($typeNode instanceof ArrayShapeNode) { - $identifierTypeNodes = []; - foreach ($typeNode->items as $arrayShapeItemNode) { - $identifierTypeNodes = array_merge($identifierTypeNodes, self::getIdentifierTypeNodes($arrayShapeItemNode->valueType)); - } - return $identifierTypeNodes; - } - - if ( - $typeNode instanceof UnionTypeNode - || $typeNode instanceof IntersectionTypeNode - ) { - $identifierTypeNodes = []; - foreach ($typeNode->types as $innerTypeNode) { - $identifierTypeNodes = array_merge($identifierTypeNodes, self::getIdentifierTypeNodes($innerTypeNode)); - } - return $identifierTypeNodes; - } - - if ($typeNode instanceof GenericTypeNode) { - $identifierTypeNodes = self::getIdentifierTypeNodes($typeNode->type); - foreach ($typeNode->genericTypes as $innerTypeNode) { - $identifierTypeNodes = array_merge($identifierTypeNodes, self::getIdentifierTypeNodes($innerTypeNode)); - } - return $identifierTypeNodes; - } - - if ($typeNode instanceof NullableTypeNode) { - return self::getIdentifierTypeNodes($typeNode->type); - } - - if ($typeNode instanceof CallableTypeNode) { - $identifierTypeNodes = array_merge([$typeNode->identifier], self::getIdentifierTypeNodes($typeNode->returnType)); - foreach ($typeNode->parameters as $callableParameterNode) { - $identifierTypeNodes = array_merge($identifierTypeNodes, self::getIdentifierTypeNodes($callableParameterNode->type)); - } - return $identifierTypeNodes; - } - - if ($typeNode instanceof ConstTypeNode) { - return []; - } - - if ($typeNode instanceof ConditionalTypeNode) { - return array_merge( - self::getIdentifierTypeNodes($typeNode->subjectType), - self::getIdentifierTypeNodes($typeNode->targetType), - self::getIdentifierTypeNodes($typeNode->if), - self::getIdentifierTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof ConditionalTypeForParameterNode) { - return array_merge( - self::getIdentifierTypeNodes($typeNode->targetType), - self::getIdentifierTypeNodes($typeNode->if), - self::getIdentifierTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof OffsetAccessTypeNode) { - return array_merge( - self::getIdentifierTypeNodes($typeNode->type), - self::getIdentifierTypeNodes($typeNode->offset) - ); - } - - /** @var IdentifierTypeNode|ThisTypeNode $typeNode */ - $typeNode = $typeNode; - return [$typeNode]; - } - - /** - * @return ConstTypeNode[] - */ - public static function getConstantTypeNodes(TypeNode $typeNode): array - { - if ($typeNode instanceof ArrayTypeNode) { - return self::getConstantTypeNodes($typeNode->type); - } - - if ($typeNode instanceof ArrayShapeNode) { - $constTypeNodes = []; - foreach ($typeNode->items as $arrayShapeItemNode) { - $constTypeNodes = array_merge($constTypeNodes, self::getConstantTypeNodes($arrayShapeItemNode->valueType)); - } - return $constTypeNodes; - } - - if ( - $typeNode instanceof UnionTypeNode - || $typeNode instanceof IntersectionTypeNode - ) { - $constTypeNodes = []; - foreach ($typeNode->types as $innerTypeNode) { - $constTypeNodes = array_merge($constTypeNodes, self::getConstantTypeNodes($innerTypeNode)); - } - return $constTypeNodes; - } - - if ($typeNode instanceof GenericTypeNode) { - $constTypeNodes = []; - foreach ($typeNode->genericTypes as $innerTypeNode) { - $constTypeNodes = array_merge($constTypeNodes, self::getConstantTypeNodes($innerTypeNode)); - } - return $constTypeNodes; - } - - if ($typeNode instanceof NullableTypeNode) { - return self::getConstantTypeNodes($typeNode->type); - } - - if ($typeNode instanceof CallableTypeNode) { - $constTypeNodes = self::getConstantTypeNodes($typeNode->returnType); - foreach ($typeNode->parameters as $callableParameterNode) { - $constTypeNodes = array_merge($constTypeNodes, self::getConstantTypeNodes($callableParameterNode->type)); - } - return $constTypeNodes; - } - - if ($typeNode instanceof ConditionalTypeNode) { - return array_merge( - self::getConstantTypeNodes($typeNode->subjectType), - self::getConstantTypeNodes($typeNode->targetType), - self::getConstantTypeNodes($typeNode->if), - self::getConstantTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof ConditionalTypeForParameterNode) { - return array_merge( - self::getConstantTypeNodes($typeNode->targetType), - self::getConstantTypeNodes($typeNode->if), - self::getConstantTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof OffsetAccessTypeNode) { - return array_merge( - self::getConstantTypeNodes($typeNode->type), - self::getConstantTypeNodes($typeNode->offset) - ); - } - - if (!$typeNode instanceof ConstTypeNode) { - return []; - } - - return [$typeNode]; - } - - /** - * @return UnionTypeNode[] - */ - public static function getUnionTypeNodes(TypeNode $typeNode): array - { - if ($typeNode instanceof UnionTypeNode) { - return [$typeNode]; - } - - if ($typeNode instanceof NullableTypeNode) { - return self::getUnionTypeNodes($typeNode->type); - } - - if ($typeNode instanceof ArrayTypeNode) { - return self::getUnionTypeNodes($typeNode->type); - } - - if ($typeNode instanceof ArrayShapeNode) { - $unionTypeNodes = []; - foreach ($typeNode->items as $arrayShapeItemNode) { - $unionTypeNodes = array_merge($unionTypeNodes, self::getUnionTypeNodes($arrayShapeItemNode->valueType)); - } - return $unionTypeNodes; - } - - if ($typeNode instanceof IntersectionTypeNode) { - $unionTypeNodes = []; - foreach ($typeNode->types as $innerTypeNode) { - $unionTypeNodes = array_merge($unionTypeNodes, self::getUnionTypeNodes($innerTypeNode)); - } - return $unionTypeNodes; - } - - if ($typeNode instanceof GenericTypeNode) { - $unionTypeNodes = []; - foreach ($typeNode->genericTypes as $innerTypeNode) { - $unionTypeNodes = array_merge($unionTypeNodes, self::getUnionTypeNodes($innerTypeNode)); - } - return $unionTypeNodes; - } - - if ($typeNode instanceof CallableTypeNode) { - $unionTypeNodes = self::getUnionTypeNodes($typeNode->returnType); - foreach ($typeNode->parameters as $callableParameterNode) { - $unionTypeNodes = array_merge($unionTypeNodes, self::getUnionTypeNodes($callableParameterNode->type)); - } - return $unionTypeNodes; - } - - if ($typeNode instanceof ConditionalTypeNode) { - return array_merge( - self::getUnionTypeNodes($typeNode->subjectType), - self::getUnionTypeNodes($typeNode->targetType), - self::getUnionTypeNodes($typeNode->if), - self::getUnionTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof ConditionalTypeForParameterNode) { - return array_merge( - self::getUnionTypeNodes($typeNode->targetType), - self::getUnionTypeNodes($typeNode->if), - self::getUnionTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof OffsetAccessTypeNode) { - return array_merge( - self::getUnionTypeNodes($typeNode->type), - self::getUnionTypeNodes($typeNode->offset) - ); - } - - return []; - } - - /** - * @return ArrayTypeNode[] - */ - public static function getArrayTypeNodes(TypeNode $typeNode): array - { - if ($typeNode instanceof ArrayTypeNode) { - return array_merge([$typeNode], self::getArrayTypeNodes($typeNode->type)); - } - - if ($typeNode instanceof ArrayShapeNode) { - $arrayTypeNodes = []; - foreach ($typeNode->items as $arrayShapeItemNode) { - $arrayTypeNodes = array_merge($arrayTypeNodes, self::getArrayTypeNodes($arrayShapeItemNode->valueType)); - } - return $arrayTypeNodes; - } - - if ($typeNode instanceof NullableTypeNode) { - return self::getArrayTypeNodes($typeNode->type); - } - - if ( - $typeNode instanceof UnionTypeNode - || $typeNode instanceof IntersectionTypeNode - ) { - $arrayTypeNodes = []; - foreach ($typeNode->types as $innerTypeNode) { - $arrayTypeNodes = array_merge($arrayTypeNodes, self::getArrayTypeNodes($innerTypeNode)); - } - return $arrayTypeNodes; - } - - if ($typeNode instanceof GenericTypeNode) { - $arrayTypeNodes = []; - foreach ($typeNode->genericTypes as $innerTypeNode) { - $arrayTypeNodes = array_merge($arrayTypeNodes, self::getArrayTypeNodes($innerTypeNode)); - } - return $arrayTypeNodes; - } - - if ($typeNode instanceof CallableTypeNode) { - $arrayTypeNodes = self::getArrayTypeNodes($typeNode->returnType); - foreach ($typeNode->parameters as $callableParameterNode) { - $arrayTypeNodes = array_merge($arrayTypeNodes, self::getArrayTypeNodes($callableParameterNode->type)); - } - return $arrayTypeNodes; - } - - if ($typeNode instanceof ConditionalTypeNode) { - return array_merge( - self::getArrayTypeNodes($typeNode->subjectType), - self::getArrayTypeNodes($typeNode->targetType), - self::getArrayTypeNodes($typeNode->if), - self::getArrayTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof ConditionalTypeForParameterNode) { - return array_merge( - self::getArrayTypeNodes($typeNode->targetType), - self::getArrayTypeNodes($typeNode->if), - self::getArrayTypeNodes($typeNode->else) - ); - } - - if ($typeNode instanceof OffsetAccessTypeNode) { - return array_merge( - self::getArrayTypeNodes($typeNode->type), - self::getArrayTypeNodes($typeNode->offset) - ); - } - - return []; - } - - /** - * @param IdentifierTypeNode|ThisTypeNode $typeNode - */ - public static function getTypeHintFromNode(TypeNode $typeNode): string - { - return $typeNode instanceof ThisTypeNode - ? (string) $typeNode - : $typeNode->name; - } - - public static function export(TypeNode $typeNode): string - { - $exportedTypeNode = (string) preg_replace(['~\\s*([&|])\\s*~'], '\\1', (string) $typeNode); - - if ( - $typeNode instanceof UnionTypeNode - || $typeNode instanceof IntersectionTypeNode - ) { - $exportedTypeNode = substr($exportedTypeNode, 1, -1); - } - - if ($typeNode instanceof ArrayTypeNode && $typeNode->type instanceof CallableTypeNode) { - $exportedTypeNode = sprintf('(%s)[]', substr($exportedTypeNode, 0, -2)); - } - - return $exportedTypeNode; - } - - public static function change(TypeNode $masterTypeNode, TypeNode $typeNodeToChange, TypeNode $changedTypeNode): TypeNode + public static function print(TypeNode $typeNode): string { - if ($masterTypeNode === $typeNodeToChange) { - return $changedTypeNode; - } - - if ($masterTypeNode instanceof UnionTypeNode) { - $types = []; - foreach ($masterTypeNode->types as $typeNone) { - $types[] = self::change($typeNone, $typeNodeToChange, $changedTypeNode); - } - - return new UnionTypeNode($types); - } - - if ($masterTypeNode instanceof IntersectionTypeNode) { - $types = []; - foreach ($masterTypeNode->types as $typeNone) { - $types[] = self::change($typeNone, $typeNodeToChange, $changedTypeNode); - } - - return new IntersectionTypeNode($types); - } - - if ($masterTypeNode instanceof GenericTypeNode) { - $genericTypes = []; - foreach ($masterTypeNode->genericTypes as $genericTypeNode) { - $genericTypes[] = self::change($genericTypeNode, $typeNodeToChange, $changedTypeNode); - } - - /** @var IdentifierTypeNode $identificatorTypeNode */ - $identificatorTypeNode = self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode); - return new GenericTypeNode($identificatorTypeNode, $genericTypes, $masterTypeNode->variances); - } - - if ($masterTypeNode instanceof ArrayTypeNode) { - return new ArrayTypeNode(self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode)); - } - - if ($masterTypeNode instanceof ArrayShapeNode) { - $arrayShapeItemNodes = []; - foreach ($masterTypeNode->items as $arrayShapeItemNode) { - $arrayShapeItemNodes[] = self::change($arrayShapeItemNode, $typeNodeToChange, $changedTypeNode); - } - - return new ArrayShapeNode($arrayShapeItemNodes, $masterTypeNode->sealed, $masterTypeNode->kind); - } - - if ($masterTypeNode instanceof ArrayShapeItemNode) { - return new ArrayShapeItemNode( - $masterTypeNode->keyName, - $masterTypeNode->optional, - self::change($masterTypeNode->valueType, $typeNodeToChange, $changedTypeNode) - ); - } - - if ($masterTypeNode instanceof NullableTypeNode) { - return new NullableTypeNode(self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode)); - } - - if ($masterTypeNode instanceof CallableTypeNode) { - $callableParameters = []; - foreach ($masterTypeNode->parameters as $parameterTypeNode) { - $callableParameters[] = new CallableTypeParameterNode( - self::change($parameterTypeNode->type, $typeNodeToChange, $changedTypeNode), - $parameterTypeNode->isReference, - $parameterTypeNode->isVariadic, - $parameterTypeNode->parameterName, - $parameterTypeNode->isOptional - ); - } - - /** @var IdentifierTypeNode $identificatorTypeNode */ - $identificatorTypeNode = self::change($masterTypeNode->identifier, $typeNodeToChange, $changedTypeNode); - return new CallableTypeNode( - $identificatorTypeNode, - $callableParameters, - self::change($masterTypeNode->returnType, $typeNodeToChange, $changedTypeNode) - ); - } - - if ($masterTypeNode instanceof ConditionalTypeNode) { - return new ConditionalTypeNode( - self::change($masterTypeNode->subjectType, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->targetType, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->if, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->else, $typeNodeToChange, $changedTypeNode), - $masterTypeNode->negated - ); - } - - if ($masterTypeNode instanceof ConditionalTypeForParameterNode) { - return new ConditionalTypeForParameterNode( - $masterTypeNode->parameterName, - self::change($masterTypeNode->targetType, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->if, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->else, $typeNodeToChange, $changedTypeNode), - $masterTypeNode->negated - ); - } - - if ($masterTypeNode instanceof OffsetAccessTypeNode) { - return new OffsetAccessTypeNode( - self::change($masterTypeNode->type, $typeNodeToChange, $changedTypeNode), - self::change($masterTypeNode->offset, $typeNodeToChange, $changedTypeNode) - ); - } - - return clone $masterTypeNode; + return PhpDocParserHelper::getPrinter()->print($typeNode); } public static function containsStaticOrThisType(TypeNode $typeNode): bool @@ -528,6 +77,10 @@ public static function containsOneType(TypeNode $typeNode): bool return true; } + if ($typeNode instanceof ObjectShapeNode) { + return true; + } + if ($typeNode instanceof ArrayShapeNode) { return true; } @@ -578,6 +131,10 @@ public static function containsTraversableType(TypeNode $typeNode, File $phpcsFi return true; } + if ($typeNode instanceof ObjectShapeNode) { + return false; + } + if ($typeNode instanceof ArrayShapeNode) { return true; } @@ -721,9 +278,6 @@ public static function containsItemsSpecificationForTraversable( return false; } - /** - * @param CallableTypeNode|GenericTypeNode|IdentifierTypeNode|ThisTypeNode|ArrayTypeNode|ArrayShapeNode|ConstTypeNode $typeNode - */ public static function getTypeHintFromOneType( TypeNode $typeNode, bool $enableUnionTypeHint = false, @@ -776,6 +330,10 @@ public static function getTypeHintFromOneType( return 'array'; } + if ($typeNode instanceof ObjectShapeNode) { + return 'object'; + } + if ($typeNode instanceof ConstTypeNode) { if ($typeNode->constExpr instanceof ConstExprIntegerNode) { return 'int'; @@ -796,7 +354,7 @@ public static function getTypeHintFromOneType( /** * @param UnionTypeNode|IntersectionTypeNode $typeNode * @param array $traversableTypeHints - * @return string[] + * @return list */ public static function getTraversableTypeHintsFromType( TypeNode $typeNode, diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayHelper.php index e2def8962..8bf354b48 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayHelper.php @@ -3,17 +3,13 @@ namespace SlevomatCodingStandard\Helpers; use PHP_CodeSniffer\Files\File; +use function array_key_exists; use function arsort; -use function end; use function in_array; use function key; -use function min; -use function strlen; use function strnatcasecmp; -use function strpos; use const T_COMMA; use const T_OPEN_SHORT_ARRAY; -use const T_WHITESPACE; /** * @internal @@ -21,95 +17,75 @@ class ArrayHelper { - /** @var array|int|string>> */ - protected static $tokens; - /** - * @return ArrayKeyValue[] + * @return list */ - public static function parse(File $phpcsFile, int $pointer): array + public static function parse(File $phpcsFile, int $arrayPointer): array { - self::$tokens = $phpcsFile->getTokens(); - $token = self::$tokens[$pointer]; - [$pointerOpener, $pointerCloser] = self::openClosePointers($token); - $tokenOpener = self::$tokens[$pointerOpener]; - $lineIndents = ['']; + $tokens = $phpcsFile->getTokens(); + + $arrayToken = $tokens[$arrayPointer]; + [$arrayOpenerPointer, $arrayCloserPointer] = self::openClosePointers($arrayToken); + $keyValues = []; - $skipUntilPointer = null; - $tokenEnd = null; - $pointer = $pointerOpener + 1; - for (; $pointer < $pointerCloser; $pointer++) { - $token = self::$tokens[$pointer]; - if ($token['line'] > $tokenOpener['line'] || in_array($token['code'], TokenHelper::$ineffectiveTokenCodes, true) === false) { - break; - } - } - $pointerStart = $pointer; - for (; $pointer < $pointerCloser; $pointer++) { - if ($pointer < $skipUntilPointer) { - continue; - } + $firstPointerOnNextLine = TokenHelper::findFirstTokenOnNextLine($phpcsFile, $arrayOpenerPointer + 1); + $firstEffectivePointer = TokenHelper::findNextEffective($phpcsFile, $arrayOpenerPointer + 1); + + $arrayKeyValueStartPointer = $firstPointerOnNextLine !== null && $firstPointerOnNextLine < $firstEffectivePointer + ? $firstPointerOnNextLine + : $firstEffectivePointer; + $arrayKeyValueEndPointer = $arrayKeyValueStartPointer; - $token = self::$tokens[$pointer]; + $indentation = $tokens[$arrayOpenerPointer]['line'] < $tokens[$firstEffectivePointer]['line'] + ? IndentationHelper::getIndentation($phpcsFile, $firstEffectivePointer) + : ''; + + for ($i = $arrayKeyValueStartPointer; $i < $arrayCloserPointer; $i++) { + $token = $tokens[$i]; if (in_array($token['code'], TokenHelper::$arrayTokenCodes, true)) { - $pointerCloserWalk = self::openClosePointers($token)[1]; - $skipUntilPointer = $pointerCloserWalk; + $i = self::openClosePointers($token)[1]; continue; } - if (isset($token['scope_closer']) && $token['scope_closer'] > $pointer) { - $skipUntilPointer = $token['scope_closer']; + + if (array_key_exists('scope_closer', $token) && $token['scope_closer'] > $i) { + $i = $token['scope_closer'] - 1; continue; } - if (isset($token['parenthesis_closer'])) { - $skipUntilPointer = $token['parenthesis_closer']; + + if (array_key_exists('parenthesis_closer', $token) && $token['parenthesis_closer'] > $i) { + $i = $token['parenthesis_closer'] - 1; continue; } - $nextEffective = in_array($token['code'], TokenHelper::$ineffectiveTokenCodes, true) - ? TokenHelper::findNextEffective($phpcsFile, $pointer) - : TokenHelper::findNextEffective($phpcsFile, $pointer + 1); - if ( - isset($lineIndents[$token['line']]) === false - && in_array($token['code'], TokenHelper::$ineffectiveTokenCodes, true) === false - ) { - $firstPointerOnLine = TokenHelper::findFirstTokenOnLine($phpcsFile, $pointer); - $firstEffective = TokenHelper::findNextEffective($phpcsFile, $firstPointerOnLine); - $lineIndents[$token['line']] = TokenHelper::getContent($phpcsFile, $firstPointerOnLine, $firstEffective - 1); - } - $startNewKeyValue = $tokenEnd !== null - ? self::parseTestStartKeyVal($pointer, $tokenEnd, end($lineIndents)) - : false; - if ($startNewKeyValue) { - if ($nextEffective === $pointerCloser && in_array($token['code'], TokenHelper::$ineffectiveTokenCodes, true)) { - // there are no more key/values - $firstPointerOnLine = TokenHelper::findFirstTokenOnLine($phpcsFile, $pointer); - if ($pointer === $firstPointerOnLine) { - // end last key/value on the prev token - $pointer--; - } - break; - } - $startNewKeyValue = false; - $tokenEnd = null; - $keyValues[] = new ArrayKeyValue($phpcsFile, $pointerStart, $pointer - 1); - $pointerStart = $pointer; + $nextEffectivePointer = TokenHelper::findNextEffective($phpcsFile, $i + 1); + + if ($nextEffectivePointer === $arrayCloserPointer) { + $arrayKeyValueEndPointer = self::getValueEndPointer($phpcsFile, $i, $arrayCloserPointer, $indentation); + break; } - if ($token['code'] === T_COMMA || $tokenEnd !== null) { - $tokenEnd = $token; + + if ($token['code'] !== T_COMMA || !ScopeHelper::isInSameScope($phpcsFile, $arrayOpenerPointer, $i)) { + $arrayKeyValueEndPointer = $i; + continue; } + + $arrayKeyValueEndPointer = self::getValueEndPointer($phpcsFile, $i, $arrayCloserPointer, $indentation); + + $keyValues[] = new ArrayKeyValue($phpcsFile, $arrayKeyValueStartPointer, $arrayKeyValueEndPointer); + + $arrayKeyValueStartPointer = $arrayKeyValueEndPointer + 1; + $i = $arrayKeyValueEndPointer; } - $pointer = min($pointer, $pointerCloser - 1); - $keyValues[] = new ArrayKeyValue($phpcsFile, $pointerStart, $pointer); + $keyValues[] = new ArrayKeyValue($phpcsFile, $arrayKeyValueStartPointer, $arrayKeyValueEndPointer); - self::$tokens = []; return $keyValues; } /** - * @param ArrayKeyValue[] $keyValues + * @param list $keyValues */ public static function getIndentation(array $keyValues): ?string { @@ -128,7 +104,7 @@ public static function getIndentation(array $keyValues): ?string } /** - * @param ArrayKeyValue[] $keyValues + * @param list $keyValues */ public static function isKeyed(array $keyValues): bool { @@ -141,12 +117,12 @@ public static function isKeyed(array $keyValues): bool } /** - * @param ArrayKeyValue[] $keyValues + * @param list $keyValues */ public static function isKeyedAll(array $keyValues): bool { foreach ($keyValues as $keyValue) { - if ($keyValue->getKey() === null) { + if (!$keyValue->isUnpacking() && $keyValue->getKey() === null) { return false; } } @@ -164,32 +140,48 @@ public static function isMultiLine(File $phpcsFile, int $pointer): bool $tokenOpener = $tokens[$pointerOpener]; $tokenCloser = $tokens[$pointerCloser]; + return $tokenOpener['line'] !== $tokenCloser['line']; + } + + /** + * Test if effective tokens between open & closing tokens + */ + public static function isNotEmpty(File $phpcsFile, int $pointer): bool + { + $tokens = $phpcsFile->getTokens(); + $token = $tokens[$pointer]; + [$pointerOpener, $pointerCloser] = self::openClosePointers($token); + /** @var int $pointerPreviousToClose */ $pointerPreviousToClose = TokenHelper::findPreviousEffective($phpcsFile, $pointerCloser - 1); - return $tokenOpener['line'] !== $tokenCloser['line'] - && $pointerPreviousToClose !== $pointerOpener; + return $pointerPreviousToClose !== $pointerOpener; } /** - * @param ArrayKeyValue[] $keyValues + * @param list $keyValues */ public static function isSortedByKey(array $keyValues): bool { - $prev = ''; + $previousKey = ''; foreach ($keyValues as $keyValue) { - $cmp = strnatcasecmp((string) $prev, (string) $keyValue->getKey()); - if ($cmp === 1) { + if ($keyValue->isUnpacking()) { + continue; + } + + if (strnatcasecmp($previousKey, $keyValue->getKey()) === 1) { return false; } - $prev = $keyValue->getKey(); + + $previousKey = $keyValue->getKey(); } + return true; } /** * @param array|int|string> $token - * @return int[] + * @return array{0: int, 1: int} */ public static function openClosePointers(array $token): array { @@ -203,45 +195,38 @@ public static function openClosePointers(array $token): array return [(int) $pointerOpener, (int) $pointerCloser]; } - /** - * Test whether we should begin collecting the next key/value tokens - * - * @param array|int|string> $tokenPrev - */ - private static function parseTestStartKeyVal(int $pointer, array $tokenPrev, string $lastIndent): bool + private static function getValueEndPointer(File $phpcsFile, int $endPointer, int $arrayCloserPointer, string $indentation): int { - $token = self::$tokens[$pointer]; - - // token['column'] cannot be relied on if tabs are being used - // this simply checks if indent contains tab and is the same as the prev indent plus additional - $testTabIndent = static function ($indent, $indentPrev) { - return strpos($indent, "\t") !== false - && strpos($indent, $indentPrev) === 0 - && strlen($indent) > strlen($indentPrev); - }; - - $startNew = true; - - if ( - in_array($token['code'], TokenHelper::$ineffectiveTokenCodes, true) - && $token['line'] === $tokenPrev['line'] - ) { - // we're whitespace or comment after the value... - $startNew = false; - } elseif ( - $token['code'] === T_WHITESPACE - && in_array($tokenPrev['code'], TokenHelper::$inlineCommentTokenCodes, true) - && in_array(self::$tokens[$pointer + 1]['code'], TokenHelper::$inlineCommentTokenCodes, true) - && (self::$tokens[$pointer + 1]['column'] >= $tokenPrev['column'] - || $testTabIndent($token['content'], $lastIndent) - ) - ) { - // 'key' => 'value' // tokenPrev is this comment - // // we're in the preceeding whitespace - $startNew = false; + $tokens = $phpcsFile->getTokens(); + + $nextEffectivePointer = TokenHelper::findNextEffective($phpcsFile, $endPointer + 1, $arrayCloserPointer + 1); + + if ($tokens[$nextEffectivePointer]['line'] === $tokens[$endPointer]['line']) { + return $nextEffectivePointer - 1; + } + + for ($i = $endPointer + 1; $i < $nextEffectivePointer; $i++) { + if ($tokens[$i]['line'] === $tokens[$endPointer]['line']) { + $endPointer = $i; + continue; + } + + $nextNonWhitespacePointer = TokenHelper::findNextNonWhitespace($phpcsFile, $i); + + if (!in_array($tokens[$nextNonWhitespacePointer]['code'], TokenHelper::$inlineCommentTokenCodes, true)) { + break; + } + + if ($indentation === IndentationHelper::getIndentation($phpcsFile, $nextNonWhitespacePointer)) { + $endPointer = $i - 1; + break; + } + + $i = TokenHelper::findLastTokenOnLine($phpcsFile, $i); + $endPointer = $i; } - return $startNew; + return $endPointer; } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayKeyValue.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayKeyValue.php index 7a9c4a1a4..3588426df 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayKeyValue.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ArrayKeyValue.php @@ -10,6 +10,7 @@ use function trim; use const T_COMMA; use const T_DOUBLE_ARROW; +use const T_ELLIPSIS; use const T_WHITESPACE; /** @@ -36,6 +37,9 @@ class ArrayKeyValue /** @var ?int */ private $pointerComma = null; + /** @var bool */ + private $unpacking = false; + public function __construct(File $phpcsFile, int $pointerStart, int $pointerEnd) { $this->pointerStart = $pointerStart; @@ -102,30 +106,51 @@ public function getPointerStart(): int return $this->pointerStart; } + public function isUnpacking(): bool + { + return $this->unpacking; + } + private function addValues(File $phpcsFile): void { $key = ''; $tokens = $phpcsFile->getTokens(); $firstNonWhitespace = null; - $pointerCloser = null; - for ($pointer = $this->pointerStart; $pointer <= $this->pointerEnd; $pointer++) { - if ($pointer < $pointerCloser) { + + for ($i = $this->pointerStart; $i <= $this->pointerEnd; $i++) { + $token = $tokens[$i]; + + if (in_array($token['code'], TokenHelper::$arrayTokenCodes, true)) { + $i = ArrayHelper::openClosePointers($token)[1]; continue; } - $token = $tokens[$pointer]; - if (in_array($token['code'], TokenHelper::$arrayTokenCodes, true)) { - $pointerCloser = ArrayHelper::openClosePointers($token)[1]; - } elseif ($token['code'] === T_DOUBLE_ARROW) { - $this->pointerArrow = $pointer; - } elseif ($token['code'] === T_COMMA) { - $this->pointerComma = $pointer; - } elseif ($this->pointerArrow === null) { - if ($firstNonWhitespace === null && $token['code'] !== T_WHITESPACE) { - $firstNonWhitespace = $pointer; - } - if (in_array($token['code'], TokenHelper::$inlineCommentTokenCodes, true) === false) { - $key .= $token['content']; - } + + if ($token['code'] === T_DOUBLE_ARROW) { + $this->pointerArrow = $i; + continue; + } + + if ($token['code'] === T_COMMA) { + $this->pointerComma = $i; + continue; + + } + + if ($token['code'] === T_ELLIPSIS) { + $this->unpacking = true; + continue; + } + + if ($this->pointerArrow !== null) { + continue; + } + + if ($firstNonWhitespace === null && $token['code'] !== T_WHITESPACE) { + $firstNonWhitespace = $i; + } + + if (in_array($token['code'], TokenHelper::$inlineCommentTokenCodes, true) === false) { + $key .= $token['content']; } } $haveIndent = $firstNonWhitespace !== null && TokenHelper::findFirstNonWhitespaceOnLine( diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CatchHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CatchHelper.php index 3aa6bb4c0..b188b40d0 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CatchHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/CatchHelper.php @@ -37,9 +37,9 @@ public static function getTryEndPointer(File $phpcsFile, int $catchPointer): int /** * @param array|int|string> $catchToken - * @return string[] + * @return list */ - public static function findCatchedTypesInCatch(File $phpcsFile, array $catchToken): array + public static function findCaughtTypesInCatch(File $phpcsFile, array $catchToken): array { /** @var int $catchParenthesisOpenerPointer */ $catchParenthesisOpenerPointer = $catchToken['parenthesis_opener']; @@ -50,7 +50,7 @@ public static function findCatchedTypesInCatch(File $phpcsFile, array $catchToke $nameEndPointer = $catchParenthesisOpenerPointer; $tokens = $phpcsFile->getTokens(); - $catchedTypes = []; + $caughtTypes = []; do { $nameStartPointer = TokenHelper::findNext( $phpcsFile, @@ -70,14 +70,14 @@ public static function findCatchedTypesInCatch(File $phpcsFile, array $catchToke $pointerAfterNameEndPointer = TokenHelper::findNextExcluding($phpcsFile, $nameTokenCodes, $nameStartPointer + 1); $nameEndPointer = $pointerAfterNameEndPointer === null ? $nameStartPointer : $pointerAfterNameEndPointer - 1; - $catchedTypes[] = NamespaceHelper::resolveClassName( + $caughtTypes[] = NamespaceHelper::resolveClassName( $phpcsFile, TokenHelper::getContent($phpcsFile, $nameStartPointer, $nameEndPointer), $catchParenthesisOpenerPointer ); } while (true); - return $catchedTypes; + return $caughtTypes; } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ClassHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ClassHelper.php index 59caaa5a8..14d706623 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ClassHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ClassHelper.php @@ -82,7 +82,7 @@ public static function getAllNames(File $phpcsFile): array } /** - * @return int[] + * @return list */ public static function getTraitUsePointers(File $phpcsFile, int $classPointer): array { @@ -107,7 +107,7 @@ public static function getTraitUsePointers(File $phpcsFile, int $classPointer): } /** - * @return array + * @return list */ private static function getAllClassPointers(File $phpcsFile): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConstantHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConstantHelper.php index dda06b73a..99978a093 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConstantHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ConstantHelper.php @@ -36,7 +36,7 @@ public static function getFullyQualifiedName(File $phpcsFile, int $constantPoint } /** - * @return string[] + * @return list */ public static function getAllNames(File $phpcsFile): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.php index 376806a84..ffed9954d 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.php @@ -3,11 +3,17 @@ namespace SlevomatCodingStandard\Helpers; use PHP_CodeSniffer\Files\File; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode; +use PHPStan\PhpDocParser\Parser\ParserException; +use PHPStan\PhpDocParser\Parser\TokenIterator; use function array_merge; use function count; use function in_array; use function preg_match; +use function sprintf; use function stripos; +use function strtolower; use function trim; use const T_ABSTRACT; use const T_ATTRIBUTE; @@ -57,14 +63,14 @@ public static function getDocComment(File $phpcsFile, int $pointer): ?string return trim( TokenHelper::getContent( $phpcsFile, - $docCommentOpenToken + 1, - $phpcsFile->getTokens()[$docCommentOpenToken]['comment_closer'] - 1 + $docCommentOpenToken, + $phpcsFile->getTokens()[$docCommentOpenToken]['comment_closer'] ) ); } /** - * @return Comment[]|null + * @return list|null */ public static function getDocCommentDescription(File $phpcsFile, int $pointer): ?array { @@ -97,7 +103,7 @@ public static function getDocCommentDescription(File $phpcsFile, int $pointer): $tokens[$docCommentOpenPointer]['comment_closer'] + 1 ); - /** @var Comment[] $comments */ + /** @var list $comments */ $comments = []; for ($i = $descriptionStartPointer; $i < $tokenAfterDescriptionPointer; $i++) { if ($tokens[$i]['code'] !== T_DOC_COMMENT_STRING) { @@ -112,12 +118,29 @@ public static function getDocCommentDescription(File $phpcsFile, int $pointer): public static function hasInheritdocAnnotation(File $phpcsFile, int $pointer): bool { - $docComment = self::getDocComment($phpcsFile, $pointer); - if ($docComment === null) { + $docCommentOpenPointer = self::findDocCommentOpenPointer($phpcsFile, $pointer); + + if ($docCommentOpenPointer === null) { + return false; + } + + $parsedDocComment = self::parseDocComment($phpcsFile, $docCommentOpenPointer); + + if ($parsedDocComment === null) { return false; } - return stripos($docComment, '@inheritdoc') !== false; + foreach ($parsedDocComment->getNode()->children as $child) { + if ($child instanceof PhpDocTextNode && stripos($child->text, '{@inheritdoc}') !== false) { + return true; + } + + if ($child instanceof PhpDocTagNode && strtolower($child->name) === '@inheritdoc') { + return true; + } + } + + return false; } public static function hasDocCommentDescription(File $phpcsFile, int $pointer): bool @@ -127,22 +150,28 @@ public static function hasDocCommentDescription(File $phpcsFile, int $pointer): public static function findDocCommentOpenPointer(File $phpcsFile, int $pointer): ?int { - $tokens = $phpcsFile->getTokens(); - - if ($tokens[$pointer]['code'] === T_DOC_COMMENT_OPEN_TAG) { - return $pointer; - } - - $found = TokenHelper::findPrevious( + return SniffLocalCache::getAndSetIfNotCached( $phpcsFile, - [T_DOC_COMMENT_CLOSE_TAG, T_SEMICOLON, T_CLOSE_CURLY_BRACKET, T_OPEN_CURLY_BRACKET], - $pointer - 1 + sprintf('doc-comment-open-pointer-%d', $pointer), + static function () use ($phpcsFile, $pointer): ?int { + $tokens = $phpcsFile->getTokens(); + + if ($tokens[$pointer]['code'] === T_DOC_COMMENT_OPEN_TAG) { + return $pointer; + } + + $found = TokenHelper::findPrevious( + $phpcsFile, + [T_DOC_COMMENT_CLOSE_TAG, T_SEMICOLON, T_CLOSE_CURLY_BRACKET, T_OPEN_CURLY_BRACKET], + $pointer - 1 + ); + if ($found !== null && $tokens[$found]['code'] === T_DOC_COMMENT_CLOSE_TAG) { + return $tokens[$found]['comment_opener']; + } + + return null; + } ); - if ($found !== null && $tokens[$found]['code'] === T_DOC_COMMENT_CLOSE_TAG) { - return $tokens[$found]['comment_opener']; - } - - return null; } public static function findDocCommentOwnerPointer(File $phpcsFile, int $docCommentOpenPointer): ?int @@ -202,8 +231,45 @@ public static function isInline(File $phpcsFile, int $docCommentOpenPointer): bo return false; } - $docCommentContent = self::getDocComment($phpcsFile, $docCommentOpenPointer); - return preg_match('~^@(?:(?:phpstan|psalm)-)?var~i', $docCommentContent) === 1; + $parsedDocComment = self::parseDocComment($phpcsFile, $docCommentOpenPointer); + + if ($parsedDocComment === null) { + return false; + } + + foreach ($parsedDocComment->getNode()->getTags() as $annotation) { + if (preg_match('~^@(?:(?:phpstan|psalm)-)?var~i', $annotation->name) === 1) { + return true; + } + } + + return false; + } + + public static function parseDocComment(File $phpcsFile, int $docCommentOpenPointer): ?ParsedDocComment + { + return SniffLocalCache::getAndSetIfNotCached( + $phpcsFile, + sprintf('parsed-doc-comment-%d', $docCommentOpenPointer), + static function () use ($phpcsFile, $docCommentOpenPointer): ?ParsedDocComment { + $docComment = self::getDocComment($phpcsFile, $docCommentOpenPointer); + + $docCommentTokens = new TokenIterator(PhpDocParserHelper::getLexer()->tokenize($docComment)); + + try { + $parsedDocComment = PhpDocParserHelper::getParser()->parse($docCommentTokens); + + return new ParsedDocComment( + $docCommentOpenPointer, + $phpcsFile->getTokens()[$docCommentOpenPointer]['comment_closer'], + $parsedDocComment, + $docCommentTokens + ); + } catch (ParserException $e) { + return null; + } + } + ); } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FixerHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FixerHelper.php index a4639ced3..d994bc6ca 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FixerHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FixerHelper.php @@ -12,6 +12,12 @@ class FixerHelper { + public static function change(File $phpcsFile, int $startPointer, int $endPointer, string $content): void + { + self::removeBetweenIncluding($phpcsFile, $startPointer, $endPointer); + $phpcsFile->fixer->replaceToken($startPointer, $content); + } + public static function removeBetween(File $phpcsFile, int $startPointer, int $endPointer): void { self::removeBetweenIncluding($phpcsFile, $startPointer + 1, $endPointer - 1); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FunctionHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FunctionHelper.php index 3db55359d..633e80b1c 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FunctionHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/FunctionHelper.php @@ -5,15 +5,15 @@ use Generator; use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Util\Tokens; -use SlevomatCodingStandard\Helpers\Annotation\ParameterAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ReturnAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\TypelessParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use function array_filter; use function array_map; use function array_merge; use function array_pop; use function array_reverse; -use function count; use function in_array; use function iterator_to_array; use function preg_match; @@ -178,7 +178,7 @@ public static function findClassPointer(File $phpcsFile, int $functionPointer): } /** - * @return string[] + * @return list */ public static function getParametersNames(File $phpcsFile, int $functionPointer): array { @@ -197,7 +197,7 @@ public static function getParametersNames(File $phpcsFile, int $functionPointer) } /** - * @return (TypeHint|null)[] + * @return array */ public static function getParametersTypeHints(File $phpcsFile, int $functionPointer): array { @@ -324,17 +324,15 @@ public static function hasReturnTypeHint(File $phpcsFile, int $functionPointer): } /** - * @return ParameterAnnotation[] + * @return list|Annotation> */ public static function getParametersAnnotations(File $phpcsFile, int $functionPointer): array { - /** @var ParameterAnnotation[] $parametersAnnotations */ - $parametersAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $functionPointer, '@param'); - return $parametersAnnotations; + return AnnotationHelper::getAnnotations($phpcsFile, $functionPointer, '@param'); } /** - * @return array + * @return array|Annotation|Annotation> */ public static function getValidParametersAnnotations(File $phpcsFile, int $functionPointer): array { @@ -348,8 +346,7 @@ public static function getValidParametersAnnotations(File $phpcsFile, int $funct continue; } - /** @var VariableAnnotation[] $varAnnotations */ - $varAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $i, '@var'); + $varAnnotations = AnnotationHelper::getAnnotations($phpcsFile, $i, '@var'); if ($varAnnotations === []) { continue; } @@ -359,37 +356,33 @@ public static function getValidParametersAnnotations(File $phpcsFile, int $funct } foreach (self::getParametersAnnotations($phpcsFile, $functionPointer) as $parameterAnnotation) { - if ($parameterAnnotation->getContent() === null) { - continue; - } - if ($parameterAnnotation->isInvalid()) { continue; } - $parametersAnnotations[$parameterAnnotation->getParameterName()] = $parameterAnnotation; + $parametersAnnotations[$parameterAnnotation->getValue()->parameterName] = $parameterAnnotation; } return $parametersAnnotations; } /** - * @return array + * @return array|Annotation> */ public static function getValidPrefixedParametersAnnotations(File $phpcsFile, int $functionPointer): array { $tokens = $phpcsFile->getTokens(); $parametersAnnotations = []; - foreach (AnnotationHelper::PREFIXES as $prefix) { + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefix) { if (self::getName($phpcsFile, $functionPointer) === '__construct') { for ($i = $tokens[$functionPointer]['parenthesis_opener'] + 1; $i < $tokens[$functionPointer]['parenthesis_closer']; $i++) { if ($tokens[$i]['code'] !== T_VARIABLE) { continue; } - /** @var VariableAnnotation[] $varAnnotations */ - $varAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $i, sprintf('@%s-var', $prefix)); + /** @var list> $varAnnotations */ + $varAnnotations = AnnotationHelper::getAnnotations($phpcsFile, $i, sprintf('@%s-var', $prefix)); if ($varAnnotations === []) { continue; } @@ -398,30 +391,29 @@ public static function getValidPrefixedParametersAnnotations(File $phpcsFile, in } } - /** @var ParameterAnnotation[] $annotations */ - $annotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $functionPointer, sprintf('@%s-param', $prefix)); + /** @var list> $annotations */ + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $functionPointer, sprintf('@%s-param', $prefix)); foreach ($annotations as $parameterAnnotation) { - if ($parameterAnnotation->getContent() === null) { - continue; - } - if ($parameterAnnotation->isInvalid()) { continue; } - $parametersAnnotations[$parameterAnnotation->getParameterName()] = $parameterAnnotation; + $parametersAnnotations[$parameterAnnotation->getValue()->parameterName] = $parameterAnnotation; } } return $parametersAnnotations; } - public static function findReturnAnnotation(File $phpcsFile, int $functionPointer): ?ReturnAnnotation + /** + * @return Annotation|null + */ + public static function findReturnAnnotation(File $phpcsFile, int $functionPointer): ?Annotation { - /** @var ReturnAnnotation[] $returnAnnotations */ - $returnAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $functionPointer, '@return'); + /** @var list> $returnAnnotations */ + $returnAnnotations = AnnotationHelper::getAnnotations($phpcsFile, $functionPointer, '@return'); - if (count($returnAnnotations) === 0) { + if ($returnAnnotations === []) { return null; } @@ -429,19 +421,24 @@ public static function findReturnAnnotation(File $phpcsFile, int $functionPointe } /** - * @return ReturnAnnotation[] + * @return list */ public static function getValidPrefixedReturnAnnotations(File $phpcsFile, int $functionPointer): array { $returnAnnotations = []; - foreach (AnnotationHelper::PREFIXES as $prefix) { - /** @var ReturnAnnotation[] $annotations */ - $annotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $functionPointer, sprintf('@%s-return', $prefix)); + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $functionPointer); + + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefix) { + $prefixedAnnotationName = sprintf('@%s-return', $prefix); + foreach ($annotations as $annotation) { - if (!$annotation->isInvalid()) { + if ($annotation->isInvalid()) { + continue; + } + + if ($annotation->getName() === $prefixedAnnotationName) { $returnAnnotations[] = $annotation; - break; } } } @@ -450,7 +447,7 @@ public static function getValidPrefixedReturnAnnotations(File $phpcsFile, int $f } /** - * @return string[] + * @return list */ public static function getAllFunctionNames(File $phpcsFile): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IndentationHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IndentationHelper.php index e739deae8..e6daae0d1 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IndentationHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/IndentationHelper.php @@ -33,22 +33,22 @@ public static function getIndentation(File $phpcsFile, int $pointer): string return TokenHelper::getContent($phpcsFile, $firstPointerOnLine, $pointer - 1); } - public static function addIndentation(string $identation, int $level = 1): string + public static function addIndentation(string $indentation, int $level = 1): string { - $whitespace = self::getOneIndentationLevel($identation); + $whitespace = self::getOneIndentationLevel($indentation); - return $identation . str_repeat($whitespace, $level); + return $indentation . str_repeat($whitespace, $level); } - public static function getOneIndentationLevel(string $identation): string + public static function getOneIndentationLevel(string $indentation): string { - return $identation === '' + return $indentation === '' ? self::TAB_INDENT - : ($identation[0] === self::TAB_INDENT ? self::TAB_INDENT : self::SPACES_INDENT); + : ($indentation[0] === self::TAB_INDENT ? self::TAB_INDENT : self::SPACES_INDENT); } /** - * @param int[] $codePointers + * @param list $codePointers */ public static function fixIndentation(File $phpcsFile, array $codePointers, string $defaultIndentation): string { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/NamespaceHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/NamespaceHelper.php index 4e10842e5..6f97597f6 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/NamespaceHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/NamespaceHelper.php @@ -31,7 +31,7 @@ class NamespaceHelper public const NAMESPACE_SEPARATOR = '\\'; /** - * @return int[] + * @return list */ public static function getAllNamespacesPointers(File $phpcsFile): array { @@ -69,7 +69,7 @@ public static function hasNamespace(string $typeName): bool } /** - * @return string[] + * @return list */ public static function getNameParts(string $name): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ParsedDocComment.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ParsedDocComment.php new file mode 100644 index 000000000..2c4fa0113 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ParsedDocComment.php @@ -0,0 +1,108 @@ +openPointer = $openPointer; + $this->closePointer = $closePointer; + $this->node = $node; + $this->tokens = $tokens; + } + + public function getOpenPointer(): int + { + return $this->openPointer; + } + + public function getClosePointer(): int + { + return $this->closePointer; + } + + public function getNode(): PhpDocNode + { + return $this->node; + } + + public function getTokens(): TokenIterator + { + return $this->tokens; + } + + public function getNodeStartPointer(File $phpcsFile, Node $node): int + { + $tokens = $phpcsFile->getTokens(); + + $tagStartLine = $tokens[$this->openPointer]['line'] + $node->getAttribute('startLine') - 1; + + $searchPointer = $this->openPointer + 1; + for ($i = $this->openPointer + 1; $i < $this->closePointer; $i++) { + if ($tagStartLine === $tokens[$i]['line']) { + $searchPointer = $i; + break; + } + } + + return TokenHelper::findNext($phpcsFile, array_merge(TokenHelper::$annotationTokenCodes, [T_DOC_COMMENT_STRING]), $searchPointer); + } + + public function getNodeEndPointer(File $phpcsFile, Node $node, int $nodeStartPointer): int + { + $tokens = $phpcsFile->getTokens(); + + $content = trim($this->tokens->getContentBetween( + $node->getAttribute(Attribute::START_INDEX), + $node->getAttribute(Attribute::END_INDEX) + 1 + )); + $length = strlen($content); + + $searchPointer = $nodeStartPointer; + + $content = ''; + for ($i = $nodeStartPointer; $i < count($tokens); $i++) { + $content .= $tokens[$i]['content']; + + if (strlen($content) >= $length) { + $searchPointer = $i; + break; + } + } + + return TokenHelper::findPrevious( + $phpcsFile, + array_merge(TokenHelper::$annotationTokenCodes, [T_DOC_COMMENT_STRING]), + $searchPointer + ); + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/PhpDocParserHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/PhpDocParserHelper.php new file mode 100644 index 000000000..6cc06d61a --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/PhpDocParserHelper.php @@ -0,0 +1,82 @@ + true, 'indexes' => true]; + + $constantExpressionParser = new ConstExprParser(true, true, $usedAttributes); + $parser = new PhpDocParser( + new TypeParser($constantExpressionParser, true, $usedAttributes), + $constantExpressionParser, + true, + true, + $usedAttributes, + true, + true + ); + } + + return $parser; + } + + public static function getPrinter(): Printer + { + static $printer; + + if ($printer === null) { + $printer = new Printer(); + } + + return $printer; + } + + /** + * @template T of Node + * @param T $node + * @return T + */ + public static function cloneNode(Node $node): Node + { + static $cloningTraverser; + + if ($cloningTraverser === null) { + $cloningTraverser = new NodeTraverser([new CloningVisitor()]); + } + + [$cloneNode] = $cloningTraverser->traverse([$node]); + + return $cloneNode; + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedNameHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedNameHelper.php index ca620f637..1a91a6e06 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedNameHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ReferencedNameHelper.php @@ -59,7 +59,7 @@ class ReferencedNameHelper { /** - * @return ReferencedName[] + * @return list */ public static function getAllReferencedNames(File $phpcsFile, int $openTagPointer): array { @@ -71,7 +71,7 @@ public static function getAllReferencedNames(File $phpcsFile, int $openTagPointe } /** - * @return ReferencedName[] + * @return list */ public static function getAllReferencedNamesInAttributes(File $phpcsFile, int $openTagPointer): array { @@ -123,7 +123,7 @@ public static function getReferencedNameEndPointer(File $phpcsFile, int $startPo } /** - * @return ReferencedName[] + * @return list */ private static function createAllReferencedNames(File $phpcsFile, int $openTagPointer): array { @@ -396,7 +396,7 @@ private static function isReferencedName(File $phpcsFile, int $startPointer): bo } /** - * @return ReferencedName[] + * @return list */ private static function createAllReferencedNamesInAttributes(File $phpcsFile, int $openTagPointer): array { @@ -473,7 +473,7 @@ private static function isNeedParsedContent($code): bool } /** - * @return string[] + * @return list */ private static function getReferencedNamesFromString(string $content): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ScopeHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ScopeHelper.php index 3eb72b5d9..68c65b73d 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ScopeHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/ScopeHelper.php @@ -51,7 +51,7 @@ public static function getRootPointer(File $phpcsFile, int $pointer): int } /** - * @return int[] + * @return list */ public static function getAllRootPointers(File $phpcsFile): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffSettingsHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffSettingsHelper.php index d71a9a24f..ade9c26ce 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffSettingsHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SniffSettingsHelper.php @@ -34,8 +34,8 @@ public static function normalizeNullableInteger($settings): ?int } /** - * @param string[] $settings - * @return string[] + * @param list $settings + * @return list */ public static function normalizeArray(array $settings): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SuppressHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SuppressHelper.php index 88d5c51d5..96b1d2c04 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SuppressHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/SuppressHelper.php @@ -3,13 +3,14 @@ namespace SlevomatCodingStandard\Helpers; use PHP_CodeSniffer\Files\File; -use SlevomatCodingStandard\Helpers\Annotation\Annotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use function array_reduce; use function assert; use function explode; use function sprintf; use function strpos; use const T_DOC_COMMENT_CLOSE_TAG; +use const T_DOC_COMMENT_OPEN_TAG; use const T_DOC_COMMENT_STAR; /** @@ -22,14 +23,13 @@ class SuppressHelper public static function isSniffSuppressed(File $phpcsFile, int $pointer, string $suppressName): bool { + /** @var list> $annotations */ + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $pointer, self::ANNOTATION); + return array_reduce( - AnnotationHelper::getAnnotationsByName($phpcsFile, $pointer, self::ANNOTATION), + $annotations, static function (bool $carry, Annotation $annotation) use ($suppressName): bool { - if ($annotation->getContent() === null) { - return $carry; - } - - $annotationSuppressName = explode(' ', $annotation->getContent())[0]; + $annotationSuppressName = explode(' ', $annotation->getValue()->value)[0]; if ( $suppressName === $annotationSuppressName @@ -37,6 +37,7 @@ static function (bool $carry, Annotation $annotation) use ($suppressName): bool ) { $carry = true; } + return $carry; }, false @@ -46,8 +47,9 @@ static function (bool $carry, Annotation $annotation) use ($suppressName): bool public static function removeSuppressAnnotation(File $phpcsFile, int $pointer, string $suppressName): void { $suppressAnnotation = null; - foreach (AnnotationHelper::getAnnotationsByName($phpcsFile, $pointer, self::ANNOTATION) as $annotation) { - if ($annotation->getContent() === $suppressName) { + /** @var Annotation $annotation */ + foreach (AnnotationHelper::getAnnotations($phpcsFile, $pointer, self::ANNOTATION) as $annotation) { + if ($annotation->getValue()->value === $suppressName) { $suppressAnnotation = $annotation; break; } @@ -55,14 +57,24 @@ public static function removeSuppressAnnotation(File $phpcsFile, int $pointer, s assert($suppressAnnotation !== null); - /** @var int $changeStart */ - $changeStart = TokenHelper::findPrevious($phpcsFile, T_DOC_COMMENT_STAR, $suppressAnnotation->getStartPointer() - 1); + $tokens = $phpcsFile->getTokens(); + + /** @var int $pointerBefore */ + $pointerBefore = TokenHelper::findPrevious( + $phpcsFile, + [T_DOC_COMMENT_OPEN_TAG, T_DOC_COMMENT_STAR], + $suppressAnnotation->getStartPointer() - 1 + ); + + $changeStart = $tokens[$pointerBefore]['code'] === T_DOC_COMMENT_STAR ? $pointerBefore : $suppressAnnotation->getStartPointer(); + /** @var int $changeEnd */ $changeEnd = TokenHelper::findNext( $phpcsFile, [T_DOC_COMMENT_CLOSE_TAG, T_DOC_COMMENT_STAR], $suppressAnnotation->getEndPointer() + 1 ) - 1; + $phpcsFile->fixer->beginChangeset(); FixerHelper::removeBetweenIncluding($phpcsFile, $changeStart, $changeEnd); $phpcsFile->fixer->endChangeset(); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenHelper.php index 53cdcde4d..fc4119d94 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TokenHelper.php @@ -93,6 +93,16 @@ class TokenHelper T_PHPCS_SET, ]; + /** @var array */ + public static $annotationTokenCodes = [ + T_DOC_COMMENT_TAG, + T_PHPCS_DISABLE, + T_PHPCS_ENABLE, + T_PHPCS_IGNORE, + T_PHPCS_IGNORE_FILE, + T_PHPCS_SET, + ]; + /** @var array */ public static $inlineCommentTokenCodes = [ T_COMMENT, @@ -141,7 +151,7 @@ public static function findNext(File $phpcsFile, $types, int $startPointer, ?int /** * @param int|string|array $types - * @return int[] + * @return list */ public static function findNextAll(File $phpcsFile, $types, int $startPointer, ?int $endPointer = null): array { @@ -454,7 +464,6 @@ public static function getLastTokenPointer(File $phpcsFile): int } /** - * @internal * @return array */ public static function getNameTokenCodes(): array @@ -463,7 +472,6 @@ public static function getNameTokenCodes(): array } /** - * @internal * @return array */ public static function getOnlyNameTokenCodes(): array diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHintHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHintHelper.php index 5b628b36e..abde19b64 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHintHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/TypeHintHelper.php @@ -3,9 +3,9 @@ namespace SlevomatCodingStandard\Helpers; use PHP_CodeSniffer\Files\File; -use SlevomatCodingStandard\Helpers\Annotation\TemplateAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\TypeAliasAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\TypeImportAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\TemplateTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasImportTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\TypeAliasTagValueNode; use function array_key_exists; use function array_map; use function array_merge; @@ -93,7 +93,7 @@ public static function isNeverTypeHint(string $typeHint): bool } /** - * @return string[] + * @return list */ public static function convertUnofficialUnionTypeHintToOfficialTypeHints(string $typeHint): array { @@ -127,7 +127,7 @@ public static function getFullyQualifiedTypeHint(File $phpcsFile, int $pointer, } /** - * @return string[] + * @return list */ public static function getSimpleTypeHints(): array { @@ -155,7 +155,7 @@ public static function getSimpleTypeHints(): array } /** - * @return string[] + * @return list */ public static function getSimpleIterableTypeHints(): array { @@ -201,7 +201,7 @@ public static function isSimpleUnofficialTypeHints(string $typeHint): bool } /** - * @param string[] $traversableTypeHints + * @param list $traversableTypeHints */ public static function isTraversableType(string $type, array $traversableTypeHints): bool { @@ -215,9 +215,9 @@ public static function typeHintEqualsAnnotation( string $typeHintInAnnotation ): bool { - /** @var string[] $typeHintParts */ + /** @var list $typeHintParts */ $typeHintParts = preg_split('~([&|])~', self::normalize($typeHint), -1, PREG_SPLIT_DELIM_CAPTURE); - /** @var string[] $typeHintInAnnotationParts */ + /** @var list $typeHintInAnnotationParts */ $typeHintInAnnotationParts = preg_split('~([&|])~', self::normalize($typeHintInAnnotation), -1, PREG_SPLIT_DELIM_CAPTURE); if (count($typeHintParts) !== count($typeHintInAnnotationParts)) { @@ -263,26 +263,23 @@ private static function isTemplate(File $phpcsFile, int $docCommentOpenPointer, if ($templateAnnotationNames === null) { foreach (['template', 'template-covariant'] as $annotationName) { $templateAnnotationNames[] = sprintf('@%s', $annotationName); - foreach (AnnotationHelper::PREFIXES as $prefixAnnotationName) { + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefixAnnotationName) { $templateAnnotationNames[] = sprintf('@%s-%s', $prefixAnnotationName, $annotationName); } } } $containsTypeHintInTemplateAnnotation = static function (int $docCommentOpenPointer) use ($phpcsFile, $templateAnnotationNames, $typeHint): bool { - $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); foreach ($templateAnnotationNames as $templateAnnotationName) { - if (!array_key_exists($templateAnnotationName, $annotations)) { - continue; - } + /** @var list> $annotations */ + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer, $templateAnnotationName); - /** @var TemplateAnnotation $templateAnnotation */ - foreach ($annotations[$templateAnnotationName] as $templateAnnotation) { + foreach ($annotations as $templateAnnotation) { if ($templateAnnotation->isInvalid()) { continue; } - if ($templateAnnotation->getTemplateName() === $typeHint) { + if ($templateAnnotation->getValue()->name === $typeHint) { return true; } } @@ -323,7 +320,7 @@ private static function isAlias(File $phpcsFile, int $docCommentOpenPointer, str static $aliasAnnotationNames = null; if ($aliasAnnotationNames === null) { foreach (['type', 'import-type'] as $annotationName) { - foreach (AnnotationHelper::PREFIXES as $prefixAnnotationName) { + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefixAnnotationName) { $aliasAnnotationNames[] = sprintf('@%s-%s', $prefixAnnotationName, $annotationName); } } @@ -340,19 +337,25 @@ private static function isAlias(File $phpcsFile, int $docCommentOpenPointer, str return false; } - $annotations = AnnotationHelper::getAnnotations($phpcsFile, $classDocCommentOpenPointer); foreach ($aliasAnnotationNames as $aliasAnnotationName) { - if (!array_key_exists($aliasAnnotationName, $annotations)) { - continue; - } + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $classDocCommentOpenPointer, $aliasAnnotationName); + + foreach ($annotations as $aliasAnnotation) { + $aliasAnnotationValue = $aliasAnnotation->getValue(); - /** @var TypeAliasAnnotation|TypeImportAnnotation $aliasAnnotation */ - foreach ($annotations[$aliasAnnotationName] as $aliasAnnotation) { - if ($aliasAnnotation->isInvalid()) { + if ($aliasAnnotationValue instanceof TypeAliasTagValueNode && $aliasAnnotationValue->alias === $typeHint) { + return true; + } + + if (!($aliasAnnotationValue instanceof TypeAliasImportTagValueNode)) { continue; } - if ($aliasAnnotation->getAlias() === $typeHint) { + if ($aliasAnnotationValue->importedAs === $typeHint) { + return true; + } + + if ($aliasAnnotationValue->importedAlias === $typeHint) { return true; } } @@ -371,7 +374,7 @@ private static function normalize(string $typeHint): string return 'never'; } - /** @var string[] $parts */ + /** @var list $parts */ $parts = preg_split('~([&|])~', $typeHint, -1, PREG_SPLIT_DELIM_CAPTURE); $hints = []; diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatementHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatementHelper.php index e0ca6a50d..bc6fdd1fd 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatementHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/UseStatementHelper.php @@ -174,7 +174,7 @@ public static function getUseStatementPointer(File $phpcsFile, int $pointer): ?i /** * Searches for all use statements in a file, skips bodies of classes and traits. * - * @return int[] + * @return list */ private static function getUseStatementPointers(File $phpcsFile, int $openTagPointer): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/YodaHelper.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/YodaHelper.php index 30104c83a..9b0c3ad97 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/YodaHelper.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/YodaHelper.php @@ -283,13 +283,13 @@ private static function replace(File $phpcsFile, array $oldTokens, array $newTok /** @var int $lastOldPointer */ $lastOldPointer = key($oldTokens); - FixerHelper::removeBetweenIncluding($phpcsFile, $firstOldPointer, $lastOldPointer); - - $phpcsFile->fixer->addContent($firstOldPointer, implode('', array_map(static function (array $token): string { + $content = implode('', array_map(static function (array $token): string { /** @var string $content */ $content = $token['content']; return $content; - }, $newTokens))); + }, $newTokens)); + + FixerHelper::change($phpcsFile, $firstOldPointer, $lastOldPointer, $content); } /** diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/AlphabeticallySortedByKeysSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/AlphabeticallySortedByKeysSniff.php index 816d93aca..27f47b01a 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/AlphabeticallySortedByKeysSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/AlphabeticallySortedByKeysSniff.php @@ -59,9 +59,9 @@ public function process(File $phpcsFile, $stackPointer): void } /** - * @param ArrayKeyValue[] $keyValues + * @param list $keyValues */ - private function fix(File $phpcsFile, array $keyValues): bool + private function fix(File $phpcsFile, array $keyValues): void { $pointerStart = $keyValues[0]->getPointerStart(); $pointerEnd = $keyValues[count($keyValues) - 1]->getPointerEnd(); @@ -78,9 +78,8 @@ private function fix(File $phpcsFile, array $keyValues): bool }, $keyValues)); $phpcsFile->fixer->beginChangeset(); - FixerHelper::removeBetweenIncluding($phpcsFile, $pointerStart, $pointerEnd); - $phpcsFile->fixer->addContent($pointerStart, $content); - return $phpcsFile->fixer->endChangeset(); + FixerHelper::change($phpcsFile, $pointerStart, $pointerEnd, $content); + $phpcsFile->fixer->endChangeset(); } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/ArrayAccessSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/ArrayAccessSniff.php new file mode 100644 index 000000000..e5d9ffaaa --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/ArrayAccessSniff.php @@ -0,0 +1,76 @@ + + */ + public function register(): array + { + return [T_OPEN_SQUARE_BRACKET]; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + * @param int $stackPointer + */ + public function process(File $phpcsFile, $stackPointer): void + { + $tokens = $phpcsFile->getTokens(); + + $previousToken = TokenHelper::findPreviousNonWhitespace($phpcsFile, $stackPointer - 1); + + if ( + $previousToken === null + || $previousToken === $stackPointer - 1) { + return; + } + + if ($tokens[$previousToken]['code'] === T_VARIABLE) { + $this->addError( + $phpcsFile, + $stackPointer, + 'There should be no space between array variable and array access operator.', + self::CODE_NO_SPACE_BEFORE_BRACKETS + ); + } + + if ($tokens[$previousToken]['code'] !== T_CLOSE_SQUARE_BRACKET) { + return; + } + + $this->addError( + $phpcsFile, + $stackPointer, + 'There should be no space between array access operators.', + self::CODE_NO_SPACE_BETWEEN_BRACKETS + ); + } + + private function addError(File $phpcsFile, int $stackPointer, string $error, string $code): void + { + $fix = $phpcsFile->addFixableError($error, $stackPointer, $code); + + if (!$fix) { + return; + } + + $phpcsFile->fixer->beginChangeset(); + $phpcsFile->fixer->replaceToken($stackPointer - 1, ''); + $phpcsFile->fixer->endChangeset(); + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.php index 16246248a..e9f3cf643 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowImplicitArrayCreationSniff.php @@ -49,8 +49,8 @@ public function process(File $phpcsFile, $bracketOpenerPointer): void { $tokens = $phpcsFile->getTokens(); - $assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $tokens[$bracketOpenerPointer]['bracket_closer'] + 1); - if ($tokens[$assigmentPointer]['code'] !== T_EQUAL) { + $assignmentPointer = TokenHelper::findNextEffective($phpcsFile, $tokens[$bracketOpenerPointer]['bracket_closer'] + 1); + if ($tokens[$assignmentPointer]['code'] !== T_EQUAL) { return; } @@ -182,8 +182,8 @@ private function hasExplicitCreation(File $phpcsFile, int $scopeOpenerPointer, i continue; } - $assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $i + 1); - if ($tokens[$assigmentPointer]['code'] === T_EQUAL) { + $assignmentPointer = TokenHelper::findNextEffective($phpcsFile, $i + 1); + if ($tokens[$assignmentPointer]['code'] === T_EQUAL) { return true; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowPartiallyKeyedSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowPartiallyKeyedSniff.php new file mode 100644 index 000000000..28af0d876 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/DisallowPartiallyKeyedSniff.php @@ -0,0 +1,42 @@ + + */ + public function register(): array + { + return TokenHelper::$arrayTokenCodes; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + * @param int $stackPointer + */ + public function process(File $phpcsFile, $stackPointer): void + { + $keyValues = ArrayHelper::parse($phpcsFile, $stackPointer); + + if (!ArrayHelper::isKeyed($keyValues)) { + return; + } + + if (ArrayHelper::isKeyedAll($keyValues)) { + return; + } + + $phpcsFile->addError('Partially keyed array disallowed.', $stackPointer, self::CODE_DISALLOWED_PARTIALLY_KEYED); + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/MultiLineArrayEndBracketPlacementSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/MultiLineArrayEndBracketPlacementSniff.php index 0fb06bb13..46980e91a 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/MultiLineArrayEndBracketPlacementSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/MultiLineArrayEndBracketPlacementSniff.php @@ -4,8 +4,9 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use SlevomatCodingStandard\Helpers\ArrayHelper; use SlevomatCodingStandard\Helpers\TokenHelper; -use const T_OPEN_SHORT_ARRAY; +use function in_array; class MultiLineArrayEndBracketPlacementSniff implements Sniff { @@ -17,42 +18,43 @@ class MultiLineArrayEndBracketPlacementSniff implements Sniff */ public function register(): array { - return [T_OPEN_SHORT_ARRAY]; + return TokenHelper::$arrayTokenCodes; } /** * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - * @param int $arrayStart + * @param int $stackPointer */ - public function process(File $phpcsFile, $arrayStart): void + public function process(File $phpcsFile, $stackPointer): void { $tokens = $phpcsFile->getTokens(); - $arrayEnd = $tokens[$arrayStart]['bracket_closer']; - - if ($tokens[$arrayStart]['line'] === $tokens[$arrayEnd]['line']) { + if (ArrayHelper::isMultiLine($phpcsFile, $stackPointer) === false) { return; } - $nextArrayStart = TokenHelper::findNextEffective($phpcsFile, $arrayStart + 1, $arrayEnd); - if ($nextArrayStart === null || $tokens[$nextArrayStart]['code'] !== T_OPEN_SHORT_ARRAY) { + [$arrayOpenerPointer, $arrayCloserPointer] = ArrayHelper::openClosePointers($tokens[$stackPointer]); + + $nextEffective = TokenHelper::findNextEffective($phpcsFile, $arrayOpenerPointer + 1, $arrayCloserPointer); + if ($nextEffective === null || in_array($tokens[$nextEffective]['code'], TokenHelper::$arrayTokenCodes, true) === false) { return; } - $nextArrayEnd = $tokens[$nextArrayStart]['bracket_closer']; - $arraysStartAtSameLine = $tokens[$arrayStart]['line'] === $tokens[$nextArrayStart]['line']; - $arraysEndAtSameLine = $tokens[$arrayEnd]['line'] === $tokens[$nextArrayEnd]['line']; + [$nextPointerOpener, $nextPointerCloser] = ArrayHelper::openClosePointers($tokens[$nextEffective]); + + $arraysStartAtSameLine = $tokens[$arrayOpenerPointer]['line'] === $tokens[$nextPointerOpener]['line']; + $arraysEndAtSameLine = $tokens[$arrayCloserPointer]['line'] === $tokens[$nextPointerCloser]['line']; if (!$arraysStartAtSameLine || $arraysEndAtSameLine) { return; } $error = "Expected nested array to end at the same line as it's parent. Either put the nested array's end at the same line as the parent's end, or put the nested array start on it's own line."; - $fix = $phpcsFile->addFixableError($error, $arrayStart, self::CODE_ARRAY_END_WRONG_PLACEMENT); + $fix = $phpcsFile->addFixableError($error, $arrayOpenerPointer, self::CODE_ARRAY_END_WRONG_PLACEMENT); if (!$fix) { return; } - $phpcsFile->fixer->addContent($arrayStart, $phpcsFile->eolChar); + $phpcsFile->fixer->addContent($arrayOpenerPointer, $phpcsFile->eolChar); } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/SingleLineArrayWhitespaceSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/SingleLineArrayWhitespaceSniff.php index 599db73c6..98ce9ea62 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/SingleLineArrayWhitespaceSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/SingleLineArrayWhitespaceSniff.php @@ -4,13 +4,14 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use SlevomatCodingStandard\Helpers\ArrayHelper; use SlevomatCodingStandard\Helpers\SniffSettingsHelper; use SlevomatCodingStandard\Helpers\TokenHelper; +use function in_array; use function sprintf; use function str_repeat; use const T_COMMA; use const T_OPEN_PARENTHESIS; -use const T_OPEN_SHORT_ARRAY; use const T_WHITESPACE; class SingleLineArrayWhitespaceSniff implements Sniff @@ -33,7 +34,7 @@ class SingleLineArrayWhitespaceSniff implements Sniff */ public function register(): array { - return [T_OPEN_SHORT_ARRAY]; + return TokenHelper::$arrayTokenCodes; } /** @@ -46,30 +47,29 @@ public function process(File $phpcsFile, $stackPointer): int $tokens = $phpcsFile->getTokens(); - $arrayStart = $stackPointer; - $arrayEnd = $tokens[$stackPointer]['bracket_closer']; + [$arrayOpenerPointer, $arrayCloserPointer] = ArrayHelper::openClosePointers($tokens[$stackPointer]); // Check only single-line arrays. - if ($tokens[$arrayStart]['line'] !== $tokens[$arrayEnd]['line']) { - return $arrayEnd; + if ($tokens[$arrayOpenerPointer]['line'] !== $tokens[$arrayCloserPointer]['line']) { + return $arrayCloserPointer; } - $content = TokenHelper::findNextNonWhitespace($phpcsFile, $arrayStart + 1, $arrayEnd + 1); - if ($content === $arrayEnd) { + $pointerContent = TokenHelper::findNextNonWhitespace($phpcsFile, $arrayOpenerPointer + 1, $arrayCloserPointer + 1); + if ($pointerContent === $arrayCloserPointer) { // Empty array, but if the brackets aren't together, there's a problem. if ($this->enableEmptyArrayCheck) { - $this->checkWhitespaceInEmptyArray($phpcsFile, $arrayStart, $arrayEnd); + $this->checkWhitespaceInEmptyArray($phpcsFile, $arrayOpenerPointer, $arrayCloserPointer); } // We can return here because there is nothing else to check. // All code below can assume that the array is not empty. - return $arrayEnd + 1; + return $arrayCloserPointer + 1; } - $this->checkWhitespaceAfterOpeningBracket($phpcsFile, $arrayStart); - $this->checkWhitespaceBeforeClosingBracket($phpcsFile, $arrayEnd); + $this->checkWhitespaceAfterOpeningBracket($phpcsFile, $arrayOpenerPointer); + $this->checkWhitespaceBeforeClosingBracket($phpcsFile, $arrayCloserPointer); - for ($i = $arrayStart + 1; $i < $arrayEnd; $i++) { + for ($i = $arrayOpenerPointer + 1; $i < $arrayCloserPointer; $i++) { // Skip bracketed statements, like function calls. if ($tokens[$i]['code'] === T_OPEN_PARENTHESIS) { $i = $tokens[$i]['parenthesis_closer']; @@ -78,8 +78,8 @@ public function process(File $phpcsFile, $stackPointer): int } // Skip nested arrays as they will be processed separately - if ($tokens[$i]['code'] === T_OPEN_SHORT_ARRAY) { - $i = $tokens[$i]['bracket_closer']; + if (in_array($tokens[$i]['code'], TokenHelper::$arrayTokenCodes, true)) { + $i = ArrayHelper::openClosePointers($tokens[$i])[1]; continue; } @@ -89,16 +89,16 @@ public function process(File $phpcsFile, $stackPointer): int } // Before checking this comma, make sure we are not at the end of the array. - $next = TokenHelper::findNextNonWhitespace($phpcsFile, $i + 1, $arrayEnd); + $next = TokenHelper::findNextNonWhitespace($phpcsFile, $i + 1, $arrayCloserPointer); if ($next === null) { - return $arrayStart + 1; + return $arrayOpenerPointer + 1; } $this->checkWhitespaceBeforeComma($phpcsFile, $i); $this->checkWhitespaceAfterComma($phpcsFile, $i); } - return $arrayStart + 1; + return $arrayOpenerPointer + 1; } private function checkWhitespaceInEmptyArray(File $phpcsFile, int $arrayStart, int $arrayEnd): void diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/TrailingArrayCommaSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/TrailingArrayCommaSniff.php index 406157785..3ced79010 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/TrailingArrayCommaSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Arrays/TrailingArrayCommaSniff.php @@ -4,14 +4,13 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use SlevomatCodingStandard\Helpers\ArrayHelper; use SlevomatCodingStandard\Helpers\SniffSettingsHelper; use SlevomatCodingStandard\Helpers\TokenHelper; use function in_array; -use const T_ARRAY; use const T_COMMA; use const T_END_HEREDOC; use const T_END_NOWDOC; -use const T_OPEN_SHORT_ARRAY; class TrailingArrayCommaSniff implements Sniff { @@ -26,10 +25,7 @@ class TrailingArrayCommaSniff implements Sniff */ public function register(): array { - return [ - T_OPEN_SHORT_ARRAY, - T_ARRAY, - ]; + return TokenHelper::$arrayTokenCodes; } /** @@ -41,29 +37,21 @@ public function process(File $phpcsFile, $stackPointer): void $this->enableAfterHeredoc = SniffSettingsHelper::isEnabledByPhpVersion($this->enableAfterHeredoc, 70300); $tokens = $phpcsFile->getTokens(); - $token = $tokens[$stackPointer]; - $isShortArray = $token['code'] === T_OPEN_SHORT_ARRAY; - $pointerOpener = $isShortArray - ? $token['bracket_opener'] - : $token['parenthesis_opener']; - $pointerCloser = $isShortArray - ? $token['bracket_closer'] - : $token['parenthesis_closer']; - $tokenOpener = $tokens[$pointerOpener]; - $tokenCloser = $tokens[$pointerCloser]; - - if ($tokenOpener['line'] === $tokenCloser['line']) { + + [$arrayOpenerPointer, $arrayCloserPointer] = ArrayHelper::openClosePointers($tokens[$stackPointer]); + + if ($tokens[$arrayOpenerPointer]['line'] === $tokens[$arrayCloserPointer]['line']) { return; } /** @var int $pointerPreviousToClose */ - $pointerPreviousToClose = TokenHelper::findPreviousEffective($phpcsFile, $pointerCloser - 1); + $pointerPreviousToClose = TokenHelper::findPreviousEffective($phpcsFile, $arrayCloserPointer - 1); $tokenPreviousToClose = $tokens[$pointerPreviousToClose]; if ( - $pointerPreviousToClose === $pointerOpener + $pointerPreviousToClose === $arrayOpenerPointer || $tokenPreviousToClose['code'] === T_COMMA - || $tokenCloser['line'] === $tokenPreviousToClose['line'] + || $tokens[$arrayCloserPointer]['line'] === $tokenPreviousToClose['line'] ) { return; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/RequireAttributeAfterDocCommentSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/RequireAttributeAfterDocCommentSniff.php index e78063dd3..9729e99a9 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/RequireAttributeAfterDocCommentSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Attributes/RequireAttributeAfterDocCommentSniff.php @@ -65,7 +65,7 @@ public function process(File $phpcsFile, $attributeOpenerPointer): void $attributeStartPointer = TokenHelper::findFirstTokenOnLine($phpcsFile, $firstAttributeOpenerPointer); $fix = $phpcsFile->addFixableError( - 'Attribute should be placed before documentation comment.', + 'Attribute should be placed after documentation comment.', $attributeOpenerPointer, self::CODE_ATTRIBUTE_BEFORE_DOC_COMMENT ); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php index a2537d261..e01288ba7 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php @@ -180,7 +180,7 @@ class ClassStructureSniff implements Sniff '__debuginfo' => self::GROUP_MAGIC_METHODS, ]; - /** @var string[] */ + /** @var list */ public $groups = []; /** @var array|null */ @@ -448,7 +448,7 @@ private function isStaticConstructor(File $phpcsFile, int $pointer): bool return false; } - return in_array($returnAnnotation->getContent(), ['static', 'self', $parentClassName], true); + return in_array((string) $returnAnnotation->getValue()->type, ['static', 'self', $parentClassName], true); } private function getParentClassName(File $phpcsFile, int $pointer): string @@ -518,6 +518,8 @@ private function findGroupEndPointer(File $phpcsFile, int $memberPointer): int if ($tokens[$memberPointer]['code'] === T_FUNCTION && !FunctionHelper::isAbstract($phpcsFile, $memberPointer)) { $endPointer = $tokens[$memberPointer]['scope_closer']; + } elseif ($tokens[$memberPointer]['code'] === T_USE && array_key_exists('scope_closer', $tokens[$memberPointer])) { + $endPointer = $tokens[$memberPointer]['scope_closer']; } else { $endPointer = TokenHelper::findNext($phpcsFile, T_SEMICOLON, $memberPointer + 1); assert($endPointer !== null); @@ -586,7 +588,7 @@ private function getNormalizedGroups(): array $normalizedGroupsWithShortcuts = []; $order = 1; foreach (SniffSettingsHelper::normalizeArray($this->groups) as $groupsString) { - /** @var string[] $groups */ + /** @var list $groups */ $groups = preg_split('~\\s*,\\s*~', strtolower($groupsString)); foreach ($groups as $groupOrShortcut) { $groupOrShortcut = preg_replace('~\\s+~', ' ', $groupOrShortcut); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowStringExpressionPropertyFetchSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowStringExpressionPropertyFetchSniff.php new file mode 100644 index 000000000..d34e68400 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowStringExpressionPropertyFetchSniff.php @@ -0,0 +1,84 @@ + + */ + public function register(): array + { + return [T_OBJECT_OPERATOR]; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + * @param int $objectOperatorPointer + */ + public function process(File $phpcsFile, $objectOperatorPointer): void + { + $tokens = $phpcsFile->getTokens(); + + $curlyBracketOpenerPointer = TokenHelper::findNextEffective($phpcsFile, $objectOperatorPointer + 1); + + if ($tokens[$curlyBracketOpenerPointer]['code'] !== T_OPEN_CURLY_BRACKET) { + return; + } + + $curlyBracketCloserPointer = $tokens[$curlyBracketOpenerPointer]['bracket_closer']; + + if (TokenHelper::findNextExcluding( + $phpcsFile, + T_CONSTANT_ENCAPSED_STRING, + $curlyBracketOpenerPointer + 1, + $curlyBracketCloserPointer + ) !== null) { + return; + } + + $pointerAfterCurlyBracketCloser = TokenHelper::findNextEffective($phpcsFile, $curlyBracketCloserPointer + 1); + + if ($tokens[$pointerAfterCurlyBracketCloser]['code'] === T_OPEN_PARENTHESIS) { + return; + } + + if (preg_match( + '~^(["\'])([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\1$~', + $tokens[$curlyBracketOpenerPointer + 1]['content'], + $matches + ) !== 1) { + return; + } + + $fix = $phpcsFile->addFixableError( + 'String expression property fetch is disallowed, use identifier property fetch.', + $curlyBracketOpenerPointer, + self::CODE_DISALLOWED_STRING_EXPRESSION_PROPERTY_FETCH + ); + + if (!$fix) { + return; + } + + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change($phpcsFile, $curlyBracketOpenerPointer, $curlyBracketCloserPointer, $matches[2]); + + $phpcsFile->fixer->endChangeset(); + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php index ce53dec7e..58636062b 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php @@ -65,7 +65,7 @@ private function isSniffClass(File $file, int $position): bool /** * @phpcsSuppress SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint.DisallowedMixedTypeHint - * @return mixed[] + * @return array{code: int|string} */ private function getPropertyScopeModifier(File $file, int $position): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MissingClassGroupsException.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MissingClassGroupsException.php index e8153d050..2faddecc9 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MissingClassGroupsException.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/MissingClassGroupsException.php @@ -9,7 +9,7 @@ class MissingClassGroupsException extends Exception { - /** @param string[] $groups */ + /** @param list $groups */ public function __construct(array $groups) { parent::__construct( diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ModernClassNameReferenceSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ModernClassNameReferenceSniff.php index 62fda5259..e58a453db 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ModernClassNameReferenceSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ModernClassNameReferenceSniff.php @@ -169,9 +169,8 @@ private function checkFunctionCall(File $phpcsFile, int $functionPointer): void if ($tokens[$functionPointer - 1]['code'] === T_NS_SEPARATOR) { $phpcsFile->fixer->replaceToken($functionPointer - 1, ''); } - $phpcsFile->fixer->replaceToken($functionPointer, $fixedContent); - FixerHelper::removeBetweenIncluding($phpcsFile, $functionPointer + 1, $tokens[$openParenthesisPointer]['parenthesis_closer']); + FixerHelper::change($phpcsFile, $functionPointer, $tokens[$openParenthesisPointer]['parenthesis_closer'], $fixedContent); $phpcsFile->fixer->endChangeset(); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ParentCallSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ParentCallSpacingSniff.php index 03141982d..2755349bc 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ParentCallSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ParentCallSpacingSniff.php @@ -15,6 +15,7 @@ use const T_COLON; use const T_INLINE_ELSE; use const T_INLINE_THEN; +use const T_MATCH_ARROW; use const T_OPEN_SHORT_ARRAY; use const T_RETURN; use const T_STRING_CONCAT; @@ -62,7 +63,7 @@ public function process(File $phpcsFile, $parentPointer): void Tokens::$assignmentTokens, Tokens::$equalityTokens, Tokens::$booleanOperators, - [T_RETURN, T_YIELD, T_YIELD_FROM, T_COLON, T_STRING_CONCAT, T_INLINE_THEN, T_INLINE_ELSE, T_COALESCE] + [T_RETURN, T_YIELD, T_YIELD_FROM, T_COLON, T_STRING_CONCAT, T_INLINE_THEN, T_INLINE_ELSE, T_COALESCE, T_MATCH_ARROW] ); if (in_array($tokens[$previousPointer]['code'], $tokensToIgnore, true)) { return; @@ -77,7 +78,7 @@ public function process(File $phpcsFile, $parentPointer): void } /** - * @return string[] + * @return list */ protected function getSupportedKeywords(): array { @@ -85,7 +86,7 @@ protected function getSupportedKeywords(): array } /** - * @return string[] + * @return list */ protected function getKeywordsToCheck(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertyDeclarationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertyDeclarationSniff.php index b1f347be7..48dd3ccbf 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertyDeclarationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/PropertyDeclarationSniff.php @@ -53,7 +53,7 @@ class PropertyDeclarationSniff implements Sniff public const CODE_MULTIPLE_SPACES_BETWEEN_MODIFIERS = 'MultipleSpacesBetweenModifiers'; - /** @var string[]|null */ + /** @var list|null */ public $modifiersOrder = []; /** @var bool */ @@ -193,9 +193,7 @@ private function checkModifiersOrder(File $phpcsFile, int $propertyPointer, int $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($firstModifierPointer, $expectedModifiersFormatted); - - FixerHelper::removeBetweenIncluding($phpcsFile, $firstModifierPointer + 1, $lastModifierPointer); + FixerHelper::change($phpcsFile, $firstModifierPointer, $lastModifierPointer, $expectedModifiersFormatted); $phpcsFile->fixer->endChangeset(); } @@ -253,9 +251,7 @@ private function checkSpacesBetweenModifiers( $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($firstModifierPointer, $expectedModifiersFormatted); - - FixerHelper::removeBetweenIncluding($phpcsFile, $firstModifierPointer + 1, $lastModifierPointer); + FixerHelper::change($phpcsFile, $firstModifierPointer, $lastModifierPointer, $expectedModifiersFormatted); $phpcsFile->fixer->endChangeset(); } @@ -386,7 +382,7 @@ private function getNormalizedModifiersOrder(): array foreach ($modifiersGroups as $modifiersGroupNo => $modifiersGroup) { $this->normalizedModifiersOrder[$modifiersGroupNo] = []; - /** @var string[] $modifiers */ + /** @var list $modifiers */ $modifiers = preg_split('~\\s*,\\s*~', strtolower($modifiersGroup)); foreach ($modifiers as $modifier) { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireConstructorPropertyPromotionSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireConstructorPropertyPromotionSniff.php index 4fc737add..d1736c8aa 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireConstructorPropertyPromotionSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireConstructorPropertyPromotionSniff.php @@ -5,7 +5,7 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; use PHP_CodeSniffer\Util\Tokens; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; @@ -158,7 +158,7 @@ public function process(File $phpcsFile, $functionPointer): void continue; } - if ($this->isParameterModifiedBeforeAssigment($phpcsFile, $functionPointer, $parameterName, $assignmentPointer)) { + if ($this->isParameterModifiedBeforeAssignment($phpcsFile, $functionPointer, $parameterName, $assignmentPointer)) { continue; } @@ -280,7 +280,7 @@ private function getAssignment(File $phpcsFile, int $constructorPointer, string } /** - * @return int[] + * @return list */ private function getParameterPointers(File $phpcsFile, int $functionPointer): array { @@ -294,7 +294,7 @@ private function getParameterPointers(File $phpcsFile, int $functionPointer): ar } /** - * @return int[] + * @return list */ private function getPropertyPointers(File $phpcsFile, int $classPointer): array { @@ -319,16 +319,14 @@ private function isPropertyDocCommentUseful(File $phpcsFile, int $propertyPointe return true; } - foreach (AnnotationHelper::getAnnotations($phpcsFile, $propertyPointer) as $annotationType => $annotations) { - if (!in_array($annotationType, ['@var', '@phpstan-var', '@psalm-var'], true)) { + foreach (AnnotationHelper::getAnnotations($phpcsFile, $propertyPointer) as $annotation) { + $annotationValue = $annotation->getValue(); + if (!$annotationValue instanceof VarTagValueNode) { return true; } - /** @var VariableAnnotation $annotation */ - foreach ($annotations as $annotation) { - if ($annotation->hasDescription()) { - return true; - } + if ($annotationValue->description !== '') { + return true; } } @@ -361,16 +359,16 @@ private function areTypeHintEqual(?TypeHint $parameterTypeHint, ?TypeHint $prope return $parameterTypeHint->getTypeHint() === $propertyTypeHint->getTypeHint(); } - private function isParameterModifiedBeforeAssigment( + private function isParameterModifiedBeforeAssignment( File $phpcsFile, int $functionPointer, string $parameterName, - int $assigmentPointer + int $assignmentPointer ): bool { $tokens = $phpcsFile->getTokens(); - for ($i = $assigmentPointer - 1; $i > $tokens[$functionPointer]['scope_opener']; $i--) { + for ($i = $assignmentPointer - 1; $i > $tokens[$functionPointer]['scope_opener']; $i--) { if ($tokens[$i]['code'] !== T_VARIABLE) { continue; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireMultiLineMethodSignatureSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireMultiLineMethodSignatureSniff.php index 8b9142a75..abac22a86 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireMultiLineMethodSignatureSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireMultiLineMethodSignatureSniff.php @@ -28,16 +28,16 @@ class RequireMultiLineMethodSignatureSniff extends AbstractMethodSignature /** @var int|null */ public $minParametersCount = null; - /** @var string[] */ + /** @var list */ public $includedMethodPatterns = []; - /** @var string[]|null */ + /** @var list|null */ public $includedMethodNormalizedPatterns; - /** @var string[] */ + /** @var list */ public $excludedMethodPatterns = []; - /** @var string[]|null */ + /** @var list|null */ public $excludedMethodNormalizedPatterns; /** @@ -134,7 +134,7 @@ public function process(File $phpcsFile, $methodPointer): void } /** - * @param string[] $normalizedPatterns + * @param list $normalizedPatterns */ private function isMethodNameInPatterns(string $methodName, array $normalizedPatterns): bool { @@ -152,7 +152,7 @@ private function isMethodNameInPatterns(string $methodName, array $normalizedPat } /** - * @return string[] + * @return list */ private function getIncludedMethodNormalizedPatterns(): array { @@ -163,7 +163,7 @@ private function getIncludedMethodNormalizedPatterns(): array } /** - * @return string[] + * @return list */ private function getExcludedMethodNormalizedPatterns(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodSignatureSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodSignatureSniff.php index 30f40c530..4a2342ead 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodSignatureSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/RequireSingleLineMethodSignatureSniff.php @@ -20,16 +20,16 @@ class RequireSingleLineMethodSignatureSniff extends AbstractMethodSignature /** @var int */ public $maxLineLength = 120; - /** @var string[] */ + /** @var list */ public $includedMethodPatterns = []; - /** @var string[]|null */ + /** @var list|null */ public $includedMethodNormalizedPatterns; - /** @var string[] */ + /** @var list */ public $excludedMethodPatterns = []; - /** @var string[]|null */ + /** @var list|null */ public $excludedMethodNormalizedPatterns; /** @@ -82,15 +82,13 @@ public function process(File $phpcsFile, $methodPointer): void $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($signatureStartPointer, $signature); - - FixerHelper::removeBetweenIncluding($phpcsFile, $signatureStartPointer + 1, $signatureEndPointer); + FixerHelper::change($phpcsFile, $signatureStartPointer, $signatureEndPointer, $signature); $phpcsFile->fixer->endChangeset(); } /** - * @param string[] $normalizedPatterns + * @param list $normalizedPatterns */ private function isMethodNameInPatterns(string $methodName, array $normalizedPatterns): bool { @@ -108,7 +106,7 @@ private function isMethodNameInPatterns(string $methodName, array $normalizedPat } /** - * @return string[] + * @return list */ private function getIncludedMethodNormalizedPatterns(): array { @@ -119,7 +117,7 @@ private function getIncludedMethodNormalizedPatterns(): array } /** - * @return string[] + * @return list */ private function getExcludedMethodNormalizedPatterns(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseDeclarationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseDeclarationSniff.php index c454a9330..0ed15b4e1 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseDeclarationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseDeclarationSniff.php @@ -91,9 +91,8 @@ private function checkDeclaration(File $phpcsFile, int $usePointer): void $otherCommaPointers = TokenHelper::findNextAll($phpcsFile, T_COMMA, $usePointer + 1, $endPointer); foreach ($otherCommaPointers as $otherCommaPointer) { $pointerAfterComma = TokenHelper::findNextEffective($phpcsFile, $otherCommaPointer + 1); - $phpcsFile->fixer->replaceToken($otherCommaPointer, ';' . $phpcsFile->eolChar . $indentation . 'use '); - FixerHelper::removeBetween($phpcsFile, $otherCommaPointer, $pointerAfterComma); + FixerHelper::change($phpcsFile, $otherCommaPointer, $pointerAfterComma - 1, ';' . $phpcsFile->eolChar . $indentation . 'use '); } $phpcsFile->fixer->endChangeset(); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseSpacingSniff.php index 5380d9a8e..0a4f4ef71 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/TraitUseSpacingSniff.php @@ -212,7 +212,7 @@ private function checkLinesAfterLastUse(File $phpcsFile, int $lastUsePointer): v } /** - * @param int[] $usePointers + * @param list $usePointers */ private function checkLinesBetweenUses(File $phpcsFile, array $usePointers): void { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AnnotationNameSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AnnotationNameSniff.php new file mode 100644 index 000000000..26c223418 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AnnotationNameSniff.php @@ -0,0 +1,299 @@ +|null */ + public $annotations; + + /** @var array|null */ + private $normalizedAnnotations; + + /** + * @return array + */ + public function register(): array + { + return [ + T_DOC_COMMENT_OPEN_TAG, + ]; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + * @param int $docCommentOpenPointer + */ + public function process(File $phpcsFile, $docCommentOpenPointer): void + { + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); + $correctAnnotationNames = $this->getNormalizedAnnotationNames(); + + foreach ($annotations as $annotation) { + $lowerCasedAnnotationName = strtolower($annotation->getName()); + + if (!array_key_exists($lowerCasedAnnotationName, $correctAnnotationNames)) { + continue; + } + + $correctAnnotationName = $correctAnnotationNames[$lowerCasedAnnotationName]; + + if ($correctAnnotationName === $annotation->getName()) { + continue; + } + + $annotationNameWithoutAtSign = ltrim($annotation->getName(), '@'); + $fullyQualifiedAnnotationName = NamespaceHelper::resolveClassName( + $phpcsFile, + $annotationNameWithoutAtSign, + $annotation->getStartPointer() + ); + + if (NamespaceHelper::normalizeToCanonicalName($fullyQualifiedAnnotationName) !== $annotationNameWithoutAtSign) { + continue; + } + + $fix = $phpcsFile->addFixableError( + sprintf('Annotation name is incorrect. Expected %s, found %s.', $correctAnnotationName, $annotation->getName()), + $annotation->getStartPointer(), + self::CODE_ANNOTATION_NAME_INCORRECT + ); + if (!$fix) { + continue; + } + + $phpcsFile->fixer->beginChangeset(); + + $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $correctAnnotationName); + + $phpcsFile->fixer->endChangeset(); + } + + $tokens = $phpcsFile->getTokens(); + + $docCommentContent = TokenHelper::getContent($phpcsFile, $docCommentOpenPointer, $tokens[$docCommentOpenPointer]['comment_closer']); + + if (preg_match_all( + '~\{(' . implode('|', $correctAnnotationNames) . ')\}~i', + $docCommentContent, + $matches, + PREG_OFFSET_CAPTURE + ) === 0) { + return; + } + + foreach ($matches[1] as $match) { + $correctAnnotationName = $correctAnnotationNames[strtolower($match[0])]; + + if ($correctAnnotationName === $match[0]) { + continue; + } + + $fix = $phpcsFile->addFixableError( + sprintf('Annotation name is incorrect. Expected %s, found %s.', $correctAnnotationName, $match[0]), + $docCommentOpenPointer, + self::CODE_ANNOTATION_NAME_INCORRECT + ); + if (!$fix) { + continue; + } + + $phpcsFile->fixer->beginChangeset(); + + $fixedDocCommentContent = substr($docCommentContent, 0, $match[1]) . $correctAnnotationName . substr( + $docCommentContent, + $match[1] + strlen($match[0]) + ); + + FixerHelper::change( + $phpcsFile, + $docCommentOpenPointer, + $tokens[$docCommentOpenPointer]['comment_closer'], + $fixedDocCommentContent + ); + + $phpcsFile->fixer->endChangeset(); + } + } + + /** + * @return array + */ + private function getNormalizedAnnotationNames(): array + { + if ($this->normalizedAnnotations !== null) { + return $this->normalizedAnnotations; + } + + if ($this->annotations !== null) { + $annotationNames = array_map(static function (string $annotationName): string { + return ltrim($annotationName, '@'); + }, SniffSettingsHelper::normalizeArray($this->annotations)); + } else { + $annotationNames = array_merge(self::STANDARD_ANNOTATIONS, self::PHPUNIT_ANNOTATIONS, self::STATIC_ANALYSIS_ANNOTATIONS); + + foreach (self::STATIC_ANALYSIS_ANNOTATIONS as $annotationName) { + if (strpos($annotationName, 'psalm') === 0) { + continue; + } + + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefix) { + $annotationNames[] = sprintf('%s-%s', $prefix, $annotationName); + } + } + } + + $annotationNames = array_map(static function (string $annotationName): string { + return '@' . $annotationName; + }, array_unique($annotationNames)); + + $this->normalizedAnnotations = array_combine(array_map(static function (string $annotationName): string { + return strtolower($annotationName); + }, $annotationNames), $annotationNames); + + return $this->normalizedAnnotations; + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DeprecatedAnnotationDeclarationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DeprecatedAnnotationDeclarationSniff.php index c2e3335f7..633403d2b 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DeprecatedAnnotationDeclarationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DeprecatedAnnotationDeclarationSniff.php @@ -4,7 +4,8 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use function count; use const T_DOC_COMMENT_OPEN_TAG; @@ -26,15 +27,15 @@ public function register(): array */ public function process(File $phpcsFile, $docCommentStartPointer): void { - /** @var GenericAnnotation[] $annotations */ - $annotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $docCommentStartPointer, '@deprecated'); + /** @var list> $annotations */ + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentStartPointer, '@deprecated'); if (count($annotations) === 0) { return; } foreach ($annotations as $annotation) { - if ($annotation->getContent() !== null) { + if ($annotation->getValue()->description !== '') { continue; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowCommentAfterCodeSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowCommentAfterCodeSniff.php index 9d910b5a6..b7ae8c53f 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowCommentAfterCodeSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowCommentAfterCodeSniff.php @@ -42,13 +42,24 @@ public function register(): array */ public function process(File $phpcsFile, $commentPointer): void { + $tokens = $phpcsFile->getTokens(); + + if ($tokens[$commentPointer]['column'] === 1) { + return; + } + $firstNonWhitespacePointerOnLine = TokenHelper::findFirstNonWhitespaceOnLine($phpcsFile, $commentPointer); if ($firstNonWhitespacePointerOnLine === $commentPointer) { return; } - $tokens = $phpcsFile->getTokens(); + if ( + $tokens[$firstNonWhitespacePointerOnLine]['code'] === T_DOC_COMMENT_OPEN_TAG + && $tokens[$firstNonWhitespacePointerOnLine]['comment_closer'] > $commentPointer + ) { + return; + } $commentEndPointer = CommentHelper::getCommentEndPointer($phpcsFile, $commentPointer); $nextNonWhitespacePointer = TokenHelper::findNextNonWhitespace($phpcsFile, $commentEndPointer + 1); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowOneLinePropertyDocCommentSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowOneLinePropertyDocCommentSniff.php index 43c431022..bbb4e8102 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowOneLinePropertyDocCommentSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DisallowOneLinePropertyDocCommentSniff.php @@ -18,7 +18,7 @@ class DisallowOneLinePropertyDocCommentSniff implements Sniff public const CODE_ONE_LINE_PROPERTY_COMMENT = 'OneLinePropertyComment'; /** - * @return int[] + * @return list */ public function register(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DocCommentSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DocCommentSpacingSniff.php index b58790045..f2ac58b73 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DocCommentSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/DocCommentSpacingSniff.php @@ -4,7 +4,7 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; -use SlevomatCodingStandard\Helpers\Annotation\Annotation; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; @@ -17,7 +17,6 @@ use function array_key_exists; use function array_keys; use function array_map; -use function array_merge; use function array_values; use function asort; use function count; @@ -32,11 +31,9 @@ use function substr; use function substr_count; use function trim; -use function uasort; use function usort; use const T_DOC_COMMENT_OPEN_TAG; use const T_DOC_COMMENT_STAR; -use const T_DOC_COMMENT_STRING; use const T_DOC_COMMENT_WHITESPACE; class DocCommentSpacingSniff implements Sniff @@ -66,10 +63,10 @@ class DocCommentSpacingSniff implements Sniff /** @var int */ public $linesCountAfterLastContent = 0; - /** @var string[] */ + /** @var list */ public $annotationsGroups = []; - /** @var string[][]|null */ + /** @var array>|null */ private $normalizedAnnotationsGroups = null; /** @@ -104,45 +101,40 @@ public function process(File $phpcsFile, $docCommentOpenerPointer): void $tokens = $phpcsFile->getTokens(); - $firstContentStartPointer = TokenHelper::findNextExcluding( + if (TokenHelper::findNextExcluding( $phpcsFile, [T_DOC_COMMENT_WHITESPACE, T_DOC_COMMENT_STAR], $docCommentOpenerPointer + 1, $tokens[$docCommentOpenerPointer]['comment_closer'] - ); - - if ($firstContentStartPointer === null) { + ) === null) { return; } - $firstContentEndPointer = $firstContentStartPointer; - $actualPointer = $firstContentStartPointer; - do { - /** @var int $actualPointer */ - $actualPointer = TokenHelper::findNextExcluding( - $phpcsFile, - [T_DOC_COMMENT_STAR, T_DOC_COMMENT_WHITESPACE], - $actualPointer + 1, - $tokens[$docCommentOpenerPointer]['comment_closer'] + 1 - ); + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenerPointer); - if ($tokens[$actualPointer]['code'] !== T_DOC_COMMENT_STRING) { - break; - } + if ($parsedDocComment === null) { + return; + } - $firstContentEndPointer = $actualPointer; - } while (true); + $firstContentStartPointer = $parsedDocComment->getNodeStartPointer($phpcsFile, $parsedDocComment->getNode()->children[0]); + $firstContentEndPointer = $parsedDocComment->getNodeEndPointer( + $phpcsFile, + $parsedDocComment->getNode()->children[0], + $firstContentStartPointer + ); - $annotations = array_merge([], ...array_values(AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenerPointer))); - uasort($annotations, static function (Annotation $a, Annotation $b): int { - return $a->getStartPointer() <=> $b->getEndPointer(); + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenerPointer); + usort($annotations, static function (Annotation $a, Annotation $b): int { + return $a->getStartPointer() <=> $b->getStartPointer(); }); - $annotations = array_values($annotations); $annotationsCount = count($annotations); - $firstAnnotation = $annotationsCount > 0 ? $annotations[0] : null; + $firstAnnotationPointer = $annotationsCount > 0 ? $annotations[0]->getStartPointer() : null; - $lastContentEndPointer = $annotationsCount > 0 ? $annotations[$annotationsCount - 1]->getEndPointer() : $firstContentEndPointer; + /** @var int $lastContentEndPointer */ + $lastContentEndPointer = $annotationsCount > 0 + ? $annotations[$annotationsCount - 1]->getEndPointer() + : $firstContentEndPointer; $this->checkLinesBeforeFirstContent($phpcsFile, $docCommentOpenerPointer, $firstContentStartPointer); $this->checkLinesBetweenDescriptionAndFirstAnnotation( @@ -150,7 +142,7 @@ public function process(File $phpcsFile, $docCommentOpenerPointer): void $docCommentOpenerPointer, $firstContentStartPointer, $firstContentEndPointer, - $firstAnnotation + $firstAnnotationPointer ); if (count($annotations) > 1) { @@ -200,9 +192,7 @@ private function checkLinesBeforeFirstContent(File $phpcsFile, int $docCommentOp $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($docCommentOpenerPointer, '/**' . $phpcsFile->eolChar); - - FixerHelper::removeBetween($phpcsFile, $docCommentOpenerPointer, $firstContentStartPointer); + FixerHelper::change($phpcsFile, $docCommentOpenerPointer, $firstContentStartPointer - 1, '/**' . $phpcsFile->eolChar); for ($i = 1; $i <= $this->linesCountBeforeFirstContent; $i++) { $phpcsFile->fixer->addContent($docCommentOpenerPointer, sprintf('%s *%s', $indentation, $phpcsFile->eolChar)); @@ -218,14 +208,14 @@ private function checkLinesBetweenDescriptionAndFirstAnnotation( int $docCommentOpenerPointer, int $firstContentStartPointer, int $firstContentEndPointer, - ?Annotation $firstAnnotation + ?int $firstAnnotationPointer ): void { - if ($firstAnnotation === null) { + if ($firstAnnotationPointer === null) { return; } - if ($firstContentStartPointer === $firstAnnotation->getStartPointer()) { + if ($firstContentStartPointer === $firstAnnotationPointer) { return; } @@ -237,7 +227,7 @@ private function checkLinesBetweenDescriptionAndFirstAnnotation( $whitespaceBetweenDescriptionAndFirstAnnotation .= TokenHelper::getContent( $phpcsFile, $firstContentEndPointer + 1, - $firstAnnotation->getStartPointer() - 1 + $firstAnnotationPointer - 1 ); $linesCountBetweenDescriptionAndAnnotations = max( @@ -255,7 +245,7 @@ private function checkLinesBetweenDescriptionAndFirstAnnotation( $this->linesCountBetweenDescriptionAndAnnotations === 1 ? '' : 's', $linesCountBetweenDescriptionAndAnnotations ), - $firstAnnotation->getStartPointer(), + $firstAnnotationPointer, self::CODE_INCORRECT_LINES_COUNT_BETWEEN_DESCRIPTION_AND_ANNOTATIONS ); @@ -269,24 +259,22 @@ private function checkLinesBetweenDescriptionAndFirstAnnotation( $phpcsFile->fixer->addNewline($firstContentEndPointer); - FixerHelper::removeBetween($phpcsFile, $firstContentEndPointer, $firstAnnotation->getStartPointer()); + FixerHelper::removeBetween($phpcsFile, $firstContentEndPointer, $firstAnnotationPointer); for ($i = 1; $i <= $this->linesCountBetweenDescriptionAndAnnotations; $i++) { $phpcsFile->fixer->addContent($firstContentEndPointer, sprintf('%s *%s', $indentation, $phpcsFile->eolChar)); } - $phpcsFile->fixer->addContentBefore($firstAnnotation->getStartPointer(), $indentation . ' * '); + $phpcsFile->fixer->addContentBefore($firstAnnotationPointer, $indentation . ' * '); $phpcsFile->fixer->endChangeset(); } /** - * @param Annotation[] $annotations + * @param list $annotations */ private function checkLinesBetweenDifferentAnnotationsTypes(File $phpcsFile, int $docCommentOpenerPointer, array $annotations): void { - $tokens = $phpcsFile->getTokens(); - $indentation = IndentationHelper::getIndentation($phpcsFile, $docCommentOpenerPointer); $previousAnnotation = null; @@ -301,16 +289,13 @@ private function checkLinesBetweenDifferentAnnotationsTypes(File $phpcsFile, int continue; } - preg_match('~(\\s+)$~', $tokens[$previousAnnotation->getEndPointer()]['content'], $matches); - - $linesCountAfterPreviousAnnotation = $matches[1] ?? ''; - $linesCountAfterPreviousAnnotation .= TokenHelper::getContent( + $whitespaceAfterPreviousAnnotation = TokenHelper::getContent( $phpcsFile, $previousAnnotation->getEndPointer() + 1, $annotation->getStartPointer() - 1 ); - $linesCountAfterPreviousAnnotation = max(substr_count($linesCountAfterPreviousAnnotation, $phpcsFile->eolChar) - 1, 0); + $linesCountAfterPreviousAnnotation = max(substr_count($whitespaceAfterPreviousAnnotation, $phpcsFile->eolChar) - 1, 0); if ($linesCountAfterPreviousAnnotation === $this->linesCountBetweenDifferentAnnotationsTypes) { $previousAnnotation = $annotation; @@ -335,10 +320,10 @@ private function checkLinesBetweenDifferentAnnotationsTypes(File $phpcsFile, int $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($previousAnnotation->getEndPointer()); - FixerHelper::removeBetween($phpcsFile, $previousAnnotation->getEndPointer(), $annotation->getStartPointer()); + $phpcsFile->fixer->addNewline($previousAnnotation->getEndPointer()); + for ($i = 1; $i <= $this->linesCountBetweenDifferentAnnotationsTypes; $i++) { $phpcsFile->fixer->addContent($previousAnnotation->getEndPointer(), sprintf('%s *%s', $indentation, $phpcsFile->eolChar)); } @@ -346,11 +331,13 @@ private function checkLinesBetweenDifferentAnnotationsTypes(File $phpcsFile, int $phpcsFile->fixer->addContentBefore($annotation->getStartPointer(), $indentation . ' * '); $phpcsFile->fixer->endChangeset(); + + $previousAnnotation = $annotation; } } /** - * @param Annotation[] $annotations + * @param list $annotations */ private function checkAnnotationsGroups(File $phpcsFile, int $docCommentOpenerPointer, array $annotations): void { @@ -383,7 +370,7 @@ private function checkAnnotationsGroups(File $phpcsFile, int $docCommentOpenerPo } /** - * @param Annotation[][] $annotationsGroups + * @param list> $annotationsGroups */ private function checkLinesBetweenAnnotationsGroups(File $phpcsFile, int $docCommentOpenerPointer, array $annotationsGroups): void { @@ -396,7 +383,6 @@ private function checkLinesBetweenAnnotationsGroups(File $phpcsFile, int $docCom continue; } - /** @var Annotation $lastAnnotationInPreviousGroup */ $lastAnnotationInPreviousGroup = $previousAnnotationsGroup[count($previousAnnotationsGroup) - 1]; $firstAnnotationInActualGroup = $annotationsGroup[0]; @@ -451,8 +437,8 @@ private function checkLinesBetweenAnnotationsGroups(File $phpcsFile, int $docCom } /** - * @param Annotation[][] $annotationsGroups - * @param Annotation[] $annotations + * @param list> $annotationsGroups + * @param list $annotations */ private function checkAnnotationsGroupsOrder( File $phpcsFile, @@ -461,11 +447,11 @@ private function checkAnnotationsGroupsOrder( array $annotations ): void { - $equals = static function (array $firstAnnotationsGroup, array $secondAnnotationsGroup): bool { - $getAnnotationsPointers = static function (Annotation $annotation): int { - return $annotation->getStartPointer(); - }; + $getAnnotationsPointers = static function (Annotation $annotation): int { + return $annotation->getStartPointer(); + }; + $equals = static function (array $firstAnnotationsGroup, array $secondAnnotationsGroup) use ($getAnnotationsPointers): bool { $firstAnnotationsPointers = array_map($getAnnotationsPointers, $firstAnnotationsGroup); $secondAnnotationsPointers = array_map($getAnnotationsPointers, $secondAnnotationsGroup); @@ -534,7 +520,7 @@ private function checkAnnotationsGroupsOrder( $positionsMappedToGroups = array_keys($annotationsGroupsPositions); $tmp = array_values($annotationsGroupsPositions); asort($tmp); - /** @var int[] $normalizedAnnotationsGroupsPositions */ + /** @var list $normalizedAnnotationsGroupsPositions */ $normalizedAnnotationsGroupsPositions = array_combine(array_keys($positionsMappedToGroups), array_keys($tmp)); foreach ($normalizedAnnotationsGroupsPositions as $normalizedAnnotationsGroupPosition => $sortedAnnotationsGroupPosition) { @@ -630,22 +616,24 @@ private function checkAnnotationsGroupsOrder( } $phpcsFile->fixer->beginChangeset(); - if ($endOfLineBeforeFirstAnnotation === null) { - $phpcsFile->fixer->replaceToken($docCommentOpenerPointer, '/**' . $phpcsFile->eolChar . $fixedAnnotations); - - FixerHelper::removeBetweenIncluding($phpcsFile, $docCommentOpenerPointer + 1, $docCommentContentEndPointer); + if ($endOfLineBeforeFirstAnnotation === null) { + FixerHelper::change( + $phpcsFile, + $docCommentOpenerPointer, + $docCommentContentEndPointer, + '/**' . $phpcsFile->eolChar . $fixedAnnotations + ); } else { - $phpcsFile->fixer->replaceToken($endOfLineBeforeFirstAnnotation + 1, $fixedAnnotations); - - FixerHelper::removeBetweenIncluding($phpcsFile, $endOfLineBeforeFirstAnnotation + 2, $docCommentContentEndPointer); + FixerHelper::change($phpcsFile, $endOfLineBeforeFirstAnnotation + 1, $docCommentContentEndPointer, $fixedAnnotations); } + $phpcsFile->fixer->endChangeset(); } /** - * @param Annotation[] $annotations - * @return Annotation[][] + * @param list $annotations + * @return list> */ private function sortAnnotationsToGroups(array $annotations): array { @@ -762,10 +750,10 @@ private function checkLinesAfterLastContent( $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->addNewline($lastContentEndPointer); - FixerHelper::removeBetween($phpcsFile, $lastContentEndPointer, $docCommentCloserPointer); + $phpcsFile->fixer->addNewline($lastContentEndPointer); + for ($i = 1; $i <= $this->linesCountAfterLastContent; $i++) { $phpcsFile->fixer->addContent($lastContentEndPointer, sprintf('%s *%s', $indentation, $phpcsFile->eolChar)); } @@ -776,7 +764,7 @@ private function checkLinesAfterLastContent( } /** - * @return string[][] + * @return array> */ private function getAnnotationsGroups(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenAnnotationsSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenAnnotationsSniff.php index de8c24d5b..bbce185bc 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenAnnotationsSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenAnnotationsSniff.php @@ -22,10 +22,10 @@ class ForbiddenAnnotationsSniff implements Sniff public const CODE_ANNOTATION_FORBIDDEN = 'AnnotationForbidden'; - /** @var string[] */ + /** @var list */ public $forbiddenAnnotations = []; - /** @var string[]|null */ + /** @var list|null */ private $normalizedForbiddenAnnotations; /** @@ -48,80 +48,78 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationName => $annotationsByName) { - if (!in_array($annotationName, $this->getNormalizedForbiddenAnnotations(), true)) { + foreach ($annotations as $annotation) { + if (!in_array($annotation->getName(), $this->getNormalizedForbiddenAnnotations(), true)) { continue; } - foreach ($annotationsByName as $annotation) { - $fix = $phpcsFile->addFixableError( - sprintf('Use of annotation %s is forbidden.', $annotationName), - $annotation->getStartPointer(), - self::CODE_ANNOTATION_FORBIDDEN - ); - if (!$fix) { - continue; - } + $fix = $phpcsFile->addFixableError( + sprintf('Use of annotation %s is forbidden.', $annotation->getName()), + $annotation->getStartPointer(), + self::CODE_ANNOTATION_FORBIDDEN + ); + if (!$fix) { + continue; + } - $starPointer = TokenHelper::findPrevious( - $phpcsFile, - T_DOC_COMMENT_STAR, - $annotation->getStartPointer() - 1, - $docCommentOpenPointer - ); - $annotationStartPointer = $starPointer ?? $docCommentOpenPointer + 1; + $starPointer = TokenHelper::findPrevious( + $phpcsFile, + T_DOC_COMMENT_STAR, + $annotation->getStartPointer() - 1, + $docCommentOpenPointer + ); + $annotationStartPointer = $starPointer ?? $annotation->getStartPointer(); + + /** @var int $nextPointer */ + $nextPointer = TokenHelper::findNext( + $phpcsFile, + [T_DOC_COMMENT_TAG, T_DOC_COMMENT_CLOSE_TAG], + $annotation->getEndPointer() + 1 + ); + if ($tokens[$nextPointer]['code'] === T_DOC_COMMENT_TAG) { + $nextPointer = TokenHelper::findPrevious($phpcsFile, T_DOC_COMMENT_STAR, $nextPointer - 1); + } + $annotationEndPointer = $nextPointer - 1; - /** @var int $nextPointer */ - $nextPointer = TokenHelper::findNext( + if ($tokens[$nextPointer]['code'] === T_DOC_COMMENT_CLOSE_TAG && $starPointer !== null) { + $pointerBeforeWhitespace = TokenHelper::findPreviousExcluding( $phpcsFile, - [T_DOC_COMMENT_TAG, T_DOC_COMMENT_CLOSE_TAG], - $annotation->getEndPointer() + 1 + [T_DOC_COMMENT_WHITESPACE, T_DOC_COMMENT_STAR], + $annotationStartPointer - 1 ); - if ($tokens[$nextPointer]['code'] === T_DOC_COMMENT_TAG) { - $nextPointer = TokenHelper::findPrevious($phpcsFile, T_DOC_COMMENT_STAR, $nextPointer - 1); - } - $annotationEndPointer = $nextPointer - 1; - - if ($tokens[$nextPointer]['code'] === T_DOC_COMMENT_CLOSE_TAG && $starPointer !== null) { - $pointerBeforeWhitespace = TokenHelper::findPreviousExcluding( - $phpcsFile, - [T_DOC_COMMENT_WHITESPACE, T_DOC_COMMENT_STAR], - $annotationStartPointer - 1 - ); - /** @var int $annotationStartPointer */ - $annotationStartPointer = TokenHelper::findNext($phpcsFile, T_DOC_COMMENT_STAR, $pointerBeforeWhitespace + 1); - } - - $phpcsFile->fixer->beginChangeset(); + /** @var int $annotationStartPointer */ + $annotationStartPointer = TokenHelper::findNext($phpcsFile, T_DOC_COMMENT_STAR, $pointerBeforeWhitespace + 1); + } - FixerHelper::removeBetweenIncluding($phpcsFile, $annotationStartPointer, $annotationEndPointer); + $phpcsFile->fixer->beginChangeset(); - $docCommentUseful = false; - $docCommentClosePointer = $tokens[$docCommentOpenPointer]['comment_closer']; - for ($i = $docCommentOpenPointer + 1; $i < $docCommentClosePointer; $i++) { - $tokenContent = trim($phpcsFile->fixer->getTokenContent($i)); - if ($tokenContent === '' || $tokenContent === '*') { - continue; - } + FixerHelper::removeBetweenIncluding($phpcsFile, $annotationStartPointer, $annotationEndPointer); - $docCommentUseful = true; - break; + $docCommentUseful = false; + $docCommentClosePointer = $tokens[$docCommentOpenPointer]['comment_closer']; + for ($i = $docCommentOpenPointer + 1; $i < $docCommentClosePointer; $i++) { + $tokenContent = trim($phpcsFile->fixer->getTokenContent($i)); + if ($tokenContent === '' || $tokenContent === '*') { + continue; } - if (!$docCommentUseful) { - /** @var int $nextPointerAfterDocComment */ - $nextPointerAfterDocComment = TokenHelper::findNextEffective($phpcsFile, $docCommentClosePointer + 1); + $docCommentUseful = true; + break; + } - FixerHelper::removeBetweenIncluding($phpcsFile, $docCommentOpenPointer, $nextPointerAfterDocComment - 1); - } + if (!$docCommentUseful) { + /** @var int $nextPointerAfterDocComment */ + $nextPointerAfterDocComment = TokenHelper::findNextEffective($phpcsFile, $docCommentClosePointer + 1); - $phpcsFile->fixer->endChangeset(); + FixerHelper::removeBetweenIncluding($phpcsFile, $docCommentOpenPointer, $nextPointerAfterDocComment - 1); } + + $phpcsFile->fixer->endChangeset(); } } /** - * @return string[] + * @return list */ private function getNormalizedForbiddenAnnotations(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenCommentsSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenCommentsSniff.php index c27206ebd..f89881ab3 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenCommentsSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/ForbiddenCommentsSniff.php @@ -20,7 +20,7 @@ class ForbiddenCommentsSniff implements Sniff public const CODE_COMMENT_FORBIDDEN = 'CommentForbidden'; - /** @var string[] */ + /** @var list */ public $forbiddenCommentPatterns = []; /** @@ -85,7 +85,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $docCommentContent = ''; for ($i = $docCommentOpenPointer + 1; $i < $tokens[$docCommentOpenPointer]['comment_closer']; $i++) { - /** @var string|(string|int)[] $token */ + /** @var string|array<(string|int)> $token */ $token = $phpcsFile->fixer->getTokenContent($i); $docCommentContent .= is_array($token) ? $token['content'] : $token; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/InlineDocCommentDeclarationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/InlineDocCommentDeclarationSniff.php index 24209ace7..ebdd43e64 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/InlineDocCommentDeclarationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/InlineDocCommentDeclarationSniff.php @@ -4,7 +4,8 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\PropertyHelper; @@ -111,8 +112,8 @@ public function process(File $phpcsFile, $commentOpenPointer): void return; } - /** @var list $annotations */ - $annotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $commentOpenPointer, '@var'); + /** @var list> $annotations */ + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $commentOpenPointer, '@var'); if ($annotations === []) { return; @@ -153,23 +154,24 @@ private function checkCommentType(File $phpcsFile, int $commentOpenPointer): voi } /** - * @param list $annotations + * @param list> $annotations */ private function checkFormat(File $phpcsFile, array $annotations): void { foreach ($annotations as $annotation) { - if (!$annotation->isInvalid() && $annotation->getVariableName() !== null) { + if (!$annotation->isInvalid() && $annotation->getValue()->variableName !== '') { continue; } - $annotationContent = $annotation->getContent(); + $variableName = '$variableName'; + + $annotationContent = (string) $annotation->getValue(); - $variableName = '$variable'; $type = null; if ( - $annotationContent !== null - && preg_match('~(\$\w+)(?:\s+(.+))?$~i', $annotation->getContent(), $matches) === 1 + $annotationContent !== '' + && preg_match('~(\$\w+)(?:\s+(.+))?$~i', $annotationContent, $matches) === 1 ) { $variableName = $matches[1]; $type = $matches[2] ?? null; @@ -182,7 +184,7 @@ private function checkFormat(File $phpcsFile, array $annotations): void $phpcsFile->addError( sprintf( 'Invalid inline documentation comment format "@var %1$s", expected "@var type %2$s Optional description".', - $annotation->getContent(), + $annotationContent, $variableName ), $annotation->getStartPointer(), @@ -195,7 +197,7 @@ private function checkFormat(File $phpcsFile, array $annotations): void $fix = $phpcsFile->addFixableError( sprintf( 'Invalid inline documentation comment format "@var %1$s", expected "@var %2$s %3$s".', - $annotation->getContent(), + $annotationContent, $type, $variableName ), @@ -225,7 +227,7 @@ private function checkFormat(File $phpcsFile, array $annotations): void } /** - * @param list $annotations + * @param list> $annotations */ private function checkVariable(File $phpcsFile, array $annotations, int $docCommentOpenerPointer, int $docCommentCloserPointer): void { @@ -240,8 +242,8 @@ private function checkVariable(File $phpcsFile, array $annotations, int $docComm continue; } - $variableName = $variableAnnotation->getVariableName(); - if ($variableName === null) { + $variableName = $variableAnnotation->getValue()->variableName; + if ($variableName === '') { continue; } @@ -304,8 +306,8 @@ private function checkVariable(File $phpcsFile, array $annotations, int $docComm continue; } - $variableName = $variableAnnotation->getVariableName(); - if ($variableName === null) { + $variableName = $variableAnnotation->getValue()->variableName; + if ($variableName === '') { continue; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessFunctionDocCommentSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessFunctionDocCommentSniff.php index f93be54e7..502b058ec 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessFunctionDocCommentSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/UselessFunctionDocCommentSniff.php @@ -22,7 +22,7 @@ class UselessFunctionDocCommentSniff implements Sniff public const CODE_USELESS_DOC_COMMENT = 'UselessDocComment'; - /** @var string[] */ + /** @var list */ public $traversableTypeHints = []; /** @var array|null */ @@ -91,7 +91,7 @@ public function process(File $phpcsFile, $functionPointer): void } } - foreach (AnnotationHelper::getAnnotations($phpcsFile, $functionPointer) as [$annotation]) { + foreach (AnnotationHelper::getAnnotations($phpcsFile, $functionPointer) as $annotation) { if (!in_array($annotation->getName(), ['@param', '@return'], true)) { return; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php index 3b6934e38..2c1bb8077 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/AbstractControlStructureSpacing.php @@ -81,16 +81,16 @@ abstract class AbstractControlStructureSpacing implements Sniff protected const KEYWORD_YIELD = 'yield'; protected const KEYWORD_YIELD_FROM = 'yield_from'; - /** @var (string|int)[]|null */ + /** @var array<(string|int)>|null */ private $tokensToCheck; /** - * @return string[] + * @return list */ abstract protected function getSupportedKeywords(): array; /** - * @return string[] + * @return list */ abstract protected function getKeywordsToCheck(): array; @@ -217,7 +217,9 @@ protected function checkLinesBefore(File $phpcsFile, int $controlStructurePointe $phpcsFile->fixer->replaceToken($pointerBefore, ' */ public $checkedControlStructures = [ self::IF_CONTROL_STRUCTURE, self::WHILE_CONTROL_STRUCTURE, @@ -89,9 +89,9 @@ protected function isPartOfDo(File $phpcsFile, int $whilePointer): bool $tokens = $phpcsFile->getTokens(); $parenthesisCloserPointer = $tokens[$whilePointer]['parenthesis_closer']; - $pointerAfterParentesisCloser = TokenHelper::findNextEffective($phpcsFile, $parenthesisCloserPointer + 1); + $pointerAfterParenthesisCloser = TokenHelper::findNextEffective($phpcsFile, $parenthesisCloserPointer + 1); - return $tokens[$pointerAfterParentesisCloser]['code'] !== T_OPEN_CURLY_BRACKET; + return $tokens[$pointerAfterParenthesisCloser]['code'] !== T_OPEN_CURLY_BRACKET; } protected function getLineStart(File $phpcsFile, int $pointer): string diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/BlockControlStructureSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/BlockControlStructureSpacingSniff.php index 457ba62b2..ab7821ab1 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/BlockControlStructureSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/BlockControlStructureSpacingSniff.php @@ -25,7 +25,7 @@ class BlockControlStructureSpacingSniff extends AbstractControlStructureSpacing /** @var int */ public $linesCountAfterLast = 0; - /** @var string[] */ + /** @var list */ public $controlStructures = []; /** @@ -47,7 +47,7 @@ public function process(File $phpcsFile, $controlStructurePointer): void } /** - * @return string[] + * @return list */ protected function getSupportedKeywords(): array { @@ -65,7 +65,7 @@ protected function getSupportedKeywords(): array } /** - * @return string[] + * @return list */ protected function getKeywordsToCheck(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/EarlyExitSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/EarlyExitSniff.php index 96d38ca79..fd33700a3 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/EarlyExitSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/EarlyExitSniff.php @@ -156,20 +156,11 @@ private function processElse(File $phpcsFile, int $elsePointer): void IndentationHelper::getIndentation($phpcsFile, $ifPointer) ); + $ifContent = sprintf('if %s {%s}%s%s', $negativeIfCondition, $elseCode, $phpcsFile->eolChar, $afterIfCode); + $phpcsFile->fixer->beginChangeset(); - FixerHelper::removeBetweenIncluding($phpcsFile, $ifPointer, $tokens[$elsePointer]['scope_closer']); - - $phpcsFile->fixer->addContent( - $ifPointer, - sprintf( - 'if %s {%s}%s%s', - $negativeIfCondition, - $elseCode, - $phpcsFile->eolChar, - $afterIfCode - ) - ); + FixerHelper::change($phpcsFile, $ifPointer, $tokens[$elsePointer]['scope_closer'], $ifContent); $phpcsFile->fixer->endChangeset(); @@ -191,19 +182,13 @@ private function processElse(File $phpcsFile, int $elsePointer): void $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken( - $tokens[$previousConditionPointer]['scope_closer'] + 1, - sprintf( - '%s%s', - $phpcsFile->eolChar, - $afterIfCode - ) - ); + $previousConditionContent = sprintf('%s%s', $phpcsFile->eolChar, $afterIfCode); - FixerHelper::removeBetweenIncluding( + FixerHelper::change( $phpcsFile, - $tokens[$previousConditionPointer]['scope_closer'] + 2, - $tokens[$elsePointer]['scope_closer'] + $tokens[$previousConditionPointer]['scope_closer'] + 1, + $tokens[$elsePointer]['scope_closer'], + $previousConditionContent ); $phpcsFile->fixer->endChangeset(); @@ -357,24 +342,21 @@ private function processIf(File $phpcsFile, int $ifPointer): void ); $afterIfCode = IndentationHelper::fixIndentation($phpcsFile, $ifCodePointers, $ifIndentation); - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken( - $ifPointer, - sprintf( - 'if %s {%s%s%s;%s%s}%s%s', - $negativeIfCondition, - $phpcsFile->eolChar, - $earlyExitCodeIndentation, - $earlyExitCode, - $phpcsFile->eolChar, - $ifIndentation, - $phpcsFile->eolChar, - $afterIfCode - ) + $ifContent = sprintf( + 'if %s {%s%s%s;%s%s}%s%s', + $negativeIfCondition, + $phpcsFile->eolChar, + $earlyExitCodeIndentation, + $earlyExitCode, + $phpcsFile->eolChar, + $ifIndentation, + $phpcsFile->eolChar, + $afterIfCode ); - FixerHelper::removeBetweenIncluding($phpcsFile, $ifPointer + 1, $tokens[$ifPointer]['scope_closer']); + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change($phpcsFile, $ifPointer, $tokens[$ifPointer]['scope_closer'], $ifContent); $phpcsFile->fixer->endChangeset(); } @@ -386,7 +368,7 @@ private function getScopeCode(File $phpcsFile, int $scopePointer): string } /** - * @return int[] + * @return list */ private function getScopeCodePointers(File $phpcsFile, int $scopePointer): array { @@ -440,7 +422,7 @@ private function isEarlyExitInScope(File $phpcsFile, int $startPointer, int $end } /** - * @return int[] + * @return list */ private function getAllConditionsPointers(File $phpcsFile, int $conditionPointer): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/JumpStatementsSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/JumpStatementsSpacingSniff.php index 8417c2795..334fbbcee 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/JumpStatementsSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/JumpStatementsSpacingSniff.php @@ -49,7 +49,7 @@ class JumpStatementsSpacingSniff extends AbstractControlStructureSpacing /** @var bool */ public $allowSingleLineYieldStacking = true; - /** @var string[] */ + /** @var list */ public $jumpStatements = []; /** @@ -80,7 +80,7 @@ public function process(File $phpcsFile, $jumpStatementPointer): void } /** - * @return string[] + * @return list */ protected function getSupportedKeywords(): array { @@ -96,7 +96,7 @@ protected function getSupportedKeywords(): array } /** - * @return string[] + * @return list */ protected function getKeywordsToCheck(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceEqualOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceEqualOperatorSniff.php index f63dc69be..03823e00f 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceEqualOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceEqualOperatorSniff.php @@ -90,8 +90,9 @@ public function process(File $phpcsFile, $equalPointer): void } $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($equalPointer, '??='); - FixerHelper::removeBetweenIncluding($phpcsFile, $equalPointer + 1, $nullCoalescePointer); + + FixerHelper::change($phpcsFile, $equalPointer, $nullCoalescePointer, '??='); + $phpcsFile->fixer->endChangeset(); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceOperatorSniff.php index 4abd7eb30..333ac6ab0 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullCoalesceOperatorSniff.php @@ -105,9 +105,7 @@ public function checkIsset(File $phpcsFile, int $issetPointer): void $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($startPointer, sprintf('%s ??', $variableContent)); - - FixerHelper::removeBetweenIncluding($phpcsFile, $startPointer + 1, $inlineElsePointer); + FixerHelper::change($phpcsFile, $startPointer, $inlineElsePointer, sprintf('%s ??', $variableContent)); $phpcsFile->fixer->endChangeset(); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullSafeObjectOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullSafeObjectOperatorSniff.php index ace95ba4f..25738c47d 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullSafeObjectOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireNullSafeObjectOperatorSniff.php @@ -69,36 +69,23 @@ public function process(File $phpcsFile, $identicalPointer): int $tokens = $phpcsFile->getTokens(); - $pointerBeforeIdentical = TokenHelper::findPreviousEffective($phpcsFile, $identicalPointer - 1); - $pointerAfterIdentical = TokenHelper::findNextEffective($phpcsFile, $identicalPointer + 1); + [$pointerBeforeIdentical, $pointerAfterIdentical] = $this->getIndenticalData($phpcsFile, $identicalPointer); if ($tokens[$pointerBeforeIdentical]['code'] !== T_NULL && $tokens[$pointerAfterIdentical]['code'] !== T_NULL) { return $identicalPointer + 1; } - $isYoda = $tokens[$pointerBeforeIdentical]['code'] === T_NULL; - - if ($isYoda) { - $identificatorStartPointer = $pointerAfterIdentical; - $identificatorEndPointer = $this->findIdentificatorEnd($phpcsFile, $identificatorStartPointer); - - if ($identificatorEndPointer === null) { - return $pointerAfterIdentical + 1; - } - - $conditionStartPointer = $pointerBeforeIdentical; - - } else { - $identificatorEndPointer = $pointerBeforeIdentical; - $identificatorStartPointer = $this->findIdentificatorStart($phpcsFile, $identificatorEndPointer); - - if ($identificatorStartPointer === null) { - return $identificatorEndPointer + 1; - } + [$identificatorStartPointer, $identificatorEndPointer, $conditionStartPointer] = $this->getConditionData( + $phpcsFile, + $pointerBeforeIdentical, + $pointerAfterIdentical + ); - $conditionStartPointer = $identificatorStartPointer; + if ($identificatorStartPointer === null || $identificatorEndPointer === null) { + return $identicalPointer + 1; } + $isYoda = $tokens[$pointerBeforeIdentical]['code'] === T_NULL; $identificator = IdentificatorHelper::getContent($phpcsFile, $identificatorStartPointer, $identificatorEndPointer); $pointerAfterCondition = TokenHelper::findNextEffective( @@ -159,6 +146,40 @@ private function checkTernaryOperator( } while (true); + $pointerBeforeCondition = TokenHelper::findPreviousEffective($phpcsFile, $conditionStartPointer - 1); + if (in_array($tokens[$pointerBeforeCondition]['code'], [T_BOOLEAN_AND, T_BOOLEAN_OR], true)) { + $previousIdenticalPointer = TokenHelper::findPreviousLocal( + $phpcsFile, + [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL], + $pointerBeforeCondition + ); + + if ($previousIdenticalPointer !== null) { + [$pointerBeforePreviousIdentical, $pointerAfterPreviousIdentical] = $this->getIndenticalData( + $phpcsFile, + $previousIdenticalPointer + ); + + [$previousIdentificatorStartPointer, $previousIdentificatorEndPointer] = $this->getConditionData( + $phpcsFile, + $pointerBeforePreviousIdentical, + $pointerAfterPreviousIdentical + ); + + if ($previousIdentificatorStartPointer !== null && $previousIdentificatorEndPointer !== null) { + $previousIdentificator = IdentificatorHelper::getContent( + $phpcsFile, + $previousIdentificatorStartPointer, + $previousIdentificatorEndPointer + ); + + if (!self::areIdentificatorsCompatible($previousIdentificator, $identificator)) { + return; + } + } + } + } + $defaultInElse = $tokens[$identicalPointer]['code'] === T_IS_NOT_IDENTICAL; $inlineElsePointer = TernaryOperatorHelper::getElsePointer($phpcsFile, $inlineThenPointer); $inlineElseEndPointer = TernaryOperatorHelper::getEndPointer($phpcsFile, $inlineThenPointer, $inlineElsePointer); @@ -242,15 +263,14 @@ private function checkTernaryOperator( return; } - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($conditionStartPointer, sprintf('%s?%s', $identificator, $identificatorDifference)); - + $conditionContent = sprintf('%s?%s', $identificator, $identificatorDifference); if (strtolower($defaultContent) !== 'null') { - $phpcsFile->fixer->addContent($conditionStartPointer, sprintf(' ?? %s', $defaultContent)); + $conditionContent .= sprintf(' ?? %s', $defaultContent); } - FixerHelper::removeBetweenIncluding($phpcsFile, $conditionStartPointer + 1, $conditionEndPointer); + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change($phpcsFile, $conditionStartPointer, $conditionEndPointer, $conditionContent); $phpcsFile->fixer->endChangeset(); } @@ -274,7 +294,7 @@ private function checkNextCondition( $nextIdentificator = IdentificatorHelper::getContent($phpcsFile, $nextIdentificatorStartPointer, $nextIdentificatorEndPointer); if (!$this->areIdentificatorsCompatible($identificator, $nextIdentificator)) { - return $nextConditionBooleanPointer; + return $nextIdentificatorEndPointer; } $pointerAfterNexIdentificator = TokenHelper::findNextEffective($phpcsFile, $nextIdentificatorEndPointer + 1); @@ -285,16 +305,16 @@ private function checkNextCondition( $tokens[$pointerAfterNexIdentificator]['code'] !== $tokens[$identicalPointer]['code'] && !in_array($tokens[$pointerAfterNexIdentificator]['code'], [T_INLINE_THEN, T_SEMICOLON], true) ) { - return $nextConditionBooleanPointer; + return $pointerAfterNexIdentificator; } if (!in_array($tokens[$pointerAfterNexIdentificator]['code'], [T_IS_IDENTICAL, T_IS_NOT_IDENTICAL], true)) { - return $nextConditionBooleanPointer; + return $pointerAfterNexIdentificator; } $pointerAfterIdentical = TokenHelper::findNextEffective($phpcsFile, $pointerAfterNexIdentificator + 1); if ($tokens[$pointerAfterIdentical]['code'] !== T_NULL) { - return $nextConditionBooleanPointer; + return $pointerAfterNexIdentificator; } $identificatorDifference = $this->getIdentificatorDifference( @@ -307,16 +327,19 @@ private function checkNextCondition( $fix = $phpcsFile->addFixableError('Operator ?-> is required.', $identicalPointer, self::CODE_REQUIRED_NULL_SAFE_OBJECT_OPERATOR); if (!$fix) { - return $nextConditionBooleanPointer; + return $pointerAfterNexIdentificator; } $isConditionOfTernaryOperator = TernaryOperatorHelper::isConditionOfTernaryOperator($phpcsFile, $identicalPointer); $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($conditionStartPointer, sprintf('%s?%s', $identificator, $identificatorDifference)); - - FixerHelper::removeBetweenIncluding($phpcsFile, $conditionStartPointer + 1, $nextIdentificatorEndPointer); + FixerHelper::change( + $phpcsFile, + $conditionStartPointer, + $nextIdentificatorEndPointer, + sprintf('%s?%s', $identificator, $identificatorDifference) + ); $phpcsFile->fixer->endChangeset(); @@ -324,7 +347,7 @@ private function checkNextCondition( return TokenHelper::findNext($phpcsFile, T_INLINE_THEN, $identicalPointer + 1); } - return $nextConditionBooleanPointer; + return $pointerAfterNexIdentificator; } /** @@ -404,9 +427,9 @@ private function findIdentificatorEnd(File $phpcsFile, int $identificatorStartPo private function areIdentificatorsCompatible(string $first, string $second): bool { - /** @var string[] $firstParts */ + /** @var list $firstParts */ $firstParts = preg_split(self::OPERATOR_REGEXP, $first, -1, PREG_SPLIT_DELIM_CAPTURE); - /** @var string[] $secondParts */ + /** @var list $secondParts */ $secondParts = preg_split(self::OPERATOR_REGEXP, $second, -1, PREG_SPLIT_DELIM_CAPTURE); $minPartsCount = min(count($firstParts), count($secondParts)); @@ -451,4 +474,40 @@ private function getIdentificatorDifference( return TokenHelper::getContent($phpcsFile, $differencePointer, $nextIdentificatorEndPointer); } + /** + * @return array{0: int, 1: int} + */ + private function getIndenticalData(File $phpcsFile, int $identicalPointer): array + { + /** @var int $pointerBeforeIdentical */ + $pointerBeforeIdentical = TokenHelper::findPreviousEffective($phpcsFile, $identicalPointer - 1); + /** @var int $pointerAfterIdentical */ + $pointerAfterIdentical = TokenHelper::findNextEffective($phpcsFile, $identicalPointer + 1); + + return [$pointerBeforeIdentical, $pointerAfterIdentical]; + } + + /** + * @return array{0: int|null, 1: int|null, 2: int|null} + */ + private function getConditionData(File $phpcsFile, int $pointerBeforeIdentical, int $pointerAfterIdentical): array + { + $tokens = $phpcsFile->getTokens(); + + $isYoda = $tokens[$pointerBeforeIdentical]['code'] === T_NULL; + + if ($isYoda) { + $identificatorStartPointer = $pointerAfterIdentical; + $identificatorEndPointer = $this->findIdentificatorEnd($phpcsFile, $identificatorStartPointer); + $conditionStartPointer = $pointerBeforeIdentical; + + } else { + $identificatorEndPointer = $pointerBeforeIdentical; + $identificatorStartPointer = $this->findIdentificatorStart($phpcsFile, $identificatorEndPointer); + $conditionStartPointer = $identificatorStartPointer; + } + + return [$identificatorStartPointer, $identificatorEndPointer, $conditionStartPointer]; + } + } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireShortTernaryOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireShortTernaryOperatorSniff.php index 51655e1f3..6cfe2f9e8 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireShortTernaryOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireShortTernaryOperatorSniff.php @@ -75,9 +75,7 @@ public function process(File $phpcsFile, $inlineThenPointer): void if ($tokens[$conditionStartPointer]['code'] === T_BOOLEAN_NOT) { $phpcsFile->fixer->replaceToken($conditionStartPointer, ''); - FixerHelper::removeBetweenIncluding($phpcsFile, $inlineThenPointer + 1, $inlineElseEndPointer); - - $phpcsFile->fixer->addContent($inlineThenPointer, sprintf(': %s', $thenContent)); + FixerHelper::change($phpcsFile, $inlineThenPointer, $inlineElseEndPointer, sprintf('?: %s', $thenContent)); } else { FixerHelper::removeBetween($phpcsFile, $inlineThenPointer, $inlineElsePointer); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireTernaryOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireTernaryOperatorSniff.php index 7fdc9d126..f1dc541bb 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireTernaryOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/RequireTernaryOperatorSniff.php @@ -124,9 +124,7 @@ private function checkIfWithReturns(File $phpcsFile, int $ifPointer, int $elsePo FixerHelper::removeBetween($phpcsFile, $tokens[$ifPointer]['parenthesis_closer'], $pointerAfterReturnInIf); - $phpcsFile->fixer->replaceToken($semicolonAfterReturnInIf, ' : '); - - FixerHelper::removeBetween($phpcsFile, $semicolonAfterReturnInIf, $pointerAfterReturnInElse); + FixerHelper::change($phpcsFile, $semicolonAfterReturnInIf, $pointerAfterReturnInElse - 1, ' : '); FixerHelper::removeBetweenIncluding($phpcsFile, $semicolonAfterReturnInElse + 1, $tokens[$elsePointer]['scope_closer']); @@ -204,17 +202,12 @@ private function checkIfWithAssignments( $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($ifPointer, sprintf('%s = ', $identificatorInIf)); - - FixerHelper::removeBetweenIncluding($phpcsFile, $ifPointer + 1, $tokens[$ifPointer]['parenthesis_opener']); - - $phpcsFile->fixer->replaceToken($tokens[$ifPointer]['parenthesis_closer'], ' ? '); + FixerHelper::change($phpcsFile, $ifPointer, $tokens[$ifPointer]['parenthesis_opener'], sprintf('%s = ', $identificatorInIf)); - FixerHelper::removeBetween($phpcsFile, $tokens[$ifPointer]['parenthesis_closer'], $pointerAfterAssignmentInIf); + FixerHelper::change($phpcsFile, $tokens[$ifPointer]['parenthesis_closer'], $pointerAfterAssignmentInIf - 1, ' ? '); - $phpcsFile->fixer->replaceToken($semicolonAfterAssignmentInIf, ' : '); + FixerHelper::change($phpcsFile, $semicolonAfterAssignmentInIf, $pointerAfterAssignmentInElse - 1, ' : '); - FixerHelper::removeBetween($phpcsFile, $semicolonAfterAssignmentInIf, $pointerAfterAssignmentInElse); FixerHelper::removeBetweenIncluding($phpcsFile, $semicolonAfterAssignmentInElse + 1, $tokens[$elsePointer]['scope_closer']); $phpcsFile->fixer->endChangeset(); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessIfConditionWithReturnSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessIfConditionWithReturnSniff.php index a241fe05c..37a10b163 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessIfConditionWithReturnSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessIfConditionWithReturnSniff.php @@ -103,8 +103,9 @@ public function process(File $phpcsFile, $ifPointer): void } $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($ifPointer, sprintf('return %s;', $newCondition())); - FixerHelper::removeBetweenIncluding($phpcsFile, $ifPointer + 1, $tokens[$elsePointer]['scope_closer']); + + FixerHelper::change($phpcsFile, $ifPointer, $tokens[$elsePointer]['scope_closer'], sprintf('return %s;', $newCondition())); + $phpcsFile->fixer->endChangeset(); } else { $returnPointer = TokenHelper::findNextEffective($phpcsFile, $tokens[$ifPointer]['scope_closer'] + 1); @@ -134,8 +135,9 @@ public function process(File $phpcsFile, $ifPointer): void } $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($ifPointer, sprintf('return %s;', $newCondition())); - FixerHelper::removeBetweenIncluding($phpcsFile, $ifPointer + 1, $semicolonPointer); + + FixerHelper::change($phpcsFile, $ifPointer, $semicolonPointer, sprintf('return %s;', $newCondition())); + $phpcsFile->fixer->endChangeset(); } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessTernaryOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessTernaryOperatorSniff.php index 4f4131733..55f51134a 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessTernaryOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/ControlStructures/UselessTernaryOperatorSniff.php @@ -94,8 +94,7 @@ public function process(File $phpcsFile, $inlineThenPointer): void if ($tokens[$pointerAfterInlineThen]['code'] === T_FALSE) { $negativeCondition = ConditionHelper::getNegativeCondition($phpcsFile, $conditionStartPointer, $conditionEndPointer); - $phpcsFile->fixer->replaceToken($conditionStartPointer, $negativeCondition); - FixerHelper::removeBetweenIncluding($phpcsFile, $conditionStartPointer + 1, $conditionEndPointer); + FixerHelper::change($phpcsFile, $conditionStartPointer, $conditionEndPointer, $negativeCondition); } FixerHelper::removeBetween($phpcsFile, $conditionEndPointer, $pointerAfterTernaryOperator); diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DeadCatchSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DeadCatchSniff.php index 89ad4c240..8a3c29208 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DeadCatchSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/DeadCatchSniff.php @@ -33,9 +33,9 @@ public function process(File $phpcsFile, $catchPointer): void $tokens = $phpcsFile->getTokens(); $catchToken = $tokens[$catchPointer]; - $catchedTypes = CatchHelper::findCatchedTypesInCatch($phpcsFile, $catchToken); + $caughtTypes = CatchHelper::findCaughtTypesInCatch($phpcsFile, $catchToken); - if (!in_array('\\Throwable', $catchedTypes, true)) { + if (!in_array('\\Throwable', $caughtTypes, true)) { return; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/ReferenceThrowableOnlySniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/ReferenceThrowableOnlySniff.php index 949374212..3769e0ae5 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/ReferenceThrowableOnlySniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Exceptions/ReferenceThrowableOnlySniff.php @@ -108,9 +108,8 @@ public function process(File $phpcsFile, $openTagPointer): void $phpcsFile->fixer->beginChangeset(); - FixerHelper::removeBetweenIncluding($phpcsFile, $referencedName->getStartPointer(), $referencedName->getEndPointer()); + FixerHelper::change($phpcsFile, $referencedName->getStartPointer(), $referencedName->getEndPointer(), '\Throwable'); - $phpcsFile->fixer->addContent($referencedName->getStartPointer(), '\Throwable'); $phpcsFile->fixer->endChangeset(); } } @@ -126,8 +125,8 @@ private function searchForThrowableInNextCatches(File $phpcsFile, int $catchPoin break; } - $catchedTypes = CatchHelper::findCatchedTypesInCatch($phpcsFile, $nextCatchToken); - if (in_array('\\Throwable', $catchedTypes, true)) { + $caughtTypes = CatchHelper::findCaughtTypesInCatch($phpcsFile, $nextCatchToken); + if (in_array('\\Throwable', $caughtTypes, true)) { return true; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.php index 0c205859f..768bb9a1a 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/FilepathNamespaceExtractor.php @@ -22,19 +22,19 @@ class FilepathNamespaceExtractor { - /** @var string[] */ + /** @var array */ private $rootNamespaces; - /** @var bool[] dir(string) => true(bool) */ + /** @var array dir(string) => true(bool) */ private $skipDirs; - /** @var string[] */ + /** @var list */ private $extensions; /** - * @param string[] $rootNamespaces directory(string) => namespace - * @param string[] $skipDirs - * @param string[] $extensions index(integer) => extension + * @param array $rootNamespaces directory(string) => namespace + * @param list $skipDirs + * @param list $extensions index(integer) => extension */ public function __construct(array $rootNamespaces, array $skipDirs, array $extensions) { @@ -52,7 +52,7 @@ public function getTypeNameFromProjectPath(string $path): ?string return null; } - /** @var string[] $pathParts */ + /** @var list $pathParts */ $pathParts = preg_split('~[/\\\]~', $path); $rootNamespace = null; while (count($pathParts) > 0) { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/TypeNameMatchesFileNameSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/TypeNameMatchesFileNameSniff.php index 90a1c8cd9..25b369f1c 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/TypeNameMatchesFileNameSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Files/TypeNameMatchesFileNameSniff.php @@ -30,25 +30,25 @@ class TypeNameMatchesFileNameSniff implements Sniff /** @var array */ public $rootNamespaces = []; - /** @var string[] */ + /** @var list */ public $skipDirs = []; - /** @var string[] */ + /** @var list */ public $ignoredNamespaces = []; - /** @var string[] */ + /** @var list */ public $extensions = ['php']; /** @var array|null */ private $normalizedRootNamespaces; - /** @var string[]|null */ + /** @var list|null */ private $normalizedSkipDirs; - /** @var string[]|null */ + /** @var list|null */ private $normalizedIgnoredNamespaces; - /** @var string[]|null */ + /** @var list|null */ private $normalizedExtensions; /** @var FilepathNamespaceExtractor */ @@ -107,7 +107,7 @@ public function process(File $phpcsFile, $typePointer): void } /** - * @return string[] path(string) => namespace + * @return array path(string) => namespace */ private function getRootNamespaces(): array { @@ -137,7 +137,7 @@ private function getRootNamespaces(): array } /** - * @return string[] + * @return list */ private function getSkipDirs(): array { @@ -149,7 +149,7 @@ private function getSkipDirs(): array } /** - * @return string[] + * @return list */ private function getIgnoredNamespaces(): array { @@ -161,7 +161,7 @@ private function getIgnoredNamespaces(): array } /** - * @return string[] + * @return list */ private function getExtensions(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireArrowFunctionSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireArrowFunctionSniff.php index 76eed7ea6..06e07873e 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireArrowFunctionSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Functions/RequireArrowFunctionSniff.php @@ -102,10 +102,10 @@ public function process(File $phpcsFile, $closurePointer): void $tokens[$closurePointer]['scope_opener'] - 1 ); - $nonWhitespacePointerAfterUseParanthesisCloser = null; + $nonWhitespacePointerAfterUseParenthesisCloser = null; if ($usePointer !== null) { $useParenthesiCloserPointer = TokenHelper::findNext($phpcsFile, T_CLOSE_PARENTHESIS, $usePointer + 1); - $nonWhitespacePointerAfterUseParanthesisCloser = TokenHelper::findNextExcluding( + $nonWhitespacePointerAfterUseParenthesisCloser = TokenHelper::findNextExcluding( $phpcsFile, T_WHITESPACE, $useParenthesiCloserPointer + 1 @@ -115,11 +115,11 @@ public function process(File $phpcsFile, $closurePointer): void $phpcsFile->fixer->beginChangeset(); $phpcsFile->fixer->replaceToken($closurePointer, 'fn'); - if ($nonWhitespacePointerAfterUseParanthesisCloser !== null) { + if ($nonWhitespacePointerAfterUseParenthesisCloser !== null) { FixerHelper::removeBetween( $phpcsFile, $tokens[$closurePointer]['parenthesis_closer'], - $nonWhitespacePointerAfterUseParanthesisCloser + $nonWhitespacePointerAfterUseParenthesisCloser ); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AbstractFullyQualifiedGlobalReference.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AbstractFullyQualifiedGlobalReference.php index 186f915e5..2f1e8de19 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AbstractFullyQualifiedGlobalReference.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AbstractFullyQualifiedGlobalReference.php @@ -26,16 +26,16 @@ abstract class AbstractFullyQualifiedGlobalReference implements Sniff public const CODE_NON_FULLY_QUALIFIED = 'NonFullyQualified'; - /** @var string[] */ + /** @var list */ public $exclude = []; - /** @var string[] */ + /** @var list */ public $include = []; - /** @var string[]|null */ + /** @var list|null */ private $normalizedExclude; - /** @var string[]|null */ + /** @var list|null */ private $normalizedInclude; abstract protected function getNotFullyQualifiedMessage(): string; @@ -126,7 +126,7 @@ public function process(File $phpcsFile, $openTagPointer): void } /** - * @return string[] + * @return list */ protected function getNormalizedInclude(): array { @@ -137,7 +137,7 @@ protected function getNormalizedInclude(): array } /** - * @return string[] + * @return list */ private function getNormalizedExclude(): array { @@ -148,8 +148,8 @@ private function getNormalizedExclude(): array } /** - * @param string[] $names - * @return string[] + * @param list $names + * @return list */ private function normalizeNames(array $names): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AlphabeticallySortedUsesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AlphabeticallySortedUsesSniff.php index 0fad7d757..2c79cf9d2 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AlphabeticallySortedUsesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/AlphabeticallySortedUsesSniff.php @@ -25,6 +25,7 @@ use function strcasecmp; use function strcmp; use function uasort; +use const T_COMMA; use const T_OPEN_TAG; use const T_SEMICOLON; @@ -68,14 +69,34 @@ public function process(File $phpcsFile, $openTagPointer): void } else { $order = $this->compareUseStatements($useStatement, $lastUse); if ($order < 0) { - $fix = $phpcsFile->addFixableError( + // The use statements are not ordered correctly. Go through all statements and if any are multi-part then + // we report the problem but cannot fix it, because this would lose the secondary parts of the statement. + $fixable = true; + $tokens = $phpcsFile->getTokens(); + foreach ($useStatements as $statement) { + $nextBreaker = TokenHelper::findNext($phpcsFile, [T_SEMICOLON, T_COMMA], $statement->getPointer()); + + if ($tokens[$nextBreaker]['code'] === T_COMMA) { + $fixable = false; + break; + } + } + + $errorParameters = [ sprintf( 'Use statements should be sorted alphabetically. The first wrong one is %s.', $useStatement->getFullyQualifiedTypeName() ), $useStatement->getPointer(), - self::CODE_INCORRECT_ORDER - ); + self::CODE_INCORRECT_ORDER, + ]; + + if (!$fixable) { + $phpcsFile->addError(...$errorParameters); + return; + } + + $fix = $phpcsFile->addFixableError(...$errorParameters); if ($fix) { $this->fixAlphabeticalOrder($phpcsFile, $useStatements); } @@ -90,7 +111,7 @@ public function process(File $phpcsFile, $openTagPointer): void } /** - * @param UseStatement[] $useStatements + * @param array $useStatements */ private function fixAlphabeticalOrder(File $phpcsFile, array $useStatements): void { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniff.php index 2ff7b3bf8..8f259c97f 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedClassNameInAnnotationSniff.php @@ -6,12 +6,11 @@ use PHP_CodeSniffer\Sniffs\Sniff; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; -use SlevomatCodingStandard\Helpers\AnnotationConstantExpressionHelper; use SlevomatCodingStandard\Helpers\AnnotationHelper; -use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; +use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\NamespaceHelper; +use SlevomatCodingStandard\Helpers\PhpDocParserHelper; use SlevomatCodingStandard\Helpers\ReferencedName; use SlevomatCodingStandard\Helpers\TypeHelper; use SlevomatCodingStandard\Helpers\TypeHintHelper; @@ -42,125 +41,119 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void { $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationName => $annotationsByName) { - foreach ($annotationsByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { + foreach ($annotations as $annotation) { + /** @var list $identifierTypeNodes */ + $identifierTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), IdentifierTypeNode::class); + + foreach ($identifierTypeNodes as $typeHintNode) { + $typeHint = $typeHintNode->name; + + $lowercasedTypeHint = strtolower($typeHint); + if ( + TypeHintHelper::isSimpleTypeHint($lowercasedTypeHint) + || TypeHintHelper::isSimpleUnofficialTypeHints($lowercasedTypeHint) + || !TypeHelper::isTypeName($typeHint) + || TypeHintHelper::isTypeDefinedInAnnotation($phpcsFile, $docCommentOpenPointer, $typeHint) + ) { + continue; + } + + $fullyQualifiedTypeHint = TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $docCommentOpenPointer, $typeHint); + if ($fullyQualifiedTypeHint === $typeHint) { + continue; + } + + $fix = $phpcsFile->addFixableError(sprintf( + 'Class name %s in %s should be referenced via a fully qualified name.', + $fullyQualifiedTypeHint, + $annotation->getName() + ), $annotation->getStartPointer(), self::CODE_NON_FULLY_QUALIFIED_CLASS_NAME); + + if (!$fix) { + continue; + } + + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); + + $fixedDocComment = AnnotationHelper::fixAnnotation( + $parsedDocComment, + $annotation, + $typeHintNode, + new IdentifierTypeNode($fullyQualifiedTypeHint) + ); + + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change( + $phpcsFile, + $parsedDocComment->getOpenPointer(), + $parsedDocComment->getClosePointer(), + $fixedDocComment + ); + + $phpcsFile->fixer->endChangeset(); + } + + /** @var list $constantFetchNodes */ + $constantFetchNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), ConstFetchNode::class); + + foreach ($constantFetchNodes as $constantFetchNode) { + $isClassConstant = $constantFetchNode->className !== ''; + + $typeHint = $isClassConstant + ? $constantFetchNode->className + : $constantFetchNode->name; + + if ($typeHint === 'self') { continue; } - if ($annotation->isInvalid()) { + $fullyQualifiedTypeHint = $isClassConstant + ? NamespaceHelper::resolveClassName($phpcsFile, $typeHint, $docCommentOpenPointer) + : NamespaceHelper::resolveName($phpcsFile, $typeHint, ReferencedName::TYPE_CONSTANT, $docCommentOpenPointer); + + if ($fullyQualifiedTypeHint === $typeHint) { continue; } - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getIdentifierTypeNodes($annotationType) as $typeHintNode) { - $typeHint = AnnotationTypeHelper::getTypeHintFromNode($typeHintNode); - - $lowercasedTypeHint = strtolower($typeHint); - if ( - TypeHintHelper::isSimpleTypeHint($lowercasedTypeHint) - || TypeHintHelper::isSimpleUnofficialTypeHints($lowercasedTypeHint) - || !TypeHelper::isTypeName($typeHint) - || TypeHintHelper::isTypeDefinedInAnnotation($phpcsFile, $docCommentOpenPointer, $typeHint) - ) { - continue; - } - - $fullyQualifiedTypeHint = TypeHintHelper::getFullyQualifiedTypeHint( - $phpcsFile, - $annotation->getStartPointer(), - $typeHint - ); - if ($fullyQualifiedTypeHint === $typeHint) { - continue; - } - $fix = $phpcsFile->addFixableError(sprintf( - 'Class name %s in %s should be referenced via a fully qualified name.', - $fullyQualifiedTypeHint, - $annotationName - ), $annotation->getStartPointer(), self::CODE_NON_FULLY_QUALIFIED_CLASS_NAME); - - if (!$fix) { - continue; - } - - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $typeHintNode, - new IdentifierTypeNode($fullyQualifiedTypeHint) - ); - - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $fixedAnnotationContent); - - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer() + 1, $annotation->getEndPointer()); - - $phpcsFile->fixer->endChangeset(); - } + $fix = $phpcsFile->addFixableError(sprintf( + '%s name %s in %s should be referenced via a fully qualified name.', + $isClassConstant ? 'Class' : 'Constant', + $fullyQualifiedTypeHint, + $annotation->getName() + ), $annotation->getStartPointer(), self::CODE_NON_FULLY_QUALIFIED_CLASS_NAME); + + if (!$fix) { + continue; } - foreach (AnnotationHelper::getAnnotationConstantExpressions($annotation) as $constantExpression) { - foreach (AnnotationConstantExpressionHelper::getConstantFetchNodes($constantExpression) as $constantFetchNode) { - $isClassConstant = $constantFetchNode->className !== ''; - - $typeHint = $isClassConstant - ? $constantFetchNode->className - : $constantFetchNode->name; - - if ($typeHint === 'self') { - continue; - } - - $fullyQualifiedTypeHint = $isClassConstant - ? NamespaceHelper::resolveClassName( - $phpcsFile, - $typeHint, - $annotation->getStartPointer() - ) - : NamespaceHelper::resolveName( - $phpcsFile, - $typeHint, - ReferencedName::TYPE_CONSTANT, - $annotation->getStartPointer() - ); - - if ($fullyQualifiedTypeHint === $typeHint) { - continue; - } - - $fix = $phpcsFile->addFixableError(sprintf( - '%s name %s in %s should be referenced via a fully qualified name.', - $isClassConstant ? 'Class' : 'Constant', - $fullyQualifiedTypeHint, - $annotationName - ), $annotation->getStartPointer(), self::CODE_NON_FULLY_QUALIFIED_CLASS_NAME); - - if (!$fix) { - continue; - } - - $fixedConstantFetchNode = $isClassConstant - ? new ConstFetchNode($fullyQualifiedTypeHint, $constantFetchNode->name) - : new ConstFetchNode('', $fullyQualifiedTypeHint); - - $fixedAnnotationContent = AnnotationHelper::fixAnnotationConstantFetchNode( - $phpcsFile, - $annotation, - $constantFetchNode, - $fixedConstantFetchNode - ); - - $phpcsFile->fixer->beginChangeset(); - - $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $fixedAnnotationContent); - - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer() + 1, $annotation->getEndPointer()); - - $phpcsFile->fixer->endChangeset(); - } + $fixedConstantFetchNode = PhpDocParserHelper::cloneNode($constantFetchNode); + if ($isClassConstant) { + $fixedConstantFetchNode->className = $fullyQualifiedTypeHint; + } else { + $fixedConstantFetchNode->name = $fullyQualifiedTypeHint; } + + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); + + $fixedDocComment = AnnotationHelper::fixAnnotation( + $parsedDocComment, + $annotation, + $constantFetchNode, + $fixedConstantFetchNode + ); + + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change( + $phpcsFile, + $parsedDocComment->getOpenPointer(), + $parsedDocComment->getClosePointer(), + $fixedDocComment + ); + + $phpcsFile->fixer->endChangeset(); + } } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedExceptionsSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedExceptionsSniff.php index a6ea3bca2..8d410cbd8 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedExceptionsSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedExceptionsSniff.php @@ -23,16 +23,16 @@ class FullyQualifiedExceptionsSniff implements Sniff public const CODE_NON_FULLY_QUALIFIED_EXCEPTION = 'NonFullyQualifiedException'; - /** @var string[] */ + /** @var list */ public $specialExceptionNames = []; - /** @var string[] */ + /** @var list */ public $ignoredNames = []; - /** @var string[]|null */ + /** @var list|null */ private $normalizedSpecialExceptionNames; - /** @var string[]|null */ + /** @var list|null */ private $normalizedIgnoredNames; /** @@ -129,16 +129,14 @@ public function process(File $phpcsFile, $openTagPointer): void $phpcsFile->fixer->beginChangeset(); - FixerHelper::removeBetweenIncluding($phpcsFile, $referencedName->getStartPointer(), $referencedName->getEndPointer()); - - $phpcsFile->fixer->addContent($referencedName->getStartPointer(), $fullyQualifiedName); + FixerHelper::change($phpcsFile, $referencedName->getStartPointer(), $referencedName->getEndPointer(), $fullyQualifiedName); $phpcsFile->fixer->endChangeset(); } } /** - * @return string[] + * @return list */ private function getSpecialExceptionNames(): array { @@ -150,7 +148,7 @@ private function getSpecialExceptionNames(): array } /** - * @return string[] + * @return list */ private function getIgnoredNames(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalFunctionsSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalFunctionsSniff.php index fae0ded7b..30741a3b9 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalFunctionsSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/FullyQualifiedGlobalFunctionsSniff.php @@ -14,7 +14,7 @@ class FullyQualifiedGlobalFunctionsSniff public $includeSpecialFunctions = false; /** - * @return string[] + * @return list */ protected function getNormalizedInclude(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/ReferenceUsedNamesOnlySniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/ReferenceUsedNamesOnlySniff.php index d48b3bf00..c349fbf34 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/ReferenceUsedNamesOnlySniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/ReferenceUsedNamesOnlySniff.php @@ -7,13 +7,11 @@ use PHP_CodeSniffer\Util\Tokens; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; -use SlevomatCodingStandard\Helpers\AnnotationConstantExpressionHelper; use SlevomatCodingStandard\Helpers\AnnotationHelper; -use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\ClassHelper; use SlevomatCodingStandard\Helpers\CommentHelper; use SlevomatCodingStandard\Helpers\ConstantHelper; +use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\FunctionHelper; use SlevomatCodingStandard\Helpers\NamespaceHelper; @@ -40,6 +38,7 @@ use function preg_quote; use function preg_replace; use function sprintf; +use function strpos; use function strtolower; use function substr; use const T_DECLARE; @@ -87,10 +86,10 @@ class ReferenceUsedNamesOnlySniff implements Sniff /** @var bool */ public $allowFallbackGlobalConstants = true; - /** @var string[] */ + /** @var list */ public $specialExceptionNames = []; - /** @var string[] */ + /** @var list */ public $ignoredNames = []; /** @var bool */ @@ -99,7 +98,7 @@ class ReferenceUsedNamesOnlySniff implements Sniff /** * If empty, all namespaces are required to be used * - * @var string[] + * @var list */ public $namespacesRequiredToUse = []; @@ -112,13 +111,13 @@ class ReferenceUsedNamesOnlySniff implements Sniff /** @var bool */ public $allowFullyQualifiedNameForCollidingConstants = false; - /** @var string[]|null */ + /** @var list|null */ private $normalizedSpecialExceptionNames; - /** @var string[]|null */ + /** @var list|null */ private $normalizedIgnoredNames; - /** @var string[]|null */ + /** @var list|null */ private $normalizedNamespacesRequiredToUse; /** @@ -187,7 +186,18 @@ public function process(File $phpcsFile, $openTagPointer): void $collidingUseStatementUniqueId = UseStatement::getUniqueId($reference->type, $unqualifiedName); - $isFullyQualified = NamespaceHelper::isFullyQualifiedName($name); + $isPartialUse = false; + foreach ($useStatements as $useStatement) { + $useStatementName = $useStatement->getAlias() ?? $useStatement->getNameAsReferencedInFile(); + if (strpos($name, $useStatementName . '\\') === 0) { + $isPartialUse = true; + break; + } + } + + $isFullyQualified = NamespaceHelper::isFullyQualifiedName($name) + || ($namespacePointers === [] && NamespaceHelper::hasNamespace($name) && !$isPartialUse); + $isGlobalFallback = !$isFullyQualified && !NamespaceHelper::hasNamespace($name) && $namespacePointers !== [] @@ -294,28 +304,34 @@ public function process(File $phpcsFile, $openTagPointer): void $phpcsFile->fixer->beginChangeset(); if ($reference->source === self::SOURCE_ANNOTATION) { - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, + $fixedDocComment = AnnotationHelper::fixAnnotation( + $reference->parsedDocComment, $reference->annotation, $reference->nameNode, new IdentifierTypeNode(substr($reference->name, 1)) ); - $phpcsFile->fixer->replaceToken($startPointer, $fixedAnnotationContent); - - FixerHelper::removeBetweenIncluding($phpcsFile, $startPointer + 1, $reference->endPointer); + FixerHelper::change( + $phpcsFile, + $reference->parsedDocComment->getOpenPointer(), + $reference->parsedDocComment->getClosePointer(), + $fixedDocComment + ); } elseif ($reference->source === self::SOURCE_ANNOTATION_CONSTANT_FETCH) { - $fixedAnnotationContent = AnnotationHelper::fixAnnotationConstantFetchNode( - $phpcsFile, + $fixedDocComment = AnnotationHelper::fixAnnotation( + $reference->parsedDocComment, $reference->annotation, $reference->constantFetchNode, new ConstFetchNode(substr($reference->name, 1), $reference->constantFetchNode->name) ); - $phpcsFile->fixer->replaceToken($startPointer, $fixedAnnotationContent); - - FixerHelper::removeBetweenIncluding($phpcsFile, $startPointer + 1, $reference->endPointer); + FixerHelper::change( + $phpcsFile, + $reference->parsedDocComment->getOpenPointer(), + $reference->parsedDocComment->getClosePointer(), + $fixedDocComment + ); } else { $phpcsFile->fixer->replaceToken($startPointer, substr($tokens[$startPointer]['content'], 1)); } @@ -490,21 +506,35 @@ static function (bool $carry, string $use) use ($canonicalName): bool { } if ($reference->source === self::SOURCE_ANNOTATION) { - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, + $fixedDocComment = AnnotationHelper::fixAnnotation( + $reference->parsedDocComment, $reference->annotation, $reference->nameNode, new IdentifierTypeNode($nameToReference) ); - $phpcsFile->fixer->replaceToken($startPointer, $fixedAnnotationContent); - } elseif ($reference->source === self::SOURCE_ANNOTATION_CONSTANT_FETCH) { - $fixedAnnotationContent = AnnotationHelper::fixAnnotationConstantFetchNode( + + FixerHelper::change( $phpcsFile, + $reference->parsedDocComment->getOpenPointer(), + $reference->parsedDocComment->getClosePointer(), + $fixedDocComment + ); + + } elseif ($reference->source === self::SOURCE_ANNOTATION_CONSTANT_FETCH) { + $fixedDocComment = AnnotationHelper::fixAnnotation( + $reference->parsedDocComment, $reference->annotation, $reference->constantFetchNode, new ConstFetchNode($nameToReference, $reference->constantFetchNode->name) ); - $phpcsFile->fixer->replaceToken($startPointer, $fixedAnnotationContent); + + FixerHelper::change( + $phpcsFile, + $reference->parsedDocComment->getOpenPointer(), + $reference->parsedDocComment->getClosePointer(), + $fixedDocComment + ); + } elseif ($reference->source === self::SOURCE_ATTRIBUTE) { $attributeContent = TokenHelper::getContent($phpcsFile, $startPointer, $reference->endPointer); $fixedAttributeContent = preg_replace( @@ -512,19 +542,17 @@ static function (bool $carry, string $use) use ($canonicalName): bool { $nameToReference, $attributeContent ); - $phpcsFile->fixer->replaceToken($startPointer, $fixedAttributeContent); + FixerHelper::change($phpcsFile, $startPointer, $reference->endPointer, $fixedAttributeContent); } else { - $phpcsFile->fixer->replaceToken($startPointer, $nameToReference); + FixerHelper::change($phpcsFile, $startPointer, $reference->endPointer, $nameToReference); } - - FixerHelper::removeBetweenIncluding($phpcsFile, $startPointer + 1, $reference->endPointer); } $phpcsFile->fixer->endChangeset(); } /** - * @return string[] + * @return list */ private function getSpecialExceptionNames(): array { @@ -536,7 +564,7 @@ private function getSpecialExceptionNames(): array } /** - * @return string[] + * @return list */ private function getIgnoredNames(): array { @@ -548,7 +576,7 @@ private function getIgnoredNames(): array } /** - * @return string[] + * @return list */ private function getNamespacesRequiredToUse(): array { @@ -560,7 +588,7 @@ private function getNamespacesRequiredToUse(): array } /** - * @param UseStatement[] $useStatements + * @param array $useStatements */ private function getUseStatementPlacePointer(File $phpcsFile, int $openTagPointer, array $useStatements): int { @@ -633,7 +661,7 @@ private function isRequiredToBeUsed(string $name): bool } /** - * @return stdClass[] + * @return list */ private function getReferences(File $phpcsFile, int $openTagPointer): array { @@ -679,64 +707,61 @@ private function getReferences(File $phpcsFile, int $openTagPointer): array break; } - $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationsByName) { - foreach ($annotationsByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { - continue; - } + if ($parsedDocComment !== null) { + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - if ($annotation->isInvalid()) { - continue; - } + foreach ($annotations as $annotation) { + /** @var list $identifierTypeNodes */ + $identifierTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), IdentifierTypeNode::class); - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getIdentifierTypeNodes($annotationType) as $typeHintNode) { - $typeHint = AnnotationTypeHelper::getTypeHintFromNode($typeHintNode); - - $lowercasedTypeHint = strtolower($typeHint); - if ( - TypeHintHelper::isSimpleTypeHint($lowercasedTypeHint) - || TypeHintHelper::isSimpleUnofficialTypeHints($lowercasedTypeHint) - || !TypeHelper::isTypeName($typeHint) - ) { - continue; - } - - $reference = new stdClass(); - $reference->source = self::SOURCE_ANNOTATION; - $reference->annotation = $annotation; - $reference->nameNode = $typeHintNode; - $reference->name = $typeHint; - $reference->type = ReferencedName::TYPE_CLASS; - $reference->startPointer = $annotation->getStartPointer(); - $reference->endPointer = $annotation->getEndPointer(); - $reference->isClass = true; - $reference->isConstant = false; - $reference->isFunction = false; - - $references[] = $reference; + foreach ($identifierTypeNodes as $typeHintNode) { + $typeHint = $typeHintNode->name; + + $lowercasedTypeHint = strtolower($typeHint); + if ( + TypeHintHelper::isSimpleTypeHint($lowercasedTypeHint) + || TypeHintHelper::isSimpleUnofficialTypeHints($lowercasedTypeHint) + || !TypeHelper::isTypeName($typeHint) + ) { + continue; } + + $reference = new stdClass(); + $reference->source = self::SOURCE_ANNOTATION; + $reference->parsedDocComment = $parsedDocComment; + $reference->annotation = $annotation; + $reference->nameNode = $typeHintNode; + $reference->name = $typeHint; + $reference->type = ReferencedName::TYPE_CLASS; + $reference->startPointer = $annotation->getStartPointer(); + $reference->endPointer = null; + $reference->isClass = true; + $reference->isConstant = false; + $reference->isFunction = false; + + $references[] = $reference; } - foreach (AnnotationHelper::getAnnotationConstantExpressions($annotation) as $constantExpression) { - foreach (AnnotationConstantExpressionHelper::getConstantFetchNodes($constantExpression) as $constantFetchNode) { - - $reference = new stdClass(); - $reference->source = self::SOURCE_ANNOTATION_CONSTANT_FETCH; - $reference->annotation = $annotation; - $reference->constantFetchNode = $constantFetchNode; - $reference->name = $constantFetchNode->className; - $reference->type = ReferencedName::TYPE_CLASS; - $reference->startPointer = $annotation->getStartPointer(); - $reference->endPointer = $annotation->getEndPointer(); - $reference->isClass = true; - $reference->isConstant = false; - $reference->isFunction = false; - - $references[] = $reference; - } + /** @var list $constantFetchNodes */ + $constantFetchNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), ConstFetchNode::class); + + foreach ($constantFetchNodes as $constantFetchNode) { + $reference = new stdClass(); + $reference->source = self::SOURCE_ANNOTATION_CONSTANT_FETCH; + $reference->parsedDocComment = $parsedDocComment; + $reference->annotation = $annotation; + $reference->constantFetchNode = $constantFetchNode; + $reference->name = $constantFetchNode->className; + $reference->type = ReferencedName::TYPE_CLASS; + $reference->startPointer = $annotation->getStartPointer(); + $reference->endPointer = null; + $reference->isClass = true; + $reference->isConstant = false; + $reference->isFunction = false; + + $references[] = $reference; } } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UnusedUsesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UnusedUsesSniff.php index ee9aa0527..9dfb68f40 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UnusedUsesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UnusedUsesSniff.php @@ -5,17 +5,10 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\Doctrine\DoctrineAnnotation; +use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\MethodAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ParameterAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\PropertyAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ReturnAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ThrowsAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; -use SlevomatCodingStandard\Helpers\AnnotationConstantExpressionHelper; use SlevomatCodingStandard\Helpers\AnnotationHelper; -use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\NamespaceHelper; use SlevomatCodingStandard\Helpers\ReferencedName; @@ -27,6 +20,7 @@ use SlevomatCodingStandard\Helpers\UseStatement; use SlevomatCodingStandard\Helpers\UseStatementHelper; use function array_diff_key; +use function array_filter; use function array_key_exists; use function array_map; use function array_merge; @@ -35,7 +29,6 @@ use function in_array; use function preg_match; use function preg_quote; -use function preg_split; use function sprintf; use const T_DOC_COMMENT_OPEN_TAG; use const T_NAMESPACE; @@ -50,16 +43,16 @@ class UnusedUsesSniff implements Sniff /** @var bool */ public $searchAnnotations = false; - /** @var string[] */ + /** @var list */ public $ignoredAnnotationNames = []; - /** @var string[] */ + /** @var list */ public $ignoredAnnotations = []; - /** @var string[]|null */ + /** @var list|null */ private $normalizedIgnoredAnnotationNames; - /** @var string[]|null */ + /** @var list|null */ private $normalizedIgnoredAnnotations; /** @@ -128,7 +121,7 @@ public function process(File $phpcsFile, $openTagPointer): void $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - if (count($annotations) === 0) { + if ($annotations === []) { $searchAnnotationsPointer = $tokens[$docCommentOpenPointer]['comment_closer'] + 1; continue; } @@ -152,109 +145,69 @@ public function process(File $phpcsFile, $openTagPointer): void $nameAsReferencedInFile = $useStatement->getNameAsReferencedInFile(); $uniqueId = UseStatement::getUniqueId($useStatement->getType(), $nameAsReferencedInFile); - /** @var string $annotationName */ - foreach ($annotations as $annotationName => $annotationsByName) { - if (in_array($annotationName, $this->getIgnoredAnnotations(), true)) { + foreach ($annotations as $annotation) { + if (in_array($annotation->getName(), $this->getIgnoredAnnotations(), true)) { continue; } - if ( - !in_array($annotationName, $this->getIgnoredAnnotationNames(), true) - && preg_match( - '~^@(' . preg_quote($nameAsReferencedInFile, '~') . ')(?=[^-a-z\\d]|$)~i', - $annotationName, - $matches - ) !== 0 - ) { - $allUsedNames[$pointerBeforeUseStatements][$uniqueId] = true; + if ($annotation->isInvalid()) { + continue; } - foreach ($annotationsByName as $annotation) { - if (!$annotation instanceof GenericAnnotation) { - continue; - } - - if ($annotation->getParameters() === null) { - continue; - } + $contentsToCheck = []; + + if ($annotation->getValue() instanceof GenericTagValueNode) { + $contentsToCheck[] = $annotation->getName(); + $contentsToCheck[] = $annotation->getValue()->value; + } else { + /** @var list $identifierTypeNodes */ + $identifierTypeNodes = AnnotationHelper::getAnnotationNodesByType( + $annotation->getNode(), + IdentifierTypeNode::class + ); + /** @var list $doctrineAnnotations */ + $doctrineAnnotations = AnnotationHelper::getAnnotationNodesByType( + $annotation->getNode(), + DoctrineAnnotation::class + ); + /** @var list $constFetchNodes */ + $constFetchNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), ConstFetchNode::class); + + $contentsToCheck = array_filter(array_merge( + $contentsToCheck, + array_map(static function (IdentifierTypeNode $identifierTypeNode): ?string { + if ( + TypeHintHelper::isSimpleTypeHint($identifierTypeNode->name) + || TypeHintHelper::isSimpleUnofficialTypeHints($identifierTypeNode->name) + || !TypeHelper::isTypeName($identifierTypeNode->name) + ) { + return null; + } - if ( - preg_match( - '~(?<=^|[^a-z\\\\])(' . preg_quote($nameAsReferencedInFile, '~') . ')(\\\\\\w+)*(?=::)~i', - $annotation->getParameters(), - $matches - ) === 0 - && preg_match( - '~(?<=@)(' . preg_quote($nameAsReferencedInFile, '~') . ')(?=[^\\w])~i', - $annotation->getParameters(), - $matches - ) === 0 - ) { - continue; - } + return $identifierTypeNode->name; + }, $identifierTypeNodes), + array_map(function (DoctrineAnnotation $doctrineAnnotation): ?string { + if (in_array($doctrineAnnotation->name, $this->getIgnoredAnnotationNames(), true)) { + return null; + } - $allUsedNames[$pointerBeforeUseStatements][$uniqueId] = true; + return $doctrineAnnotation->name; + }, $doctrineAnnotations), + array_map(static function (ConstFetchNode $constFetchNode): string { + return $constFetchNode->className; + }, $constFetchNodes) + )); } - /** @var VariableAnnotation|ParameterAnnotation|ReturnAnnotation|ThrowsAnnotation|PropertyAnnotation|MethodAnnotation|GenericAnnotation $annotation */ - foreach ($annotationsByName as $annotation) { - if ($annotation->getContent() === null) { + foreach ($contentsToCheck as $contentToCheck) { + if (preg_match( + '~(?<=^|[^a-z\\\\])(' . preg_quote($nameAsReferencedInFile, '~') . ')(?=\\s|::|\\\\|\||\[|$)~im', + $contentToCheck + ) === 0) { continue; } - if ($annotation->isInvalid()) { - continue; - } - - $content = $annotation->getContent(); - - $contentsToCheck = []; - if (!$annotation instanceof GenericAnnotation) { - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getIdentifierTypeNodes($annotationType) as $typeNode) { - if (!$typeNode instanceof IdentifierTypeNode) { - continue; - } - - if ( - TypeHintHelper::isSimpleTypeHint($typeNode->name) - || TypeHintHelper::isSimpleUnofficialTypeHints($typeNode->name) - || !TypeHelper::isTypeName($typeNode->name) - ) { - continue; - } - - $contentsToCheck[] = $typeNode->name; - } - } - foreach (AnnotationHelper::getAnnotationConstantExpressions($annotation) as $annotationConstantExpression) { - $contentsToCheck = array_merge( - $contentsToCheck, - array_map(static function (ConstFetchNode $constFetchNode): string { - return $constFetchNode->className; - }, AnnotationConstantExpressionHelper::getConstantFetchNodes($annotationConstantExpression)) - ); - } - } elseif ($annotationName === '@see') { - $parts = preg_split('~(\\s+|::)~', $content); - if ($parts !== false) { - $contentsToCheck[] = $parts[0]; - } - } else { - $contentsToCheck[] = $content; - } - - foreach ($contentsToCheck as $contentToCheck) { - if (preg_match( - '~(?<=^|\|)(' . preg_quote($nameAsReferencedInFile, '~') . ')(?=\\s|\\\\|\||\[|$)~i', - $contentToCheck, - $matches - ) === 0) { - continue; - } - - $allUsedNames[$pointerBeforeUseStatements][$uniqueId] = true; - } + $allUsedNames[$pointerBeforeUseStatements][$uniqueId] = true; } } } @@ -293,7 +246,7 @@ public function process(File $phpcsFile, $openTagPointer): void } /** - * @return string[] + * @return list */ private function getIgnoredAnnotationNames(): array { @@ -313,7 +266,7 @@ private function getIgnoredAnnotationNames(): array } /** - * @return string[] + * @return list */ private function getIgnoredAnnotations(): array { @@ -325,7 +278,7 @@ private function getIgnoredAnnotations(): array } /** - * @param int[] $pointersBeforeUseStatements + * @param list $pointersBeforeUseStatements */ private function firstPointerBefore(int $pointer, array $pointersBeforeUseStatements, int $startPointer): int { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseOnlyWhitelistedNamespacesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseOnlyWhitelistedNamespacesSniff.php index 09b067474..f8f7508d6 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseOnlyWhitelistedNamespacesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseOnlyWhitelistedNamespacesSniff.php @@ -18,10 +18,10 @@ class UseOnlyWhitelistedNamespacesSniff implements Sniff /** @var bool */ public $allowUseFromRootNamespace = false; - /** @var string[] */ + /** @var list */ public $namespacesRequiredToUse = []; - /** @var string[]|null */ + /** @var list|null */ private $normalizedNamespacesRequiredToUse; /** @@ -67,7 +67,7 @@ public function process(File $phpcsFile, $usePointer): void } /** - * @return string[] + * @return list */ private function getNamespacesRequiredToUse(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseSpacingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseSpacingSniff.php index 3c48b2964..ca0808a47 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseSpacingSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Namespaces/UseSpacingSniff.php @@ -193,7 +193,7 @@ private function checkLinesAfterLastUse(File $phpcsFile, UseStatement $lastUse): } /** - * @param UseStatement[] $useStatements + * @param list $useStatements */ private function checkLinesBetweenSameTypesOfUse(File $phpcsFile, array $useStatements): void { @@ -265,7 +265,7 @@ private function checkLinesBetweenSameTypesOfUse(File $phpcsFile, array $useStat } /** - * @param UseStatement[] $useStatements + * @param list $useStatements */ private function checkLinesBetweenDifferentTypesOfUse(File $phpcsFile, array $useStatements): void { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php index 05f08124d..7a3406b34 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Operators/RequireCombinedAssignmentOperatorSniff.php @@ -36,7 +36,7 @@ class RequireCombinedAssignmentOperatorSniff implements Sniff { - public const CODE_REQUIRED_COMBINED_ASSIGMENT_OPERATOR = 'RequiredCombinedAssigmentOperator'; + public const CODE_REQUIRED_COMBINED_ASSIGNMENT_OPERATOR = 'RequiredCombinedAssignmentOperator'; /** * @return array @@ -128,20 +128,21 @@ public function process(File $phpcsFile, $equalPointer): void ); if (!$isFixable) { - $phpcsFile->addError($errorMessage, $equalPointer, self::CODE_REQUIRED_COMBINED_ASSIGMENT_OPERATOR); + $phpcsFile->addError($errorMessage, $equalPointer, self::CODE_REQUIRED_COMBINED_ASSIGNMENT_OPERATOR); return; } - $fix = $phpcsFile->addFixableError($errorMessage, $equalPointer, self::CODE_REQUIRED_COMBINED_ASSIGMENT_OPERATOR); + $fix = $phpcsFile->addFixableError($errorMessage, $equalPointer, self::CODE_REQUIRED_COMBINED_ASSIGNMENT_OPERATOR); if (!$fix) { return; } $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($equalPointer, $operators[$tokens[$operatorPointer]['code']]); - FixerHelper::removeBetweenIncluding($phpcsFile, $equalPointer + 1, $operatorPointer); + + FixerHelper::change($phpcsFile, $equalPointer, $operatorPointer, $operators[$tokens[$operatorPointer]['code']]); + $phpcsFile->fixer->endChangeset(); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ForbiddenClassesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ForbiddenClassesSniff.php index 382845313..165840ed7 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ForbiddenClassesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/ForbiddenClassesSniff.php @@ -49,7 +49,7 @@ class ForbiddenClassesSniff implements Sniff /** @var array */ public $forbiddenTraits = []; - /** @var array */ + /** @var list */ private static $keywordReferences = ['self', 'parent', 'static']; /** @@ -138,7 +138,7 @@ public function process(File $phpcsFile, $tokenPointer): void } /** - * @param array{fullyQualifiedName: string, startPointer: int|null, endPointer: int|null}[] $references + * @param list $references * @param array $forbiddenNames */ private function checkReferences( @@ -199,8 +199,9 @@ private function checkReferences( } $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($reference['startPointer'], $alternative); - FixerHelper::removeBetweenIncluding($phpcsFile, $reference['startPointer'] + 1, $reference['endPointer']); + + FixerHelper::change($phpcsFile, $reference['startPointer'], $reference['endPointer'], $alternative); + $phpcsFile->fixer->endChangeset(); } } @@ -215,7 +216,7 @@ private function isTraitsConflictResolutionToken(array $token): bool } /** - * @return array{fullyQualifiedName: string, startPointer: int|null, endPointer: int|null}[] + * @return list */ private function getAllReferences(File $phpcsFile, int $startPointer, int $endPointer): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php index cedc5bc04..49466b11d 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/PHP/RequireExplicitAssertionSniff.php @@ -5,6 +5,7 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; @@ -12,7 +13,7 @@ use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\IndentationHelper; @@ -86,22 +87,24 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $codePointer = $firstPointerOnPreviousLine; } - $variableAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $docCommentOpenPointer, '@var'); + /** @var list> $variableAnnotations */ + $variableAnnotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer, '@var'); if (count($variableAnnotations) === 0) { return; } - /** @var VariableAnnotation $variableAnnotation */ foreach (array_reverse($variableAnnotations) as $variableAnnotation) { if ($variableAnnotation->isInvalid()) { continue; } - if ($variableAnnotation->getVariableName() === null) { + $variableName = $variableAnnotation->getValue()->variableName; + + if ($variableName === '') { continue; } - $variableAnnotationType = $variableAnnotation->getType(); + $variableAnnotationType = $variableAnnotation->getValue()->type; if ( $variableAnnotationType instanceof UnionTypeNode @@ -119,7 +122,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void /** @var IdentifierTypeNode|ThisTypeNode|UnionTypeNode|GenericTypeNode $variableAnnotationType */ $variableAnnotationType = $variableAnnotationType; - $assertion = $this->createAssert($variableAnnotation->getVariableName(), $variableAnnotationType); + $assertion = $this->createAssert($variableName, $variableAnnotationType); if ($assertion === null) { continue; @@ -131,7 +134,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void continue; } - if ($variableAnnotation->getVariableName() !== $tokens[$codePointer]['content']) { + if ($variableName !== $tokens[$codePointer]['content']) { continue; } @@ -144,7 +147,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $variablePointerInList = TokenHelper::findNextContent( $phpcsFile, T_VARIABLE, - $variableAnnotation->getVariableName(), + $variableName, $listParenthesisOpener + 1, $tokens[$listParenthesisOpener]['parenthesis_closer'] ); @@ -164,7 +167,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $variablePointerInList = TokenHelper::findNextContent( $phpcsFile, T_VARIABLE, - $variableAnnotation->getVariableName(), + $variableName, $codePointer + 1, $tokens[$codePointer]['bracket_closer'] ); @@ -184,7 +187,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $variablePointerInWhile = TokenHelper::findNextContent( $phpcsFile, T_VARIABLE, - $variableAnnotation->getVariableName(), + $variableName, $tokens[$codePointer]['parenthesis_opener'] + 1, $tokens[$codePointer]['parenthesis_closer'] ); @@ -206,7 +209,7 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $variablePointerInForeach = TokenHelper::findNextContent( $phpcsFile, T_VARIABLE, - $variableAnnotation->getVariableName(), + $variableName, $asPointer + 1, $tokens[$codePointer]['parenthesis_closer'] ); @@ -364,7 +367,7 @@ private function createAssert(string $variableName, TypeNode $typeNode): ?string /** * @param IdentifierTypeNode|ThisTypeNode|GenericTypeNode $typeNode - * @return string[] + * @return list */ private function createConditions(string $variableName, TypeNode $typeNode): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Strings/DisallowVariableParsingSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Strings/DisallowVariableParsingSniff.php new file mode 100644 index 000000000..45a8c4048 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Strings/DisallowVariableParsingSniff.php @@ -0,0 +1,154 @@ + + */ + public function register(): array + { + return [ + T_DOUBLE_QUOTED_STRING, + T_HEREDOC, + ]; + } + + /** + * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + * @param int $stringPointer + */ + public function process(File $phpcsFile, $stringPointer): void + { + if (!$this->disallowDollarCurlySyntax && !$this->disallowCurlyDollarSyntax && !$this->disallowSimpleSyntax) { + throw new UnexpectedValueException('No option is set.'); + } + + $tokens = $phpcsFile->getTokens(); + $tokenContent = $tokens[$stringPointer]['content']; + + if (strpos($tokenContent, '$') === false) { + return; + } + + $stringTokens = $tokens[$stringPointer]['code'] === T_HEREDOC + ? token_get_all('disallowDollarCurlySyntax && $this->getTokenContent($stringToken) === '${') { + $usedVariable = $stringToken[1]; + + for ($j = $i + 1; $j < count($stringTokens); $j++) { + $usedVariable .= $this->getTokenContent($stringTokens[$j]); + + if ($this->getTokenContent($stringTokens[$j]) === '}') { + $phpcsFile->addError( + sprintf( + 'Using variable syntax "${...}" inside string is disallowed as syntax "${...}" is deprecated as of PHP 8.2, found "%s".', + $usedVariable + ), + $stringPointer, + self::CODE_DISALLOWED_DOLLAR_CURLY_SYNTAX + ); + + break; + } + } + } elseif ($stringToken[0] === T_VARIABLE) { + if ($this->disallowCurlyDollarSyntax && $this->getTokenContent($stringTokens[$i - 1]) === '{') { + $usedVariable = $stringToken[1]; + + for ($j = $i + 1; $j < count($stringTokens); $j++) { + $stringTokenContent = $this->getTokenContent($stringTokens[$j]); + if ($stringTokenContent === '}') { + break; + } + + $usedVariable .= $stringTokenContent; + } + + $phpcsFile->addError( + sprintf( + 'Using variable syntax "{$...}" inside string is disallowed, found "{%s}".', + $usedVariable + ), + $stringPointer, + self::CODE_DISALLOWED_CURLY_DOLLAR_SYNTAX + ); + } elseif ($this->disallowSimpleSyntax) { + $error = true; + + for ($j = $i - 1; $j >= 0; $j--) { + $stringTokenContent = $this->getTokenContent($stringTokens[$j]); + + if (in_array($stringTokenContent, ['{', '${'], true)) { + $error = false; + break; + } + + if ($stringTokenContent === '}') { + break; + } + } + + if ($error) { + $phpcsFile->addError( + sprintf( + 'Using variable syntax "$..." inside string is disallowed, found "%s".', + $this->getTokenContent($stringToken) + ), + $stringPointer, + self::CODE_DISALLOWED_SIMPLE_SYNTAX + ); + } + } + } + } + } + + /** + * @param array{0: int, 1: string}|string $token + */ + private function getTokenContent($token): string + { + return is_array($token) ? $token[1] : $token; + } + +} diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TestCase.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TestCase.php index ba6a6427b..74d440f94 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TestCase.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TestCase.php @@ -7,6 +7,7 @@ use PHP_CodeSniffer\Files\LocalFile; use PHP_CodeSniffer\Runner; use PHP_CodeSniffer\Sniffs\Sniff; +use PHP_CodeSniffer\Util\Common; use ReflectionClass; use function array_map; use function array_merge; @@ -29,9 +30,9 @@ abstract class TestCase extends \PHPUnit\Framework\TestCase { /** - * @param (string|int|bool|array)[] $sniffProperties - * @param string[] $codesToCheck - * @param string[] $cliArgs + * @param array> $sniffProperties + * @param list $codesToCheck + * @param list $cliArgs */ protected static function checkFile(string $filePath, array $sniffProperties = [], array $codesToCheck = [], array $cliArgs = []): File { @@ -165,21 +166,9 @@ protected static function getSniffClassName(): string return $sniffClassName; } - private static function getSniffName(): string + protected static function getSniffName(): string { - return preg_replace( - [ - '~\\\~', - '~\.Sniffs~', - '~Sniff$~', - ], - [ - '.', - '', - '', - ], - static::getSniffClassName() - ); + return Common::getSniffCode(static::getSniffClassName()); } private static function getSniffClassReflection(): ReflectionClass @@ -192,7 +181,7 @@ private static function getSniffClassReflection(): ReflectionClass } /** - * @param (string|int)[][][] $errorsOnLine + * @param list> $errorsOnLine */ private static function hasError(array $errorsOnLine, string $sniffCode, ?string $message): bool { @@ -222,7 +211,7 @@ private static function hasError(array $errorsOnLine, string $sniffCode, ?string } /** - * @param (string|int|bool)[][][] $errors + * @param list> $errors */ private static function getFormattedErrors(array $errors): string { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php index bd32cbab0..998798182 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DeclareStrictTypesSniff.php @@ -145,8 +145,9 @@ public function process(File $phpcsFile, $openTagPointer): void ); if ($fix) { $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($strictTypesPointer, $format); - FixerHelper::removeBetweenIncluding($phpcsFile, $strictTypesPointer + 1, $numberPointer); + + FixerHelper::change($phpcsFile, $strictTypesPointer, $numberPointer, $format); + $phpcsFile->fixer->endChangeset(); } } @@ -171,8 +172,9 @@ public function process(File $phpcsFile, $openTagPointer): void ); if ($fix) { $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($openTagPointer, 'fixer->endChangeset(); } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php index 1bd69d76b..bc8bc6262 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php @@ -4,17 +4,20 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use PHPStan\PhpDocParser\Ast\AbstractNodeVisitor; +use PHPStan\PhpDocParser\Ast\Node; +use PHPStan\PhpDocParser\Ast\NodeTraverser; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\Annotation; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ParameterAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\ReturnAnnotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; +use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\FunctionHelper; use SlevomatCodingStandard\Helpers\NamespaceHelper; @@ -35,7 +38,7 @@ class DisallowArrayTypeHintSyntaxSniff implements Sniff public const CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX = 'DisallowedArrayTypeHintSyntax'; - /** @var string[] */ + /** @var list */ public $traversableTypeHints = []; /** @var array|null */ @@ -59,109 +62,144 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void { $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationByName) { - foreach ($annotationByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { - continue; - } + foreach ($annotations as $annotation) { + $arrayTypeNodes = $this->getArrayTypeNodes($annotation->getValue()); - if ($annotation->isInvalid()) { + foreach ($arrayTypeNodes as $arrayTypeNode) { + $fix = $phpcsFile->addFixableError( + sprintf( + 'Usage of array type hint syntax in "%s" is disallowed, use generic type hint syntax instead.', + AnnotationTypeHelper::print($arrayTypeNode) + ), + $annotation->getStartPointer(), + self::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX + ); + + if (!$fix) { continue; } - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - $unionTypeNodes = AnnotationTypeHelper::getUnionTypeNodes($annotationType); - foreach ($this->getArrayTypeNodes($annotationType) as $arrayTypeNode) { - $fix = $phpcsFile->addFixableError( - sprintf( - 'Usage of array type hint syntax in "%s" is disallowed, use generic type hint syntax instead.', - AnnotationTypeHelper::export($arrayTypeNode) - ), - $annotation->getStartPointer(), - self::CODE_DISALLOWED_ARRAY_TYPE_HINT_SYNTAX - ); + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); - if (!$fix) { - continue; - } + /** @var list $unionTypeNodes */ + $unionTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), UnionTypeNode::class); - $unionTypeNode = $this->findUnionTypeThatContainsArrayType($arrayTypeNode, $unionTypeNodes); - - if ($unionTypeNode !== null) { - $genericIdentifier = $this->findGenericIdentifier($phpcsFile, $unionTypeNode, $annotation); - if ($genericIdentifier !== null) { - $genericTypeNode = new GenericTypeNode( - new IdentifierTypeNode($genericIdentifier), - [$this->fixArrayNode($arrayTypeNode->type)] - ); - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $unionTypeNode, - $genericTypeNode - ); - } else { - $genericTypeNode = new GenericTypeNode( - new IdentifierTypeNode('array'), - [$this->fixArrayNode($arrayTypeNode->type)] - ); - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $arrayTypeNode, - $genericTypeNode - ); - } - } else { - $genericIdentifier = $this->findGenericIdentifier($phpcsFile, $arrayTypeNode, $annotation) ?? 'array'; - - $genericTypeNode = new GenericTypeNode( - new IdentifierTypeNode($genericIdentifier), - [$this->fixArrayNode($arrayTypeNode->type)] - ); - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $arrayTypeNode, - $genericTypeNode - ); - } + $unionTypeNode = $this->findUnionTypeThatContainsArrayType($arrayTypeNode, $unionTypeNodes); - $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $fixedAnnotationContent); - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer() + 1, $annotation->getEndPointer()); - $phpcsFile->fixer->endChangeset(); + if ($unionTypeNode !== null) { + $genericIdentifier = $this->findGenericIdentifier( + $phpcsFile, + $docCommentOpenPointer, + $unionTypeNode, + $annotation->getValue() + ); + if ($genericIdentifier !== null) { + $genericTypeNode = new GenericTypeNode( + new IdentifierTypeNode($genericIdentifier), + [$this->fixArrayNode($arrayTypeNode->type)] + ); + $fixedDocComment = AnnotationHelper::fixAnnotation( + $parsedDocComment, + $annotation, + $unionTypeNode, + $genericTypeNode + ); + } else { + $genericTypeNode = new GenericTypeNode( + new IdentifierTypeNode('array'), + [$this->fixArrayNode($arrayTypeNode->type)] + ); + $fixedDocComment = AnnotationHelper::fixAnnotation( + $parsedDocComment, + $annotation, + $arrayTypeNode, + $genericTypeNode + ); } + } else { + $genericIdentifier = $this->findGenericIdentifier( + $phpcsFile, + $docCommentOpenPointer, + $arrayTypeNode, + $annotation->getValue() + ) ?? 'array'; + + $genericTypeNode = new GenericTypeNode( + new IdentifierTypeNode($genericIdentifier), + [$this->fixArrayNode($arrayTypeNode->type)] + ); + $fixedDocComment = AnnotationHelper::fixAnnotation($parsedDocComment, $annotation, $arrayTypeNode, $genericTypeNode); } + + $phpcsFile->fixer->beginChangeset(); + + FixerHelper::change( + $phpcsFile, + $parsedDocComment->getOpenPointer(), + $parsedDocComment->getClosePointer(), + $fixedDocComment + ); + + $phpcsFile->fixer->endChangeset(); } } } /** - * @return ArrayTypeNode[] + * @return list */ - public function getArrayTypeNodes(TypeNode $typeNode): array + public function getArrayTypeNodes(Node $node): array { - $arrayTypeNodes = AnnotationTypeHelper::getArrayTypeNodes($typeNode); + static $visitor; + static $traverser; - $arrayTypeNodesToIgnore = []; - foreach ($arrayTypeNodes as $arrayTypeNode) { - if (!($arrayTypeNode->type instanceof ArrayTypeNode)) { - continue; - } + if ($visitor === null) { + $visitor = new class extends AbstractNodeVisitor { - $arrayTypeNodesToIgnore[] = $arrayTypeNode->type; - } + /** @var list */ + private $nodes = []; - foreach ($arrayTypeNodes as $no => $arrayTypeNode) { - if (!in_array($arrayTypeNode, $arrayTypeNodesToIgnore, true)) { - continue; - } + /** + * @return Node|list|NodeTraverser::*|null + */ + public function enterNode(Node $node) + { + if ($node instanceof ArrayTypeNode) { + $this->nodes[] = $node; + + if ($node->type instanceof ArrayTypeNode) { + return NodeTraverser::DONT_TRAVERSE_CHILDREN; + } + } + + return null; + } + + public function cleanNodes(): void + { + $this->nodes = []; + } + + /** + * @return list + */ + public function getNodes(): array + { + return $this->nodes; + } - unset($arrayTypeNodes[$no]); + }; } - return $arrayTypeNodes; + if ($traverser === null) { + $traverser = new NodeTraverser([$visitor]); + } + + $visitor->cleanNodes(); + + $traverser->traverse([$node]); + + return $visitor->getNodes(); } private function fixArrayNode(TypeNode $node): TypeNode @@ -174,7 +212,7 @@ private function fixArrayNode(TypeNode $node): TypeNode } /** - * @param UnionTypeNode[] $unionTypeNodes + * @param list $unionTypeNodes */ private function findUnionTypeThatContainsArrayType(ArrayTypeNode $arrayTypeNode, array $unionTypeNodes): ?UnionTypeNode { @@ -187,26 +225,31 @@ private function findUnionTypeThatContainsArrayType(ArrayTypeNode $arrayTypeNode return null; } - private function findGenericIdentifier(File $phpcsFile, TypeNode $typeNode, Annotation $annotation): ?string + private function findGenericIdentifier( + File $phpcsFile, + int $docCommentOpenPointer, + TypeNode $typeNode, + PhpDocTagValueNode $annotationValue + ): ?string { if (!$typeNode instanceof UnionTypeNode) { - if (!$annotation instanceof ParameterAnnotation && !$annotation instanceof ReturnAnnotation) { + if (!$annotationValue instanceof ParamTagValueNode && !$annotationValue instanceof ReturnTagValueNode) { return null; } - $functionPointer = TokenHelper::findNext($phpcsFile, TokenHelper::$functionTokenCodes, $annotation->getStartPointer() + 1); + $functionPointer = TokenHelper::findNext($phpcsFile, TokenHelper::$functionTokenCodes, $docCommentOpenPointer + 1); if ($functionPointer === null || $phpcsFile->getTokens()[$functionPointer]['code'] !== T_FUNCTION) { return null; } - if ($annotation instanceof ParameterAnnotation) { + if ($annotationValue instanceof ParamTagValueNode) { $parameterTypeHints = FunctionHelper::getParametersTypeHints($phpcsFile, $functionPointer); return array_key_exists( - $annotation->getParameterName(), + $annotationValue->parameterName, $parameterTypeHints - ) && $parameterTypeHints[$annotation->getParameterName()] !== null - ? $parameterTypeHints[$annotation->getParameterName()]->getTypeHint() + ) && $parameterTypeHints[$annotationValue->parameterName] !== null + ? $parameterTypeHints[$annotationValue->parameterName]->getTypeHint() : null; } @@ -222,7 +265,7 @@ private function findGenericIdentifier(File $phpcsFile, TypeNode $typeNode, Anno $typeNode->types[0] instanceof ArrayTypeNode && $typeNode->types[1] instanceof IdentifierTypeNode && $this->isTraversableType( - TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $annotation->getStartPointer(), $typeNode->types[1]->name) + TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $docCommentOpenPointer, $typeNode->types[1]->name) ) ) { return $typeNode->types[1]->name; @@ -232,7 +275,7 @@ private function findGenericIdentifier(File $phpcsFile, TypeNode $typeNode, Anno $typeNode->types[1] instanceof ArrayTypeNode && $typeNode->types[0] instanceof IdentifierTypeNode && $this->isTraversableType( - TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $annotation->getStartPointer(), $typeNode->types[0]->name) + TypeHintHelper::getFullyQualifiedTypeHint($phpcsFile, $docCommentOpenPointer, $typeNode->types[0]->name) ) ) { return $typeNode->types[0]->name; diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowMixedTypeHintSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowMixedTypeHintSniff.php index 73c27e8b8..2c29985ed 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowMixedTypeHintSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowMixedTypeHintSniff.php @@ -4,9 +4,8 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; +use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use SlevomatCodingStandard\Helpers\AnnotationHelper; -use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\SuppressHelper; use function sprintf; use function strtolower; @@ -45,31 +44,22 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationByName) { - foreach ($annotationByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { - continue; - } + foreach ($annotations as $annotation) { + /** @var list $identifierTypeNodes */ + $identifierTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), IdentifierTypeNode::class); + + foreach ($identifierTypeNodes as $typeHintNode) { + $typeHint = $typeHintNode->name; - if ($annotation->isInvalid()) { + if (strtolower($typeHint) !== 'mixed') { continue; } - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getIdentifierTypeNodes($annotationType) as $typeHintNode) { - $typeHint = AnnotationTypeHelper::getTypeHintFromNode($typeHintNode); - - if (strtolower($typeHint) !== 'mixed') { - continue; - } - - $phpcsFile->addError( - 'Usage of "mixed" type hint is disallowed.', - $annotation->getStartPointer(), - self::CODE_DISALLOWED_MIXED_TYPE_HINT - ); - } - } + $phpcsFile->addError( + 'Usage of "mixed" type hint is disallowed.', + $annotation->getStartPointer(), + self::CODE_DISALLOWED_MIXED_TYPE_HINT + ); } } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/LongTypeHintsSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/LongTypeHintsSniff.php index b8cb362f8..8bc9c2f2a 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/LongTypeHintsSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/LongTypeHintsSniff.php @@ -5,9 +5,8 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; -use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; +use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use function sprintf; use function strtolower; @@ -36,59 +35,56 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void { $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationName => $annotationByName) { - foreach ($annotationByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { - continue; - } + foreach ($annotations as $annotation) { + /** @var list $identifierTypeNodes */ + $identifierTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), IdentifierTypeNode::class); - if ($annotation->isInvalid()) { - continue; - } + foreach ($identifierTypeNodes as $typeHintNode) { + $typeHint = $typeHintNode->name; - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getIdentifierTypeNodes($annotationType) as $typeHintNode) { - $typeHint = AnnotationTypeHelper::getTypeHintFromNode($typeHintNode); + $lowercasedTypeHint = strtolower($typeHint); - $lowercasedTypeHint = strtolower($typeHint); + $shortTypeHint = null; + if ($lowercasedTypeHint === 'integer') { + $shortTypeHint = 'int'; + } elseif ($lowercasedTypeHint === 'boolean') { + $shortTypeHint = 'bool'; + } - $shortTypeHint = null; - if ($lowercasedTypeHint === 'integer') { - $shortTypeHint = 'int'; - } elseif ($lowercasedTypeHint === 'boolean') { - $shortTypeHint = 'bool'; - } + if ($shortTypeHint === null) { + continue; + } - if ($shortTypeHint === null) { - continue; - } + $fix = $phpcsFile->addFixableError(sprintf( + 'Expected "%s" but found "%s" in %s annotation.', + $shortTypeHint, + $typeHint, + $annotation->getName() + ), $annotation->getStartPointer(), self::CODE_USED_LONG_TYPE_HINT); - $fix = $phpcsFile->addFixableError(sprintf( - 'Expected "%s" but found "%s" in %s annotation.', - $shortTypeHint, - $typeHint, - $annotationName - ), $annotation->getStartPointer(), self::CODE_USED_LONG_TYPE_HINT); + if (!$fix) { + continue; + } - if (!$fix) { - continue; - } + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $typeHintNode, - new IdentifierTypeNode($shortTypeHint) - ); + $fixedDocComment = AnnotationHelper::fixAnnotation( + $parsedDocComment, + $annotation, + $typeHintNode, + new IdentifierTypeNode($shortTypeHint) + ); - $phpcsFile->fixer->beginChangeset(); + $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $fixedAnnotationContent); - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer() + 1, $annotation->getEndPointer()); + FixerHelper::change( + $phpcsFile, + $parsedDocComment->getOpenPointer(), + $parsedDocComment->getClosePointer(), + $fixedDocComment + ); - $phpcsFile->fixer->endChangeset(); - } - } + $phpcsFile->fixer->endChangeset(); } } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullTypeHintOnLastPositionSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullTypeHintOnLastPositionSniff.php index 5733ec886..eb7a3a439 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullTypeHintOnLastPositionSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/NullTypeHintOnLastPositionSniff.php @@ -6,10 +6,11 @@ use PHP_CodeSniffer\Sniffs\Sniff; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\GenericAnnotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; +use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; +use SlevomatCodingStandard\Helpers\PhpDocParserHelper; use function count; use function sprintf; use function strtolower; @@ -38,77 +39,69 @@ public function process(File $phpcsFile, $docCommentOpenPointer): void { $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); - foreach ($annotations as $annotationByName) { - foreach ($annotationByName as $annotation) { - if ($annotation instanceof GenericAnnotation) { + foreach ($annotations as $annotation) { + /** @var list $unionTypeNodes */ + $unionTypeNodes = AnnotationHelper::getAnnotationNodesByType($annotation->getNode(), UnionTypeNode::class); + + foreach ($unionTypeNodes as $unionTypeNode) { + $nullTypeNode = null; + $nullPosition = 0; + $position = 0; + foreach ($unionTypeNode->types as $typeNode) { + if ($typeNode instanceof IdentifierTypeNode && strtolower($typeNode->name) === 'null') { + $nullTypeNode = $typeNode; + $nullPosition = $position; + break; + } + + $position++; + } + + if ($nullTypeNode === null) { continue; } - if ($annotation->isInvalid()) { + if ($nullPosition === count($unionTypeNode->types) - 1) { + continue; + } + + $fix = $phpcsFile->addFixableError( + sprintf('Null type hint should be on last position in "%s".', AnnotationTypeHelper::print($unionTypeNode)), + $annotation->getStartPointer(), + self::CODE_NULL_TYPE_HINT_NOT_ON_LAST_POSITION + ); + + if (!$fix) { continue; } - foreach (AnnotationHelper::getAnnotationTypes($annotation) as $annotationType) { - foreach (AnnotationTypeHelper::getUnionTypeNodes($annotationType) as $unionTypeNode) { - $nullTypeNode = null; - $nullPosition = 0; - $position = 0; - foreach ($unionTypeNode->types as $typeNode) { - if ($typeNode instanceof IdentifierTypeNode && strtolower($typeNode->name) === 'null') { - $nullTypeNode = $typeNode; - $nullPosition = $position; - break; - } - - $position++; - } - - if ($nullTypeNode === null) { - continue; - } - - if ($nullPosition === count($unionTypeNode->types) - 1) { - continue; - } - - $fix = $phpcsFile->addFixableError( - sprintf('Null type hint should be on last position in "%s".', AnnotationTypeHelper::export($unionTypeNode)), - $annotation->getStartPointer(), - self::CODE_NULL_TYPE_HINT_NOT_ON_LAST_POSITION - ); - - if (!$fix) { - continue; - } - - $phpcsFile->fixer->beginChangeset(); - - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer(), $annotation->getEndPointer()); - - $fixedTypeNodes = []; - foreach ($unionTypeNode->types as $typeNode) { - if ($typeNode === $nullTypeNode) { - continue; - } - - $fixedTypeNodes[] = $typeNode; - } - $fixedTypeNodes[] = $nullTypeNode; - $fixedUnionTypeNode = new UnionTypeNode($fixedTypeNodes); - - $fixedAnnotationContent = AnnotationHelper::fixAnnotationType( - $phpcsFile, - $annotation, - $unionTypeNode, - $fixedUnionTypeNode - ); - - $phpcsFile->fixer->replaceToken($annotation->getStartPointer(), $fixedAnnotationContent); - FixerHelper::removeBetweenIncluding($phpcsFile, $annotation->getStartPointer() + 1, $annotation->getEndPointer()); - - $phpcsFile->fixer->endChangeset(); + $fixedTypeNodes = []; + foreach ($unionTypeNode->types as $typeNode) { + if ($typeNode === $nullTypeNode) { + continue; } + + $fixedTypeNodes[] = $typeNode; } + $fixedTypeNodes[] = $nullTypeNode; + + $fixedUnionTypeNode = PhpDocParserHelper::cloneNode($unionTypeNode); + $fixedUnionTypeNode->types = $fixedTypeNodes; + + $phpcsFile->fixer->beginChangeset(); + + $parsedDocComment = DocCommentHelper::parseDocComment($phpcsFile, $docCommentOpenPointer); + + $fixedDocComment = AnnotationHelper::fixAnnotation($parsedDocComment, $annotation, $unionTypeNode, $fixedUnionTypeNode); + + FixerHelper::change( + $phpcsFile, + $parsedDocComment->getOpenPointer(), + $parsedDocComment->getClosePointer(), + $fixedDocComment + ); + + $phpcsFile->fixer->endChangeset(); } } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSniff.php index 2ab911ae2..fa71a58fb 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ParameterTypeHintSniff.php @@ -4,6 +4,10 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use PHP_CodeSniffer\Util\Tokens; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\TypelessParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; @@ -12,10 +16,10 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeNode; use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\ParameterAnnotation; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\DocCommentHelper; @@ -41,11 +45,13 @@ use function sprintf; use function strtolower; use const T_BITWISE_AND; +use const T_COMMA; use const T_DOC_COMMENT_CLOSE_TAG; use const T_DOC_COMMENT_OPEN_TAG; use const T_DOC_COMMENT_STAR; use const T_ELLIPSIS; use const T_FUNCTION; +use const T_OPEN_PARENTHESIS; use const T_VARIABLE; class ParameterTypeHintSniff implements Sniff @@ -78,7 +84,7 @@ class ParameterTypeHintSniff implements Sniff /** @var bool|null */ public $enableStandaloneNullTrueFalseTypeHints = null; - /** @var string[] */ + /** @var list */ public $traversableTypeHints = []; /** @var array|null */ @@ -133,9 +139,9 @@ public function process(File $phpcsFile, $functionPointer): void } /** - * @param (TypeHint|null)[] $parametersTypeHints - * @param array $parametersAnnotations - * @param array $prefixedParametersAnnotations + * @param array $parametersTypeHints + * @param array|Annotation|Annotation> $parametersAnnotations + * @param array|Annotation> $prefixedParametersAnnotations */ private function checkTypeHints( File $phpcsFile, @@ -159,8 +165,34 @@ private function checkTypeHints( }) ); + $tokens = $phpcsFile->getTokens(); + + $isConstructor = FunctionHelper::isMethod($phpcsFile, $functionPointer) + && strtolower(FunctionHelper::getName($phpcsFile, $functionPointer)) === '__construct'; + foreach ($parametersWithoutTypeHint as $parameterName) { - if (!array_key_exists($parameterName, $parametersAnnotations) || $parametersAnnotations[$parameterName]->getType() === null) { + $isPropertyPromotion = false; + + if ($isConstructor) { + $parameterPointer = TokenHelper::findNextContent( + $phpcsFile, + T_VARIABLE, + $parameterName, + $tokens[$functionPointer]['parenthesis_opener'], + $tokens[$functionPointer]['parenthesis_closer'] + ); + + $pointerBeforeParameter = TokenHelper::findPrevious($phpcsFile, [T_COMMA, T_OPEN_PARENTHESIS], $parameterPointer - 1); + + $visibilityPointer = TokenHelper::findNextEffective($phpcsFile, $pointerBeforeParameter + 1); + + $isPropertyPromotion = in_array($tokens[$visibilityPointer]['code'], Tokens::$scopeModifiers, true); + } + + if ( + !array_key_exists($parameterName, $parametersAnnotations) + || $parametersAnnotations[$parameterName]->getValue() instanceof TypelessParamTagValueNode + ) { if (array_key_exists($parameterName, $prefixedParametersAnnotations)) { continue; } @@ -184,7 +216,7 @@ private function checkTypeHints( continue; } - $parameterTypeNode = $parametersAnnotations[$parameterName]->getType(); + $parameterTypeNode = $parametersAnnotations[$parameterName]->getValue()->type; if ( $parameterTypeNode instanceof IdentifierTypeNode @@ -206,7 +238,7 @@ private function checkTypeHints( $nullableParameterTypeHint = false; if (AnnotationTypeHelper::containsOneType($parameterTypeNode)) { - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode|ConstTypeNode $parameterTypeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode|ConstTypeNode $parameterTypeNode */ $parameterTypeNode = $parameterTypeNode; $typeHints[] = AnnotationTypeHelper::getTypeHintFromOneType( $parameterTypeNode, @@ -224,7 +256,7 @@ private function checkTypeHints( continue 2; } - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode|ConstTypeNode $typeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode|ConstTypeNode $typeNode */ $typeNode = $typeNode; $typeHint = AnnotationTypeHelper::getTypeHintFromOneType($typeNode, $canTryUnionTypeHint); @@ -307,6 +339,10 @@ private function checkTypeHints( continue; } + if ($isPropertyPromotion && $typeHint === 'callable') { + continue 2; + } + if (!TypeHintHelper::isValidTypeHint( $typeHint, $this->enableObjectTypeHint, @@ -339,7 +375,7 @@ private function checkTypeHints( FunctionHelper::getTypeLabel($phpcsFile, $functionPointer), FunctionHelper::getFullyQualifiedName($phpcsFile, $functionPointer), $parameterName, - AnnotationTypeHelper::export($parameterTypeNode) + AnnotationTypeHelper::print($parameterTypeNode) ), $functionPointer, self::CODE_MISSING_NATIVE_TYPE_HINT @@ -413,9 +449,9 @@ private function checkTypeHints( } /** - * @param (TypeHint|null)[] $parametersTypeHints - * @param array $parametersAnnotations - * @param array $prefixedParametersAnnotations + * @param array $parametersTypeHints + * @param array|Annotation|Annotation> $parametersAnnotations + * @param array|Annotation> $prefixedParametersAnnotations */ private function checkTraversableTypeHintSpecification( File $phpcsFile, @@ -445,9 +481,9 @@ private function checkTraversableTypeHintSpecification( $hasTraversableTypeHint = true; } elseif ( array_key_exists($parameterName, $parametersAnnotations) - && $parametersAnnotations[$parameterName]->getType() !== null + && !$parametersAnnotations[$parameterName]->getValue() instanceof TypelessParamTagValueNode && AnnotationTypeHelper::containsTraversableType( - $parametersAnnotations[$parameterName]->getType(), + $parametersAnnotations[$parameterName]->getValue()->type, $phpcsFile, $functionPointer, $this->getTraversableTypeHints() @@ -479,11 +515,12 @@ private function checkTraversableTypeHintSpecification( continue; } - $parameterTypeNode = $parametersAnnotations[$parameterName]->getType(); - if ($parameterTypeNode === null) { + if ($parametersAnnotations[$parameterName]->getValue() instanceof TypelessParamTagValueNode) { continue; } + $parameterTypeNode = $parametersAnnotations[$parameterName]->getValue()->type; + if ( ( !$hasTraversableTypeHint @@ -528,8 +565,8 @@ private function checkTraversableTypeHintSpecification( } /** - * @param (TypeHint|null)[] $parametersTypeHints - * @param array $parametersAnnotations + * @param array $parametersTypeHints + * @param array $parametersAnnotations */ private function checkUselessAnnotations( File $phpcsFile, @@ -548,7 +585,8 @@ private function checkUselessAnnotations( } $parameterAnnotation = $parametersAnnotations[$parameterName]; - if ($parameterAnnotation->getType() === null) { + + if ($parameterAnnotation->getValue() instanceof TypelessParamTagValueNode) { continue; } @@ -585,7 +623,7 @@ private function checkUselessAnnotations( continue; } - $docCommentOpenPointer = $parameterAnnotation instanceof VariableAnnotation + $docCommentOpenPointer = $parameterAnnotation->getValue() instanceof VarTagValueNode ? TokenHelper::findPrevious($phpcsFile, T_DOC_COMMENT_OPEN_TAG, $parameterAnnotation->getStartPointer() - 1) : DocCommentHelper::findDocCommentOpenPointer($phpcsFile, $functionPointer); @@ -596,12 +634,12 @@ private function checkUselessAnnotations( $docCommentOpenPointer ); - $changeStart = $starPointer ?? $docCommentOpenPointer + 1; + $changeStart = $starPointer ?? $parameterAnnotation->getStartPointer(); /** @var int $changeEnd */ $changeEnd = TokenHelper::findNext( $phpcsFile, [T_DOC_COMMENT_CLOSE_TAG, T_DOC_COMMENT_STAR], - $parameterAnnotation->getEndPointer() + 1 + $parameterAnnotation->getEndPointer() ) - 1; $phpcsFile->fixer->beginChangeset(); @@ -633,7 +671,7 @@ private function getSniffName(string $sniffName): string } /** - * @return array + * @return list */ private function getTraversableTypeHints(): array { diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/PropertyTypeHintSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/PropertyTypeHintSniff.php index 575db5ad6..82a100fdd 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/PropertyTypeHintSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/PropertyTypeHintSniff.php @@ -4,6 +4,8 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; @@ -11,9 +13,10 @@ use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeNode; use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\VariableAnnotation; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\DocCommentHelper; @@ -30,6 +33,7 @@ use function array_unique; use function array_values; use function count; +use function current; use function implode; use function in_array; use function sprintf; @@ -79,7 +83,7 @@ class PropertyTypeHintSniff implements Sniff /** @var bool|null */ public $enableStandaloneNullTrueFalseTypeHints = null; - /** @var string[] */ + /** @var list */ public $traversableTypeHints = []; /** @var array|null */ @@ -146,16 +150,22 @@ public function process(File $phpcsFile, $pointer): void return; } - if (DocCommentHelper::hasInheritdocAnnotation($phpcsFile, $propertyPointer)) { - return; - } + $docCommentOpenPointer = DocCommentHelper::findDocCommentOpenPointer($phpcsFile, $propertyPointer); + if ($docCommentOpenPointer !== null) { + if (DocCommentHelper::hasInheritdocAnnotation($phpcsFile, $docCommentOpenPointer)) { + return; + } - /** @var VariableAnnotation[] $varAnnotations */ - $varAnnotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $propertyPointer, '@var'); - $prefixedPropertyAnnotations = $this->getValidPrefixedAnnotations($phpcsFile, $propertyPointer); + $varAnnotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer, '@var'); + $prefixedPropertyAnnotations = $this->getValidPrefixedAnnotations($phpcsFile, $docCommentOpenPointer); + + $propertyAnnotation = count($varAnnotations) > 0 ? current($varAnnotations) : null; + } else { + $propertyAnnotation = null; + $prefixedPropertyAnnotations = []; + } $propertyTypeHint = PropertyHelper::findTypeHint($phpcsFile, $propertyPointer); - $propertyAnnotation = count($varAnnotations) > 0 ? $varAnnotations[0] : null; $this->checkTypeHint($phpcsFile, $propertyPointer, $propertyTypeHint, $propertyAnnotation, $prefixedPropertyAnnotations); $this->checkTraversableTypeHintSpecification( @@ -169,13 +179,14 @@ public function process(File $phpcsFile, $pointer): void } /** - * @param VariableAnnotation[] $prefixedPropertyAnnotations + * @param Annotation|null $propertyAnnotation + * @param list> $prefixedPropertyAnnotations */ private function checkTypeHint( File $phpcsFile, int $propertyPointer, ?TypeHint $propertyTypeHint, - ?VariableAnnotation $propertyAnnotation, + ?Annotation $propertyAnnotation, array $prefixedPropertyAnnotations ): void { @@ -217,7 +228,7 @@ private function checkTypeHint( return; } - $typeNode = $propertyAnnotation->getType(); + $typeNode = $propertyAnnotation->getValue()->type; $originalTypeNode = $typeNode; if ($typeNode instanceof NullableTypeNode) { $typeNode = $typeNode->type; @@ -230,7 +241,7 @@ private function checkTypeHint( $nullableTypeHint = false; if (AnnotationTypeHelper::containsOneType($typeNode)) { - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $typeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $typeNode */ $typeNode = $typeNode; $typeHints[] = AnnotationTypeHelper::getTypeHintFromOneType($typeNode, false, $this->enableStandaloneNullTrueFalseTypeHints); @@ -242,7 +253,7 @@ private function checkTypeHint( return; } - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $innerTypeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $innerTypeNode */ $innerTypeNode = $innerTypeNode; $typeHint = AnnotationTypeHelper::getTypeHintFromOneType($innerTypeNode, $canTryUnionTypeHint); @@ -364,7 +375,7 @@ private function checkTypeHint( sprintf( 'Property %s does not have native type hint for its value but it should be possible to add it based on @var annotation "%s".', PropertyHelper::getFullyQualifiedName($phpcsFile, $propertyPointer), - AnnotationTypeHelper::export($typeNode) + AnnotationTypeHelper::print($typeNode) ), $propertyPointer, self::CODE_MISSING_NATIVE_TYPE_HINT @@ -415,13 +426,14 @@ private function checkTypeHint( } /** - * @param VariableAnnotation[] $prefixedPropertyAnnotations + * @param Annotation|null $propertyAnnotation + * @param list> $prefixedPropertyAnnotations */ private function checkTraversableTypeHintSpecification( File $phpcsFile, int $propertyPointer, ?TypeHint $propertyTypeHint, - ?VariableAnnotation $propertyAnnotation, + ?Annotation $propertyAnnotation, array $prefixedPropertyAnnotations ): void { @@ -453,7 +465,7 @@ private function checkTraversableTypeHintSpecification( return; } - $typeNode = $propertyAnnotation->getType(); + $typeNode = $propertyAnnotation->getValue()->type; if ( !$hasTraversableTypeHint @@ -491,7 +503,7 @@ private function checkUselessAnnotation( File $phpcsFile, int $propertyPointer, ?TypeHint $propertyTypeHint, - ?VariableAnnotation $propertyAnnotation + ?Annotation $propertyAnnotation ): void { if ($propertyAnnotation === null) { @@ -533,7 +545,6 @@ private function checkUselessAnnotation( } if ($this->isDocCommentUseless($phpcsFile, $propertyPointer)) { - /** @var int $docCommentOpenPointer */ $docCommentOpenPointer = DocCommentHelper::findDocCommentOpenPointer($phpcsFile, $propertyPointer); $docCommentClosePointer = $phpcsFile->getTokens()[$docCommentOpenPointer]['comment_closer']; @@ -550,6 +561,7 @@ private function checkUselessAnnotation( /** @var int $changeStart */ $changeStart = TokenHelper::findPrevious($phpcsFile, T_DOC_COMMENT_STAR, $propertyAnnotation->getStartPointer() - 1); + /** @var int $changeEnd */ $changeEnd = TokenHelper::findNext( $phpcsFile, @@ -568,10 +580,13 @@ private function isDocCommentUseless(File $phpcsFile, int $propertyPointer): boo return false; } - $annotations = AnnotationHelper::getAnnotations($phpcsFile, $propertyPointer); - unset($annotations['@var']); + foreach (AnnotationHelper::getAnnotations($phpcsFile, $propertyPointer) as $annotation) { + if ($annotation->getName() !== '@var') { + return false; + } + } - return count($annotations) === 0; + return true; } private function reportUselessSuppress(File $phpcsFile, int $pointer, bool $isSuppressed, string $suppressName): void @@ -597,7 +612,7 @@ private function getSniffName(string $sniffName): string } /** - * @return array + * @return list */ private function getTraversableTypeHints(): array { @@ -611,16 +626,19 @@ private function getTraversableTypeHints(): array return $this->normalizedTraversableTypeHints; } - private function hasAnnotation(?VariableAnnotation $propertyAnnotation): bool + private function hasAnnotation(?Annotation $propertyAnnotation): bool { - return $propertyAnnotation !== null && $propertyAnnotation->getContent() !== null && !$propertyAnnotation->isInvalid(); + return $propertyAnnotation !== null && $propertyAnnotation->getValue() instanceof VarTagValueNode; } + /** + * @param Annotation|null $propertyAnnotation + */ private function hasTraversableTypeHint( File $phpcsFile, int $propertyPointer, ?TypeHint $propertyTypeHint, - ?VariableAnnotation $propertyAnnotation + ?Annotation $propertyAnnotation ): bool { if ( @@ -640,7 +658,7 @@ private function hasTraversableTypeHint( return $this->hasAnnotation($propertyAnnotation) && AnnotationTypeHelper::containsTraversableType( - $propertyAnnotation->getType(), + $propertyAnnotation->getValue()->type, $phpcsFile, $propertyPointer, $this->getTraversableTypeHints() @@ -648,24 +666,27 @@ private function hasTraversableTypeHint( } /** - * @return VariableAnnotation[] + * @return list> */ - private function getValidPrefixedAnnotations(File $phpcsFile, int $propertyPointer): array + private function getValidPrefixedAnnotations(File $phpcsFile, int $docCommentOpenPointer): array { - $returnAnnotations = []; + $varAnnotations = []; - foreach (AnnotationHelper::PREFIXES as $prefix) { - /** @var VariableAnnotation[] $annotations */ - $annotations = AnnotationHelper::getAnnotationsByName($phpcsFile, $propertyPointer, sprintf('@%s-var', $prefix)); + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $docCommentOpenPointer); + + foreach (AnnotationHelper::STATIC_ANALYSIS_PREFIXES as $prefix) { foreach ($annotations as $annotation) { - if (!$annotation->isInvalid()) { - $returnAnnotations[] = $annotation; - break; + if ($annotation->isInvalid()) { + continue; + } + + if ($annotation->getName() === sprintf('@%s-var', $prefix)) { + $varAnnotations[] = $annotation; } } } - return $returnAnnotations; + return $varAnnotations; } } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php index db5db9a8f..594dc77f7 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/ReturnTypeHintSniff.php @@ -4,20 +4,19 @@ use PHP_CodeSniffer\Files\File; use PHP_CodeSniffer\Sniffs\Sniff; +use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\ArrayTypeNode; use PHPStan\PhpDocParser\Ast\Type\CallableTypeNode; -use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeForParameterNode; -use PHPStan\PhpDocParser\Ast\Type\ConditionalTypeNode; -use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode; use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; use PHPStan\PhpDocParser\Ast\Type\IntersectionTypeNode; use PHPStan\PhpDocParser\Ast\Type\NullableTypeNode; +use PHPStan\PhpDocParser\Ast\Type\ObjectShapeNode; use PHPStan\PhpDocParser\Ast\Type\ThisTypeNode; use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\PhpDocParser\Ast\Type\UnionTypeNode; -use SlevomatCodingStandard\Helpers\Annotation\ReturnAnnotation; +use SlevomatCodingStandard\Helpers\Annotation; use SlevomatCodingStandard\Helpers\AnnotationHelper; use SlevomatCodingStandard\Helpers\AnnotationTypeHelper; use SlevomatCodingStandard\Helpers\DocCommentHelper; @@ -83,7 +82,7 @@ class ReturnTypeHintSniff implements Sniff /** @var bool|null */ public $enableStandaloneNullTrueFalseTypeHints = null; - /** @var string[] */ + /** @var list */ public $traversableTypeHints = []; /** @var array|null */ @@ -147,13 +146,13 @@ public function process(File $phpcsFile, $pointer): void } /** - * @param ReturnAnnotation[] $prefixedReturnAnnotations + * @param list $prefixedReturnAnnotations */ private function checkFunctionTypeHint( File $phpcsFile, int $functionPointer, ?TypeHint $returnTypeHint, - ?ReturnAnnotation $returnAnnotation, + ?Annotation $returnAnnotation, array $prefixedReturnAnnotations ): void { @@ -178,7 +177,7 @@ private function checkFunctionTypeHint( '%s %s() has return type hint "void" but it should be possible to add "never" based on @return annotation "%s".', FunctionHelper::getTypeLabel($phpcsFile, $functionPointer), FunctionHelper::getFullyQualifiedName($phpcsFile, $functionPointer), - AnnotationTypeHelper::export($returnTypeNode) + AnnotationTypeHelper::print($returnTypeNode) ), $functionPointer, self::CODE_LESS_SPECIFIC_NATIVE_TYPE_HINT @@ -252,7 +251,7 @@ private function checkFunctionTypeHint( '%s %s() does not have native return type hint for its return value but it should be possible to add it based on @return annotation "%s".', FunctionHelper::getTypeLabel($phpcsFile, $functionPointer), FunctionHelper::getFullyQualifiedName($phpcsFile, $functionPointer), - AnnotationTypeHelper::export($returnTypeNode) + AnnotationTypeHelper::print($returnTypeNode) ); $fix = $phpcsFile->addFixableError($message, $functionPointer, self::getSniffName(self::CODE_MISSING_NATIVE_TYPE_HINT)); @@ -279,7 +278,7 @@ private function checkFunctionTypeHint( '%s %s() does not have native return type hint for its return value but it should be possible to add it based on @return annotation "%s".', FunctionHelper::getTypeLabel($phpcsFile, $functionPointer), FunctionHelper::getFullyQualifiedName($phpcsFile, $functionPointer), - AnnotationTypeHelper::export($returnTypeNode) + AnnotationTypeHelper::print($returnTypeNode) ); $phpcsFile->addError($message, $functionPointer, self::getSniffName(self::CODE_MISSING_NATIVE_TYPE_HINT)); @@ -298,7 +297,7 @@ private function checkFunctionTypeHint( } if (AnnotationTypeHelper::containsOneType($returnTypeNode)) { - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $returnTypeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $returnTypeNode */ $returnTypeNode = $returnTypeNode; $typeHints[] = AnnotationTypeHelper::getTypeHintFromOneType( $returnTypeNode, @@ -314,7 +313,7 @@ private function checkFunctionTypeHint( return; } - /** @var ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $typeNode */ + /** @var ArrayTypeNode|ArrayShapeNode|ObjectShapeNode|IdentifierTypeNode|ThisTypeNode|GenericTypeNode|CallableTypeNode $typeNode */ $typeNode = $typeNode; $typeHint = AnnotationTypeHelper::getTypeHintFromOneType($typeNode, $canTryUnionTypeHint); @@ -434,7 +433,7 @@ private function checkFunctionTypeHint( '%s %s() does not have native return type hint for its return value but it should be possible to add it based on @return annotation "%s".', FunctionHelper::getTypeLabel($phpcsFile, $functionPointer), FunctionHelper::getFullyQualifiedName($phpcsFile, $functionPointer), - AnnotationTypeHelper::export($returnTypeNode) + AnnotationTypeHelper::print($returnTypeNode) ), $functionPointer, self::CODE_MISSING_NATIVE_TYPE_HINT @@ -467,13 +466,13 @@ private function checkFunctionTypeHint( } /** - * @param ReturnAnnotation[] $prefixedReturnAnnotations + * @param list $prefixedReturnAnnotations */ private function checkFunctionTraversableTypeHintSpecification( File $phpcsFile, int $functionPointer, ?TypeHint $returnTypeHint, - ?ReturnAnnotation $returnAnnotation, + ?Annotation $returnAnnotation, array $prefixedReturnAnnotations ): void { @@ -535,7 +534,7 @@ private function checkFunctionTraversableTypeHintSpecification( return; } - /** @var ReturnAnnotation $returnAnnotation */ + /** @var Annotation $returnAnnotation */ $returnAnnotation = $returnAnnotation; $phpcsFile->addError( @@ -553,7 +552,7 @@ private function checkFunctionUselessAnnotation( File $phpcsFile, int $functionPointer, ?TypeHint $returnTypeHint, - ?ReturnAnnotation $returnAnnotation + ?Annotation $returnAnnotation ): void { if ($returnAnnotation === null) { @@ -603,7 +602,7 @@ private function checkFunctionUselessAnnotation( $docCommentOpenPointer ); - $changeStart = $starPointer ?? $docCommentOpenPointer + 1; + $changeStart = $starPointer ?? $returnAnnotation->getStartPointer(); /** @var int $changeEnd */ $changeEnd = TokenHelper::findNext( @@ -646,12 +645,12 @@ private function checkClosureTypeHint(File $phpcsFile, int $closurePointer): voi } /** - * @return GenericTypeNode|CallableTypeNode|IntersectionTypeNode|UnionTypeNode|ArrayTypeNode|ArrayShapeNode|IdentifierTypeNode|ThisTypeNode|NullableTypeNode|ConstTypeNode|ConditionalTypeNode|ConditionalTypeForParameterNode|null + * @param Annotation|null $returnAnnotation */ - private function getReturnTypeNode(?ReturnAnnotation $returnAnnotation): ?TypeNode + private function getReturnTypeNode(?Annotation $returnAnnotation): ?TypeNode { if ($this->hasReturnAnnotation($returnAnnotation)) { - return $returnAnnotation->getType(); + return $returnAnnotation->getValue()->type; } return null; @@ -661,7 +660,7 @@ private function hasTraversableTypeHint( File $phpcsFile, int $functionPointer, ?TypeHint $returnTypeHint, - ?ReturnAnnotation $returnAnnotation + ?Annotation $returnAnnotation ): bool { if ( @@ -688,9 +687,9 @@ private function hasTraversableTypeHint( ); } - private function hasReturnAnnotation(?ReturnAnnotation $returnAnnotation): bool + private function hasReturnAnnotation(?Annotation $returnAnnotation): bool { - return $returnAnnotation !== null && $returnAnnotation->getContent() !== null && !$returnAnnotation->isInvalid(); + return $returnAnnotation !== null && !$returnAnnotation->isInvalid(); } private function reportUselessSuppress(File $phpcsFile, int $pointer, bool $isSuppressed, string $suppressName): void diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UnionTypeHintFormatSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UnionTypeHintFormatSniff.php index d9b78fcab..2e189487b 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UnionTypeHintFormatSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UnionTypeHintFormatSniff.php @@ -240,8 +240,7 @@ private function fixTypeHint(File $phpcsFile, TypeHint $typeHint, string $fixedT { $phpcsFile->fixer->beginChangeset(); - $phpcsFile->fixer->replaceToken($typeHint->getStartPointer(), $fixedTypeHint); - FixerHelper::removeBetweenIncluding($phpcsFile, $typeHint->getStartPointer() + 1, $typeHint->getEndPointer()); + FixerHelper::change($phpcsFile, $typeHint->getStartPointer(), $typeHint->getEndPointer(), $fixedTypeHint); $phpcsFile->fixer->endChangeset(); } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UselessConstantTypeHintSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UselessConstantTypeHintSniff.php index 266f6b626..b061adc60 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UselessConstantTypeHintSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/UselessConstantTypeHintSniff.php @@ -8,7 +8,6 @@ use SlevomatCodingStandard\Helpers\DocCommentHelper; use SlevomatCodingStandard\Helpers\FixerHelper; use SlevomatCodingStandard\Helpers\TokenHelper; -use function array_key_exists; use function count; use const T_CONST; use const T_DOC_COMMENT_WHITESPACE; @@ -42,10 +41,9 @@ public function process(File $phpcsFile, $constantPointer): void return; } - $annotations = AnnotationHelper::getAnnotations($phpcsFile, $constantPointer); + $annotations = AnnotationHelper::getAnnotations($phpcsFile, $constantPointer, '@var'); - $uselessAnnotation = array_key_exists('@var', $annotations); - if (!$uselessAnnotation) { + if ($annotations === []) { return; } @@ -57,7 +55,7 @@ public function process(File $phpcsFile, $constantPointer): void $fixerStart = TokenHelper::findLastTokenOnPreviousLine($phpcsFile, $docCommentOpenPointer); $fixerEnd = $tokens[$docCommentOpenPointer]['comment_closer']; } else { - $annotation = $annotations['@var'][0]; + $annotation = $annotations[0]; $fix = $phpcsFile->addFixableError( 'Useless @var annotation.', diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php index da46fa67b..568d116f0 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UnusedVariableSniff.php @@ -617,12 +617,12 @@ private function isReference(File $phpcsFile, int $scopeOwnerPointer, int $varia continue; } - $assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $i + 1); - if ($tokens[$assigmentPointer]['code'] !== T_EQUAL) { + $assignmentPointer = TokenHelper::findNextEffective($phpcsFile, $i + 1); + if ($tokens[$assignmentPointer]['code'] !== T_EQUAL) { continue; } - $referencePointer = TokenHelper::findNextEffective($phpcsFile, $assigmentPointer + 1); + $referencePointer = TokenHelper::findNextEffective($phpcsFile, $assignmentPointer + 1); if ($tokens[$referencePointer]['code'] === T_BITWISE_AND) { return true; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php index ab46baec8..38cce8371 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Variables/UselessVariableSniff.php @@ -103,7 +103,7 @@ public function process(File $phpcsFile, $returnPointer): void return; } - if (!$this->isAssigmentToVariable($phpcsFile, $previousVariablePointer)) { + if (!$this->isAssignmentToVariable($phpcsFile, $previousVariablePointer)) { return; } @@ -119,7 +119,7 @@ public function process(File $phpcsFile, $returnPointer): void return; } - if ($this->hasAnotherAssigmentBefore($phpcsFile, $previousVariablePointer, $variableName)) { + if ($this->hasAnotherAssignmentBefore($phpcsFile, $previousVariablePointer, $variableName)) { return; } @@ -149,10 +149,10 @@ public function process(File $phpcsFile, $returnPointer): void return; } - /** @var int $assigmentPointer */ - $assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $previousVariablePointer + 1); + /** @var int $assignmentPointer */ + $assignmentPointer = TokenHelper::findNextEffective($phpcsFile, $previousVariablePointer + 1); - $assigmentFixerMapping = [ + $assignmentFixerMapping = [ T_PLUS_EQUAL => '+', T_MINUS_EQUAL => '-', T_MUL_EQUAL => '*', @@ -171,12 +171,11 @@ public function process(File $phpcsFile, $returnPointer): void $phpcsFile->fixer->beginChangeset(); - if ($tokens[$assigmentPointer]['code'] === T_EQUAL) { - FixerHelper::removeBetweenIncluding($phpcsFile, $previousVariablePointer, $assigmentPointer - 1); - $phpcsFile->fixer->replaceToken($assigmentPointer, 'return'); + if ($tokens[$assignmentPointer]['code'] === T_EQUAL) { + FixerHelper::change($phpcsFile, $previousVariablePointer, $assignmentPointer, 'return'); } else { $phpcsFile->fixer->addContentBefore($previousVariablePointer, 'return '); - $phpcsFile->fixer->replaceToken($assigmentPointer, $assigmentFixerMapping[$tokens[$assigmentPointer]['code']]); + $phpcsFile->fixer->replaceToken($assignmentPointer, $assignmentFixerMapping[$tokens[$assignmentPointer]['code']]); } FixerHelper::removeBetweenIncluding($phpcsFile, $previousVariableSemicolonPointer + 1, $returnSemicolonPointer); @@ -257,10 +256,10 @@ private function isAssignedInFunctionCall(File $phpcsFile, int $pointer): bool return $parenthesisOpenerPointer < $pointer && $pointer < $tokens[$parenthesisOpenerPointer]['parenthesis_closer']; } - private function isAssigmentToVariable(File $phpcsFile, int $pointer): bool + private function isAssignmentToVariable(File $phpcsFile, int $pointer): bool { - $assigmentPointer = TokenHelper::findNextEffective($phpcsFile, $pointer + 1); - return in_array($phpcsFile->getTokens()[$assigmentPointer]['code'], [ + $assignmentPointer = TokenHelper::findNextEffective($phpcsFile, $pointer + 1); + return in_array($phpcsFile->getTokens()[$assignmentPointer]['code'], [ T_EQUAL, T_PLUS_EQUAL, T_MINUS_EQUAL, @@ -353,14 +352,14 @@ private function hasVariableVarAnnotation(File $phpcsFile, int $variablePointer) ) !== 0; } - private function hasAnotherAssigmentBefore(File $phpcsFile, int $variablePointer, string $variableName): bool + private function hasAnotherAssignmentBefore(File $phpcsFile, int $variablePointer, string $variableName): bool { $previousVariablePointer = $this->findPreviousVariablePointer($phpcsFile, $variablePointer, $variableName); if ($previousVariablePointer === null) { return false; } - if (!$this->isAssigmentToVariable($phpcsFile, $previousVariablePointer)) { + if (!$this->isAssignmentToVariable($phpcsFile, $previousVariablePointer)) { return false; } diff --git a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Whitespaces/DuplicateSpacesSniff.php b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Whitespaces/DuplicateSpacesSniff.php index b8bd175e7..8dbecc506 100644 --- a/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Whitespaces/DuplicateSpacesSniff.php +++ b/app/vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Whitespaces/DuplicateSpacesSniff.php @@ -141,14 +141,14 @@ public function process(File $phpcsFile, $whitespacePointer): void $fix = false; foreach ($matches[0] as [$match, $offset]) { $firstPointerOnLine = TokenHelper::findFirstNonWhitespaceOnLine($phpcsFile, $whitespacePointer - 1); - $indendation = IndentationHelper::getIndentation($phpcsFile, $firstPointerOnLine); - $indendationWithoutTabs = str_replace( + $indentation = IndentationHelper::getIndentation($phpcsFile, $firstPointerOnLine); + $indentationWithoutTabs = str_replace( IndentationHelper::TAB_INDENT, $tabWidth === 0 ? IndentationHelper::SPACES_INDENT : str_repeat(' ', $tabWidth), - $indendation + $indentation ); - $position = $tokens[$whitespacePointer]['column'] + $offset - strlen($indendation) + strlen($indendationWithoutTabs); + $position = $tokens[$whitespacePointer]['column'] + $offset - strlen($indentation) + strlen($indentationWithoutTabs); $fixable = $phpcsFile->addFixableError( sprintf('Duplicate spaces at position %d.', $position), diff --git a/app/vendor/slevomat/coding-standard/composer.json b/app/vendor/slevomat/coding-standard/composer.json index d43b9f403..ec0c19339 100644 --- a/app/vendor/slevomat/coding-standard/composer.json +++ b/app/vendor/slevomat/coding-standard/composer.json @@ -9,7 +9,7 @@ "config": { "bin-dir": "bin", "platform": { - "php": "8.0.0" + "php": "8.1.0" }, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true @@ -18,17 +18,17 @@ "require": { "php": "^7.2 || ^8.0", "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", - "phpstan/phpdoc-parser": ">=1.16.0 <1.17.0", + "phpstan/phpdoc-parser": "^1.23.0", "squizlabs/php_codesniffer": "^3.7.1" }, "require-dev": { "phing/phing": "2.17.4", "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.10.8", + "phpstan/phpstan": "1.10.26", "phpstan/phpstan-deprecation-rules": "1.1.3", - "phpstan/phpstan-phpunit": "1.0.0|1.3.10", - "phpstan/phpstan-strict-rules": "1.5.0", - "phpunit/phpunit": "7.5.20|8.5.21|9.6.5" + "phpstan/phpstan-phpunit": "1.3.13", + "phpstan/phpstan-strict-rules": "1.5.1", + "phpunit/phpunit": "7.5.20|8.5.21|9.6.8|10.2.6" }, "autoload": { "psr-4": { diff --git a/app/vendor/slevomat/coding-standard/doc/arrays.md b/app/vendor/slevomat/coding-standard/doc/arrays.md index bb5fe1e96..3b4f10f8e 100644 --- a/app/vendor/slevomat/coding-standard/doc/arrays.md +++ b/app/vendor/slevomat/coding-standard/doc/arrays.md @@ -8,10 +8,18 @@ It reduces merge conflicts and duplicate entries. This sniff enforces natural sorting of array definitions by key in multi-line arrays. +#### SlevomatCodingStandard.Arrays.ArrayAccess 🔧 + +Disallow whitespace between array access operator and the variable, or between array access operators. + #### SlevomatCodingStandard.Arrays.DisallowImplicitArrayCreation Disallows implicit array creation. +#### SlevomatCodingStandard.Arrays.DisallowPartiallyKeyed 🚧 + +Array must have keys specified for either all or none of the values. + #### SlevomatCodingStandard.Arrays.MultiLineArrayEndBracketPlacement 🔧 Enforces reasonable end bracket placement for multi-line arrays. diff --git a/app/vendor/slevomat/coding-standard/doc/classes.md b/app/vendor/slevomat/coding-standard/doc/classes.md index b4826f932..5bbed250b 100644 --- a/app/vendor/slevomat/coding-standard/doc/classes.md +++ b/app/vendor/slevomat/coding-standard/doc/classes.md @@ -113,6 +113,14 @@ Disallows multi constant definition. Disallows multi property definition. +#### SlevomatCodingStandard.Classes.DisallowMultiPropertyDefinition 🔧 + +Disallows multi property definition. + +#### SlevomatCodingStandard.Classes.DisallowStringExpressionPropertyFetch 🔧 + +Disallows string expression property fetch `$object->{'foo'}` when the property name is compatible with identifier access. + #### SlevomatCodingStandard.Classes.EmptyLinesAroundClassBraces 🔧 Enforces one configurable number of lines after opening class/interface/trait brace and one empty line before the closing brace. diff --git a/app/vendor/slevomat/coding-standard/doc/commenting.md b/app/vendor/slevomat/coding-standard/doc/commenting.md index 6c1efbbaa..0c4862765 100644 --- a/app/vendor/slevomat/coding-standard/doc/commenting.md +++ b/app/vendor/slevomat/coding-standard/doc/commenting.md @@ -1,5 +1,14 @@ ## Commenting +#### SlevomatCodingStandard.Commenting.AnnotationName 🔧 + +Reports incorrect annotation name. It reports standard annotation names used by phpDocumentor, PHPUnit, PHPStan and Psalm by default. +Unknown annotation names are ignored. + +Sniff provides the following settings: + +* `annotations`: allows to configure which annotations are checked and how. + #### SlevomatCodingStandard.Commenting.DeprecatedAnnotationDeclaration Reports `@deprecated` annotations without description. diff --git a/app/vendor/slevomat/coding-standard/doc/control-structures.md b/app/vendor/slevomat/coding-standard/doc/control-structures.md index 4924350f1..760aaa586 100644 --- a/app/vendor/slevomat/coding-standard/doc/control-structures.md +++ b/app/vendor/slevomat/coding-standard/doc/control-structures.md @@ -169,12 +169,12 @@ Reports `new` with useless parentheses. #### SlevomatCodingStandard.ControlStructures.RequireMultiLineCondition 🔧 -Enforces conditions of `if`, `elseif`, `while` and `do-while` with one or more boolean operators to be splitted to more lines +Enforces conditions of `if`, `elseif`, `while` and `do-while` with one or more boolean operators to be split to more lines so each condition part is on its own line. Sniff provides the following settings: -* `minLineLength`: specifies minimum line length to enforce condition to be splitted. Use 0 value to enforce for all conditions, regardless of length. +* `minLineLength`: specifies minimum line length to enforce condition to be split. Use 0 value to enforce for all conditions, regardless of length. * `booleanOperatorOnPreviousLine`: boolean operator is placed at the end of previous line when fixing. * `alwaysSplitAllConditionParts`: require all condition parts to be on its own line - it reports error even if condition is already multi-line but there are some condition parts on the same line. diff --git a/app/vendor/slevomat/coding-standard/doc/strings.md b/app/vendor/slevomat/coding-standard/doc/strings.md new file mode 100644 index 000000000..17fcc7cc4 --- /dev/null +++ b/app/vendor/slevomat/coding-standard/doc/strings.md @@ -0,0 +1,11 @@ +## Strings + +#### SlevomatCodingStandard.Strings.DisallowVariableParsing + +Disallows variable parsing inside strings. + +Sniff provides the following settings: + +* `disallowDollarCurlySyntax`: disallows usage of `${...}`, enabled by default. +* `disallowCurlyDollarSyntax`: disallows usage of `{$...}`, disabled by default. +* `disallowSimpleSyntax`: disallows usage of `$...`, disabled by default. diff --git a/app/vendor/symfony/config/Builder/ConfigBuilderGenerator.php b/app/vendor/symfony/config/Builder/ConfigBuilderGenerator.php index 8dc7f4cb5..2f00a99be 100644 --- a/app/vendor/symfony/config/Builder/ConfigBuilderGenerator.php +++ b/app/vendor/symfony/config/Builder/ConfigBuilderGenerator.php @@ -426,9 +426,7 @@ private function getComment(BaseNode $node): string } if ($node instanceof EnumNode) { - $comment .= sprintf(' * @param ParamConfigurator|%s $value', implode('|', array_map(function ($a) { - return var_export($a, true); - }, $node->getValues())))."\n"; + $comment .= sprintf(' * @param ParamConfigurator|%s $value', implode('|', array_unique(array_map(fn ($a) => !$a instanceof \UnitEnum ? var_export($a, true) : '\\'.ltrim(var_export($a, true), '\\'), $node->getValues()))))."\n"; } else { $parameterTypes = $this->getParameterTypes($node); $comment .= ' * @param ParamConfigurator|'.implode('|', $parameterTypes).' $value'."\n"; diff --git a/app/vendor/symfony/config/CHANGELOG.md b/app/vendor/symfony/config/CHANGELOG.md index 0fac3a8a5..094d5abba 100644 --- a/app/vendor/symfony/config/CHANGELOG.md +++ b/app/vendor/symfony/config/CHANGELOG.md @@ -1,6 +1,11 @@ CHANGELOG ========= +6.3 +--- + + * Allow enum values in `EnumNode` + 6.2 --- diff --git a/app/vendor/symfony/config/ConfigCacheInterface.php b/app/vendor/symfony/config/ConfigCacheInterface.php index e1763fc5c..be7f0986c 100644 --- a/app/vendor/symfony/config/ConfigCacheInterface.php +++ b/app/vendor/symfony/config/ConfigCacheInterface.php @@ -39,6 +39,8 @@ public function isFresh(): bool; * @param string $content The content to write into the cache * @param ResourceInterface[]|null $metadata An array of ResourceInterface instances * + * @return void + * * @throws \RuntimeException When the cache file cannot be written */ public function write(string $content, array $metadata = null); diff --git a/app/vendor/symfony/config/Definition/ArrayNode.php b/app/vendor/symfony/config/Definition/ArrayNode.php index 97500c90a..1448220cd 100644 --- a/app/vendor/symfony/config/Definition/ArrayNode.php +++ b/app/vendor/symfony/config/Definition/ArrayNode.php @@ -32,6 +32,9 @@ class ArrayNode extends BaseNode implements PrototypeNodeInterface protected $removeExtraKeys = true; protected $normalizeKeys = true; + /** + * @return void + */ public function setNormalizeKeys(bool $normalizeKeys) { $this->normalizeKeys = $normalizeKeys; @@ -77,6 +80,8 @@ public function getChildren(): array * Sets the xml remappings that should be performed. * * @param array $remappings An array of the form [[string, string]] + * + * @return void */ public function setXmlRemappings(array $remappings) { @@ -96,6 +101,8 @@ public function getXmlRemappings(): array /** * Sets whether to add default values for this array if it has not been * defined in any of the configuration files. + * + * @return void */ public function setAddIfNotSet(bool $boolean) { @@ -104,6 +111,8 @@ public function setAddIfNotSet(bool $boolean) /** * Sets whether false is allowed as value indicating that the array should be unset. + * + * @return void */ public function setAllowFalse(bool $allow) { @@ -112,6 +121,8 @@ public function setAllowFalse(bool $allow) /** * Sets whether new keys can be defined in subsequent configurations. + * + * @return void */ public function setAllowNewKeys(bool $allow) { @@ -120,6 +131,8 @@ public function setAllowNewKeys(bool $allow) /** * Sets if deep merging should occur. + * + * @return void */ public function setPerformDeepMerging(bool $boolean) { @@ -131,6 +144,8 @@ public function setPerformDeepMerging(bool $boolean) * * @param bool $boolean To allow extra keys * @param bool $remove To remove extra keys + * + * @return void */ public function setIgnoreExtraKeys(bool $boolean, bool $remove = true) { @@ -146,6 +161,9 @@ public function shouldIgnoreExtraKeys(): bool return $this->ignoreExtraKeys; } + /** + * @return void + */ public function setName(string $name) { $this->name = $name; @@ -175,6 +193,8 @@ public function getDefaultValue(): mixed /** * Adds a child node. * + * @return void + * * @throws \InvalidArgumentException when the child node has no name * @throws \InvalidArgumentException when the child node's name is not unique */ @@ -238,6 +258,9 @@ protected function finalizeValue(mixed $value): mixed return $value; } + /** + * @return void + */ protected function validateType(mixed $value) { if (!\is_array($value) && (!$this->allowFalse || false !== $value)) { diff --git a/app/vendor/symfony/config/Definition/BaseNode.php b/app/vendor/symfony/config/Definition/BaseNode.php index 814376091..85f0f7eeb 100644 --- a/app/vendor/symfony/config/Definition/BaseNode.php +++ b/app/vendor/symfony/config/Definition/BaseNode.php @@ -98,6 +98,9 @@ public static function resetPlaceholders(): void self::$placeholders = []; } + /** + * @return void + */ public function setAttribute(string $key, mixed $value) { $this->attributes[$key] = $value; @@ -118,11 +121,17 @@ public function getAttributes(): array return $this->attributes; } + /** + * @return void + */ public function setAttributes(array $attributes) { $this->attributes = $attributes; } + /** + * @return void + */ public function removeAttribute(string $key) { unset($this->attributes[$key]); @@ -130,6 +139,8 @@ public function removeAttribute(string $key) /** * Sets an info message. + * + * @return void */ public function setInfo(string $info) { @@ -146,6 +157,8 @@ public function getInfo(): ?string /** * Sets the example configuration for this node. + * + * @return void */ public function setExample(string|array $example) { @@ -162,6 +175,8 @@ public function getExample(): string|array|null /** * Adds an equivalent value. + * + * @return void */ public function addEquivalentValue(mixed $originalValue, mixed $equivalentValue) { @@ -170,6 +185,8 @@ public function addEquivalentValue(mixed $originalValue, mixed $equivalentValue) /** * Set this node as required. + * + * @return void */ public function setRequired(bool $boolean) { @@ -179,12 +196,14 @@ public function setRequired(bool $boolean) /** * Sets this node as deprecated. * + * You can use %node% and %path% placeholders in your message to display, + * respectively, the node name and its complete path. + * * @param string $package The name of the composer package that is triggering the deprecation * @param string $version The version of the package that introduced the deprecation * @param string $message the deprecation message to use * - * You can use %node% and %path% placeholders in your message to display, - * respectively, the node name and its complete path + * @return void */ public function setDeprecated(string $package, string $version, string $message = 'The child node "%node%" at path "%path%" is deprecated.') { @@ -197,6 +216,8 @@ public function setDeprecated(string $package, string $version, string $message /** * Sets if this node can be overridden. + * + * @return void */ public function setAllowOverwrite(bool $allow) { @@ -207,6 +228,8 @@ public function setAllowOverwrite(bool $allow) * Sets the closures used for normalization. * * @param \Closure[] $closures An array of Closures used for normalization + * + * @return void */ public function setNormalizationClosures(array $closures) { @@ -217,6 +240,8 @@ public function setNormalizationClosures(array $closures) * Sets the list of types supported by normalization. * * see ExprBuilder::TYPE_* constants. + * + * @return void */ public function setNormalizedTypes(array $types) { @@ -237,6 +262,8 @@ public function getNormalizedTypes(): array * Sets the closures used for final validation. * * @param \Closure[] $closures An array of Closures used for final validation + * + * @return void */ public function setFinalValidationClosures(array $closures) { @@ -415,6 +442,8 @@ final public function finalize(mixed $value): mixed /** * Validates the type of a Node. * + * @return void + * * @throws InvalidTypeException when the value is invalid */ abstract protected function validateType(mixed $value); diff --git a/app/vendor/symfony/config/Definition/BooleanNode.php b/app/vendor/symfony/config/Definition/BooleanNode.php index 812881d6d..7ec903cd6 100644 --- a/app/vendor/symfony/config/Definition/BooleanNode.php +++ b/app/vendor/symfony/config/Definition/BooleanNode.php @@ -20,6 +20,9 @@ */ class BooleanNode extends ScalarNode { + /** + * @return void + */ protected function validateType(mixed $value) { if (!\is_bool($value)) { diff --git a/app/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php b/app/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php index 34f00085c..0110f0502 100644 --- a/app/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php +++ b/app/vendor/symfony/config/Definition/Builder/ArrayNodeDefinition.php @@ -45,6 +45,9 @@ public function __construct(?string $name, NodeParentInterface $parent = null) $this->trueEquivalent = []; } + /** + * @return void + */ public function setBuilder(NodeBuilder $builder) { $this->nodeBuilder = $builder; @@ -422,6 +425,8 @@ protected function createNode(): NodeInterface /** * Validate the configuration of a concrete node. * + * @return void + * * @throws InvalidDefinitionException */ protected function validateConcreteNode(ArrayNode $node) @@ -452,6 +457,8 @@ protected function validateConcreteNode(ArrayNode $node) /** * Validate the configuration of a prototype node. * + * @return void + * * @throws InvalidDefinitionException */ protected function validatePrototypeNode(PrototypedArrayNode $node) diff --git a/app/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php b/app/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php index f30b8736c..bb40307e1 100644 --- a/app/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php +++ b/app/vendor/symfony/config/Definition/Builder/BuilderAwareInterface.php @@ -20,6 +20,8 @@ interface BuilderAwareInterface { /** * Sets a custom children builder. + * + * @return void */ public function setBuilder(NodeBuilder $builder); } diff --git a/app/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php b/app/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php index 6df62d30a..99f318123 100644 --- a/app/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php +++ b/app/vendor/symfony/config/Definition/Builder/EnumNodeDefinition.php @@ -27,8 +27,6 @@ class EnumNodeDefinition extends ScalarNodeDefinition */ public function values(array $values): static { - $values = array_unique($values); - if (!$values) { throw new \InvalidArgumentException('->values() must be called with at least one value.'); } diff --git a/app/vendor/symfony/config/Definition/Builder/TreeBuilder.php b/app/vendor/symfony/config/Definition/Builder/TreeBuilder.php index e469e6904..4f868f703 100644 --- a/app/vendor/symfony/config/Definition/Builder/TreeBuilder.php +++ b/app/vendor/symfony/config/Definition/Builder/TreeBuilder.php @@ -51,6 +51,9 @@ public function buildTree(): NodeInterface return $this->tree = $this->root->getNode(true); } + /** + * @return void + */ public function setPathSeparator(string $separator) { // unset last built as changing path separator changes all nodes diff --git a/app/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php b/app/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php index 6520d2fac..34f93ce07 100644 --- a/app/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php +++ b/app/vendor/symfony/config/Definition/Dumper/XmlReferenceDumper.php @@ -31,11 +31,17 @@ class XmlReferenceDumper { private ?string $reference = null; + /** + * @return string + */ public function dump(ConfigurationInterface $configuration, string $namespace = null) { return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace); } + /** + * @return string + */ public function dumpNode(NodeInterface $node, string $namespace = null) { $this->reference = ''; @@ -46,16 +52,14 @@ public function dumpNode(NodeInterface $node, string $namespace = null) return $ref; } - private function writeNode(NodeInterface $node, int $depth = 0, bool $root = false, string $namespace = null) + private function writeNode(NodeInterface $node, int $depth = 0, bool $root = false, string $namespace = null): void { $rootName = ($root ? 'config' : $node->getName()); $rootNamespace = ($namespace ?: ($root ? 'http://example.org/schema/dic/'.$node->getName() : null)); // xml remapping if ($node->getParent()) { - $remapping = array_filter($node->getParent()->getXmlRemappings(), function (array $mapping) use ($rootName) { - return $rootName === $mapping[1]; - }); + $remapping = array_filter($node->getParent()->getXmlRemappings(), fn (array $mapping) => $rootName === $mapping[1]); if (\count($remapping)) { [$singular] = current($remapping); @@ -109,7 +113,7 @@ private function writeNode(NodeInterface $node, int $depth = 0, bool $root = fal FloatNode::class, IntegerNode::class => 'numeric value', BooleanNode::class => 'true|false', - EnumNode::class => implode('|', array_map('json_encode', $prototype->getValues())), + EnumNode::class => $prototype->getPermissibleValues('|'), default => 'value', }; } @@ -151,7 +155,7 @@ private function writeNode(NodeInterface $node, int $depth = 0, bool $root = fal } if ($child instanceof EnumNode) { - $comments[] = 'One of '.implode('; ', array_map('json_encode', $child->getValues())); + $comments[] = 'One of '.$child->getPermissibleValues('; '); } if (\count($comments)) { @@ -249,7 +253,7 @@ private function writeNode(NodeInterface $node, int $depth = 0, bool $root = fal /** * Outputs a single config reference line. */ - private function writeLine(string $text, int $indent = 0) + private function writeLine(string $text, int $indent = 0): void { $indent = \strlen($text) + $indent; $format = '%'.$indent.'s'; diff --git a/app/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php b/app/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php index 606c3edaa..97a391ada 100644 --- a/app/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php +++ b/app/vendor/symfony/config/Definition/Dumper/YamlReferenceDumper.php @@ -30,11 +30,17 @@ class YamlReferenceDumper { private ?string $reference = null; + /** + * @return string + */ public function dump(ConfigurationInterface $configuration) { return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree()); } + /** + * @return string + */ public function dumpAtPath(ConfigurationInterface $configuration, string $path) { $rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree(); @@ -61,6 +67,9 @@ public function dumpAtPath(ConfigurationInterface $configuration, string $path) return $this->dumpNode($node); } + /** + * @return string + */ public function dumpNode(NodeInterface $node) { $this->reference = ''; @@ -71,7 +80,7 @@ public function dumpNode(NodeInterface $node) return $ref; } - private function writeNode(NodeInterface $node, NodeInterface $parentNode = null, int $depth = 0, bool $prototypedArray = false) + private function writeNode(NodeInterface $node, NodeInterface $parentNode = null, int $depth = 0, bool $prototypedArray = false): void { $comments = []; $default = ''; @@ -98,7 +107,7 @@ private function writeNode(NodeInterface $node, NodeInterface $parentNode = null } } } elseif ($node instanceof EnumNode) { - $comments[] = 'One of '.implode('; ', array_map('json_encode', $node->getValues())); + $comments[] = 'One of '.$node->getPermissibleValues('; '); $default = $node->hasDefaultValue() ? Inline::dump($node->getDefaultValue()) : '~'; } elseif (VariableNode::class === $node::class && \is_array($example)) { // If there is an array example, we are sure we dont need to print a default value @@ -183,7 +192,7 @@ private function writeNode(NodeInterface $node, NodeInterface $parentNode = null /** * Outputs a single config reference line. */ - private function writeLine(string $text, int $indent = 0) + private function writeLine(string $text, int $indent = 0): void { $indent = \strlen($text) + $indent; $format = '%'.$indent.'s'; @@ -191,7 +200,7 @@ private function writeLine(string $text, int $indent = 0) $this->reference .= sprintf($format, $text)."\n"; } - private function writeArray(array $array, int $depth) + private function writeArray(array $array, int $depth): void { $isIndexed = array_is_list($array); diff --git a/app/vendor/symfony/config/Definition/EnumNode.php b/app/vendor/symfony/config/Definition/EnumNode.php index 76d8d12ac..4edeae904 100644 --- a/app/vendor/symfony/config/Definition/EnumNode.php +++ b/app/vendor/symfony/config/Definition/EnumNode.php @@ -24,26 +24,68 @@ class EnumNode extends ScalarNode public function __construct(?string $name, NodeInterface $parent = null, array $values = [], string $pathSeparator = BaseNode::DEFAULT_PATH_SEPARATOR) { - $values = array_unique($values); if (!$values) { throw new \InvalidArgumentException('$values must contain at least one element.'); } + foreach ($values as $value) { + if (null === $value || \is_scalar($value)) { + continue; + } + + if (!$value instanceof \UnitEnum) { + throw new \InvalidArgumentException(sprintf('"%s" only supports scalar, enum, or null values, "%s" given.', __CLASS__, get_debug_type($value))); + } + + if ($value::class !== ($enumClass ??= $value::class)) { + throw new \InvalidArgumentException(sprintf('"%s" only supports one type of enum, "%s" and "%s" passed.', __CLASS__, $enumClass, $value::class)); + } + } + parent::__construct($name, $parent, $pathSeparator); $this->values = $values; } + /** + * @return array + */ public function getValues() { return $this->values; } + /** + * @internal + */ + public function getPermissibleValues(string $separator): string + { + return implode($separator, array_unique(array_map(static function (mixed $value): string { + if (!$value instanceof \UnitEnum) { + return json_encode($value); + } + + return ltrim(var_export($value, true), '\\'); + }, $this->values))); + } + + /** + * @return void + */ + protected function validateType(mixed $value) + { + if ($value instanceof \UnitEnum) { + return; + } + + parent::validateType($value); + } + protected function finalizeValue(mixed $value): mixed { $value = parent::finalizeValue($value); if (!\in_array($value, $this->values, true)) { - $ex = new InvalidConfigurationException(sprintf('The value %s is not allowed for path "%s". Permissible values: %s', json_encode($value), $this->getPath(), implode(', ', array_map('json_encode', $this->values)))); + $ex = new InvalidConfigurationException(sprintf('The value %s is not allowed for path "%s". Permissible values: %s', json_encode($value), $this->getPath(), $this->getPermissibleValues(', '))); $ex->setPath($this->getPath()); throw $ex; diff --git a/app/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php b/app/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php index 4ecf35157..794447bf8 100644 --- a/app/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php +++ b/app/vendor/symfony/config/Definition/Exception/InvalidConfigurationException.php @@ -22,6 +22,9 @@ class InvalidConfigurationException extends Exception private ?string $path = null; private bool $containsHints = false; + /** + * @return void + */ public function setPath(string $path) { $this->path = $path; @@ -34,6 +37,8 @@ public function getPath(): ?string /** * Adds extra information that is suffixed to the original exception message. + * + * @return void */ public function addHint(string $hint) { diff --git a/app/vendor/symfony/config/Definition/FloatNode.php b/app/vendor/symfony/config/Definition/FloatNode.php index e9123e8b0..ce4193e09 100644 --- a/app/vendor/symfony/config/Definition/FloatNode.php +++ b/app/vendor/symfony/config/Definition/FloatNode.php @@ -20,6 +20,9 @@ */ class FloatNode extends NumericNode { + /** + * @return void + */ protected function validateType(mixed $value) { // Integers are also accepted, we just cast them diff --git a/app/vendor/symfony/config/Definition/IntegerNode.php b/app/vendor/symfony/config/Definition/IntegerNode.php index cc9132c74..4a3e3253c 100644 --- a/app/vendor/symfony/config/Definition/IntegerNode.php +++ b/app/vendor/symfony/config/Definition/IntegerNode.php @@ -20,6 +20,9 @@ */ class IntegerNode extends NumericNode { + /** + * @return void + */ protected function validateType(mixed $value) { if (!\is_int($value)) { diff --git a/app/vendor/symfony/config/Definition/PrototypeNodeInterface.php b/app/vendor/symfony/config/Definition/PrototypeNodeInterface.php index b160aa94a..9dce7444b 100644 --- a/app/vendor/symfony/config/Definition/PrototypeNodeInterface.php +++ b/app/vendor/symfony/config/Definition/PrototypeNodeInterface.php @@ -20,6 +20,8 @@ interface PrototypeNodeInterface extends NodeInterface { /** * Sets the name of the node. + * + * @return void */ public function setName(string $name); } diff --git a/app/vendor/symfony/config/Definition/PrototypedArrayNode.php b/app/vendor/symfony/config/Definition/PrototypedArrayNode.php index d3ca83bdb..c105ac1f3 100644 --- a/app/vendor/symfony/config/Definition/PrototypedArrayNode.php +++ b/app/vendor/symfony/config/Definition/PrototypedArrayNode.php @@ -37,6 +37,8 @@ class PrototypedArrayNode extends ArrayNode /** * Sets the minimum number of elements that a prototype based node must * contain. By default this is zero, meaning no elements. + * + * @return void */ public function setMinNumberOfElements(int $number) { @@ -66,6 +68,8 @@ public function setMinNumberOfElements(int $number) * * @param string $attribute The name of the attribute which value is to be used as a key * @param bool $remove Whether or not to remove the key + * + * @return void */ public function setKeyAttribute(string $attribute, bool $remove = true) { @@ -83,6 +87,8 @@ public function getKeyAttribute(): ?string /** * Sets the default value of this node. + * + * @return void */ public function setDefaultValue(array $value) { @@ -98,6 +104,8 @@ public function hasDefaultValue(): bool * Adds default children when none are set. * * @param int|string|array|null $children The number of children|The child name|The children names to be added + * + * @return void */ public function setAddChildrenIfNoneSet(int|string|array|null $children = ['defaults']) { @@ -129,6 +137,8 @@ public function getDefaultValue(): mixed /** * Sets the node prototype. + * + * @return void */ public function setPrototype(PrototypeNodeInterface $node) { @@ -146,6 +156,8 @@ public function getPrototype(): PrototypeNodeInterface /** * Disable adding concrete children for prototyped nodes. * + * @return never + * * @throws Exception */ public function addChild(NodeInterface $node) diff --git a/app/vendor/symfony/config/Definition/ScalarNode.php b/app/vendor/symfony/config/Definition/ScalarNode.php index 766436dd2..e11fa1ee1 100644 --- a/app/vendor/symfony/config/Definition/ScalarNode.php +++ b/app/vendor/symfony/config/Definition/ScalarNode.php @@ -27,6 +27,9 @@ */ class ScalarNode extends VariableNode { + /** + * @return void + */ protected function validateType(mixed $value) { if (!\is_scalar($value) && null !== $value) { diff --git a/app/vendor/symfony/config/Definition/VariableNode.php b/app/vendor/symfony/config/Definition/VariableNode.php index c636f12c4..6bdc65b4e 100644 --- a/app/vendor/symfony/config/Definition/VariableNode.php +++ b/app/vendor/symfony/config/Definition/VariableNode.php @@ -27,6 +27,9 @@ class VariableNode extends BaseNode implements PrototypeNodeInterface protected $defaultValue; protected $allowEmptyValue = true; + /** + * @return void + */ public function setDefaultValue(mixed $value) { $this->defaultValueSet = true; @@ -49,17 +52,25 @@ public function getDefaultValue(): mixed * Sets if this node is allowed to have an empty value. * * @param bool $boolean True if this entity will accept empty values + * + * @return void */ public function setAllowEmptyValue(bool $boolean) { $this->allowEmptyValue = $boolean; } + /** + * @return void + */ public function setName(string $name) { $this->name = $name; } + /** + * @return void + */ protected function validateType(mixed $value) { } diff --git a/app/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php b/app/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php index 92700c1ab..c5173ae58 100644 --- a/app/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php +++ b/app/vendor/symfony/config/Exception/FileLocatorFileNotFoundException.php @@ -27,6 +27,9 @@ public function __construct(string $message = '', int $code = 0, \Throwable $pre $this->paths = $paths; } + /** + * @return array + */ public function getPaths() { return $this->paths; diff --git a/app/vendor/symfony/config/Exception/LoaderLoadException.php b/app/vendor/symfony/config/Exception/LoaderLoadException.php index 5f9bfbc07..57afd6a8d 100644 --- a/app/vendor/symfony/config/Exception/LoaderLoadException.php +++ b/app/vendor/symfony/config/Exception/LoaderLoadException.php @@ -76,6 +76,9 @@ public function __construct(mixed $resource, string $sourceResource = null, int parent::__construct($message, $code, $previous); } + /** + * @return string + */ protected function varToString(mixed $var) { if (\is_object($var)) { diff --git a/app/vendor/symfony/config/FileLocator.php b/app/vendor/symfony/config/FileLocator.php index ab18232db..e147d9b1a 100644 --- a/app/vendor/symfony/config/FileLocator.php +++ b/app/vendor/symfony/config/FileLocator.php @@ -30,6 +30,9 @@ public function __construct(string|array $paths = []) $this->paths = (array) $paths; } + /** + * @return string|array + */ public function locate(string $name, string $currentPath = null, bool $first = true) { if ('' === $name) { diff --git a/app/vendor/symfony/config/Loader/FileLoader.php b/app/vendor/symfony/config/Loader/FileLoader.php index 30034e55a..8cfaa23ba 100644 --- a/app/vendor/symfony/config/Loader/FileLoader.php +++ b/app/vendor/symfony/config/Loader/FileLoader.php @@ -39,6 +39,8 @@ public function __construct(FileLocatorInterface $locator, string $env = null) /** * Sets the current directory. + * + * @return void */ public function setCurrentDir(string $dir) { @@ -62,6 +64,8 @@ public function getLocator(): FileLocatorInterface * @param string|null $sourceResource The original resource importing the new resource * @param string|string[]|null $exclude Glob patterns to exclude from the import * + * @return mixed + * * @throws LoaderLoadException * @throws FileLoaderImportCircularReferenceException * @throws FileLocatorFileNotFoundException @@ -97,7 +101,7 @@ public function import(mixed $resource, string $type = null, bool $ignoreErrors /** * @internal */ - protected function glob(string $pattern, bool $recursive, array|GlobResource &$resource = null, bool $ignoreErrors = false, bool $forExclusion = false, array $excluded = []) + protected function glob(string $pattern, bool $recursive, array|GlobResource &$resource = null, bool $ignoreErrors = false, bool $forExclusion = false, array $excluded = []): iterable { if (\strlen($pattern) === $i = strcspn($pattern, '*?{[')) { $prefix = $pattern; @@ -129,7 +133,7 @@ protected function glob(string $pattern, bool $recursive, array|GlobResource &$r yield from $resource; } - private function doImport(mixed $resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null) + private function doImport(mixed $resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null): mixed { try { $loader = $this->resolve($resource, $type); diff --git a/app/vendor/symfony/config/Loader/Loader.php b/app/vendor/symfony/config/Loader/Loader.php index 2ab50b021..36e85ad34 100644 --- a/app/vendor/symfony/config/Loader/Loader.php +++ b/app/vendor/symfony/config/Loader/Loader.php @@ -33,6 +33,9 @@ public function getResolver(): LoaderResolverInterface return $this->resolver; } + /** + * @return void + */ public function setResolver(LoaderResolverInterface $resolver) { $this->resolver = $resolver; diff --git a/app/vendor/symfony/config/Loader/LoaderInterface.php b/app/vendor/symfony/config/Loader/LoaderInterface.php index b94a4378f..4e0746d4d 100644 --- a/app/vendor/symfony/config/Loader/LoaderInterface.php +++ b/app/vendor/symfony/config/Loader/LoaderInterface.php @@ -45,6 +45,8 @@ public function getResolver(); /** * Sets the loader resolver. + * + * @return void */ public function setResolver(LoaderResolverInterface $resolver); } diff --git a/app/vendor/symfony/config/Loader/LoaderResolver.php b/app/vendor/symfony/config/Loader/LoaderResolver.php index fa00730dc..670e32012 100644 --- a/app/vendor/symfony/config/Loader/LoaderResolver.php +++ b/app/vendor/symfony/config/Loader/LoaderResolver.php @@ -47,6 +47,9 @@ public function resolve(mixed $resource, string $type = null): LoaderInterface|f return false; } + /** + * @return void + */ public function addLoader(LoaderInterface $loader) { $this->loaders[] = $loader; diff --git a/app/vendor/symfony/config/Resource/ClassExistenceResource.php b/app/vendor/symfony/config/Resource/ClassExistenceResource.php index ad0ebc5eb..2f262bac8 100644 --- a/app/vendor/symfony/config/Resource/ClassExistenceResource.php +++ b/app/vendor/symfony/config/Resource/ClassExistenceResource.php @@ -139,7 +139,7 @@ public function __wakeup() * * @internal */ - public static function throwOnRequiredClass(string $class, \Exception $previous = null) + public static function throwOnRequiredClass(string $class, \Exception $previous = null): void { // If the passed class is the resource being checked, we shouldn't throw. if (null === $previous && self::$autoloadedClass === $class) { @@ -160,7 +160,7 @@ public static function throwOnRequiredClass(string $class, \Exception $previous $message = sprintf('Class "%s" not found.', $class); - if (self::$autoloadedClass !== $class) { + if ($class !== (self::$autoloadedClass ?? $class)) { $message = substr_replace($message, sprintf(' while loading "%s"', self::$autoloadedClass), -1, 0); } diff --git a/app/vendor/symfony/config/Resource/ComposerResource.php b/app/vendor/symfony/config/Resource/ComposerResource.php index e9b78b4fd..834812253 100644 --- a/app/vendor/symfony/config/Resource/ComposerResource.php +++ b/app/vendor/symfony/config/Resource/ComposerResource.php @@ -47,7 +47,7 @@ public function isFresh(int $timestamp): bool return array_values(self::$runtimeVendors) === array_values($this->vendors); } - private static function refresh() + private static function refresh(): void { self::$runtimeVendors = []; diff --git a/app/vendor/symfony/config/Resource/DirectoryResource.php b/app/vendor/symfony/config/Resource/DirectoryResource.php index b95ae2c19..7560cd3b3 100644 --- a/app/vendor/symfony/config/Resource/DirectoryResource.php +++ b/app/vendor/symfony/config/Resource/DirectoryResource.php @@ -43,7 +43,7 @@ public function __construct(string $resource, string $pattern = null) public function __toString(): string { - return md5(serialize([$this->resource, $this->pattern])); + return hash('xxh128', serialize([$this->resource, $this->pattern])); } public function getResource(): string diff --git a/app/vendor/symfony/config/Resource/GlobResource.php b/app/vendor/symfony/config/Resource/GlobResource.php index 7acfcd663..2aedc84b3 100644 --- a/app/vendor/symfony/config/Resource/GlobResource.php +++ b/app/vendor/symfony/config/Resource/GlobResource.php @@ -97,28 +97,48 @@ public function __wakeup(): void public function getIterator(): \Traversable { - if (!file_exists($this->prefix) || (!$this->recursive && '' === $this->pattern)) { + if ((!$this->recursive && '' === $this->pattern) || !file_exists($this->prefix)) { return; } - $prefix = str_replace('\\', '/', $this->prefix); + + if (is_file($prefix = str_replace('\\', '/', $this->prefix))) { + $prefix = \dirname($prefix); + $pattern = basename($prefix).$this->pattern; + } else { + $pattern = $this->pattern; + } + + if (class_exists(Finder::class)) { + $regex = Glob::toRegex($pattern); + if ($this->recursive) { + $regex = substr_replace($regex, '(/|$)', -2, 1); + } + } else { + $regex = null; + } + + $prefixLen = \strlen($prefix); $paths = null; - 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); + if ('' === $this->pattern && is_file($this->prefix)) { + $paths = [$this->prefix => null]; + } elseif (!str_starts_with($this->prefix, 'phar://') && (null !== $regex || !str_contains($this->pattern, '/**/'))) { + if (!str_contains($this->pattern, '/**/') && ($this->globBrace || !str_contains($this->pattern, '{'))) { + $paths = array_fill_keys(glob($this->prefix.$this->pattern, \GLOB_NOSORT | $this->globBrace), null); } elseif (!str_contains($this->pattern, '\\') || !preg_match('/\\\\[,{}]/', $this->pattern)) { + $paths = []; foreach ($this->expandGlob($this->pattern) as $p) { - $paths[] = glob($this->prefix.$p, \GLOB_NOSORT); + if (false !== $i = strpos($p, '/**/')) { + $p = substr_replace($p, '/*', $i); + } + $paths += array_fill_keys(glob($this->prefix.$p, \GLOB_NOSORT), false !== $i ? $regex : null); } - $paths = array_merge(...$paths); } } if (null !== $paths) { - natsort($paths); - foreach ($paths as $path) { + uksort($paths, 'strnatcmp'); + foreach ($paths as $path => $regex) { if ($this->excludedPrefixes) { $normalizedPath = str_replace('\\', '/', $path); do { @@ -128,25 +148,25 @@ public function getIterator(): \Traversable } while ($prefix !== $dirPath && $dirPath !== $normalizedPath = \dirname($dirPath)); } - if (is_file($path)) { + if ((null === $regex || preg_match($regex, substr(str_replace('\\', '/', $path), $prefixLen))) && is_file($path)) { yield $path => new \SplFileInfo($path); } if (!is_dir($path)) { continue; } - if ($this->forExclusion) { + if ($this->forExclusion && (null === $regex || preg_match($regex, substr(str_replace('\\', '/', $path), $prefixLen)))) { yield $path => new \SplFileInfo($path); continue; } - if (!$this->recursive || isset($this->excludedPrefixes[str_replace('\\', '/', $path)])) { + if (!($this->recursive || null !== $regex) || isset($this->excludedPrefixes[str_replace('\\', '/', $path)])) { continue; } $files = iterator_to_array(new \RecursiveIteratorIterator( new \RecursiveCallbackFilterIterator( new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::FOLLOW_SYMLINKS), - function (\SplFileInfo $file, $path) { - return !isset($this->excludedPrefixes[str_replace('\\', '/', $path)]) && '.' !== $file->getBasename()[0]; - } + fn (\SplFileInfo $file, $path) => !isset($this->excludedPrefixes[$path = str_replace('\\', '/', $path)]) + && (null === $regex || preg_match($regex, substr($path, $prefixLen)) || $file->isDir()) + && '.' !== $file->getBasename()[0] ), \RecursiveIteratorIterator::LEAVES_ONLY )); @@ -163,23 +183,9 @@ function (\SplFileInfo $file, $path) { } if (!class_exists(Finder::class)) { - 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; - } - - $regex = Glob::toRegex($pattern); - if ($this->recursive) { - $regex = substr_replace($regex, '(/|$)', -2, 1); + throw new \LogicException('Extended glob patterns cannot be used as the Finder component is not installed. Try running "composer require symfony/finder".'); } - $prefixLen = \strlen($prefix); - yield from (new Finder()) ->followLinks() ->filter(function (\SplFileInfo $info) use ($regex, $prefixLen, $prefix) { @@ -202,7 +208,7 @@ function (\SplFileInfo $file, $path) { private function computeHash(): string { - $hash = hash_init('md5'); + $hash = hash_init('xxh128'); foreach ($this->getIterator() as $path => $info) { hash_update($hash, $path."\n"); diff --git a/app/vendor/symfony/config/Resource/ReflectionClassResource.php b/app/vendor/symfony/config/Resource/ReflectionClassResource.php index 279ff203c..dbd47e66d 100644 --- a/app/vendor/symfony/config/Resource/ReflectionClassResource.php +++ b/app/vendor/symfony/config/Resource/ReflectionClassResource.php @@ -73,7 +73,7 @@ public function __sleep(): array return ['files', 'className', 'hash']; } - private function loadFiles(\ReflectionClass $class) + private function loadFiles(\ReflectionClass $class): void { foreach ($class->getInterfaces() as $v) { $this->loadFiles($v); @@ -105,7 +105,7 @@ private function computeHash(): string // the class does not exist anymore return false; } - $hash = hash_init('md5'); + $hash = hash_init('xxh128'); foreach ($this->generateSignature($this->classReflector) as $info) { hash_update($hash, $info); @@ -154,8 +154,6 @@ 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) { foreach ($m->getAttributes() as $a) { $attributes[] = [$a->getName(), (string) $a]; diff --git a/app/vendor/symfony/config/ResourceCheckerConfigCache.php b/app/vendor/symfony/config/ResourceCheckerConfigCache.php index 3a3e6c52b..a8478a8cc 100644 --- a/app/vendor/symfony/config/ResourceCheckerConfigCache.php +++ b/app/vendor/symfony/config/ResourceCheckerConfigCache.php @@ -105,6 +105,8 @@ public function isFresh(): bool * @param string $content The content to write in the cache * @param ResourceInterface[] $metadata An array of metadata * + * @return void + * * @throws \RuntimeException When cache file can't be written */ public function write(string $content, array $metadata = null) @@ -141,7 +143,7 @@ private function getMetaFile(): string return $this->file.'.meta'; } - private function safelyUnserialize(string $file) + private function safelyUnserialize(string $file): mixed { $meta = false; $content = file_get_contents($file); @@ -172,7 +174,7 @@ private function safelyUnserialize(string $file) /** * @internal */ - public static function handleUnserializeCallback(string $class) + public static function handleUnserializeCallback(string $class): void { trigger_error('Class not found: '.$class); } diff --git a/app/vendor/symfony/config/Util/XmlUtils.php b/app/vendor/symfony/config/Util/XmlUtils.php index a1b1d29e6..cc024da46 100644 --- a/app/vendor/symfony/config/Util/XmlUtils.php +++ b/app/vendor/symfony/config/Util/XmlUtils.php @@ -238,6 +238,9 @@ public static function phpize(string|\Stringable $value): mixed } } + /** + * @return array + */ protected static function getXmlErrors(bool $internalErrors) { $errors = []; diff --git a/app/vendor/symfony/config/composer.json b/app/vendor/symfony/config/composer.json index 85d842a53..a4b72c36a 100644 --- a/app/vendor/symfony/config/composer.json +++ b/app/vendor/symfony/config/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/filesystem": "^5.4|^6.0", "symfony/polyfill-ctype": "~1.8" }, @@ -25,14 +25,12 @@ "symfony/event-dispatcher": "^5.4|^6.0", "symfony/finder": "^5.4|^6.0", "symfony/messenger": "^5.4|^6.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/yaml": "^5.4|^6.0" }, "conflict": { - "symfony/finder": "<5.4" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" }, "autoload": { "psr-4": { "Symfony\\Component\\Config\\": "" }, diff --git a/app/vendor/symfony/console/Application.php b/app/vendor/symfony/console/Application.php index 41548a3e9..b7aaa6a29 100644 --- a/app/vendor/symfony/console/Application.php +++ b/app/vendor/symfony/console/Application.php @@ -105,11 +105,14 @@ public function __construct(string $name = 'UNKNOWN', string $version = 'UNKNOWN /** * @final */ - public function setDispatcher(EventDispatcherInterface $dispatcher) + public function setDispatcher(EventDispatcherInterface $dispatcher): void { $this->dispatcher = $dispatcher; } + /** + * @return void + */ public function setCommandLoader(CommandLoaderInterface $commandLoader) { $this->commandLoader = $commandLoader; @@ -118,12 +121,15 @@ public function setCommandLoader(CommandLoaderInterface $commandLoader) public function getSignalRegistry(): SignalRegistry { if (!$this->signalRegistry) { - throw new RuntimeException('Signals are not supported. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); + throw new RuntimeException('Signals are not supported. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); } return $this->signalRegistry; } + /** + * @return void + */ public function setSignalsToDispatchEvent(int ...$signalsToDispatchEvent) { $this->signalsToDispatchEvent = $signalsToDispatchEvent; @@ -317,10 +323,16 @@ public function doRun(InputInterface $input, OutputInterface $output) return $exitCode; } + /** + * @return void + */ public function reset() { } + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; @@ -334,6 +346,9 @@ public function getHelperSet(): HelperSet return $this->helperSet ??= $this->getDefaultHelperSet(); } + /** + * @return void + */ public function setDefinition(InputDefinition $definition) { $this->definition = $definition; @@ -404,6 +419,8 @@ public function areExceptionsCaught(): bool /** * Sets whether to catch exceptions or not during commands execution. + * + * @return void */ public function setCatchExceptions(bool $boolean) { @@ -420,6 +437,8 @@ public function isAutoExitEnabled(): bool /** * Sets whether to automatically exit after a command execution or not. + * + * @return void */ public function setAutoExit(bool $boolean) { @@ -436,7 +455,9 @@ public function getName(): string /** * Sets the application name. - **/ + * + * @return void + */ public function setName(string $name) { $this->name = $name; @@ -452,6 +473,8 @@ public function getVersion(): string /** * Sets the application version. + * + * @return void */ public function setVersion(string $version) { @@ -490,6 +513,8 @@ public function register(string $name): Command * If a Command is not enabled it will not be added. * * @param Command[] $commands An array of commands + * + * @return void */ public function addCommands(array $commands) { @@ -687,9 +712,7 @@ public function find(string $name) if ($alternatives = $this->findAlternatives($name, $allCommands)) { // remove hidden commands - $alternatives = array_filter($alternatives, function ($name) { - return !$this->get($name)->isHidden(); - }); + $alternatives = array_filter($alternatives, fn ($name) => !$this->get($name)->isHidden()); if (1 == \count($alternatives)) { $message .= "\n\nDid you mean this?\n "; @@ -840,9 +863,7 @@ protected function doRenderThrowable(\Throwable $e, OutputInterface $output): vo } if (str_contains($message, "@anonymous\0")) { - $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $message); + $message = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $message); } $width = $this->terminal->getWidth() ? $this->terminal->getWidth() - 1 : \PHP_INT_MAX; @@ -903,6 +924,8 @@ protected function doRenderThrowable(\Throwable $e, OutputInterface $output): vo /** * Configures the input and output instances based on the user arguments and options. + * + * @return void */ protected function configureIO(InputInterface $input, OutputInterface $output) { @@ -977,44 +1000,62 @@ protected function doRunCommand(Command $command, InputInterface $input, OutputI } } - if ($this->signalsToDispatchEvent) { - $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; - - if ($commandSignals || null !== $this->dispatcher) { - if (!$this->signalRegistry) { - throw new RuntimeException('Unable to subscribe to signal events. Make sure that the `pcntl` extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); - } + $commandSignals = $command instanceof SignalableCommandInterface ? $command->getSubscribedSignals() : []; + if ($commandSignals || $this->dispatcher && $this->signalsToDispatchEvent) { + if (!$this->signalRegistry) { + throw new RuntimeException('Unable to subscribe to signal events. Make sure that the "pcntl" extension is installed and that "pcntl_*" functions are not disabled by your php.ini\'s "disable_functions" directive.'); + } - if (Terminal::hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); + if (Terminal::hasSttyAvailable()) { + $sttyMode = shell_exec('stty -g'); - foreach ([\SIGINT, \SIGTERM] as $signal) { - $this->signalRegistry->register($signal, static function () use ($sttyMode) { - shell_exec('stty '.$sttyMode); - }); - } + foreach ([\SIGINT, \SIGTERM] as $signal) { + $this->signalRegistry->register($signal, static fn () => shell_exec('stty '.$sttyMode)); } } - if (null !== $this->dispatcher) { + if ($this->dispatcher) { + // We register application signals, so that we can dispatch the event foreach ($this->signalsToDispatchEvent as $signal) { $event = new ConsoleSignalEvent($command, $input, $output, $signal); - $this->signalRegistry->register($signal, function ($signal, $hasNext) use ($event) { + $this->signalRegistry->register($signal, function ($signal) use ($event, $command, $commandSignals) { $this->dispatcher->dispatch($event, ConsoleEvents::SIGNAL); - - // No more handlers, we try to simulate PHP default behavior - if (!$hasNext) { - if (!\in_array($signal, [\SIGUSR1, \SIGUSR2], true)) { - exit(0); + $exitCode = $event->getExitCode(); + + // If the command is signalable, we call the handleSignal() method + if (\in_array($signal, $commandSignals, true)) { + $exitCode = $command->handleSignal($signal, $exitCode); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command)); + $exitCode = 0; } } + + if (false !== $exitCode) { + exit($exitCode); + } }); } + + // then we register command signals, but not if already handled after the dispatcher + $commandSignals = array_diff($commandSignals, $this->signalsToDispatchEvent); } foreach ($commandSignals as $signal) { - $this->signalRegistry->register($signal, [$command, 'handleSignal']); + $this->signalRegistry->register($signal, function (int $signal) use ($command): void { + $exitCode = $command->handleSignal($signal); + // BC layer for Symfony <= 5 + if (null === $exitCode) { + trigger_deprecation('symfony/console', '6.3', 'Not returning an exit code from "%s::handleSignal()" is deprecated, return "false" to keep the command running or "0" to exit successfully.', get_debug_type($command)); + $exitCode = 0; + } + + if (false !== $exitCode) { + exit($exitCode); + } + }); } } @@ -1170,7 +1211,7 @@ private function findAlternatives(string $name, iterable $collection): array } } - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; }); + $alternatives = array_filter($alternatives, fn ($lev) => $lev < 2 * $threshold); ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE); return array_keys($alternatives); @@ -1261,7 +1302,7 @@ private function extractAllNamespaces(string $name): array return $namespaces; } - private function init() + private function init(): void { if ($this->initialized) { return; diff --git a/app/vendor/symfony/console/CHANGELOG.md b/app/vendor/symfony/console/CHANGELOG.md index 61c36b0e0..3428a57de 100644 --- a/app/vendor/symfony/console/CHANGELOG.md +++ b/app/vendor/symfony/console/CHANGELOG.md @@ -1,6 +1,13 @@ CHANGELOG ========= +6.3 +--- + + * Add support for choosing exit code while handling signal, or to not exit at all + * Add `ProgressBar::setPlaceholderFormatter` to set a placeholder attached to a instance, instead of being global. + * Add `ReStructuredTextDescriptor` + 6.2 --- diff --git a/app/vendor/symfony/console/Command/Command.php b/app/vendor/symfony/console/Command/Command.php index 1e3c1a5a2..704b112d1 100644 --- a/app/vendor/symfony/console/Command/Command.php +++ b/app/vendor/symfony/console/Command/Command.php @@ -141,12 +141,17 @@ public function __construct(string $name = null) * Ignores validation errors. * * This is mainly useful for the help command. + * + * @return void */ public function ignoreValidationErrors() { $this->ignoreValidationErrors = true; } + /** + * @return void + */ public function setApplication(Application $application = null) { if (1 > \func_num_args()) { @@ -162,6 +167,9 @@ public function setApplication(Application $application = null) $this->fullDefinition = null; } + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet) { $this->helperSet = $helperSet; @@ -198,6 +206,8 @@ public function isEnabled() /** * Configures the current command. + * + * @return void */ protected function configure() { @@ -228,6 +238,8 @@ protected function execute(InputInterface $input, OutputInterface $output) * This method is executed before the InputDefinition is validated. * This means that this is the only place where the command can * interactively ask for values of missing required arguments. + * + * @return void */ protected function interact(InputInterface $input, OutputInterface $output) { @@ -242,6 +254,8 @@ protected function interact(InputInterface $input, OutputInterface $output) * * @see InputInterface::bind() * @see InputInterface::validate() + * + * @return void */ protected function initialize(InputInterface $input, OutputInterface $output) { @@ -378,7 +392,7 @@ public function setCode(callable $code): static * * @internal */ - public function mergeApplicationDefinition(bool $mergeArgs = true) + public function mergeApplicationDefinition(bool $mergeArgs = true): void { if (null === $this->application) { return; @@ -702,7 +716,7 @@ public function getHelper(string $name): mixed * * @throws InvalidArgumentException When the name is invalid */ - private function validateName(string $name) + private function validateName(string $name): void { if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { throw new InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); diff --git a/app/vendor/symfony/console/Command/CompleteCommand.php b/app/vendor/symfony/console/Command/CompleteCommand.php index e65b334ce..058578d8b 100644 --- a/app/vendor/symfony/console/Command/CompleteCommand.php +++ b/app/vendor/symfony/console/Command/CompleteCommand.php @@ -74,7 +74,7 @@ protected function configure(): void ; } - protected function initialize(InputInterface $input, OutputInterface $output) + protected function initialize(InputInterface $input, OutputInterface $output): void { $this->isDebug = filter_var(getenv('SYMFONY_COMPLETION_DEBUG'), \FILTER_VALIDATE_BOOL); } @@ -134,12 +134,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $completionInput->bind($command->getDefinition()); if (CompletionInput::TYPE_OPTION_NAME === $completionInput->getCompletionType()) { - $this->log(' Completing option names for the '.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).' command.'); + $this->log(' Completing option names for the '.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.' command.'); $suggestions->suggestOptions($command->getDefinition()->getOptions()); } else { $this->log([ - ' Completing using the '.\get_class($command instanceof LazyCommand ? $command->getCommand() : $command).' class.', + ' Completing using the '.($command instanceof LazyCommand ? $command->getCommand() : $command)::class.' class.', ' Completing '.$completionInput->getCompletionType().' for '.$completionInput->getCompletionName().'', ]); if (null !== $compval = $completionInput->getCompletionValue()) { @@ -155,7 +155,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $this->log('Suggestions:'); if ($options = $suggestions->getOptionSuggestions()) { - $this->log(' --'.implode(' --', array_map(function ($o) { return $o->getName(); }, $options))); + $this->log(' --'.implode(' --', array_map(fn ($o) => $o->getName(), $options))); } elseif ($values = $suggestions->getValueSuggestions()) { $this->log(' '.implode(' ', $values)); } else { @@ -173,10 +173,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int throw $e; } - return self::FAILURE; + return 2; } - return self::SUCCESS; + return 0; } private function createCompletionInput(InputInterface $input): CompletionInput diff --git a/app/vendor/symfony/console/Command/DumpCompletionCommand.php b/app/vendor/symfony/console/Command/DumpCompletionCommand.php index 6a322c929..51b613a14 100644 --- a/app/vendor/symfony/console/Command/DumpCompletionCommand.php +++ b/app/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -39,7 +39,7 @@ final class DumpCompletionCommand extends Command private array $supportedShells; - protected function configure() + protected function configure(): void { $fullCommand = $_SERVER['PHP_SELF']; $commandName = basename($fullCommand); @@ -48,7 +48,7 @@ protected function configure() $shell = $this->guessShell(); [$rcFile, $completionFile] = match ($shell) { 'fish' => ['~/.config/fish/config.fish', "/etc/fish/completions/$commandName.fish"], - 'zsh' => ['~/.zshrc', '$fpath[1]/'.$commandName], + 'zsh' => ['~/.zshrc', '$fpath[1]/_'.$commandName], default => ['~/.bashrc', "/etc/bash_completion.d/$commandName"], }; @@ -96,7 +96,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int if ($input->getOption('debug')) { $this->tailDebugLog($commandName, $output); - return self::SUCCESS; + return 0; } $shell = $input->getArgument('shell') ?? self::guessShell(); @@ -113,12 +113,12 @@ protected function execute(InputInterface $input, OutputInterface $output): int $output->writeln(sprintf('Shell not detected, Symfony shell completion only supports "%s").', implode('", "', $supportedShells))); } - return self::INVALID; + return 2; } $output->write(str_replace(['{{ COMMAND_NAME }}', '{{ VERSION }}'], [$commandName, CompleteCommand::COMPLETION_API_VERSION], file_get_contents($completionFile))); - return self::SUCCESS; + return 0; } private static function guessShell(): string @@ -143,8 +143,19 @@ private function tailDebugLog(string $commandName, OutputInterface $output): voi */ private function getSupportedShells(): array { - return $this->supportedShells ??= array_map(function ($f) { - return pathinfo($f, \PATHINFO_EXTENSION); - }, glob(__DIR__.'/../Resources/completion.*')); + if (isset($this->supportedShells)) { + return $this->supportedShells; + } + + $shells = []; + + foreach (new \DirectoryIterator(__DIR__.'/../Resources/') as $file) { + if (str_starts_with($file->getBasename(), 'completion.') && $file->isFile()) { + $shells[] = $file->getExtension(); + } + } + sort($shells); + + return $this->supportedShells = $shells; } } diff --git a/app/vendor/symfony/console/Command/HelpCommand.php b/app/vendor/symfony/console/Command/HelpCommand.php index d4134e170..e6447b050 100644 --- a/app/vendor/symfony/console/Command/HelpCommand.php +++ b/app/vendor/symfony/console/Command/HelpCommand.php @@ -27,6 +27,9 @@ class HelpCommand extends Command { private Command $command; + /** + * @return void + */ protected function configure() { $this->ignoreValidationErrors(); @@ -34,12 +37,8 @@ protected function configure() $this ->setName('help') ->setDefinition([ - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', function () { - return array_keys((new ApplicationDescription($this->getApplication()))->getCommands()); - }), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), + new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help', fn () => array_keys((new ApplicationDescription($this->getApplication()))->getCommands())), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), ]) ->setDescription('Display help for a command') @@ -58,6 +57,9 @@ protected function configure() ; } + /** + * @return void + */ public function setCommand(Command $command) { $this->command = $command; diff --git a/app/vendor/symfony/console/Command/ListCommand.php b/app/vendor/symfony/console/Command/ListCommand.php index cab88b439..5850c3d7b 100644 --- a/app/vendor/symfony/console/Command/ListCommand.php +++ b/app/vendor/symfony/console/Command/ListCommand.php @@ -25,18 +25,17 @@ */ class ListCommand extends Command { + /** + * @return void + */ protected function configure() { $this ->setName('list') ->setDefinition([ - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, function () { - return array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces()); - }), + new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name', null, fn () => array_keys((new ApplicationDescription($this->getApplication()))->getNamespaces())), new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', function () { - return (new DescriptorHelper())->getFormats(); - }), + new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt', fn () => (new DescriptorHelper())->getFormats()), new InputOption('short', null, InputOption::VALUE_NONE, 'To skip describing commands\' arguments'), ]) ->setDescription('List commands') diff --git a/app/vendor/symfony/console/Command/LockableTrait.php b/app/vendor/symfony/console/Command/LockableTrait.php index 67923a9e8..c1006a65c 100644 --- a/app/vendor/symfony/console/Command/LockableTrait.php +++ b/app/vendor/symfony/console/Command/LockableTrait.php @@ -32,7 +32,7 @@ trait LockableTrait private function lock(string $name = null, bool $blocking = false): bool { if (!class_exists(SemaphoreStore::class)) { - throw new LogicException('To enable the locking feature you must install the symfony/lock component.'); + throw new LogicException('To enable the locking feature you must install the symfony/lock component. Try running "composer require symfony/lock".'); } if (null !== $this->lock) { @@ -58,7 +58,7 @@ private function lock(string $name = null, bool $blocking = false): bool /** * Releases the command lock if there is one. */ - private function release() + private function release(): void { if ($this->lock) { $this->lock->release(); diff --git a/app/vendor/symfony/console/Command/SignalableCommandInterface.php b/app/vendor/symfony/console/Command/SignalableCommandInterface.php index d439728b6..4d0876003 100644 --- a/app/vendor/symfony/console/Command/SignalableCommandInterface.php +++ b/app/vendor/symfony/console/Command/SignalableCommandInterface.php @@ -25,6 +25,10 @@ public function getSubscribedSignals(): array; /** * The method will be called when the application is signaled. + * + * @param int|false $previousExitCode + + * @return int|false The exit code to return or false to continue the normal execution */ - public function handleSignal(int $signal): void; + public function handleSignal(int $signal, /* int|false $previousExitCode = 0 */); } diff --git a/app/vendor/symfony/console/Completion/CompletionInput.php b/app/vendor/symfony/console/Completion/CompletionInput.php index 3ef8db5d1..800b7235a 100644 --- a/app/vendor/symfony/console/Completion/CompletionInput.php +++ b/app/vendor/symfony/console/Completion/CompletionInput.php @@ -34,7 +34,7 @@ final class CompletionInput extends ArgvInput private $tokens; private $currentIndex; private $completionType; - private $completionName = null; + private $completionName; private $completionValue = ''; /** diff --git a/app/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/app/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php index 62c80c3b0..27705ddb6 100644 --- a/app/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ b/app/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -29,6 +29,9 @@ */ class AddConsoleCommandPass implements CompilerPassInterface { + /** + * @return void + */ public function process(ContainerBuilder $container) { $commandServices = $container->findTaggedServiceIds('console.command', true); diff --git a/app/vendor/symfony/console/Descriptor/ApplicationDescription.php b/app/vendor/symfony/console/Descriptor/ApplicationDescription.php index 2158339ec..f8ed18045 100644 --- a/app/vendor/symfony/console/Descriptor/ApplicationDescription.php +++ b/app/vendor/symfony/console/Descriptor/ApplicationDescription.php @@ -79,7 +79,7 @@ public function getCommand(string $name): Command return $this->commands[$name] ?? $this->aliases[$name]; } - private function inspectApplication() + private function inspectApplication(): void { $this->commands = []; $this->namespaces = []; diff --git a/app/vendor/symfony/console/Descriptor/Descriptor.php b/app/vendor/symfony/console/Descriptor/Descriptor.php index 1476f5755..7b2509c60 100644 --- a/app/vendor/symfony/console/Descriptor/Descriptor.php +++ b/app/vendor/symfony/console/Descriptor/Descriptor.php @@ -26,12 +26,9 @@ */ abstract class Descriptor implements DescriptorInterface { - /** - * @var OutputInterface - */ - protected $output; + protected OutputInterface $output; - public function describe(OutputInterface $output, object $object, array $options = []) + public function describe(OutputInterface $output, object $object, array $options = []): void { $this->output = $output; @@ -45,10 +42,7 @@ public function describe(OutputInterface $output, object $object, array $options }; } - /** - * Writes content to output. - */ - protected function write(string $content, bool $decorated = false) + protected function write(string $content, bool $decorated = false): void { $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); } @@ -56,25 +50,25 @@ protected function write(string $content, bool $decorated = false) /** * Describes an InputArgument instance. */ - abstract protected function describeInputArgument(InputArgument $argument, array $options = []); + abstract protected function describeInputArgument(InputArgument $argument, array $options = []): void; /** * Describes an InputOption instance. */ - abstract protected function describeInputOption(InputOption $option, array $options = []); + abstract protected function describeInputOption(InputOption $option, array $options = []): void; /** * Describes an InputDefinition instance. */ - abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []); + abstract protected function describeInputDefinition(InputDefinition $definition, array $options = []): void; /** * Describes a Command instance. */ - abstract protected function describeCommand(Command $command, array $options = []); + abstract protected function describeCommand(Command $command, array $options = []): void; /** * Describes an Application instance. */ - abstract protected function describeApplication(Application $application, array $options = []); + abstract protected function describeApplication(Application $application, array $options = []): void; } diff --git a/app/vendor/symfony/console/Descriptor/DescriptorInterface.php b/app/vendor/symfony/console/Descriptor/DescriptorInterface.php index ebea30367..ab468a256 100644 --- a/app/vendor/symfony/console/Descriptor/DescriptorInterface.php +++ b/app/vendor/symfony/console/Descriptor/DescriptorInterface.php @@ -20,5 +20,8 @@ */ interface DescriptorInterface { + /** + * @return void + */ public function describe(OutputInterface $output, object $object, array $options = []); } diff --git a/app/vendor/symfony/console/Descriptor/JsonDescriptor.php b/app/vendor/symfony/console/Descriptor/JsonDescriptor.php index 6f79a17a9..956303709 100644 --- a/app/vendor/symfony/console/Descriptor/JsonDescriptor.php +++ b/app/vendor/symfony/console/Descriptor/JsonDescriptor.php @@ -26,12 +26,12 @@ */ class JsonDescriptor extends Descriptor { - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->writeData($this->getInputArgumentData($argument), $options); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $this->writeData($this->getInputOptionData($option), $options); if ($option->isNegatable()) { @@ -39,17 +39,17 @@ protected function describeInputOption(InputOption $option, array $options = []) } } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $this->writeData($this->getInputDefinitionData($definition), $options); } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $this->writeData($this->getCommandData($command, $options['short'] ?? false), $options); } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace, true); @@ -81,7 +81,7 @@ protected function describeApplication(Application $application, array $options /** * Writes data as json. */ - private function writeData(array $data, array $options) + private function writeData(array $data, array $options): void { $flags = $options['json_encoding'] ?? 0; diff --git a/app/vendor/symfony/console/Descriptor/MarkdownDescriptor.php b/app/vendor/symfony/console/Descriptor/MarkdownDescriptor.php index fbd9c5346..b3f16ee90 100644 --- a/app/vendor/symfony/console/Descriptor/MarkdownDescriptor.php +++ b/app/vendor/symfony/console/Descriptor/MarkdownDescriptor.php @@ -28,7 +28,7 @@ */ class MarkdownDescriptor extends Descriptor { - public function describe(OutputInterface $output, object $object, array $options = []) + public function describe(OutputInterface $output, object $object, array $options = []): void { $decorated = $output->isDecorated(); $output->setDecorated(false); @@ -38,12 +38,12 @@ public function describe(OutputInterface $output, object $object, array $options $output->setDecorated($decorated); } - protected function write(string $content, bool $decorated = true) + protected function write(string $content, bool $decorated = true): void { parent::write($content, $decorated); } - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->write( '#### `'.($argument->getName() ?: '')."`\n\n" @@ -54,7 +54,7 @@ protected function describeInputArgument(InputArgument $argument, array $options ); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $name = '--'.$option->getName(); if ($option->isNegatable()) { @@ -75,15 +75,13 @@ protected function describeInputOption(InputOption $option, array $options = []) ); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { if ($showArguments = \count($definition->getArguments()) > 0) { $this->write('### Arguments'); foreach ($definition->getArguments() as $argument) { $this->write("\n\n"); - if (null !== $describeInputArgument = $this->describeInputArgument($argument)) { - $this->write($describeInputArgument); - } + $this->describeInputArgument($argument); } } @@ -95,14 +93,12 @@ protected function describeInputDefinition(InputDefinition $definition, array $o $this->write('### Options'); foreach ($definition->getOptions() as $option) { $this->write("\n\n"); - if (null !== $describeInputOption = $this->describeInputOption($option)) { - $this->write($describeInputOption); - } + $this->describeInputOption($option); } } } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { if ($options['short'] ?? false) { $this->write( @@ -110,9 +106,7 @@ protected function describeCommand(Command $command, array $options = []) .str_repeat('-', Helper::width($command->getName()) + 2)."\n\n" .($command->getDescription() ? $command->getDescription()."\n\n" : '') .'### Usage'."\n\n" - .array_reduce($command->getAliases(), function ($carry, $usage) { - return $carry.'* `'.$usage.'`'."\n"; - }) + .array_reduce($command->getAliases(), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n") ); return; @@ -125,9 +119,7 @@ protected function describeCommand(Command $command, array $options = []) .str_repeat('-', Helper::width($command->getName()) + 2)."\n\n" .($command->getDescription() ? $command->getDescription()."\n\n" : '') .'### Usage'."\n\n" - .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), function ($carry, $usage) { - return $carry.'* `'.$usage.'`'."\n"; - }) + .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), fn ($carry, $usage) => $carry.'* `'.$usage.'`'."\n") ); if ($help = $command->getProcessedHelp()) { @@ -142,7 +134,7 @@ protected function describeCommand(Command $command, array $options = []) } } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); @@ -157,16 +149,12 @@ protected function describeApplication(Application $application, array $options } $this->write("\n\n"); - $this->write(implode("\n", array_map(function ($commandName) use ($description) { - return sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())); - }, $namespace['commands']))); + $this->write(implode("\n", array_map(fn ($commandName) => sprintf('* [`%s`](#%s)', $commandName, str_replace(':', '', $description->getCommand($commandName)->getName())), $namespace['commands']))); } foreach ($description->getCommands() as $command) { $this->write("\n\n"); - if (null !== $describeCommand = $this->describeCommand($command, $options)) { - $this->write($describeCommand); - } + $this->describeCommand($command, $options); } } diff --git a/app/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php b/app/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php new file mode 100644 index 000000000..d4423fd34 --- /dev/null +++ b/app/vendor/symfony/console/Descriptor/ReStructuredTextDescriptor.php @@ -0,0 +1,272 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Console\Descriptor; + +use Symfony\Component\Console\Application; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Helper\Helper; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputDefinition; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; +use Symfony\Component\String\UnicodeString; + +class ReStructuredTextDescriptor extends Descriptor +{ + //

    + private string $partChar = '='; + //

    + private string $chapterChar = '-'; + //

    + private string $sectionChar = '~'; + //

    + private string $subsectionChar = '.'; + //

    + private string $subsubsectionChar = '^'; + //
    + private string $paragraphsChar = '"'; + + private array $visibleNamespaces = []; + + public function describe(OutputInterface $output, object $object, array $options = []): void + { + $decorated = $output->isDecorated(); + $output->setDecorated(false); + + parent::describe($output, $object, $options); + + $output->setDecorated($decorated); + } + + /** + * Override parent method to set $decorated = true. + */ + protected function write(string $content, bool $decorated = true): void + { + parent::write($content, $decorated); + } + + protected function describeInputArgument(InputArgument $argument, array $options = []): void + { + $this->write( + $argument->getName() ?: ''."\n".str_repeat($this->paragraphsChar, Helper::width($argument->getName()))."\n\n" + .($argument->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n", $argument->getDescription())."\n\n" : '') + .'- **Is required**: '.($argument->isRequired() ? 'yes' : 'no')."\n" + .'- **Is array**: '.($argument->isArray() ? 'yes' : 'no')."\n" + .'- **Default**: ``'.str_replace("\n", '', var_export($argument->getDefault(), true)).'``' + ); + } + + protected function describeInputOption(InputOption $option, array $options = []): void + { + $name = '\-\-'.$option->getName(); + if ($option->isNegatable()) { + $name .= '|\-\-no-'.$option->getName(); + } + if ($option->getShortcut()) { + $name .= '|-'.str_replace('|', '|-', $option->getShortcut()); + } + + $optionDescription = $option->getDescription() ? preg_replace('/\s*[\r\n]\s*/', "\n\n", $option->getDescription())."\n\n" : ''; + $optionDescription = (new UnicodeString($optionDescription))->ascii(); + $this->write( + $name."\n".str_repeat($this->paragraphsChar, Helper::width($name))."\n\n" + .$optionDescription + .'- **Accept value**: '.($option->acceptValue() ? 'yes' : 'no')."\n" + .'- **Is value required**: '.($option->isValueRequired() ? 'yes' : 'no')."\n" + .'- **Is multiple**: '.($option->isArray() ? 'yes' : 'no')."\n" + .'- **Is negatable**: '.($option->isNegatable() ? 'yes' : 'no')."\n" + .'- **Default**: ``'.str_replace("\n", '', var_export($option->getDefault(), true)).'``'."\n" + ); + } + + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void + { + if ($showArguments = ((bool) $definition->getArguments())) { + $this->write("Arguments\n".str_repeat($this->subsubsectionChar, 9))."\n\n"; + foreach ($definition->getArguments() as $argument) { + $this->write("\n\n"); + $this->describeInputArgument($argument); + } + } + + if ($nonDefaultOptions = $this->getNonDefaultOptions($definition)) { + if ($showArguments) { + $this->write("\n\n"); + } + + $this->write("Options\n".str_repeat($this->subsubsectionChar, 7)."\n\n"); + foreach ($nonDefaultOptions as $option) { + $this->describeInputOption($option); + $this->write("\n"); + } + } + } + + protected function describeCommand(Command $command, array $options = []): void + { + if ($options['short'] ?? false) { + $this->write( + '``'.$command->getName()."``\n" + .str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n" + .($command->getDescription() ? $command->getDescription()."\n\n" : '') + ."Usage\n".str_repeat($this->paragraphsChar, 5)."\n\n" + .array_reduce($command->getAliases(), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'."\n") + ); + + return; + } + + $command->mergeApplicationDefinition(false); + + foreach ($command->getAliases() as $alias) { + $this->write('.. _'.$alias.":\n\n"); + } + $this->write( + $command->getName()."\n" + .str_repeat($this->subsectionChar, Helper::width($command->getName()))."\n\n" + .($command->getDescription() ? $command->getDescription()."\n\n" : '') + ."Usage\n".str_repeat($this->subsubsectionChar, 5)."\n\n" + .array_reduce(array_merge([$command->getSynopsis()], $command->getAliases(), $command->getUsages()), static fn ($carry, $usage) => $carry.'- ``'.$usage.'``'."\n") + ); + + if ($help = $command->getProcessedHelp()) { + $this->write("\n"); + $this->write($help); + } + + $definition = $command->getDefinition(); + if ($definition->getOptions() || $definition->getArguments()) { + $this->write("\n\n"); + $this->describeInputDefinition($definition); + } + } + + protected function describeApplication(Application $application, array $options = []): void + { + $description = new ApplicationDescription($application, $options['namespace'] ?? null); + $title = $this->getApplicationTitle($application); + + $this->write($title."\n".str_repeat($this->partChar, Helper::width($title))); + $this->createTableOfContents($description, $application); + $this->describeCommands($application, $options); + } + + private function getApplicationTitle(Application $application): string + { + if ('UNKNOWN' === $application->getName()) { + return 'Console Tool'; + } + if ('UNKNOWN' !== $application->getVersion()) { + return sprintf('%s %s', $application->getName(), $application->getVersion()); + } + + return $application->getName(); + } + + private function describeCommands($application, array $options): void + { + $title = 'Commands'; + $this->write("\n\n$title\n".str_repeat($this->chapterChar, Helper::width($title))."\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + $this->write('Global'."\n".str_repeat($this->sectionChar, Helper::width('Global'))."\n\n"); + } else { + $commands = $application->all($namespace); + $this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n"); + } + + foreach ($this->removeAliasesAndHiddenCommands($commands) as $command) { + $this->describeCommand($command, $options); + $this->write("\n\n"); + } + } + } + + private function createTableOfContents(ApplicationDescription $description, Application $application): void + { + $this->setVisibleNamespaces($description); + $chapterTitle = 'Table of Contents'; + $this->write("\n\n$chapterTitle\n".str_repeat($this->chapterChar, Helper::width($chapterTitle))."\n\n"); + foreach ($this->visibleNamespaces as $namespace) { + if ('_global' === $namespace) { + $commands = $application->all(''); + } else { + $commands = $application->all($namespace); + $this->write("\n\n"); + $this->write($namespace."\n".str_repeat($this->sectionChar, Helper::width($namespace))."\n\n"); + } + $commands = $this->removeAliasesAndHiddenCommands($commands); + + $this->write("\n\n"); + $this->write(implode("\n", array_map(static fn ($commandName) => sprintf('- `%s`_', $commandName), array_keys($commands)))); + } + } + + private function getNonDefaultOptions(InputDefinition $definition): array + { + $globalOptions = [ + 'help', + 'quiet', + 'verbose', + 'version', + 'ansi', + 'no-interaction', + ]; + $nonDefaultOptions = []; + foreach ($definition->getOptions() as $option) { + // Skip global options. + if (!\in_array($option->getName(), $globalOptions)) { + $nonDefaultOptions[] = $option; + } + } + + return $nonDefaultOptions; + } + + private function setVisibleNamespaces(ApplicationDescription $description): void + { + $commands = $description->getCommands(); + foreach ($description->getNamespaces() as $namespace) { + try { + $namespaceCommands = $namespace['commands']; + foreach ($namespaceCommands as $key => $commandName) { + if (!\array_key_exists($commandName, $commands)) { + // If the array key does not exist, then this is an alias. + unset($namespaceCommands[$key]); + } elseif ($commands[$commandName]->isHidden()) { + unset($namespaceCommands[$key]); + } + } + if (!$namespaceCommands) { + // If the namespace contained only aliases or hidden commands, skip the namespace. + continue; + } + } catch (\Exception) { + } + $this->visibleNamespaces[] = $namespace['id']; + } + } + + private function removeAliasesAndHiddenCommands(array $commands): array + { + foreach ($commands as $key => $command) { + if ($command->isHidden() || \in_array($key, $command->getAliases(), true)) { + unset($commands[$key]); + } + } + unset($commands['completion']); + + return $commands; + } +} diff --git a/app/vendor/symfony/console/Descriptor/TextDescriptor.php b/app/vendor/symfony/console/Descriptor/TextDescriptor.php index 48a0b42af..d04d10238 100644 --- a/app/vendor/symfony/console/Descriptor/TextDescriptor.php +++ b/app/vendor/symfony/console/Descriptor/TextDescriptor.php @@ -28,7 +28,7 @@ */ class TextDescriptor extends Descriptor { - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { if (null !== $argument->getDefault() && (!\is_array($argument->getDefault()) || \count($argument->getDefault()))) { $default = sprintf(' [default: %s]', $this->formatDefaultValue($argument->getDefault())); @@ -48,7 +48,7 @@ protected function describeInputArgument(InputArgument $argument, array $options ), $options); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { if ($option->acceptValue() && null !== $option->getDefault() && (!\is_array($option->getDefault()) || \count($option->getDefault()))) { $default = sprintf(' [default: %s]', $this->formatDefaultValue($option->getDefault())); @@ -83,7 +83,7 @@ protected function describeInputOption(InputOption $option, array $options = []) ), $options); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $totalWidth = $this->calculateTotalWidthForOptions($definition->getOptions()); foreach ($definition->getArguments() as $argument) { @@ -122,7 +122,7 @@ protected function describeInputDefinition(InputDefinition $definition, array $o } } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $command->mergeApplicationDefinition(false); @@ -157,7 +157,7 @@ protected function describeCommand(Command $command, array $options = []) } } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $describedNamespace = $options['namespace'] ?? null; $description = new ApplicationDescription($application, $describedNamespace); @@ -193,9 +193,7 @@ protected function describeApplication(Application $application, array $options } // calculate max. width based on available commands per namespace - $width = $this->getColumnWidth(array_merge(...array_values(array_map(function ($namespace) use ($commands) { - return array_intersect($namespace['commands'], array_keys($commands)); - }, array_values($namespaces))))); + $width = $this->getColumnWidth(array_merge(...array_values(array_map(fn ($namespace) => array_intersect($namespace['commands'], array_keys($commands)), array_values($namespaces))))); if ($describedNamespace) { $this->writeText(sprintf('Available commands for the "%s" namespace:', $describedNamespace), $options); @@ -204,9 +202,7 @@ protected function describeApplication(Application $application, array $options } foreach ($namespaces as $namespace) { - $namespace['commands'] = array_filter($namespace['commands'], function ($name) use ($commands) { - return isset($commands[$name]); - }); + $namespace['commands'] = array_filter($namespace['commands'], fn ($name) => isset($commands[$name])); if (!$namespace['commands']) { continue; @@ -230,7 +226,7 @@ protected function describeApplication(Application $application, array $options } } - private function writeText(string $content, array $options = []) + private function writeText(string $content, array $options = []): void { $this->write( isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, diff --git a/app/vendor/symfony/console/Descriptor/XmlDescriptor.php b/app/vendor/symfony/console/Descriptor/XmlDescriptor.php index f4643a9ac..72580fd98 100644 --- a/app/vendor/symfony/console/Descriptor/XmlDescriptor.php +++ b/app/vendor/symfony/console/Descriptor/XmlDescriptor.php @@ -120,27 +120,27 @@ public function getApplicationDocument(Application $application, string $namespa return $dom; } - protected function describeInputArgument(InputArgument $argument, array $options = []) + protected function describeInputArgument(InputArgument $argument, array $options = []): void { $this->writeDocument($this->getInputArgumentDocument($argument)); } - protected function describeInputOption(InputOption $option, array $options = []) + protected function describeInputOption(InputOption $option, array $options = []): void { $this->writeDocument($this->getInputOptionDocument($option)); } - protected function describeInputDefinition(InputDefinition $definition, array $options = []) + protected function describeInputDefinition(InputDefinition $definition, array $options = []): void { $this->writeDocument($this->getInputDefinitionDocument($definition)); } - protected function describeCommand(Command $command, array $options = []) + protected function describeCommand(Command $command, array $options = []): void { $this->writeDocument($this->getCommandDocument($command, $options['short'] ?? false)); } - protected function describeApplication(Application $application, array $options = []) + protected function describeApplication(Application $application, array $options = []): void { $this->writeDocument($this->getApplicationDocument($application, $options['namespace'] ?? null, $options['short'] ?? false)); } @@ -148,7 +148,7 @@ protected function describeApplication(Application $application, array $options /** * Appends document children to parent node. */ - private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) + private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent): void { foreach ($importedParent->childNodes as $childNode) { $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); @@ -158,7 +158,7 @@ private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) /** * Writes DOM document. */ - private function writeDocument(\DOMDocument $dom) + private function writeDocument(\DOMDocument $dom): void { $dom->formatOutput = true; $this->write($dom->saveXML()); diff --git a/app/vendor/symfony/console/Event/ConsoleSignalEvent.php b/app/vendor/symfony/console/Event/ConsoleSignalEvent.php index 766af691a..95af1f915 100644 --- a/app/vendor/symfony/console/Event/ConsoleSignalEvent.php +++ b/app/vendor/symfony/console/Event/ConsoleSignalEvent.php @@ -21,15 +21,36 @@ final class ConsoleSignalEvent extends ConsoleEvent { private int $handlingSignal; + private int|false $exitCode; - public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal) + public function __construct(Command $command, InputInterface $input, OutputInterface $output, int $handlingSignal, int|false $exitCode = 0) { parent::__construct($command, $input, $output); $this->handlingSignal = $handlingSignal; + $this->exitCode = $exitCode; } public function getHandlingSignal(): int { return $this->handlingSignal; } + + public function setExitCode(int $exitCode): void + { + if ($exitCode < 0 || $exitCode > 255) { + throw new \InvalidArgumentException('Exit code must be between 0 and 255.'); + } + + $this->exitCode = $exitCode; + } + + public function abortExit(): void + { + $this->exitCode = false; + } + + public function getExitCode(): int|false + { + return $this->exitCode; + } } diff --git a/app/vendor/symfony/console/EventListener/ErrorListener.php b/app/vendor/symfony/console/EventListener/ErrorListener.php index 773a13a1c..9925a5f74 100644 --- a/app/vendor/symfony/console/EventListener/ErrorListener.php +++ b/app/vendor/symfony/console/EventListener/ErrorListener.php @@ -31,6 +31,9 @@ public function __construct(LoggerInterface $logger = null) $this->logger = $logger; } + /** + * @return void + */ public function onConsoleError(ConsoleErrorEvent $event) { if (null === $this->logger) { @@ -48,6 +51,9 @@ public function onConsoleError(ConsoleErrorEvent $event) $this->logger->critical('Error thrown while running command "{command}". Message: "{message}"', ['exception' => $error, 'command' => $inputString, 'message' => $error->getMessage()]); } + /** + * @return void + */ public function onConsoleTerminate(ConsoleTerminateEvent $event) { if (null === $this->logger) { diff --git a/app/vendor/symfony/console/Formatter/OutputFormatter.php b/app/vendor/symfony/console/Formatter/OutputFormatter.php index 38e75c317..3e4897c33 100644 --- a/app/vendor/symfony/console/Formatter/OutputFormatter.php +++ b/app/vendor/symfony/console/Formatter/OutputFormatter.php @@ -13,6 +13,8 @@ use Symfony\Component\Console\Exception\InvalidArgumentException; +use function Symfony\Component\String\b; + /** * Formatter class for console output. * @@ -81,6 +83,9 @@ public function __construct(bool $decorated = false, array $styles = []) $this->styleStack = new OutputFormatterStyleStack(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->decorated = $decorated; @@ -91,6 +96,9 @@ public function isDecorated(): bool return $this->decorated; } + /** + * @return void + */ public function setStyle(string $name, OutputFormatterStyleInterface $style) { $this->styles[strtolower($name)] = $style; @@ -115,6 +123,9 @@ public function format(?string $message): ?string return $this->formatAndWrap($message, 0); } + /** + * @return string + */ public function formatAndWrap(?string $message, int $width) { if (null === $message) { @@ -232,7 +243,7 @@ private function applyCurrentStyle(string $text, string $current, int $width, in } preg_match('~(\\n)$~', $text, $matches); - $text = $prefix.preg_replace('~([^\\n]{'.$width.'})\\ *~', "\$1\n", $text); + $text = $prefix.$this->addLineBreaks($text, $width); $text = rtrim($text, "\n").($matches[1] ?? ''); if (!$currentLineLength && '' !== $current && !str_ends_with($current, "\n")) { @@ -256,4 +267,11 @@ private function applyCurrentStyle(string $text, string $current, int $width, in return implode("\n", $lines); } + + private function addLineBreaks(string $text, int $width): string + { + $encoding = mb_detect_encoding($text, null, true) ?: 'UTF-8'; + + return b($text)->toCodePointString($encoding)->wordwrap($width, "\n", true)->toByteString($encoding); + } } diff --git a/app/vendor/symfony/console/Formatter/OutputFormatterInterface.php b/app/vendor/symfony/console/Formatter/OutputFormatterInterface.php index b94e51ded..433cd4197 100644 --- a/app/vendor/symfony/console/Formatter/OutputFormatterInterface.php +++ b/app/vendor/symfony/console/Formatter/OutputFormatterInterface.php @@ -20,6 +20,8 @@ interface OutputFormatterInterface { /** * Sets the decorated flag. + * + * @return void */ public function setDecorated(bool $decorated); @@ -30,6 +32,8 @@ public function isDecorated(): bool; /** * Sets a new style. + * + * @return void */ public function setStyle(string $name, OutputFormatterStyleInterface $style); diff --git a/app/vendor/symfony/console/Formatter/OutputFormatterStyle.php b/app/vendor/symfony/console/Formatter/OutputFormatterStyle.php index 3394c9ada..346a474c6 100644 --- a/app/vendor/symfony/console/Formatter/OutputFormatterStyle.php +++ b/app/vendor/symfony/console/Formatter/OutputFormatterStyle.php @@ -38,6 +38,9 @@ public function __construct(string $foreground = null, string $background = null $this->color = new Color($this->foreground = $foreground ?: '', $this->background = $background ?: '', $this->options = $options); } + /** + * @return void + */ public function setForeground(string $color = null) { if (1 > \func_num_args()) { @@ -46,6 +49,9 @@ public function setForeground(string $color = null) $this->color = new Color($this->foreground = $color ?: '', $this->background, $this->options); } + /** + * @return void + */ public function setBackground(string $color = null) { if (1 > \func_num_args()) { @@ -59,12 +65,18 @@ public function setHref(string $url): void $this->href = $url; } + /** + * @return void + */ public function setOption(string $option) { $this->options[] = $option; $this->color = new Color($this->foreground, $this->background, $this->options); } + /** + * @return void + */ public function unsetOption(string $option) { $pos = array_search($option, $this->options); @@ -75,6 +87,9 @@ public function unsetOption(string $option) $this->color = new Color($this->foreground, $this->background, $this->options); } + /** + * @return void + */ public function setOptions(array $options) { $this->color = new Color($this->foreground, $this->background, $this->options = $options); diff --git a/app/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php b/app/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php index 7ed67d9a1..3b15098cb 100644 --- a/app/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php +++ b/app/vendor/symfony/console/Formatter/OutputFormatterStyleInterface.php @@ -20,26 +20,36 @@ interface OutputFormatterStyleInterface { /** * Sets style foreground color. + * + * @return void */ public function setForeground(?string $color); /** * Sets style background color. + * + * @return void */ public function setBackground(?string $color); /** * Sets some specific style option. + * + * @return void */ public function setOption(string $option); /** * Unsets some specific style option. + * + * @return void */ public function unsetOption(string $option); /** * Sets multiple style options at once. + * + * @return void */ public function setOptions(array $options); diff --git a/app/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php b/app/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php index 2c5cdf9b8..f98c2eff7 100644 --- a/app/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php +++ b/app/vendor/symfony/console/Formatter/OutputFormatterStyleStack.php @@ -34,6 +34,8 @@ public function __construct(OutputFormatterStyleInterface $emptyStyle = null) /** * Resets stack (ie. empty internal arrays). + * + * @return void */ public function reset() { @@ -42,6 +44,8 @@ public function reset() /** * Pushes a style in the stack. + * + * @return void */ public function push(OutputFormatterStyleInterface $style) { diff --git a/app/vendor/symfony/console/Helper/DescriptorHelper.php b/app/vendor/symfony/console/Helper/DescriptorHelper.php index 3015ff08d..eb32bce8f 100644 --- a/app/vendor/symfony/console/Helper/DescriptorHelper.php +++ b/app/vendor/symfony/console/Helper/DescriptorHelper.php @@ -14,6 +14,7 @@ use Symfony\Component\Console\Descriptor\DescriptorInterface; use Symfony\Component\Console\Descriptor\JsonDescriptor; use Symfony\Component\Console\Descriptor\MarkdownDescriptor; +use Symfony\Component\Console\Descriptor\ReStructuredTextDescriptor; use Symfony\Component\Console\Descriptor\TextDescriptor; use Symfony\Component\Console\Descriptor\XmlDescriptor; use Symfony\Component\Console\Exception\InvalidArgumentException; @@ -38,6 +39,7 @@ public function __construct() ->register('xml', new XmlDescriptor()) ->register('json', new JsonDescriptor()) ->register('md', new MarkdownDescriptor()) + ->register('rst', new ReStructuredTextDescriptor()) ; } @@ -48,6 +50,8 @@ public function __construct() * * format: string, the output format name * * raw_text: boolean, sets output type as raw * + * @return void + * * @throws InvalidArgumentException when the given format is not supported */ public function describe(OutputInterface $output, ?object $object, array $options = []) diff --git a/app/vendor/symfony/console/Helper/Dumper.php b/app/vendor/symfony/console/Helper/Dumper.php index ac7571cea..8c6a94d51 100644 --- a/app/vendor/symfony/console/Helper/Dumper.php +++ b/app/vendor/symfony/console/Helper/Dumper.php @@ -40,14 +40,12 @@ public function __construct(OutputInterface $output, CliDumper $dumper = null, C return rtrim($dumper->dump(($this->cloner ??= new VarCloner())->cloneVar($var)->withRefHandles(false), true)); }; } else { - $this->handler = function ($var): string { - return match (true) { - null === $var => 'null', - true === $var => 'true', - false === $var => 'false', - \is_string($var) => '"'.$var.'"', - default => rtrim(print_r($var, true)), - }; + $this->handler = fn ($var): string => match (true) { + null === $var => 'null', + true === $var => 'true', + false === $var => 'false', + \is_string($var) => '"'.$var.'"', + default => rtrim(print_r($var, true)), }; } } diff --git a/app/vendor/symfony/console/Helper/Helper.php b/app/vendor/symfony/console/Helper/Helper.php index 920196e0f..3631b30f6 100644 --- a/app/vendor/symfony/console/Helper/Helper.php +++ b/app/vendor/symfony/console/Helper/Helper.php @@ -21,8 +21,11 @@ */ abstract class Helper implements HelperInterface { - protected $helperSet = null; + protected $helperSet; + /** + * @return void + */ public function setHelperSet(HelperSet $helperSet = null) { if (1 > \func_num_args()) { @@ -88,6 +91,9 @@ public static function substr(?string $string, int $from, int $length = null): s return mb_substr($string, $from, $length, $encoding); } + /** + * @return string + */ public static function formatTime(int|float $secs) { static $timeFormats = [ @@ -117,6 +123,9 @@ public static function formatTime(int|float $secs) } } + /** + * @return string + */ public static function formatMemory(int $memory) { if ($memory >= 1024 * 1024 * 1024) { @@ -134,6 +143,9 @@ public static function formatMemory(int $memory) return sprintf('%d B', $memory); } + /** + * @return string + */ public static function removeDecoration(OutputFormatterInterface $formatter, ?string $string) { $isDecorated = $formatter->isDecorated(); diff --git a/app/vendor/symfony/console/Helper/HelperInterface.php b/app/vendor/symfony/console/Helper/HelperInterface.php index 2762cdf05..ab626c938 100644 --- a/app/vendor/symfony/console/Helper/HelperInterface.php +++ b/app/vendor/symfony/console/Helper/HelperInterface.php @@ -20,6 +20,8 @@ interface HelperInterface { /** * Sets the helper set associated with this helper. + * + * @return void */ public function setHelperSet(?HelperSet $helperSet); diff --git a/app/vendor/symfony/console/Helper/HelperSet.php b/app/vendor/symfony/console/Helper/HelperSet.php index cefe62be3..dc5d499ca 100644 --- a/app/vendor/symfony/console/Helper/HelperSet.php +++ b/app/vendor/symfony/console/Helper/HelperSet.php @@ -35,6 +35,9 @@ public function __construct(array $helpers = []) } } + /** + * @return void + */ public function set(HelperInterface $helper, string $alias = null) { $this->helpers[$helper->getName()] = $helper; diff --git a/app/vendor/symfony/console/Helper/InputAwareHelper.php b/app/vendor/symfony/console/Helper/InputAwareHelper.php index ba81e3771..6f8225973 100644 --- a/app/vendor/symfony/console/Helper/InputAwareHelper.php +++ b/app/vendor/symfony/console/Helper/InputAwareHelper.php @@ -23,6 +23,9 @@ abstract class InputAwareHelper extends Helper implements InputAwareInterface { protected $input; + /** + * @return void + */ public function setInput(InputInterface $input) { $this->input = $input; diff --git a/app/vendor/symfony/console/Helper/ProgressBar.php b/app/vendor/symfony/console/Helper/ProgressBar.php index 0d1126097..19faea47c 100644 --- a/app/vendor/symfony/console/Helper/ProgressBar.php +++ b/app/vendor/symfony/console/Helper/ProgressBar.php @@ -59,6 +59,7 @@ final class ProgressBar private Terminal $terminal; private ?string $previousMessage = null; private Cursor $cursor; + private array $placeholders = []; private static array $formatters; private static array $formats; @@ -94,12 +95,12 @@ public function __construct(OutputInterface $output, int $max = 0, float $minSec } /** - * Sets a placeholder formatter for a given name. + * Sets a placeholder formatter for a given name, globally for all instances of ProgressBar. * * This method also allow you to override an existing placeholder. * - * @param string $name The placeholder name (including the delimiter char like %) - * @param callable $callable A PHP callable + * @param string $name The placeholder name (including the delimiter char like %) + * @param callable(ProgressBar):string $callable A PHP callable */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable): void { @@ -120,6 +121,26 @@ public static function getPlaceholderFormatterDefinition(string $name): ?callabl return self::$formatters[$name] ?? null; } + /** + * Sets a placeholder formatter for a given name, for this instance only. + * + * @param callable(ProgressBar):string $callable A PHP callable + */ + public function setPlaceholderFormatter(string $name, callable $callable): void + { + $this->placeholders[$name] = $callable; + } + + /** + * Gets the placeholder formatter for a given name. + * + * @param string $name The placeholder name (including the delimiter char like %) + */ + public function getPlaceholderFormatter(string $name): ?callable + { + return $this->placeholders[$name] ?? $this::getPlaceholderFormatterDefinition($name); + } + /** * Sets a format for a given name. * @@ -157,12 +178,12 @@ public static function getFormatDefinition(string $name): ?string * @param string $message The text to associate with the placeholder * @param string $name The name of the placeholder */ - public function setMessage(string $message, string $name = 'message') + public function setMessage(string $message, string $name = 'message'): void { $this->messages[$name] = $message; } - public function getMessage(string $name = 'message') + public function getMessage(string $name = 'message'): string { return $this->messages[$name]; } @@ -215,7 +236,7 @@ public function getRemaining(): float return round((time() - $this->startTime) / ($this->step - $this->startingStep) * ($this->max - $this->step)); } - public function setBarWidth(int $size) + public function setBarWidth(int $size): void { $this->barWidth = max(1, $size); } @@ -225,7 +246,7 @@ public function getBarWidth(): int return $this->barWidth; } - public function setBarCharacter(string $char) + public function setBarCharacter(string $char): void { $this->barChar = $char; } @@ -235,7 +256,7 @@ public function getBarCharacter(): string return $this->barChar ?? ($this->max ? '=' : $this->emptyBarChar); } - public function setEmptyBarCharacter(string $char) + public function setEmptyBarCharacter(string $char): void { $this->emptyBarChar = $char; } @@ -245,7 +266,7 @@ public function getEmptyBarCharacter(): string return $this->emptyBarChar; } - public function setProgressCharacter(string $char) + public function setProgressCharacter(string $char): void { $this->progressChar = $char; } @@ -255,7 +276,7 @@ public function getProgressCharacter(): string return $this->progressChar; } - public function setFormat(string $format) + public function setFormat(string $format): void { $this->format = null; $this->internalFormat = $format; @@ -266,7 +287,7 @@ public function setFormat(string $format) * * @param int|null $freq The frequency in steps */ - public function setRedrawFrequency(?int $freq) + public function setRedrawFrequency(?int $freq): void { $this->redrawFreq = null !== $freq ? max(1, $freq) : null; } @@ -325,7 +346,7 @@ public function start(int $max = null, int $startAt = 0): void * * @param int $step Number of steps to advance */ - public function advance(int $step = 1) + public function advance(int $step = 1): void { $this->setProgress($this->step + $step); } @@ -333,12 +354,12 @@ public function advance(int $step = 1) /** * Sets whether to overwrite the progressbar, false for new line. */ - public function setOverwrite(bool $overwrite) + public function setOverwrite(bool $overwrite): void { $this->overwrite = $overwrite; } - public function setProgress(int $step) + public function setProgress(int $step): void { if ($this->max && $step > $this->max) { $this->max = $step; @@ -371,7 +392,7 @@ public function setProgress(int $step) } } - public function setMaxSteps(int $max) + public function setMaxSteps(int $max): void { $this->format = null; $this->max = max(0, $max); @@ -431,7 +452,7 @@ public function clear(): void $this->overwrite(''); } - private function setRealFormat(string $format) + private function setRealFormat(string $format): void { // try to use the _nomax variant if available if (!$this->max && null !== self::getFormatDefinition($format.'_nomax')) { @@ -513,9 +534,7 @@ private static function initPlaceholderFormatters(): array return $display; }, - 'elapsed' => function (self $bar) { - return Helper::formatTime(time() - $bar->getStartTime()); - }, + 'elapsed' => fn (self $bar) => Helper::formatTime(time() - $bar->getStartTime()), 'remaining' => function (self $bar) { if (!$bar->getMaxSteps()) { throw new LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); @@ -530,18 +549,10 @@ private static function initPlaceholderFormatters(): array return Helper::formatTime($bar->getEstimated()); }, - 'memory' => function (self $bar) { - return Helper::formatMemory(memory_get_usage(true)); - }, - 'current' => function (self $bar) { - return str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT); - }, - 'max' => function (self $bar) { - return $bar->getMaxSteps(); - }, - 'percent' => function (self $bar) { - return floor($bar->getProgressPercent() * 100); - }, + 'memory' => fn (self $bar) => Helper::formatMemory(memory_get_usage(true)), + 'current' => fn (self $bar) => str_pad($bar->getProgress(), $bar->getStepWidth(), ' ', \STR_PAD_LEFT), + 'max' => fn (self $bar) => $bar->getMaxSteps(), + 'percent' => fn (self $bar) => floor($bar->getProgressPercent() * 100), ]; } @@ -568,7 +579,7 @@ private function buildLine(): string $regex = "{%([a-z\-_]+)(?:\:([^%]+))?%}i"; $callback = function ($matches) { - if ($formatter = $this::getPlaceholderFormatterDefinition($matches[1])) { + if ($formatter = $this->getPlaceholderFormatter($matches[1])) { $text = $formatter($this, $this->output); } elseif (isset($this->messages[$matches[1]])) { $text = $this->messages[$matches[1]]; @@ -585,9 +596,7 @@ private function buildLine(): string $line = preg_replace_callback($regex, $callback, $this->format); // gets string length for each sub line with multiline format - $linesLength = array_map(function ($subLine) { - return Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r"))); - }, explode("\n", $line)); + $linesLength = array_map(fn ($subLine) => Helper::width(Helper::removeDecoration($this->output->getFormatter(), rtrim($subLine, "\r"))), explode("\n", $line)); $linesWidth = max($linesLength); diff --git a/app/vendor/symfony/console/Helper/ProgressIndicator.php b/app/vendor/symfony/console/Helper/ProgressIndicator.php index b5fa24c46..84dbef950 100644 --- a/app/vendor/symfony/console/Helper/ProgressIndicator.php +++ b/app/vendor/symfony/console/Helper/ProgressIndicator.php @@ -70,6 +70,8 @@ public function __construct(OutputInterface $output, string $format = null, int /** * Sets the current indicator message. + * + * @return void */ public function setMessage(?string $message) { @@ -80,6 +82,8 @@ public function setMessage(?string $message) /** * Starts the indicator output. + * + * @return void */ public function start(string $message) { @@ -98,6 +102,8 @@ public function start(string $message) /** * Advances the indicator. + * + * @return void */ public function advance() { @@ -123,6 +129,8 @@ public function advance() /** * Finish the indicator with message. + * + * @return void */ public function finish(string $message) { @@ -148,6 +156,8 @@ public static function getFormatDefinition(string $name): ?string * Sets a placeholder formatter for a given name. * * This method also allow you to override an existing placeholder. + * + * @return void */ public static function setPlaceholderFormatterDefinition(string $name, callable $callable) { @@ -166,7 +176,7 @@ public static function getPlaceholderFormatterDefinition(string $name): ?callabl return self::$formatters[$name] ?? null; } - private function display() + private function display(): void { if (OutputInterface::VERBOSITY_QUIET === $this->output->getVerbosity()) { return; @@ -195,7 +205,7 @@ private function determineBestFormat(): string /** * Overwrites a previous message to the output. */ - private function overwrite(string $message) + private function overwrite(string $message): void { if ($this->output->isDecorated()) { $this->output->write("\x0D\x1B[2K"); @@ -216,18 +226,10 @@ private function getCurrentTimeInMilliseconds(): float private static function initPlaceholderFormatters(): array { return [ - 'indicator' => function (self $indicator) { - return $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)]; - }, - 'message' => function (self $indicator) { - return $indicator->message; - }, - 'elapsed' => function (self $indicator) { - return Helper::formatTime(time() - $indicator->startTime); - }, - 'memory' => function () { - return Helper::formatMemory(memory_get_usage(true)); - }, + 'indicator' => fn (self $indicator) => $indicator->indicatorValues[$indicator->indicatorCurrent % \count($indicator->indicatorValues)], + 'message' => fn (self $indicator) => $indicator->message, + 'elapsed' => fn (self $indicator) => Helper::formatTime(time() - $indicator->startTime), + 'memory' => fn () => Helper::formatMemory(memory_get_usage(true)), ]; } } diff --git a/app/vendor/symfony/console/Helper/QuestionHelper.php b/app/vendor/symfony/console/Helper/QuestionHelper.php index c345b4af7..f32813c6c 100644 --- a/app/vendor/symfony/console/Helper/QuestionHelper.php +++ b/app/vendor/symfony/console/Helper/QuestionHelper.php @@ -68,9 +68,7 @@ public function ask(InputInterface $input, OutputInterface $output, Question $qu return $this->doAsk($output, $question); } - $interviewer = function () use ($output, $question) { - return $this->doAsk($output, $question); - }; + $interviewer = fn () => $this->doAsk($output, $question); return $this->validateAttempts($interviewer, $output, $question); } catch (MissingInputException $exception) { @@ -91,6 +89,8 @@ public function getName(): string /** * Prevents usage of stty. + * + * @return void */ public static function disableStty() { @@ -123,7 +123,18 @@ private function doAsk(OutputInterface $output, Question $question): mixed } if (false === $ret) { + $isBlocked = stream_get_meta_data($inputStream)['blocked'] ?? true; + + if (!$isBlocked) { + stream_set_blocking($inputStream, true); + } + $ret = $this->readInput($inputStream, $question); + + if (!$isBlocked) { + stream_set_blocking($inputStream, false); + } + if (false === $ret) { throw new MissingInputException('Aborted.'); } @@ -159,7 +170,7 @@ private function getDefaultAnswer(Question $question): mixed } if ($validator = $question->getValidator()) { - return \call_user_func($question->getValidator(), $default); + return \call_user_func($validator, $default); } elseif ($question instanceof ChoiceQuestion) { $choices = $question->getChoices(); @@ -179,6 +190,8 @@ private function getDefaultAnswer(Question $question): mixed /** * Outputs the question prompt. + * + * @return void */ protected function writePrompt(OutputInterface $output, Question $question) { @@ -215,6 +228,8 @@ protected function formatChoiceQuestionChoices(ChoiceQuestion $question, string /** * Outputs an error message. + * + * @return void */ protected function writeError(OutputInterface $output, \Exception $error) { @@ -314,9 +329,7 @@ private function autocomplete(OutputInterface $output, Question $question, $inpu $matches = array_filter( $autocomplete($ret), - function ($match) use ($ret) { - return '' === $ret || str_starts_with($match, $ret); - } + fn ($match) => '' === $ret || str_starts_with($match, $ret) ); $numMatches = \count($matches); $ofs = -1; @@ -496,13 +509,11 @@ private function isInteractiveInput($inputStream): bool return self::$stdinIsInteractive = @posix_isatty(fopen('php://stdin', 'r')); } - if (!\function_exists('exec')) { + if (!\function_exists('shell_exec')) { return self::$stdinIsInteractive = true; } - exec('stty 2> /dev/null', $output, $status); - - return self::$stdinIsInteractive = 1 !== $status; + return self::$stdinIsInteractive = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); } /** diff --git a/app/vendor/symfony/console/Helper/SymfonyQuestionHelper.php b/app/vendor/symfony/console/Helper/SymfonyQuestionHelper.php index 109045d04..8ebc84376 100644 --- a/app/vendor/symfony/console/Helper/SymfonyQuestionHelper.php +++ b/app/vendor/symfony/console/Helper/SymfonyQuestionHelper.php @@ -25,6 +25,9 @@ */ class SymfonyQuestionHelper extends QuestionHelper { + /** + * @return void + */ protected function writePrompt(OutputInterface $output, Question $question) { $text = OutputFormatter::escapeTrailingBackslash($question->getQuestion()); @@ -80,6 +83,9 @@ protected function writePrompt(OutputInterface $output, Question $question) $output->write($prompt); } + /** + * @return void + */ protected function writeError(OutputInterface $output, \Exception $error) { if ($output instanceof SymfonyStyle) { diff --git a/app/vendor/symfony/console/Helper/Table.php b/app/vendor/symfony/console/Helper/Table.php index 893b3192e..cf714873f 100644 --- a/app/vendor/symfony/console/Helper/Table.php +++ b/app/vendor/symfony/console/Helper/Table.php @@ -66,6 +66,8 @@ public function __construct(OutputInterface $output) /** * Sets a style definition. + * + * @return void */ public static function setStyleDefinition(string $name, TableStyle $style) { @@ -310,6 +312,8 @@ public function setVertical(bool $vertical = true): static * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | * +---------------+-----------------------+------------------+ + * + * @return void */ public function render() { @@ -450,7 +454,7 @@ public function render() * * +-----+-----------+-------+ */ - private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null) + private function renderRowSeparator(int $type = self::SEPARATOR_MID, string $title = null, string $titleFormat = null): void { if (!$count = $this->numberOfColumns) { return; @@ -515,7 +519,7 @@ private function renderColumnSeparator(int $type = self::BORDER_OUTSIDE): string * * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | */ - private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null) + private function renderRow(array $row, string $cellFormat, string $firstCellFormat = null): void { $rowContent = $this->renderColumnSeparator(self::BORDER_OUTSIDE); $columns = $this->getRowColumns($row); @@ -588,7 +592,7 @@ private function renderCell(array $row, int $column, string $cellFormat): string /** * Calculate number of columns for this table. */ - private function calculateNumberOfColumns(array $rows) + private function calculateNumberOfColumns(array $rows): void { $columns = [0]; foreach ($rows as $row) { @@ -727,7 +731,7 @@ private function fillNextRows(array $rows, int $line): array /** * fill cells for a row that contains colspan > 1. */ - private function fillCells(iterable $row) + private function fillCells(iterable $row): iterable { $newRow = []; @@ -789,7 +793,7 @@ private function getRowColumns(array $row): array /** * Calculates columns widths. */ - private function calculateColumnsWidth(iterable $groups) + private function calculateColumnsWidth(iterable $groups): void { for ($column = 0; $column < $this->numberOfColumns; ++$column) { $lengths = []; @@ -804,7 +808,7 @@ private function calculateColumnsWidth(iterable $groups) $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); $textLength = Helper::width($textContent); if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); + $contentColumns = mb_str_split($textContent, ceil($textLength / $cell->getColspan())); foreach ($contentColumns as $position => $content) { $row[$i + $position] = $content; } @@ -843,7 +847,7 @@ private function getCellWidth(array $row, int $column): int /** * Called after rendering to cleanup cache data. */ - private function cleanup() + private function cleanup(): void { $this->effectiveColumnWidths = []; unset($this->numberOfColumns); diff --git a/app/vendor/symfony/console/Helper/TableCellStyle.php b/app/vendor/symfony/console/Helper/TableCellStyle.php index 65ae9e728..9419dcb40 100644 --- a/app/vendor/symfony/console/Helper/TableCellStyle.php +++ b/app/vendor/symfony/console/Helper/TableCellStyle.php @@ -67,9 +67,7 @@ public function getTagOptions(): array { return array_filter( $this->getOptions(), - function ($key) { - return \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]); - }, + fn ($key) => \in_array($key, self::TAG_OPTIONS) && isset($this->options[$key]), \ARRAY_FILTER_USE_KEY ); } diff --git a/app/vendor/symfony/console/Input/ArgvInput.php b/app/vendor/symfony/console/Input/ArgvInput.php index c0c28bb58..59f9217ec 100644 --- a/app/vendor/symfony/console/Input/ArgvInput.php +++ b/app/vendor/symfony/console/Input/ArgvInput.php @@ -55,11 +55,17 @@ public function __construct(array $argv = null, InputDefinition $definition = nu parent::__construct($definition); } + /** + * @return void + */ protected function setTokens(array $tokens) { $this->tokens = $tokens; } + /** + * @return void + */ protected function parse() { $parseOptions = true; @@ -89,7 +95,7 @@ protected function parseToken(string $token, bool $parseOptions): bool /** * Parses a short option. */ - private function parseShortOption(string $token) + private function parseShortOption(string $token): void { $name = substr($token, 1); @@ -110,7 +116,7 @@ private function parseShortOption(string $token) * * @throws RuntimeException When option given doesn't exist */ - private function parseShortOptionSet(string $name) + private function parseShortOptionSet(string $name): void { $len = \strlen($name); for ($i = 0; $i < $len; ++$i) { @@ -133,7 +139,7 @@ private function parseShortOptionSet(string $name) /** * Parses a long option. */ - private function parseLongOption(string $token) + private function parseLongOption(string $token): void { $name = substr($token, 2); @@ -152,7 +158,7 @@ private function parseLongOption(string $token) * * @throws RuntimeException When too many arguments are given */ - private function parseArgument(string $token) + private function parseArgument(string $token): void { $c = \count($this->arguments); @@ -196,7 +202,7 @@ private function parseArgument(string $token) * * @throws RuntimeException When option given doesn't exist */ - private function addShortOption(string $shortcut, mixed $value) + private function addShortOption(string $shortcut, mixed $value): void { if (!$this->definition->hasShortcut($shortcut)) { throw new RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); @@ -210,7 +216,7 @@ private function addShortOption(string $shortcut, mixed $value) * * @throws RuntimeException When option given doesn't exist */ - private function addLongOption(string $name, mixed $value) + private function addLongOption(string $name, mixed $value): void { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { diff --git a/app/vendor/symfony/console/Input/ArrayInput.php b/app/vendor/symfony/console/Input/ArrayInput.php index 02fb4e8ee..355de61dd 100644 --- a/app/vendor/symfony/console/Input/ArrayInput.php +++ b/app/vendor/symfony/console/Input/ArrayInput.php @@ -113,6 +113,9 @@ public function __toString(): string return implode(' ', $params); } + /** + * @return void + */ protected function parse() { foreach ($this->parameters as $key => $value) { @@ -134,7 +137,7 @@ protected function parse() * * @throws InvalidOptionException When option given doesn't exist */ - private function addShortOption(string $shortcut, mixed $value) + private function addShortOption(string $shortcut, mixed $value): void { if (!$this->definition->hasShortcut($shortcut)) { throw new InvalidOptionException(sprintf('The "-%s" option does not exist.', $shortcut)); @@ -149,7 +152,7 @@ private function addShortOption(string $shortcut, mixed $value) * @throws InvalidOptionException When option given doesn't exist * @throws InvalidOptionException When a required value is missing */ - private function addLongOption(string $name, mixed $value) + private function addLongOption(string $name, mixed $value): void { if (!$this->definition->hasOption($name)) { if (!$this->definition->hasNegation($name)) { @@ -182,7 +185,7 @@ private function addLongOption(string $name, mixed $value) * * @throws InvalidArgumentException When argument given doesn't exist */ - private function addArgument(string|int $name, mixed $value) + private function addArgument(string|int $name, mixed $value): void { if (!$this->definition->hasArgument($name)) { throw new InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); diff --git a/app/vendor/symfony/console/Input/Input.php b/app/vendor/symfony/console/Input/Input.php index 7b90713c8..0f5617cd1 100644 --- a/app/vendor/symfony/console/Input/Input.php +++ b/app/vendor/symfony/console/Input/Input.php @@ -43,6 +43,9 @@ public function __construct(InputDefinition $definition = null) } } + /** + * @return void + */ public function bind(InputDefinition $definition) { $this->arguments = []; @@ -54,17 +57,20 @@ public function bind(InputDefinition $definition) /** * Processes command line arguments. + * + * @return void */ abstract protected function parse(); + /** + * @return void + */ public function validate() { $definition = $this->definition; $givenArguments = $this->arguments; - $missingArguments = array_filter(array_keys($definition->getArguments()), function ($argument) use ($definition, $givenArguments) { - return !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired(); - }); + $missingArguments = array_filter(array_keys($definition->getArguments()), fn ($argument) => !\array_key_exists($argument, $givenArguments) && $definition->getArgument($argument)->isRequired()); if (\count($missingArguments) > 0) { throw new RuntimeException(sprintf('Not enough arguments (missing: "%s").', implode(', ', $missingArguments))); @@ -76,6 +82,9 @@ public function isInteractive(): bool return $this->interactive; } + /** + * @return void + */ public function setInteractive(bool $interactive) { $this->interactive = $interactive; @@ -95,6 +104,9 @@ public function getArgument(string $name): mixed return $this->arguments[$name] ?? $this->definition->getArgument($name)->getDefault(); } + /** + * @return void + */ public function setArgument(string $name, mixed $value) { if (!$this->definition->hasArgument($name)) { @@ -131,6 +143,9 @@ public function getOption(string $name): mixed return \array_key_exists($name, $this->options) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); } + /** + * @return void + */ public function setOption(string $name, mixed $value) { if ($this->definition->hasNegation($name)) { @@ -157,11 +172,19 @@ public function escapeToken(string $token): string return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); } + /** + * @param resource $stream + * + * @return void + */ public function setStream($stream) { $this->stream = $stream; } + /** + * @return resource + */ public function getStream() { return $this->stream; diff --git a/app/vendor/symfony/console/Input/InputArgument.php b/app/vendor/symfony/console/Input/InputArgument.php index a130c4122..5cb151488 100644 --- a/app/vendor/symfony/console/Input/InputArgument.php +++ b/app/vendor/symfony/console/Input/InputArgument.php @@ -37,7 +37,7 @@ class InputArgument /** * @param string $name The argument name - * @param int|null $mode The argument mode: self::REQUIRED or self::OPTIONAL + * @param int|null $mode The argument mode: a bit mask of self::REQUIRED, self::OPTIONAL and self::IS_ARRAY * @param string $description A description text * @param string|bool|int|float|array|null $default The default value (for self::OPTIONAL mode only) * @param array|\Closure(CompletionInput,CompletionSuggestions):list $suggestedValues The values used for input completion @@ -91,6 +91,8 @@ public function isArray(): bool /** * Sets the default value. * + * @return void + * * @throws LogicException When incorrect default value is given */ public function setDefault(string|bool|int|float|array $default = null) diff --git a/app/vendor/symfony/console/Input/InputAwareInterface.php b/app/vendor/symfony/console/Input/InputAwareInterface.php index 5a288de5d..0ad27b455 100644 --- a/app/vendor/symfony/console/Input/InputAwareInterface.php +++ b/app/vendor/symfony/console/Input/InputAwareInterface.php @@ -21,6 +21,8 @@ interface InputAwareInterface { /** * Sets the Console Input. + * + * @return void */ public function setInput(InputInterface $input); } diff --git a/app/vendor/symfony/console/Input/InputDefinition.php b/app/vendor/symfony/console/Input/InputDefinition.php index f4b14a1c8..b7162d770 100644 --- a/app/vendor/symfony/console/Input/InputDefinition.php +++ b/app/vendor/symfony/console/Input/InputDefinition.php @@ -46,6 +46,8 @@ public function __construct(array $definition = []) /** * Sets the definition of the input. + * + * @return void */ public function setDefinition(array $definition) { @@ -67,6 +69,8 @@ public function setDefinition(array $definition) * Sets the InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void */ public function setArguments(array $arguments = []) { @@ -81,6 +85,8 @@ public function setArguments(array $arguments = []) * Adds an array of InputArgument objects. * * @param InputArgument[] $arguments An array of InputArgument objects + * + * @return void */ public function addArguments(?array $arguments = []) { @@ -92,6 +98,8 @@ public function addArguments(?array $arguments = []) } /** + * @return void + * * @throws LogicException When incorrect argument is given */ public function addArgument(InputArgument $argument) @@ -190,6 +198,8 @@ public function getArgumentDefaults(): array * Sets the InputOption objects. * * @param InputOption[] $options An array of InputOption objects + * + * @return void */ public function setOptions(array $options = []) { @@ -203,6 +213,8 @@ public function setOptions(array $options = []) * Adds an array of InputOption objects. * * @param InputOption[] $options An array of InputOption objects + * + * @return void */ public function addOptions(array $options = []) { @@ -212,6 +224,8 @@ public function addOptions(array $options = []) } /** + * @return void + * * @throws LogicException When option given already exist */ public function addOption(InputOption $option) diff --git a/app/vendor/symfony/console/Input/InputInterface.php b/app/vendor/symfony/console/Input/InputInterface.php index 3af991a76..aaed5fd01 100644 --- a/app/vendor/symfony/console/Input/InputInterface.php +++ b/app/vendor/symfony/console/Input/InputInterface.php @@ -61,6 +61,8 @@ public function getParameterOption(string|array $values, string|bool|int|float|a /** * Binds the current Input instance with the given arguments and options. * + * @return void + * * @throws RuntimeException */ public function bind(InputDefinition $definition); @@ -68,6 +70,8 @@ public function bind(InputDefinition $definition); /** * Validates the input. * + * @return void + * * @throws RuntimeException When not enough arguments are given */ public function validate(); @@ -91,6 +95,8 @@ public function getArgument(string $name); /** * Sets an argument value by name. * + * @return void + * * @throws InvalidArgumentException When argument given doesn't exist */ public function setArgument(string $name, mixed $value); @@ -119,6 +125,8 @@ public function getOption(string $name); /** * Sets an option value by name. * + * @return void + * * @throws InvalidArgumentException When option given doesn't exist */ public function setOption(string $name, mixed $value); @@ -135,6 +143,8 @@ public function isInteractive(): bool; /** * Sets the input interactivity. + * + * @return void */ public function setInteractive(bool $interactive); } diff --git a/app/vendor/symfony/console/Input/InputOption.php b/app/vendor/symfony/console/Input/InputOption.php index 9a7032a03..fdf88dcc2 100644 --- a/app/vendor/symfony/console/Input/InputOption.php +++ b/app/vendor/symfony/console/Input/InputOption.php @@ -178,6 +178,9 @@ public function isNegatable(): bool return self::VALUE_NEGATABLE === (self::VALUE_NEGATABLE & $this->mode); } + /** + * @return void + */ public function setDefault(string|bool|int|float|array $default = null) { if (1 > \func_num_args()) { diff --git a/app/vendor/symfony/console/Input/StreamableInputInterface.php b/app/vendor/symfony/console/Input/StreamableInputInterface.php index d7e462f24..4b95fcb11 100644 --- a/app/vendor/symfony/console/Input/StreamableInputInterface.php +++ b/app/vendor/symfony/console/Input/StreamableInputInterface.php @@ -25,6 +25,8 @@ interface StreamableInputInterface extends InputInterface * This is mainly useful for testing purpose. * * @param resource $stream The input stream + * + * @return void */ public function setStream($stream); diff --git a/app/vendor/symfony/console/Output/AnsiColorMode.php b/app/vendor/symfony/console/Output/AnsiColorMode.php index c6cc5c12f..5f9f744fe 100644 --- a/app/vendor/symfony/console/Output/AnsiColorMode.php +++ b/app/vendor/symfony/console/Output/AnsiColorMode.php @@ -26,7 +26,7 @@ enum AnsiColorMode case Ansi4; /* - * 8-bit Ansi colors (240 differents colors + 16 duplicate color codes, ensuring backward compatibility). + * 8-bit Ansi colors (240 different colors + 16 duplicate color codes, ensuring backward compatibility). * Output syntax is: "ESC[38;5;${foreGroundColorcode};48;5;${backGroundColorcode}m" * Should be compatible with most terminals. */ @@ -78,25 +78,7 @@ private function convertFromRGB(int $r, int $g, int $b): int private function degradeHexColorToAnsi4(int $r, int $g, int $b): int { - if (0 === round($this->getSaturation($r, $g, $b) / 50)) { - return 0; - } - - return (int) ((round($b / 255) << 2) | (round($g / 255) << 1) | round($r / 255)); - } - - private function getSaturation(int $r, int $g, int $b): int - { - $r = $r / 255; - $g = $g / 255; - $b = $b / 255; - $v = max($r, $g, $b); - - if (0 === $diff = $v - min($r, $g, $b)) { - return 0; - } - - return (int) ((int) $diff * 100 / $v); + return round($b / 255) << 2 | (round($g / 255) << 1) | round($r / 255); } /** diff --git a/app/vendor/symfony/console/Output/BufferedOutput.php b/app/vendor/symfony/console/Output/BufferedOutput.php index 94d4e414a..ef5099bfd 100644 --- a/app/vendor/symfony/console/Output/BufferedOutput.php +++ b/app/vendor/symfony/console/Output/BufferedOutput.php @@ -29,6 +29,9 @@ public function fetch(): string return $content; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; diff --git a/app/vendor/symfony/console/Output/ConsoleOutput.php b/app/vendor/symfony/console/Output/ConsoleOutput.php index e3aa92c7f..c1eb7cd14 100644 --- a/app/vendor/symfony/console/Output/ConsoleOutput.php +++ b/app/vendor/symfony/console/Output/ConsoleOutput.php @@ -64,18 +64,27 @@ public function section(): ConsoleSectionOutput return new ConsoleSectionOutput($this->getStream(), $this->consoleSectionOutputs, $this->getVerbosity(), $this->isDecorated(), $this->getFormatter()); } + /** + * @return void + */ public function setDecorated(bool $decorated) { parent::setDecorated($decorated); $this->stderr->setDecorated($decorated); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { parent::setFormatter($formatter); $this->stderr->setFormatter($formatter); } + /** + * @return void + */ public function setVerbosity(int $level) { parent::setVerbosity($level); @@ -87,6 +96,9 @@ public function getErrorOutput(): OutputInterface return $this->stderr; } + /** + * @return void + */ public function setErrorOutput(OutputInterface $error) { $this->stderr = $error; diff --git a/app/vendor/symfony/console/Output/ConsoleOutputInterface.php b/app/vendor/symfony/console/Output/ConsoleOutputInterface.php index 6b4babc6d..9c0049c8f 100644 --- a/app/vendor/symfony/console/Output/ConsoleOutputInterface.php +++ b/app/vendor/symfony/console/Output/ConsoleOutputInterface.php @@ -24,6 +24,9 @@ interface ConsoleOutputInterface extends OutputInterface */ public function getErrorOutput(): OutputInterface; + /** + * @return void + */ public function setErrorOutput(OutputInterface $error); public function section(): ConsoleSectionOutput; diff --git a/app/vendor/symfony/console/Output/ConsoleSectionOutput.php b/app/vendor/symfony/console/Output/ConsoleSectionOutput.php index c813c811c..21c4a44a8 100644 --- a/app/vendor/symfony/console/Output/ConsoleSectionOutput.php +++ b/app/vendor/symfony/console/Output/ConsoleSectionOutput.php @@ -48,9 +48,9 @@ public function __construct($stream, array &$sections, int $verbosity, bool $dec public function setMaxHeight(int $maxHeight): void { // when changing max height, clear output of current section and redraw again with the new height - $existingContent = $this->popStreamContentUntilCurrentSection($this->maxHeight ? min($this->maxHeight, $this->lines) : $this->lines); - + $previousMaxHeight = $this->maxHeight; $this->maxHeight = $maxHeight; + $existingContent = $this->popStreamContentUntilCurrentSection($previousMaxHeight ? min($previousMaxHeight, $this->lines) : $this->lines); parent::doWrite($this->getVisibleContent(), false); parent::doWrite($existingContent, false); @@ -60,6 +60,8 @@ public function setMaxHeight(int $maxHeight): void * Clears previous output for this section. * * @param int $lines Number of lines to clear. If null, then the entire output of this section is cleared + * + * @return void */ public function clear(int $lines = null) { @@ -81,6 +83,8 @@ public function clear(int $lines = null) /** * Overwrites the previous output with a new message. + * + * @return void */ public function overwrite(string|iterable $message) { @@ -115,8 +119,7 @@ public function addContent(string $input, bool $newline = true): int // re-add the line break (that has been removed in the above `explode()` for // - every line that is not the last line // - if $newline is required, also add it to the last line - // - if it's not new line, but input ending with `\PHP_EOL` - if ($i < $count || $newline || str_ends_with($input, \PHP_EOL)) { + if ($i < $count || $newline) { $lineContent .= \PHP_EOL; } @@ -153,14 +156,23 @@ public function addContent(string $input, bool $newline = true): int /** * @internal */ - public function addNewLineOfInputSubmit() + public function addNewLineOfInputSubmit(): void { $this->content[] = \PHP_EOL; ++$this->lines; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { + // Simulate newline behavior for consistent output formatting, avoiding extra logic + if (!$newline && str_ends_with($message, \PHP_EOL)) { + $message = substr($message, 0, -\strlen(\PHP_EOL)); + $newline = true; + } + if (!$this->isDecorated()) { parent::doWrite($message, $newline); @@ -206,7 +218,7 @@ private function popStreamContentUntilCurrentSection(int $numberOfLinesToClearFr break; } - $numberOfLinesToClear += $section->lines; + $numberOfLinesToClear += $section->maxHeight ? min($section->lines, $section->maxHeight) : $section->lines; if ('' !== $sectionContent = $section->getVisibleContent()) { if (!str_ends_with($sectionContent, \PHP_EOL)) { $sectionContent .= \PHP_EOL; diff --git a/app/vendor/symfony/console/Output/NullOutput.php b/app/vendor/symfony/console/Output/NullOutput.php index 4884cbad9..f3aa15b1d 100644 --- a/app/vendor/symfony/console/Output/NullOutput.php +++ b/app/vendor/symfony/console/Output/NullOutput.php @@ -26,6 +26,9 @@ class NullOutput implements OutputInterface { private NullOutputFormatter $formatter; + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { // do nothing @@ -37,6 +40,9 @@ public function getFormatter(): OutputFormatterInterface return $this->formatter ??= new NullOutputFormatter(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { // do nothing @@ -47,6 +53,9 @@ public function isDecorated(): bool return false; } + /** + * @return void + */ public function setVerbosity(int $level) { // do nothing @@ -77,11 +86,17 @@ public function isDebug(): bool return false; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL) { // do nothing } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) { // do nothing diff --git a/app/vendor/symfony/console/Output/Output.php b/app/vendor/symfony/console/Output/Output.php index 4cb71acba..3a06311a8 100644 --- a/app/vendor/symfony/console/Output/Output.php +++ b/app/vendor/symfony/console/Output/Output.php @@ -44,6 +44,9 @@ public function __construct(?int $verbosity = self::VERBOSITY_NORMAL, bool $deco $this->formatter->setDecorated($decorated); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { $this->formatter = $formatter; @@ -54,6 +57,9 @@ public function getFormatter(): OutputFormatterInterface return $this->formatter; } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->formatter->setDecorated($decorated); @@ -64,6 +70,9 @@ public function isDecorated(): bool return $this->formatter->isDecorated(); } + /** + * @return void + */ public function setVerbosity(int $level) { $this->verbosity = $level; @@ -94,11 +103,17 @@ public function isDebug(): bool return self::VERBOSITY_DEBUG <= $this->verbosity; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $options = self::OUTPUT_NORMAL) { $this->write($messages, true, $options); } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $options = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -133,6 +148,8 @@ public function write(string|iterable $messages, bool $newline = false, int $opt /** * Writes a message to the output. + * + * @return void */ abstract protected function doWrite(string $message, bool $newline); } diff --git a/app/vendor/symfony/console/Output/OutputInterface.php b/app/vendor/symfony/console/Output/OutputInterface.php index bc927c51e..fb1557720 100644 --- a/app/vendor/symfony/console/Output/OutputInterface.php +++ b/app/vendor/symfony/console/Output/OutputInterface.php @@ -36,6 +36,8 @@ interface OutputInterface * @param bool $newline Whether to add a newline * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), * 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + * + * @return void */ public function write(string|iterable $messages, bool $newline = false, int $options = 0); @@ -44,11 +46,15 @@ public function write(string|iterable $messages, bool $newline = false, int $opt * * @param int $options A bitmask of options (one of the OUTPUT or VERBOSITY constants), * 0 is considered the same as self::OUTPUT_NORMAL | self::VERBOSITY_NORMAL + * + * @return void */ public function writeln(string|iterable $messages, int $options = 0); /** * Sets the verbosity of the output. + * + * @return void */ public function setVerbosity(int $level); @@ -79,6 +85,8 @@ public function isDebug(): bool; /** * Sets the decorated flag. + * + * @return void */ public function setDecorated(bool $decorated); @@ -87,6 +95,9 @@ public function setDecorated(bool $decorated); */ public function isDecorated(): bool; + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter); /** diff --git a/app/vendor/symfony/console/Output/StreamOutput.php b/app/vendor/symfony/console/Output/StreamOutput.php index 9ec524e4d..155066ea0 100644 --- a/app/vendor/symfony/console/Output/StreamOutput.php +++ b/app/vendor/symfony/console/Output/StreamOutput.php @@ -62,6 +62,9 @@ public function getStream() return $this->stream; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { if ($newline) { diff --git a/app/vendor/symfony/console/Output/TrimmedBufferOutput.php b/app/vendor/symfony/console/Output/TrimmedBufferOutput.php index 1ca5a13e8..b00445ece 100644 --- a/app/vendor/symfony/console/Output/TrimmedBufferOutput.php +++ b/app/vendor/symfony/console/Output/TrimmedBufferOutput.php @@ -45,6 +45,9 @@ public function fetch(): string return $content; } + /** + * @return void + */ protected function doWrite(string $message, bool $newline) { $this->buffer .= $message; diff --git a/app/vendor/symfony/console/Question/Question.php b/app/vendor/symfony/console/Question/Question.php index b06db9459..26896bb53 100644 --- a/app/vendor/symfony/console/Question/Question.php +++ b/app/vendor/symfony/console/Question/Question.php @@ -146,12 +146,11 @@ public function setAutocompleterValues(?iterable $values): static if (\is_array($values)) { $values = $this->isAssoc($values) ? array_merge(array_keys($values), array_values($values)) : array_values($values); - $callback = static function () use ($values) { - return $values; - }; + $callback = static fn () => $values; } elseif ($values instanceof \Traversable) { - $valueCache = null; - $callback = static function () use ($values, &$valueCache) { + $callback = static function () use ($values) { + static $valueCache; + return $valueCache ??= iterator_to_array($values, false); }; } else { @@ -267,6 +266,9 @@ public function getNormalizer(): ?callable return $this->normalizer; } + /** + * @return bool + */ protected function isAssoc(array $array) { return (bool) \count(array_filter(array_keys($array), 'is_string')); diff --git a/app/vendor/symfony/console/README.md b/app/vendor/symfony/console/README.md index c89b4a1a2..bfd488109 100644 --- a/app/vendor/symfony/console/README.md +++ b/app/vendor/symfony/console/README.md @@ -4,6 +4,18 @@ Console Component The Console component eases the creation of beautiful and testable command line interfaces. +Sponsor +------- + +The Console component for Symfony 6.3 is [backed][1] by [Les-Tilleuls.coop][2]. + +Les-Tilleuls.coop is a team of 70+ Symfony experts who can help you design, develop and +fix your projects. They provide a wide range of professional services including development, +consulting, coaching, training and audits. They also are highly skilled in JS, Go and DevOps. +They are a worker cooperative! + +Help Symfony by [sponsoring][3] its development! + Resources --------- @@ -18,3 +30,7 @@ Credits `Resources/bin/hiddeninput.exe` is a third party binary provided within this component. Find sources and license at https://github.com/Seldaek/hidden-input. + +[1]: https://symfony.com/backers +[2]: https://les-tilleuls.coop +[3]: https://symfony.com/sponsor diff --git a/app/vendor/symfony/console/Resources/completion.bash b/app/vendor/symfony/console/Resources/completion.bash index ad69eab0f..0d76eacc3 100644 --- a/app/vendor/symfony/console/Resources/completion.bash +++ b/app/vendor/symfony/console/Resources/completion.bash @@ -6,6 +6,16 @@ # https://symfony.com/doc/current/contributing/code/license.html _sf_{{ COMMAND_NAME }}() { + + # Use the default completion for shell redirect operators. + for w in '>' '>>' '&>' '<'; do + if [[ $w = "${COMP_WORDS[COMP_CWORD-1]}" ]]; then + compopt -o filenames + COMPREPLY=($(compgen -f -- "${COMP_WORDS[COMP_CWORD]}")) + return 0 + fi + done + # Use newline as only separator to allow space in completion values IFS=$'\n' local sf_cmd="${COMP_WORDS[0]}" diff --git a/app/vendor/symfony/console/Resources/completion.zsh b/app/vendor/symfony/console/Resources/completion.zsh index 97a9e88cd..ff76fe5fa 100644 --- a/app/vendor/symfony/console/Resources/completion.zsh +++ b/app/vendor/symfony/console/Resources/completion.zsh @@ -1,3 +1,5 @@ +#compdef {{ COMMAND_NAME }} + # This file is part of the Symfony package. # # (c) Fabien Potencier diff --git a/app/vendor/symfony/console/Style/OutputStyle.php b/app/vendor/symfony/console/Style/OutputStyle.php index b694bb53a..ddfa8decc 100644 --- a/app/vendor/symfony/console/Style/OutputStyle.php +++ b/app/vendor/symfony/console/Style/OutputStyle.php @@ -30,6 +30,9 @@ public function __construct(OutputInterface $output) $this->output = $output; } + /** + * @return void + */ public function newLine(int $count = 1) { $this->output->write(str_repeat(\PHP_EOL, $count)); @@ -40,16 +43,25 @@ public function createProgressBar(int $max = 0): ProgressBar return new ProgressBar($this->output, $max); } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) { $this->output->write($messages, $newline, $type); } + /** + * @return void + */ public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL) { $this->output->writeln($messages, $type); } + /** + * @return void + */ public function setVerbosity(int $level) { $this->output->setVerbosity($level); @@ -60,6 +72,9 @@ public function getVerbosity(): int return $this->output->getVerbosity(); } + /** + * @return void + */ public function setDecorated(bool $decorated) { $this->output->setDecorated($decorated); @@ -70,6 +85,9 @@ public function isDecorated(): bool return $this->output->isDecorated(); } + /** + * @return void + */ public function setFormatter(OutputFormatterInterface $formatter) { $this->output->setFormatter($formatter); @@ -100,6 +118,9 @@ public function isDebug(): bool return $this->output->isDebug(); } + /** + * @return OutputInterface + */ protected function getErrorOutput() { if (!$this->output instanceof ConsoleOutputInterface) { diff --git a/app/vendor/symfony/console/Style/StyleInterface.php b/app/vendor/symfony/console/Style/StyleInterface.php index 0bb123394..e25a65bd2 100644 --- a/app/vendor/symfony/console/Style/StyleInterface.php +++ b/app/vendor/symfony/console/Style/StyleInterface.php @@ -20,51 +20,71 @@ interface StyleInterface { /** * Formats a command title. + * + * @return void */ public function title(string $message); /** * Formats a section title. + * + * @return void */ public function section(string $message); /** * Formats a list. + * + * @return void */ public function listing(array $elements); /** * Formats informational text. + * + * @return void */ public function text(string|array $message); /** * Formats a success result bar. + * + * @return void */ public function success(string|array $message); /** * Formats an error result bar. + * + * @return void */ public function error(string|array $message); /** * Formats an warning result bar. + * + * @return void */ public function warning(string|array $message); /** * Formats a note admonition. + * + * @return void */ public function note(string|array $message); /** * Formats a caution admonition. + * + * @return void */ public function caution(string|array $message); /** * Formats a table. + * + * @return void */ public function table(array $headers, array $rows); @@ -90,21 +110,29 @@ public function choice(string $question, array $choices, mixed $default = null): /** * Add newline(s). + * + * @return void */ public function newLine(int $count = 1); /** * Starts the progress output. + * + * @return void */ public function progressStart(int $max = 0); /** * Advances the progress output X steps. + * + * @return void */ public function progressAdvance(int $step = 1); /** * Finishes the progress output. + * + * @return void */ public function progressFinish(); } diff --git a/app/vendor/symfony/console/Style/SymfonyStyle.php b/app/vendor/symfony/console/Style/SymfonyStyle.php index 8fd6f849f..cecce6c01 100644 --- a/app/vendor/symfony/console/Style/SymfonyStyle.php +++ b/app/vendor/symfony/console/Style/SymfonyStyle.php @@ -60,6 +60,8 @@ public function __construct(InputInterface $input, OutputInterface $output) /** * Formats a message as a block of text. + * + * @return void */ public function block(string|array $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) { @@ -70,6 +72,9 @@ public function block(string|array $messages, string $type = null, string $style $this->newLine(); } + /** + * @return void + */ public function title(string $message) { $this->autoPrependBlock(); @@ -80,6 +85,9 @@ public function title(string $message) $this->newLine(); } + /** + * @return void + */ public function section(string $message) { $this->autoPrependBlock(); @@ -90,17 +98,21 @@ public function section(string $message) $this->newLine(); } + /** + * @return void + */ public function listing(array $elements) { $this->autoPrependText(); - $elements = array_map(function ($element) { - return sprintf(' * %s', $element); - }, $elements); + $elements = array_map(fn ($element) => sprintf(' * %s', $element), $elements); $this->writeln($elements); $this->newLine(); } + /** + * @return void + */ public function text(string|array $message) { $this->autoPrependText(); @@ -113,27 +125,41 @@ public function text(string|array $message) /** * Formats a command comment. + * + * @return void */ public function comment(string|array $message) { $this->block($message, null, null, ' // ', false, false); } + /** + * @return void + */ public function success(string|array $message) { $this->block($message, 'OK', 'fg=black;bg=green', ' ', true); } + /** + * @return void + */ public function error(string|array $message) { $this->block($message, 'ERROR', 'fg=white;bg=red', ' ', true); } + /** + * @return void + */ public function warning(string|array $message) { $this->block($message, 'WARNING', 'fg=black;bg=yellow', ' ', true); } + /** + * @return void + */ public function note(string|array $message) { $this->block($message, 'NOTE', 'fg=yellow', ' ! '); @@ -141,17 +167,25 @@ public function note(string|array $message) /** * Formats an info message. + * + * @return void */ public function info(string|array $message) { $this->block($message, 'INFO', 'fg=green', ' ', true); } + /** + * @return void + */ public function caution(string|array $message) { $this->block($message, 'CAUTION', 'fg=white;bg=red', ' ! ', true); } + /** + * @return void + */ public function table(array $headers, array $rows) { $this->createTable() @@ -165,6 +199,8 @@ public function table(array $headers, array $rows) /** * Formats a horizontal table. + * + * @return void */ public function horizontalTable(array $headers, array $rows) { @@ -185,6 +221,8 @@ public function horizontalTable(array $headers, array $rows) * * 'A title' * * ['key' => 'value'] * * new TableSeparator() + * + * @return void */ public function definitionList(string|array|TableSeparator ...$list) { @@ -247,17 +285,26 @@ public function choice(string $question, array $choices, mixed $default = null, return $this->askQuestion($questionChoice); } + /** + * @return void + */ public function progressStart(int $max = 0) { $this->progressBar = $this->createProgressBar($max); $this->progressBar->start(); } + /** + * @return void + */ public function progressAdvance(int $step = 1) { $this->getProgressBar()->advance($step); } + /** + * @return void + */ public function progressFinish() { $this->getProgressBar()->finish(); @@ -311,6 +358,9 @@ public function askQuestion(Question $question): mixed return $answer; } + /** + * @return void + */ public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -323,6 +373,9 @@ public function writeln(string|iterable $messages, int $type = self::OUTPUT_NORM } } + /** + * @return void + */ public function write(string|iterable $messages, bool $newline = false, int $type = self::OUTPUT_NORMAL) { if (!is_iterable($messages)) { @@ -335,6 +388,9 @@ public function write(string|iterable $messages, bool $newline = false, int $typ } } + /** + * @return void + */ public function newLine(int $count = 1) { parent::newLine($count); @@ -381,7 +437,7 @@ private function autoPrependText(): void { $fetched = $this->bufferedOutput->fetch(); // Prepend new line if last char isn't EOL: - if (!str_ends_with($fetched, "\n")) { + if ($fetched && !str_ends_with($fetched, "\n")) { $this->newLine(); } } diff --git a/app/vendor/symfony/console/Terminal.php b/app/vendor/symfony/console/Terminal.php index 216c609fa..3eda0376b 100644 --- a/app/vendor/symfony/console/Terminal.php +++ b/app/vendor/symfony/console/Terminal.php @@ -123,20 +123,19 @@ public static function hasSttyAvailable(): bool return self::$stty; } - // skip check if exec function is disabled - if (!\function_exists('exec')) { + // skip check if shell_exec function is disabled + if (!\function_exists('shell_exec')) { return false; } - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = 0 === $exitcode; + return self::$stty = (bool) shell_exec('stty 2> '.('\\' === \DIRECTORY_SEPARATOR ? 'NUL' : '/dev/null')); } - private static function initDimensions() + private static function initDimensions(): void { if ('\\' === \DIRECTORY_SEPARATOR) { - if (preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim(getenv('ANSICON')), $matches)) { + $ansicon = getenv('ANSICON'); + if (false !== $ansicon && preg_match('/^(\d+)x(\d+)(?: \((\d+)x(\d+)\))?$/', trim($ansicon), $matches)) { // extract [w, H] from "wxh (WxH)" // or [w, h] from "wxh" self::$width = (int) $matches[1]; @@ -166,7 +165,7 @@ private static function hasVt100Support(): bool /** * Initializes dimensions using the output of an stty columns line. */ - private static function initDimensionsUsingStty() + private static function initDimensionsUsingStty(): void { if ($sttyString = self::getSttyColumns()) { if (preg_match('/rows.(\d+);.columns.(\d+);/is', $sttyString, $matches)) { @@ -216,6 +215,8 @@ private static function readFromProcess(string|array $command): ?string 2 => ['pipe', 'w'], ]; + $cp = \function_exists('sapi_windows_cp_set') ? sapi_windows_cp_get() : 0; + $process = proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); if (!\is_resource($process)) { return null; @@ -226,6 +227,10 @@ private static function readFromProcess(string|array $command): ?string fclose($pipes[2]); proc_close($process); + if ($cp) { + sapi_windows_cp_set($cp); + } + return $info; } } diff --git a/app/vendor/symfony/console/Tester/TesterTrait.php b/app/vendor/symfony/console/Tester/TesterTrait.php index 9670a4968..497b8c8c7 100644 --- a/app/vendor/symfony/console/Tester/TesterTrait.php +++ b/app/vendor/symfony/console/Tester/TesterTrait.php @@ -128,7 +128,7 @@ public function setInputs(array $inputs): static * * verbosity: Sets the output verbosity flag * * capture_stderr_separately: Make output of stdOut and stdErr separately available */ - private function initOutput(array $options) + private function initOutput(array $options): void { $this->captureStreamsIndependently = \array_key_exists('capture_stderr_separately', $options) && $options['capture_stderr_separately']; if (!$this->captureStreamsIndependently) { diff --git a/app/vendor/symfony/console/composer.json b/app/vendor/symfony/console/composer.json index 6cc6166d5..c34421299 100644 --- a/app/vendor/symfony/console/composer.json +++ b/app/vendor/symfony/console/composer.json @@ -17,9 +17,9 @@ ], "require": { "php": ">=8.1", - "symfony/deprecation-contracts": "^2.1|^3", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^1.1|^2|^3", + "symfony/service-contracts": "^2.5|^3", "symfony/string": "^5.4|^6.0" }, "require-dev": { @@ -34,12 +34,6 @@ "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, - "suggest": { - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "", - "psr/log": "For using the console logger" - }, "conflict": { "symfony/dependency-injection": "<5.4", "symfony/dotenv": "<5.4", diff --git a/app/vendor/symfony/deprecation-contracts/composer.json b/app/vendor/symfony/deprecation-contracts/composer.json index 774200fdc..c6d02d874 100644 --- a/app/vendor/symfony/deprecation-contracts/composer.json +++ b/app/vendor/symfony/deprecation-contracts/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/app/vendor/symfony/filesystem/Filesystem.php b/app/vendor/symfony/filesystem/Filesystem.php index c7f3dd295..a379ce186 100644 --- a/app/vendor/symfony/filesystem/Filesystem.php +++ b/app/vendor/symfony/filesystem/Filesystem.php @@ -31,6 +31,8 @@ class Filesystem * If the target file is newer, it is overwritten only when the * $overwriteNewerFiles option is set to true. * + * @return void + * * @throws FileNotFoundException When originFile doesn't exist * @throws IOException When copy fails */ @@ -82,6 +84,8 @@ public function copy(string $originFile, string $targetFile, bool $overwriteNewe /** * Creates a directory recursively. * + * @return void + * * @throws IOException On any directory creation failure */ public function mkdir(string|iterable $dirs, int $mode = 0777) @@ -123,6 +127,8 @@ public function exists(string|iterable $files): bool * @param int|null $time The touch time as a Unix timestamp, if not supplied the current system time is used * @param int|null $atime The access time as a Unix timestamp, if not supplied the current system time is used * + * @return void + * * @throws IOException When touch fails */ public function touch(string|iterable $files, int $time = null, int $atime = null) @@ -137,6 +143,8 @@ public function touch(string|iterable $files, int $time = null, int $atime = nul /** * Removes files or directories. * + * @return void + * * @throws IOException When removal fails */ public function remove(string|iterable $files) @@ -161,7 +169,7 @@ private static function doRemove(array $files, bool $isRecursive): void } } elseif (is_dir($file)) { if (!$isRecursive) { - $tmpName = \dirname(realpath($file)).'/.'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-.')); + $tmpName = \dirname(realpath($file)).'/.'.strrev(strtr(base64_encode(random_bytes(2)), '/=', '-_')); if (file_exists($tmpName)) { try { @@ -203,12 +211,14 @@ private static function doRemove(array $files, bool $isRecursive): void * @param int $umask The mode mask (octal) * @param bool $recursive Whether change the mod recursively or not * + * @return void + * * @throws IOException When the change fails */ public function chmod(string|iterable $files, int $mode, int $umask = 0000, bool $recursive = false) { foreach ($this->toIterable($files) as $file) { - if (\is_int($mode) && !self::box('chmod', $file, $mode & ~$umask)) { + if (!self::box('chmod', $file, $mode & ~$umask)) { throw new IOException(sprintf('Failed to chmod file "%s": ', $file).self::$lastError, 0, null, $file); } if ($recursive && is_dir($file) && !is_link($file)) { @@ -223,6 +233,8 @@ public function chmod(string|iterable $files, int $mode, int $umask = 0000, bool * @param string|int $user A user name or number * @param bool $recursive Whether change the owner recursively or not * + * @return void + * * @throws IOException When the change fails */ public function chown(string|iterable $files, string|int $user, bool $recursive = false) @@ -249,6 +261,8 @@ public function chown(string|iterable $files, string|int $user, bool $recursive * @param string|int $group A group name or number * @param bool $recursive Whether change the group recursively or not * + * @return void + * * @throws IOException When the change fails */ public function chgrp(string|iterable $files, string|int $group, bool $recursive = false) @@ -272,6 +286,8 @@ public function chgrp(string|iterable $files, string|int $group, bool $recursive /** * Renames a file or a directory. * + * @return void + * * @throws IOException When target file or directory already exists * @throws IOException When origin cannot be renamed */ @@ -313,6 +329,8 @@ private function isReadable(string $filename): bool /** * Creates a symbolic link or copy a directory. * + * @return void + * * @throws IOException When symlink fails */ public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false) @@ -349,6 +367,8 @@ public function symlink(string $originDir, string $targetDir, bool $copyOnWindow * * @param string|string[] $targetFiles The target file(s) * + * @return void + * * @throws FileNotFoundException When original file is missing or not a file * @throws IOException When link fails, including if link already exists */ @@ -381,7 +401,7 @@ public function hardlink(string $originFile, string|iterable $targetFiles) /** * @param string $linkType Name of the link type, typically 'symbolic' or 'hard' */ - private function linkException(string $origin, string $target, string $linkType) + private function linkException(string $origin, string $target, string $linkType): never { if (self::$lastError) { if ('\\' === \DIRECTORY_SEPARATOR && str_contains(self::$lastError, 'error code(1314)')) { @@ -438,11 +458,9 @@ public function makePathRelative(string $endPath, string $startPath): string $startPath = str_replace('\\', '/', $startPath); } - $splitDriveLetter = function ($path) { - return (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) - ? [substr($path, 2), strtoupper($path[0])] - : [$path, null]; - }; + $splitDriveLetter = fn ($path) => (\strlen($path) > 2 && ':' === $path[1] && '/' === $path[2] && ctype_alpha($path[0])) + ? [substr($path, 2), strtoupper($path[0])] + : [$path, null]; $splitPath = function ($path) { $result = []; @@ -508,6 +526,8 @@ public function makePathRelative(string $endPath, string $startPath): string * - $options['copy_on_windows'] Whether to copy files instead of links on Windows (see symlink(), defaults to false) * - $options['delete'] Whether to delete files that are not in the source directory (defaults to false) * + * @return void + * * @throws IOException When file type is unknown */ public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) @@ -632,6 +652,8 @@ public function tempnam(string $dir, string $prefix, string $suffix = ''): strin * * @param string|resource $content The data to write into the file * + * @return void + * * @throws IOException if the file cannot be written to */ public function dumpFile(string $filename, $content) @@ -642,6 +664,12 @@ public function dumpFile(string $filename, $content) $dir = \dirname($filename); + if (is_link($filename) && $linkTarget = $this->readlink($filename)) { + $this->dumpFile(Path::makeAbsolute($linkTarget, $dir), $content); + + return; + } + if (!is_dir($dir)) { $this->mkdir($dir); } @@ -671,6 +699,8 @@ public function dumpFile(string $filename, $content) * @param string|resource $content The content to append * @param bool $lock Whether the file should be locked when writing to it * + * @return void + * * @throws IOException If the file is not writable */ public function appendToFile(string $filename, $content/* , bool $lock = false */) @@ -730,7 +760,7 @@ private static function box(string $func, mixed ...$args): mixed /** * @internal */ - public static function handleError(int $type, string $msg) + public static function handleError(int $type, string $msg): void { self::$lastError = $msg; } diff --git a/app/vendor/symfony/finder/Finder.php b/app/vendor/symfony/finder/Finder.php index 7baecdf90..a3bf9a1a7 100644 --- a/app/vendor/symfony/finder/Finder.php +++ b/app/vendor/symfony/finder/Finder.php @@ -162,8 +162,8 @@ public function date(string|array $dates): static * * You can use patterns (delimited with / sign), globs or simple strings. * - * $finder->name('*.php') - * $finder->name('/\.php$/') // same as above + * $finder->name('/\.php$/') + * $finder->name('*.php') // same as above, without dot files * $finder->name('test.php') * $finder->name(['test.py', 'test.php']) * @@ -396,6 +396,8 @@ public function ignoreVCSIgnored(bool $ignoreVCSIgnored): static * @see ignoreVCS() * * @param string|string[] $pattern VCS patterns to ignore + * + * @return void */ public static function addVCSPattern(string|array $pattern) { @@ -671,9 +673,7 @@ public function getIterator(): \Iterator $iterator = new \AppendIterator(); foreach ($this->dirs as $dir) { - $iterator->append(new \IteratorIterator(new LazyIterator(function () use ($dir) { - return $this->searchInDirectory($dir); - }))); + $iterator->append(new \IteratorIterator(new LazyIterator(fn () => $this->searchInDirectory($dir)))); } foreach ($this->iterators as $it) { diff --git a/app/vendor/symfony/finder/Gitignore.php b/app/vendor/symfony/finder/Gitignore.php index 070074b3b..bf05c5b37 100644 --- a/app/vendor/symfony/finder/Gitignore.php +++ b/app/vendor/symfony/finder/Gitignore.php @@ -79,9 +79,7 @@ private static function lineToRegex(string $gitignoreLine): string } $regex = preg_quote(str_replace('\\', '', $gitignoreLine), '~'); - $regex = preg_replace_callback('~\\\\\[((?:\\\\!)?)([^\[\]]*)\\\\\]~', function (array $matches): string { - return '['.('' !== $matches[1] ? '^' : '').str_replace('\\-', '-', $matches[2]).']'; - }, $regex); + $regex = preg_replace_callback('~\\\\\[((?:\\\\!)?)([^\[\]]*)\\\\\]~', fn (array $matches): string => '['.('' !== $matches[1] ? '^' : '').str_replace('\\-', '-', $matches[2]).']', $regex); $regex = preg_replace('~(?:(?:\\\\\*){2,}(/?))+~', '(?:(?:(?!//).(?ignoreUnreadableDirs = $this->ignoreUnreadableDirs; // performance optimization to avoid redoing the same work in all children - $children->rewindable = &$this->rewindable; $children->rootPath = $this->rootPath; } @@ -112,36 +111,23 @@ public function getChildren(): \RecursiveDirectoryIterator } } - /** - * Do nothing for non rewindable stream. - */ - public function rewind(): void + public function next(): void { - if (false === $this->isRewindable()) { - return; - } + $this->ignoreFirstRewind = false; - parent::rewind(); + parent::next(); } - /** - * Checks if the stream is rewindable. - */ - public function isRewindable(): bool + public function rewind(): void { - if (null !== $this->rewindable) { - return $this->rewindable; - } - - if (false !== $stream = @opendir($this->getPath())) { - $infos = stream_get_meta_data($stream); - closedir($stream); + // some streams like FTP are not rewindable, ignore the first rewind after creation, + // as newly created DirectoryIterator does not need to be rewound + if ($this->ignoreFirstRewind) { + $this->ignoreFirstRewind = false; - if ($infos['seekable']) { - return $this->rewindable = true; - } + return; } - return $this->rewindable = false; + parent::rewind(); } } diff --git a/app/vendor/symfony/finder/Iterator/SortableIterator.php b/app/vendor/symfony/finder/Iterator/SortableIterator.php index e8b556502..177cd0b60 100644 --- a/app/vendor/symfony/finder/Iterator/SortableIterator.php +++ b/app/vendor/symfony/finder/Iterator/SortableIterator.php @@ -48,21 +48,13 @@ public function __construct(\Traversable $iterator, int|callable $sort, bool $re $order = $reverseOrder ? -1 : 1; if (self::SORT_BY_NAME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_NATURAL === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_CASE_INSENSITIVE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_NAME_NATURAL_CASE_INSENSITIVE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcasecmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); } elseif (self::SORT_BY_TYPE === $sort) { $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { if ($a->isDir() && $b->isFile()) { @@ -74,29 +66,19 @@ public function __construct(\Traversable $iterator, int|callable $sort, bool $re return $order * strcmp($a->getRealPath() ?: $a->getPathname(), $b->getRealPath() ?: $b->getPathname()); }; } elseif (self::SORT_BY_ACCESSED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getATime() - $b->getATime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getATime() - $b->getATime()); } elseif (self::SORT_BY_CHANGED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getCTime() - $b->getCTime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getCTime() - $b->getCTime()); } elseif (self::SORT_BY_MODIFIED_TIME === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getMTime() - $b->getMTime()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getMTime() - $b->getMTime()); } elseif (self::SORT_BY_EXTENSION === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * strnatcmp($a->getExtension(), $b->getExtension()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * strnatcmp($a->getExtension(), $b->getExtension()); } elseif (self::SORT_BY_SIZE === $sort) { - $this->sort = static function (\SplFileInfo $a, \SplFileInfo $b) use ($order) { - return $order * ($a->getSize() - $b->getSize()); - }; + $this->sort = static fn (\SplFileInfo $a, \SplFileInfo $b) => $order * ($a->getSize() - $b->getSize()); } elseif (self::SORT_BY_NONE === $sort) { $this->sort = $order; } elseif (\is_callable($sort)) { - $this->sort = $reverseOrder ? static function (\SplFileInfo $a, \SplFileInfo $b) use ($sort) { return -$sort($a, $b); } : $sort(...); + $this->sort = $reverseOrder ? static fn (\SplFileInfo $a, \SplFileInfo $b) => -$sort($a, $b) : $sort(...); } else { throw new \InvalidArgumentException('The SortableIterator takes a PHP callable or a valid built-in sort algorithm as an argument.'); } diff --git a/app/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php b/app/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php index 29fc2d99b..7e6051d38 100644 --- a/app/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php +++ b/app/vendor/symfony/finder/Iterator/VcsIgnoredFilterIterator.php @@ -126,9 +126,7 @@ private function parentDirectoriesUpTo(string $from, string $upTo): array { return array_filter( $this->parentDirectoriesUpwards($from), - static function (string $directory) use ($upTo): bool { - return str_starts_with($directory, $upTo); - } + static fn (string $directory): bool => str_starts_with($directory, $upTo) ); } diff --git a/app/vendor/symfony/polyfill-ctype/LICENSE b/app/vendor/symfony/polyfill-ctype/LICENSE index 3f853aaf3..7536caeae 100644 --- a/app/vendor/symfony/polyfill-ctype/LICENSE +++ b/app/vendor/symfony/polyfill-ctype/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2019 Fabien Potencier +Copyright (c) 2018-present 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/app/vendor/symfony/polyfill-ctype/composer.json b/app/vendor/symfony/polyfill-ctype/composer.json index 1b3efff57..e5c978f15 100644 --- a/app/vendor/symfony/polyfill-ctype/composer.json +++ b/app/vendor/symfony/polyfill-ctype/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-intl-grapheme/LICENSE b/app/vendor/symfony/polyfill-intl-grapheme/LICENSE index 4cd8bdd30..6e3afce69 100644 --- a/app/vendor/symfony/polyfill-intl-grapheme/LICENSE +++ b/app/vendor/symfony/polyfill-intl-grapheme/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015-2019 Fabien Potencier +Copyright (c) 2015-present 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/app/vendor/symfony/polyfill-intl-grapheme/composer.json b/app/vendor/symfony/polyfill-intl-grapheme/composer.json index fde5537fc..c00d4e9e4 100644 --- a/app/vendor/symfony/polyfill-intl-grapheme/composer.json +++ b/app/vendor/symfony/polyfill-intl-grapheme/composer.json @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-intl-normalizer/LICENSE b/app/vendor/symfony/polyfill-intl-normalizer/LICENSE index 4cd8bdd30..6e3afce69 100644 --- a/app/vendor/symfony/polyfill-intl-normalizer/LICENSE +++ b/app/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015-2019 Fabien Potencier +Copyright (c) 2015-present 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/app/vendor/symfony/polyfill-intl-normalizer/composer.json b/app/vendor/symfony/polyfill-intl-normalizer/composer.json index 65f72d645..2c4de2c83 100644 --- a/app/vendor/symfony/polyfill-intl-normalizer/composer.json +++ b/app/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -29,7 +29,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-mbstring/LICENSE b/app/vendor/symfony/polyfill-mbstring/LICENSE index 4cd8bdd30..6e3afce69 100644 --- a/app/vendor/symfony/polyfill-mbstring/LICENSE +++ b/app/vendor/symfony/polyfill-mbstring/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015-2019 Fabien Potencier +Copyright (c) 2015-present 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/app/vendor/symfony/polyfill-mbstring/Mbstring.php b/app/vendor/symfony/polyfill-mbstring/Mbstring.php index bce5c4a84..2e0b96940 100644 --- a/app/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/app/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -69,7 +69,7 @@ final class Mbstring { public const MB_CASE_FOLD = \PHP_INT_MAX; - private const CASE_FOLD = [ + private const SIMPLE_CASE_FOLD = [ ['µ', 'ſ', "\xCD\x85", 'ς', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"], ['μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1", 'ι'], ]; @@ -301,7 +301,11 @@ public static function mb_convert_case($s, $mode, $encoding = null) $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { - $s = str_replace(self::CASE_FOLD[0], self::CASE_FOLD[1], $s); + static $caseFolding = null; + if (null === $caseFolding) { + $caseFolding = self::getData('caseFolding'); + } + $s = strtr($s, $caseFolding); } static $lower = null; @@ -406,6 +410,12 @@ public static function mb_encoding_aliases($encoding) public static function mb_check_encoding($var = null, $encoding = null) { + if (PHP_VERSION_ID < 70200 && \is_array($var)) { + trigger_error('mb_check_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING); + + return null; + } + if (null === $encoding) { if (null === $var) { return false; @@ -413,7 +423,21 @@ public static function mb_check_encoding($var = null, $encoding = null) $encoding = self::$internalEncoding; } - return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + if (!\is_array($var)) { + return self::mb_detect_encoding($var, [$encoding]) || false !== @iconv($encoding, $encoding, $var); + } + + foreach ($var as $key => $value) { + if (!self::mb_check_encoding($key, $encoding)) { + return false; + } + if (!self::mb_check_encoding($value, $encoding)) { + return false; + } + } + + return true; + } public static function mb_detect_encoding($str, $encodingList = null, $strict = false) @@ -638,8 +662,10 @@ public static function mb_substr($s, $start, $length = null, $encoding = null) public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + [$haystack, $needle] = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], [ + self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding), + self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding), + ]); return self::mb_strpos($haystack, $needle, $offset, $encoding); } @@ -674,8 +700,11 @@ public static function mb_strrichr($haystack, $needle, $part = false, $encoding public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { - $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); - $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); + $haystack = self::mb_convert_case($haystack, \MB_CASE_LOWER, $encoding); + $needle = self::mb_convert_case($needle, \MB_CASE_LOWER, $encoding); + + $haystack = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $haystack); + $needle = str_replace(self::SIMPLE_CASE_FOLD[0], self::SIMPLE_CASE_FOLD[1], $needle); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } @@ -798,6 +827,50 @@ public static function mb_ord($s, $encoding = null) return $code; } + public static function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = \STR_PAD_RIGHT, string $encoding = null): string + { + if (!\in_array($pad_type, [\STR_PAD_RIGHT, \STR_PAD_LEFT, \STR_PAD_BOTH], true)) { + throw new \ValueError('mb_str_pad(): Argument #4 ($pad_type) must be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH'); + } + + if (null === $encoding) { + $encoding = self::mb_internal_encoding(); + } + + try { + $validEncoding = @self::mb_check_encoding('', $encoding); + } catch (\ValueError $e) { + throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + // BC for PHP 7.3 and lower + if (!$validEncoding) { + throw new \ValueError(sprintf('mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given', $encoding)); + } + + if (self::mb_strlen($pad_string, $encoding) <= 0) { + throw new \ValueError('mb_str_pad(): Argument #3 ($pad_string) must be a non-empty string'); + } + + $paddingRequired = $length - self::mb_strlen($string, $encoding); + + if ($paddingRequired < 1) { + return $string; + } + + switch ($pad_type) { + case \STR_PAD_LEFT: + return self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding).$string; + case \STR_PAD_RIGHT: + return $string.self::mb_substr(str_repeat($pad_string, $paddingRequired), 0, $paddingRequired, $encoding); + default: + $leftPaddingLength = floor($paddingRequired / 2); + $rightPaddingLength = $paddingRequired - $leftPaddingLength; + + return self::mb_substr(str_repeat($pad_string, $leftPaddingLength), 0, $leftPaddingLength, $encoding).$string.self::mb_substr(str_repeat($pad_string, $rightPaddingLength), 0, $rightPaddingLength, $encoding); + } + } + private static function getSubpart($pos, $part, $haystack, $encoding) { if (false === $pos) { diff --git a/app/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php b/app/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php new file mode 100644 index 000000000..512bba0bf --- /dev/null +++ b/app/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php @@ -0,0 +1,119 @@ + 'i̇', + 'µ' => 'μ', + 'ſ' => 's', + 'ͅ' => 'ι', + 'ς' => 'σ', + 'ϐ' => 'β', + 'ϑ' => 'θ', + 'ϕ' => 'φ', + 'ϖ' => 'π', + 'ϰ' => 'κ', + 'ϱ' => 'ρ', + 'ϵ' => 'ε', + 'ẛ' => 'ṡ', + 'ι' => 'ι', + 'ß' => 'ss', + 'ʼn' => 'ʼn', + 'ǰ' => 'ǰ', + 'ΐ' => 'ΐ', + 'ΰ' => 'ΰ', + 'և' => 'եւ', + 'ẖ' => 'ẖ', + 'ẗ' => 'ẗ', + 'ẘ' => 'ẘ', + 'ẙ' => 'ẙ', + 'ẚ' => 'aʾ', + 'ẞ' => 'ss', + 'ὐ' => 'ὐ', + 'ὒ' => 'ὒ', + 'ὔ' => 'ὔ', + 'ὖ' => 'ὖ', + 'ᾀ' => 'ἀι', + 'ᾁ' => 'ἁι', + 'ᾂ' => 'ἂι', + 'ᾃ' => 'ἃι', + 'ᾄ' => 'ἄι', + 'ᾅ' => 'ἅι', + 'ᾆ' => 'ἆι', + 'ᾇ' => 'ἇι', + 'ᾈ' => 'ἀι', + 'ᾉ' => 'ἁι', + 'ᾊ' => 'ἂι', + 'ᾋ' => 'ἃι', + 'ᾌ' => 'ἄι', + 'ᾍ' => 'ἅι', + 'ᾎ' => 'ἆι', + 'ᾏ' => 'ἇι', + 'ᾐ' => 'ἠι', + 'ᾑ' => 'ἡι', + 'ᾒ' => 'ἢι', + 'ᾓ' => 'ἣι', + 'ᾔ' => 'ἤι', + 'ᾕ' => 'ἥι', + 'ᾖ' => 'ἦι', + 'ᾗ' => 'ἧι', + 'ᾘ' => 'ἠι', + 'ᾙ' => 'ἡι', + 'ᾚ' => 'ἢι', + 'ᾛ' => 'ἣι', + 'ᾜ' => 'ἤι', + 'ᾝ' => 'ἥι', + 'ᾞ' => 'ἦι', + 'ᾟ' => 'ἧι', + 'ᾠ' => 'ὠι', + 'ᾡ' => 'ὡι', + 'ᾢ' => 'ὢι', + 'ᾣ' => 'ὣι', + 'ᾤ' => 'ὤι', + 'ᾥ' => 'ὥι', + 'ᾦ' => 'ὦι', + 'ᾧ' => 'ὧι', + 'ᾨ' => 'ὠι', + 'ᾩ' => 'ὡι', + 'ᾪ' => 'ὢι', + 'ᾫ' => 'ὣι', + 'ᾬ' => 'ὤι', + 'ᾭ' => 'ὥι', + 'ᾮ' => 'ὦι', + 'ᾯ' => 'ὧι', + 'ᾲ' => 'ὰι', + 'ᾳ' => 'αι', + 'ᾴ' => 'άι', + 'ᾶ' => 'ᾶ', + 'ᾷ' => 'ᾶι', + 'ᾼ' => 'αι', + 'ῂ' => 'ὴι', + 'ῃ' => 'ηι', + 'ῄ' => 'ήι', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῆι', + 'ῌ' => 'ηι', + 'ῒ' => 'ῒ', + 'ῖ' => 'ῖ', + 'ῗ' => 'ῗ', + 'ῢ' => 'ῢ', + 'ῤ' => 'ῤ', + 'ῦ' => 'ῦ', + 'ῧ' => 'ῧ', + 'ῲ' => 'ὼι', + 'ῳ' => 'ωι', + 'ῴ' => 'ώι', + 'ῶ' => 'ῶ', + 'ῷ' => 'ῶι', + 'ῼ' => 'ωι', + 'ff' => 'ff', + 'fi' => 'fi', + 'fl' => 'fl', + 'ffi' => 'ffi', + 'ffl' => 'ffl', + 'ſt' => 'st', + 'st' => 'st', + 'ﬓ' => 'մն', + 'ﬔ' => 'մե', + 'ﬕ' => 'մի', + 'ﬖ' => 'վն', + 'ﬗ' => 'մխ', +]; diff --git a/app/vendor/symfony/polyfill-mbstring/bootstrap.php b/app/vendor/symfony/polyfill-mbstring/bootstrap.php index 1fedd1f7c..ecf1a0352 100644 --- a/app/vendor/symfony/polyfill-mbstring/bootstrap.php +++ b/app/vendor/symfony/polyfill-mbstring/bootstrap.php @@ -132,6 +132,10 @@ function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + if (extension_loaded('mbstring')) { return; } diff --git a/app/vendor/symfony/polyfill-mbstring/bootstrap80.php b/app/vendor/symfony/polyfill-mbstring/bootstrap80.php index 82f5ac4d0..2f9fb5b42 100644 --- a/app/vendor/symfony/polyfill-mbstring/bootstrap80.php +++ b/app/vendor/symfony/polyfill-mbstring/bootstrap80.php @@ -128,6 +128,10 @@ function mb_scrub(?string $string, ?string $encoding = null): string { $encoding function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = null): array { return p\Mbstring::mb_str_split((string) $string, (int) $length, $encoding); } } +if (!function_exists('mb_str_pad')) { + function mb_str_pad(string $string, int $length, string $pad_string = ' ', int $pad_type = STR_PAD_RIGHT, ?string $encoding = null): string { return p\Mbstring::mb_str_pad($string, $length, $pad_string, $pad_type, $encoding); } +} + if (extension_loaded('mbstring')) { return; } diff --git a/app/vendor/symfony/polyfill-mbstring/composer.json b/app/vendor/symfony/polyfill-mbstring/composer.json index 44895536b..943e50296 100644 --- a/app/vendor/symfony/polyfill-mbstring/composer.json +++ b/app/vendor/symfony/polyfill-mbstring/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-php73/LICENSE b/app/vendor/symfony/polyfill-php73/LICENSE index 3f853aaf3..7536caeae 100644 --- a/app/vendor/symfony/polyfill-php73/LICENSE +++ b/app/vendor/symfony/polyfill-php73/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2019 Fabien Potencier +Copyright (c) 2018-present 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/app/vendor/symfony/polyfill-php73/composer.json b/app/vendor/symfony/polyfill-php73/composer.json index b5c58ec19..48295ef97 100644 --- a/app/vendor/symfony/polyfill-php73/composer.json +++ b/app/vendor/symfony/polyfill-php73/composer.json @@ -26,7 +26,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-php80/LICENSE b/app/vendor/symfony/polyfill-php80/LICENSE index 5593b1d84..0ed3a2465 100644 --- a/app/vendor/symfony/polyfill-php80/LICENSE +++ b/app/vendor/symfony/polyfill-php80/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020 Fabien Potencier +Copyright (c) 2020-present 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/app/vendor/symfony/polyfill-php80/composer.json b/app/vendor/symfony/polyfill-php80/composer.json index bd9a3262a..f1801f403 100644 --- a/app/vendor/symfony/polyfill-php80/composer.json +++ b/app/vendor/symfony/polyfill-php80/composer.json @@ -30,7 +30,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/polyfill-php81/LICENSE b/app/vendor/symfony/polyfill-php81/LICENSE index efb17f98e..99c6bdf35 100644 --- a/app/vendor/symfony/polyfill-php81/LICENSE +++ b/app/vendor/symfony/polyfill-php81/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2021 Fabien Potencier +Copyright (c) 2021-present 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/app/vendor/symfony/polyfill-php81/README.md b/app/vendor/symfony/polyfill-php81/README.md index 7d8dd1907..c07ef7820 100644 --- a/app/vendor/symfony/polyfill-php81/README.md +++ b/app/vendor/symfony/polyfill-php81/README.md @@ -7,6 +7,7 @@ This component provides features added to PHP 8.1 core: - [`enum_exists`](https://php.net/enum-exists) - [`MYSQLI_REFRESH_REPLICA`](https://php.net/mysqli.constants#constantmysqli-refresh-replica) constant - [`ReturnTypeWillChange`](https://wiki.php.net/rfc/internal_method_return_types) +- [`CURLStringFile`](https://php.net/CURLStringFile) (but only if PHP >= 7.4 is used) More information can be found in the [main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). diff --git a/app/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php b/app/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php new file mode 100644 index 000000000..eb5952ee3 --- /dev/null +++ b/app/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +if (\PHP_VERSION_ID >= 70400 && extension_loaded('curl')) { + /** + * @property string $data + */ + class CURLStringFile extends CURLFile + { + private $data; + + public function __construct(string $data, string $postname, string $mime = 'application/octet-stream') + { + $this->data = $data; + parent::__construct('data://application/octet-stream;base64,'.base64_encode($data), $mime, $postname); + } + + public function __set(string $name, $value): void + { + if ('data' !== $name) { + $this->$name = $value; + + return; + } + + if (is_object($value) ? !method_exists($value, '__toString') : !is_scalar($value)) { + throw new \TypeError('Cannot assign '.gettype($value).' to property CURLStringFile::$data of type string'); + } + + $this->name = 'data://application/octet-stream;base64,'.base64_encode($value); + } + + public function __isset(string $name): bool + { + return isset($this->$name); + } + + public function &__get(string $name) + { + return $this->$name; + } + } +} diff --git a/app/vendor/symfony/polyfill-php81/composer.json b/app/vendor/symfony/polyfill-php81/composer.json index 149b59821..e02d673d4 100644 --- a/app/vendor/symfony/polyfill-php81/composer.json +++ b/app/vendor/symfony/polyfill-php81/composer.json @@ -26,7 +26,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/app/vendor/symfony/process/Exception/ProcessFailedException.php b/app/vendor/symfony/process/Exception/ProcessFailedException.php index 328acfde5..cf006daeb 100644 --- a/app/vendor/symfony/process/Exception/ProcessFailedException.php +++ b/app/vendor/symfony/process/Exception/ProcessFailedException.php @@ -47,6 +47,9 @@ public function __construct(Process $process) $this->process = $process; } + /** + * @return Process + */ public function getProcess() { return $this->process; diff --git a/app/vendor/symfony/process/Exception/ProcessTimedOutException.php b/app/vendor/symfony/process/Exception/ProcessTimedOutException.php index b052d72cb..e507ca309 100644 --- a/app/vendor/symfony/process/Exception/ProcessTimedOutException.php +++ b/app/vendor/symfony/process/Exception/ProcessTimedOutException.php @@ -38,22 +38,31 @@ public function __construct(Process $process, int $timeoutType) )); } + /** + * @return Process + */ public function getProcess() { return $this->process; } + /** + * @return bool + */ public function isGeneralTimeout() { return self::TYPE_GENERAL === $this->timeoutType; } + /** + * @return bool + */ public function isIdleTimeout() { return self::TYPE_IDLE === $this->timeoutType; } - public function getExceededTimeout() + public function getExceededTimeout(): ?float { return match ($this->timeoutType) { self::TYPE_GENERAL => $this->process->getTimeout(), diff --git a/app/vendor/symfony/process/ExecutableFinder.php b/app/vendor/symfony/process/ExecutableFinder.php index d9d111029..e3387dfe1 100644 --- a/app/vendor/symfony/process/ExecutableFinder.php +++ b/app/vendor/symfony/process/ExecutableFinder.php @@ -23,6 +23,8 @@ class ExecutableFinder /** * Replaces default suffixes of executable. + * + * @return void */ public function setSuffixes(array $suffixes) { @@ -31,6 +33,8 @@ public function setSuffixes(array $suffixes) /** * Adds new possible suffix to check for executable. + * + * @return void */ public function addSuffix(string $suffix) { diff --git a/app/vendor/symfony/process/InputStream.php b/app/vendor/symfony/process/InputStream.php index b8682baeb..086f5a9ed 100644 --- a/app/vendor/symfony/process/InputStream.php +++ b/app/vendor/symfony/process/InputStream.php @@ -23,12 +23,14 @@ class InputStream implements \IteratorAggregate { /** @var callable|null */ - private $onEmpty = null; + private $onEmpty; private $input = []; private $open = true; /** * Sets a callback that is called when the write buffer becomes empty. + * + * @return void */ public function onEmpty(callable $onEmpty = null) { @@ -40,6 +42,8 @@ public function onEmpty(callable $onEmpty = null) * * @param resource|string|int|float|bool|\Traversable|null $input The input to append as scalar, * stream resource or \Traversable + * + * @return void */ public function write(mixed $input) { @@ -54,6 +58,8 @@ public function write(mixed $input) /** * Closes the write buffer. + * + * @return void */ public function close() { @@ -62,6 +68,8 @@ public function close() /** * Tells whether the write buffer is closed or not. + * + * @return bool */ public function isClosed() { diff --git a/app/vendor/symfony/process/PhpExecutableFinder.php b/app/vendor/symfony/process/PhpExecutableFinder.php index 3fab03e38..9ab8ac23f 100644 --- a/app/vendor/symfony/process/PhpExecutableFinder.php +++ b/app/vendor/symfony/process/PhpExecutableFinder.php @@ -54,7 +54,7 @@ public function find(bool $includeArgs = true): string|false $args = $includeArgs && $args ? ' '.implode(' ', $args) : ''; // PHP_BINARY return the current sapi executable - if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cgi-fcgi', 'cli', 'cli-server', 'phpdbg'], true)) { + if (\PHP_BINARY && \in_array(\PHP_SAPI, ['cli', 'cli-server', 'phpdbg'], true)) { return \PHP_BINARY.$args; } diff --git a/app/vendor/symfony/process/PhpProcess.php b/app/vendor/symfony/process/PhpProcess.php index 486bc1dac..ef54a3d2b 100644 --- a/app/vendor/symfony/process/PhpProcess.php +++ b/app/vendor/symfony/process/PhpProcess.php @@ -55,6 +55,9 @@ public static function fromShellCommandline(string $command, string $cwd = null, throw new LogicException(sprintf('The "%s()" method cannot be called when using "%s".', __METHOD__, self::class)); } + /** + * @return void + */ public function start(callable $callback = null, array $env = []) { if (null === $this->getCommandLine()) { diff --git a/app/vendor/symfony/process/Pipes/AbstractPipes.php b/app/vendor/symfony/process/Pipes/AbstractPipes.php index 51d3af0b5..ba3a97a3f 100644 --- a/app/vendor/symfony/process/Pipes/AbstractPipes.php +++ b/app/vendor/symfony/process/Pipes/AbstractPipes.php @@ -41,7 +41,7 @@ public function __construct(mixed $input) } } - public function close() + public function close(): void { foreach ($this->pipes as $pipe) { if (\is_resource($pipe)) { @@ -66,7 +66,7 @@ protected function hasSystemCallBeenInterrupted(): bool /** * Unblocks streams. */ - protected function unblock() + protected function unblock(): void { if (!$this->blocked) { return; @@ -170,7 +170,7 @@ protected function write(): ?array /** * @internal */ - public function handleError(int $type, string $msg) + public function handleError(int $type, string $msg): void { $this->lastError = $msg; } diff --git a/app/vendor/symfony/process/Pipes/PipesInterface.php b/app/vendor/symfony/process/Pipes/PipesInterface.php index 50eb5c47e..967f8de7f 100644 --- a/app/vendor/symfony/process/Pipes/PipesInterface.php +++ b/app/vendor/symfony/process/Pipes/PipesInterface.php @@ -57,5 +57,5 @@ public function haveReadSupport(): bool; /** * Closes file handles and pipes. */ - public function close(); + public function close(): void; } diff --git a/app/vendor/symfony/process/Pipes/WindowsPipes.php b/app/vendor/symfony/process/Pipes/WindowsPipes.php index 9f4dedb28..0d6ab12d3 100644 --- a/app/vendor/symfony/process/Pipes/WindowsPipes.php +++ b/app/vendor/symfony/process/Pipes/WindowsPipes.php @@ -172,7 +172,7 @@ public function areOpen(): bool return $this->pipes && $this->fileHandles; } - public function close() + public function close(): void { parent::close(); foreach ($this->fileHandles as $type => $handle) { diff --git a/app/vendor/symfony/process/Process.php b/app/vendor/symfony/process/Process.php index 63a402a55..3e08b51fd 100644 --- a/app/vendor/symfony/process/Process.php +++ b/app/vendor/symfony/process/Process.php @@ -285,6 +285,8 @@ public function mustRun(callable $callback = null, array $env = []): static * @param callable|null $callback A PHP callback to run whenever there is some * output available on STDOUT or STDERR * + * @return void + * * @throws RuntimeException When process can't be launched * @throws RuntimeException When process is already running * @throws LogicException In case a callback is provided and output has been disabled @@ -326,7 +328,7 @@ public function start(callable $callback = null, array $env = []) // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input $commandline = '{ ('.$commandline.') <&3 3<&- 3>/dev/null & } 3<&0;'; - $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code'; + $commandline .= 'pid=$!; echo $pid >&3; wait $pid 2>/dev/null; code=$?; echo $code >&3; exit $code'; // Workaround for the bug, when PTS functionality is enabled. // @see : https://bugs.php.net/69442 @@ -421,7 +423,7 @@ public function wait(callable $callback = null): int do { $this->checkTimeout(); - $running = '\\' === \DIRECTORY_SEPARATOR ? $this->isRunning() : $this->processPipes->areOpen(); + $running = $this->isRunning() && ('\\' === \DIRECTORY_SEPARATOR || $this->processPipes->areOpen()); $this->readPipes($running, '\\' !== \DIRECTORY_SEPARATOR || !$running); } while ($running); @@ -912,7 +914,7 @@ public function stop(float $timeout = 10, int $signal = null): ?int * * @internal */ - public function addOutput(string $line) + public function addOutput(string $line): void { $this->lastOutputTime = microtime(true); @@ -926,7 +928,7 @@ public function addOutput(string $line) * * @internal */ - public function addErrorOutput(string $line) + public function addErrorOutput(string $line): void { $this->lastOutputTime = microtime(true); @@ -1140,6 +1142,8 @@ public function setInput(mixed $input): static * In case you run a background process (with the start method), you should * trigger this method regularly to ensure the process timeout * + * @return void + * * @throws ProcessTimedOutException In case the timeout was reached */ public function checkTimeout() @@ -1180,6 +1184,8 @@ public function getStartTime(): float * * Enabling the "create_new_console" option allows a subprocess to continue * to run after the main process exited, on both Windows and *nix + * + * @return void */ public function setOptions(array $options) { @@ -1255,9 +1261,7 @@ private function getDescriptors(): array protected function buildCallback(callable $callback = null): \Closure { if ($this->outputDisabled) { - return function ($type, $data) use ($callback): bool { - return null !== $callback && $callback($type, $data); - }; + return fn ($type, $data): bool => null !== $callback && $callback($type, $data); } $out = self::OUT; @@ -1277,6 +1281,8 @@ protected function buildCallback(callable $callback = null): \Closure * Updates the status of the process, reads pipes. * * @param bool $blocking Whether to use a blocking read call + * + * @return void */ protected function updateStatus(bool $blocking) { @@ -1325,7 +1331,7 @@ protected function isSigchildEnabled(): bool * * @throws LogicException in case output has been disabled or process is not started */ - private function readPipesForOutput(string $caller, bool $blocking = false) + private function readPipesForOutput(string $caller, bool $blocking = false): void { if ($this->outputDisabled) { throw new LogicException('Output has been disabled.'); @@ -1360,7 +1366,7 @@ private function validateTimeout(?float $timeout): ?float * @param bool $blocking Whether to use blocking calls or not * @param bool $close Whether to close file handles or not */ - private function readPipes(bool $blocking, bool $close) + private function readPipes(bool $blocking, bool $close): void { $result = $this->processPipes->readAndWrite($blocking, $close); @@ -1409,7 +1415,7 @@ private function close(): int /** * Resets data related to the latest run of the process. */ - private function resetProcessData() + private function resetProcessData(): void { $this->starttime = null; $this->callback = null; @@ -1482,8 +1488,6 @@ private function doSignal(int $signal, bool $throwException): bool private function prepareWindowsCommandLine(string $cmd, array &$env): string { $uid = uniqid('', true); - $varCount = 0; - $varCache = []; $cmd = preg_replace_callback( '/"(?:( [^"%!^]*+ @@ -1492,7 +1496,9 @@ private function prepareWindowsCommandLine(string $cmd, array &$env): string [^"%!^]*+ )++ ) | [^"]*+ )"/x', - function ($m) use (&$env, &$varCache, &$varCount, $uid) { + function ($m) use (&$env, $uid) { + static $varCount = 0; + static $varCache = []; if (!isset($m[1])) { return $m[0]; } @@ -1530,7 +1536,7 @@ function ($m) use (&$env, &$varCache, &$varCount, $uid) { * * @throws LogicException if the process has not run */ - private function requireProcessIsStarted(string $functionName) + private function requireProcessIsStarted(string $functionName): void { if (!$this->isStarted()) { throw new LogicException(sprintf('Process must be started before calling "%s()".', $functionName)); @@ -1542,7 +1548,7 @@ private function requireProcessIsStarted(string $functionName) * * @throws LogicException if the process is not yet terminated */ - private function requireProcessIsTerminated(string $functionName) + private function requireProcessIsTerminated(string $functionName): void { if (!$this->isTerminated()) { throw new LogicException(sprintf('Process must be terminated before calling "%s()".', $functionName)); @@ -1571,7 +1577,7 @@ private function escapeArgument(?string $argument): string return '"'.str_replace(['"', '^', '%', '!', "\n"], ['""', '"^^"', '"^%"', '"^!"', '!LF!'], $argument).'"'; } - private function replacePlaceholders(string $commandline, array $env) + private function replacePlaceholders(string $commandline, array $env): string { return preg_replace_callback('/"\$\{:([_a-zA-Z]++[_a-zA-Z0-9]*+)\}"/', function ($matches) use ($commandline, $env) { if (!isset($env[$matches[1]]) || false === $env[$matches[1]]) { diff --git a/app/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php b/app/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php index 88f6a0687..07d12b4a5 100644 --- a/app/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php +++ b/app/vendor/symfony/service-contracts/Test/ServiceLocatorTest.php @@ -11,82 +11,13 @@ namespace Symfony\Contracts\Service\Test; -use PHPUnit\Framework\TestCase; -use Psr\Container\ContainerInterface; -use Symfony\Contracts\Service\ServiceLocatorTrait; +class_alias(ServiceLocatorTestCase::class, ServiceLocatorTest::class); -abstract class ServiceLocatorTest extends TestCase -{ - protected function getServiceLocator(array $factories): ContainerInterface +if (false) { + /** + * @deprecated since PHPUnit 9.6 + */ + class ServiceLocatorTest { - return new class($factories) implements ContainerInterface { - use ServiceLocatorTrait; - }; - } - - public function testHas() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - function () { return 'dummy'; }, - ]); - - $this->assertTrue($locator->has('foo')); - $this->assertTrue($locator->has('bar')); - $this->assertFalse($locator->has('dummy')); - } - - public function testGet() - { - $locator = $this->getServiceLocator([ - 'foo' => function () { return 'bar'; }, - 'bar' => function () { return 'baz'; }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('baz', $locator->get('bar')); - } - - public function testGetDoesNotMemoize() - { - $i = 0; - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$i) { - ++$i; - - return 'bar'; - }, - ]); - - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame('bar', $locator->get('foo')); - $this->assertSame(2, $i); - } - - public function testThrowsOnUndefinedInternalService() - { - if (!$this->getExpectedException()) { - $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); - $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); - } - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); - } - - public function testThrowsOnCircularReference() - { - $this->expectException(\Psr\Container\ContainerExceptionInterface::class); - $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); - $locator = $this->getServiceLocator([ - 'foo' => function () use (&$locator) { return $locator->get('bar'); }, - 'bar' => function () use (&$locator) { return $locator->get('baz'); }, - 'baz' => function () use (&$locator) { return $locator->get('bar'); }, - ]); - - $locator->get('foo'); } } diff --git a/app/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php b/app/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php new file mode 100644 index 000000000..a0f20a6a7 --- /dev/null +++ b/app/vendor/symfony/service-contracts/Test/ServiceLocatorTestCase.php @@ -0,0 +1,92 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Contracts\Service\Test; + +use PHPUnit\Framework\TestCase; +use Psr\Container\ContainerInterface; +use Symfony\Contracts\Service\ServiceLocatorTrait; + +abstract class ServiceLocatorTestCase extends TestCase +{ + protected function getServiceLocator(array $factories): ContainerInterface + { + return new class($factories) implements ContainerInterface { + use ServiceLocatorTrait; + }; + } + + public function testHas() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + function () { return 'dummy'; }, + ]); + + $this->assertTrue($locator->has('foo')); + $this->assertTrue($locator->has('bar')); + $this->assertFalse($locator->has('dummy')); + } + + public function testGet() + { + $locator = $this->getServiceLocator([ + 'foo' => function () { return 'bar'; }, + 'bar' => function () { return 'baz'; }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('baz', $locator->get('bar')); + } + + public function testGetDoesNotMemoize() + { + $i = 0; + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$i) { + ++$i; + + return 'bar'; + }, + ]); + + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame('bar', $locator->get('foo')); + $this->assertSame(2, $i); + } + + public function testThrowsOnUndefinedInternalService() + { + if (!$this->getExpectedException()) { + $this->expectException(\Psr\Container\NotFoundExceptionInterface::class); + $this->expectExceptionMessage('The service "foo" has a dependency on a non-existent service "bar". This locator only knows about the "foo" service.'); + } + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } + + public function testThrowsOnCircularReference() + { + $this->expectException(\Psr\Container\ContainerExceptionInterface::class); + $this->expectExceptionMessage('Circular reference detected for service "bar", path: "bar -> baz -> bar".'); + $locator = $this->getServiceLocator([ + 'foo' => function () use (&$locator) { return $locator->get('bar'); }, + 'bar' => function () use (&$locator) { return $locator->get('baz'); }, + 'baz' => function () use (&$locator) { return $locator->get('bar'); }, + ]); + + $locator->get('foo'); + } +} diff --git a/app/vendor/symfony/service-contracts/composer.json b/app/vendor/symfony/service-contracts/composer.json index 36b0d95e7..a64188b51 100644 --- a/app/vendor/symfony/service-contracts/composer.json +++ b/app/vendor/symfony/service-contracts/composer.json @@ -22,9 +22,6 @@ "conflict": { "ext-psr": "<1.1|>=2" }, - "suggest": { - "symfony/service-implementation": "" - }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" }, "exclude-from-classmap": [ @@ -34,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "3.3-dev" + "dev-main": "3.4-dev" }, "thanks": { "name": "symfony/contracts", diff --git a/app/vendor/symfony/string/AbstractUnicodeString.php b/app/vendor/symfony/string/AbstractUnicodeString.php index 2a2bed71e..d19a61a9c 100644 --- a/app/vendor/symfony/string/AbstractUnicodeString.php +++ b/app/vendor/symfony/string/AbstractUnicodeString.php @@ -40,10 +40,6 @@ abstract class AbstractUnicodeString extends AbstractString private const FOLD_FROM = ['İ', 'µ', 'ſ', "\xCD\x85", 'ς', 'ϐ', 'ϑ', 'ϕ', 'ϖ', 'ϰ', 'ϱ', 'ϵ', 'ẛ', "\xE1\xBE\xBE", 'ß', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'և', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ẞ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾀ', 'ᾁ', 'ᾂ', 'ᾃ', 'ᾄ', 'ᾅ', 'ᾆ', 'ᾇ', 'ᾈ', 'ᾉ', 'ᾊ', 'ᾋ', 'ᾌ', 'ᾍ', 'ᾎ', 'ᾏ', 'ᾐ', 'ᾑ', 'ᾒ', 'ᾓ', 'ᾔ', 'ᾕ', 'ᾖ', 'ᾗ', 'ᾘ', 'ᾙ', 'ᾚ', 'ᾛ', 'ᾜ', 'ᾝ', 'ᾞ', 'ᾟ', 'ᾠ', 'ᾡ', 'ᾢ', 'ᾣ', 'ᾤ', 'ᾥ', 'ᾦ', 'ᾧ', 'ᾨ', 'ᾩ', 'ᾪ', 'ᾫ', 'ᾬ', 'ᾭ', 'ᾮ', 'ᾯ', 'ᾲ', 'ᾳ', 'ᾴ', 'ᾶ', 'ᾷ', 'ᾼ', 'ῂ', 'ῃ', 'ῄ', 'ῆ', 'ῇ', 'ῌ', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ῲ', 'ῳ', 'ῴ', 'ῶ', 'ῷ', 'ῼ', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ']; private const FOLD_TO = ['i̇', 'μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', 'ṡ', 'ι', 'ss', 'ʼn', 'ǰ', 'ΐ', 'ΰ', 'եւ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'aʾ', 'ss', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἀι', 'ἁι', 'ἂι', 'ἃι', 'ἄι', 'ἅι', 'ἆι', 'ἇι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ἠι', 'ἡι', 'ἢι', 'ἣι', 'ἤι', 'ἥι', 'ἦι', 'ἧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὠι', 'ὡι', 'ὢι', 'ὣι', 'ὤι', 'ὥι', 'ὦι', 'ὧι', 'ὰι', 'αι', 'άι', 'ᾶ', 'ᾶι', 'αι', 'ὴι', 'ηι', 'ήι', 'ῆ', 'ῆι', 'ηι', 'ῒ', 'ῖ', 'ῗ', 'ῢ', 'ῤ', 'ῦ', 'ῧ', 'ὼι', 'ωι', 'ώι', 'ῶ', 'ῶι', 'ωι', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'st', 'st', 'մն', 'մե', 'մի', 'վն', 'մխ']; - // the subset of upper case mappings that map one code point to many code points - private const UPPER_FROM = ['ß', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'ſt', 'st', 'և', 'ﬓ', 'ﬔ', 'ﬕ', 'ﬖ', 'ﬗ', 'ʼn', 'ΐ', 'ΰ', 'ǰ', 'ẖ', 'ẗ', 'ẘ', 'ẙ', 'ẚ', 'ὐ', 'ὒ', 'ὔ', 'ὖ', 'ᾶ', 'ῆ', 'ῒ', 'ΐ', 'ῖ', 'ῗ', 'ῢ', 'ΰ', 'ῤ', 'ῦ', 'ῧ', 'ῶ']; - private const UPPER_TO = ['SS', 'FF', 'FI', 'FL', 'FFI', 'FFL', 'ST', 'ST', 'ԵՒ', 'ՄՆ', 'ՄԵ', 'ՄԻ', 'ՎՆ', 'ՄԽ', 'ʼN', 'Ϊ́', 'Ϋ́', 'J̌', 'H̱', 'T̈', 'W̊', 'Y̊', 'Aʾ', 'Υ̓', 'Υ̓̀', 'Υ̓́', 'Υ̓͂', 'Α͂', 'Η͂', 'Ϊ̀', 'Ϊ́', 'Ι͂', 'Ϊ͂', 'Ϋ̀', 'Ϋ́', 'Ρ̓', 'Υ͂', 'Ϋ͂', 'Ω͂']; - // the subset of https://github.com/unicode-org/cldr/blob/master/common/transforms/Latin-ASCII.xml that is not in NFKD private const TRANSLIT_FROM = ['Æ', 'Ð', 'Ø', 'Þ', 'ß', 'æ', 'ð', 'ø', 'þ', 'Đ', 'đ', 'Ħ', 'ħ', 'ı', 'ĸ', 'Ŀ', 'ŀ', 'Ł', 'ł', 'ʼn', 'Ŋ', 'ŋ', 'Œ', 'œ', 'Ŧ', 'ŧ', 'ƀ', 'Ɓ', 'Ƃ', 'ƃ', 'Ƈ', 'ƈ', 'Ɖ', 'Ɗ', 'Ƌ', 'ƌ', 'Ɛ', 'Ƒ', 'ƒ', 'Ɠ', 'ƕ', 'Ɩ', 'Ɨ', 'Ƙ', 'ƙ', 'ƚ', 'Ɲ', 'ƞ', 'Ƣ', 'ƣ', 'Ƥ', 'ƥ', 'ƫ', 'Ƭ', 'ƭ', 'Ʈ', 'Ʋ', 'Ƴ', 'ƴ', 'Ƶ', 'ƶ', 'DŽ', 'Dž', 'dž', 'Ǥ', 'ǥ', 'ȡ', 'Ȥ', 'ȥ', 'ȴ', 'ȵ', 'ȶ', 'ȷ', 'ȸ', 'ȹ', 'Ⱥ', 'Ȼ', 'ȼ', 'Ƚ', 'Ⱦ', 'ȿ', 'ɀ', 'Ƀ', 'Ʉ', 'Ɇ', 'ɇ', 'Ɉ', 'ɉ', 'Ɍ', 'ɍ', 'Ɏ', 'ɏ', 'ɓ', 'ɕ', 'ɖ', 'ɗ', 'ɛ', 'ɟ', 'ɠ', 'ɡ', 'ɢ', 'ɦ', 'ɧ', 'ɨ', 'ɪ', 'ɫ', 'ɬ', 'ɭ', 'ɱ', 'ɲ', 'ɳ', 'ɴ', 'ɶ', 'ɼ', 'ɽ', 'ɾ', 'ʀ', 'ʂ', 'ʈ', 'ʉ', 'ʋ', 'ʏ', 'ʐ', 'ʑ', 'ʙ', 'ʛ', 'ʜ', 'ʝ', 'ʟ', 'ʠ', 'ʣ', 'ʥ', 'ʦ', 'ʪ', 'ʫ', 'ᴀ', 'ᴁ', 'ᴃ', 'ᴄ', 'ᴅ', 'ᴆ', 'ᴇ', 'ᴊ', 'ᴋ', 'ᴌ', 'ᴍ', 'ᴏ', 'ᴘ', 'ᴛ', 'ᴜ', 'ᴠ', 'ᴡ', 'ᴢ', 'ᵫ', 'ᵬ', 'ᵭ', 'ᵮ', 'ᵯ', 'ᵰ', 'ᵱ', 'ᵲ', 'ᵳ', 'ᵴ', 'ᵵ', 'ᵶ', 'ᵺ', 'ᵻ', 'ᵽ', 'ᵾ', 'ᶀ', 'ᶁ', 'ᶂ', 'ᶃ', 'ᶄ', 'ᶅ', 'ᶆ', 'ᶇ', 'ᶈ', 'ᶉ', 'ᶊ', 'ᶌ', 'ᶍ', 'ᶎ', 'ᶏ', 'ᶑ', 'ᶒ', 'ᶓ', 'ᶖ', 'ᶙ', 'ẚ', 'ẜ', 'ẝ', 'ẞ', 'Ỻ', 'ỻ', 'Ỽ', 'ỽ', 'Ỿ', 'ỿ', '©', '®', '₠', '₢', '₣', '₤', '₧', '₺', '₹', 'ℌ', '℞', '㎧', '㎮', '㏆', '㏗', '㏞', '㏟', '¼', '½', '¾', '⅓', '⅔', '⅕', '⅖', '⅗', '⅘', '⅙', '⅚', '⅛', '⅜', '⅝', '⅞', '⅟', '〇', '‘', '’', '‚', '‛', '“', '”', '„', '‟', '′', '″', '〝', '〞', '«', '»', '‹', '›', '‐', '‑', '‒', '–', '—', '―', '︱', '︲', '﹘', '‖', '⁄', '⁅', '⁆', '⁎', '、', '。', '〈', '〉', '《', '》', '〔', '〕', '〘', '〙', '〚', '〛', '︑', '︒', '︹', '︺', '︽', '︾', '︿', '﹀', '﹑', '﹝', '﹞', '⦅', '⦆', '。', '、', '×', '÷', '−', '∕', '∖', '∣', '∥', '≪', '≫', '⦅', '⦆']; private const TRANSLIT_TO = ['AE', 'D', 'O', 'TH', 'ss', 'ae', 'd', 'o', 'th', 'D', 'd', 'H', 'h', 'i', 'q', 'L', 'l', 'L', 'l', '\'n', 'N', 'n', 'OE', 'oe', 'T', 't', 'b', 'B', 'B', 'b', 'C', 'c', 'D', 'D', 'D', 'd', 'E', 'F', 'f', 'G', 'hv', 'I', 'I', 'K', 'k', 'l', 'N', 'n', 'OI', 'oi', 'P', 'p', 't', 'T', 't', 'T', 'V', 'Y', 'y', 'Z', 'z', 'DZ', 'Dz', 'dz', 'G', 'g', 'd', 'Z', 'z', 'l', 'n', 't', 'j', 'db', 'qp', 'A', 'C', 'c', 'L', 'T', 's', 'z', 'B', 'U', 'E', 'e', 'J', 'j', 'R', 'r', 'Y', 'y', 'b', 'c', 'd', 'd', 'e', 'j', 'g', 'g', 'G', 'h', 'h', 'i', 'I', 'l', 'l', 'l', 'm', 'n', 'n', 'N', 'OE', 'r', 'r', 'r', 'R', 's', 't', 'u', 'v', 'Y', 'z', 'z', 'B', 'G', 'H', 'j', 'L', 'q', 'dz', 'dz', 'ts', 'ls', 'lz', 'A', 'AE', 'B', 'C', 'D', 'D', 'E', 'J', 'K', 'L', 'M', 'O', 'P', 'T', 'U', 'V', 'W', 'Z', 'ue', 'b', 'd', 'f', 'm', 'n', 'p', 'r', 'r', 's', 't', 'z', 'th', 'I', 'p', 'U', 'b', 'd', 'f', 'g', 'k', 'l', 'm', 'n', 'p', 'r', 's', 'v', 'x', 'z', 'a', 'd', 'e', 'e', 'i', 'u', 'a', 's', 's', 'SS', 'LL', 'll', 'V', 'v', 'Y', 'y', '(C)', '(R)', 'CE', 'Cr', 'Fr.', 'L.', 'Pts', 'TL', 'Rs', 'x', 'Rx', 'm/s', 'rad/s', 'C/kg', 'pH', 'V/m', 'A/m', ' 1/4', ' 1/2', ' 3/4', ' 1/3', ' 2/3', ' 1/5', ' 2/5', ' 3/5', ' 4/5', ' 1/6', ' 5/6', ' 1/8', ' 3/8', ' 5/8', ' 7/8', ' 1/', '0', '\'', '\'', ',', '\'', '"', '"', ',,', '"', '\'', '"', '"', '"', '<<', '>>', '<', '>', '-', '-', '-', '-', '-', '-', '-', '-', '-', '||', '/', '[', ']', '*', ',', '.', '<', '>', '<<', '>>', '[', ']', '[', ']', '[', ']', ',', '.', '[', ']', '<<', '>>', '<', '>', ',', '[', ']', '((', '))', '.', ',', '*', '/', '-', '/', '\\', '|', '||', '<<', '>>', '((', '))']; @@ -159,7 +155,9 @@ public function ascii(array $rules = []): self public function camel(): static { $str = clone $this; - $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) use (&$i) { + $str->string = str_replace(' ', '', preg_replace_callback('/\b.(?![A-Z]{2,})/u', static function ($m) { + static $i = 0; + return 1 === ++$i ? ('İ' === $m[0] ? 'i̇' : mb_strtolower($m[0], 'UTF-8')) : mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); }, preg_replace('/[^\pL0-9]++/u', ' ', $this->string))); @@ -360,9 +358,7 @@ public function title(bool $allWords = false): static $limit = $allWords ? -1 : 1; - $str->string = preg_replace_callback('/\b./u', static function (array $m): string { - return mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'); - }, $str->string, $limit); + $str->string = preg_replace_callback('/\b./u', static fn (array $m): string => mb_convert_case($m[0], \MB_CASE_TITLE, 'UTF-8'), $str->string, $limit); return $str; } diff --git a/app/vendor/symfony/string/Inflector/EnglishInflector.php b/app/vendor/symfony/string/Inflector/EnglishInflector.php index 2871e4e51..2cd6bb87b 100644 --- a/app/vendor/symfony/string/Inflector/EnglishInflector.php +++ b/app/vendor/symfony/string/Inflector/EnglishInflector.php @@ -94,6 +94,9 @@ final class EnglishInflector implements InflectorInterface // accesses (access), addresses (address), kisses (kiss) ['sess', 4, true, false, 'ss'], + // statuses (status) + ['sesutats', 8, true, true, 'status'], + // analyses (analysis), ellipses (ellipsis), fungi (fungus), // neuroses (neurosis), theses (thesis), emphases (emphasis), // oases (oasis), crises (crisis), houses (house), bases (base), @@ -138,6 +141,9 @@ final class EnglishInflector implements InflectorInterface // shoes (shoe) ['se', 2, true, true, ['', 'e']], + // status (status) + ['sutats', 6, true, true, 'status'], + // tags (tag) ['s', 1, true, true, ''], @@ -279,6 +285,9 @@ final class EnglishInflector implements InflectorInterface // circuses (circus) ['suc', 3, true, true, 'cuses'], + // status (status) + ['sutats', 6, true, true, ['status', 'statuses']], + // conspectuses (conspectus), prospectuses (prospectus) ['sutcep', 6, true, true, 'pectuses'], diff --git a/app/vendor/symfony/string/LazyString.php b/app/vendor/symfony/string/LazyString.php index 9523b8cdb..3128ebb36 100644 --- a/app/vendor/symfony/string/LazyString.php +++ b/app/vendor/symfony/string/LazyString.php @@ -30,7 +30,9 @@ public static function fromCallable(callable|array $callback, mixed ...$argument } $lazyString = new static(); - $lazyString->value = static function () use (&$callback, &$arguments, &$value): string { + $lazyString->value = static function () use (&$callback, &$arguments): string { + static $value; + if (null !== $arguments) { if (!\is_callable($callback)) { $callback[0] = $callback[0](); diff --git a/app/vendor/symfony/string/Slugger/AsciiSlugger.php b/app/vendor/symfony/string/Slugger/AsciiSlugger.php index 826d07ca0..6e550c61c 100644 --- a/app/vendor/symfony/string/Slugger/AsciiSlugger.php +++ b/app/vendor/symfony/string/Slugger/AsciiSlugger.php @@ -74,6 +74,9 @@ public function __construct(string $defaultLocale = null, array|\Closure $symbol $this->symbolsMap = $symbolsMap ?? $this->symbolsMap; } + /** + * @return void + */ public function setLocale(string $locale) { $this->defaultLocale = $locale; @@ -121,9 +124,7 @@ public function slug(string $string, string $separator = '-', string $locale = n // If the symbols map is passed as a closure, there is no need to fallback to the parent locale // as the closure can just provide substitutions for all locales of interest. $symbolsMap = $this->symbolsMap; - array_unshift($transliterator, static function ($s) use ($symbolsMap, $locale) { - return $symbolsMap($s, $locale); - }); + array_unshift($transliterator, static fn ($s) => $symbolsMap($s, $locale)); } $unicodeString = (new UnicodeString($string))->ascii($transliterator); diff --git a/app/vendor/symfony/string/composer.json b/app/vendor/symfony/string/composer.json index 44a809d58..3545c8531 100644 --- a/app/vendor/symfony/string/composer.json +++ b/app/vendor/symfony/string/composer.json @@ -26,11 +26,11 @@ "symfony/error-handler": "^5.4|^6.0", "symfony/intl": "^6.2", "symfony/http-client": "^5.4|^6.0", - "symfony/translation-contracts": "^2.0|^3.0", + "symfony/translation-contracts": "^2.5|^3.0", "symfony/var-exporter": "^5.4|^6.0" }, "conflict": { - "symfony/translation-contracts": "<2.0" + "symfony/translation-contracts": "<2.5" }, "autoload": { "psr-4": { "Symfony\\Component\\String\\": "" }, diff --git a/app/vendor/symfony/var-dumper/CHANGELOG.md b/app/vendor/symfony/var-dumper/CHANGELOG.md index ffa4daf2b..932987501 100644 --- a/app/vendor/symfony/var-dumper/CHANGELOG.md +++ b/app/vendor/symfony/var-dumper/CHANGELOG.md @@ -1,6 +1,14 @@ CHANGELOG ========= +6.3 +--- + + * Add caster for `WeakMap` + * Add support of named arguments to `dd()` and `dump()` to display the argument name + * Add support for `Relay\Relay` + * Add display of invisible characters + 6.2 --- diff --git a/app/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/app/vendor/symfony/var-dumper/Caster/AmqpCaster.php index dc3b62198..22026f46a 100644 --- a/app/vendor/symfony/var-dumper/Caster/AmqpCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/AmqpCaster.php @@ -46,6 +46,9 @@ class AmqpCaster \AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS', ]; + /** + * @return array + */ public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -79,6 +82,9 @@ public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, return $a; } + /** + * @return array + */ public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -102,6 +108,9 @@ public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, bool $ return $a; } + /** + * @return array + */ public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -125,6 +134,9 @@ public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, bool $isNe return $a; } + /** + * @return array + */ public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -153,6 +165,9 @@ public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; diff --git a/app/vendor/symfony/var-dumper/Caster/Caster.php b/app/vendor/symfony/var-dumper/Caster/Caster.php index b6a84fcbe..32c69ee04 100644 --- a/app/vendor/symfony/var-dumper/Caster/Caster.php +++ b/app/vendor/symfony/var-dumper/Caster/Caster.php @@ -36,6 +36,8 @@ class Caster public const PREFIX_VIRTUAL = "\0~\0"; public const PREFIX_DYNAMIC = "\0+\0"; public const PREFIX_PROTECTED = "\0*\0"; + // usage: sprintf(Caster::PATTERN_PRIVATE, $class, $property) + public const PATTERN_PRIVATE = "\0%s\0%s"; /** * Casts objects to arrays and adds the dynamic property prefix. diff --git a/app/vendor/symfony/var-dumper/Caster/ClassStub.php b/app/vendor/symfony/var-dumper/Caster/ClassStub.php index fb8377a03..86b44dd2a 100644 --- a/app/vendor/symfony/var-dumper/Caster/ClassStub.php +++ b/app/vendor/symfony/var-dumper/Caster/ClassStub.php @@ -56,9 +56,7 @@ public function __construct(string $identifier, callable|array|string $callable } if (str_contains($identifier, "@anonymous\0")) { - $this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $identifier); + $this->value = $identifier = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $identifier); } if (null !== $callable && $r instanceof \ReflectionFunctionAbstract) { @@ -87,6 +85,9 @@ public function __construct(string $identifier, callable|array|string $callable } } + /** + * @return mixed + */ public static function wrapCallable(mixed $callable) { if (\is_object($callable) || !\is_callable($callable)) { diff --git a/app/vendor/symfony/var-dumper/Caster/DOMCaster.php b/app/vendor/symfony/var-dumper/Caster/DOMCaster.php index 8b770b8ae..d2d3fc129 100644 --- a/app/vendor/symfony/var-dumper/Caster/DOMCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/DOMCaster.php @@ -63,6 +63,9 @@ class DOMCaster \XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE', ]; + /** + * @return array + */ public static function castException(\DOMException $e, array $a, Stub $stub, bool $isNested) { $k = Caster::PREFIX_PROTECTED.'code'; @@ -73,6 +76,9 @@ public static function castException(\DOMException $e, array $a, Stub $stub, boo return $a; } + /** + * @return array + */ public static function castLength($dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -82,6 +88,9 @@ public static function castLength($dom, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castImplementation(\DOMImplementation $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -92,6 +101,9 @@ public static function castImplementation(\DOMImplementation $dom, array $a, Stu return $a; } + /** + * @return array + */ public static function castNode(\DOMNode $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -116,6 +128,9 @@ public static function castNode(\DOMNode $dom, array $a, Stub $stub, bool $isNes return $a; } + /** + * @return array + */ public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -132,6 +147,9 @@ public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub return $a; } + /** + * @return array + */ public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0) { $a += [ @@ -166,6 +184,9 @@ public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, boo return $a; } + /** + * @return array + */ public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -176,6 +197,9 @@ public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub return $a; } + /** + * @return array + */ public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -189,6 +213,9 @@ public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, bool $isNes return $a; } + /** + * @return array + */ public static function castElement(\DOMElement $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -199,6 +226,9 @@ public static function castElement(\DOMElement $dom, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castText(\DOMText $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -208,6 +238,9 @@ public static function castText(\DOMText $dom, array $a, Stub $stub, bool $isNes return $a; } + /** + * @return array + */ public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -222,6 +255,9 @@ public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $s return $a; } + /** + * @return array + */ public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -232,6 +268,9 @@ public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, boo return $a; } + /** + * @return array + */ public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -246,6 +285,9 @@ public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, bool $i return $a; } + /** + * @return array + */ public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, bool $isNested) { $a += [ @@ -256,6 +298,9 @@ public static function castProcessingInstruction(\DOMProcessingInstruction $dom, return $a; } + /** + * @return array + */ public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, bool $isNested) { $a += [ diff --git a/app/vendor/symfony/var-dumper/Caster/DateCaster.php b/app/vendor/symfony/var-dumper/Caster/DateCaster.php index 07e8c5ea8..a0cbddb76 100644 --- a/app/vendor/symfony/var-dumper/Caster/DateCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -24,10 +24,13 @@ class DateCaster { private const PERIOD_LIMIT = 3; + /** + * @return array + */ public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, bool $isNested, int $filter) { $prefix = Caster::PREFIX_VIRTUAL; - $location = $d->getTimezone()->getLocation(); + $location = $d->getTimezone() ? $d->getTimezone()->getLocation() : null; $fromNow = (new \DateTimeImmutable())->diff($d); $title = $d->format('l, F j, Y') @@ -47,6 +50,9 @@ public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, return $a; } + /** + * @return array + */ public static function castInterval(\DateInterval $interval, array $a, Stub $stub, bool $isNested, int $filter) { $now = new \DateTimeImmutable('@0', new \DateTimeZone('UTC')); @@ -76,6 +82,9 @@ private static function formatInterval(\DateInterval $i): string return $i->format(rtrim($format)); } + /** + * @return array + */ public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, bool $isNested, int $filter) { $location = $timeZone->getLocation(); @@ -87,6 +96,9 @@ public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stu return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a; } + /** + * @return array + */ public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, bool $isNested, int $filter) { $dates = []; diff --git a/app/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/app/vendor/symfony/var-dumper/Caster/DoctrineCaster.php index 129b2cb47..3120c3d91 100644 --- a/app/vendor/symfony/var-dumper/Caster/DoctrineCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/DoctrineCaster.php @@ -25,6 +25,9 @@ */ class DoctrineCaster { + /** + * @return array + */ public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, bool $isNested) { foreach (['__cloner__', '__initializer__'] as $k) { @@ -37,6 +40,9 @@ public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, return $a; } + /** + * @return array + */ public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, bool $isNested) { foreach (['_entityPersister', '_identifier'] as $k) { @@ -49,6 +55,9 @@ public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, bool $isNested) { foreach (['snapshot', 'association', 'typeClass'] as $k) { diff --git a/app/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/app/vendor/symfony/var-dumper/Caster/ExceptionCaster.php index 14caf71f3..02efb1b02 100644 --- a/app/vendor/symfony/var-dumper/Caster/ExceptionCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/ExceptionCaster.php @@ -11,6 +11,7 @@ namespace Symfony\Component\VarDumper\Caster; +use Symfony\Component\ErrorHandler\Exception\FlattenException; use Symfony\Component\ErrorHandler\Exception\SilencedErrorContext; use Symfony\Component\VarDumper\Cloner\Stub; use Symfony\Component\VarDumper\Exception\ThrowingCasterException; @@ -46,16 +47,25 @@ class ExceptionCaster private static array $framesCache = []; + /** + * @return array + */ public static function castError(\Error $e, array $a, Stub $stub, bool $isNested, int $filter = 0) { return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter); } + /** + * @return array + */ public static function castException(\Exception $e, array $a, Stub $stub, bool $isNested, int $filter = 0) { return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter); } + /** + * @return array + */ public static function castErrorException(\ErrorException $e, array $a, Stub $stub, bool $isNested) { if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) { @@ -65,6 +75,9 @@ public static function castErrorException(\ErrorException $e, array $a, Stub $st return $a; } + /** + * @return array + */ public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, bool $isNested) { $trace = Caster::PREFIX_VIRTUAL.'trace'; @@ -83,6 +96,9 @@ public static function castThrowingCasterException(ThrowingCasterException $e, a return $a; } + /** + * @return array + */ public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, bool $isNested) { $sPrefix = "\0".SilencedErrorContext::class."\0"; @@ -110,6 +126,9 @@ public static function castSilencedErrorContext(SilencedErrorContext $e, array $ return $a; } + /** + * @return array + */ public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, bool $isNested) { if (!$isNested) { @@ -184,6 +203,9 @@ public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, boo return $a; } + /** + * @return array + */ public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, bool $isNested) { if (!$isNested) { @@ -267,6 +289,19 @@ public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, boo return $a; } + /** + * @return array + */ + public static function castFlattenException(FlattenException $e, array $a, Stub $stub, bool $isNested) + { + if ($isNested) { + $k = sprintf(Caster::PATTERN_PRIVATE, FlattenException::class, 'traceAsString'); + $a[$k] = new CutStub($a[$k]); + } + + return $a; + } + private static function filterExceptionArray(string $xClass, array $a, string $xPrefix, int $filter): array { if (isset($a[$xPrefix.'trace'])) { @@ -285,12 +320,10 @@ private static function filterExceptionArray(string $xClass, array $a, string $x if (empty($a[$xPrefix.'previous'])) { unset($a[$xPrefix.'previous']); } - unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']); + unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message']); if (isset($a[Caster::PREFIX_PROTECTED.'message']) && str_contains($a[Caster::PREFIX_PROTECTED.'message'], "@anonymous\0")) { - $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', function ($m) { - return class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0]; - }, $a[Caster::PREFIX_PROTECTED.'message']); + $a[Caster::PREFIX_PROTECTED.'message'] = preg_replace_callback('/[a-zA-Z_\x7f-\xff][\\\\a-zA-Z0-9_\x7f-\xff]*+@anonymous\x00.*?\.php(?:0x?|:[0-9]++\$)[0-9a-fA-F]++/', fn ($m) => class_exists($m[0], false) ? (get_parent_class($m[0]) ?: key(class_implements($m[0])) ?: 'class').'@anonymous' : $m[0], $a[Caster::PREFIX_PROTECTED.'message']); } if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) { diff --git a/app/vendor/symfony/var-dumper/Caster/FiberCaster.php b/app/vendor/symfony/var-dumper/Caster/FiberCaster.php index c74a9e59c..b797dbd63 100644 --- a/app/vendor/symfony/var-dumper/Caster/FiberCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/FiberCaster.php @@ -20,6 +20,9 @@ */ final class FiberCaster { + /** + * @return array + */ public static function castFiber(\Fiber $fiber, array $a, Stub $stub, bool $isNested, int $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; diff --git a/app/vendor/symfony/var-dumper/Caster/IntlCaster.php b/app/vendor/symfony/var-dumper/Caster/IntlCaster.php index 1ed91d4d6..a4590f4b5 100644 --- a/app/vendor/symfony/var-dumper/Caster/IntlCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/IntlCaster.php @@ -21,6 +21,9 @@ */ class IntlCaster { + /** + * @return array + */ public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub $stub, bool $isNested) { $a += [ @@ -31,6 +34,9 @@ public static function castMessageFormatter(\MessageFormatter $c, array $a, Stub return self::castError($c, $a); } + /** + * @return array + */ public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $a += [ @@ -108,6 +114,9 @@ public static function castNumberFormatter(\NumberFormatter $c, array $a, Stub $ return self::castError($c, $a); } + /** + * @return array + */ public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, bool $isNested) { $a += [ @@ -125,6 +134,9 @@ public static function castIntlTimeZone(\IntlTimeZone $c, array $a, Stub $stub, return self::castError($c, $a); } + /** + * @return array + */ public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $a += [ @@ -142,6 +154,9 @@ public static function castIntlCalendar(\IntlCalendar $c, array $a, Stub $stub, return self::castError($c, $a); } + /** + * @return array + */ public static function castIntlDateFormatter(\IntlDateFormatter $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $a += [ diff --git a/app/vendor/symfony/var-dumper/Caster/LinkStub.php b/app/vendor/symfony/var-dumper/Caster/LinkStub.php index 4113e3a27..df95f8b0e 100644 --- a/app/vendor/symfony/var-dumper/Caster/LinkStub.php +++ b/app/vendor/symfony/var-dumper/Caster/LinkStub.php @@ -60,7 +60,7 @@ public function __construct(string $label, int $line = 0, string $href = null) } } - private function getComposerRoot(string $file, bool &$inVendor) + private function getComposerRoot(string $file, bool &$inVendor): string|false { if (!isset(self::$vendorRoots)) { self::$vendorRoots = []; diff --git a/app/vendor/symfony/var-dumper/Caster/MemcachedCaster.php b/app/vendor/symfony/var-dumper/Caster/MemcachedCaster.php index bc1fd63fa..2f161e8cb 100644 --- a/app/vendor/symfony/var-dumper/Caster/MemcachedCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/MemcachedCaster.php @@ -23,6 +23,9 @@ class MemcachedCaster private static array $optionConstants; private static array $defaultOptions; + /** + * @return array + */ public static function castMemcached(\Memcached $c, array $a, Stub $stub, bool $isNested) { $a += [ diff --git a/app/vendor/symfony/var-dumper/Caster/PdoCaster.php b/app/vendor/symfony/var-dumper/Caster/PdoCaster.php index 0372a6301..d68eae216 100644 --- a/app/vendor/symfony/var-dumper/Caster/PdoCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/PdoCaster.php @@ -59,6 +59,9 @@ class PdoCaster ], ]; + /** + * @return array + */ public static function castPdo(\PDO $c, array $a, Stub $stub, bool $isNested) { $attr = []; @@ -108,6 +111,9 @@ public static function castPdo(\PDO $c, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; diff --git a/app/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/app/vendor/symfony/var-dumper/Caster/PgSqlCaster.php index d8e5b5253..0d8b3d919 100644 --- a/app/vendor/symfony/var-dumper/Caster/PgSqlCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/PgSqlCaster.php @@ -69,6 +69,9 @@ class PgSqlCaster 'function' => \PGSQL_DIAG_SOURCE_FUNCTION, ]; + /** + * @return array + */ public static function castLargeObject($lo, array $a, Stub $stub, bool $isNested) { $a['seek position'] = pg_lo_tell($lo); @@ -76,6 +79,9 @@ public static function castLargeObject($lo, array $a, Stub $stub, bool $isNested return $a; } + /** + * @return array + */ public static function castLink($link, array $a, Stub $stub, bool $isNested) { $a['status'] = pg_connection_status($link); @@ -108,6 +114,9 @@ public static function castLink($link, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castResult($result, array $a, Stub $stub, bool $isNested) { $a['num rows'] = pg_num_rows($result); diff --git a/app/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php b/app/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php index e7120191f..eb6c88db6 100644 --- a/app/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/ProxyManagerCaster.php @@ -21,6 +21,9 @@ */ class ProxyManagerCaster { + /** + * @return array + */ public static function castProxy(ProxyInterface $c, array $a, Stub $stub, bool $isNested) { if ($parent = get_parent_class($c)) { diff --git a/app/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php b/app/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php index 82b8c8aff..fcaa1b768 100644 --- a/app/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/RdKafkaCaster.php @@ -31,6 +31,9 @@ */ class RdKafkaCaster { + /** + * @return array + */ public static function castKafkaConsumer(KafkaConsumer $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -51,6 +54,9 @@ public static function castKafkaConsumer(KafkaConsumer $c, array $a, Stub $stub, return $a; } + /** + * @return array + */ public static function castTopic(Topic $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -62,6 +68,9 @@ public static function castTopic(Topic $c, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castTopicPartition(TopicPartition $c, array $a) { $prefix = Caster::PREFIX_VIRTUAL; @@ -75,6 +84,9 @@ public static function castTopicPartition(TopicPartition $c, array $a) return $a; } + /** + * @return array + */ public static function castMessage(Message $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -86,6 +98,9 @@ public static function castMessage(Message $c, array $a, Stub $stub, bool $isNes return $a; } + /** + * @return array + */ public static function castConf(Conf $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -97,6 +112,9 @@ public static function castConf(Conf $c, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castTopicConf(TopicConf $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -108,6 +126,9 @@ public static function castTopicConf(TopicConf $c, array $a, Stub $stub, bool $i return $a; } + /** + * @return array + */ public static function castRdKafka(\RdKafka $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -121,6 +142,9 @@ public static function castRdKafka(\RdKafka $c, array $a, Stub $stub, bool $isNe return $a; } + /** + * @return array + */ public static function castCollectionMetadata(CollectionMetadata $c, array $a, Stub $stub, bool $isNested) { $a += iterator_to_array($c); @@ -128,6 +152,9 @@ public static function castCollectionMetadata(CollectionMetadata $c, array $a, S return $a; } + /** + * @return array + */ public static function castTopicMetadata(TopicMetadata $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -140,6 +167,9 @@ public static function castTopicMetadata(TopicMetadata $c, array $a, Stub $stub, return $a; } + /** + * @return array + */ public static function castPartitionMetadata(PartitionMetadata $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -153,6 +183,9 @@ public static function castPartitionMetadata(PartitionMetadata $c, array $a, Stu return $a; } + /** + * @return array + */ public static function castBrokerMetadata(BrokerMetadata $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -166,6 +199,9 @@ public static function castBrokerMetadata(BrokerMetadata $c, array $a, Stub $stu return $a; } + /** + * @return array + */ private static function extractMetadata(KafkaConsumer|\RdKafka $c) { $prefix = Caster::PREFIX_VIRTUAL; diff --git a/app/vendor/symfony/var-dumper/Caster/RedisCaster.php b/app/vendor/symfony/var-dumper/Caster/RedisCaster.php index eac25a12a..6ff046754 100644 --- a/app/vendor/symfony/var-dumper/Caster/RedisCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/RedisCaster.php @@ -11,6 +11,7 @@ namespace Symfony\Component\VarDumper\Caster; +use Relay\Relay; use Symfony\Component\VarDumper\Cloner\Stub; /** @@ -23,15 +24,15 @@ class RedisCaster { private const SERIALIZERS = [ - \Redis::SERIALIZER_NONE => 'NONE', - \Redis::SERIALIZER_PHP => 'PHP', + 0 => 'NONE', // Redis::SERIALIZER_NONE + 1 => 'PHP', // Redis::SERIALIZER_PHP 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY ]; private const MODES = [ - \Redis::ATOMIC => 'ATOMIC', - \Redis::MULTI => 'MULTI', - \Redis::PIPELINE => 'PIPELINE', + 0 => 'ATOMIC', // Redis::ATOMIC + 1 => 'MULTI', // Redis::MULTI + 2 => 'PIPELINE', // Redis::PIPELINE ]; private const COMPRESSION_MODES = [ @@ -46,7 +47,10 @@ class RedisCaster \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES', ]; - public static function castRedis(\Redis $c, array $a, Stub $stub, bool $isNested) + /** + * @return array + */ + public static function castRedis(\Redis|Relay $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -72,6 +76,9 @@ public static function castRedis(\Redis $c, array $a, Stub $stub, bool $isNested ]; } + /** + * @return array + */ public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -84,6 +91,9 @@ public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool ]; } + /** + * @return array + */ public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -102,9 +112,9 @@ public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, return $a; } - private static function getRedisOptions(\Redis|\RedisArray|\RedisCluster $redis, array $options = []): EnumStub + private static function getRedisOptions(\Redis|Relay|\RedisArray|\RedisCluster $redis, array $options = []): EnumStub { - $serializer = $redis->getOption(\Redis::OPT_SERIALIZER); + $serializer = $redis->getOption(\defined('Redis::OPT_SERIALIZER') ? \Redis::OPT_SERIALIZER : 1); if (\is_array($serializer)) { foreach ($serializer as &$v) { if (isset(self::SERIALIZERS[$v])) { @@ -136,11 +146,11 @@ private static function getRedisOptions(\Redis|\RedisArray|\RedisCluster $redis, } $options += [ - 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0, - 'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT), + 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : Relay::OPT_TCP_KEEPALIVE, + 'READ_TIMEOUT' => $redis->getOption(\defined('Redis::OPT_READ_TIMEOUT') ? \Redis::OPT_READ_TIMEOUT : Relay::OPT_READ_TIMEOUT), 'COMPRESSION' => $compression, 'SERIALIZER' => $serializer, - 'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX), + 'PREFIX' => $redis->getOption(\defined('Redis::OPT_PREFIX') ? \Redis::OPT_PREFIX : Relay::OPT_PREFIX), 'SCAN' => $retry, ]; diff --git a/app/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/app/vendor/symfony/var-dumper/Caster/ReflectionCaster.php index 00675dfdc..4adb9bc9f 100644 --- a/app/vendor/symfony/var-dumper/Caster/ReflectionCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/ReflectionCaster.php @@ -35,6 +35,9 @@ class ReflectionCaster 'isVariadic' => 'isVariadic', ]; + /** + * @return array + */ public static function castClosure(\Closure $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; @@ -71,6 +74,9 @@ public static function castClosure(\Closure $c, array $a, Stub $stub, bool $isNe return $a; } + /** + * @return array + */ public static function unsetClosureFileInfo(\Closure $c, array $a) { unset($a[Caster::PREFIX_VIRTUAL.'file'], $a[Caster::PREFIX_VIRTUAL.'line']); @@ -78,7 +84,7 @@ public static function unsetClosureFileInfo(\Closure $c, array $a) return $a; } - public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $isNested) + public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $isNested): array { // Cannot create ReflectionGenerator based on a terminated Generator try { @@ -92,6 +98,9 @@ public static function castGenerator(\Generator $c, array $a, Stub $stub, bool $ return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested); } + /** + * @return array + */ public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -114,6 +123,9 @@ public static function castType(\ReflectionType $c, array $a, Stub $stub, bool $ return $a; } + /** + * @return array + */ public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested) { self::addMap($a, $c, [ @@ -124,6 +136,9 @@ public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $st return $a; } + /** + * @return array + */ public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -159,6 +174,9 @@ public static function castReflectionGenerator(\ReflectionGenerator $c, array $a return $a; } + /** + * @return array + */ public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; @@ -190,6 +208,9 @@ public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0) { $prefix = Caster::PREFIX_VIRTUAL; @@ -248,6 +269,9 @@ public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, arra return $a; } + /** + * @return array + */ public static function castClassConstant(\ReflectionClassConstant $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); @@ -258,6 +282,9 @@ public static function castClassConstant(\ReflectionClassConstant $c, array $a, return $a; } + /** + * @return array + */ public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); @@ -265,6 +292,9 @@ public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bo return $a; } + /** + * @return array + */ public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -305,6 +335,9 @@ public static function castParameter(\ReflectionParameter $c, array $a, Stub $st return $a; } + /** + * @return array + */ public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); @@ -315,6 +348,9 @@ public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub return $a; } + /** + * @return array + */ public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId(); @@ -322,6 +358,9 @@ public static function castReference(\ReflectionReference $c, array $a, Stub $st return $a; } + /** + * @return array + */ public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested) { self::addMap($a, $c, [ @@ -338,6 +377,9 @@ public static function castExtension(\ReflectionExtension $c, array $a, Stub $st return $a; } + /** + * @return array + */ public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested) { self::addMap($a, $c, [ @@ -350,6 +392,9 @@ public static function castZendExtension(\ReflectionZendExtension $c, array $a, return $a; } + /** + * @return string + */ public static function getSignature(array $a) { $prefix = Caster::PREFIX_VIRTUAL; @@ -402,7 +447,7 @@ public static function getSignature(array $a) return $signature; } - private static function addExtra(array &$a, \Reflector $c) + private static function addExtra(array &$a, \Reflector $c): void { $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : []; @@ -418,7 +463,7 @@ private static function addExtra(array &$a, \Reflector $c) } } - private static function addMap(array &$a, object $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL) + private static function addMap(array &$a, object $c, array $map, string $prefix = Caster::PREFIX_VIRTUAL): void { foreach ($map as $k => $m) { if ('isDisabled' === $k) { diff --git a/app/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/app/vendor/symfony/var-dumper/Caster/ResourceCaster.php index 6db234e86..f3bbf3be4 100644 --- a/app/vendor/symfony/var-dumper/Caster/ResourceCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/ResourceCaster.php @@ -27,6 +27,9 @@ public static function castCurl(\CurlHandle $h, array $a, Stub $stub, bool $isNe return curl_getinfo($h); } + /** + * @return array + */ public static function castDba($dba, array $a, Stub $stub, bool $isNested) { $list = dba_list(); @@ -35,12 +38,15 @@ public static function castDba($dba, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castProcess($process, array $a, Stub $stub, bool $isNested) { return proc_get_status($process); } - public static function castStream($stream, array $a, Stub $stub, bool $isNested) + public static function castStream($stream, array $a, Stub $stub, bool $isNested): array { $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested); if ($a['uri'] ?? false) { @@ -50,11 +56,17 @@ public static function castStream($stream, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castStreamContext($stream, array $a, Stub $stub, bool $isNested) { return @stream_context_get_params($stream) ?: $a; } + /** + * @return array + */ public static function castGd($gd, array $a, Stub $stub, bool $isNested) { $a['size'] = imagesx($gd).'x'.imagesy($gd); @@ -63,6 +75,9 @@ public static function castGd($gd, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castOpensslX509($h, array $a, Stub $stub, bool $isNested) { $stub->cut = -1; diff --git a/app/vendor/symfony/var-dumper/Caster/ScalarStub.php b/app/vendor/symfony/var-dumper/Caster/ScalarStub.php new file mode 100644 index 000000000..3bb1935b8 --- /dev/null +++ b/app/vendor/symfony/var-dumper/Caster/ScalarStub.php @@ -0,0 +1,27 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\VarDumper\Caster; + +use Symfony\Component\VarDumper\Cloner\Stub; + +/** + * Represents any arbitrary value. + * + * @author Alexandre Daubois + */ +class ScalarStub extends Stub +{ + public function __construct(mixed $value) + { + $this->value = $value; + } +} diff --git a/app/vendor/symfony/var-dumper/Caster/SplCaster.php b/app/vendor/symfony/var-dumper/Caster/SplCaster.php index 448afbad9..814d824d1 100644 --- a/app/vendor/symfony/var-dumper/Caster/SplCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/SplCaster.php @@ -29,16 +29,25 @@ class SplCaster \SplFileObject::READ_CSV => 'READ_CSV', ]; + /** + * @return array + */ public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, bool $isNested) { return self::castSplArray($c, $a, $stub, $isNested); } + /** + * @return array + */ public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, bool $isNested) { return self::castSplArray($c, $a, $stub, $isNested); } + /** + * @return array + */ public static function castHeap(\Iterator $c, array $a, Stub $stub, bool $isNested) { $a += [ @@ -48,6 +57,9 @@ public static function castHeap(\Iterator $c, array $a, Stub $stub, bool $isNest return $a; } + /** + * @return array + */ public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, bool $isNested) { $prefix = Caster::PREFIX_VIRTUAL; @@ -63,6 +75,9 @@ public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, S return $a; } + /** + * @return array + */ public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, bool $isNested) { static $map = [ @@ -139,6 +154,9 @@ public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, bool $isNested) { static $map = [ @@ -176,6 +194,9 @@ public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, b return $a; } + /** + * @return array + */ public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, bool $isNested) { $storage = []; @@ -184,10 +205,10 @@ public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $s $clone = clone $c; foreach ($clone as $obj) { - $storage[] = [ + $storage[] = new EnumStub([ 'object' => $obj, 'info' => $clone->getInfo(), - ]; + ]); } $a += [ @@ -197,6 +218,9 @@ public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $s return $a; } + /** + * @return array + */ public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator(); @@ -204,6 +228,9 @@ public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub return $a; } + /** + * @return array + */ public static function castWeakReference(\WeakReference $c, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'object'] = $c->get(); @@ -211,6 +238,27 @@ public static function castWeakReference(\WeakReference $c, array $a, Stub $stub return $a; } + /** + * @return array + */ + public static function castWeakMap(\WeakMap $c, array $a, Stub $stub, bool $isNested) + { + $map = []; + + foreach (clone $c as $obj => $data) { + $map[] = new EnumStub([ + 'object' => $obj, + 'data' => $data, + ]); + } + + $a += [ + Caster::PREFIX_VIRTUAL.'map' => $map, + ]; + + return $a; + } + private static function castSplArray(\ArrayObject|\ArrayIterator $c, array $a, Stub $stub, bool $isNested): array { $prefix = Caster::PREFIX_VIRTUAL; @@ -221,7 +269,11 @@ private static function castSplArray(\ArrayObject|\ArrayIterator $c, array $a, S $a = Caster::castObject($c, $c::class, method_exists($c, '__debugInfo'), $stub->class); $c->setFlags($flags); } + + unset($a["\0ArrayObject\0storage"], $a["\0ArrayIterator\0storage"]); + $a += [ + $prefix.'storage' => $c->getArrayCopy(), $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST), $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS), ]; diff --git a/app/vendor/symfony/var-dumper/Caster/StubCaster.php b/app/vendor/symfony/var-dumper/Caster/StubCaster.php index 32ead7c27..4b93ff76f 100644 --- a/app/vendor/symfony/var-dumper/Caster/StubCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/StubCaster.php @@ -22,6 +22,9 @@ */ class StubCaster { + /** + * @return array + */ public static function castStub(Stub $c, array $a, Stub $stub, bool $isNested) { if ($isNested) { @@ -43,11 +46,17 @@ public static function castStub(Stub $c, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, bool $isNested) { return $isNested ? $c->preservedSubset : $a; } + /** + * @return array + */ public static function cutInternals($obj, array $a, Stub $stub, bool $isNested) { if ($isNested) { @@ -59,6 +68,9 @@ public static function cutInternals($obj, array $a, Stub $stub, bool $isNested) return $a; } + /** + * @return array + */ public static function castEnum(EnumStub $c, array $a, Stub $stub, bool $isNested) { if ($isNested) { @@ -81,4 +93,15 @@ public static function castEnum(EnumStub $c, array $a, Stub $stub, bool $isNeste return $a; } + + /** + * @return array + */ + public static function castScalar(ScalarStub $scalarStub, array $a, Stub $stub) + { + $stub->type = Stub::TYPE_SCALAR; + $stub->attr['value'] = $scalarStub->value; + + return $a; + } } diff --git a/app/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/app/vendor/symfony/var-dumper/Caster/SymfonyCaster.php index 3b13666cc..ebc00f90e 100644 --- a/app/vendor/symfony/var-dumper/Caster/SymfonyCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/SymfonyCaster.php @@ -31,6 +31,9 @@ class SymfonyCaster 'format' => 'getRequestFormat', ]; + /** + * @return array + */ public static function castRequest(Request $request, array $a, Stub $stub, bool $isNested) { $clone = null; @@ -46,6 +49,9 @@ public static function castRequest(Request $request, array $a, Stub $stub, bool return $a; } + /** + * @return array + */ public static function castHttpClient($client, array $a, Stub $stub, bool $isNested) { $multiKey = sprintf("\0%s\0multi", $client::class); @@ -56,6 +62,9 @@ public static function castHttpClient($client, array $a, Stub $stub, bool $isNes return $a; } + /** + * @return array + */ public static function castHttpClientResponse($response, array $a, Stub $stub, bool $isNested) { $stub->cut += \count($a); @@ -68,6 +77,9 @@ public static function castHttpClientResponse($response, array $a, Stub $stub, b return $a; } + /** + * @return array + */ public static function castLazyObjectState($state, array $a, Stub $stub, bool $isNested) { if (!$isNested) { @@ -93,6 +105,9 @@ public static function castLazyObjectState($state, array $a, Stub $stub, bool $i return $a; } + /** + * @return array + */ public static function castUuid(Uuid $uuid, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'toBase58'] = $uuid->toBase58(); @@ -106,6 +121,9 @@ public static function castUuid(Uuid $uuid, array $a, Stub $stub, bool $isNested return $a; } + /** + * @return array + */ public static function castUlid(Ulid $ulid, array $a, Stub $stub, bool $isNested) { $a[Caster::PREFIX_VIRTUAL.'toBase58'] = $ulid->toBase58(); diff --git a/app/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/app/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php index 506746b46..d802bbf2a 100644 --- a/app/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php @@ -43,6 +43,9 @@ class XmlReaderCaster \XMLReader::XML_DECLARATION => 'XML_DECLARATION', ]; + /** + * @return array + */ public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, bool $isNested) { try { diff --git a/app/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/app/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php index ba55fcedd..0cf42584a 100644 --- a/app/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php +++ b/app/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php @@ -47,6 +47,9 @@ class XmlResourceCaster \XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING', ]; + /** + * @return array + */ public static function castXml($h, array $a, Stub $stub, bool $isNested) { $a['current_byte_index'] = xml_get_current_byte_index($h); diff --git a/app/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/app/vendor/symfony/var-dumper/Cloner/AbstractCloner.php index 6c3efdeb6..6a746b88e 100644 --- a/app/vendor/symfony/var-dumper/Cloner/AbstractCloner.php +++ b/app/vendor/symfony/var-dumper/Cloner/AbstractCloner.php @@ -28,6 +28,7 @@ abstract class AbstractCloner implements ClonerInterface 'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'], 'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'], 'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'], + 'Symfony\Component\VarDumper\Caster\ScalarStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castScalar'], 'Fiber' => ['Symfony\Component\VarDumper\Caster\FiberCaster', 'castFiber'], @@ -94,6 +95,7 @@ abstract class AbstractCloner implements ClonerInterface 'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'], 'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'], 'Symfony\Component\VarDumper\Cloner\AbstractCloner' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'], + 'Symfony\Component\ErrorHandler\Exception\FlattenException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFlattenException'], 'Symfony\Component\ErrorHandler\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'], 'Imagine\Image\ImageInterface' => ['Symfony\Component\VarDumper\Caster\ImagineCaster', 'castImage'], @@ -125,9 +127,11 @@ abstract class AbstractCloner implements ClonerInterface 'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'], 'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'], 'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'], + 'WeakMap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakMap'], 'WeakReference' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castWeakReference'], 'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], + 'Relay\Relay' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'], 'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'], 'RedisCluster' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisCluster'], @@ -229,6 +233,8 @@ public function __construct(array $casters = null) * see e.g. static::$defaultCasters. * * @param callable[] $casters A map of casters + * + * @return void */ public function addCasters(array $casters) { @@ -239,6 +245,8 @@ public function addCasters(array $casters) /** * Sets the maximum number of items to clone past the minimum depth in nested structures. + * + * @return void */ public function setMaxItems(int $maxItems) { @@ -247,6 +255,8 @@ public function setMaxItems(int $maxItems) /** * Sets the maximum cloned length for strings. + * + * @return void */ public function setMaxString(int $maxString) { @@ -256,6 +266,8 @@ public function setMaxString(int $maxString) /** * Sets the minimum tree depth where we are guaranteed to clone all the items. After this * depth is reached, only setMaxItems items will be cloned. + * + * @return void */ public function setMinDepth(int $minDepth) { diff --git a/app/vendor/symfony/var-dumper/Cloner/Data.php b/app/vendor/symfony/var-dumper/Cloner/Data.php index 6ecb883e8..928f72d7a 100644 --- a/app/vendor/symfony/var-dumper/Cloner/Data.php +++ b/app/vendor/symfony/var-dumper/Cloner/Data.php @@ -211,6 +211,11 @@ public function withContext(array $context): static return $data; } + public function getContext(): array + { + return $this->context; + } + /** * Seeks to a specific key in nested data structures. */ @@ -257,21 +262,21 @@ public function seek(string|int $key): ?static /** * Dumps data with a DumperInterface dumper. + * + * @return void */ public function dump(DumperInterface $dumper) { $refs = [0]; $cursor = new Cursor(); + $cursor->hashType = -1; + $cursor->attr = $this->context[SourceContextProvider::class] ?? []; + $label = $this->context['label'] ?? ''; - if ($cursor->attr = $this->context[SourceContextProvider::class] ?? []) { - $cursor->attr['if_links'] = true; - $cursor->hashType = -1; - $dumper->dumpScalar($cursor, 'default', '^'); - $cursor->attr = ['if_links' => true]; - $dumper->dumpScalar($cursor, 'default', ' '); - $cursor->hashType = 0; + if ($cursor->attr || '' !== $label) { + $dumper->dumpScalar($cursor, 'label', $label); } - + $cursor->hashType = 0; $this->dumpItem($dumper, $cursor, $refs, $this->data[$this->position][$this->key]); } @@ -280,7 +285,7 @@ public function dump(DumperInterface $dumper) * * @param mixed $item A Stub object or the original value being dumped */ - private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, mixed $item) + private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, mixed $item): void { $cursor->refIndex = 0; $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0; @@ -362,6 +367,10 @@ private function dumpItem(DumperInterface $dumper, Cursor $cursor, array &$refs, $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut); break; + case Stub::TYPE_SCALAR: + $dumper->dumpScalar($cursor, 'default', $item->attr['value']); + break; + default: throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type)); } @@ -402,7 +411,7 @@ private function dumpChildren(DumperInterface $dumper, Cursor $parentCursor, arr return $hashCut; } - private function getStub(mixed $item) + private function getStub(mixed $item): mixed { if (!$item || !\is_array($item)) { return $item; diff --git a/app/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/app/vendor/symfony/var-dumper/Cloner/DumperInterface.php index 61d02d240..4c5b315b6 100644 --- a/app/vendor/symfony/var-dumper/Cloner/DumperInterface.php +++ b/app/vendor/symfony/var-dumper/Cloner/DumperInterface.php @@ -20,6 +20,8 @@ interface DumperInterface { /** * Dumps a scalar value. + * + * @return void */ public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value); @@ -29,6 +31,8 @@ public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|n * @param string $str The string being dumped * @param bool $bin Whether $str is UTF-8 or binary encoded * @param int $cut The number of characters $str has been cut by + * + * @return void */ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut); @@ -38,6 +42,8 @@ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut); * @param int $type A Cursor::HASH_* const for the type of hash * @param string|int|null $class The object class, resource type or array count * @param bool $hasChild When the dump of the hash has child item + * + * @return void */ public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild); @@ -48,6 +54,8 @@ public function enterHash(Cursor $cursor, int $type, string|int|null $class, boo * @param string|int|null $class The object class, resource type or array count * @param bool $hasChild When the dump of the hash has child item * @param int $cut The number of items the hash has been cut by + * + * @return void */ public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut); } diff --git a/app/vendor/symfony/var-dumper/Cloner/Stub.php b/app/vendor/symfony/var-dumper/Cloner/Stub.php index 1c5b88712..0c2a4b9d0 100644 --- a/app/vendor/symfony/var-dumper/Cloner/Stub.php +++ b/app/vendor/symfony/var-dumper/Cloner/Stub.php @@ -23,6 +23,7 @@ class Stub public const TYPE_ARRAY = 3; public const TYPE_OBJECT = 4; public const TYPE_RESOURCE = 5; + public const TYPE_SCALAR = 6; public const STRING_BINARY = 1; public const STRING_UTF8 = 2; diff --git a/app/vendor/symfony/var-dumper/Cloner/VarCloner.php b/app/vendor/symfony/var-dumper/Cloner/VarCloner.php index 4068c7c38..e168d0d3b 100644 --- a/app/vendor/symfony/var-dumper/Cloner/VarCloner.php +++ b/app/vendor/symfony/var-dumper/Cloner/VarCloner.php @@ -16,7 +16,6 @@ */ class VarCloner extends AbstractCloner { - private static string $gid; private static array $arrayCache = []; protected function doClone(mixed $var): array @@ -41,7 +40,6 @@ protected function doClone(mixed $var): array $stub = null; // Stub capturing the main properties of an original item value // or null if the original value is used directly - $gid = self::$gid ??= md5(random_bytes(6)); // Unique string used to detect the special $GLOBALS variable $arrayStub = new Stub(); $arrayStub->type = Stub::TYPE_ARRAY; $fromObjCast = false; diff --git a/app/vendor/symfony/var-dumper/Command/ServerDumpCommand.php b/app/vendor/symfony/var-dumper/Command/ServerDumpCommand.php index 1b06e694f..b64a884b9 100644 --- a/app/vendor/symfony/var-dumper/Command/ServerDumpCommand.php +++ b/app/vendor/symfony/var-dumper/Command/ServerDumpCommand.php @@ -54,7 +54,7 @@ public function __construct(DumpServer $server, array $descriptors = []) parent::__construct(); } - protected function configure() + protected function configure(): void { $this ->addOption('format', null, InputOption::VALUE_REQUIRED, sprintf('The output format (%s)', implode(', ', $this->getAvailableFormats())), 'cli') diff --git a/app/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/app/vendor/symfony/var-dumper/Dumper/AbstractDumper.php index 2740b879e..053a90972 100644 --- a/app/vendor/symfony/var-dumper/Dumper/AbstractDumper.php +++ b/app/vendor/symfony/var-dumper/Dumper/AbstractDumper.php @@ -155,6 +155,8 @@ public function dump(Data $data, $output = null): ?string * * @param int $depth The recursive depth in the dumped structure for the line being dumped, * or -1 to signal the end-of-dump to the line dumper callable + * + * @return void */ protected function dumpLine(int $depth) { @@ -164,6 +166,8 @@ protected function dumpLine(int $depth) /** * Generic line dumper callback. + * + * @return void */ protected function echoLine(string $line, int $depth, string $indentPad) { diff --git a/app/vendor/symfony/var-dumper/Dumper/CliDumper.php b/app/vendor/symfony/var-dumper/Dumper/CliDumper.php index 660ca321a..b3358f515 100644 --- a/app/vendor/symfony/var-dumper/Dumper/CliDumper.php +++ b/app/vendor/symfony/var-dumper/Dumper/CliDumper.php @@ -51,6 +51,7 @@ class CliDumper extends AbstractDumper "\r" => '\r', "\033" => '\e', ]; + protected static $unicodeCharsRx = "/[\u{00A0}\u{00AD}\u{034F}\u{061C}\u{115F}\u{1160}\u{17B4}\u{17B5}\u{180E}\u{2000}-\u{200F}\u{202F}\u{205F}\u{2060}-\u{2064}\u{206A}-\u{206F}\u{3000}\u{2800}\u{3164}\u{FEFF}\u{FFA0}\u{1D159}\u{1D173}-\u{1D17A}]/u"; protected $collapseNextHash = false; protected $expandNextHash = false; @@ -85,6 +86,8 @@ public function __construct($output = null, string $charset = null, int $flags = /** * Enables/disables colored output. + * + * @return void */ public function setColors(bool $colors) { @@ -93,6 +96,8 @@ public function setColors(bool $colors) /** * Sets the maximum number of characters per line for dumped strings. + * + * @return void */ public function setMaxStringWidth(int $maxStringWidth) { @@ -103,6 +108,8 @@ public function setMaxStringWidth(int $maxStringWidth) * Configures styles. * * @param array $styles A map of style names to style definitions + * + * @return void */ public function setStyles(array $styles) { @@ -113,15 +120,21 @@ public function setStyles(array $styles) * Configures display options. * * @param array $displayOptions A map of display options to customize the behavior + * + * @return void */ public function setDisplayOptions(array $displayOptions) { $this->displayOptions = $displayOptions + $this->displayOptions; } + /** + * @return void + */ public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value) { $this->dumpKey($cursor); + $this->collapseNextHash = $this->expandNextHash = false; $style = 'const'; $attr = $cursor->attr; @@ -131,6 +144,11 @@ public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|n $style = 'default'; break; + case 'label': + $this->styles += ['label' => $this->styles['default']]; + $style = 'label'; + break; + case 'integer': $style = 'num'; @@ -174,9 +192,13 @@ public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|n $this->endValue($cursor); } + /** + * @return void + */ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) { $this->dumpKey($cursor); + $this->collapseNextHash = $this->expandNextHash = false; $attr = $cursor->attr; if ($bin) { @@ -262,11 +284,15 @@ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) } } + /** + * @return void + */ public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild) { $this->colors ??= $this->supportsColors(); $this->dumpKey($cursor); + $this->expandNextHash = false; $attr = $cursor->attr; if ($this->collapseNextHash) { @@ -298,6 +324,9 @@ public function enterHash(Cursor $cursor, int $type, string|int|null $class, boo } } + /** + * @return void + */ public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut) { if (empty($cursor->attr['cut_hash'])) { @@ -313,6 +342,8 @@ public function leaveHash(Cursor $cursor, int $type, string|int|null $class, boo * * @param bool $hasChild When the dump of the hash has child item * @param int $cut The number of items the hash has been cut by + * + * @return void */ protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut) { @@ -329,6 +360,8 @@ protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut) /** * Dumps a key in a hash structure. + * + * @return void */ protected function dumpKey(Cursor $cursor) { @@ -454,7 +487,15 @@ protected function style(string $style, string $value, array $attr = []): string return $s.$endCchr; }, $value, -1, $cchrCount); - if ($this->colors) { + if (!($attr['binary'] ?? false)) { + $value = preg_replace_callback(static::$unicodeCharsRx, function ($c) use (&$cchrCount, $startCchr, $endCchr) { + ++$cchrCount; + + return $startCchr.'\u{'.strtoupper(dechex(mb_ord($c[0]))).'}'.$endCchr; + }, $value); + } + + if ($this->colors && '' !== $value) { if ($cchrCount && "\033" === $value[0]) { $value = substr($value, \strlen($startCchr)); } else { @@ -477,10 +518,15 @@ protected function style(string $style, string $value, array $attr = []): string } } if (isset($attr['href'])) { + if ('label' === $style) { + $value .= '^'; + } $value = "\033]8;;{$attr['href']}\033\\{$value}\033]8;;\033\\"; } - } elseif ($attr['if_links'] ?? false) { - return ''; + } + + if ('label' === $style && '' !== $value) { + $value .= ' '; } return $value; @@ -525,6 +571,9 @@ protected function supportsColors(): bool return static::$defaultColors = $this->hasColorSupport($h); } + /** + * @return void + */ protected function dumpLine(int $depth, bool $endOfValue = false) { if ($this->colors) { @@ -533,6 +582,9 @@ protected function dumpLine(int $depth, bool $endOfValue = false) parent::dumpLine($depth); } + /** + * @return void + */ protected function endValue(Cursor $cursor) { if (-1 === $cursor->hashType) { @@ -609,7 +661,7 @@ private function isWindowsTrueColor(): bool return $result; } - private function getSourceLink(string $file, int $line) + private function getSourceLink(string $file, int $line): string|false { if ($fmt = $this->displayOptions['fileLinkFormat']) { return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : ($fmt->format($file, $line) ?: 'file://'.$file.'#L'.$line); diff --git a/app/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php b/app/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php index d36e8bcf6..790285c97 100644 --- a/app/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php +++ b/app/vendor/symfony/var-dumper/Dumper/ContextProvider/SourceContextProvider.php @@ -44,7 +44,7 @@ public function getContext(): ?array $file = $trace[1]['file']; $line = $trace[1]['line']; - $name = false; + $name = '-' === $file || 'Standard input code' === $file ? 'Standard input code' : false; $fileExcerpt = false; for ($i = 2; $i < $this->limit; ++$i) { diff --git a/app/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php b/app/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php index 1ba803d81..84cfb4259 100644 --- a/app/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php +++ b/app/vendor/symfony/var-dumper/Dumper/ContextualizedDumper.php @@ -31,13 +31,16 @@ public function __construct(DataDumperInterface $wrappedDumper, array $contextPr $this->contextProviders = $contextProviders; } + /** + * @return string|null + */ public function dump(Data $data) { - $context = []; + $context = $data->getContext(); foreach ($this->contextProviders as $contextProvider) { $context[$contextProvider::class] = $contextProvider->getContext(); } - $this->wrappedDumper->dump($data->withContext($context)); + return $this->wrappedDumper->dump($data->withContext($context)); } } diff --git a/app/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/app/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php index b173bccf3..df05b6af5 100644 --- a/app/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php +++ b/app/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php @@ -20,5 +20,8 @@ */ interface DataDumperInterface { + /** + * @return string|null + */ public function dump(Data $data); } diff --git a/app/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/app/vendor/symfony/var-dumper/Dumper/HtmlDumper.php index c818c919c..8a2570b2c 100644 --- a/app/vendor/symfony/var-dumper/Dumper/HtmlDumper.php +++ b/app/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -82,12 +82,18 @@ public function __construct($output = null, string $charset = null, int $flags = $this->styles = static::$themes['dark'] ?? self::$themes['dark']; } + /** + * @return void + */ public function setStyles(array $styles) { $this->headerIsDumped = false; $this->styles = $styles + $this->styles; } + /** + * @return void + */ public function setTheme(string $themeName) { if (!isset(static::$themes[$themeName])) { @@ -101,6 +107,8 @@ public function setTheme(string $themeName) * Configures display options. * * @param array $displayOptions A map of display options to customize the behavior + * + * @return void */ public function setDisplayOptions(array $displayOptions) { @@ -110,6 +118,8 @@ public function setDisplayOptions(array $displayOptions) /** * Sets an HTML header that will be dumped once in the output stream. + * + * @return void */ public function setDumpHeader(?string $header) { @@ -118,6 +128,8 @@ public function setDumpHeader(?string $header) /** * Sets an HTML prefix and suffix that will encapse every single dump. + * + * @return void */ public function setDumpBoundaries(string $prefix, string $suffix) { @@ -136,6 +148,8 @@ public function dump(Data $data, $output = null, array $extraDisplayOptions = [] /** * Dumps the HTML header. + * + * @return string */ protected function getDumpHeader() { @@ -149,19 +163,15 @@ protected function getDumpHeader() '.$this->dumpHeader; } + /** + * @return void + */ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) { if ('' === $str && isset($cursor->attr['img-data'], $cursor->attr['content-type'])) { @@ -788,6 +802,9 @@ public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) } } + /** + * @return void + */ public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild) { if (Cursor::HASH_OBJECT === $type) { @@ -816,6 +833,9 @@ public function enterHash(Cursor $cursor, int $type, string|int|null $class, boo } } + /** + * @return void + */ public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut) { $this->dumpEllipsis($cursor, $hasChild, $cut); @@ -827,7 +847,7 @@ public function leaveHash(Cursor $cursor, int $type, string|int|null $class, boo protected function style(string $style, string $value, array $attr = []): string { - if ('' === $value) { + if ('' === $value && ('label' !== $style || !isset($attr['file']) && !isset($attr['href']))) { return ''; } @@ -862,7 +882,6 @@ protected function style(string $style, string $value, array $attr = []): string } elseif ('private' === $style) { $style .= sprintf(' title="Private property defined in class: `%s`"', esc($this->utf8Encode($attr['class']))); } - $map = static::$controlCharsMap; if (isset($attr['ellipsis'])) { $class = 'sf-dump-ellipsis'; @@ -881,6 +900,7 @@ protected function style(string $style, string $value, array $attr = []): string } } + $map = static::$controlCharsMap; $v = "".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) { $s = $b = '%s', esc($this->utf8Encode($attr['href'])), $target, $v); } if (isset($attr['lang'])) { $v = sprintf('%s', esc($attr['lang']), $v); } + if ('label' === $style) { + $v .= ' '; + } return $v; } + /** + * @return void + */ protected function dumpLine(int $depth, bool $endOfValue = false) { if (-1 === $this->lastDepth) { @@ -944,7 +979,7 @@ protected function dumpLine(int $depth, bool $endOfValue = false) AbstractDumper::dumpLine($depth); } - private function getSourceLink(string $file, int $line) + private function getSourceLink(string $file, int $line): string|false { $options = $this->extraDisplayOptions + $this->displayOptions; @@ -956,7 +991,7 @@ private function getSourceLink(string $file, int $line) } } -function esc(string $str) +function esc(string $str): string { return htmlspecialchars($str, \ENT_QUOTES, 'UTF-8'); } diff --git a/app/vendor/symfony/var-dumper/Dumper/ServerDumper.php b/app/vendor/symfony/var-dumper/Dumper/ServerDumper.php index f2c891b6a..98c214933 100644 --- a/app/vendor/symfony/var-dumper/Dumper/ServerDumper.php +++ b/app/vendor/symfony/var-dumper/Dumper/ServerDumper.php @@ -41,10 +41,15 @@ public function getContextProviders(): array return $this->connection->getContextProviders(); } + /** + * @return string|null + */ public function dump(Data $data) { if (!$this->connection->write($data) && $this->wrappedDumper) { - $this->wrappedDumper->dump($data); + return $this->wrappedDumper->dump($data); } + + return null; } } diff --git a/app/vendor/symfony/var-dumper/Resources/functions/dump.php b/app/vendor/symfony/var-dumper/Resources/functions/dump.php index 6221a4d18..a0e5addff 100644 --- a/app/vendor/symfony/var-dumper/Resources/functions/dump.php +++ b/app/vendor/symfony/var-dumper/Resources/functions/dump.php @@ -9,40 +9,52 @@ * file that was distributed with this source code. */ +use Symfony\Component\VarDumper\Caster\ScalarStub; use Symfony\Component\VarDumper\VarDumper; if (!function_exists('dump')) { /** * @author Nicolas Grekas + * @author Alexandre Daubois */ - function dump(mixed $var, mixed ...$moreVars): mixed + function dump(mixed ...$vars): mixed { - VarDumper::dump($var); + if (!$vars) { + VarDumper::dump(new ScalarStub('🐛')); - foreach ($moreVars as $v) { - VarDumper::dump($v); + return null; } - if (1 < func_num_args()) { - return func_get_args(); + if (array_key_exists(0, $vars) && 1 === count($vars)) { + VarDumper::dump($vars[0]); + $k = 0; + } else { + foreach ($vars as $k => $v) { + VarDumper::dump($v, is_int($k) ? 1 + $k : $k); + } } - return $var; + if (1 < count($vars)) { + return $vars; + } + + return $vars[$k]; } } if (!function_exists('dd')) { - /** - * @return never - */ - function dd(...$vars): void + function dd(mixed ...$vars): never { if (!in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) && !headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } - foreach ($vars as $v) { - VarDumper::dump($v); + if (array_key_exists(0, $vars) && 1 === count($vars)) { + VarDumper::dump($vars[0]); + } else { + foreach ($vars as $k => $v) { + VarDumper::dump($v, is_int($k) ? 1 + $k : $k); + } } exit(1); diff --git a/app/vendor/symfony/var-dumper/Server/Connection.php b/app/vendor/symfony/var-dumper/Server/Connection.php index 97b5b94f3..3c0f36864 100644 --- a/app/vendor/symfony/var-dumper/Server/Connection.php +++ b/app/vendor/symfony/var-dumper/Server/Connection.php @@ -62,7 +62,7 @@ public function write(Data $data): bool $context = array_filter($context); $encodedPayload = base64_encode(serialize([$data, $context]))."\n"; - set_error_handler([self::class, 'nullErrorHandler']); + set_error_handler(fn () => true); try { if (-1 !== stream_socket_sendto($this->socket, $encodedPayload)) { return true; @@ -82,16 +82,14 @@ public function write(Data $data): bool return false; } - private static function nullErrorHandler(int $t, string $m) - { - // no-op - } - + /** + * @return resource|null + */ private function createSocket() { - set_error_handler([self::class, 'nullErrorHandler']); + set_error_handler(fn () => true); try { - return stream_socket_client($this->host, $errno, $errstr, 3, \STREAM_CLIENT_CONNECT | \STREAM_CLIENT_ASYNC_CONNECT); + return stream_socket_client($this->host, $errno, $errstr, 3) ?: null; } finally { restore_error_handler(); } diff --git a/app/vendor/symfony/var-dumper/VarDumper.php b/app/vendor/symfony/var-dumper/VarDumper.php index 840bfd649..2e1dad116 100644 --- a/app/vendor/symfony/var-dumper/VarDumper.php +++ b/app/vendor/symfony/var-dumper/VarDumper.php @@ -37,13 +37,19 @@ class VarDumper */ private static $handler; - public static function dump(mixed $var) + /** + * @param string|null $label + * + * @return mixed + */ + public static function dump(mixed $var/* , string $label = null */) { + $label = 2 <= \func_num_args() ? func_get_arg(1) : null; if (null === self::$handler) { self::register(); } - return (self::$handler)($var); + return (self::$handler)($var, $label); } public static function setHandler(callable $callable = null): ?callable @@ -90,8 +96,14 @@ private static function register(): void $dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]); } - self::$handler = function ($var) use ($cloner, $dumper) { - $dumper->dump($cloner->cloneVar($var)); + self::$handler = function ($var, string $label = null) use ($cloner, $dumper) { + $var = $cloner->cloneVar($var); + + if (null !== $label) { + $var = $var->withContext(['label' => $label]); + } + + $dumper->dump($var); }; } diff --git a/app/vendor/symfony/var-dumper/composer.json b/app/vendor/symfony/var-dumper/composer.json index 71ec64c0d..86383f22e 100644 --- a/app/vendor/symfony/var-dumper/composer.json +++ b/app/vendor/symfony/var-dumper/composer.json @@ -17,24 +17,20 @@ ], "require": { "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { "ext-iconv": "*", "symfony/console": "^5.4|^6.0", + "symfony/http-kernel": "^5.4|^6.0", "symfony/process": "^5.4|^6.0", "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "conflict": { - "phpunit/phpunit": "<5.4.3", "symfony/console": "<5.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" - }, "autoload": { "files": [ "Resources/functions/dump.php" ], "psr-4": { "Symfony\\Component\\VarDumper\\": "" }, diff --git a/app/vendor/twbs/bootstrap/.bundlewatch.config.json b/app/vendor/twbs/bootstrap/.bundlewatch.config.json index 143753b59..bb0a5a85a 100644 --- a/app/vendor/twbs/bootstrap/.bundlewatch.config.json +++ b/app/vendor/twbs/bootstrap/.bundlewatch.config.json @@ -2,43 +2,43 @@ "files": [ { "path": "./dist/css/bootstrap-grid.css", - "maxSize": "7.5 kB" + "maxSize": "6.5 kB" }, { "path": "./dist/css/bootstrap-grid.min.css", - "maxSize": "6.55 kB" + "maxSize": "6.0 kB" }, { "path": "./dist/css/bootstrap-reboot.css", - "maxSize": "2.75 kB" + "maxSize": "3.5 kB" }, { "path": "./dist/css/bootstrap-reboot.min.css", - "maxSize": "2.5 kB" + "maxSize": "3.25 kB" }, { "path": "./dist/css/bootstrap-utilities.css", - "maxSize": "9.25 kB" + "maxSize": "11.75 kB" }, { "path": "./dist/css/bootstrap-utilities.min.css", - "maxSize": "8.5 kB" + "maxSize": "10.75 kB" }, { "path": "./dist/css/bootstrap.css", - "maxSize": "28.75 kB" + "maxSize": "32.5 kB" }, { "path": "./dist/css/bootstrap.min.css", - "maxSize": "26.75 kB" + "maxSize": "30.25 kB" }, { "path": "./dist/js/bootstrap.bundle.js", - "maxSize": "43.25 kB" + "maxSize": "43.0 kB" }, { "path": "./dist/js/bootstrap.bundle.min.js", - "maxSize": "22.75 kB" + "maxSize": "23.25 kB" }, { "path": "./dist/js/bootstrap.esm.js", @@ -46,7 +46,7 @@ }, { "path": "./dist/js/bootstrap.esm.min.js", - "maxSize": "18.5 kB" + "maxSize": "18.25 kB" }, { "path": "./dist/js/bootstrap.js", diff --git a/app/vendor/twbs/bootstrap/.cspell.json b/app/vendor/twbs/bootstrap/.cspell.json index d528823b1..484af2af5 100644 --- a/app/vendor/twbs/bootstrap/.cspell.json +++ b/app/vendor/twbs/bootstrap/.cspell.json @@ -8,6 +8,7 @@ "autohiding", "autoplay", "autoplays", + "autoplaying", "blazingly", "Blockquotes", "Bootstrappers", @@ -39,6 +40,7 @@ "dropright", "dropstart", "dropup", + "dgst", "errorf", "favicon", "favicons", @@ -107,6 +109,7 @@ "unstyled", "Uppercased", "urlize", + "urlquery", "vbtn", "viewports", "Vite", diff --git a/app/vendor/twbs/bootstrap/.eslintignore b/app/vendor/twbs/bootstrap/.eslintignore index 04bae1541..4c5b84f35 100644 --- a/app/vendor/twbs/bootstrap/.eslintignore +++ b/app/vendor/twbs/bootstrap/.eslintignore @@ -3,6 +3,5 @@ **/vendor/ /_site/ /js/coverage/ -/js/tests/integration/ /site/static/sw.js -/site/layouts/ +/site/layouts/partials/ diff --git a/app/vendor/twbs/bootstrap/.eslintrc.json b/app/vendor/twbs/bootstrap/.eslintrc.json index d8e83a8d2..6c9c24d46 100644 --- a/app/vendor/twbs/bootstrap/.eslintrc.json +++ b/app/vendor/twbs/bootstrap/.eslintrc.json @@ -14,6 +14,35 @@ "error", "never" ], + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "always" + } + ], + "import/first": "error", + "import/newline-after-import": "error", + "import/no-absolute-path": "error", + "import/no-amd": "error", + "import/no-cycle": [ + "error", + { + "ignoreExternal": true + } + ], + "import/no-duplicates": "error", + "import/no-extraneous-dependencies": "error", + "import/no-mutable-exports": "error", + "import/no-named-as-default": "error", + "import/no-named-as-default-member": "error", + "import/no-named-default": "error", + "import/no-self-import": "error", + "import/no-unassigned-import": [ + "error" + ], + "import/no-useless-path-segments": "error", + "import/order": "error", "indent": [ "error", 2, @@ -46,20 +75,146 @@ "error", "after" ], + "prefer-template": "error", "semi": [ "error", "never" ], + "strict": "error", "unicorn/explicit-length-check": "off", + "unicorn/filename-case": "off", "unicorn/no-array-callback-reference": "off", "unicorn/no-array-method-this-argument": "off", "unicorn/no-null": "off", + "unicorn/no-typeof-undefined": "off", "unicorn/no-unused-properties": "error", + "unicorn/numeric-separators-style": "off", "unicorn/prefer-array-flat": "off", + "unicorn/prefer-at": "off", "unicorn/prefer-dom-node-dataset": "off", "unicorn/prefer-module": "off", "unicorn/prefer-query-selector": "off", "unicorn/prefer-spread": "off", + "unicorn/prefer-string-replace-all": "off", "unicorn/prevent-abbreviations": "off" - } + }, + "overrides": [ + { + "files": [ + "build/**" + ], + "env": { + "browser": false, + "node": true + }, + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "no-console": "off", + "unicorn/prefer-top-level-await": "off" + } + }, + { + "files": [ + "js/**" + ], + "parserOptions": { + "sourceType": "module" + } + }, + { + "files": [ + "js/tests/*.js", + "js/tests/integration/rollup*.js" + ], + "env": { + "node": true + }, + "parserOptions": { + "sourceType": "script" + } + }, + { + "files": [ + "js/tests/unit/**" + ], + "env": { + "jasmine": true + }, + "rules": { + "no-console": "off", + "unicorn/consistent-function-scoping": "off", + "unicorn/no-useless-undefined": "off", + "unicorn/prefer-add-event-listener": "off" + } + }, + { + "files": [ + "js/tests/visual/**" + ], + "plugins": [ + "html" + ], + "settings": { + "html/html-extensions": [ + ".html" + ] + }, + "rules": { + "no-console": "off", + "no-new": "off", + "unicorn/no-array-for-each": "off" + } + }, + { + "files": [ + "scss/tests/**" + ], + "env": { + "node": true + }, + "parserOptions": { + "sourceType": "script" + } + }, + { + "files": [ + "site/**" + ], + "env": { + "browser": true, + "node": false + }, + "parserOptions": { + "sourceType": "script", + "ecmaVersion": 2019 + }, + "rules": { + "no-new": "off", + "unicorn/no-array-for-each": "off" + } + }, + { + "files": [ + "**/*.md" + ], + "plugins": [ + "markdown" + ], + "processor": "markdown/markdown" + }, + { + "files": [ + "**/*.md/*.js" + ], + "extends": "plugin:markdown/recommended", + "parserOptions": { + "sourceType": "module" + }, + "rules": { + "unicorn/prefer-node-protocol": "off" + } + } + ] } diff --git a/app/vendor/twbs/bootstrap/.github/CONTRIBUTING.md b/app/vendor/twbs/bootstrap/.github/CONTRIBUTING.md index c7211e689..d18210b28 100644 --- a/app/vendor/twbs/bootstrap/.github/CONTRIBUTING.md +++ b/app/vendor/twbs/bootstrap/.github/CONTRIBUTING.md @@ -18,19 +18,26 @@ the preferred channel for [bug reports](#bug-reports), [features requests](#feat and [submitting pull requests](#pull-requests), but please respect the following restrictions: -* Please **do not** use the issue tracker for personal support requests. Stack Overflow ([`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag), [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions) or [IRC](/README.md#community) are better places to get help. +- Please **do not** use the issue tracker for personal support requests. Stack Overflow ([`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5) tag), [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions) or [IRC](/README.md#community) are better places to get help. -* Please **do not** derail or troll issues. Keep the discussion on topic and +- Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others. -* Please **do not** post comments consisting solely of "+1" or ":thumbsup:". +- Please **do not** post comments consisting solely of "+1" or ":thumbsup:". Use [GitHub's "reactions" feature](https://blog.github.com/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/) instead. We reserve the right to delete comments which violate this rule. -* Please **do not** open issues regarding the official themes offered on . +- Please **do not** open issues regarding the official themes offered on . Instead, please email any questions or feedback regarding those themes to `themes AT getbootstrap DOT com`. +## Issues assignment + +The core team will be looking at the open issues, analyze them, and provide guidance on how to proceed. **Issues won't be assigned to anyone outside the core team.** However, contributors are welcome to participate in the discussion and provide their input on how to best solve the issue, and even submit a PR if they want to. Please wait that the issue is ready to be worked on before submitting a PR, we don't want to waste your time. + +Please keep in mind that the core team is small, has limited resources and that we are not always able to respond immediately. We will try to provide feedback as soon as possible, but please be patient. If you don't get a response immediately, it doesn't mean that we are ignoring you or that we don't care about your issue or PR. We will get back to you as soon as we can. + + ## Issues and labels Our bug tracker utilizes several labels to help organize and identify issues. Here's what they represent and how we use them: @@ -101,16 +108,16 @@ Sometimes bugs reported to us are actually caused by bugs in the browser(s) them | Vendor(s) | Browser(s) | Rendering engine | Bug reporting website(s) | Notes | | ------------- | ---------------------------- | ---------------- | ------------------------------------------------------ | -------------------------------------------------------- | -| Mozilla | Firefox | Gecko | https://bugzilla.mozilla.org/enter_bug.cgi | "Core" is normally the right product option to choose. | -| Apple | Safari | WebKit | https://bugs.webkit.org/enter_bug.cgi?product=WebKit | In Apple's bug reporter, choose "Safari" as the product. | -| Google, Opera | Chrome, Chromium, Opera v15+ | Blink | https://bugs.chromium.org/p/chromium/issues/list | Click the "New issue" button. | -| Microsoft | Edge | Blink | https://developer.microsoft.com/en-us/microsoft-edge/ | Go to "Help > Send Feedback" from the browser | +| Mozilla | Firefox | Gecko | | "Core" is normally the right product option to choose. | +| Apple | Safari | WebKit | | In Apple's bug reporter, choose "Safari" as the product. | +| Google, Opera | Chrome, Chromium, Opera v15+ | Blink | | Click the "New issue" button. | +| Microsoft | Edge | Blink | | Go to "Help > Send Feedback" from the browser | ## Feature requests Feature requests are welcome. But take a moment to find out whether your idea -fits with the scope and aims of the project. It's up to *you* to make a strong +fits with the scope and aims of the project. It's up to _you_ to make a strong case to convince the project's developers of the merits of this feature. Please provide as much detail and context as possible. diff --git a/app/vendor/twbs/bootstrap/.github/PULL_REQUEST_TEMPLATE.md b/app/vendor/twbs/bootstrap/.github/PULL_REQUEST_TEMPLATE.md index 4675f7007..98e45c55a 100644 --- a/app/vendor/twbs/bootstrap/.github/PULL_REQUEST_TEMPLATE.md +++ b/app/vendor/twbs/bootstrap/.github/PULL_REQUEST_TEMPLATE.md @@ -31,7 +31,7 @@ -* https://deploy-preview-{your pr number}--twbs-bootstrap.netlify.app/ +- ### Related issues diff --git a/app/vendor/twbs/bootstrap/.github/codeql/codeql-config.yml b/app/vendor/twbs/bootstrap/.github/codeql/codeql-config.yml new file mode 100644 index 000000000..957877282 --- /dev/null +++ b/app/vendor/twbs/bootstrap/.github/codeql/codeql-config.yml @@ -0,0 +1,3 @@ +name: "CodeQL config" +paths-ignore: + - dist diff --git a/app/vendor/twbs/bootstrap/.github/dependabot.yml b/app/vendor/twbs/bootstrap/.github/dependabot.yml index 29135b400..f54ba8953 100644 --- a/app/vendor/twbs/bootstrap/.github/dependabot.yml +++ b/app/vendor/twbs/bootstrap/.github/dependabot.yml @@ -1,24 +1,23 @@ version: 2 updates: - - package-ecosystem: npm + - package-ecosystem: "github-actions" directory: "/" schedule: interval: weekly day: tuesday time: "12:00" timezone: Europe/Athens - open-pull-requests-limit: 10 + - package-ecosystem: npm + directory: "/" reviewers: - XhmikosR labels: - dependencies - v5 - versioning-strategy: increase - rebase-strategy: disabled - - package-ecosystem: "github-actions" - directory: "/" schedule: interval: weekly day: tuesday time: "12:00" timezone: Europe/Athens + versioning-strategy: increase + rebase-strategy: disabled diff --git a/app/vendor/twbs/bootstrap/.github/workflows/browserstack.yml b/app/vendor/twbs/bootstrap/.github/workflows/browserstack.yml index 425c56684..8d8cb1c34 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/browserstack.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/browserstack.yml @@ -2,21 +2,29 @@ name: BrowserStack on: push: + branches: + - "**" + - "!dependabot/**" workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: browserstack: runs-on: ubuntu-latest - if: github.repository == 'twbs/bootstrap' && (!contains(github.event.commits[0].message, '[ci skip]') && !contains(github.event.commits[0].message, '[skip ci]')) + if: github.repository == 'twbs/bootstrap' timeout-minutes: 30 steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/app/vendor/twbs/bootstrap/.github/workflows/bundlewatch.yml b/app/vendor/twbs/bootstrap/.github/workflows/bundlewatch.yml index d1a174784..7f58b245f 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/bundlewatch.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/bundlewatch.yml @@ -2,14 +2,17 @@ name: Bundlewatch on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: bundlewatch: @@ -17,7 +20,9 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/app/vendor/twbs/bootstrap/.github/workflows/calibreapp-image-actions.yml b/app/vendor/twbs/bootstrap/.github/workflows/calibreapp-image-actions.yml index e23f5626e..f4aeb871a 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/calibreapp-image-actions.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/calibreapp-image-actions.yml @@ -8,15 +8,23 @@ on: - '**.png' - '**.webp' +permissions: + contents: read + jobs: build: # Only run on Pull Requests within the same repository, and not from forks. if: github.event.pull_request.head.repo.full_name == github.repository name: calibreapp/image-actions runs-on: ubuntu-latest + permissions: + # allow calibreapp/image-actions to update PRs + pull-requests: write steps: - name: Checkout Repo - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Compress Images uses: calibreapp/image-actions@1.1.0 diff --git a/app/vendor/twbs/bootstrap/.github/workflows/codeql.yml b/app/vendor/twbs/bootstrap/.github/workflows/codeql.yml index 70be0563c..6d5f77897 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/codeql.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/codeql.yml @@ -7,13 +7,12 @@ on: - v4-dev - "!dependabot/**" pull_request: - # The branches below must be a subset of the branches above branches: - main - v4-dev - "!dependabot/**" schedule: - - cron: "0 2 * * 5" + - cron: "0 2 * * 4" workflow_dispatch: jobs: @@ -21,18 +20,25 @@ jobs: name: Analyze runs-on: ubuntu-latest permissions: - actions: read - contents: read security-events: write steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: + config-file: ./.github/codeql/codeql-config.yml languages: "javascript" + queries: +security-and-quality + + - name: Autobuild + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v2 + with: + category: "/language:javascript" diff --git a/app/vendor/twbs/bootstrap/.github/workflows/cspell.yml b/app/vendor/twbs/bootstrap/.github/workflows/cspell.yml index 3751ad339..3e7902e39 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/cspell.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/cspell.yml @@ -2,25 +2,33 @@ name: cspell on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + +permissions: + contents: read jobs: cspell: + permissions: + # allow streetsidesoftware/cspell-action to fetch files for commits and PRs + contents: read + pull-requests: read runs-on: ubuntu-latest steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Run cspell - uses: streetsidesoftware/cspell-action@v2 + uses: streetsidesoftware/cspell-action@v3 with: config: ".cspell.json" files: "**/*.md" diff --git a/app/vendor/twbs/bootstrap/.github/workflows/css.yml b/app/vendor/twbs/bootstrap/.github/workflows/css.yml index 857a5672c..d859c45eb 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/css.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/css.yml @@ -2,14 +2,17 @@ name: CSS on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: css: @@ -17,7 +20,9 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 @@ -30,3 +35,6 @@ jobs: - name: Build CSS run: npm run css + + - name: Run CSS tests + run: npm run css-test diff --git a/app/vendor/twbs/bootstrap/.github/workflows/docs.yml b/app/vendor/twbs/bootstrap/.github/workflows/docs.yml index f33413eb4..278b099c1 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/docs.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/docs.yml @@ -2,14 +2,17 @@ name: Docs on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: docs: @@ -17,7 +20,9 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/app/vendor/twbs/bootstrap/.github/workflows/issue-close-require.yml b/app/vendor/twbs/bootstrap/.github/workflows/issue-close-require.yml index b251cd75e..b5000d8b4 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/issue-close-require.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/issue-close-require.yml @@ -4,8 +4,15 @@ on: schedule: - cron: "0 0 * * *" +permissions: + contents: read + jobs: issue-close-require: + permissions: + # allow actions-cool/issues-helper to update issues and PRs + issues: write + pull-requests: write runs-on: ubuntu-latest if: github.repository == 'twbs/bootstrap' steps: diff --git a/app/vendor/twbs/bootstrap/.github/workflows/issue-labeled.yml b/app/vendor/twbs/bootstrap/.github/workflows/issue-labeled.yml index fac58493b..584879dd8 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/issue-labeled.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/issue-labeled.yml @@ -4,8 +4,15 @@ on: issues: types: [labeled] +permissions: + contents: read + jobs: issue-labeled: + permissions: + # allow actions-cool/issues-helper to update issues and PRs + issues: write + pull-requests: write if: github.repository == 'twbs/bootstrap' runs-on: ubuntu-latest steps: diff --git a/app/vendor/twbs/bootstrap/.github/workflows/js.yml b/app/vendor/twbs/bootstrap/.github/workflows/js.yml index 82616c574..e123e982f 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/js.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/js.yml @@ -2,23 +2,32 @@ name: JS Tests on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: run: + permissions: + # allow coverallsapp/github-action to create new checks issues and fetch code + checks: write + contents: read name: JS Tests runs-on: ubuntu-latest steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 @@ -36,7 +45,7 @@ jobs: run: npm run js-test - name: Run Coveralls - uses: coverallsapp/github-action@1.1.3 + uses: coverallsapp/github-action@v2 with: github-token: "${{ secrets.GITHUB_TOKEN }}" path-to-lcov: "./js/coverage/lcov.info" diff --git a/app/vendor/twbs/bootstrap/.github/workflows/lint.yml b/app/vendor/twbs/bootstrap/.github/workflows/lint.yml index 816694ec2..7c88ddc96 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/lint.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/lint.yml @@ -2,14 +2,17 @@ name: Lint on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: lint: @@ -17,7 +20,9 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 diff --git a/app/vendor/twbs/bootstrap/.github/workflows/node-sass.yml b/app/vendor/twbs/bootstrap/.github/workflows/node-sass.yml index 465cee485..51ea6bff6 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/node-sass.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/node-sass.yml @@ -2,14 +2,17 @@ name: CSS (node-sass) on: push: - branches-ignore: - - "dependabot/**" + branches: + - main pull_request: workflow_dispatch: env: FORCE_COLOR: 2 - NODE: 16 + NODE: 18 + +permissions: + contents: read jobs: css: @@ -17,7 +20,9 @@ jobs: steps: - name: Clone repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 + with: + persist-credentials: false - name: Set up Node.js uses: actions/setup-node@v3 @@ -29,3 +34,16 @@ jobs: npx --package node-sass@latest node-sass --version npx --package node-sass@latest node-sass --output-style expanded --source-map true --source-map-contents true --precision 6 scss/ -o dist-sass/css/ ls -Al dist-sass/css + + - name: Check built CSS files for Sass variables + shell: bash + run: | + SASS_VARS_FOUND=$(find "dist-sass/css/" -type f -name "*.css" -print0 | xargs -0 --no-run-if-empty grep -F "\$" || true) + if [[ -z "$SASS_VARS_FOUND" ]]; then + echo "All good, no Sass variables found!" + exit 0 + else + echo "Found $(echo "$SASS_VARS_FOUND" | wc -l | bc) Sass variables:" + echo "$SASS_VARS_FOUND" + exit 1 + fi diff --git a/app/vendor/twbs/bootstrap/.github/workflows/release-notes.yml b/app/vendor/twbs/bootstrap/.github/workflows/release-notes.yml index bbd0a2448..f620dd31d 100644 --- a/app/vendor/twbs/bootstrap/.github/workflows/release-notes.yml +++ b/app/vendor/twbs/bootstrap/.github/workflows/release-notes.yml @@ -6,8 +6,15 @@ on: - main workflow_dispatch: +permissions: + contents: read + jobs: update_release_draft: + permissions: + # allow release-drafter/release-drafter to create GitHub releases and add labels to PRs + contents: write + pull-requests: write runs-on: ubuntu-latest if: github.repository == 'twbs/bootstrap' steps: diff --git a/app/vendor/twbs/bootstrap/.gitignore b/app/vendor/twbs/bootstrap/.gitignore index 2215d636a..0c9b6f556 100644 --- a/app/vendor/twbs/bootstrap/.gitignore +++ b/app/vendor/twbs/bootstrap/.gitignore @@ -38,5 +38,6 @@ Thumbs.db *.komodoproject # Folders to ignore +/dist-sass/ /js/coverage/ /node_modules/ diff --git a/app/vendor/twbs/bootstrap/.npmrc b/app/vendor/twbs/bootstrap/.npmrc new file mode 100644 index 000000000..4812751a9 --- /dev/null +++ b/app/vendor/twbs/bootstrap/.npmrc @@ -0,0 +1 @@ +lockfile-version=2 diff --git a/app/vendor/twbs/bootstrap/.stylelintrc b/app/vendor/twbs/bootstrap/.stylelintrc deleted file mode 100644 index 94c8ec155..000000000 --- a/app/vendor/twbs/bootstrap/.stylelintrc +++ /dev/null @@ -1,31 +0,0 @@ -{ - "extends": [ - "stylelint-config-twbs-bootstrap" - ], - "rules": { - "declaration-property-value-disallowed-list": { - "border": "none", - "outline": "none" - }, - "function-disallowed-list": [ - "calc", - "lighten", - "darken" - ], - "property-disallowed-list": [ - "border-radius", - "border-top-left-radius", - "border-top-right-radius", - "border-bottom-right-radius", - "border-bottom-left-radius", - "transition" - ], - "scss/dollar-variable-default": [ - true, - { - "ignore": "local" - } - ], - "scss/selector-no-union-class-name": true - } -} diff --git a/app/vendor/twbs/bootstrap/.stylelintrc.json b/app/vendor/twbs/bootstrap/.stylelintrc.json new file mode 100644 index 000000000..589884aae --- /dev/null +++ b/app/vendor/twbs/bootstrap/.stylelintrc.json @@ -0,0 +1,60 @@ +{ + "extends": [ + "stylelint-config-twbs-bootstrap" + ], + "reportInvalidScopeDisables": true, + "reportNeedlessDisables": true, + "overrides": [ + { + "files": "**/*.scss", + "rules": { + "declaration-property-value-disallowed-list": { + "border": "none", + "outline": "none" + }, + "function-disallowed-list": [ + "calc", + "lighten", + "darken" + ], + "property-disallowed-list": [ + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "transition" + ], + "scss/dollar-variable-default": [ + true, + { + "ignore": "local" + } + ], + "scss/selector-no-union-class-name": true + } + }, + { + "files": "scss/**/*.{test,spec}.scss", + "rules": { + "scss/dollar-variable-default": null, + "declaration-no-important": null + } + }, + { + "files": "site/**/*.scss", + "rules": { + "scss/dollar-variable-default": null + } + }, + { + "files": "site/**/examples/**/*.css", + "rules": { + "comment-empty-line-before": null, + "property-no-vendor-prefix": null, + "selector-no-qualifying-type": null, + "value-no-vendor-prefix": null + } + } + ] +} diff --git a/app/vendor/twbs/bootstrap/CODE_OF_CONDUCT.md b/app/vendor/twbs/bootstrap/CODE_OF_CONDUCT.md index 28fd5e8d4..b983cba20 100644 --- a/app/vendor/twbs/bootstrap/CODE_OF_CONDUCT.md +++ b/app/vendor/twbs/bootstrap/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or advances of +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities diff --git a/app/vendor/twbs/bootstrap/LICENSE b/app/vendor/twbs/bootstrap/LICENSE index dda75ca9a..6633b55fe 100644 --- a/app/vendor/twbs/bootstrap/LICENSE +++ b/app/vendor/twbs/bootstrap/LICENSE @@ -1,7 +1,6 @@ The MIT License (MIT) -Copyright (c) 2011-2022 Twitter, Inc. -Copyright (c) 2011-2022 The Bootstrap Authors +Copyright (c) 2011-2023 The Bootstrap Authors 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/app/vendor/twbs/bootstrap/README.md b/app/vendor/twbs/bootstrap/README.md index bd4019294..982629393 100644 --- a/app/vendor/twbs/bootstrap/README.md +++ b/app/vendor/twbs/bootstrap/README.md @@ -1,6 +1,6 @@

    - Bootstrap logo + Bootstrap logo

    @@ -9,7 +9,7 @@

    Sleek, intuitive, and powerful front-end framework for faster and easier web development.
    - Explore Bootstrap docs » + Explore Bootstrap docs »

    Report bug @@ -46,32 +46,31 @@ Our default branch is for development of our Bootstrap 5 release. Head to the [` Several quick start options are available: -- [Download the latest release](https://github.com/twbs/bootstrap/archive/v5.2.3.zip) +- [Download the latest release](https://github.com/twbs/bootstrap/archive/v5.3.2.zip) - Clone the repo: `git clone https://github.com/twbs/bootstrap.git` -- Install with [npm](https://www.npmjs.com/): `npm install bootstrap@v5.2.3` -- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@v5.2.3` -- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:5.2.3` +- Install with [npm](https://www.npmjs.com/): `npm install bootstrap@v5.3.2` +- Install with [yarn](https://yarnpkg.com/): `yarn add bootstrap@v5.3.2` +- Install with [Composer](https://getcomposer.org/): `composer require twbs/bootstrap:5.3.2` - Install with [NuGet](https://www.nuget.org/): CSS: `Install-Package bootstrap` Sass: `Install-Package bootstrap.sass` -Read the [Getting started page](https://getbootstrap.com/docs/5.2/getting-started/introduction/) for information on the framework contents, templates, examples, and more. +Read the [Getting started page](https://getbootstrap.com/docs/5.3/getting-started/introduction/) for information on the framework contents, templates, examples, and more. ## Status -[![Build Status](https://img.shields.io/github/workflow/status/twbs/bootstrap/JS%20Tests/main?label=JS%20Tests&logo=github)](https://github.com/twbs/bootstrap/actions?query=workflow%3AJS+Tests+branch%3Amain) -[![npm version](https://img.shields.io/npm/v/bootstrap)](https://www.npmjs.com/package/bootstrap) -[![Gem version](https://img.shields.io/gem/v/bootstrap)](https://rubygems.org/gems/bootstrap) -[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue)](https://atmospherejs.com/twbs/bootstrap) -[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap)](https://packagist.org/packages/twbs/bootstrap) -[![NuGet](https://img.shields.io/nuget/vpre/bootstrap)](https://www.nuget.org/packages/bootstrap/absoluteLatest) -[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/main)](https://coveralls.io/github/twbs/bootstrap?branch=main) +[![Build Status](https://img.shields.io/github/actions/workflow/status/twbs/bootstrap/js.yml?branch=main&label=JS%20Tests&logo=github)](https://github.com/twbs/bootstrap/actions/workflows/js.yml?query=workflow%3AJS+branch%3Amain) +[![npm version](https://img.shields.io/npm/v/bootstrap?logo=npm&logoColor=fff)](https://www.npmjs.com/package/bootstrap) +[![Gem version](https://img.shields.io/gem/v/bootstrap?logo=rubygems&logoColor=fff)](https://rubygems.org/gems/bootstrap) +[![Meteor Atmosphere](https://img.shields.io/badge/meteor-twbs%3Abootstrap-blue?logo=meteor&logoColor=fff)](https://atmospherejs.com/twbs/bootstrap) +[![Packagist Prerelease](https://img.shields.io/packagist/vpre/twbs/bootstrap?logo=packagist&logoColor=fff)](https://packagist.org/packages/twbs/bootstrap) +[![NuGet](https://img.shields.io/nuget/vpre/bootstrap?logo=nuget&logoColor=fff)](https://www.nuget.org/packages/bootstrap/absoluteLatest) +[![Coverage Status](https://img.shields.io/coveralls/github/twbs/bootstrap/main?logo=coveralls&logoColor=fff)](https://coveralls.io/github/twbs/bootstrap?branch=main) [![CSS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=gzip&label=CSS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css) [![CSS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/css/bootstrap.min.css?compression=brotli&label=CSS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/css/bootstrap.min.css) [![JS gzip size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=gzip&label=JS%20gzip%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js) [![JS Brotli size](https://img.badgesize.io/twbs/bootstrap/main/dist/js/bootstrap.min.js?compression=brotli&label=JS%20Brotli%20size)](https://github.com/twbs/bootstrap/blob/main/dist/js/bootstrap.min.js) -[![BrowserStack Status](https://www.browserstack.com/automate/badge.svg?badge_key=SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229)](https://www.browserstack.com/automate/public-build/SkxZcStBeExEdVJqQ2hWYnlWckpkNmNEY213SFp6WHFETWk2bGFuY3pCbz0tLXhqbHJsVlZhQnRBdEpod3NLSDMzaHc9PQ==--3d0b75245708616eb93113221beece33e680b229) -[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap)](#backers) -[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap)](#sponsors) +[![Backers on Open Collective](https://img.shields.io/opencollective/backers/bootstrap?logo=opencollective&logoColor=fff)](#backers) +[![Sponsors on Open Collective](https://img.shields.io/opencollective/sponsors/bootstrap?logo=opencollective&logoColor=fff)](#sponsors) ## What's included @@ -144,7 +143,7 @@ Have a bug or a feature request? Please first read the [issue guidelines](https: Bootstrap's documentation, included in this repo in the root directory, is built with [Hugo](https://gohugo.io/) and publicly hosted on GitHub Pages at . The docs may also be run locally. -Documentation search is powered by [Algolia's DocSearch](https://docsearch.algolia.com/). Working on our search? Be sure to set `debug: true` in `site/assets/js/search.js`. +Documentation search is powered by [Algolia's DocSearch](https://docsearch.algolia.com/). ### Running documentation locally @@ -177,7 +176,8 @@ Get updates on Bootstrap's development and chat with the project maintainers and - Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). - Read and subscribe to [The Official Bootstrap Blog](https://blog.getbootstrap.com/). -- Ask and explore [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions). +- Ask questions and explore [our GitHub Discussions](https://github.com/twbs/bootstrap/discussions). +- Discuss, ask questions, and more on [the community Discord](https://discord.gg/bZUvakRU3M) or [Bootstrap subreddit](https://reddit.com/r/bootstrap). - Chat with fellow Bootstrappers in IRC. On the `irc.libera.chat` server, in the `#bootstrap` channel. - Implementation help may be found at Stack Overflow (tagged [`bootstrap-5`](https://stackoverflow.com/questions/tagged/bootstrap-5)). - Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. @@ -243,4 +243,4 @@ Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com ## Copyright and license -Code and documentation copyright 2011–2022 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors) and [Twitter, Inc.](https://twitter.com) Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). +Code and documentation copyright 2011–2023 the [Bootstrap Authors](https://github.com/twbs/bootstrap/graphs/contributors). Code released under the [MIT License](https://github.com/twbs/bootstrap/blob/main/LICENSE). Docs released under [Creative Commons](https://creativecommons.org/licenses/by/3.0/). diff --git a/app/vendor/twbs/bootstrap/build/.eslintrc.json b/app/vendor/twbs/bootstrap/build/.eslintrc.json deleted file mode 100644 index dec6323d0..000000000 --- a/app/vendor/twbs/bootstrap/build/.eslintrc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "env": { - "browser": false, - "node": true - }, - "parserOptions": { - "sourceType": "script" - }, - "extends": "../.eslintrc.json", - "rules": { - "no-console": "off", - "strict": "error", - "unicorn/prefer-top-level-await": "off" - } -} diff --git a/app/vendor/twbs/bootstrap/build/banner.js b/app/vendor/twbs/bootstrap/build/banner.mjs similarity index 50% rename from app/vendor/twbs/bootstrap/build/banner.js rename to app/vendor/twbs/bootstrap/build/banner.mjs index df82ff32e..3fea93c8f 100644 --- a/app/vendor/twbs/bootstrap/build/banner.js +++ b/app/vendor/twbs/bootstrap/build/banner.mjs @@ -1,6 +1,12 @@ -'use strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +const pkgJson = path.join(__dirname, '../package.json') +const pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8')) -const pkg = require('../package.json') const year = new Date().getFullYear() function getBanner(pluginFilename) { @@ -11,4 +17,4 @@ function getBanner(pluginFilename) { */` } -module.exports = getBanner +export default getBanner diff --git a/app/vendor/twbs/bootstrap/build/build-plugins.js b/app/vendor/twbs/bootstrap/build/build-plugins.mjs similarity index 83% rename from app/vendor/twbs/bootstrap/build/build-plugins.js rename to app/vendor/twbs/bootstrap/build/build-plugins.mjs index a160209b0..77e63070c 100644 --- a/app/vendor/twbs/bootstrap/build/build-plugins.js +++ b/app/vendor/twbs/bootstrap/build/build-plugins.mjs @@ -2,21 +2,22 @@ /*! * Script to build our plugins to use them separately. - * Copyright 2020-2022 The Bootstrap Authors - * Copyright 2020-2022 Twitter, Inc. + * Copyright 2020-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -'use strict' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { babel } from '@rollup/plugin-babel' +import globby from 'globby' +import { rollup } from 'rollup' +import banner from './banner.mjs' -const path = require('node:path') -const rollup = require('rollup') -const globby = require('globby') -const { babel } = require('@rollup/plugin-babel') -const banner = require('./banner.js') +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(fileURLToPath(import.meta.url)) const sourcePath = path.resolve(__dirname, '../js/src/').replace(/\\/g, '/') -const jsFiles = globby.sync(sourcePath + '/**/*.js') +const jsFiles = globby.sync(`${sourcePath}/**/*.js`) // Array which holds the resolved plugins const resolvedPlugins = [] @@ -27,7 +28,7 @@ const filenameToEntity = filename => filename.replace('.js', '') for (const file of jsFiles) { resolvedPlugins.push({ - src: file.replace('.js', ''), + src: file, dist: file.replace('src', 'dist'), fileName: path.basename(file), className: filenameToEntity(path.basename(file)) @@ -38,7 +39,7 @@ for (const file of jsFiles) { const build = async plugin => { const globals = {} - const bundle = await rollup.rollup({ + const bundle = await rollup({ input: plugin.src, plugins: [ babel({ diff --git a/app/vendor/twbs/bootstrap/build/change-version.js b/app/vendor/twbs/bootstrap/build/change-version.js deleted file mode 100644 index 57c5fdec8..000000000 --- a/app/vendor/twbs/bootstrap/build/change-version.js +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env node - -/*! - * Script to update version number references in the project. - * Copyright 2017-2022 The Bootstrap Authors - * Copyright 2017-2022 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ - -'use strict' - -const fs = require('node:fs').promises -const path = require('node:path') -const globby = require('globby') - -const VERBOSE = process.argv.includes('--verbose') -const DRY_RUN = process.argv.includes('--dry') || process.argv.includes('--dry-run') - -// These are the filetypes we only care about replacing the version -const GLOB = [ - '**/*.{css,html,js,json,md,scss,txt,yml}' -] -const GLOBBY_OPTIONS = { - cwd: path.join(__dirname, '..'), - gitignore: true -} - -// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37 -function regExpQuote(string) { - return string.replace(/[$()*+-.?[\\\]^{|}]/g, '\\$&') -} - -function regExpQuoteReplacement(string) { - return string.replace(/\$/g, '$$') -} - -async function replaceRecursively(file, oldVersion, newVersion) { - const originalString = await fs.readFile(file, 'utf8') - const newString = originalString.replace( - new RegExp(regExpQuote(oldVersion), 'g'), regExpQuoteReplacement(newVersion) - ) - - // No need to move any further if the strings are identical - if (originalString === newString) { - return - } - - if (VERBOSE) { - console.log(`FILE: ${file}`) - } - - if (DRY_RUN) { - return - } - - await fs.writeFile(file, newString, 'utf8') -} - -async function main(args) { - let [oldVersion, newVersion] = args - - if (!oldVersion || !newVersion) { - console.error('USAGE: change-version old_version new_version [--verbose] [--dry[-run]]') - console.error('Got arguments:', args) - process.exit(1) - } - - // Strip any leading `v` from arguments because otherwise we will end up with duplicate `v`s - [oldVersion, newVersion] = [oldVersion, newVersion].map(arg => arg.startsWith('v') ? arg.slice(1) : arg) - - try { - const files = await globby(GLOB, GLOBBY_OPTIONS) - - await Promise.all(files.map(file => replaceRecursively(file, oldVersion, newVersion))) - } catch (error) { - console.error(error) - process.exit(1) - } -} - -main(process.argv.slice(2)) diff --git a/app/vendor/twbs/bootstrap/build/change-version.mjs b/app/vendor/twbs/bootstrap/build/change-version.mjs new file mode 100644 index 000000000..3c1e70668 --- /dev/null +++ b/app/vendor/twbs/bootstrap/build/change-version.mjs @@ -0,0 +1,113 @@ +#!/usr/bin/env node + +/*! + * Script to update version number references in the project. + * Copyright 2017-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ + +import { execFile } from 'node:child_process' +import fs from 'node:fs/promises' +import process from 'node:process' + +const VERBOSE = process.argv.includes('--verbose') +const DRY_RUN = process.argv.includes('--dry') || process.argv.includes('--dry-run') + +// These are the files we only care about replacing the version +const FILES = [ + 'README.md', + 'hugo.yml', + 'js/src/base-component.js', + 'package.js', + 'scss/mixins/_banner.scss', + 'site/data/docs-versions.yml' +] + +// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37 +function regExpQuote(string) { + return string.replace(/[$()*+-.?[\\\]^{|}]/g, '\\$&') +} + +function regExpQuoteReplacement(string) { + return string.replace(/\$/g, '$$') +} + +async function replaceRecursively(file, oldVersion, newVersion) { + const originalString = await fs.readFile(file, 'utf8') + const newString = originalString + .replace( + new RegExp(regExpQuote(oldVersion), 'g'), + regExpQuoteReplacement(newVersion) + ) + // Also replace the version used by the rubygem, + // which is using periods (`.`) instead of hyphens (`-`) + .replace( + new RegExp(regExpQuote(oldVersion.replace(/-/g, '.')), 'g'), + regExpQuoteReplacement(newVersion.replace(/-/g, '.')) + ) + + // No need to move any further if the strings are identical + if (originalString === newString) { + return + } + + if (VERBOSE) { + console.log(`Found ${oldVersion} in ${file}`) + } + + if (DRY_RUN) { + return + } + + await fs.writeFile(file, newString, 'utf8') +} + +function bumpNpmVersion(newVersion) { + if (DRY_RUN) { + return + } + + execFile('npm', ['version', newVersion, '--no-git-tag'], { shell: true }, error => { + if (error) { + console.error(error) + process.exit(1) + } + }) +} + +function showUsage(args) { + console.error('USAGE: change-version old_version new_version [--verbose] [--dry[-run]]') + console.error('Got arguments:', args) + process.exit(1) +} + +async function main(args) { + let [oldVersion, newVersion] = args + + if (!oldVersion || !newVersion) { + showUsage(args) + } + + // Strip any leading `v` from arguments because + // otherwise we will end up with duplicate `v`s + [oldVersion, newVersion] = [oldVersion, newVersion].map(arg => { + return arg.startsWith('v') ? arg.slice(1) : arg + }) + + if (oldVersion === newVersion) { + showUsage(args) + } + + bumpNpmVersion(newVersion) + + try { + await Promise.all( + FILES.map(file => replaceRecursively(file, oldVersion, newVersion)) + ) + } catch (error) { + console.error(error) + process.exit(1) + } +} + +main(process.argv.slice(2)) diff --git a/app/vendor/twbs/bootstrap/build/generate-sri.js b/app/vendor/twbs/bootstrap/build/generate-sri.mjs similarity index 53% rename from app/vendor/twbs/bootstrap/build/generate-sri.js rename to app/vendor/twbs/bootstrap/build/generate-sri.mjs index ef1b39f97..e2b1554f1 100644 --- a/app/vendor/twbs/bootstrap/build/generate-sri.js +++ b/app/vendor/twbs/bootstrap/build/generate-sri.mjs @@ -5,25 +5,25 @@ * Remember to use the same vendor files as the CDN ones, * otherwise the hashes won't match! * - * Copyright 2017-2022 The Bootstrap Authors - * Copyright 2017-2022 Twitter, Inc. + * Copyright 2017-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -'use strict' +import crypto from 'node:crypto' +import fs from 'node:fs' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import sh from 'shelljs' -const crypto = require('node:crypto') -const fs = require('node:fs') -const path = require('node:path') -const sh = require('shelljs') +const __dirname = path.dirname(fileURLToPath(import.meta.url)) sh.config.fatal = true -const configFile = path.join(__dirname, '../config.yml') +const configFile = path.join(__dirname, '../hugo.yml') // Array of objects which holds the files to generate SRI hashes for. // `file` is the path from the root folder -// `configPropertyName` is the config.yml variable's name of the file +// `configPropertyName` is the hugo.yml variable's name of the file const files = [ { file: 'dist/css/bootstrap.min.css', @@ -47,18 +47,18 @@ const files = [ } ] -for (const file of files) { - fs.readFile(file.file, 'utf8', (error, data) => { +for (const { file, configPropertyName } of files) { + fs.readFile(file, 'utf8', (error, data) => { if (error) { throw error } - const algo = 'sha384' - const hash = crypto.createHash(algo).update(data, 'utf8').digest('base64') - const integrity = `${algo}-${hash}` + const algorithm = 'sha384' + const hash = crypto.createHash(algorithm).update(data, 'utf8').digest('base64') + const integrity = `${algorithm}-${hash}` - console.log(`${file.configPropertyName}: ${integrity}`) + console.log(`${configPropertyName}: ${integrity}`) - sh.sed('-i', new RegExp(`^(\\s+${file.configPropertyName}:\\s+["'])\\S*(["'])`), `$1${integrity}$2`, configFile) + sh.sed('-i', new RegExp(`^(\\s+${configPropertyName}:\\s+["'])\\S*(["'])`), `$1${integrity}$2`, configFile) }) } diff --git a/app/vendor/twbs/bootstrap/build/postcss.config.js b/app/vendor/twbs/bootstrap/build/postcss.config.mjs similarity index 86% rename from app/vendor/twbs/bootstrap/build/postcss.config.js rename to app/vendor/twbs/bootstrap/build/postcss.config.mjs index 7f8186d10..7717cfc3f 100644 --- a/app/vendor/twbs/bootstrap/build/postcss.config.js +++ b/app/vendor/twbs/bootstrap/build/postcss.config.mjs @@ -1,12 +1,10 @@ -'use strict' - const mapConfig = { inline: false, annotation: true, sourcesContent: true } -module.exports = context => { +export default context => { return { map: context.file.dirname.includes('examples') ? false : mapConfig, plugins: { diff --git a/app/vendor/twbs/bootstrap/build/rollup.config.js b/app/vendor/twbs/bootstrap/build/rollup.config.mjs similarity index 62% rename from app/vendor/twbs/bootstrap/build/rollup.config.js rename to app/vendor/twbs/bootstrap/build/rollup.config.mjs index 27f12ac03..dd6c7d13e 100644 --- a/app/vendor/twbs/bootstrap/build/rollup.config.js +++ b/app/vendor/twbs/bootstrap/build/rollup.config.mjs @@ -1,15 +1,17 @@ -'use strict' +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import { babel } from '@rollup/plugin-babel' +import { nodeResolve } from '@rollup/plugin-node-resolve' +import replace from '@rollup/plugin-replace' +import banner from './banner.mjs' -const path = require('node:path') -const { babel } = require('@rollup/plugin-babel') -const { nodeResolve } = require('@rollup/plugin-node-resolve') -const replace = require('@rollup/plugin-replace') -const banner = require('./banner.js') +const __dirname = path.dirname(fileURLToPath(import.meta.url)) const BUNDLE = process.env.BUNDLE === 'true' const ESM = process.env.ESM === 'true' -let fileDestination = `bootstrap${ESM ? '.esm' : ''}` +let destinationFile = `bootstrap${ESM ? '.esm' : ''}` const external = ['@popperjs/core'] const plugins = [ babel({ @@ -24,7 +26,7 @@ const globals = { } if (BUNDLE) { - fileDestination += '.bundle' + destinationFile += '.bundle' // Remove last entry in external array to bundle Popper external.pop() delete globals['@popperjs/core'] @@ -40,8 +42,8 @@ if (BUNDLE) { const rollupConfig = { input: path.resolve(__dirname, `../js/index.${ESM ? 'esm' : 'umd'}.js`), output: { - banner, - file: path.resolve(__dirname, `../dist/js/${fileDestination}.js`), + banner: banner(), + file: path.resolve(__dirname, `../dist/js/${destinationFile}.js`), format: ESM ? 'esm' : 'umd', globals, generatedCode: 'es2015' @@ -54,4 +56,4 @@ if (!ESM) { rollupConfig.output.name = 'bootstrap' } -module.exports = rollupConfig +export default rollupConfig diff --git a/app/vendor/twbs/bootstrap/build/vnu-jar.js b/app/vendor/twbs/bootstrap/build/vnu-jar.mjs similarity index 83% rename from app/vendor/twbs/bootstrap/build/vnu-jar.js rename to app/vendor/twbs/bootstrap/build/vnu-jar.mjs index f29eeb722..b66356032 100644 --- a/app/vendor/twbs/bootstrap/build/vnu-jar.js +++ b/app/vendor/twbs/bootstrap/build/vnu-jar.mjs @@ -2,22 +2,22 @@ /*! * Script to run vnu-jar if Java is available. - * Copyright 2017-2022 The Bootstrap Authors - * Copyright 2017-2022 Twitter, Inc. + * Copyright 2017-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -'use strict' - -const { execFile, spawn } = require('node:child_process') -const vnu = require('vnu-jar') +import { execFile, spawn } from 'node:child_process' +import vnu from 'vnu-jar' execFile('java', ['-version'], (error, stdout, stderr) => { if (error) { - console.error('Skipping vnu-jar test; Java is missing.') + console.error('Skipping vnu-jar test; Java is probably missing.') + console.error(error) return } + console.log('Running vnu-jar validation...') + const is32bitJava = !/64-Bit/.test(stderr) // vnu-jar accepts multiple ignores joined with a `|`. @@ -49,6 +49,8 @@ execFile('java', ['-version'], (error, stdout, stderr) => { args.splice(0, 0, '-Xss512k') } + console.log(`command used: java ${args.join(' ')}`) + return spawn('java', args, { shell: true, stdio: 'inherit' diff --git a/app/vendor/twbs/bootstrap/build/zip-examples.js b/app/vendor/twbs/bootstrap/build/zip-examples.mjs similarity index 77% rename from app/vendor/twbs/bootstrap/build/zip-examples.js rename to app/vendor/twbs/bootstrap/build/zip-examples.mjs index 077901e47..6b44d45b1 100644 --- a/app/vendor/twbs/bootstrap/build/zip-examples.js +++ b/app/vendor/twbs/bootstrap/build/zip-examples.mjs @@ -3,16 +3,19 @@ /*! * Script to create the built examples zip archive; * requires the `zip` command to be present! - * Copyright 2020-2022 The Bootstrap Authors + * Copyright 2020-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -'use strict' +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import sh from 'shelljs' -const path = require('node:path') -const sh = require('shelljs') +const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const pkg = require('../package.json') +const pkgJson = path.join(__dirname, '../package.json') +const pkg = JSON.parse(await fs.readFile(pkgJson, 'utf8')) const versionShort = pkg.config.version_short const distFolder = `bootstrap-${pkg.version}-examples` @@ -34,6 +37,9 @@ const imgFiles = [ 'bootstrap-logo.svg', 'bootstrap-logo-white.svg' ] +const staticJsFiles = [ + 'color-modes.js' +] sh.config.fatal = true @@ -52,7 +58,8 @@ sh.mkdir('-p', [ distFolder, `${distFolder}/assets/brand/`, `${distFolder}/assets/dist/css/`, - `${distFolder}/assets/dist/js/` + `${distFolder}/assets/dist/js/`, + `${distFolder}/assets/js/` ]) sh.cp('-Rf', `${docsDir}/examples/*`, distFolder) @@ -69,6 +76,10 @@ for (const file of imgFiles) { sh.cp('-f', `${docsDir}/assets/brand/${file}`, `${distFolder}/assets/brand/`) } +for (const file of staticJsFiles) { + sh.cp('-f', `${docsDir}/assets/js/${file}`, `${distFolder}/assets/js/`) +} + sh.rm(`${distFolder}/index.html`) // get all examples' HTML files @@ -84,7 +95,7 @@ for (const file of sh.find(`${distFolder}/**/*.html`)) { } // create the zip file -sh.exec(`zip -r9 "${distFolder}.zip" "${distFolder}"`) +sh.exec(`zip -qr9 "${distFolder}.zip" "${distFolder}"`) // remove the folder we created sh.rm('-rf', distFolder) diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css index 4691f7927..411dbb8a1 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css @@ -1,78 +1,8 @@ /*! - * Bootstrap Grid v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. + * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -:root { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg-rgb: 255, 255, 255; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-bg: #fff; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-2xl: 2rem; - --bs-border-radius-pill: 50rem; - --bs-link-color: #0d6efd; - --bs-link-hover-color: #0a58ca; - --bs-code-color: #d63384; - --bs-highlight-bg: #fff3cd; -} - .container, .container-fluid, .container-xxl, @@ -114,6 +44,15 @@ max-width: 1320px; } } +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} + .row { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; @@ -154,7 +93,7 @@ .row-cols-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-4 > * { @@ -169,7 +108,7 @@ .row-cols-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-auto { @@ -359,7 +298,7 @@ } .row-cols-sm-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-sm-4 > * { flex: 0 0 auto; @@ -371,7 +310,7 @@ } .row-cols-sm-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-sm-auto { flex: 0 0 auto; @@ -462,51 +401,51 @@ margin-left: 91.66666667%; } .g-sm-0, -.gx-sm-0 { + .gx-sm-0 { --bs-gutter-x: 0; } .g-sm-0, -.gy-sm-0 { + .gy-sm-0 { --bs-gutter-y: 0; } .g-sm-1, -.gx-sm-1 { + .gx-sm-1 { --bs-gutter-x: 0.25rem; } .g-sm-1, -.gy-sm-1 { + .gy-sm-1 { --bs-gutter-y: 0.25rem; } .g-sm-2, -.gx-sm-2 { + .gx-sm-2 { --bs-gutter-x: 0.5rem; } .g-sm-2, -.gy-sm-2 { + .gy-sm-2 { --bs-gutter-y: 0.5rem; } .g-sm-3, -.gx-sm-3 { + .gx-sm-3 { --bs-gutter-x: 1rem; } .g-sm-3, -.gy-sm-3 { + .gy-sm-3 { --bs-gutter-y: 1rem; } .g-sm-4, -.gx-sm-4 { + .gx-sm-4 { --bs-gutter-x: 1.5rem; } .g-sm-4, -.gy-sm-4 { + .gy-sm-4 { --bs-gutter-y: 1.5rem; } .g-sm-5, -.gx-sm-5 { + .gx-sm-5 { --bs-gutter-x: 3rem; } .g-sm-5, -.gy-sm-5 { + .gy-sm-5 { --bs-gutter-y: 3rem; } } @@ -528,7 +467,7 @@ } .row-cols-md-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-md-4 > * { flex: 0 0 auto; @@ -540,7 +479,7 @@ } .row-cols-md-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-md-auto { flex: 0 0 auto; @@ -631,51 +570,51 @@ margin-left: 91.66666667%; } .g-md-0, -.gx-md-0 { + .gx-md-0 { --bs-gutter-x: 0; } .g-md-0, -.gy-md-0 { + .gy-md-0 { --bs-gutter-y: 0; } .g-md-1, -.gx-md-1 { + .gx-md-1 { --bs-gutter-x: 0.25rem; } .g-md-1, -.gy-md-1 { + .gy-md-1 { --bs-gutter-y: 0.25rem; } .g-md-2, -.gx-md-2 { + .gx-md-2 { --bs-gutter-x: 0.5rem; } .g-md-2, -.gy-md-2 { + .gy-md-2 { --bs-gutter-y: 0.5rem; } .g-md-3, -.gx-md-3 { + .gx-md-3 { --bs-gutter-x: 1rem; } .g-md-3, -.gy-md-3 { + .gy-md-3 { --bs-gutter-y: 1rem; } .g-md-4, -.gx-md-4 { + .gx-md-4 { --bs-gutter-x: 1.5rem; } .g-md-4, -.gy-md-4 { + .gy-md-4 { --bs-gutter-y: 1.5rem; } .g-md-5, -.gx-md-5 { + .gx-md-5 { --bs-gutter-x: 3rem; } .g-md-5, -.gy-md-5 { + .gy-md-5 { --bs-gutter-y: 3rem; } } @@ -697,7 +636,7 @@ } .row-cols-lg-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-lg-4 > * { flex: 0 0 auto; @@ -709,7 +648,7 @@ } .row-cols-lg-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-lg-auto { flex: 0 0 auto; @@ -800,51 +739,51 @@ margin-left: 91.66666667%; } .g-lg-0, -.gx-lg-0 { + .gx-lg-0 { --bs-gutter-x: 0; } .g-lg-0, -.gy-lg-0 { + .gy-lg-0 { --bs-gutter-y: 0; } .g-lg-1, -.gx-lg-1 { + .gx-lg-1 { --bs-gutter-x: 0.25rem; } .g-lg-1, -.gy-lg-1 { + .gy-lg-1 { --bs-gutter-y: 0.25rem; } .g-lg-2, -.gx-lg-2 { + .gx-lg-2 { --bs-gutter-x: 0.5rem; } .g-lg-2, -.gy-lg-2 { + .gy-lg-2 { --bs-gutter-y: 0.5rem; } .g-lg-3, -.gx-lg-3 { + .gx-lg-3 { --bs-gutter-x: 1rem; } .g-lg-3, -.gy-lg-3 { + .gy-lg-3 { --bs-gutter-y: 1rem; } .g-lg-4, -.gx-lg-4 { + .gx-lg-4 { --bs-gutter-x: 1.5rem; } .g-lg-4, -.gy-lg-4 { + .gy-lg-4 { --bs-gutter-y: 1.5rem; } .g-lg-5, -.gx-lg-5 { + .gx-lg-5 { --bs-gutter-x: 3rem; } .g-lg-5, -.gy-lg-5 { + .gy-lg-5 { --bs-gutter-y: 3rem; } } @@ -866,7 +805,7 @@ } .row-cols-xl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-xl-4 > * { flex: 0 0 auto; @@ -878,7 +817,7 @@ } .row-cols-xl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-xl-auto { flex: 0 0 auto; @@ -969,51 +908,51 @@ margin-left: 91.66666667%; } .g-xl-0, -.gx-xl-0 { + .gx-xl-0 { --bs-gutter-x: 0; } .g-xl-0, -.gy-xl-0 { + .gy-xl-0 { --bs-gutter-y: 0; } .g-xl-1, -.gx-xl-1 { + .gx-xl-1 { --bs-gutter-x: 0.25rem; } .g-xl-1, -.gy-xl-1 { + .gy-xl-1 { --bs-gutter-y: 0.25rem; } .g-xl-2, -.gx-xl-2 { + .gx-xl-2 { --bs-gutter-x: 0.5rem; } .g-xl-2, -.gy-xl-2 { + .gy-xl-2 { --bs-gutter-y: 0.5rem; } .g-xl-3, -.gx-xl-3 { + .gx-xl-3 { --bs-gutter-x: 1rem; } .g-xl-3, -.gy-xl-3 { + .gy-xl-3 { --bs-gutter-y: 1rem; } .g-xl-4, -.gx-xl-4 { + .gx-xl-4 { --bs-gutter-x: 1.5rem; } .g-xl-4, -.gy-xl-4 { + .gy-xl-4 { --bs-gutter-y: 1.5rem; } .g-xl-5, -.gx-xl-5 { + .gx-xl-5 { --bs-gutter-x: 3rem; } .g-xl-5, -.gy-xl-5 { + .gy-xl-5 { --bs-gutter-y: 3rem; } } @@ -1035,7 +974,7 @@ } .row-cols-xxl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-xxl-4 > * { flex: 0 0 auto; @@ -1047,7 +986,7 @@ } .row-cols-xxl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-xxl-auto { flex: 0 0 auto; @@ -1138,51 +1077,51 @@ margin-left: 91.66666667%; } .g-xxl-0, -.gx-xxl-0 { + .gx-xxl-0 { --bs-gutter-x: 0; } .g-xxl-0, -.gy-xxl-0 { + .gy-xxl-0 { --bs-gutter-y: 0; } .g-xxl-1, -.gx-xxl-1 { + .gx-xxl-1 { --bs-gutter-x: 0.25rem; } .g-xxl-1, -.gy-xxl-1 { + .gy-xxl-1 { --bs-gutter-y: 0.25rem; } .g-xxl-2, -.gx-xxl-2 { + .gx-xxl-2 { --bs-gutter-x: 0.5rem; } .g-xxl-2, -.gy-xxl-2 { + .gy-xxl-2 { --bs-gutter-y: 0.5rem; } .g-xxl-3, -.gx-xxl-3 { + .gx-xxl-3 { --bs-gutter-x: 1rem; } .g-xxl-3, -.gy-xxl-3 { + .gy-xxl-3 { --bs-gutter-y: 1rem; } .g-xxl-4, -.gx-xxl-4 { + .gx-xxl-4 { --bs-gutter-x: 1.5rem; } .g-xxl-4, -.gy-xxl-4 { + .gy-xxl-4 { --bs-gutter-y: 1.5rem; } .g-xxl-5, -.gx-xxl-5 { + .gx-xxl-5 { --bs-gutter-x: 3rem; } .g-xxl-5, -.gy-xxl-5 { + .gy-xxl-5 { --bs-gutter-y: 3rem; } } @@ -1202,6 +1141,10 @@ display: grid !important; } +.d-inline-grid { + display: inline-grid !important; +} + .d-table { display: table !important; } @@ -1801,6 +1744,9 @@ .d-sm-grid { display: grid !important; } + .d-sm-inline-grid { + display: inline-grid !important; + } .d-sm-table { display: table !important; } @@ -2261,6 +2207,9 @@ .d-md-grid { display: grid !important; } + .d-md-inline-grid { + display: inline-grid !important; + } .d-md-table { display: table !important; } @@ -2721,6 +2670,9 @@ .d-lg-grid { display: grid !important; } + .d-lg-inline-grid { + display: inline-grid !important; + } .d-lg-table { display: table !important; } @@ -3181,6 +3133,9 @@ .d-xl-grid { display: grid !important; } + .d-xl-inline-grid { + display: inline-grid !important; + } .d-xl-table { display: table !important; } @@ -3641,6 +3596,9 @@ .d-xxl-grid { display: grid !important; } + .d-xxl-inline-grid { + display: inline-grid !important; + } .d-xxl-table { display: table !important; } @@ -4101,6 +4059,9 @@ .d-print-grid { display: grid !important; } + .d-print-inline-grid { + display: inline-grid !important; + } .d-print-table { display: table !important; } diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css.map b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css.map index ab69ccdda..76a689ac1 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css.map +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","bootstrap-grid.css","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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IGI;IAOI,0BAAA;EPwrDV;EO/rDM;IAOI,gCAAA;EP2rDV;EOlsDM;IAOI,yBAAA;EP8rDV;EOrsDM;IAOI,wBAAA;EPisDV;EOxsDM;IAOI,yBAAA;EPosDV;EO3sDM;IAOI,6BAAA;EPusDV;EO9sDM;IAOI,8BAAA;EP0sDV;EOjtDM;IAOI,wBAAA;EP6sDV;EOptDM;IAOI,+BAAA;EPgtDV;EOvtDM;IAOI,wBAAA;EPmtDV;EO1tDM;IAOI,yBAAA;EPstDV;EO7tDM;IAOI,8BAAA;EPytDV;EOhuDM;IAOI,iCAAA;EP4tDV;EOnuDM;IAOI,sCAAA;EP+tDV;EOtuDM;IAOI,yCAAA;EPkuDV;EOzuDM;IAOI,uBAAA;EPquDV;EO5uDM;IAOI,uBAAA;EPwuDV;EO/uDM;IAOI,yBAAA;EP2uDV;EOlvDM;IAOI,yBAAA;EP8uDV;EOrvDM;IAOI,0BAAA;EPivDV;EOxvDM;IAOI,4BAAA;EPovDV;EO3vDM;IAOI,kCAAA;EPuvDV;EO9vDM;IAOI,sCAAA;EP0vDV;EOjwDM;IAOI,oCAAA;EP6vDV;EOpwDM;IAOI,kCAAA;EPgwDV;EOvwDM;IAOI,yCAAA;EPmwDV;EO1wDM;IAOI,wCAAA;EPswDV;EO7wDM;IAOI,wCAAA;EPywDV;EOhxDM;IAOI,kCAAA;EP4wDV;EOnxDM;IAOI,gCAAA;EP+wDV;EOtxDM;IAOI,8BAAA;EPkxDV;EOzxDM;IAOI,gCAAA;EPqxDV;EO5xDM;IAOI,+BAAA;EPwxDV;EO/xDM;IAOI,oCAAA;EP2xDV;EOlyDM;IAOI,kCAAA;EP8xDV;EOryDM;IAOI,gCAAA;EPiyDV;EOxyDM;IAOI,uCAAA;EPoyDV;EO3yDM;IAOI,sCAAA;EPuyDV;EO9yDM;IAOI,iCAAA;EP0yDV;EOjzDM;IAOI,2BAAA;EP6yDV;EOpzDM;IAOI,iCAAA;EPgzDV;EOvzDM;IAOI,+BAAA;EPmzDV;EO1zDM;IAOI,6BAAA;EPszDV;EO7zDM;IAOI,+BAAA;EPyzDV;EOh0DM;IAOI,8BAAA;EP4zDV;EOn0DM;IAOI,oBAAA;EP+zDV;EOt0DM;IAOI,mBAAA;EPk0DV;EOz0DM;IAOI,mBAAA;EPq0DV;EO5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;EP8lEV;EOrmEM;IAOI,kCAAA;EPimEV;EOxmEM;IAOI,iCAAA;EPomEV;EO3mEM;IAOI,+BAAA;EPumEV;EO9mEM;IAOI,iCAAA;EP0mEV;EOjnEM;IAOI,+BAAA;EP6mEV;EOpnEM;IAOI,0BAAA;EPgnEV;EOvnEM;IAOI,gCAAA;EPmnEV;EO1nEM;IAOI,+BAAA;EPsnEV;EO7nEM;IAOI,6BAAA;EPynEV;EOhoEM;IAOI,+BAAA;EP4nEV;EOnoEM;IAOI,6BAAA;EP+nEV;AACF;AG1oEI;EIGI;IAOI,0BAAA;EPooEV;EO3oEM;IAOI,gCAAA;EPuoEV;EO9oEM;IAOI,yBAAA;EP0oEV;EOjpEM;IAOI,wBAAA;EP6oEV;EOppEM;IAOI,yBAAA;EPgpEV;EOvpEM;IAOI,6BAAA;EPmpEV;EO1pEM;IAOI,8BAAA;EPspEV;EO7pEM;IAOI,wBAAA;EPypEV;EOhqEM;IAOI,+BAAA;EP4pEV;EOnqEM;IAOI,wBAAA;EP+pEV;EOtqEM;IAOI,yBAAA;EPkqEV;EOzqEM;IAOI,8BAAA;EPqqEV;EO5qEM;IAOI,iCAAA;EPwqEV;EO/qEM;IAOI,sCAAA;EP2qEV;EOlrEM;IAOI,yCAAA;EP8qEV;EOrrEM;IAOI,uBAAA;EPirEV;EOxrEM;IAOI,uBAAA;EPorEV;EO3rEM;IAOI,yBAAA;EPurEV;EO9rEM;IAOI,yBAAA;EP0rEV;EOjsEM;IAOI,0BAAA;EP6rEV;EOpsEM;IAOI,4BAAA;EPgsEV;EOvsEM;IAOI,kCAAA;EPmsEV;EO1sEM;IAOI,sCAAA;EPssEV;EO7sEM;IAOI,oCAAA;EPysEV;EOhtEM;IAOI,kCAAA;EP4sEV;EOntEM;IAOI,yCAAA;EP+sEV;EOttEM;IAOI,wCAAA;EPktEV;EOztEM;IAOI,wCAAA;EPqtEV;EO5tEM;IAOI,kCAAA;EPwtEV;EO/tEM;IAOI,gCAAA;EP2tEV;EOluEM;IAOI,8BAAA;EP8tEV;EOruEM;IAOI,gCAAA;EPiuEV;EOxuEM;IAOI,+BAAA;EPouEV;EO3uEM;IAOI,oCAAA;EPuuEV;EO9uEM;IAOI,kCAAA;EP0uEV;EOjvEM;IAOI,gCAAA;EP6uEV;EOpvEM;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gFV;EO7gFM;IAOI,+BAAA;EPygFV;EOhhFM;IAOI,8BAAA;EP4gFV;EOnhFM;IAOI,4BAAA;EP+gFV;EOthFM;IAOI,8BAAA;EPkhFV;EOzhFM;IAOI,4BAAA;EPqhFV;EO5hFM;IAOI,2BAAA;EPwhFV;EO/hFM;IAOI,iCAAA;EP2hFV;EOliFM;IAOI,gCAAA;EP8hFV;EOriFM;IAOI,8BAAA;EPiiFV;EOxiFM;IAOI,gCAAA;EPoiFV;EO3iFM;IAOI,8BAAA;EPuiFV;EO9iFM;IAOI,4BAAA;EP0iFV;EOjjFM;IAOI,kCAAA;EP6iFV;EOpjFM;IAOI,iCAAA;EPgjFV;EOvjFM;IAOI,+BAAA;EPmjFV;EO1jFM;IAOI,iCAAA;EPsjFV;EO7jFM;IAOI,+BAAA;EPyjFV;EOhkFM;IAOI,0BAAA;EP4jFV;EOnkFM;IAOI,gCAAA;EP+jFV;EOtkFM;IAOI,+BAAA;EPkkFV;EOzkFM;IAOI,6BAAA;EPqkFV;EO5kFM;IAOI,+BAAA;EPwkFV;EO/kFM;IAOI,6BAAA;EP2kFV;AACF;AGtlFI;EIGI;IAOI,0BAAA;EPglFV;EOvlFM;IAOI,gCAAA;EPmlFV;EO1lFM;IAOI,yBAAA;EPslFV;EO7lFM;IAOI,wBAAA;EPylFV;EOhmFM;IAOI,yBAAA;EP4lFV;EOnmFM;IAOI,6BAAA;EP+lFV;EOtmFM;IAOI,8BAAA;EPkmFV;EOzmFM;IAOI,wBAAA;EPqmFV;EO5mFM;IAOI,+BAAA;EPwmFV;EO/mFM;IAOI,wBAAA;EP2mFV;EOlnFM;IAOI,yBAAA;EP8mFV;EOrnFM;IAOI,8BAAA;EPinFV;EOxnFM;IAOI,iCAAA;EPonFV;EO3nFM;IAOI,sCAAA;EPunFV;EO9nFM;IAOI,yCAAA;EP0nFV;EOjoFM;IAOI,uBAAA;EP6nFV;EOpoFM;IAOI,uBAAA;EPgoFV;EOvoFM;IAOI,yBAAA;EPmoFV;EO1oFM;IAOI,yBAAA;EPsoFV;EO7oFM;IAOI,0BAAA;EPyoFV;EOhpFM;IAOI,4BAAA;EP4oFV;EOnpFM;IAOI,kCAAA;EP+oFV;EOtpFM;IAOI,sCAAA;EPkpFV;EOzpFM;IAOI,oCAAA;EPqpFV;EO5pFM;IAOI,kCAAA;EPwpFV;EO/pFM;IAOI,yCAAA;EP2pFV;EOlqFM;IAOI,wCAAA;EP8pFV;EOrqFM;IAOI,wCAAA;EPiqFV;EOxqFM;IAOI,kCAAA;EPoqFV;EO3qFM;IAOI,gCAAA;EPuqFV;EO9qFM;IAOI,8BAAA;EP0qFV;EOjrFM;IAOI,gCAAA;EP6qFV;EOprFM;IAOI,+BAAA;EPgrFV;EOvrFM;IAOI,oCAAA;EPmrFV;EO1rFM;IAOI,kCAAA;EPsrFV;EO7rFM;IAOI,gCAAA;EPyrFV;EOhsFM;IAOI,uCAAA;EP4rFV;EOnsFM;IAOI,sCAAA;EP+rFV;EOtsFM;IAOI,iCAAA;EPksFV;EOzsFM;IAOI,2BAAA;EPqsFV;EO5sFM;IAOI,iCAAA;EPwsFV;EO/sFM;IAOI,+BAAA;EP2sFV;EOltFM;IAOI,6BAAA;EP8sFV;EOrtFM;IAOI,+BAAA;EPitFV;EOxtFM;IAOI,8BAAA;EPotFV;EO3tFM;IAOI,oBAAA;EPutFV;EO9tFM;IAOI,mBAAA;EP0tFV;EOjuFM;IAOI,mBAAA;EP6tFV;EOpuFM;IAOI,mBAAA;EPguFV;EOvuFM;IAOI,mBAAA;EPmuFV;EO1uFM;IAOI,mBAAA;EPsuFV;EO7uFM;IAOI,mBAAA;EPyuFV;EOhvFM;IAOI,mBAAA;EP4uFV;EOnvFM;IAOI,oBAAA;EP+uFV;EOtvFM;IAOI,0BAAA;EPkvFV;EOzvFM;IAOI,yBAAA;EPqvFV;EO5vFM;IAOI,uBAAA;EPwvFV;EO/vFM;IAOI,yBAAA;EP2vFV;EOlwFM;IAOI,uBAAA;EP8vFV;EOrwFM;IAOI,uBAAA;EPiwFV;EOxwFM;IAOI,0BAAA;IAAA,yBAAA;EPqwFV;EO5wFM;IAOI,gCAAA;IAAA,+BAAA;EPywFV;EOhxFM;IAOI,+BAAA;IAAA,8BAAA;EP6wFV;EOpxFM;IAOI,6BAAA;IAAA,4BAAA;EPixFV;EOxxFM;IAOI,+BAAA;IAAA,8BAAA;EPqxFV;EO5xFM;IAOI,6BAAA;IAAA,4BAAA;EPyxFV;EOhyFM;IAOI,6BAAA;IAAA,4BAAA;EP6xFV;EOpyFM;IAOI,wBAAA;IAAA,2BAAA;EPiyFV;EOxyFM;IAOI,8BAAA;IAAA,iCAAA;EPqyFV;EO5yFM;IAOI,6BAAA;IAAA,gCAAA;EPyyFV;EOhzFM;IAOI,2BAAA;IAAA,8BAAA;EP6yFV;EOpzFM;IAOI,6BAAA;IAAA,gCAAA;EPizFV;EOxzFM;IAOI,2BAAA;IAAA,8BAAA;EPqzFV;EO5zFM;IAOI,2BAAA;IAAA,8BAAA;EPyzFV;EOh0FM;IAOI,wBAAA;EP4zFV;EOn0FM;IAOI,8BAAA;EP+zFV;EOt0FM;IAOI,6BAAA;EPk0FV;EOz0FM;IAOI,2BAAA;EPq0FV;EO50FM;IAOI,6BAAA;EPw0FV;EO/0FM;IAOI,2BAAA;EP20FV;EOl1FM;IAOI,2BAAA;EP80FV;EOr1FM;IAOI,0BAAA;EPi1FV;EOx1FM;IAOI,gCAAA;EPo1FV;EO31FM;IAOI,+BAAA;EPu1FV;EO91FM;IAOI,6BAAA;EP01FV;EOj2FM;IAOI,+BAAA;EP61FV;EOp2FM;IAOI,6BAAA;EPg2FV;EOv2FM;IAOI,6BAAA;EPm2FV;EO12FM;IAOI,2BAAA;EPs2FV;EO72FM;IAOI,iCAAA;EPy2FV;EOh3FM;IAOI,gCAAA;EP42FV;EOn3FM;IAOI,8BAAA;EP+2FV;EOt3FM;IAOI,gCAAA;EPk3FV;EOz3FM;IAOI,8BAAA;EPq3FV;EO53FM;IAOI,8BAAA;EPw3FV;EO/3FM;IAOI,yBAAA;EP23FV;EOl4FM;IAOI,+BAAA;EP83FV;EOr4FM;IAOI,8BAAA;EPi4FV;EOx4FM;IAOI,4BAAA;EPo4FV;EO34FM;IAOI,8BAAA;EPu4FV;EO94FM;IAOI,4BAAA;EP04FV;EOj5FM;IAOI,4BAAA;EP64FV;EOp5FM;IAOI,qBAAA;EPg5FV;EOv5FM;IAOI,2BAAA;EPm5FV;EO15FM;IAOI,0BAAA;EPs5FV;EO75FM;IAOI,wBAAA;EPy5FV;EOh6FM;IAOI,0BAAA;EP45FV;EOn6FM;IAOI,wBAAA;EP+5FV;EOt6FM;IAOI,2BAAA;IAAA,0BAAA;EPm6FV;EO16FM;IAOI,iCAAA;IAAA,gCAAA;EPu6FV;EO96FM;IAOI,gCAAA;IAAA,+BAAA;EP26FV;EOl7FM;IAOI,8BAAA;IAAA,6BAAA;EP+6FV;EOt7FM;IAOI,gCAAA;IAAA,+BAAA;EPm7FV;EO17FM;IAOI,8BAAA;IAAA,6BAAA;EPu7FV;EO97FM;IAOI,yBAAA;IAAA,4BAAA;EP27FV;EOl8FM;IAOI,+BAAA;IAAA,kCAAA;EP+7FV;EOt8FM;IAOI,8BAAA;IAAA,iCAAA;EPm8FV;EO18FM;IAOI,4BAAA;IAAA,+BAAA;EPu8FV;EO98FM;IAOI,8BAAA;IAAA,iCAAA;EP28FV;EOl9FM;IAOI,4BAAA;IAAA,+BAAA;EP+8FV;EOt9FM;IAOI,yBAAA;EPk9FV;EOz9FM;IAOI,+BAAA;EPq9FV;EO59FM;IAOI,8BAAA;EPw9FV;EO/9FM;IAOI,4BAAA;EP29FV;EOl+FM;IAOI,8BAAA;EP89FV;EOr+FM;IAOI,4BAAA;EPi+FV;EOx+FM;IAOI,2BAAA;EPo+FV;EO3+FM;IAOI,iCAAA;EPu+FV;EO9+FM;IAOI,gCAAA;EP0+FV;EOj/FM;IAOI,8BAAA;EP6+FV;EOp/FM;IAOI,gCAAA;EPg/FV;EOv/FM;IAOI,8BAAA;EPm/FV;EO1/FM;IAOI,4BAAA;EPs/FV;EO7/FM;IAOI,kCAAA;EPy/FV;EOhgGM;IAOI,iCAAA;EP4/FV;EOngGM;IAOI,+BAAA;EP+/FV;EOtgGM;IAOI,iCAAA;EPkgGV;EOzgGM;IAOI,+BAAA;EPqgGV;EO5gGM;IAOI,0BAAA;EPwgGV;EO/gGM;IAOI,gCAAA;EP2gGV;EOlhGM;IAOI,+BAAA;EP8gGV;EOrhGM;IAOI,6BAAA;EPihGV;EOxhGM;IAOI,+BAAA;EPohGV;EO3hGM;IAOI,6BAAA;EPuhGV;AACF;AGliGI;EIGI;IAOI,0BAAA;EP4hGV;EOniGM;IAOI,gCAAA;EP+hGV;EOtiGM;IAOI,yBAAA;EPkiGV;EOziGM;IAOI,wBAAA;EPqiGV;EO5iGM;IAOI,yBAAA;EPwiGV;EO/iGM;IAOI,6BAAA;EP2iGV;EOljGM;IAOI,8BAAA;EP8iGV;EOrjGM;IAOI,wBAAA;EPijGV;EOxjGM;IAOI,+BAAA;EPojGV;EO3jGM;IAOI,wBAAA;EPujGV;EO9jGM;IAOI,yBAAA;EP0jGV;EOjkGM;IAOI,8BAAA;EP6jGV;EOpkGM;IAOI,iCAAA;EPgkGV;EOvkGM;IAOI,sCAAA;EPmkGV;EO1kGM;IAOI,yCAAA;EPskGV;EO7kGM;IAOI,uBAAA;EPykGV;EOhlGM;IAOI,uBAAA;EP4kGV;EOnlGM;IAOI,yBAAA;EP+kGV;EOtlGM;IAOI,yBAAA;EPklGV;EOzlGM;IAOI,0BAAA;EPqlGV;EO5lGM;IAOI,4BAAA;EPwlGV;EO/lGM;IAOI,kCAAA;EP2lGV;EOlmGM;IAOI,sCAAA;EP8lGV;EOrmGM;IAOI,oCAAA;EPimGV;EOxmGM;IAOI,kCAAA;EPomGV;EO3mGM;IAOI,yCAAA;EPumGV;EO9mGM;IAOI,wCAAA;EP0mGV;EOjnGM;IAOI,wCAAA;EP6mGV;EOpnGM;IAOI,kCAAA;EPgnGV;EOvnGM;IAOI,gCAAA;EPmnGV;EO1nGM;IAOI,8BAAA;EPsnGV;EO7nGM;IAOI,gCAAA;EPynGV;EOhoGM;IAOI,+BAAA;EP4nGV;EOnoGM;IAOI,oCAAA;EP+nGV;EOtoGM;IAOI,kCAAA;EPkoGV;EOzoGM;IAOI,gCAAA;EPqoGV;EO5oGM;IAOI,uCAAA;EPwoGV;EO/oGM;IAOI,sCAAA;EP2oGV;EOlpGM;IAOI,iCAAA;EP8oGV;EOrpGM;IAOI,2BAAA;EPipGV;EOxpGM;IAOI,iCAAA;EPopGV;EO3pGM;IAOI,+BAAA;EPupGV;EO9pGM;IAOI,6BAAA;EP0pGV;EOjqGM;IAOI,+BAAA;EP6pGV;EOpqGM;IAOI,8BAAA;EPgqGV;EOvqGM;IAOI,oBAAA;EPmqGV;EO1qGM;IAOI,mBAAA;EPsqGV;EO7qGM;IAOI,mBAAA;EPyqGV;EOhrGM;IAOI,mBAAA;EP4qGV;EOnrGM;IAOI,mBAAA;EP+qGV;EOtrGM;IAOI,mBAAA;EPkrGV;EOzrGM;IAOI,mBAAA;EPqrGV;EO5rGM;IAOI,mBAAA;EPwrGV;EO/rGM;IAOI,oBAAA;EP2rGV;EOlsGM;IAOI,0BAAA;EP8rGV;EOrsGM;IAOI,yBAAA;EPisGV;EOxsGM;IAOI,uBAAA;EPosGV;EO3sGM;IAOI,yBAAA;EPusGV;EO9sGM;IAOI,uBAAA;EP0sGV;EOjtGM;IAOI,uBAAA;EP6sGV;EOptGM;IAOI,0BA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Pw+GV;EO/+GM;IAOI,gCAAA;EP2+GV;EOl/GM;IAOI,yBAAA;EP8+GV;EOr/GM;IAOI,wBAAA;EPi/GV;EOx/GM;IAOI,yBAAA;EPo/GV;EO3/GM;IAOI,6BAAA;EPu/GV;EO9/GM;IAOI,8BAAA;EP0/GV;EOjgHM;IAOI,wBAAA;EP6/GV;EOpgHM;IAOI,+BAAA;EPggHV;EOvgHM;IAOI,wBAAA;EPmgHV;EO1gHM;IAOI,yBAAA;EPsgHV;EO7gHM;IAOI,8BAAA;EPygHV;EOhhHM;IAOI,iCAAA;EP4gHV;EOnhHM;IAOI,sCAAA;EP+gHV;EOthHM;IAOI,yCAAA;EPkhHV;EOzhHM;IAOI,uBAAA;EPqhHV;EO5hHM;IAOI,uBAAA;EPwhHV;EO/hHM;IAOI,yBAAA;EP2hHV;EOliHM;IAOI,yBAAA;EP8hHV;EOriHM;IAOI,0BAAA;EPiiHV;EOxiHM;IAOI,4BAAA;EPoiHV;EO3iHM;IAOI,kCAAA;EPuiHV;EO9iHM;IAOI,sCAAA;EP0iHV;EOjjHM;IAOI,oCAAA;EP6iHV;EOpjHM;IAOI,kCAAA;EPgjHV;EOvjHM;IAOI,yCAAA;EPmjHV;EO1jHM;IAOI,wCAAA;EPsjHV;EO7jHM;IAOI,wCAAA;EPyjHV;EOhkHM;IAOI,kCAAA;EP4jHV;EOnkHM;IAOI,gCAAA;EP+jHV;EOtkHM;IAOI,8BAAA;EPkkHV;EOzkHM;IAOI,gCAAA;EPqkHV;EO5kHM;IAOI,+BAAA;EPwkHV;EO/kHM;IAOI,oCAAA;EP2kHV;EOllHM;IAOI,kCAAA;EP8kHV;EOrlHM;IAOI,gCAAA;EPilHV;EOxlHM;IAOI,uCAAA;EPolHV;EO3lHM;IAOI,sCAAA;EPulHV;EO9lHM;IAOI,iCAAA;EP0lHV;EOjmHM;IAOI,2BAAA;EP6lHV;EOpmHM;IAOI,iCAAA;EPgmHV;EOvmHM;IAOI,+BAAA;EPmmHV;EO1mHM;IAOI,6BAAA;EPsmHV;EO7mHM;IAOI,+BAAA;EPymHV;EOhnHM;IAOI,8BAAA;EP4mHV;EOnnHM;IAOI,oBAAA;EP+mHV;EOtnHM;IAOI,mBAAA;EPknHV;EOznHM;IAOI,mBAAA;EPqnHV;EO5nHM;IAOI,mBAAA;E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","file":"bootstrap-grid.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-2xl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}body-color) !default;\n$table-bg: transparent !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $body-bg !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($dropdown-link-color, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: $white !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-border-width: $border-width !default;\n$pagination-margin-start: ($pagination-border-width * -1) !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-border-width: $border-width !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: $border-radius !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default; // Sass variable because of $accordion-button-icon\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-button-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: $border-width !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba($black, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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EE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,2BAAA;ALsjDZ;;AK7jDQ;EAOI,iCAAA;AL0jDZ;;AKjkDQ;EAOI,gCAAA;AL8jDZ;;AKrkDQ;EAOI,8BAAA;ALkkDZ;;AKzkDQ;EAOI,gCAAA;ALskDZ;;AK7kDQ;EAOI,8BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,0BAAA;ALsmDZ;;AK7mDQ;EAOI,gCAAA;AL0mDZ;;AKjnDQ;EAOI,+BAAA;AL8mDZ;;AKrnDQ;EAOI,6BAAA;ALknDZ;;AKznDQ;EAOI,+BAAA;ALsnDZ;;AK7nDQ;EAOI,6BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA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nEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,0BAAA;IAAA,yBAAA;ELswEV;EK7wEM;IAO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EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;EKvrFM;IAOI,mBAAA;ELmrFV;EK1rFM;IAOI,mBAAA;ELsrFV;EK7rFM;IAOI,mBAAA;ELyrFV;EKhsFM;IAOI,mBAAA;EL4rFV;EKnsFM;IAOI,oBAAA;EL+rFV;EKtsFM;IAOI,0BAAA;ELksFV;EKzsFM;IAOI,yBAAA;ELqsFV;EK5sFM;IAOI,uBAAA;ELwsFV;EK/sFM;IAOI,yBAAA;EL2sFV;EKltFM;IAOI,uBAAA;EL8sFV;EKrtFM;IAOI,uBAAA;ELitFV;EKxtFM;IAOI,0BAAA;IAAA,yBAAA;ELqtFV;EK5tFM;IAOI,gCAAA;IAAA,+BAAA;ELytFV;EKhuFM;IAOI,+BAAA;IAAA,8BAAA;EL6tFV;EKpuFM;IAOI,6BAAA;IAAA,4BAAA;ELiuFV;EKxuFM;IAOI,+BAAA;IAAA,8BAAA;ELquFV;EK5uFM;IAOI,6BAAA;IAAA,4BAAA;ELyuFV;EKhvFM;IAOI,6BAAA;IAAA,4BAAA;EL6uFV;EKpvFM;IAOI,wBAAA;IAAA,2BAAA;ELivFV;EKxvFM;IAOI,8BAAA;IAAA,iCAAA;ELqvFV;EK5vFM;IAOI,6BAAA;IAAA,gCAAA;ELyvFV;EKhwFM;IAOI,2BAAA;IAAA,8BAAA;EL6vFV;EKpwFM;IAOI,6BAAA;IAAA,gCAAA;ELiwFV;EKxwFM;IAOI,2BAAA;IAAA,8BAAA;ELqwFV;EK5wFM;IAOI,2BAAA;IAAA,8BAAA;ELywFV;EKhxFM;IAOI,wBAAA;EL4wFV;EKnxFM;IAOI,8BAAA;EL+wFV;EKtxFM;IAOI,6BAAA;ELkxFV;EKzxFM;IAOI,2BAAA;ELqxFV;EK5xFM;IAOI,6BAAA;ELwxFV;EK/xFM;IAOI,2BAAA;EL2xFV;EKlyFM;IAOI,2BAAA;EL8xFV;EKryFM;IAOI,0BAAA;ELiyFV;EKxyFM;IAOI,gCAAA;ELoyFV;EK3yFM;IAOI,+BAAA;ELuyFV;EK9yFM;IAOI,6BAAA;EL0yFV;EKjzFM;IAOI,+BAAA;EL6yFV;EKpzFM;IAOI,6BAAA;ELgzFV;EKvzFM;IAOI,6BAAA;ELmzFV;EK1zFM;IAOI,2BAAA;ELszFV;EK7zFM;IAOI,iCAAA;ELyzFV;EKh0FM;IAOI,gCAAA;EL4zFV;EKn0FM;IAOI,8BAAA;EL+zFV;EKt0FM;IAOI,gCAAA;ELk0FV;EKz0FM;IAOI,8BAAA;ELq0FV;EK50FM;IAOI,8BAAA;ELw0FV;EK/0FM;IAOI,yBAAA;EL20FV;EKl1FM;IAOI,+BAAA;EL80FV;EKr1FM;IAOI,8BAAA;ELi1FV;EKx1FM;IAOI,4BAAA;ELo1FV;EK31FM;IAOI,8BAAA;ELu1FV;EK91FM;IAOI,4BAAA;EL01FV;EKj2FM;IAOI,4BAAA;EL61FV;EKp2FM;IAOI,qBAAA;ELg2FV;EKv2FM;IAOI,2BAAA;ELm2FV;EK12FM;IAOI,0BAAA;ELs2FV;EK72FM;IAOI,wBAAA;ELy2FV;EKh3FM;IAOI,0BAAA;EL42FV;EKn3FM;IAOI,wBAAA;EL+2FV;EKt3FM;IAOI,2BAAA;IAAA,0BAAA;ELm3FV;EK13FM;IAOI,iCAAA;IAAA,gCAAA;ELu3FV;EK93FM;IAOI,gCAAA;IAAA,+BAAA;EL23FV;EKl4FM;IAOI,8BAAA;IAAA,6BAAA;EL+3FV;EKt4FM;IAOI,gCAAA;IAAA,+BAAA;ELm4FV;EK14FM;IAOI,8BAAA;IAAA,6BAAA;ELu4FV;EK94FM;IAOI,yBAAA;IAAA,4BAAA;EL24FV;EKl5FM;IAOI,+BAAA;IAAA,kCAAA;EL+4FV;EKt5FM;IAOI,8BAAA;IAAA,iCAAA;ELm5FV;EK15FM;IAOI,4BAAA;IAAA,+BAAA;ELu5FV;EK95FM;IAOI,8BAAA;IAAA,iCAAA;EL25FV;EKl6FM;IAOI,4BAAA;IAAA,+BAAA;EL+5FV;EKt6FM;IAOI,yBAAA;ELk6FV;EKz6FM;IAOI,+BAAA;ELq6FV;EK56FM;IAOI,8BAAA;ELw6FV;EK/6FM;IAOI,4BAAA;EL26FV;EKl7FM;IAOI,8BAAA;EL86FV;EKr7FM;IAOI,4BAAA;ELi7FV;EKx7FM;IAOI,2BAAA;ELo7FV;EK37FM;IAOI,iCAAA;ELu7FV;EK97FM;IAOI,gCAAA;EL07FV;EKj8FM;IAOI,8BAAA;EL67FV;EKp8FM;IAOI,gCAAA;ELg8FV;EKv8FM;IAOI,8BAAA;ELm8FV;EK18FM;IAOI,4BAAA;ELs8FV;EK78FM;IAOI,kCAAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,0BAAA;ELw9FV;EK/9FM;IAOI,gCAAA;EL29FV;EKl+FM;IAOI,+BAAA;EL89FV;EKr+FM;IAOI,6BAAA;ELi+FV;EKx+FM;IAOI,+BAAA;ELo+FV;EK3+FM;IAOI,6BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/l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ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,2BAAA;ELm4GV;EK14GM;IAOI,iCAAA;ELs4GV;EK74GM;IAOI,gCAAA;ELy4GV;EKh5GM;IAOI,8BAAA;EL44GV;EKn5GM;IAOI,gCAAA;EL+4GV;EKt5GM;IAOI,8BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,0BAAA;ELu6GV;EK96GM;IAOI,gCAAA;EL06GV;EKj7GM;IAOI,+BAAA;EL66GV;EKp7GM;IAOI,6BAAA;ELg7GV;EKv7GM;IAOI,+BAAA;ELm7GV;EK17GM;IAOI,6BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;I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","file":"bootstrap-grid.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css index 5a0a77ed2..46f0a4493 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css @@ -1,7 +1,6 @@ /*! - * Bootstrap Grid v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. + * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} + */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} /*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css.map b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css.map index 63cfa34e9..c88c6c5d5 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css.map +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"AACE;;;;;ACDF,MAQI,UAAA,QAAA,YAAA,QAAA,YAAA,QAAA,UAAA,QAAA,SAAA,QAAA,YAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAAA,UAAA,QAAA,WAAA,KAAA,WAAA,KAAA,UAAA,QAAA,eAAA,QAIA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAAA,cAAA,QAIA,aAAA,QAAA,eAAA,QAAA,aAAA,QAAA,UAAA,QAAA,aAAA,QAAA,YAAA,QAAA,WAAA,QAAA,UAAA,QAIA,iBAAA,EAAA,CAAA,GAAA,CAAA,IAAA,mBAAA,GAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,EAAA,CAAA,GAAA,CAAA,GAAA,cAAA,EAAA,CAAA,GAAA,CAAA,IAAA,iBAAA,GAAA,CAAA,GAAA,CAAA,EAAA,gBAAA,GAAA,CAAA,EAAA,CAAA,GAAA,eAAA,GAAA,CAAA,GAAA,CAAA,IAAA,cAAA,EAAA,CAAA,EAAA,CAAA,GAGF,eAAA,GAAA,CAAA,GAAA,CAAA,IACA,eAAA,CAAA,CAAA,CAAA,CAAA,EACA,oBAAA,EAAA,CAAA,EAAA,CAAA,GACA,iBAAA,GAAA,CAAA,GAAA,CAAA,IAMA,qBAAA,SAAA,CAAA,aAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,WAAA,CAAA,iBAAA,CAAA,KAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBACA,oBAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UACA,cAAA,2EAOA,sBAAA,0BC4PI,oBAAA,KD1PJ,sBAAA,IACA,sBAAA,IACA,gBAAA,QAIA,aAAA,KAIA,kBAAA,IACA,kBAAA,MACA,kBAAA,QACA,8BAAA,qBAEA,mBAAA,SACA,sBAAA,QACA,sBAAA,OACA,sBAAA,KACA,uBAAA,KACA,wBAAA,MAGA,gBAAA,QACA,sBAAA,QAEA,gBAAA,QAEA,kBAAA,QEjEA,WCsEF,iBAGA,cACA,cACA,cAHA,cADA,eC1EE,cAAA,OACA,cAAA,EACA,MAAA,KACA,cAAA,8BACA,aAAA,8BACA,aAAA,KACA,YAAA,KCsDE,yBH5CE,WAAA,cACE,UAAA,OG2CJ,yBH5CE,WAAA,cAAA,cACE,UAAA,OG2CJ,yBH5CE,WAAA,cAAA,cAAA,cACE,UAAA,OG2CJ,0BH5CE,WAAA,cAAA,cAAA,cAAA,cACE,UAAA,QG2CJ,0BH5CE,WAAA,cAAA,cAAA,cAAA,cAAA,eACE,UAAA,QIfN,KCAA,cAAA,OACA,cAAA,EACA,QAAA,KACA,UAAA,KAEA,WAAA,8BACA,aAAA,+BACA,YAAA,+BDJE,OCSF,WAAA,WAIA,YAAA,EACA,MAAA,KACA,UAAA,KACA,cAAA,8BACA,aAAA,8BACA,WAAA,mBA+CI,KACE,KAAA,EAAA,EAAA,GAGF,iBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,cACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,cACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,UAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,OAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,QAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,UAxDV,YAAA,YAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,aAwDU,UAxDV,YAAA,IAwDU,WAxDV,YAAA,aAwDU,WAxDV,YAAA,aAmEM,KJ0KR,MIxKU,cAAA,EAGF,KJ0KR,MIxKU,cAAA,EAPF,KJoLR,MIlLU,cAAA,QAGF,KJoLR,MIlLU,cAAA,QAPF,KJ8LR,MI5LU,cAAA,OAGF,KJ8LR,MI5LU,cAAA,OAPF,KJwMR,MItMU,cAAA,KAGF,KJwMR,MItMU,cAAA,KAPF,KJkNR,MIhNU,cAAA,OAGF,KJkNR,MIhNU,cAAA,OAPF,KJ4NR,MI1NU,cAAA,KAGF,KJ4NR,MI1NU,cAAA,KF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QJ8VR,SI5VU,cAAA,EAGF,QJ6VR,SI3VU,cAAA,EAPF,QJsWR,SIpWU,cAAA,QAGF,QJqWR,SInWU,cAAA,QAPF,QJ8WR,SI5WU,cAAA,OAGF,QJ6WR,SI3WU,cAAA,OAPF,QJsXR,SIpXU,cAAA,KAGF,QJqXR,SInXU,cAAA,KAPF,QJ8XR,SI5XU,cAAA,OAGF,QJ6XR,SI3XU,cAAA,OAPF,QJsYR,SIpYU,cAAA,KAGF,QJqYR,SInYU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QJugBR,SIrgBU,cAAA,EAGF,QJsgBR,SIpgBU,cAAA,EAPF,QJ+gBR,SI7gBU,cAAA,QAGF,QJ8gBR,SI5gBU,cAAA,QAPF,QJuhBR,SIrhBU,cAAA,OAGF,QJshBR,SIphBU,cAAA,OAPF,QJ+hBR,SI7hBU,cAAA,KAGF,QJ8hBR,SI5hBU,cAAA,KAPF,QJuiBR,SIriBU,cAAA,OAGF,QJsiBR,SIpiBU,cAAA,OAPF,QJ+iBR,SI7iBU,cAAA,KAGF,QJ8iBR,SI5iBU,cAAA,MF1DN,yBEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QJgrBR,SI9qBU,cAAA,EAGF,QJ+qBR,SI7qBU,cAAA,EAPF,QJwrBR,SItrBU,cAAA,QAGF,QJurBR,SIrrBU,cAAA,QAPF,QJgsBR,SI9rBU,cAAA,OAGF,QJ+rBR,SI7rBU,cAAA,OAPF,QJwsBR,SItsBU,cAAA,KAGF,QJusBR,SIrsBU,cAAA,KAPF,QJgtBR,SI9sBU,cAAA,OAGF,QJ+sBR,SI7sBU,cAAA,OAPF,QJwtBR,SIttBU,cAAA,KAGF,QJutBR,SIrtBU,cAAA,MF1DN,0BEUE,QACE,KAAA,EAAA,EAAA,GAGF,oBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,iBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,aAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,UAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,aAxDV,YAAA,EAwDU,aAxDV,YAAA,YAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,aAwDU,aAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAmEM,QJy1BR,SIv1BU,cAAA,EAGF,QJw1BR,SIt1BU,cAAA,EAPF,QJi2BR,SI/1BU,cAAA,QAGF,QJg2BR,SI91BU,cAAA,QAPF,QJy2BR,SIv2BU,cAAA,OAGF,QJw2BR,SIt2BU,cAAA,OAPF,QJi3BR,SI/2BU,cAAA,KAGF,QJg3BR,SI92BU,cAAA,KAPF,QJy3BR,SIv3BU,cAAA,OAGF,QJw3BR,SIt3BU,cAAA,OAPF,QJi4BR,SI/3BU,cAAA,KAGF,QJg4BR,SI93BU,cAAA,MF1DN,0BEUE,SACE,KAAA,EAAA,EAAA,GAGF,qBApCJ,KAAA,EAAA,EAAA,KACA,MAAA,KAcA,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,KAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,IAFF,kBACE,KAAA,EAAA,EAAA,KACA,MAAA,eA+BE,cAhDJ,KAAA,EAAA,EAAA,KACA,MAAA,KAqDQ,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,YA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,WAhEN,KAAA,EAAA,EAAA,KACA,MAAA,IA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,aA+DM,YAhEN,KAAA,EAAA,EAAA,KACA,MAAA,KAuEQ,cAxDV,YAAA,EAwDU,cAxDV,YAAA,YAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,aAwDU,cAxDV,YAAA,IAwDU,eAxDV,YAAA,aAwDU,eAxDV,YAAA,aAmEM,SJkgCR,UIhgCU,cAAA,EAGF,SJigCR,UI//BU,cAAA,EAPF,SJ0gCR,UIxgCU,cAAA,QAGF,SJygCR,UIvgCU,cAAA,QAPF,SJkhCR,UIhhCU,cAAA,OAGF,SJihCR,UI/gCU,cAAA,OAPF,SJ0hCR,UIxhCU,cAAA,KAGF,SJyhCR,UIvhCU,cAAA,KAPF,SJkiCR,UIhiCU,cAAA,OAGF,SJiiCR,UI/hCU,cAAA,OAPF,SJ0iCR,UIxiCU,cAAA,KAGF,SJyiCR,UIviCU,cAAA,MCvDF,UAOI,QAAA,iBAPJ,gBAOI,QAAA,uBAPJ,SAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,SAOI,QAAA,gBAPJ,aAOI,QAAA,oBAPJ,cAOI,QAAA,qBAPJ,QAOI,QAAA,eAPJ,eAOI,QAAA,sBAPJ,QAOI,QAAA,eAPJ,WAOI,KAAA,EAAA,EAAA,eAPJ,UAOI,eAAA,cAPJ,aAOI,eAAA,iBAPJ,kBAOI,eAAA,sBAPJ,qBAOI,eAAA,yBAPJ,aAOI,UAAA,YAPJ,aAOI,UAAA,YAPJ,eAOI,YAAA,YAPJ,eAOI,YAAA,YAPJ,WAOI,UAAA,eAPJ,aAOI,UAAA,iBAPJ,mBAOI,UAAA,uBAPJ,uBAOI,gBAAA,qBAPJ,qBAOI,gBAAA,mBAPJ,wBAOI,gBAAA,iBAPJ,yBAOI,gBAAA,wBAPJ,wBAOI,gBAAA,uBAPJ,wBAOI,gBAAA,uBAPJ,mBAOI,YAAA,qBAPJ,iBAOI,YAAA,mBAPJ,oBAOI,YAAA,iBAPJ,sBAOI,YAAA,mBAPJ,qBAOI,YAAA,kBAPJ,qBAOI,cAAA,qBAPJ,mBAOI,cAAA,mBAPJ,sBAOI,cAAA,iBAPJ,uBAOI,cAAA,wBAPJ,sBAOI,cAAA,uBAPJ,uBAOI,cAAA,kBAPJ,iBAOI,WAAA,eAPJ,kBAOI,WAAA,qBAPJ,gBAOI,WAAA,mBAPJ,mBAOI,WAAA,iBAPJ,qBAOI,WAAA,mBAPJ,oBAOI,WAAA,kBAPJ,aAOI,MAAA,aAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,SAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,KAOI,OAAA,YAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,gBAPJ,KAOI,OAAA,eAPJ,KAOI,OAAA,iBAPJ,KAOI,OAAA,eAPJ,QAOI,OAAA,eAPJ,MAOI,aAAA,YAAA,YAAA,YAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,gBAAA,YAAA,gBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,aAAA,iBAAA,YAAA,iBAPJ,MAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,MAOI,WAAA,YAAA,cAAA,YAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,gBAAA,cAAA,gBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,iBAAA,cAAA,iBAPJ,MAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,MAOI,WAAA,YAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,gBAPJ,MAOI,WAAA,eAPJ,MAOI,WAAA,iBAPJ,MAOI,WAAA,eAPJ,SAOI,WAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eAPJ,SAOI,aAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,SAOI,cAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,SAOI,YAAA,eAPJ,KAOI,QAAA,YAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,gBAPJ,KAOI,QAAA,eAPJ,KAOI,QAAA,iBAPJ,KAOI,QAAA,eAPJ,MAOI,cAAA,YAAA,aAAA,YAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,gBAAA,aAAA,gBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,cAAA,iBAAA,aAAA,iBAPJ,MAOI,cAAA,eAAA,aAAA,eAPJ,MAOI,YAAA,YAAA,eAAA,YAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,gBAAA,eAAA,gBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,iBAAA,eAAA,iBAPJ,MAOI,YAAA,eAAA,eAAA,eAPJ,MAOI,YAAA,YAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,gBAPJ,MAOI,YAAA,eAPJ,MAOI,YAAA,iBAPJ,MAOI,YAAA,eAPJ,MAOI,cAAA,YAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,gBAPJ,MAOI,cAAA,eAPJ,MAOI,cAAA,iBAPJ,MAOI,cAAA,eAPJ,MAOI,eAAA,YAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,gBAPJ,MAOI,eAAA,eAPJ,MAOI,eAAA,iBAPJ,MAOI,eAAA,eAPJ,MAOI,aAAA,YAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,gBAPJ,MAOI,aAAA,eAPJ,MAOI,aAAA,iBAPJ,MAOI,aAAA,eHVR,yBGGI,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBHVR,yBGGI,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBHVR,yBGGI,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBHVR,0BGGI,aAOI,QAAA,iBAPJ,mBAOI,QAAA,uBAPJ,YAOI,QAAA,gBAPJ,WAOI,QAAA,eAPJ,YAOI,QAAA,gBAPJ,gBAOI,QAAA,oBAPJ,iBAOI,QAAA,qBAPJ,WAOI,QAAA,eAPJ,kBAOI,QAAA,sBAPJ,WAOI,QAAA,eAPJ,cAOI,KAAA,EAAA,EAAA,eAPJ,aAOI,eAAA,cAPJ,gBAOI,eAAA,iBAPJ,qBAOI,eAAA,sBAPJ,wBAOI,eAAA,yBAPJ,gBAOI,UAAA,YAPJ,gBAOI,UAAA,YAPJ,kBAOI,YAAA,YAPJ,kBAOI,YAAA,YAPJ,cAOI,UAAA,eAPJ,gBAOI,UAAA,iBAPJ,sBAOI,UAAA,uBAPJ,0BAOI,gBAAA,qBAPJ,wBAOI,gBAAA,mBAPJ,2BAOI,gBAAA,iBAPJ,4BAOI,gBAAA,wBAPJ,2BAOI,gBAAA,uBAPJ,2BAOI,gBAAA,uBAPJ,sBAOI,YAAA,qBAPJ,oBAOI,YAAA,mBAPJ,uBAOI,YAAA,iBAPJ,yBAOI,YAAA,mBAPJ,wBAOI,YAAA,kBAPJ,wBAOI,cAAA,qBAPJ,sBAOI,cAAA,mBAPJ,yBAOI,cAAA,iBAPJ,0BAOI,cAAA,wBAPJ,yBAOI,cAAA,uBAPJ,0BAOI,cAAA,kBAPJ,oBAOI,WAAA,eAPJ,qBAOI,WAAA,qBAPJ,mBAOI,WAAA,mBAPJ,sBAOI,WAAA,iBAPJ,wBAOI,WAAA,mBAPJ,uBAOI,WAAA,kBAPJ,gBAOI,MAAA,aAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,YAOI,MAAA,YAPJ,eAOI,MAAA,YAPJ,QAOI,OAAA,YAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,gBAPJ,QAOI,OAAA,eAPJ,QAOI,OAAA,iBAPJ,QAOI,OAAA,eAPJ,WAOI,OAAA,eAPJ,SAOI,aAAA,YAAA,YAAA,YAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,gBAAA,YAAA,gBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,aAAA,iBAAA,YAAA,iBAPJ,SAOI,aAAA,eAAA,YAAA,eAPJ,YAOI,aAAA,eAAA,YAAA,eAPJ,SAOI,WAAA,YAAA,cAAA,YAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,gBAAA,cAAA,gBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,iBAAA,cAAA,iBAPJ,SAOI,WAAA,eAAA,cAAA,eAPJ,YAOI,WAAA,eAAA,cAAA,eAPJ,SAOI,WAAA,YAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,gBAPJ,SAOI,WAAA,eAPJ,SAOI,WAAA,iBAPJ,SAOI,WAAA,eAPJ,YAOI,WAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,eAPJ,YAOI,aAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,YAOI,cAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,YAOI,YAAA,eAPJ,QAOI,QAAA,YAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,gBAPJ,QAOI,QAAA,eAPJ,QAOI,QAAA,iBAPJ,QAOI,QAAA,eAPJ,SAOI,cAAA,YAAA,aAAA,YAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,gBAAA,aAAA,gBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,cAAA,iBAAA,aAAA,iBAPJ,SAOI,cAAA,eAAA,aAAA,eAPJ,SAOI,YAAA,YAAA,eAAA,YAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,gBAAA,eAAA,gBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,iBAAA,eAAA,iBAPJ,SAOI,YAAA,eAAA,eAAA,eAPJ,SAOI,YAAA,YAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,gBAPJ,SAOI,YAAA,eAPJ,SAOI,YAAA,iBAPJ,SAOI,YAAA,eAPJ,SAOI,cAAA,YAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,gBAPJ,SAOI,cAAA,eAPJ,SAOI,cAAA,iBAPJ,SAOI,cAAA,eAPJ,SAOI,eAAA,YAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,gBAPJ,SAOI,eAAA,eAPJ,SAOI,eAAA,iBAPJ,SAOI,eAAA,eAPJ,SAOI,aAAA,YAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBAPJ,SAOI,aAAA,eAPJ,SAOI,aAAA,iBAPJ,SAOI,aAAA,gBHVR,0BGGI,cAOI,QAAA,iBAPJ,oBAOI,QAAA,uBAPJ,aAOI,QAAA,gBAPJ,YAOI,QAAA,eAPJ,aAOI,QAAA,gBAPJ,iBAOI,QAAA,oBAPJ,kBAOI,QAAA,qBAPJ,YAOI,QAAA,eAPJ,mBAOI,QAAA,sBAPJ,YAOI,QAAA,eAPJ,eAOI,KAAA,EAAA,EAAA,eAPJ,cAOI,eAAA,cAPJ,iBAOI,eAAA,iBAPJ,sBAOI,eAAA,sBAPJ,yBAOI,eAAA,yBAPJ,iBAOI,UAAA,YAPJ,iBAOI,UAAA,YAPJ,mBAOI,YAAA,YAPJ,mBAOI,YAAA,YAPJ,eAOI,UAAA,eAPJ,iBAOI,UAAA,iBAPJ,uBAOI,UAAA,uBAPJ,2BAOI,gBAAA,qBAPJ,yBAOI,gBAAA,mBAPJ,4BAOI,gBAAA,iBAPJ,6BAOI,gBAAA,wBAPJ,4BAOI,gBAAA,uBAPJ,4BAOI,gBAAA,uBAPJ,uBAOI,YAAA,qBAPJ,qBAOI,YAAA,mBAPJ,wBAOI,YAAA,iBAPJ,0BAOI,YAAA,mBAPJ,yBAOI,YAAA,kBAPJ,yBAOI,cAAA,qBAPJ,uBAOI,cAAA,mBAPJ,0BAOI,cAAA,iBAPJ,2BAOI,cAAA,wBAPJ,0BAOI,cAAA,uBAPJ,2BAOI,cAAA,kBAPJ,qBAOI,WAAA,eAPJ,sBAOI,WAAA,qBAPJ,oBAOI,WAAA,mBAPJ,uBAOI,WAAA,iBAPJ,yBAOI,WAAA,mBAPJ,wBAOI,WAAA,kBAPJ,iBAOI,MAAA,aAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,aAOI,MAAA,YAPJ,gBAOI,MAAA,YAPJ,SAOI,OAAA,YAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,gBAPJ,SAOI,OAAA,eAPJ,SAOI,OAAA,iBAPJ,SAOI,OAAA,eAPJ,YAOI,OAAA,eAPJ,UAOI,aAAA,YAAA,YAAA,YAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,gBAAA,YAAA,gBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,aAAA,iBAAA,YAAA,iBAPJ,UAOI,aAAA,eAAA,YAAA,eAPJ,aAOI,aAAA,eAAA,YAAA,eAPJ,UAOI,WAAA,YAAA,cAAA,YAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,gBAAA,cAAA,gBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,iBAAA,cAAA,iBAPJ,UAOI,WAAA,eAAA,cAAA,eAPJ,aAOI,WAAA,eAAA,cAAA,eAPJ,UAOI,WAAA,YAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,gBAPJ,UAOI,WAAA,eAPJ,UAOI,WAAA,iBAPJ,UAOI,WAAA,eAPJ,aAOI,WAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,eAPJ,aAOI,aAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,aAOI,cAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,aAOI,YAAA,eAPJ,SAOI,QAAA,YAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,gBAPJ,SAOI,QAAA,eAPJ,SAOI,QAAA,iBAPJ,SAOI,QAAA,eAPJ,UAOI,cAAA,YAAA,aAAA,YAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,gBAAA,aAAA,gBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,cAAA,iBAAA,aAAA,iBAPJ,UAOI,cAAA,eAAA,aAAA,eAPJ,UAOI,YAAA,YAAA,eAAA,YAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,gBAAA,eAAA,gBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,iBAAA,eAAA,iBAPJ,UAOI,YAAA,eAAA,eAAA,eAPJ,UAOI,YAAA,YAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,gBAPJ,UAOI,YAAA,eAPJ,UAOI,YAAA,iBAPJ,UAOI,YAAA,eAPJ,UAOI,cAAA,YAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,gBAPJ,UAOI,cAAA,eAPJ,UAOI,cAAA,iBAPJ,UAOI,cAAA,eAPJ,UAOI,eAAA,YAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,gBAPJ,UAOI,eAAA,eAPJ,UAOI,eAAA,iBAPJ,UAOI,eAAA,eAPJ,UAOI,aAAA,YAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBAPJ,UAOI,aAAA,eAPJ,UAOI,aAAA,iBAPJ,UAOI,aAAA,gBCnCZ,aD4BQ,gBAOI,QAAA,iBAPJ,sBAOI,QAAA,uBAPJ,eAOI,QAAA,gBAPJ,cAOI,QAAA,eAPJ,eAOI,QAAA,gBAPJ,mBAOI,QAAA,oBAPJ,oBAOI,QAAA,qBAPJ,cAOI,QAAA,eAPJ,qBAOI,QAAA,sBAPJ,cAOI,QAAA","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css index d8613e8dc..fa3ec34a3 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css @@ -1,78 +1,8 @@ /*! - * Bootstrap Grid v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. + * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -:root { - --bs-blue: #0d6efd; - --bs-indigo: #6610f2; - --bs-purple: #6f42c1; - --bs-pink: #d63384; - --bs-red: #dc3545; - --bs-orange: #fd7e14; - --bs-yellow: #ffc107; - --bs-green: #198754; - --bs-teal: #20c997; - --bs-cyan: #0dcaf0; - --bs-black: #000; - --bs-white: #fff; - --bs-gray: #6c757d; - --bs-gray-dark: #343a40; - --bs-gray-100: #f8f9fa; - --bs-gray-200: #e9ecef; - --bs-gray-300: #dee2e6; - --bs-gray-400: #ced4da; - --bs-gray-500: #adb5bd; - --bs-gray-600: #6c757d; - --bs-gray-700: #495057; - --bs-gray-800: #343a40; - --bs-gray-900: #212529; - --bs-primary: #0d6efd; - --bs-secondary: #6c757d; - --bs-success: #198754; - --bs-info: #0dcaf0; - --bs-warning: #ffc107; - --bs-danger: #dc3545; - --bs-light: #f8f9fa; - --bs-dark: #212529; - --bs-primary-rgb: 13, 110, 253; - --bs-secondary-rgb: 108, 117, 125; - --bs-success-rgb: 25, 135, 84; - --bs-info-rgb: 13, 202, 240; - --bs-warning-rgb: 255, 193, 7; - --bs-danger-rgb: 220, 53, 69; - --bs-light-rgb: 248, 249, 250; - --bs-dark-rgb: 33, 37, 41; - --bs-white-rgb: 255, 255, 255; - --bs-black-rgb: 0, 0, 0; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg-rgb: 255, 255, 255; - --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --bs-body-font-family: var(--bs-font-sans-serif); - --bs-body-font-size: 1rem; - --bs-body-font-weight: 400; - --bs-body-line-height: 1.5; - --bs-body-color: #212529; - --bs-body-bg: #fff; - --bs-border-width: 1px; - --bs-border-style: solid; - --bs-border-color: #dee2e6; - --bs-border-color-translucent: rgba(0, 0, 0, 0.175); - --bs-border-radius: 0.375rem; - --bs-border-radius-sm: 0.25rem; - --bs-border-radius-lg: 0.5rem; - --bs-border-radius-xl: 1rem; - --bs-border-radius-2xl: 2rem; - --bs-border-radius-pill: 50rem; - --bs-link-color: #0d6efd; - --bs-link-hover-color: #0a58ca; - --bs-code-color: #d63384; - --bs-highlight-bg: #fff3cd; -} - .container, .container-fluid, .container-xxl, @@ -114,6 +44,15 @@ max-width: 1320px; } } +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} + .row { --bs-gutter-x: 1.5rem; --bs-gutter-y: 0; @@ -154,7 +93,7 @@ .row-cols-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-4 > * { @@ -169,7 +108,7 @@ .row-cols-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-auto { @@ -359,7 +298,7 @@ } .row-cols-sm-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-sm-4 > * { flex: 0 0 auto; @@ -371,7 +310,7 @@ } .row-cols-sm-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-sm-auto { flex: 0 0 auto; @@ -462,51 +401,51 @@ margin-right: 91.66666667%; } .g-sm-0, -.gx-sm-0 { + .gx-sm-0 { --bs-gutter-x: 0; } .g-sm-0, -.gy-sm-0 { + .gy-sm-0 { --bs-gutter-y: 0; } .g-sm-1, -.gx-sm-1 { + .gx-sm-1 { --bs-gutter-x: 0.25rem; } .g-sm-1, -.gy-sm-1 { + .gy-sm-1 { --bs-gutter-y: 0.25rem; } .g-sm-2, -.gx-sm-2 { + .gx-sm-2 { --bs-gutter-x: 0.5rem; } .g-sm-2, -.gy-sm-2 { + .gy-sm-2 { --bs-gutter-y: 0.5rem; } .g-sm-3, -.gx-sm-3 { + .gx-sm-3 { --bs-gutter-x: 1rem; } .g-sm-3, -.gy-sm-3 { + .gy-sm-3 { --bs-gutter-y: 1rem; } .g-sm-4, -.gx-sm-4 { + .gx-sm-4 { --bs-gutter-x: 1.5rem; } .g-sm-4, -.gy-sm-4 { + .gy-sm-4 { --bs-gutter-y: 1.5rem; } .g-sm-5, -.gx-sm-5 { + .gx-sm-5 { --bs-gutter-x: 3rem; } .g-sm-5, -.gy-sm-5 { + .gy-sm-5 { --bs-gutter-y: 3rem; } } @@ -528,7 +467,7 @@ } .row-cols-md-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-md-4 > * { flex: 0 0 auto; @@ -540,7 +479,7 @@ } .row-cols-md-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-md-auto { flex: 0 0 auto; @@ -631,51 +570,51 @@ margin-right: 91.66666667%; } .g-md-0, -.gx-md-0 { + .gx-md-0 { --bs-gutter-x: 0; } .g-md-0, -.gy-md-0 { + .gy-md-0 { --bs-gutter-y: 0; } .g-md-1, -.gx-md-1 { + .gx-md-1 { --bs-gutter-x: 0.25rem; } .g-md-1, -.gy-md-1 { + .gy-md-1 { --bs-gutter-y: 0.25rem; } .g-md-2, -.gx-md-2 { + .gx-md-2 { --bs-gutter-x: 0.5rem; } .g-md-2, -.gy-md-2 { + .gy-md-2 { --bs-gutter-y: 0.5rem; } .g-md-3, -.gx-md-3 { + .gx-md-3 { --bs-gutter-x: 1rem; } .g-md-3, -.gy-md-3 { + .gy-md-3 { --bs-gutter-y: 1rem; } .g-md-4, -.gx-md-4 { + .gx-md-4 { --bs-gutter-x: 1.5rem; } .g-md-4, -.gy-md-4 { + .gy-md-4 { --bs-gutter-y: 1.5rem; } .g-md-5, -.gx-md-5 { + .gx-md-5 { --bs-gutter-x: 3rem; } .g-md-5, -.gy-md-5 { + .gy-md-5 { --bs-gutter-y: 3rem; } } @@ -697,7 +636,7 @@ } .row-cols-lg-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-lg-4 > * { flex: 0 0 auto; @@ -709,7 +648,7 @@ } .row-cols-lg-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-lg-auto { flex: 0 0 auto; @@ -800,51 +739,51 @@ margin-right: 91.66666667%; } .g-lg-0, -.gx-lg-0 { + .gx-lg-0 { --bs-gutter-x: 0; } .g-lg-0, -.gy-lg-0 { + .gy-lg-0 { --bs-gutter-y: 0; } .g-lg-1, -.gx-lg-1 { + .gx-lg-1 { --bs-gutter-x: 0.25rem; } .g-lg-1, -.gy-lg-1 { + .gy-lg-1 { --bs-gutter-y: 0.25rem; } .g-lg-2, -.gx-lg-2 { + .gx-lg-2 { --bs-gutter-x: 0.5rem; } .g-lg-2, -.gy-lg-2 { + .gy-lg-2 { --bs-gutter-y: 0.5rem; } .g-lg-3, -.gx-lg-3 { + .gx-lg-3 { --bs-gutter-x: 1rem; } .g-lg-3, -.gy-lg-3 { + .gy-lg-3 { --bs-gutter-y: 1rem; } .g-lg-4, -.gx-lg-4 { + .gx-lg-4 { --bs-gutter-x: 1.5rem; } .g-lg-4, -.gy-lg-4 { + .gy-lg-4 { --bs-gutter-y: 1.5rem; } .g-lg-5, -.gx-lg-5 { + .gx-lg-5 { --bs-gutter-x: 3rem; } .g-lg-5, -.gy-lg-5 { + .gy-lg-5 { --bs-gutter-y: 3rem; } } @@ -866,7 +805,7 @@ } .row-cols-xl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-xl-4 > * { flex: 0 0 auto; @@ -878,7 +817,7 @@ } .row-cols-xl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-xl-auto { flex: 0 0 auto; @@ -969,51 +908,51 @@ margin-right: 91.66666667%; } .g-xl-0, -.gx-xl-0 { + .gx-xl-0 { --bs-gutter-x: 0; } .g-xl-0, -.gy-xl-0 { + .gy-xl-0 { --bs-gutter-y: 0; } .g-xl-1, -.gx-xl-1 { + .gx-xl-1 { --bs-gutter-x: 0.25rem; } .g-xl-1, -.gy-xl-1 { + .gy-xl-1 { --bs-gutter-y: 0.25rem; } .g-xl-2, -.gx-xl-2 { + .gx-xl-2 { --bs-gutter-x: 0.5rem; } .g-xl-2, -.gy-xl-2 { + .gy-xl-2 { --bs-gutter-y: 0.5rem; } .g-xl-3, -.gx-xl-3 { + .gx-xl-3 { --bs-gutter-x: 1rem; } .g-xl-3, -.gy-xl-3 { + .gy-xl-3 { --bs-gutter-y: 1rem; } .g-xl-4, -.gx-xl-4 { + .gx-xl-4 { --bs-gutter-x: 1.5rem; } .g-xl-4, -.gy-xl-4 { + .gy-xl-4 { --bs-gutter-y: 1.5rem; } .g-xl-5, -.gx-xl-5 { + .gx-xl-5 { --bs-gutter-x: 3rem; } .g-xl-5, -.gy-xl-5 { + .gy-xl-5 { --bs-gutter-y: 3rem; } } @@ -1035,7 +974,7 @@ } .row-cols-xxl-3 > * { flex: 0 0 auto; - width: 33.3333333333%; + width: 33.33333333%; } .row-cols-xxl-4 > * { flex: 0 0 auto; @@ -1047,7 +986,7 @@ } .row-cols-xxl-6 > * { flex: 0 0 auto; - width: 16.6666666667%; + width: 16.66666667%; } .col-xxl-auto { flex: 0 0 auto; @@ -1138,51 +1077,51 @@ margin-right: 91.66666667%; } .g-xxl-0, -.gx-xxl-0 { + .gx-xxl-0 { --bs-gutter-x: 0; } .g-xxl-0, -.gy-xxl-0 { + .gy-xxl-0 { --bs-gutter-y: 0; } .g-xxl-1, -.gx-xxl-1 { + .gx-xxl-1 { --bs-gutter-x: 0.25rem; } .g-xxl-1, -.gy-xxl-1 { + .gy-xxl-1 { --bs-gutter-y: 0.25rem; } .g-xxl-2, -.gx-xxl-2 { + .gx-xxl-2 { --bs-gutter-x: 0.5rem; } .g-xxl-2, -.gy-xxl-2 { + .gy-xxl-2 { --bs-gutter-y: 0.5rem; } .g-xxl-3, -.gx-xxl-3 { + .gx-xxl-3 { --bs-gutter-x: 1rem; } .g-xxl-3, -.gy-xxl-3 { + .gy-xxl-3 { --bs-gutter-y: 1rem; } .g-xxl-4, -.gx-xxl-4 { + .gx-xxl-4 { --bs-gutter-x: 1.5rem; } .g-xxl-4, -.gy-xxl-4 { + .gy-xxl-4 { --bs-gutter-y: 1.5rem; } .g-xxl-5, -.gx-xxl-5 { + .gx-xxl-5 { --bs-gutter-x: 3rem; } .g-xxl-5, -.gy-xxl-5 { + .gy-xxl-5 { --bs-gutter-y: 3rem; } } @@ -1202,6 +1141,10 @@ display: grid !important; } +.d-inline-grid { + display: inline-grid !important; +} + .d-table { display: table !important; } @@ -1801,6 +1744,9 @@ .d-sm-grid { display: grid !important; } + .d-sm-inline-grid { + display: inline-grid !important; + } .d-sm-table { display: table !important; } @@ -2261,6 +2207,9 @@ .d-md-grid { display: grid !important; } + .d-md-inline-grid { + display: inline-grid !important; + } .d-md-table { display: table !important; } @@ -2721,6 +2670,9 @@ .d-lg-grid { display: grid !important; } + .d-lg-inline-grid { + display: inline-grid !important; + } .d-lg-table { display: table !important; } @@ -3181,6 +3133,9 @@ .d-xl-grid { display: grid !important; } + .d-xl-inline-grid { + display: inline-grid !important; + } .d-xl-table { display: table !important; } @@ -3641,6 +3596,9 @@ .d-xxl-grid { display: grid !important; } + .d-xxl-inline-grid { + display: inline-grid !important; + } .d-xxl-table { display: table !important; } @@ -4101,6 +4059,9 @@ .d-print-grid { display: grid !important; } + .d-print-inline-grid { + display: inline-grid !important; + } .d-print-table { display: table !important; } diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css.map b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css.map index f479a7dac..08430325b 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css.map +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","bootstrap-grid.css","../../scss/_containers.scss","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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IGI;IAOI,0BAAA;EPwrDV;EO/rDM;IAOI,gCAAA;EP2rDV;EOlsDM;IAOI,yBAAA;EP8rDV;EOrsDM;IAOI,wBAAA;EPisDV;EOxsDM;IAOI,yBAAA;EPosDV;EO3sDM;IAOI,6BAAA;EPusDV;EO9sDM;IAOI,8BAAA;EP0sDV;EOjtDM;IAOI,wBAAA;EP6sDV;EOptDM;IAOI,+BAAA;EPgtDV;EOvtDM;IAOI,wBAAA;EPmtDV;EO1tDM;IAOI,yBAAA;EPstDV;EO7tDM;IAOI,8BAAA;EPytDV;EOhuDM;IAOI,iCAAA;EP4tDV;EOnuDM;IAOI,sCAAA;EP+tDV;EOtuDM;IAOI,yCAAA;EPkuDV;EOzuDM;IAOI,uBAAA;EPquDV;EO5uDM;IAOI,uBAAA;EPwuDV;EO/uDM;IAOI,yBAAA;EP2uDV;EOlvDM;IAOI,yBAAA;EP8uDV;EOrvDM;IAOI,0BAAA;EPivDV;EOxvDM;IAOI,4BAAA;EPovDV;EO3vDM;IAOI,kCAAA;EPuvDV;EO9vDM;IAOI,sCAAA;EP0vDV;EOjwDM;IAOI,oCAAA;EP6vDV;EOpwDM;IAOI,kCAAA;EPgwDV;EOvwDM;IAOI,yCAAA;EPmwDV;EO1wDM;IAOI,wCAAA;EPswDV;EO7wDM;IAOI,wCAAA;EPywDV;EOhxDM;IAOI,kCAAA;EP4wDV;EOnxDM;IAOI,gCAAA;EP+wDV;EOtxDM;IAOI,8BAAA;EPkxDV;EOzxDM;IAOI,gCAAA;EPqxDV;EO5xDM;IAOI,+BAAA;EPwxDV;EO/xDM;IAOI,oCAAA;EP2xDV;EOlyDM;IAOI,kCAAA;EP8xDV;EOryDM;IAOI,gCAAA;EPiyDV;EOxyDM;IAOI,uCAAA;EPoyDV;EO3yDM;IAOI,sCAAA;EPuyDV;EO9yDM;IAOI,iCAAA;EP0yDV;EOjzDM;IAOI,2BAAA;EP6yDV;EOpzDM;IAOI,iCAAA;EPgzDV;EOvzDM;IAOI,+BAAA;EPmzDV;EO1zDM;IAOI,6BAAA;EPszDV;EO7zDM;IAOI,+BAAA;EPyzDV;EOh0DM;IAOI,8BAAA;EP4zDV;EOn0DM;IAOI,oBAAA;EP+zDV;EOt0DM;IAOI,mBAAA;EPk0DV;EOz0DM;IAOI,mBAAA;EPq0DV;EO5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;EP8lEV;EOrmEM;IAOI,kCAAA;EPimEV;EOxmEM;IAOI,iCAAA;EPomEV;EO3mEM;IAOI,+BAAA;EPumEV;EO9mEM;IAOI,iCAAA;EP0mEV;EOjnEM;IAOI,+BAAA;EP6mEV;EOpnEM;IAOI,2BAAA;EPgnEV;EOvnEM;IAOI,iCAAA;EPmnEV;EO1nEM;IAOI,gCAAA;EPsnEV;EO7nEM;IAOI,8BAAA;EPynEV;EOhoEM;IAOI,gCAAA;EP4nEV;EOnoEM;IAOI,8BAAA;EP+nEV;AACF;AG1oEI;EIGI;IAOI,0BAAA;EPooEV;EO3oEM;IAOI,gCAAA;EPuoEV;EO9oEM;IAOI,yBAAA;EP0oEV;EOjpEM;IAOI,wBAAA;EP6oEV;EOppEM;IAOI,yBAAA;EPgpEV;EOvpEM;IAOI,6BAAA;EPmpEV;EO1pEM;IAOI,8BAAA;EPspEV;EO7pEM;IAOI,wBAAA;EPypEV;EOhqEM;IAOI,+BAAA;EP4pEV;EOnqEM;IAOI,wBAAA;EP+pEV;EOtqEM;IAOI,yBAAA;EPkqEV;EOzqEM;IAOI,8BAAA;EPqqEV;EO5qEM;IAOI,iCAAA;EPwqEV;EO/qEM;IAOI,sCAAA;EP2qEV;EOlrEM;IAOI,yCAAA;EP8qEV;EOrrEM;IAOI,uBAAA;EPirEV;EOxrEM;IAOI,uBAAA;EPorEV;EO3rEM;IAOI,yBAAA;EPurEV;EO9rEM;IAOI,yBAAA;EP0rEV;EOjsEM;IAOI,0BAAA;EP6rEV;EOpsEM;IAOI,4BAAA;EPgsEV;EOvsEM;IAOI,kCAAA;EPmsEV;EO1sEM;IAOI,sCAAA;EPssEV;EO7sEM;IAOI,oCAAA;EPysEV;EOhtEM;IAOI,kCAAA;EP4sEV;EOntEM;IAOI,yCAAA;EP+sEV;EOttEM;IAOI,wCAAA;EPktEV;EOztEM;IAOI,wCAAA;EPqtEV;EO5tEM;IAOI,kCAAA;EPwtEV;EO/tEM;IAOI,gCAAA;EP2tEV;EOluEM;IAOI,8BAAA;EP8tEV;EOruEM;IAOI,gCAAA;EPiuEV;EOxuEM;IAOI,+BAAA;EPouEV;EO3uEM;IAOI,oCAAA;EPuuEV;EO9uEM;IAOI,kCAAA;EP0uEV;EOjvEM;IAOI,gCAAA;EP6uEV;EOpvEM;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gFV;EO7gFM;IAOI,+BAAA;EPygFV;EOhhFM;IAOI,8BAAA;EP4gFV;EOnhFM;IAOI,4BAAA;EP+gFV;EOthFM;IAOI,8BAAA;EPkhFV;EOzhFM;IAOI,4BAAA;EPqhFV;EO5hFM;IAOI,0BAAA;EPwhFV;EO/hFM;IAOI,gCAAA;EP2hFV;EOliFM;IAOI,+BAAA;EP8hFV;EOriFM;IAOI,6BAAA;EPiiFV;EOxiFM;IAOI,+BAAA;EPoiFV;EO3iFM;IAOI,6BAAA;EPuiFV;EO9iFM;IAOI,4BAAA;EP0iFV;EOjjFM;IAOI,kCAAA;EP6iFV;EOpjFM;IAOI,iCAAA;EPgjFV;EOvjFM;IAOI,+BAAA;EPmjFV;EO1jFM;IAOI,iCAAA;EPsjFV;EO7jFM;IAOI,+BAAA;EPyjFV;EOhkFM;IAOI,2BAAA;EP4jFV;EOnkFM;IAOI,iCAAA;EP+jFV;EOtkFM;IAOI,gCAAA;EPkkFV;EOzkFM;IAOI,8BAAA;EPqkFV;EO5kFM;IAOI,gCAAA;EPwkFV;EO/kFM;IAOI,8BAAA;EP2kFV;AACF;AGtlFI;EIGI;IAOI,0BAAA;EPglFV;EOvlFM;IAOI,gCAAA;EPmlFV;EO1lFM;IAOI,yBAAA;EPslFV;EO7lFM;IAOI,wBAAA;EPylFV;EOhmFM;IAOI,yBAAA;EP4lFV;EOnmFM;IAOI,6BAAA;EP+lFV;EOtmFM;IAOI,8BAAA;EPkmFV;EOzmFM;IAOI,wBAAA;EPqmFV;EO5mFM;IAOI,+BAAA;EPwmFV;EO/mFM;IAOI,wBAAA;EP2mFV;EOlnFM;IAOI,yBAAA;EP8mFV;EOrnFM;IAOI,8BAAA;EPinFV;EOxnFM;IAOI,iCAAA;EPonFV;EO3nFM;IAOI,sCAAA;EPunFV;EO9nFM;IAOI,yCAAA;EP0nFV;EOjoFM;IAOI,uBAAA;EP6nFV;EOpoFM;IAOI,uBAAA;EPgoFV;EOvoFM;IAOI,yBAAA;EPmoFV;EO1oFM;IAOI,yBAAA;EPsoFV;EO7oFM;IAOI,0BAAA;EPyoFV;EOhpFM;IAOI,4BAAA;EP4oFV;EOnpFM;IAOI,kCAAA;EP+oFV;EOtpFM;IAOI,sCAAA;EPkpFV;EOzpFM;IAOI,oCAAA;EPqpFV;EO5pFM;IAOI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AA;EPgkGV;EOvkGM;IAOI,sCAAA;EPmkGV;EO1kGM;IAOI,yCAAA;EPskGV;EO7kGM;IAOI,uBAAA;EPykGV;EOhlGM;IAOI,uBAAA;EP4kGV;EOnlGM;IAOI,yBAAA;EP+kGV;EOtlGM;IAOI,yBAAA;EPklGV;EOzlGM;IAOI,0BAAA;EPqlGV;EO5lGM;IAOI,4BAAA;EPwlGV;EO/lGM;IAOI,kCAAA;EP2lGV;EOlmGM;IAOI,sCAAA;EP8lGV;EOrmGM;IAOI,oCAAA;EPimGV;EOxmGM;IAOI,kCAAA;EPomGV;EO3mGM;IAOI,yCAAA;EPumGV;EO9mGM;IAOI,wCAAA;EP0mGV;EOjnGM;IAOI,wCAAA;EP6mGV;EOpnGM;IAOI,kCAAA;EPgnGV;EOvnGM;IAOI,gCAAA;EPmnGV;EO1nGM;IAOI,8BAAA;EPsnGV;EO7nGM;IAOI,gCAAA;EPynGV;EOhoGM;IAOI,+BAAA;EP4nGV;EOnoGM;IAOI,oCAAA;EP+nGV;EOtoGM;IAOI,kCAAA;EPkoGV;EOzoGM;IAOI,gCAAA;EPqoGV;EO5oGM;IAOI,uCAAA;EPwoGV;EO/oGM;IAOI,sCAAA;EP2oGV;EOlpGM;IAOI,iCAAA;EP8oGV;EOrpGM;IAOI,2BAAA;EPipGV;EOxpGM;IAOI,iCAAA;EPopGV;EO3pGM;IAOI,+BAAA;EPupGV;EO9pGM;IAOI,6BAAA;EP0pGV;EOjqGM;IAOI,+BAAA;EP6pGV;EOpqGM;IAOI,8BAAA;EPgqGV;EOvqGM;IAOI,oBAAA;EPmqGV;EO1qGM;IAOI,mBAAA;EPsqGV;EO7qGM;IAOI,mBAAA;EPyqGV;EOhrGM;IAOI,mBAAA;EP4qGV;EOnrGM;IAOI,mBAAA;EP+qGV;EOtrGM;IAOI,mBAAA;EPkrGV;EOzrGM;IAOI,mBAAA;EPqrGV;EO5rGM;IAOI,mBAAA;EPwrGV;EO/rGM;IAOI,oBAAA;EP2rGV;EOlsGM;IAOI,0BAAA;EP8rGV;EOrsGM;IAOI,yBAAA;EPisGV;EOxsGM;IAOI,uBAAA;EPosGV;EO3sGM;IAOI,yBAAA;EPusGV;EO9sGM;IAOI,uBAAA;EP0sGV;EOjtGM;IAOI,uBAAA;EP6sGV;EOptGM;IAOI,yBA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Pw+GV;EO/+GM;IAOI,gCAAA;EP2+GV;EOl/GM;IAOI,yBAAA;EP8+GV;EOr/GM;IAOI,wBAAA;EPi/GV;EOx/GM;IAOI,yBAAA;EPo/GV;EO3/GM;IAOI,6BAAA;EPu/GV;EO9/GM;IAOI,8BAAA;EP0/GV;EOjgHM;IAOI,wBAAA;EP6/GV;EOpgHM;IAOI,+BAAA;EPggHV;EOvgHM;IAOI,wBAAA;EPmgHV;EO1gHM;IAOI,yBAAA;EPsgHV;EO7gHM;IAOI,8BAAA;EPygHV;EOhhHM;IAOI,iCAAA;EP4gHV;EOnhHM;IAOI,sCAAA;EP+gHV;EOthHM;IAOI,yCAAA;EPkhHV;EOzhHM;IAOI,uBAAA;EPqhHV;EO5hHM;IAOI,uBAAA;EPwhHV;EO/hHM;IAOI,yBAAA;EP2hHV;EOliHM;IAOI,yBAAA;EP8hHV;EOriHM;IAOI,0BAAA;EPiiHV;EOxiHM;IAOI,4BAAA;EPoiHV;EO3iHM;IAOI,kCAAA;EPuiHV;EO9iHM;IAOI,sCAAA;EP0iHV;EOjjHM;IAOI,oCAAA;EP6iHV;EOpjHM;IAOI,kCAAA;EPgjHV;EOvjHM;IAOI,yCAAA;EPmjHV;EO1jHM;IAOI,wCAAA;EPsjHV;EO7jHM;IAOI,wCAAA;EPyjHV;EOhkHM;IAOI,kCAAA;EP4jHV;EOnkHM;IAOI,gCAAA;EP+jHV;EOtkHM;IAOI,8BAAA;EPkkHV;EOzkHM;IAOI,gCAAA;EPqkHV;EO5kHM;IAOI,+BAAA;EPwkHV;EO/kHM;IAOI,oCAAA;EP2kHV;EOllHM;IAOI,kCAAA;EP8kHV;EOrlHM;IAOI,gCAAA;EPilHV;EOxlHM;IAOI,uCAAA;EPolHV;EO3lHM;IAOI,sCAAA;EPulHV;EO9lHM;IAOI,iCAAA;EP0lHV;EOjmHM;IAOI,2BAAA;EP6lHV;EOpmHM;IAOI,iCAAA;EPgmHV;EOvmHM;IAOI,+BAAA;EPmmHV;EO1mHM;IAOI,6BAAA;EPsmHV;EO7mHM;IAOI,+BAAA;EPymHV;EOhnHM;IAOI,8BAAA;EP4mHV;EOnnHM;IAOI,oBAAA;EP+mHV;EOtnHM;IAOI,mBAAA;EPknHV;EOznHM;IAOI,mBAAA;EPqnHV;EO5nHM;IAOI,mBAAA;E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","file":"bootstrap-grid.rtl.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n$body-text-align: null !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-2xl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: null !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n$text-muted: $gray-600 !default;\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: $border-width !default;\n$hr-opacity: .25 !default;\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}body-color) !default;\n$table-bg: transparent !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba($black, $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;\n\n$table-border-factor: .1 !default;\n$table-border-width: $border-width !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: $text-muted !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .25rem !default;\n$input-btn-focus-color-opacity: .25 !default;\n$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;\n$input-btn-focus-blur: 0 !default;\n$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: $border-width !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: $text-muted !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: $body-bg !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: $gray-200 !default;\n$input-disabled-border-color: null !default;\n\n$input-color: $body-color !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: $box-shadow-inset !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-sm: $border-radius-sm !default;\n$input-border-radius-lg: $border-radius-lg !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: 1px solid rgba($black, .25) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $gray-200 !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: $box-shadow-inset !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: $gray-300 !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: $box-shadow-inset !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: $gray-500 !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: $input-group-addon-bg !default;\n$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": $form-feedback-valid-color,\n \"icon\": $form-feedback-icon-valid\n ),\n \"invalid\": (\n \"color\": $form-feedback-invalid-color,\n \"icon\": $form-feedback-icon-invalid\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba($black, .55) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: $body-color !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: $box-shadow !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: shade-color($dropdown-link-color, 10%) !default;\n$dropdown-link-hover-bg: $gray-200 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-500 !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: $white !default;\n$pagination-border-radius: $border-radius !default;\n$pagination-border-width: $border-width !default;\n$pagination-margin-start: ($pagination-border-width * -1) !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: $gray-200 !default;\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: $border-radius-sm !default;\n$pagination-border-radius-lg: $border-radius-lg !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-border-width: $border-width !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: $border-radius !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: $white !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: $body-color !default; // Sass variable because of $accordion-button-icon\n$accordion-bg: $body-bg !default;\n$accordion-border-width: $border-width !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: $border-radius !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: $accordion-color !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;\n$accordion-button-active-color: shade-color($primary, 10%) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $accordion-button-color !default;\n$accordion-icon-active-color: $accordion-button-active-color !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;\n$popover-box-shadow: $box-shadow !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: shade-color($popover-bg, 6%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba($white, .85) !default;\n$toast-border-width: $border-width !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: $border-radius !default;\n$toast-box-shadow: $box-shadow !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: $gray-600 !default;\n$toast-header-background-color: rgba($white, .85) !default;\n$toast-header-border-color: rgba($black, .05) !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: $border-radius !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: $white !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: $box-shadow-sm !default;\n$modal-content-box-shadow-sm-up: $box-shadow !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n$alert-bg-scale: -80% !default;\n$alert-border-scale: -70% !default;\n$alert-color-scale: 40% !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: $box-shadow-inset !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: $gray-900 !default;\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n$list-group-item-bg-scale: -80% !default;\n$list-group-item-color-scale: 40% !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: $box-shadow-sm !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: $gray-600 !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: $modal-content-bg !default;\n$offcanvas-color: $modal-content-color !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","../../scss/mixins/_container.scss","bootstrap-grid.css","../../scss/mixins/_breakpoints.scss","../../scss/_variables.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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EE,mBAAA;EJ6+BR;EI1+BM;;IAEE,mBAAA;EJ4+BR;AACF;AKpiCQ;EAOI,0BAAA;ALgiCZ;;AKviCQ;EAOI,gCAAA;ALoiCZ;;AK3iCQ;EAOI,yBAAA;ALwiCZ;;AK/iCQ;EAOI,wBAAA;AL4iCZ;;AKnjCQ;EAOI,+BAAA;ALgjCZ;;AKvjCQ;EAOI,yBAAA;ALojCZ;;AK3jCQ;EAOI,6BAAA;ALwjCZ;;AK/jCQ;EAOI,8BAAA;AL4jCZ;;AKnkCQ;EAOI,wBAAA;ALgkCZ;;AKvkCQ;EAOI,+BAAA;ALokCZ;;AK3kCQ;EAOI,wBAAA;ALwkCZ;;AK/kCQ;EAOI,yBAAA;AL4kCZ;;AKnlCQ;EAOI,8BAAA;ALglCZ;;AKvlCQ;EAOI,iCAAA;ALolCZ;;AK3lCQ;EAOI,sCAAA;ALwlCZ;;AK/lCQ;EAOI,yCAAA;AL4lCZ;;AKnmCQ;EAOI,uBAAA;ALgmCZ;;AKvmCQ;EAOI,uBAAA;ALomCZ;;AK3mCQ;EAOI,yBAAA;ALwmCZ;;AK/mCQ;EAOI,yBAAA;AL4mCZ;;AKnnCQ;EAOI,0BAAA;ALgnCZ;;AKvnCQ;EAOI,4BAAA;ALonCZ;;AK3nCQ;EAOI,kCAAA;ALwnCZ;;AK/nCQ;EAOI,sCAAA;AL4nCZ;;AKnoCQ;EAOI,oCAAA;ALgoCZ;;AKvoCQ;EAOI,kCAAA;ALooCZ;;AK3oCQ;EAOI,yCAAA;ALwoCZ;;AK/oCQ;EAOI,wCAAA;AL4oCZ;;AKnpCQ;EAOI,wCAAA;ALgpCZ;;AKvpCQ;EAOI,kCAAA;ALopCZ;;AK3pCQ;EAOI,gCAAA;ALwpCZ;;AK/pCQ;EAOI,8BAAA;AL4pCZ;;AKnqCQ;EAOI,gCAAA;ALgqCZ;;AKvqCQ;EAOI,+BAAA;ALoqCZ;;AK3qCQ;EAOI,oCAAA;ALwqCZ;;AK/qCQ;EAOI,kCAAA;AL4qCZ;;AKnrCQ;EAOI,gCAAA;ALgrCZ;;AKvrCQ;EAOI,uCAAA;ALorCZ;;AK3rCQ;EAOI,sCAAA;ALwrCZ;;AK/rCQ;EAOI,iCAAA;AL4rCZ;;AKnsCQ;EAOI,2BAAA;ALgsCZ;;AKvsCQ;EAOI,iCAAA;ALosCZ;;AK3sCQ;EAOI,+BAAA;ALwsCZ;;AK/sCQ;EAOI,6BAAA;AL4sCZ;;AKntCQ;EA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;AL8iDZ;;AKrjDQ;EAOI,4BAAA;ALkjDZ;;AKzjDQ;EAOI,0BAAA;ALsjDZ;;AK7jDQ;EAOI,gCAAA;AL0jDZ;;AKjkDQ;EAOI,+BAAA;AL8jDZ;;AKrkDQ;EAOI,6BAAA;ALkkDZ;;AKzkDQ;EAOI,+BAAA;ALskDZ;;AK7kDQ;EAOI,6BAAA;AL0kDZ;;AKjlDQ;EAOI,4BAAA;AL8kDZ;;AKrlDQ;EAOI,kCAAA;ALklDZ;;AKzlDQ;EAOI,iCAAA;ALslDZ;;AK7lDQ;EAOI,+BAAA;AL0lDZ;;AKjmDQ;EAOI,iCAAA;AL8lDZ;;AKrmDQ;EAOI,+BAAA;ALkmDZ;;AKzmDQ;EAOI,2BAAA;ALsmDZ;;AK7mDQ;EAOI,iCAAA;AL0mDZ;;AKjnDQ;EAOI,gCAAA;AL8mDZ;;AKrnDQ;EAOI,8BAAA;ALknDZ;;AKznDQ;EAOI,gCAAA;ALsnDZ;;AK7nDQ;EAOI,8BAAA;AL0nDZ;;ACpoDI;EIGI;IAOI,0BAAA;EL+nDV;EKtoDM;IAOI,gCAAA;ELkoDV;EKzoDM;IAOI,yBAAA;ELqoDV;EK5oDM;IAOI,wBAAA;ELwoDV;EK/oDM;IAOI,+BAAA;EL2oDV;EKlpDM;IAOI,yBAAA;EL8oDV;EKrpDM;IAOI,6BAAA;ELipDV;EKxpDM;IAOI,8BAAA;ELopDV;EK3pDM;IAOI,wBAAA;ELupDV;EK9pDM;IAOI,+BAAA;EL0pDV;EKjqDM;IAOI,wBAAA;EL6pDV;EKpqDM;IAOI,yBAAA;ELgqDV;EKvqDM;IAOI,8BAAA;ELmqDV;EK1qDM;IAOI,iCAAA;ELsqDV;EK7qDM;IAOI,sCAAA;ELyqDV;EKhrDM;IAOI,yCAAA;EL4qDV;EKnrDM;IAOI,uBAAA;EL+qDV;EKtrDM;IAOI,uBAAA;ELkrDV;EKzrDM;IAOI,yBAAA;ELqrDV;EK5rDM;IAOI,yBAAA;ELwrDV;EK/rDM;IAOI,0BAAA;EL2rDV;EKlsDM;IAOI,4BAAA;EL8rDV;EKrsDM;IAOI,kCAAA;ELisDV;EKxsDM;IAOI,sCAAA;ELosDV;EK3sDM;IAOI,oCAAA;ELusDV;EK9sDM;IAOI,kCAAA;EL0sDV;EKjtDM;IAOI,yCAAA;EL6sDV;EKptDM;IAOI,wCAAA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nEV;EK/nEM;IAOI,yCAAA;EL2nEV;EKloEM;IAOI,uBAAA;EL8nEV;EKroEM;IAOI,uBAAA;ELioEV;EKxoEM;IAOI,yBAAA;ELooEV;EK3oEM;IAOI,yBAAA;ELuoEV;EK9oEM;IAOI,0BAAA;EL0oEV;EKjpEM;IAOI,4BAAA;EL6oEV;EKppEM;IAOI,kCAAA;ELgpEV;EKvpEM;IAOI,sCAAA;ELmpEV;EK1pEM;IAOI,oCAAA;ELspEV;EK7pEM;IAOI,kCAAA;ELypEV;EKhqEM;IAOI,yCAAA;EL4pEV;EKnqEM;IAOI,wCAAA;EL+pEV;EKtqEM;IAOI,wCAAA;ELkqEV;EKzqEM;IAOI,kCAAA;ELqqEV;EK5qEM;IAOI,gCAAA;ELwqEV;EK/qEM;IAOI,8BAAA;EL2qEV;EKlrEM;IAOI,gCAAA;EL8qEV;EKrrEM;IAOI,+BAAA;ELirEV;EKxrEM;IAOI,oCAAA;ELorEV;EK3rEM;IAOI,kCAAA;ELurEV;EK9rEM;IAOI,gCAAA;EL0rEV;EKjsEM;IAOI,uCAAA;EL6rEV;EKpsEM;IAOI,sCAAA;ELgsEV;EKvsEM;IAOI,iCAAA;ELmsEV;EK1sEM;IAOI,2BAAA;ELssEV;EK7sEM;IAOI,iCAAA;ELysEV;EKhtEM;IAOI,+BAAA;EL4sEV;EKntEM;IAOI,6BAAA;EL+sEV;EKttEM;IAOI,+BAAA;ELktEV;EKztEM;IAOI,8BAAA;ELqtEV;EK5tEM;IAOI,oBAAA;ELwtEV;EK/tEM;IAOI,mBAAA;EL2tEV;EKluEM;IAOI,mBAAA;EL8tEV;EKruEM;IAOI,mBAAA;ELiuEV;EKxuEM;IAOI,mBAAA;ELouEV;EK3uEM;IAOI,mBAAA;ELuuEV;EK9uEM;IAOI,mBAAA;EL0uEV;EKjvEM;IAOI,mBAAA;EL6uEV;EKpvEM;IAOI,oBAAA;ELgvEV;EKvvEM;IAOI,0BAAA;ELmvEV;EK1vEM;IAOI,yBAAA;ELsvEV;EK7vEM;IAOI,uBAAA;ELyvEV;EKhwEM;IAOI,yBAAA;EL4vEV;EKnwEM;IAOI,uBAAA;EL+vEV;EKtwEM;IAOI,uBAAA;ELkwEV;EKzwEM;IAOI,yBAAA;IAAA,0BAAA;ELswEV;EK7wEM;IAOI,+BAAA;IAAA,gCAAA;EL0wEV;EKjxEM;IAOI,8BAAA;IAAA,+BAAA;EL8wEV;EKrxEM;IAOI,4BAAA;IAAA,6BAAA;ELkxEV;EKzxEM;IAOI,8BAAA;IAAA,+BAAA;ELsxEV;EK7xEM;IAOI,4BAAA;IAAA,6BAAA;EL0xEV;EKjyEM;IAOI,4BAAA;IAAA,6BAAA;EL8xEV;EKryEM;IAOI,wBAAA;IAAA,2BAAA;ELkyEV;EKzyEM;IAOI,8BAAA;IAAA,iCAAA;ELsyEV;EK7yEM;IAOI,6BAAA;IAAA,gCAAA;EL0yEV;EKjzEM;IAOI,2BAAA;IAAA,8BAAA;EL8yEV;EKrzEM;IAOI,6BAAA;IAAA,gCAAA;ELkzEV;EKzzEM;IAOI,2BAAA;IAAA,8BAAA;ELszEV;EK7zEM;IAOI,2BAAA;IAAA,8BAAA;EL0zEV;EKj0EM;IAOI,wBAAA;EL6zEV;EKp0EM;IAOI,8BAAA;ELg0EV;EKv0EM;IAOI,6BAAA;ELm0EV;EK10EM;IAOI,2BAAA;ELs0EV;EK70EM;IAOI,6BAAA;ELy0EV;EKh1EM;IAOI,2BAAA;EL40EV;EKn1EM;IAOI,2BAAA;EL+0EV;EKt1EM;IAOI,yBAAA;ELk1EV;EKz1EM;IAOI,+BAAA;ELq1EV;EK51EM;IAOI,8BAAA;ELw1EV;EK/1EM;IAOI,4BAAA;EL21EV;EKl2EM;IAOI,8BAAA;EL81EV;EKr2EM;IAOI,4BAAA;ELi2EV;EKx2EM;IAOI,4BAAA;ELo2EV;EK32EM;IAOI,2BAAA;ELu2EV;EK92EM;IAOI,iCAAA;EL02EV;EKj3EM;IAOI,gCAAA;EL62EV;EKp3EM;IAOI,8BAAA;ELg3EV;EKv3EM;IAOI,gCAAA;ELm3EV;EK13EM;IAOI,8BAAA;ELs3EV;EK73EM;IAOI,8BAAA;ELy3EV;EKh4EM;IAOI,0BAAA;EL43EV;EKn4EM;IAOI,gCAAA;EL+3EV;EKt4EM;IAOI,+BAAA;ELk4EV;EKz4EM;IAOI,6BAAA;ELq4EV;EK54EM;IAOI,+BAAA;ELw4EV;EK/4EM;IAOI,6BAAA;EL24EV;EKl5EM;IAOI,6BAAA;EL84EV;EKr5EM;IAOI,qBAAA;ELi5EV;EKx5EM;IAOI,2BAAA;ELo5EV;EK35EM;IAOI,0BAAA;ELu5EV;EK95EM;IAOI,wBAAA;EL05EV;EKj6EM;IAOI,0BAAA;EL65EV;EKp6EM;IAOI,wBAAA;ELg6EV;EKv6EM;IAOI,0BAAA;IAAA,2BAAA;ELo6EV;EK36EM;IAOI,gCAAA;IAAA,iCAAA;ELw6EV;EK/6EM;IAOI,+BAAA;IAAA,gCAAA;EL46EV;EKn7EM;IAOI,6BAAA;IAAA,8BAAA;ELg7EV;EKv7EM;IAOI,+BAAA;IAAA,gCAAA;ELo7EV;EK37EM;IAOI,6BAAA;IAAA,8BAAA;ELw7EV;EK/7EM;IAOI,yBAAA;IAAA,4BAAA;EL47EV;EKn8EM;IAOI,+BAAA;IAAA,kCAAA;ELg8EV;EKv8EM;IAOI,8BAAA;IAAA,iCAAA;ELo8EV;EK38EM;IAOI,4BAAA;IAAA,+BAAA;ELw8EV;EK/8EM;IAOI,8BAAA;IAAA,iCAAA;EL48EV;EKn9EM;IAOI,4BAAA;IAAA,+BAAA;ELg9EV;EKv9EM;IAOI,yBAAA;ELm9EV;EK19EM;IAOI,+BAAA;ELs9EV;EK79EM;IAOI,8BAAA;ELy9EV;EKh+EM;IAOI,4BAAA;EL49EV;EKn+EM;IAOI,8BAAA;EL+9EV;EKt+EM;IAOI,4BAAA;ELk+EV;EKz+EM;IAOI,0BAAA;ELq+EV;EK5+EM;IAOI,gCAAA;ELw+EV;EK/+EM;IAOI,+BAAA;EL2+EV;EKl/EM;IAOI,6BAAA;EL8+EV;EKr/EM;IAOI,+BAAA;ELi/EV;EKx/EM;IAOI,6BAAA;ELo/EV;EK3/EM;IAOI,4BAAA;ELu/EV;EK9/EM;IAOI,kCAAA;EL0/EV;EKjgFM;IAOI,iCAAA;EL6/EV;EKpgFM;IAOI,+BAAA;ELggFV;EKvgFM;IAOI,iCAAA;ELmgFV;EK1gFM;IAOI,+BAAA;ELsgFV;EK7gFM;IAOI,2BAAA;ELygFV;EKhhFM;IAOI,iCAAA;EL4gFV;EKnhFM;IAOI,gCAAA;EL+gFV;EKthFM;IAOI,8BAAA;ELkhFV;EKzhFM;IAOI,gCAAA;ELqhFV;EK5hFM;IAOI,8BAAA;ELwhFV;AACF;ACniFI;EIGI;IAOI,0BAAA;EL6hFV;EKpiFM;IAOI,gCAAA;ELgiFV;EKviFM;IAOI,yBAAA;ELmiFV;EK1iFM;IAOI,wBAAA;ELsiFV;EK7iFM;IAOI,+BAAA;ELyiFV;EKhjFM;IAOI,yBAAA;EL4iFV;EKnjFM;IAOI,6BAAA;EL+iFV;EKtjFM;IAOI,8BAAA;ELkjFV;EKzjFM;IAOI,wBAAA;ELqjFV;EK5jFM;IAOI,+BAAA;ELwjFV;EK/jFM;IAOI,wBAAA;EL2jFV;EKlkFM;IAOI,yBAAA;EL8jFV;EKrkFM;IAOI,8BAAA;ELikFV;EKxkFM;IAOI,iCAAA;ELokFV;EK3kFM;IAOI,sCAAA;ELukFV;EK9kFM;IAOI,yCAAA;EL0kFV;EKjlFM;IAOI,uBAAA;EL6kFV;EKplFM;IAOI,uBAAA;ELglFV;EKvlFM;IAOI,yBAAA;ELmlFV;EK1lFM;IAOI,yBAAA;ELslFV;EK7lFM;IAOI,0BAAA;ELylFV;EKhmFM;IAOI,4BAAA;EL4lFV;EKnmFM;IAOI,kCAAA;EL+lFV;EKtmFM;IAOI,sCAAA;ELkmFV;EKzmFM;IAOI,oCAAA;ELqmFV;EK5mFM;IAOI,kCAAA;ELwmFV;EK/mFM;IAOI,yCAAA;EL2mFV;EKlnFM;IAOI,wCAAA;EL8mFV;EKrnFM;IAOI,wCAAA;ELinFV;EKxnFM;IAOI,kCAAA;ELonFV;EK3nFM;IAOI,gCAAA;ELunFV;EK9nFM;IAOI,8BAAA;EL0nFV;EKjoFM;IAOI,gCAAA;EL6nFV;EKpoFM;IAOI,+BAAA;ELgoFV;EKvoFM;IAOI,oCAAA;ELmoFV;EK1oFM;IAOI,kCAAA;ELsoFV;EK7oFM;IAOI,gCAAA;ELyoFV;EKhpFM;IAOI,uCAAA;EL4oFV;EKnpFM;IAOI,sCAAA;EL+oFV;EKtpFM;IAOI,iCAAA;ELkpFV;EKzpFM;IAOI,2BAAA;ELqpFV;EK5pFM;IAOI,iCAAA;ELwpFV;EK/pFM;IAOI,+BAAA;EL2pFV;EKlqFM;IAOI,6BAAA;EL8pFV;EKrqFM;IAOI,+BAAA;ELiqFV;EKxqFM;IAOI,8BAAA;ELoqFV;EK3qFM;IAOI,oBAAA;ELuqFV;EK9qFM;IAOI,mBAAA;EL0qFV;EKjrFM;IAOI,mBAAA;EL6qFV;EKprFM;IAOI,mBAAA;ELgrFV;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AAA;ELy8FV;EKh9FM;IAOI,iCAAA;EL48FV;EKn9FM;IAOI,+BAAA;EL+8FV;EKt9FM;IAOI,iCAAA;ELk9FV;EKz9FM;IAOI,+BAAA;ELq9FV;EK59FM;IAOI,2BAAA;ELw9FV;EK/9FM;IAOI,iCAAA;EL29FV;EKl+FM;IAOI,gCAAA;EL89FV;EKr+FM;IAOI,8BAAA;ELi+FV;EKx+FM;IAOI,gCAAA;ELo+FV;EK3+FM;IAOI,8BAAA;ELu+FV;AACF;ACl/FI;EIGI;IAOI,0BAAA;EL4+FV;EKn/FM;IAOI,gCAAA;EL++FV;EKt/FM;IAOI,yBAAA;ELk/FV;EKz/FM;IAOI,wBAAA;ELq/FV;EK5/FM;IAOI,+BAAA;ELw/FV;EK//FM;IAOI,yBAAA;EL2/FV;EKlgGM;IAOI,6BAAA;EL8/FV;EKrgGM;IAOI,8BAAA;ELigGV;EKxgGM;IAOI,wBAAA;ELogGV;EK3gGM;IAOI,+BAAA;ELugGV;EK9gGM;IAOI,wBAAA;EL0gGV;EKjhGM;IAOI,yBAAA;EL6gGV;EKphGM;IAOI,8BAAA;ELghGV;EKvhGM;IAOI,iCAAA;ELmhGV;EK1hGM;IAOI,sCAAA;ELshGV;EK7hGM;IAOI,yCAAA;ELyhGV;EKhiGM;IAOI,uBAAA;EL4hGV;EKniGM;IAOI,uBAAA;EL+hGV;EKtiGM;IAOI,yBAAA;ELkiGV;EKziGM;IAOI,yBAAA;ELqiGV;EK5iGM;IAOI,0BAAA;ELwiGV;EK/iGM;IAOI,4BAAA;EL2iGV;EKljGM;IAOI,kCAAA;EL8iGV;EKrjGM;IAOI,sCAAA;ELijGV;EKxjGM;IAOI,oCAAA;ELojGV;EK3jGM;IAOI,kCAAA;ELujGV;EK9jGM;IAOI,yCAAA;EL0jGV;EKjkGM;IAOI,wCAAA;EL6jGV;EKpkGM;IAOI,wCAAA;ELgkGV;EKvkGM;IAOI,kCAAA;ELmkGV;EK1kGM;IAOI,gCAAA;ELskGV;EK7kGM;IAOI,8BAAA;ELykGV;EKhlGM;IAOI,gCAAA;EL4kGV;EKnlGM;IAOI,+BAAA;EL+kGV;EKtlGM;IAOI,oCAAA;ELklGV;EKzlGM;IAOI,kCAAA;ELqlGV;EK5lGM;IAOI,gCAAA;ELwlGV;EK/lGM;IAOI,uCAAA;EL2lGV;EKlmGM;IAOI,sCAAA;EL8lGV;EKrmGM;IAOI,iCAAA;ELimGV;EKxmGM;IAOI,2BAAA;ELomGV;EK3mGM;IAOI,iCAAA;ELumGV;EK9mGM;IAOI,+BAAA;EL0mGV;EKjnGM;IAOI,6BAAA;EL6mGV;EKpnGM;IAOI,+BAAA;ELgnGV;EKvnGM;IAOI,8BAAA;ELmnGV;EK1nGM;IAOI,oBAAA;ELsnGV;EK7nGM;IAOI,mBAAA;ELynGV;EKhoGM;IAOI,mBAAA;EL4nGV;EKnoGM;IAOI,mBAAA;EL+nGV;EKtoGM;IAOI,mBAAA;ELkoGV;EKzoGM;IAOI,mBAAA;ELqoGV;EK5oGM;IAOI,mBAAA;ELwoGV;EK/oGM;IAOI,mBAAA;EL2oGV;EKlpGM;IAOI,oBAAA;EL8oGV;EKrpGM;IAOI,0BAAA;ELipGV;EKxpGM;IAOI,yBAAA;ELopGV;EK3pGM;IAOI,uBAAA;ELupGV;EK9pGM;IAOI,yBAAA;EL0pGV;EKjqGM;IAOI,uBAAA;EL6pGV;EKpqGM;IAOI,uBAAA;ELgqGV;EKvqGM;IAOI,yBAAA;IAAA,0BAAA;ELoqGV;EK3qGM;IAOI,+BAAA;IAAA,gCAAA;ELwqGV;EK/qGM;IAOI,8BAAA;IAAA,+BAAA;EL4qGV;EKnrGM;IAOI,4BAAA;IAAA,6BAAA;ELgrGV;EKvrGM;IAOI,8BAAA;IAAA,+BAAA;ELorGV;EK3rGM;IAOI,4BAAA;IAAA,6BAAA;ELwrGV;EK/rGM;IAOI,4BAAA;IAAA,6BAAA;EL4rGV;EKnsGM;IAOI,wBAAA;IAAA,2BAAA;ELgsGV;EKvsGM;IAOI,8BAAA;IAAA,iCAAA;ELosGV;EK3sGM;IAOI,6BAAA;IAAA,gCAAA;ELwsGV;EK/sGM;IAOI,2BAAA;IAAA,8BAAA;EL4sGV;EKntGM;IAOI,6BAAA;IAAA,gCAAA;ELgtGV;EKvtGM;IAOI,2BAAA;IAAA,8BAAA;ELotGV;EK3tGM;IAOI,2BAAA;IAAA,8BAAA;ELwtGV;EK/tGM;IAOI,wBAAA;EL2tGV;EKluGM;IAOI,8BAAA;EL8tGV;EKruGM;IAOI,6BAAA;ELiuGV;EKxuGM;IAOI,2BAAA;ELouGV;EK3uGM;IAOI,6BAAA;ELuuGV;EK9uGM;IAOI,2BAAA;EL0uGV;EKjvGM;IAOI,2BAAA;EL6uGV;EKpvGM;IAOI,yBAAA;ELgvGV;EKvvGM;IAOI,+BAAA;ELmvGV;EK1vGM;IAOI,8BAAA;ELsvGV;EK7vGM;IAOI,4BAAA;ELyvGV;EKhwGM;IAOI,8BAAA;EL4vGV;EKnwGM;IAOI,4BAAA;EL+vGV;EKtwGM;IAOI,4BAAA;ELkwGV;EKzwGM;IAOI,2BAAA;ELqwGV;EK5wGM;IAOI,iCAAA;ELwwGV;EK/wGM;IAOI,gCAAA;EL2wGV;EKlxGM;IAOI,8BAAA;EL8wGV;EKrxGM;IAOI,gCAAA;ELixGV;EKxxGM;IAOI,8BAAA;ELoxGV;EK3xGM;IAOI,8BAAA;ELuxGV;EK9xGM;IAOI,0BAAA;EL0xGV;EKjyGM;IAOI,gCAAA;EL6xGV;EKpyGM;IAOI,+BAAA;ELgyGV;EKvyGM;IAOI,6BAAA;ELmyGV;EK1yGM;IAOI,+BAAA;ELsyGV;EK7yGM;IAOI,6BAAA;ELyyGV;EKhzGM;IAOI,6BAAA;EL4yGV;EKnzGM;IAOI,qBAAA;EL+yGV;EKtzGM;IAOI,2BAAA;ELkzGV;EKzzGM;IAOI,0BAAA;ELqzGV;EK5zGM;IAOI,wBAAA;ELwzGV;EK/zGM;IAOI,0BAAA;EL2zGV;EKl0GM;IAOI,wBAAA;EL8zGV;EKr0GM;IAOI,0BAAA;IAAA,2BAAA;ELk0GV;EKz0GM;IAOI,gCAAA;IAAA,iCAAA;ELs0GV;EK70GM;IAOI,+BAAA;IAAA,gCAAA;EL00GV;EKj1GM;IAOI,6BAAA;IAAA,8BAAA;EL80GV;EKr1GM;IAOI,+BAAA;IAAA,gCAAA;ELk1GV;EKz1GM;IAOI,6BAAA;IAAA,8BAAA;ELs1GV;EK71GM;IAOI,yBAAA;IAAA,4BAAA;EL01GV;EKj2GM;IAOI,+BAAA;IAAA,kCAAA;EL81GV;EKr2GM;IAOI,8BAAA;IAAA,iCAAA;ELk2GV;EKz2GM;IAOI,4BAAA;IAAA,+BAAA;ELs2GV;EK72GM;IAOI,8BAAA;IAAA,iCAAA;EL02GV;EKj3GM;IAOI,4BAAA;IAAA,+BAAA;EL82GV;EKr3GM;IAOI,yBAAA;ELi3GV;EKx3GM;IAOI,+BAAA;ELo3GV;EK33GM;IAOI,8BAAA;ELu3GV;EK93GM;IAOI,4BAAA;EL03GV;EKj4GM;IAOI,8BAAA;EL63GV;EKp4GM;IAOI,4BAAA;ELg4GV;EKv4GM;IAOI,0BAAA;ELm4GV;EK14GM;IAOI,gCAAA;ELs4GV;EK74GM;IAOI,+BAAA;ELy4GV;EKh5GM;IAOI,6BAAA;EL44GV;EKn5GM;IAOI,+BAAA;EL+4GV;EKt5GM;IAOI,6BAAA;ELk5GV;EKz5GM;IAOI,4BAAA;ELq5GV;EK55GM;IAOI,kCAAA;ELw5GV;EK/5GM;IAOI,iCAAA;EL25GV;EKl6GM;IAOI,+BAAA;EL85GV;EKr6GM;IAOI,iCAAA;ELi6GV;EKx6GM;IAOI,+BAAA;ELo6GV;EK36GM;IAOI,2BAAA;ELu6GV;EK96GM;IAOI,iCAAA;EL06GV;EKj7GM;IAOI,gCAAA;EL66GV;EKp7GM;IAOI,8BAAA;ELg7GV;EKv7GM;IAOI,gCAAA;ELm7GV;EK17GM;IAOI,8BAAA;ELs7GV;AACF;ACj8GI;EIGI;IAOI,0BAAA;EL27GV;EKl8GM;IAOI,gCAAA;EL87GV;EKr8GM;IAOI,yBAAA;ELi8GV;EKx8GM;IAOI,wBAAA;ELo8GV;EK38GM;IAOI,+BAAA;ELu8GV;EK98GM;IAOI,yBAAA;EL08GV;EKj9GM;IAOI,6BAAA;EL68GV;EKp9GM;IAOI,8BAAA;ELg9GV;EKv9GM;IAOI,wBAAA;ELm9GV;EK19GM;IAOI,+BAAA;ELs9GV;EK79GM;IAOI,wBAAA;ELy9GV;EKh+GM;IAOI,yBAAA;EL49GV;EKn+GM;IAOI,8BAAA;EL+9GV;EKt+GM;IAOI,iCAAA;ELk+GV;EKz+GM;IAOI,sCAAA;ELq+GV;EK5+GM;IAOI,yCAAA;ELw+GV;EK/+GM;IAOI,uBAAA;EL2+GV;EKl/GM;IAOI,uBAAA;EL8+GV;EKr/GM;IAOI,yBAAA;ELi/GV;EKx/GM;IAOI,yBAAA;ELo/GV;EK3/GM;IAOI,0BAAA;ELu/GV;EK9/GM;IAOI,4BAAA;EL0/GV;EKjgHM;IAOI,kCAAA;EL6/GV;EKpgHM;IAOI,sCAAA;ELggHV;EKvgHM;I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","file":"bootstrap-grid.rtl.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n$accordion-button-focus-border-color: $input-focus-border-color !default;\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css index 2330c372e..d678024b6 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css @@ -1,7 +1,6 @@ /*! - * Bootstrap Grid v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. + * Bootstrap Grid v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#0d6efd;--bs-link-hover-color:#0a58ca;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-left:calc(-.5 * var(--bs-gutter-x));margin-right:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} + */.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-left:auto;margin-right:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-left:calc(-.5 * var(--bs-gutter-x));margin-right:calc(-.5 * var(--bs-gutter-x))}.row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-left:calc(var(--bs-gutter-x) * .5);padding-right:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-right:8.33333333%}.offset-2{margin-right:16.66666667%}.offset-3{margin-right:25%}.offset-4{margin-right:33.33333333%}.offset-5{margin-right:41.66666667%}.offset-6{margin-right:50%}.offset-7{margin-right:58.33333333%}.offset-8{margin-right:66.66666667%}.offset-9{margin-right:75%}.offset-10{margin-right:83.33333333%}.offset-11{margin-right:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-right:0}.offset-sm-1{margin-right:8.33333333%}.offset-sm-2{margin-right:16.66666667%}.offset-sm-3{margin-right:25%}.offset-sm-4{margin-right:33.33333333%}.offset-sm-5{margin-right:41.66666667%}.offset-sm-6{margin-right:50%}.offset-sm-7{margin-right:58.33333333%}.offset-sm-8{margin-right:66.66666667%}.offset-sm-9{margin-right:75%}.offset-sm-10{margin-right:83.33333333%}.offset-sm-11{margin-right:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-right:0}.offset-md-1{margin-right:8.33333333%}.offset-md-2{margin-right:16.66666667%}.offset-md-3{margin-right:25%}.offset-md-4{margin-right:33.33333333%}.offset-md-5{margin-right:41.66666667%}.offset-md-6{margin-right:50%}.offset-md-7{margin-right:58.33333333%}.offset-md-8{margin-right:66.66666667%}.offset-md-9{margin-right:75%}.offset-md-10{margin-right:83.33333333%}.offset-md-11{margin-right:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-right:0}.offset-lg-1{margin-right:8.33333333%}.offset-lg-2{margin-right:16.66666667%}.offset-lg-3{margin-right:25%}.offset-lg-4{margin-right:33.33333333%}.offset-lg-5{margin-right:41.66666667%}.offset-lg-6{margin-right:50%}.offset-lg-7{margin-right:58.33333333%}.offset-lg-8{margin-right:66.66666667%}.offset-lg-9{margin-right:75%}.offset-lg-10{margin-right:83.33333333%}.offset-lg-11{margin-right:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-right:0}.offset-xl-1{margin-right:8.33333333%}.offset-xl-2{margin-right:16.66666667%}.offset-xl-3{margin-right:25%}.offset-xl-4{margin-right:33.33333333%}.offset-xl-5{margin-right:41.66666667%}.offset-xl-6{margin-right:50%}.offset-xl-7{margin-right:58.33333333%}.offset-xl-8{margin-right:66.66666667%}.offset-xl-9{margin-right:75%}.offset-xl-10{margin-right:83.33333333%}.offset-xl-11{margin-right:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-right:0}.offset-xxl-1{margin-right:8.33333333%}.offset-xxl-2{margin-right:16.66666667%}.offset-xxl-3{margin-right:25%}.offset-xxl-4{margin-right:33.33333333%}.offset-xxl-5{margin-right:41.66666667%}.offset-xxl-6{margin-right:50%}.offset-xxl-7{margin-right:58.33333333%}.offset-xxl-8{margin-right:66.66666667%}.offset-xxl-9{margin-right:75%}.offset-xxl-10{margin-right:83.33333333%}.offset-xxl-11{margin-right:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-left:0!important}.me-1{margin-left:.25rem!important}.me-2{margin-left:.5rem!important}.me-3{margin-left:1rem!important}.me-4{margin-left:1.5rem!important}.me-5{margin-left:3rem!important}.me-auto{margin-left:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-right:0!important}.ms-1{margin-right:.25rem!important}.ms-2{margin-right:.5rem!important}.ms-3{margin-right:1rem!important}.ms-4{margin-right:1.5rem!important}.ms-5{margin-right:3rem!important}.ms-auto{margin-right:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-left:0!important}.pe-1{padding-left:.25rem!important}.pe-2{padding-left:.5rem!important}.pe-3{padding-left:1rem!important}.pe-4{padding-left:1.5rem!important}.pe-5{padding-left:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-right:0!important}.ps-1{padding-right:.25rem!important}.ps-2{padding-right:.5rem!important}.ps-3{padding-right:1rem!important}.ps-4{padding-right:1.5rem!important}.ps-5{padding-right:3rem!important}@media (min-width:576px){.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-left:0!important}.me-sm-1{margin-left:.25rem!important}.me-sm-2{margin-left:.5rem!important}.me-sm-3{margin-left:1rem!important}.me-sm-4{margin-left:1.5rem!important}.me-sm-5{margin-left:3rem!important}.me-sm-auto{margin-left:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-right:0!important}.ms-sm-1{margin-right:.25rem!important}.ms-sm-2{margin-right:.5rem!important}.ms-sm-3{margin-right:1rem!important}.ms-sm-4{margin-right:1.5rem!important}.ms-sm-5{margin-right:3rem!important}.ms-sm-auto{margin-right:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-left:0!important}.pe-sm-1{padding-left:.25rem!important}.pe-sm-2{padding-left:.5rem!important}.pe-sm-3{padding-left:1rem!important}.pe-sm-4{padding-left:1.5rem!important}.pe-sm-5{padding-left:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-right:0!important}.ps-sm-1{padding-right:.25rem!important}.ps-sm-2{padding-right:.5rem!important}.ps-sm-3{padding-right:1rem!important}.ps-sm-4{padding-right:1.5rem!important}.ps-sm-5{padding-right:3rem!important}}@media (min-width:768px){.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-left:0!important}.me-md-1{margin-left:.25rem!important}.me-md-2{margin-left:.5rem!important}.me-md-3{margin-left:1rem!important}.me-md-4{margin-left:1.5rem!important}.me-md-5{margin-left:3rem!important}.me-md-auto{margin-left:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-right:0!important}.ms-md-1{margin-right:.25rem!important}.ms-md-2{margin-right:.5rem!important}.ms-md-3{margin-right:1rem!important}.ms-md-4{margin-right:1.5rem!important}.ms-md-5{margin-right:3rem!important}.ms-md-auto{margin-right:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-left:0!important}.pe-md-1{padding-left:.25rem!important}.pe-md-2{padding-left:.5rem!important}.pe-md-3{padding-left:1rem!important}.pe-md-4{padding-left:1.5rem!important}.pe-md-5{padding-left:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-right:0!important}.ps-md-1{padding-right:.25rem!important}.ps-md-2{padding-right:.5rem!important}.ps-md-3{padding-right:1rem!important}.ps-md-4{padding-right:1.5rem!important}.ps-md-5{padding-right:3rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-left:0!important}.me-lg-1{margin-left:.25rem!important}.me-lg-2{margin-left:.5rem!important}.me-lg-3{margin-left:1rem!important}.me-lg-4{margin-left:1.5rem!important}.me-lg-5{margin-left:3rem!important}.me-lg-auto{margin-left:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-right:0!important}.ms-lg-1{margin-right:.25rem!important}.ms-lg-2{margin-right:.5rem!important}.ms-lg-3{margin-right:1rem!important}.ms-lg-4{margin-right:1.5rem!important}.ms-lg-5{margin-right:3rem!important}.ms-lg-auto{margin-right:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-left:0!important}.pe-lg-1{padding-left:.25rem!important}.pe-lg-2{padding-left:.5rem!important}.pe-lg-3{padding-left:1rem!important}.pe-lg-4{padding-left:1.5rem!important}.pe-lg-5{padding-left:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-right:0!important}.ps-lg-1{padding-right:.25rem!important}.ps-lg-2{padding-right:.5rem!important}.ps-lg-3{padding-right:1rem!important}.ps-lg-4{padding-right:1.5rem!important}.ps-lg-5{padding-right:3rem!important}}@media (min-width:1200px){.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-left:0!important}.me-xl-1{margin-left:.25rem!important}.me-xl-2{margin-left:.5rem!important}.me-xl-3{margin-left:1rem!important}.me-xl-4{margin-left:1.5rem!important}.me-xl-5{margin-left:3rem!important}.me-xl-auto{margin-left:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-right:0!important}.ms-xl-1{margin-right:.25rem!important}.ms-xl-2{margin-right:.5rem!important}.ms-xl-3{margin-right:1rem!important}.ms-xl-4{margin-right:1.5rem!important}.ms-xl-5{margin-right:3rem!important}.ms-xl-auto{margin-right:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-left:0!important}.pe-xl-1{padding-left:.25rem!important}.pe-xl-2{padding-left:.5rem!important}.pe-xl-3{padding-left:1rem!important}.pe-xl-4{padding-left:1.5rem!important}.pe-xl-5{padding-left:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-right:0!important}.ps-xl-1{padding-right:.25rem!important}.ps-xl-2{padding-right:.5rem!important}.ps-xl-3{padding-right:1rem!important}.ps-xl-4{padding-right:1.5rem!important}.ps-xl-5{padding-right:3rem!important}}@media (min-width:1400px){.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-left:0!important}.me-xxl-1{margin-left:.25rem!important}.me-xxl-2{margin-left:.5rem!important}.me-xxl-3{margin-left:1rem!important}.me-xxl-4{margin-left:1.5rem!important}.me-xxl-5{margin-left:3rem!important}.me-xxl-auto{margin-left:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-right:0!important}.ms-xxl-1{margin-right:.25rem!important}.ms-xxl-2{margin-right:.5rem!important}.ms-xxl-3{margin-right:1rem!important}.ms-xxl-4{margin-right:1.5rem!important}.ms-xxl-5{margin-right:3rem!important}.ms-xxl-auto{margin-right:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-left:0!important}.pe-xxl-1{padding-left:.25rem!important}.pe-xxl-2{padding-left:.5rem!important}.pe-xxl-3{padding-left:1rem!important}.pe-xxl-4{padding-left:1.5rem!important}.pe-xxl-5{padding-left:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-right:0!important}.ps-xxl-1{padding-right:.25rem!important}.ps-xxl-2{padding-right:.5rem!important}.ps-xxl-3{padding-right:1rem!important}.ps-xxl-4{padding-right:1.5rem!important}.ps-xxl-5{padding-right:3rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} /*# sourceMappingURL=bootstrap-grid.rtl.min.css.map */ \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map index 89689aa60..1fa11ddae 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-grid.rtl.min.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.rtl.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-right: 8.33333333%;\n}\n\n.offset-2 {\n margin-right: 16.66666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.33333333%;\n}\n\n.offset-5 {\n margin-right: 41.66666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.33333333%;\n}\n\n.offset-8 {\n margin-right: 66.66666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.33333333%;\n}\n\n.offset-11 {\n margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.33333333%;\n }\n .offset-sm-2 {\n margin-right: 16.66666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.33333333%;\n }\n .offset-sm-5 {\n margin-right: 41.66666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.33333333%;\n }\n .offset-sm-8 {\n margin-right: 66.66666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.33333333%;\n }\n .offset-sm-11 {\n margin-right: 91.66666667%;\n }\n .g-sm-0,\n.gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n.gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n.gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n.gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n.gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n.gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n.gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n.gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n.gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n.gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n.gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n.gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.33333333%;\n }\n .offset-md-2 {\n margin-right: 16.66666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.33333333%;\n }\n .offset-md-5 {\n margin-right: 41.66666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.33333333%;\n }\n .offset-md-8 {\n margin-right: 66.66666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.33333333%;\n }\n .offset-md-11 {\n margin-right: 91.66666667%;\n }\n .g-md-0,\n.gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n.gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n.gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n.gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n.gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n.gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n.gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n.gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n.gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n.gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n.gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n.gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.33333333%;\n }\n .offset-lg-2 {\n margin-right: 16.66666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.33333333%;\n }\n .offset-lg-5 {\n margin-right: 41.66666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.33333333%;\n }\n .offset-lg-8 {\n margin-right: 66.66666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.33333333%;\n }\n .offset-lg-11 {\n margin-right: 91.66666667%;\n }\n .g-lg-0,\n.gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n.gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n.gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n.gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n.gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n.gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n.gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n.gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n.gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n.gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n.gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n.gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xl-11 {\n margin-right: 91.66666667%;\n }\n .g-xl-0,\n.gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n.gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n.gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n.gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n.gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n.gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n.gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n.gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n.gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n.gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n.gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n.gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.66666667%;\n }\n .g-xxl-0,\n.gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n.gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n.gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n.gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n.gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n.gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n.gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n.gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n.gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n.gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n.gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n.gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.mx-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n}\n\n.mx-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n}\n\n.mx-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-left: 0 !important;\n}\n\n.me-1 {\n margin-left: 0.25rem !important;\n}\n\n.me-2 {\n margin-left: 0.5rem !important;\n}\n\n.me-3 {\n margin-left: 1rem !important;\n}\n\n.me-4 {\n margin-left: 1.5rem !important;\n}\n\n.me-5 {\n margin-left: 3rem !important;\n}\n\n.me-auto {\n margin-left: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-right: 0 !important;\n}\n\n.ms-1 {\n margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n margin-right: 1rem !important;\n}\n\n.ms-4 {\n margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n margin-right: 3rem !important;\n}\n\n.ms-auto {\n margin-right: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.px-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n}\n\n.px-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n}\n\n.px-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.px-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-left: 0 !important;\n}\n\n.pe-1 {\n padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n padding-left: 1rem !important;\n}\n\n.pe-4 {\n padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n padding-left: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-right: 0 !important;\n}\n\n.ps-1 {\n padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n padding-right: 1rem !important;\n}\n\n.ps-4 {\n padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-sm-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-left: 0 !important;\n }\n .me-sm-1 {\n margin-left: 0.25rem !important;\n }\n .me-sm-2 {\n margin-left: 0.5rem !important;\n }\n .me-sm-3 {\n margin-left: 1rem !important;\n }\n .me-sm-4 {\n margin-left: 1.5rem !important;\n }\n .me-sm-5 {\n margin-left: 3rem !important;\n }\n .me-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-right: 0 !important;\n }\n .ms-sm-1 {\n margin-right: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-right: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-right: 1rem !important;\n }\n .ms-sm-4 {\n margin-right: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-right: 3rem !important;\n }\n .ms-sm-auto {\n margin-right: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-sm-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-sm-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-sm-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-sm-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-sm-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-left: 0 !important;\n }\n .pe-sm-1 {\n padding-left: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-left: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-left: 1rem !important;\n }\n .pe-sm-4 {\n padding-left: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-left: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-right: 0 !important;\n }\n .ps-sm-1 {\n padding-right: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-right: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-right: 1rem !important;\n }\n .ps-sm-4 {\n padding-right: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-md-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-md-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-md-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-md-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-md-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-md-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-left: 0 !important;\n }\n .me-md-1 {\n margin-left: 0.25rem !important;\n }\n .me-md-2 {\n margin-left: 0.5rem !important;\n }\n .me-md-3 {\n margin-left: 1rem !important;\n }\n .me-md-4 {\n margin-left: 1.5rem !important;\n }\n .me-md-5 {\n margin-left: 3rem !important;\n }\n .me-md-auto {\n margin-left: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-right: 0 !important;\n }\n .ms-md-1 {\n margin-right: 0.25rem !important;\n }\n .ms-md-2 {\n margin-right: 0.5rem !important;\n }\n .ms-md-3 {\n margin-right: 1rem !important;\n }\n .ms-md-4 {\n margin-right: 1.5rem !important;\n }\n .ms-md-5 {\n margin-right: 3rem !important;\n }\n .ms-md-auto {\n margin-right: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-md-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-md-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-md-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-md-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-md-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-left: 0 !important;\n }\n .pe-md-1 {\n padding-left: 0.25rem !important;\n }\n .pe-md-2 {\n padding-left: 0.5rem !important;\n }\n .pe-md-3 {\n padding-left: 1rem !important;\n }\n .pe-md-4 {\n padding-left: 1.5rem !important;\n }\n .pe-md-5 {\n padding-left: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-right: 0 !important;\n }\n .ps-md-1 {\n padding-right: 0.25rem !important;\n }\n .ps-md-2 {\n padding-right: 0.5rem !important;\n }\n .ps-md-3 {\n padding-right: 1rem !important;\n }\n .ps-md-4 {\n padding-right: 1.5rem !important;\n }\n .ps-md-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-lg-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-left: 0 !important;\n }\n .me-lg-1 {\n margin-left: 0.25rem !important;\n }\n .me-lg-2 {\n margin-left: 0.5rem !important;\n }\n .me-lg-3 {\n margin-left: 1rem !important;\n }\n .me-lg-4 {\n margin-left: 1.5rem !important;\n }\n .me-lg-5 {\n margin-left: 3rem !important;\n }\n .me-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-right: 0 !important;\n }\n .ms-lg-1 {\n margin-right: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-right: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-right: 1rem !important;\n }\n .ms-lg-4 {\n margin-right: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-right: 3rem !important;\n }\n .ms-lg-auto {\n margin-right: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-lg-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-lg-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-lg-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-lg-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-lg-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-left: 0 !important;\n }\n .pe-lg-1 {\n padding-left: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-left: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-left: 1rem !important;\n }\n .pe-lg-4 {\n padding-left: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-left: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-right: 0 !important;\n }\n .ps-lg-1 {\n padding-right: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-right: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-right: 1rem !important;\n }\n .ps-lg-4 {\n padding-right: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-left: 0 !important;\n }\n .me-xl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xl-3 {\n margin-left: 1rem !important;\n }\n .me-xl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xl-5 {\n margin-left: 3rem !important;\n }\n .me-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-right: 0 !important;\n }\n .ms-xl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-right: 1rem !important;\n }\n .ms-xl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-right: 3rem !important;\n }\n .ms-xl-auto {\n margin-right: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-left: 0 !important;\n }\n .pe-xl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-left: 1rem !important;\n }\n .pe-xl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-left: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-right: 0 !important;\n }\n .ps-xl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-right: 1rem !important;\n }\n .ps-xl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xxl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xxl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xxl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-left: 0 !important;\n }\n .me-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-left: 1rem !important;\n }\n .me-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-left: 3rem !important;\n }\n .me-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-right: 0 !important;\n }\n .ms-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-right: 1rem !important;\n }\n .ms-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-right: 3rem !important;\n }\n .ms-xxl-auto {\n margin-right: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xxl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xxl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-left: 0 !important;\n }\n .pe-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-left: 1rem !important;\n }\n .pe-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-left: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-right: 0 !important;\n }\n .ps-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-right: 1rem !important;\n }\n .ps-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-right: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: divide(100%, $count);\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_containers.scss","dist/css/bootstrap-grid.rtl.css","../../scss/mixins/_container.scss","../../scss/mixins/_breakpoints.scss","../../scss/_grid.scss","../../scss/mixins/_grid.scss","../../scss/mixins/_utilities.scss","../../scss/utilities/_api.scss"],"names":[],"mappings":"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","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n","// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n@if $enable-container-classes {\n // Single container class with breakpoint max-widths\n .container,\n // 100% wide container at all breakpoints\n .container-fluid {\n @include make-container();\n }\n\n // Responsive containers that are 100% wide until a breakpoint\n @each $breakpoint, $container-max-width in $container-max-widths {\n .container-#{$breakpoint} {\n @extend .container-fluid;\n }\n\n @include media-breakpoint-up($breakpoint, $grid-breakpoints) {\n %responsive-container-#{$breakpoint} {\n max-width: $container-max-width;\n }\n\n // Extend each breakpoint which is smaller or equal to the current breakpoint\n $extend-breakpoint: true;\n\n @each $name, $width in $grid-breakpoints {\n @if ($extend-breakpoint) {\n .container#{breakpoint-infix($name, $grid-breakpoints)} {\n @extend %responsive-container-#{$breakpoint};\n }\n\n // Once the current breakpoint is reached, stop extending\n @if ($breakpoint == $name) {\n $extend-breakpoint: false;\n }\n }\n }\n }\n }\n}\n","/*!\n * Bootstrap Grid v5.3.2 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-left: auto;\n margin-right: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n box-sizing: border-box;\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-right: 8.33333333%;\n}\n\n.offset-2 {\n margin-right: 16.66666667%;\n}\n\n.offset-3 {\n margin-right: 25%;\n}\n\n.offset-4 {\n margin-right: 33.33333333%;\n}\n\n.offset-5 {\n margin-right: 41.66666667%;\n}\n\n.offset-6 {\n margin-right: 50%;\n}\n\n.offset-7 {\n margin-right: 58.33333333%;\n}\n\n.offset-8 {\n margin-right: 66.66666667%;\n}\n\n.offset-9 {\n margin-right: 75%;\n}\n\n.offset-10 {\n margin-right: 83.33333333%;\n}\n\n.offset-11 {\n margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-right: 0;\n }\n .offset-sm-1 {\n margin-right: 8.33333333%;\n }\n .offset-sm-2 {\n margin-right: 16.66666667%;\n }\n .offset-sm-3 {\n margin-right: 25%;\n }\n .offset-sm-4 {\n margin-right: 33.33333333%;\n }\n .offset-sm-5 {\n margin-right: 41.66666667%;\n }\n .offset-sm-6 {\n margin-right: 50%;\n }\n .offset-sm-7 {\n margin-right: 58.33333333%;\n }\n .offset-sm-8 {\n margin-right: 66.66666667%;\n }\n .offset-sm-9 {\n margin-right: 75%;\n }\n .offset-sm-10 {\n margin-right: 83.33333333%;\n }\n .offset-sm-11 {\n margin-right: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-right: 0;\n }\n .offset-md-1 {\n margin-right: 8.33333333%;\n }\n .offset-md-2 {\n margin-right: 16.66666667%;\n }\n .offset-md-3 {\n margin-right: 25%;\n }\n .offset-md-4 {\n margin-right: 33.33333333%;\n }\n .offset-md-5 {\n margin-right: 41.66666667%;\n }\n .offset-md-6 {\n margin-right: 50%;\n }\n .offset-md-7 {\n margin-right: 58.33333333%;\n }\n .offset-md-8 {\n margin-right: 66.66666667%;\n }\n .offset-md-9 {\n margin-right: 75%;\n }\n .offset-md-10 {\n margin-right: 83.33333333%;\n }\n .offset-md-11 {\n margin-right: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-right: 0;\n }\n .offset-lg-1 {\n margin-right: 8.33333333%;\n }\n .offset-lg-2 {\n margin-right: 16.66666667%;\n }\n .offset-lg-3 {\n margin-right: 25%;\n }\n .offset-lg-4 {\n margin-right: 33.33333333%;\n }\n .offset-lg-5 {\n margin-right: 41.66666667%;\n }\n .offset-lg-6 {\n margin-right: 50%;\n }\n .offset-lg-7 {\n margin-right: 58.33333333%;\n }\n .offset-lg-8 {\n margin-right: 66.66666667%;\n }\n .offset-lg-9 {\n margin-right: 75%;\n }\n .offset-lg-10 {\n margin-right: 83.33333333%;\n }\n .offset-lg-11 {\n margin-right: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-right: 0;\n }\n .offset-xl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xl-3 {\n margin-right: 25%;\n }\n .offset-xl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xl-6 {\n margin-right: 50%;\n }\n .offset-xl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xl-9 {\n margin-right: 75%;\n }\n .offset-xl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xl-11 {\n margin-right: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-right: 0;\n }\n .offset-xxl-1 {\n margin-right: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-right: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-right: 25%;\n }\n .offset-xxl-4 {\n margin-right: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-right: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-right: 50%;\n }\n .offset-xxl-7 {\n margin-right: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-right: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-right: 75%;\n }\n .offset-xxl-10 {\n margin-right: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-right: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n}\n\n.mx-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n}\n\n.mx-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n}\n\n.mx-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-left: 0 !important;\n}\n\n.me-1 {\n margin-left: 0.25rem !important;\n}\n\n.me-2 {\n margin-left: 0.5rem !important;\n}\n\n.me-3 {\n margin-left: 1rem !important;\n}\n\n.me-4 {\n margin-left: 1.5rem !important;\n}\n\n.me-5 {\n margin-left: 3rem !important;\n}\n\n.me-auto {\n margin-left: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-right: 0 !important;\n}\n\n.ms-1 {\n margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n margin-right: 1rem !important;\n}\n\n.ms-4 {\n margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n margin-right: 3rem !important;\n}\n\n.ms-auto {\n margin-right: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n}\n\n.px-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n}\n\n.px-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n}\n\n.px-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n}\n\n.px-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n}\n\n.px-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-left: 0 !important;\n}\n\n.pe-1 {\n padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n padding-left: 1rem !important;\n}\n\n.pe-4 {\n padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n padding-left: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-right: 0 !important;\n}\n\n.ps-1 {\n padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n padding-right: 1rem !important;\n}\n\n.ps-4 {\n padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-sm-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-sm-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-sm-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-left: 0 !important;\n }\n .me-sm-1 {\n margin-left: 0.25rem !important;\n }\n .me-sm-2 {\n margin-left: 0.5rem !important;\n }\n .me-sm-3 {\n margin-left: 1rem !important;\n }\n .me-sm-4 {\n margin-left: 1.5rem !important;\n }\n .me-sm-5 {\n margin-left: 3rem !important;\n }\n .me-sm-auto {\n margin-left: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-right: 0 !important;\n }\n .ms-sm-1 {\n margin-right: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-right: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-right: 1rem !important;\n }\n .ms-sm-4 {\n margin-right: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-right: 3rem !important;\n }\n .ms-sm-auto {\n margin-right: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-sm-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-sm-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-sm-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-sm-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-sm-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-left: 0 !important;\n }\n .pe-sm-1 {\n padding-left: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-left: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-left: 1rem !important;\n }\n .pe-sm-4 {\n padding-left: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-left: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-right: 0 !important;\n }\n .ps-sm-1 {\n padding-right: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-right: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-right: 1rem !important;\n }\n .ps-sm-4 {\n padding-right: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 768px) {\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-md-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-md-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-md-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-md-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-md-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-md-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-left: 0 !important;\n }\n .me-md-1 {\n margin-left: 0.25rem !important;\n }\n .me-md-2 {\n margin-left: 0.5rem !important;\n }\n .me-md-3 {\n margin-left: 1rem !important;\n }\n .me-md-4 {\n margin-left: 1.5rem !important;\n }\n .me-md-5 {\n margin-left: 3rem !important;\n }\n .me-md-auto {\n margin-left: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-right: 0 !important;\n }\n .ms-md-1 {\n margin-right: 0.25rem !important;\n }\n .ms-md-2 {\n margin-right: 0.5rem !important;\n }\n .ms-md-3 {\n margin-right: 1rem !important;\n }\n .ms-md-4 {\n margin-right: 1.5rem !important;\n }\n .ms-md-5 {\n margin-right: 3rem !important;\n }\n .ms-md-auto {\n margin-right: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-md-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-md-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-md-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-md-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-md-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-left: 0 !important;\n }\n .pe-md-1 {\n padding-left: 0.25rem !important;\n }\n .pe-md-2 {\n padding-left: 0.5rem !important;\n }\n .pe-md-3 {\n padding-left: 1rem !important;\n }\n .pe-md-4 {\n padding-left: 1.5rem !important;\n }\n .pe-md-5 {\n padding-left: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-right: 0 !important;\n }\n .ps-md-1 {\n padding-right: 0.25rem !important;\n }\n .ps-md-2 {\n padding-right: 0.5rem !important;\n }\n .ps-md-3 {\n padding-right: 1rem !important;\n }\n .ps-md-4 {\n padding-right: 1.5rem !important;\n }\n .ps-md-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 992px) {\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-lg-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-lg-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-lg-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-left: 0 !important;\n }\n .me-lg-1 {\n margin-left: 0.25rem !important;\n }\n .me-lg-2 {\n margin-left: 0.5rem !important;\n }\n .me-lg-3 {\n margin-left: 1rem !important;\n }\n .me-lg-4 {\n margin-left: 1.5rem !important;\n }\n .me-lg-5 {\n margin-left: 3rem !important;\n }\n .me-lg-auto {\n margin-left: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-right: 0 !important;\n }\n .ms-lg-1 {\n margin-right: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-right: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-right: 1rem !important;\n }\n .ms-lg-4 {\n margin-right: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-right: 3rem !important;\n }\n .ms-lg-auto {\n margin-right: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-lg-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-lg-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-lg-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-lg-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-lg-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-left: 0 !important;\n }\n .pe-lg-1 {\n padding-left: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-left: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-left: 1rem !important;\n }\n .pe-lg-4 {\n padding-left: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-left: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-right: 0 !important;\n }\n .ps-lg-1 {\n padding-right: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-right: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-right: 1rem !important;\n }\n .ps-lg-4 {\n padding-right: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1200px) {\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-left: 0 !important;\n }\n .me-xl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xl-3 {\n margin-left: 1rem !important;\n }\n .me-xl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xl-5 {\n margin-left: 3rem !important;\n }\n .me-xl-auto {\n margin-left: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-right: 0 !important;\n }\n .ms-xl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-right: 1rem !important;\n }\n .ms-xl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-right: 3rem !important;\n }\n .ms-xl-auto {\n margin-right: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-left: 0 !important;\n }\n .pe-xl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-left: 1rem !important;\n }\n .pe-xl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-left: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-right: 0 !important;\n }\n .ps-xl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-right: 1rem !important;\n }\n .ps-xl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-right: 3rem !important;\n }\n}\n@media (min-width: 1400px) {\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-left: 0 !important;\n margin-right: 0 !important;\n }\n .mx-xxl-1 {\n margin-left: 0.25rem !important;\n margin-right: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-left: 0.5rem !important;\n margin-right: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-left: 1rem !important;\n margin-right: 1rem !important;\n }\n .mx-xxl-4 {\n margin-left: 1.5rem !important;\n margin-right: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-left: 3rem !important;\n margin-right: 3rem !important;\n }\n .mx-xxl-auto {\n margin-left: auto !important;\n margin-right: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-left: 0 !important;\n }\n .me-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-left: 1rem !important;\n }\n .me-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-left: 3rem !important;\n }\n .me-xxl-auto {\n margin-left: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-right: 0 !important;\n }\n .ms-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-right: 1rem !important;\n }\n .ms-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-right: 3rem !important;\n }\n .ms-xxl-auto {\n margin-right: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-left: 0 !important;\n padding-right: 0 !important;\n }\n .px-xxl-1 {\n padding-left: 0.25rem !important;\n padding-right: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-left: 0.5rem !important;\n padding-right: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-left: 1rem !important;\n padding-right: 1rem !important;\n }\n .px-xxl-4 {\n padding-left: 1.5rem !important;\n padding-right: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-left: 3rem !important;\n padding-right: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-left: 0 !important;\n }\n .pe-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-left: 1rem !important;\n }\n .pe-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-left: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-right: 0 !important;\n }\n .ps-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-right: 1rem !important;\n }\n .ps-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-right: 3rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */","// Container mixins\n\n@mixin make-container($gutter: $container-padding-x) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-right: auto;\n margin-left: auto;\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n","// Row\n//\n// Rows contain your columns.\n\n:root {\n @each $name, $value in $grid-breakpoints {\n --#{$prefix}breakpoint-#{$name}: #{$value};\n }\n}\n\n@if $enable-grid-classes {\n .row {\n @include make-row();\n\n > * {\n @include make-col-ready();\n }\n }\n}\n\n@if $enable-cssgrid {\n .grid {\n display: grid;\n grid-template-rows: repeat(var(--#{$prefix}rows, 1), 1fr);\n grid-template-columns: repeat(var(--#{$prefix}columns, #{$grid-columns}), 1fr);\n gap: var(--#{$prefix}gap, #{$grid-gutter-width});\n\n @include make-cssgrid();\n }\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n@if $enable-grid-classes {\n @include make-grid-columns();\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is and invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","// Utility generator\n// Used to generate utilities & print utilities\n@mixin generate-utility($utility, $infix: \"\", $is-rfs-media-query: false) {\n $values: map-get($utility, values);\n\n // If the values are a list or string, convert it into a map\n @if type-of($values) == \"string\" or type-of(nth($values, 1)) != \"list\" {\n $values: zip($values, $values);\n }\n\n @each $key, $value in $values {\n $properties: map-get($utility, property);\n\n // Multiple properties are possible, for example with vertical or horizontal margins or paddings\n @if type-of($properties) == \"string\" {\n $properties: append((), $properties);\n }\n\n // Use custom class if present\n $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));\n $property-class: if($property-class == null, \"\", $property-class);\n\n // Use custom CSS variable name if present, otherwise default to `class`\n $css-variable-name: if(map-has-key($utility, css-variable-name), map-get($utility, css-variable-name), map-get($utility, class));\n\n // State params to generate pseudo-classes\n $state: if(map-has-key($utility, state), map-get($utility, state), ());\n\n $infix: if($property-class == \"\" and str-slice($infix, 1, 1) == \"-\", str-slice($infix, 2), $infix);\n\n // Don't prefix if value key is null (e.g. with shadow class)\n $property-class-modifier: if($key, if($property-class == \"\" and $infix == \"\", \"\", \"-\") + $key, \"\");\n\n @if map-get($utility, rfs) {\n // Inside the media query\n @if $is-rfs-media-query {\n $val: rfs-value($value);\n\n // Do not render anything if fluid and non fluid values are the same\n $value: if($val == rfs-fluid-value($value), null, $val);\n }\n @else {\n $value: rfs-fluid-value($value);\n }\n }\n\n $is-css-var: map-get($utility, css-var);\n $is-local-vars: map-get($utility, local-vars);\n $is-rtl: map-get($utility, rtl);\n\n @if $value != null {\n @if $is-rtl == false {\n /* rtl:begin:remove */\n }\n\n @if $is-css-var {\n .#{$property-class + $infix + $property-class-modifier} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n --#{$prefix}#{$css-variable-name}: #{$value};\n }\n }\n } @else {\n .#{$property-class + $infix + $property-class-modifier} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n\n @each $pseudo in $state {\n .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {\n @each $property in $properties {\n @if $is-local-vars {\n @each $local-var, $variable in $is-local-vars {\n --#{$prefix}#{$local-var}: #{$variable};\n }\n }\n #{$property}: $value if($enable-important-utilities, !important, null);\n }\n }\n }\n }\n\n @if $is-rtl == false {\n /* rtl:end:remove */\n }\n }\n }\n}\n","// Loop over each breakpoint\n@each $breakpoint in map-keys($grid-breakpoints) {\n\n // Generate media query if needed\n @include media-breakpoint-up($breakpoint) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix);\n }\n }\n }\n}\n\n// RFS rescaling\n@media (min-width: $rfs-mq-value) {\n @each $breakpoint in map-keys($grid-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $grid-breakpoints);\n\n @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {\n // Loop over each utility property\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Only proceed if responsive media queries are enabled or if it's the base media query\n @if type-of($utility) == \"map\" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == \"\") {\n @include generate-utility($utility, $infix, true);\n }\n }\n }\n }\n}\n\n\n// Print utilities\n@media print {\n @each $key, $utility in $utilities {\n // The utility can be disabled with `false`, thus check if the utility is a map first\n // Then check if the utility needs print styles\n @if type-of($utility) == \"map\" and map-get($utility, print) == true {\n @include generate-utility($utility, \"-print\");\n }\n }\n}\n"]} \ No newline at end of file diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css b/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css index ccf962863..47a70f01e 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css @@ -1,10 +1,10 @@ /*! - * Bootstrap Reboot v5.2.3 (https://getbootstrap.com/) - * Copyright 2011-2022 The Bootstrap Authors - * Copyright 2011-2022 Twitter, Inc. + * Bootstrap Reboot v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ -:root { +:root, +[data-bs-theme=light] { --bs-blue: #0d6efd; --bs-indigo: #6610f2; --bs-purple: #6f42c1; @@ -44,10 +44,32 @@ --bs-danger-rgb: 220, 53, 69; --bs-light-rgb: 248, 249, 250; --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: #052c65; + --bs-secondary-text-emphasis: #2b2f32; + --bs-success-text-emphasis: #0a3622; + --bs-info-text-emphasis: #055160; + --bs-warning-text-emphasis: #664d03; + --bs-danger-text-emphasis: #58151c; + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: #cfe2ff; + --bs-secondary-bg-subtle: #e2e3e5; + --bs-success-bg-subtle: #d1e7dd; + --bs-info-bg-subtle: #cff4fc; + --bs-warning-bg-subtle: #fff3cd; + --bs-danger-bg-subtle: #f8d7da; + --bs-light-bg-subtle: #fcfcfd; + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: #9ec5fe; + --bs-secondary-border-subtle: #c4c8cb; + --bs-success-border-subtle: #a3cfbb; + --bs-info-border-subtle: #9eeaf9; + --bs-warning-border-subtle: #ffe69c; + --bs-danger-border-subtle: #f1aeb5; + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; --bs-white-rgb: 255, 255, 255; --bs-black-rgb: 0, 0, 0; - --bs-body-color-rgb: 33, 37, 41; - --bs-body-bg-rgb: 255, 255, 255; --bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); @@ -56,7 +78,28 @@ --bs-body-font-weight: 400; --bs-body-line-height: 1.5; --bs-body-color: #212529; + --bs-body-color-rgb: 33, 37, 41; --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(33, 37, 41, 0.75); + --bs-secondary-color-rgb: 33, 37, 41; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(33, 37, 41, 0.5); + --bs-tertiary-color-rgb: 33, 37, 41; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: #0a58ca; + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-color: #212529; + --bs-highlight-bg: #fff3cd; --bs-border-width: 1px; --bs-border-style: solid; --bs-border-color: #dee2e6; @@ -65,12 +108,76 @@ --bs-border-radius-sm: 0.25rem; --bs-border-radius-lg: 0.5rem; --bs-border-radius-xl: 1rem; - --bs-border-radius-2xl: 2rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); --bs-border-radius-pill: 50rem; - --bs-link-color: #0d6efd; - --bs-link-hover-color: #0a58ca; - --bs-code-color: #d63384; - --bs-highlight-bg: #fff3cd; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} + +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: #2b3035; + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: #6ea8fe; + --bs-secondary-text-emphasis: #a7acb1; + --bs-success-text-emphasis: #75b798; + --bs-info-text-emphasis: #6edff6; + --bs-warning-text-emphasis: #ffda6a; + --bs-danger-text-emphasis: #ea868f; + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: #031633; + --bs-secondary-bg-subtle: #161719; + --bs-success-bg-subtle: #051b11; + --bs-info-bg-subtle: #032830; + --bs-warning-bg-subtle: #332701; + --bs-danger-bg-subtle: #2c0b0e; + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: #084298; + --bs-secondary-border-subtle: #41464b; + --bs-success-border-subtle: #0f5132; + --bs-info-border-subtle: #087990; + --bs-warning-border-subtle: #997404; + --bs-danger-border-subtle: #842029; + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: #6ea8fe; + --bs-link-hover-color: #8bb9fe; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: #e685b5; + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: #664d03; + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: #75b798; + --bs-form-valid-border-color: #75b798; + --bs-form-invalid-color: #ea868f; + --bs-form-invalid-border-color: #ea868f; } *, @@ -102,7 +209,7 @@ hr { margin: 1rem 0; color: inherit; border: 0; - border-top: 1px solid; + border-top: var(--bs-border-width) solid; opacity: 0.25; } @@ -111,6 +218,7 @@ h6, h5, h4, h3, h2, h1 { margin-bottom: 0.5rem; font-weight: 500; line-height: 1.2; + color: var(--bs-heading-color); } h1 { @@ -219,6 +327,7 @@ small { mark { padding: 0.1875em; + color: var(--bs-highlight-color); background-color: var(--bs-highlight-bg); } @@ -239,11 +348,11 @@ sup { } a { - color: var(--bs-link-color); + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); text-decoration: underline; } a:hover { - color: var(--bs-link-hover-color); + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); } a:not([href]):not([class]), a:not([href]):not([class]):hover { @@ -310,7 +419,7 @@ table { caption { padding-top: 0.5rem; padding-bottom: 0.5rem; - color: #6c757d; + color: var(--bs-secondary-color); text-align: left; } @@ -434,8 +543,8 @@ legend + * { } [type=search] { - outline-offset: -2px; -webkit-appearance: textfield; + outline-offset: -2px; } /* rtl:raw: diff --git a/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css.map b/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css.map index d52609ea3..8a9aab3bb 100644 --- a/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css.map +++ b/app/vendor/twbs/bootstrap/dist/css/bootstrap-reboot.css.map @@ -1 +1 @@ -{"version":3,"sources":["../../scss/mixins/_banner.scss","../../scss/_root.scss","../../scss/vendor/_rfs.scss","bootstrap-reboot.css","../../scss/_reboot.scss","../../scss/_variables.scss","../../scss/mixins/_border-radius.scss"],"names":[],"mappings":"AACE;;;;;EAAA;ACDF;EAQI,kBAAA;EAAA,oBAAA;EAAA,oBAAA;EAAA,kBAAA;EAAA,iBAAA;EAAA,oBAAA;EAAA,oBAAA;EAAA,mBAAA;EAAA,kBAAA;EAAA,kBAAA;EAAA,gBAAA;EAAA,gBAAA;EAAA,kBAAA;EAAA,uBAAA;EAIA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAAA,sBAAA;EAIA,qBAAA;EAAA,uBAAA;EAAA,qBAAA;EAAA,kBAAA;EAAA,qBAAA;EAAA,oBAAA;EAAA,mBAAA;EAAA,kBAAA;EAIA,8BAAA;EAAA,iCAAA;EAAA,6BAAA;EAAA,2BAAA;EAAA,6BAAA;EAAA,4BAAA;EAAA,6BAAA;EAAA,yBAAA;EAGF,6BAAA;EACA,uBAAA;EACA,+BAAA;EACA,+BAAA;EAMA,qNAAA;EACA,yGAAA;EACA,yFAAA;EAOA,gDAAA;EC4PI,yBALI;EDrPR,0BAAA;EACA,0BAAA;EACA,wBAAA;EAIA,kBAAA;EAIA,sBAAA;EACA,wBAAA;EACA,0BAAA;EACA,mDAAA;EAEA,4BAAA;EACA,8BAAA;EACA,6BAAA;EACA,2BAAA;EACA,4BAAA;EACA,8BAAA;EAGA,wBAAA;EACA,8BAAA;EAEA,wBAAA;EAEA,0BAAA;AEEF;;AC1DA;;;EAGE,sBAAA;AD6DF;;AC9CI;EANJ;IAOM,uBAAA;EDkDJ;AACF;;ACrCA;EACE,SAAA;EACA,uCAAA;EFmPI,mCALI;EE5OR,uCAAA;EACA,uCAAA;EACA,2BAAA;EACA,qCAAA;EACA,mCAAA;EACA,8BAAA;EACA,6CAAA;ADwCF;;AC/BA;EACE,cAAA;EACA,cCijB4B;EDhjB5B,SAAA;EACA,qBAAA;EACA,aCujB4B;AFrhB9B;;ACxBA;EACE,aAAA;EACA,qBCwf4B;EDrf5B,gBCwf4B;EDvf5B,gBCwf4B;AF/d9B;;ACrBA;EF6MQ,iCAAA;ACpLR;ADkBI;EE3CJ;IFoNQ,iBAAA;ECvLN;AACF;;ACzBA;EFwMQ,iCAAA;AC3KR;ADSI;EEtCJ;IF+MQ,eAAA;EC9KN;AACF;;AC7BA;EFmMQ,+BAAA;AClKR;ADAI;EEjCJ;IF0MQ,kBAAA;ECrKN;AACF;;ACjCA;EF8LQ,iCAAA;ACzJR;ADTI;EE5BJ;IFqMQ,iBAAA;EC5JN;AACF;;ACrCA;EFqLM,kBALI;ACvIV;;ACpCA;EFgLM,eALI;ACnIV;;AC7BA;EACE,aAAA;EACA,mBCmS0B;AFnQ5B;;ACtBA;EACE,yCAAA;EAAA,iCAAA;EACA,YAAA;EACA,sCAAA;EAAA,8BAAA;ADyBF;;ACnBA;EACE,mBAAA;EACA,kBAAA;EACA,oBAAA;ADsBF;;AChBA;;EAEE,kBAAA;ADmBF;;AChBA;;;EAGE,aAAA;EACA,mBAAA;ADmBF;;AChBA;;;;EAIE,gBAAA;ADmBF;;AChBA;EACE,gBC6X4B;AF1W9B;;ACdA;EACE,qBAAA;EACA,cAAA;ADiBF;;ACXA;EACE,gBAAA;ADcF;;ACNA;;EAEE,mBCsW4B;AF7V9B;;ACDA;EFmFM,kBALI;ACzEV;;ACEA;EACE,iBC+a4B;ED9a5B,wCAAA;ADCF;;ACQA;;EAEE,kBAAA;EF+DI,iBALI;EExDR,cAAA;EACA,wBAAA;ADLF;;ACQA;EAAM,eAAA;ADJN;;ACKA;EAAM,WAAA;ADDN;;ACMA;EACE,2BAAA;EACA,0BCqKwC;AFxK1C;ACKE;EACE,iCAAA;ADHJ;;ACcE;EAEE,cAAA;EACA,qBAAA;ADZJ;;ACmBA;;;;EAIE,qCCkR4B;EH7PxB,cALI;AC/BV;;ACuBA;EACE,cAAA;EACA,aAAA;EACA,mBAAA;EACA,cAAA;EFSI,kBALI;ACvBV;ACwBE;EFII,kBALI;EEGN,cAAA;EACA,kBAAA;ADtBJ;;AC0BA;EFHM,kBALI;EEUR,2BAAA;EACA,qBAAA;ADvBF;AC0BE;EACE,cAAA;ADxBJ;;AC4BA;EACE,2BAAA;EFfI,kBALI;EEsBR,wBCuyCkC;EDtyClC,sCCuyCkC;EC3kDhC,sBAAA;AH4QJ;AC2BE;EACE,UAAA;EFtBE,cALI;ACGV;;ACmCA;EACE,gBAAA;ADhCF;;ACsCA;;EAEE,sBAAA;ADnCF;;AC2CA;EACE,oBAAA;EACA,yBAAA;ADxCF;;AC2CA;EACE,mBCsT4B;EDrT5B,sBCqT4B;EDpT5B,cCjVS;EDkVT,gBAAA;ADxCF;;AC+CA;EAEE,mBAAA;EACA,gCAAA;AD7CF;;ACgDA;;;;;;EAME,qBAAA;EACA,mBAAA;EACA,eAAA;AD7CF;;ACqDA;EACE,qBAAA;ADlDF;;ACwDA;EAEE,gBAAA;ADtDF;;AC8DA;EACE,UAAA;AD3DF;;ACgEA;;;;;EAKE,SAAA;EACA,oBAAA;EFrHI,kBALI;EE4HR,oBAAA;AD7DF;;ACiEA;;EAEE,oBAAA;AD9DF;;ACmEA;EACE,eAAA;ADhEF;;ACmEA;EAGE,iBAAA;ADlEF;ACqEE;EACE,UAAA;ADnEJ;;AC0EA;EACE,wBAAA;ADvEF;;AC+EA;;;;EAIE,0BAAA;AD5EF;AC+EI;;;;EACE,eAAA;AD1EN;;ACiFA;EACE,UAAA;EACA,kBAAA;AD9EF;;ACmFA;EACE,gBAAA;ADhFF;;AC0FA;EACE,YAAA;EACA,UAAA;EACA,SAAA;EACA,SAAA;ADvFF;;AC+FA;EACE,WAAA;EACA,WAAA;EACA,UAAA;EACA,qBC8I4B;EHxVtB,iCAAA;EE6MN,oBAAA;AD7FF;ADlRI;EEwWJ;IF/LQ,iBAAA;EC6GN;AACF;AC0FE;EACE,WAAA;ADxFJ;;AC+FA;;;;;;;EAOE,UAAA;AD5FF;;AC+FA;EACE,YAAA;AD5FF;;ACqGA;EACE,oBAAA;EACA,6BAAA;ADlGF;;AC0GA;;;;;;;CAAA;AAWA;EACE,wBAAA;AD1GF;;AC+GA;EACE,UAAA;AD5GF;;ACmHA;EACE,aAAA;EACA,0BAAA;ADhHF;;AC8GA;EACE,aAAA;EACA,0BAAA;ADhHF;;ACqHA;EACE,qBAAA;ADlHF;;ACuHA;EACE,SAAA;ADpHF;;AC2HA;EACE,kBAAA;EACA,eAAA;ADxHF;;ACgIA;EACE,wBAAA;AD7HF;;ACqIA;EACE,wBAAA;ADlIF","file":"bootstrap-reboot.css","sourcesContent":["@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n\n",":root {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{$font-family-base};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n --#{$prefix}body-color: #{$body-color};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n --#{$prefix}body-bg: #{$body-bg};\n // scss-docs-end root-body-variables\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-2xl: #{$border-radius-2xl};\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-hover-color: #{$link-hover-color};\n\n --#{$prefix}code-color: #{$code-color};\n\n --#{$prefix}highlight-bg: #{$mark-bg};\n}\n","// stylelint-disable property-blacklist, scss/dollar-variable-default\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + ' ' + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n }\n @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + ' ' + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: '';\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + ' 0';\n }\n\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + ' ' + $value;\n }\n\n @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + ' ' + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluidVal: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluidVal {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule {\n #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","/*!\n * Bootstrap Reboot v5.2.3 (https://getbootstrap.com/)\n * Copyright 2011-2022 The Bootstrap Authors\n * Copyright 2011-2022 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-bg: #fff;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-2xl: 2rem;\n --bs-border-radius-pill: 50rem;\n --bs-link-color: #0d6efd;\n --bs-link-hover-color: #0a58ca;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: 1px solid;\n opacity: 0.25;\n}\n\nh6, h5, h4, h3, h2, h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n}\n\nh1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1 {\n font-size: 2.5rem;\n }\n}\n\nh2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2 {\n font-size: 2rem;\n }\n}\n\nh3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3 {\n font-size: 1.75rem;\n }\n}\n\nh4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4 {\n font-size: 1.5rem;\n }\n}\n\nh5 {\n font-size: 1.25rem;\n}\n\nh6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n text-decoration: underline dotted;\n cursor: help;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 0.875em;\n}\n\nmark {\n padding: 0.1875em;\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: var(--bs-link-color);\n text-decoration: underline;\n}\na:hover {\n color: var(--bs-link-hover-color);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: #6c757d;\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */\n","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

    `-`

    ` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: $headings-color;\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

    `s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: var(--#{$prefix}link-color);\n text-decoration: $link-decoration;\n\n &:hover {\n color: var(--#{$prefix}link-hover-color);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`', + '

    ', - '
    ', + '
    ', '
    ', '
    ', '
    ', - '
    ', - ' ', + '
    ', + ' ', '
    ', - '
    ', + '
    ', '
    content
    ', '
    ', '
    ', '
    ', - '
    ', - ' ', + '
    ', + ' ', '
    ', - '
    ', + '
    ', '
    content
    ', '
    ', '
    ', @@ -338,12 +338,12 @@ describe('Collapse', () => { fixtureEl.innerHTML = [ '
    ', '
    ', - '

    ', + '

    ', ' ', '

    ', - '
    ', + '
    ', '
    ', ' {{< /example >}} -This example uses [background]({{< docsref "/utilities/background" >}}) (`bg-light`) and [spacing]({{< docsref "/utilities/spacing" >}}) (`me-auto`, `mb-2`, `mb-lg-0`, `me-2`) utility classes. +This example uses [background]({{< docsref "/utilities/background" >}}) (`bg-body-tertiary`) and [spacing]({{< docsref "/utilities/spacing" >}}) (`me-auto`, `mb-2`, `mb-lg-0`, `me-2`) utility classes. ### Brand @@ -87,14 +87,14 @@ Add your text within an element with the `.navbar-brand` class. {{< example >}} -
    @@ -140,7 +140,7 @@

    Album example

    - 9 mins + 9 mins
    @@ -156,7 +156,7 @@

    Album example

    - 9 mins + 9 mins
    @@ -171,7 +171,7 @@

    Album example

    - 9 mins + 9 mins
    @@ -186,7 +186,7 @@

    Album example

    - 9 mins + 9 mins @@ -197,7 +197,7 @@

    Album example

    -
    +

    Back to top diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css new file mode 100644 index 000000000..b6ce0f5b8 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/badges.css @@ -0,0 +1,3 @@ +.badge > a { + color: inherit; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html new file mode 100644 index 000000000..ad9dfbce1 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/badges/index.html @@ -0,0 +1,149 @@ +--- +layout: examples +title: Badges +extra_css: + - "badges.css" +body_class: "" +--- + + + + + + + +

    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + Primary + Secondary + Success + Danger + Warning + Info + Light + Dark +
    + +
    + +
    + + Primary + + + Secondary + + + Success + + + Danger + + + Warning + + + Info + + + Light + + + Dark + +
    + +
    + +
    + + Primary + + + + Primary + + + + Primary + + +
    + +
    + +
    + + + Primary + + + + + + Secondary + + + + + + Success + + + + + + Danger + + + + + + Warning + + + + + + Info + + + + + + Light + + + + + + Dark + + + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html similarity index 76% rename from app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog-rtl/index.html rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html index 05af925eb..97d991302 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog-rtl/index.html +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog-rtl/index.html @@ -5,17 +5,29 @@ extra_css: - "https://fonts.googleapis.com/css?family=Amiri:wght@400;700&display=swap" - "../blog/blog.rtl.css" -include_js: false --- + + + + + + + + + + + + +
    -
    +
    -
    -
    -
    +
    +

    عنوان تدوينة مميزة أطول

    عدة أسطر نصية متعددة تعبر عن التدوية، وذلك لإعلام القراء الجدد بسرعة وكفاءة حول أكثر الأشياء إثارة للاهتمام في محتويات هذه التدوينة.

    -

    أكمل القراءة...

    +

    أكمل القراءة...

    @@ -57,11 +69,14 @@

    عنوان تدوينة مميزة أطول

    - العالم + العالم

    مشاركة مميزة

    -
    نوفمبر 12
    +
    نوفمبر 12

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.

    - أكمل القراءة + + أكمل القراءة + +
    {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="صورة مصغرة" >}} @@ -71,11 +86,14 @@

    مشاركة مميزة

    - التصميم + التصميم

    عنوان الوظيفة

    -
    نوفمبر 11
    +
    نوفمبر 11

    هذه بطاقة أوسع مع نص داعم أدناه كمقدمة طبيعية لمحتوى إضافي.

    - أكمل القراءة + + أكمل القراءة + +
    {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="صورة مصغرة" >}} @@ -84,20 +102,20 @@

    عنوان الوظيفة

    -
    +

    من Firehose

    -

    مثال على تدوينة

    +

    تعرض مشاركة المدونة هذه بضعة أنواع مختلفة من المحتوى الذي يتم دعمه وتصميمه باستخدام Bootstrap. النصوص الأساسية، الصور، والأكواد مدعومة بشكل كامل.


    يشكِّل تأمين الغذاء في المستقبل قضية تؤرِّق حكومات العالَم والعلماء على حدٍّ سواء. فخلال القرن العشرين ازداد عدد سكان الأرض أربعة أضعاف، وتشير التقديرات إلى أن العدد سوف يصل إلى عشرة مليارات إنسان بحلول عام 2050م. وسوف تمثل هذه الزيادة الهائلة تحدياً كبيراً وضغطاً متصاعداً على قدرة الإنتاج الزراعي. الأمر الذي كان ولا بد من أن يدفع إلى تطوير تقنيات مبتكرة في تصنيع الغذاء غير الزراعة، منها تقنية مستقبلية تقوم على تصنيع الغذاء من الهواء.

    -
    +

    تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه، كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية

    تشغل الزراعة مساحات كبيرة من اليابسة، وتستهلك كميات هائلة من المياه. كما أن إنتاج الغذاء بواسطة الزراعة يسهم بنسبة عالية من انبعاثات غازات الاحتباس الحراري العالمية، وللمقارنة فإن هذه النسبة من الانبعاثات هي أكبر مما ينتجه قطاع النقل بكل ما فيه من سيارات وشاحنات وطائرات وقطارات.

    @@ -126,7 +144,7 @@

    عنوان فرعي

    -

    تدوينة أخرى

    +

    في الوقت الحالي، تدرس عدَّة شركات هذه الميكروبات بشكل أعمق، وتستزرعها من أجل الحصول على الغذاء. ففي عام 2019م، أعلن باحثون في شركة (Air Protein) الأمريكية نجاحهم في تحويل ثاني أكسيد الكربون الموجود في الهواء إلى لحوم صناعية مصنوعة من البروتين، التي لا تتطلَّب أي أرض زراعية، بل هي معتمدة بشكل أساسي على الهواء.

    @@ -138,7 +156,7 @@

    تدوينة أخرى

    -

    ميزة جديدة

    +

    كما أن الشركة الفنلندية (Solar Foods) طوَّرت تقنية لإنتاج البروتين من الهواء، حيث تبدأ العملية بتقسيم الماء إلى مكوناته الهيدروجين والأكسجين عن طريق الكهرباء. فالهيدروجين يوفِّر الطاقة للبكتريا لتحويل ثاني أكسيد الكربون والنيتروجين الموجودين في الهواء إلى مادة عضوية غنية بالبروتين بشكل أكفأ من نمو النباتات باستخدام البناء الضوئي. وهذا البروتين يشبه دقيق القمح وقد أطلق عليه اسم "سولين" (Solein).

    @@ -154,18 +172,51 @@

    ميزة جديدة

    -
    +

    حول

    أقبلت، فأقبلت معك الحياة بجميع صنوفها وألوانها: فالنبات ينبت، والأشجار تورق وتزهر، والهرة تموء، والقمري يسجع، والغنم يثغو، والبقر يخور، وكل أليف يدعو أليفه. كل شيء يشعر بالحياة وينسي هموم الحياة، ولا يذكر إلا سعادة الحياة، فإن كان الزمان جسدا فأنت روحه، وإن كان عمرا فأنت شبابه.

    + +

    الأرشيف

      @@ -198,9 +249,9 @@

      في مكان آخر

    -
    + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css similarity index 59% rename from app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css index cc5fc7473..ddbca5a8f 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.css @@ -1,8 +1,4 @@ -/* stylelint-disable selector-list-comma-newline-after */ - -.blog-header { - border-bottom: 1px solid #e5e5e5; -} +/* stylelint-disable stylistic/selector-list-comma-newline-after */ .blog-header-logo { font-family: "Playfair Display", Georgia, "Times New Roman", serif/*rtl:Amiri, Georgia, "Times New Roman", serif*/; @@ -17,15 +13,6 @@ h1, h2, h3, h4, h5, h6 { font-family: "Playfair Display", Georgia, "Times New Roman", serif/*rtl:Amiri, Georgia, "Times New Roman", serif*/; } -.display-4 { - font-size: 2.5rem; -} -@media (min-width: 768px) { - .display-4 { - font-size: 3rem; - } -} - .flex-auto { flex: 0 0 auto; } @@ -46,24 +33,7 @@ h1, h2, h3, h4, h5, h6 { .blog-post { margin-bottom: 4rem; } -.blog-post-title { - font-size: 2.5rem; -} .blog-post-meta { margin-bottom: 1.25rem; color: #727272; } - -/* - * Footer - */ -.blog-footer { - padding: 2.5rem 0; - color: #727272; - text-align: center; - background-color: #f9f9f9; - border-top: .05rem solid #e5e5e5; -} -.blog-footer p:last-child { - margin-bottom: 0; -} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.rtl.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css similarity index 54% rename from app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.rtl.css rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css index fc03c35a3..043d4e617 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/blog.rtl.css +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/blog.rtl.css @@ -1,8 +1,4 @@ -/* stylelint-disable selector-list-comma-newline-after */ - -.blog-header { - border-bottom: 1px solid #e5e5e5; -} +/* stylelint-disable stylistic/selector-list-comma-newline-after */ .blog-header-logo { font-family: Amiri, Georgia, "Times New Roman", serif; @@ -17,15 +13,6 @@ h1, h2, h3, h4, h5, h6 { font-family: Amiri, Georgia, "Times New Roman", serif; } -.display-4 { - font-size: 2.5rem; -} -@media (min-width: 768px) { - .display-4 { - font-size: 3rem; - } -} - .flex-auto { flex: 0 0 auto; } @@ -46,24 +33,7 @@ h1, h2, h3, h4, h5, h6 { .blog-post { margin-bottom: 4rem; } -.blog-post-title { - font-size: 2.5rem; -} .blog-post-meta { margin-bottom: 1.25rem; color: #727272; } - -/* - * Footer - */ -.blog-footer { - padding: 2.5rem 0; - color: #727272; - text-align: center; - background-color: #f9f9f9; - border-top: .05rem solid #e5e5e5; -} -.blog-footer p:last-child { - margin-bottom: 0; -} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html similarity index 68% rename from app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/index.html rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html index 6b60ea069..993c84e03 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/blog/index.html +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/blog/index.html @@ -4,17 +4,29 @@ extra_css: - "https://fonts.googleapis.com/css?family=Playfair+Display:700,900&display=swap" - "blog.css" -include_js: false --- + + + + + + + + + + + + +
    -
    +
    -
    -
    -
    +
    +

    Title of a longer featured blog post

    Multiple lines of text that form the lede, informing new readers quickly and efficiently about what’s most interesting in this post’s contents.

    -

    Continue reading...

    +

    Continue reading...

    @@ -56,11 +68,14 @@

    Title of a longer featured blog post

    - World + World

    Featured post

    -
    Nov 12
    +
    Nov 12

    This is a wider card with supporting text below as a natural lead-in to additional content.

    - Continue reading + + Continue reading + +
    {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="Thumbnail" >}} @@ -70,11 +85,14 @@

    Featured post

    - Design + Design

    Post title

    -
    Nov 11
    +
    Nov 11

    This is a wider card with supporting text below as a natural lead-in to additional content.

    - Continue reading + + Continue reading + +
    {{< placeholder width="200" height="250" background="#55595c" color="#eceeef" text="Thumbnail" >}} @@ -90,7 +108,7 @@

    -

    Sample blog post

    +

    This blog post shows a few different types of content that’s supported and styled with Bootstrap. Basic typography, lists, tables, images, code, and more are all supported as expected.

    @@ -144,7 +162,7 @@

    Sub-heading

    -

    Another blog post

    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    @@ -192,7 +210,7 @@

    Example table

    -

    New feature

    +

    This is some additional paragraph placeholder content. It has been written to fill the available space and show how a longer snippet of text affects the surrounding content. We'll repeat it often to keep the demonstration flowing, so be on the lookout for this exact same string of text.

    @@ -206,18 +224,51 @@

    New feature

    -
    + diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css new file mode 100644 index 000000000..a6be55861 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/breadcrumbs.css @@ -0,0 +1,50 @@ +.breadcrumb-chevron { + --bs-breadcrumb-divider: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%236c757d'%3E%3Cpath fill-rule='evenodd' d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E"); + gap: .5rem; +} +.breadcrumb-chevron .breadcrumb-item { + display: flex; + gap: inherit; + align-items: center; + padding-left: 0; + line-height: 1; +} +.breadcrumb-chevron .breadcrumb-item::before { + gap: inherit; + float: none; + width: 1rem; + height: 1rem; +} + +.breadcrumb-custom .breadcrumb-item { + position: relative; + flex-grow: 1; + padding: .75rem 3rem; +} +.breadcrumb-custom .breadcrumb-item::before { + display: none; +} +.breadcrumb-custom .breadcrumb-item::after { + position: absolute; + top: 50%; + right: -25px; + z-index: 1; + display: inline-block; + width: 50px; + height: 50px; + margin-top: -25px; + content: ""; + background-color: var(--bs-tertiary-bg); + border-top-right-radius: .5rem; + box-shadow: 1px -1px var(--bs-border-color); + transform: scale(.707) rotate(45deg); +} +.breadcrumb-custom .breadcrumb-item:first-child { + padding-left: 1.5rem; +} +.breadcrumb-custom .breadcrumb-item:last-child { + padding-right: 1.5rem; +} +.breadcrumb-custom .breadcrumb-item:last-child::after { + display: none; +} diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html new file mode 100644 index 000000000..74a042bc0 --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/breadcrumbs/index.html @@ -0,0 +1,88 @@ +--- +layout: examples +title: Breadcrumbs +extra_css: + - "breadcrumbs.css" +body_class: "" +--- + + + + + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html new file mode 100644 index 000000000..910c0d85e --- /dev/null +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/buttons/index.html @@ -0,0 +1,88 @@ +--- +layout: examples +title: Buttons +body_class: "" +--- + + + + + + + + + + + +
    + + + + + + + + + +
    + +
    + +
    +
    + + +
    +
    + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    + +
    + + +
    + +
    + + +
    + +
    diff --git a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/carousel-rtl/index.html b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html similarity index 80% rename from app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/carousel-rtl/index.html rename to app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html index b8c35d669..37d844e6f 100644 --- a/app/vendor/twbs/bootstrap/site/content/docs/5.2/examples/carousel-rtl/index.html +++ b/app/vendor/twbs/bootstrap/site/content/docs/5.3/examples/carousel-rtl/index.html @@ -6,7 +6,7 @@ - "../carousel/carousel.rtl.css" --- -
    +
    @@ -1289,7 +1289,7 @@

    شريط التنقل

    @@ -1397,27 +1397,31 @@

    شريط التقدم

    {{< example show_markup="false" >}} -
    -
    0%
    +
    +
    0%
    -
    -
    25%
    +
    +
    25%
    -
    -
    50%
    +
    +
    50%
    -
    -
    75%
    +
    +
    75%
    -
    -
    100%
    +
    +
    100%
    {{< /example >}} {{< example show_markup="false" >}} -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    {{< /example >}}
    @@ -1430,7 +1434,7 @@

    المخطوطة

    -