diff --git a/.github/workflows/doc-links.yml b/.github/workflows/doc-links.yml
index 76afbe91..92c56767 100644
--- a/.github/workflows/doc-links.yml
+++ b/.github/workflows/doc-links.yml
@@ -1,5 +1,11 @@
on:
workflow_dispatch:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
permissions:
contents: read
diff --git a/composer.json b/composer.json
index 68699283..6bafb0a7 100644
--- a/composer.json
+++ b/composer.json
@@ -19,11 +19,14 @@
}
},
"require": {
- "crowdsec/bouncer": "^2.0.0",
+ "crowdsec/bouncer": "^2.2.0",
"symfony/cache": "5.4.40",
"symfony/polyfill-mbstring": "^1.27.0",
"symfony/service-contracts": "^2.5.2"
},
+ "replace": {
+ "twig/twig": "*"
+ },
"autoload": {
"psr-4": {
"\\": "./"
diff --git a/composer.lock b/composer.lock
index def91127..adb415c6 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "4a79fad0d33e66c4a5e2b6cf23d4e26e",
+ "content-hash": "fffe8c480ca9a7eade0afcc65c305ffa",
"packages": [
{
"name": "composer/ca-bundle",
@@ -84,16 +84,16 @@
},
{
"name": "crowdsec/bouncer",
- "version": "v2.1.0",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/crowdsecurity/php-cs-bouncer.git",
- "reference": "06b2cf6e94b7f0a7a51bee4f048aac41a970f159"
+ "reference": "0cbb23bfe252e993b6cf04f817471a2ffd461a5d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/crowdsecurity/php-cs-bouncer/zipball/06b2cf6e94b7f0a7a51bee4f048aac41a970f159",
- "reference": "06b2cf6e94b7f0a7a51bee4f048aac41a970f159",
+ "url": "https://api.github.com/repos/crowdsecurity/php-cs-bouncer/zipball/0cbb23bfe252e993b6cf04f817471a2ffd461a5d",
+ "reference": "0cbb23bfe252e993b6cf04f817471a2ffd461a5d",
"shasum": ""
},
"require": {
@@ -148,9 +148,9 @@
],
"support": {
"issues": "https://github.com/crowdsecurity/php-cs-bouncer/issues",
- "source": "https://github.com/crowdsecurity/php-cs-bouncer/tree/v2.1.0"
+ "source": "https://github.com/crowdsecurity/php-cs-bouncer/tree/v2.2.0"
},
- "time": "2023-12-14T01:35:17+00:00"
+ "time": "2024-06-20T07:32:01+00:00"
},
{
"name": "crowdsec/capi-client",
@@ -1437,16 +1437,16 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
"shasum": ""
},
"require": {
@@ -1496,7 +1496,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
},
"funding": [
{
@@ -1512,20 +1512,20 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
- "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
"shasum": ""
},
"require": {
@@ -1576,7 +1576,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
},
"funding": [
{
@@ -1592,20 +1592,20 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "21bd091060673a1177ae842c0ef8fe30893114d2"
+ "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2",
- "reference": "21bd091060673a1177ae842c0ef8fe30893114d2",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1",
+ "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1",
"shasum": ""
},
"require": {
@@ -1652,7 +1652,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0"
},
"funding": [
{
@@ -1668,20 +1668,20 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
- "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433",
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433",
"shasum": ""
},
"require": {
@@ -1732,7 +1732,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0"
},
"funding": [
{
@@ -1748,20 +1748,20 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/polyfill-php81",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
+ "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af",
+ "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af",
"shasum": ""
},
"require": {
@@ -1808,7 +1808,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0"
},
"funding": [
{
@@ -1824,20 +1824,20 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-06-19T12:30:46+00:00"
},
{
"name": "symfony/polyfill-uuid",
- "version": "v1.29.0",
+ "version": "v1.30.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-uuid.git",
- "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853"
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853",
- "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9",
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9",
"shasum": ""
},
"require": {
@@ -1887,7 +1887,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0"
},
"funding": [
{
@@ -1903,7 +1903,7 @@
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2024-05-31T15:07:36+00:00"
},
{
"name": "symfony/service-contracts",
@@ -2134,85 +2134,6 @@
}
],
"time": "2024-05-31T14:33:22+00:00"
- },
- {
- "name": "twig/twig",
- "version": "v3.10.3",
- "source": {
- "type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "67f29781ffafa520b0bbfbd8384674b42db04572"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572",
- "reference": "67f29781ffafa520b0bbfbd8384674b42db04572",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-ctype": "^1.8",
- "symfony/polyfill-mbstring": "^1.3",
- "symfony/polyfill-php80": "^1.22"
- },
- "require-dev": {
- "psr/container": "^1.0|^2.0",
- "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/Resources/core.php",
- "src/Resources/debug.php",
- "src/Resources/escaper.php",
- "src/Resources/string_loader.php"
- ],
- "psr-4": {
- "Twig\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Twig Team",
- "role": "Contributors"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "https://twig.symfony.com",
- "keywords": [
- "templating"
- ],
- "support": {
- "issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v3.10.3"
- },
- "funding": [
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/twig/twig",
- "type": "tidelift"
- }
- ],
- "time": "2024-05-16T10:04:27+00:00"
}
],
"packages-dev": [],
diff --git a/inc/Bouncer.php b/inc/Bouncer.php
index ff7765b5..e20b7624 100644
--- a/inc/Bouncer.php
+++ b/inc/Bouncer.php
@@ -48,6 +48,36 @@ public function __construct(array $configs, LoggerInterface $logger = null)
parent::__construct($configs, $remediation, $this->logger);
}
+ private function renderTemplate(string $templatePath,array $configs = []): string
+ {
+ ob_start();
+ $config = array_merge($this->configs, $configs);
+ include __DIR__ . '/templates/' . $templatePath;
+ $html = ob_get_contents();
+ ob_end_clean();
+ return $html;
+ }
+
+ protected function getBanHtml(): string
+ {
+ return $this->renderTemplate('ban-wall.php');
+ }
+
+ protected function getCaptchaHtml(
+ bool $error,
+ string $captchaImageSrc,
+ string $captchaResolutionFormUrl
+ ): string {
+ $configs = [
+ 'error' => $error,
+ 'captcha_img' => $captchaImageSrc,
+ 'captcha_resolution_url' => $captchaResolutionFormUrl,
+ ];
+
+
+ return $this->renderTemplate('captcha-wall.php', $configs);
+ }
+
protected function escape(string $value): string
{
return htmlspecialchars($value, \ENT_QUOTES, 'UTF-8');
diff --git a/inc/templates/ban-wall.php b/inc/templates/ban-wall.php
new file mode 100644
index 00000000..a7f46d84
--- /dev/null
+++ b/inc/templates/ban-wall.php
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
diff --git a/inc/templates/captcha-wall.php b/inc/templates/captcha-wall.php
new file mode 100644
index 00000000..52d0b7bb
--- /dev/null
+++ b/inc/templates/captcha-wall.php
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/inc/templates/walls-partial/head.php b/inc/templates/walls-partial/head.php
new file mode 100644
index 00000000..d7a5d332
--- /dev/null
+++ b/inc/templates/walls-partial/head.php
@@ -0,0 +1,113 @@
+
+
+
+
+
diff --git a/inc/templates/walls-partial/mentions.php b/inc/templates/walls-partial/mentions.php
new file mode 100644
index 00000000..429d3ab5
--- /dev/null
+++ b/inc/templates/walls-partial/mentions.php
@@ -0,0 +1,27 @@
+This security check has been powered by
+
+ CrowdSec
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index 3c05841d..304f34fb 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -492,188 +492,6 @@
'Symfony\\Polyfill\\Php80\\PhpToken' => $vendorDir . '/symfony/polyfill-php80/PhpToken.php',
'Symfony\\Polyfill\\Php81\\Php81' => $vendorDir . '/symfony/polyfill-php81/Php81.php',
'Symfony\\Polyfill\\Uuid\\Uuid' => $vendorDir . '/symfony/polyfill-uuid/Uuid.php',
- 'Twig\\Attribute\\YieldReady' => $vendorDir . '/twig/twig/src/Attribute/YieldReady.php',
- 'Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php',
- 'Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php',
- 'Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php',
- 'Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php',
- 'Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php',
- 'Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php',
- 'Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php',
- 'Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php',
- 'Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php',
- 'Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php',
- 'Twig\\ExtensionSet' => $vendorDir . '/twig/twig/src/ExtensionSet.php',
- 'Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php',
- 'Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php',
- 'Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php',
- 'Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php',
- 'Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php',
- 'Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php',
- 'Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php',
- 'Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php',
- 'Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
- 'Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php',
- 'Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php',
- 'Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php',
- 'Twig\\Extension\\YieldNotReadyExtension' => $vendorDir . '/twig/twig/src/Extension/YieldNotReadyExtension.php',
- 'Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php',
- 'Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php',
- 'Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php',
- 'Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php',
- 'Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php',
- 'Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php',
- 'Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php',
- 'Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php',
- 'Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
- 'Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
- 'Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php',
- 'Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
- 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
- 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
- 'Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
- 'Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php',
- 'Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php',
- 'Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php',
- 'Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php',
- 'Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php',
- 'Twig\\Node\\CaptureNode' => $vendorDir . '/twig/twig/src/Node/CaptureNode.php',
- 'Twig\\Node\\CheckSecurityCallNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityCallNode.php',
- 'Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php',
- 'Twig\\Node\\CheckToStringNode' => $vendorDir . '/twig/twig/src/Node/CheckToStringNode.php',
- 'Twig\\Node\\DeprecatedNode' => $vendorDir . '/twig/twig/src/Node/DeprecatedNode.php',
- 'Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php',
- 'Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php',
- 'Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php',
- 'Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php',
- 'Twig\\Node\\Expression\\ArrowFunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php',
- 'Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
- 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
- 'Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
- 'Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
- 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
- 'Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
- 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
- 'Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
- 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
- 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\HasEveryBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php',
- 'Twig\\Node\\Expression\\Binary\\HasSomeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php',
- 'Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
- 'Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
- 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
- 'Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
- 'Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
- 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
- 'Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
- 'Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
- 'Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
- 'Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php',
- 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
- 'Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
- 'Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
- 'Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php',
- 'Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
- 'Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php',
- 'Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php',
- 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
- 'Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php',
- 'Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
- 'Twig\\Node\\Expression\\InlinePrint' => $vendorDir . '/twig/twig/src/Node/Expression/InlinePrint.php',
- 'Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
- 'Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php',
- 'Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
- 'Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php',
- 'Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php',
- 'Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php',
- 'Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
- 'Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
- 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
- 'Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
- 'Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php',
- 'Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php',
- 'Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
- 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
- 'Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
- 'Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
- 'Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
- 'Twig\\Node\\Expression\\VariadicExpression' => $vendorDir . '/twig/twig/src/Node/Expression/VariadicExpression.php',
- 'Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php',
- 'Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php',
- 'Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php',
- 'Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php',
- 'Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php',
- 'Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php',
- 'Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php',
- 'Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php',
- 'Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php',
- 'Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php',
- 'Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php',
- 'Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php',
- 'Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php',
- 'Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php',
- 'Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php',
- 'Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php',
- 'Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php',
- 'Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
- 'Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
- 'Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
- 'Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
- 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
- 'Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
- 'Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
- 'Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php',
- 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
- 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
- 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
- 'Twig\\Runtime\\EscaperRuntime' => $vendorDir . '/twig/twig/src/Runtime/EscaperRuntime.php',
- 'Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
- 'Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php',
- 'Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
- 'Twig\\Sandbox\\SourcePolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SourcePolicyInterface.php',
- 'Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php',
- 'Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php',
- 'Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php',
- 'Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php',
- 'Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php',
- 'Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php',
- 'Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
- 'Twig\\TokenParser\\ApplyTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ApplyTokenParser.php',
- 'Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
- 'Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php',
- 'Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
- 'Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php',
- 'Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
- 'Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
- 'Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php',
- 'Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php',
- 'Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php',
- 'Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php',
- 'Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php',
- 'Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
- 'Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php',
- 'Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
- 'Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php',
- 'Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php',
- 'Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php',
- 'Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php',
- 'Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php',
- 'Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php',
- 'Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php',
- 'Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php',
- 'Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php',
- 'Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php',
'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
);
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 4d65c989..0822facf 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -13,8 +13,4 @@
'23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
'09f6b20656683369174dd6fa83b7e5fb' => $vendorDir . '/symfony/polyfill-uuid/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
- '89efb1254ef2d1c5d80096acd12c4098' => $vendorDir . '/twig/twig/src/Resources/core.php',
- 'ffecb95d45175fd40f75be8a23b34f90' => $vendorDir . '/twig/twig/src/Resources/debug.php',
- 'c7baa00073ee9c61edf148c51917cfb4' => $vendorDir . '/twig/twig/src/Resources/escaper.php',
- 'f844ccf1d25df8663951193c3fc307c8' => $vendorDir . '/twig/twig/src/Resources/string_loader.php',
);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 5cf49a99..620d7dac 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,7 +7,6 @@
return array(
'\\' => array($baseDir . '/'),
- 'Twig\\' => array($vendorDir . '/twig/twig/src'),
'Symfony\\Polyfill\\Uuid\\' => array($vendorDir . '/symfony/polyfill-uuid'),
'Symfony\\Polyfill\\Php81\\' => array($vendorDir . '/symfony/polyfill-php81'),
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 176401cc..0724e979 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -14,10 +14,6 @@ class ComposerStaticInit4b873ba8e7b65775adbfceed536a1658
'23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
'09f6b20656683369174dd6fa83b7e5fb' => __DIR__ . '/..' . '/symfony/polyfill-uuid/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
- '89efb1254ef2d1c5d80096acd12c4098' => __DIR__ . '/..' . '/twig/twig/src/Resources/core.php',
- 'ffecb95d45175fd40f75be8a23b34f90' => __DIR__ . '/..' . '/twig/twig/src/Resources/debug.php',
- 'c7baa00073ee9c61edf148c51917cfb4' => __DIR__ . '/..' . '/twig/twig/src/Resources/escaper.php',
- 'f844ccf1d25df8663951193c3fc307c8' => __DIR__ . '/..' . '/twig/twig/src/Resources/string_loader.php',
);
public static $prefixLengthsPsr4 = array (
@@ -25,10 +21,6 @@ class ComposerStaticInit4b873ba8e7b65775adbfceed536a1658
array (
'\\' => 1,
),
- 'T' =>
- array (
- 'Twig\\' => 5,
- ),
'S' =>
array (
'Symfony\\Polyfill\\Uuid\\' => 22,
@@ -84,10 +76,6 @@ class ComposerStaticInit4b873ba8e7b65775adbfceed536a1658
array (
0 => __DIR__ . '/../..' . '/',
),
- 'Twig\\' =>
- array (
- 0 => __DIR__ . '/..' . '/twig/twig/src',
- ),
'Symfony\\Polyfill\\Uuid\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-uuid',
@@ -697,188 +685,6 @@ class ComposerStaticInit4b873ba8e7b65775adbfceed536a1658
'Symfony\\Polyfill\\Php80\\PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/PhpToken.php',
'Symfony\\Polyfill\\Php81\\Php81' => __DIR__ . '/..' . '/symfony/polyfill-php81/Php81.php',
'Symfony\\Polyfill\\Uuid\\Uuid' => __DIR__ . '/..' . '/symfony/polyfill-uuid/Uuid.php',
- 'Twig\\Attribute\\YieldReady' => __DIR__ . '/..' . '/twig/twig/src/Attribute/YieldReady.php',
- 'Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php',
- 'Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php',
- 'Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php',
- 'Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php',
- 'Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php',
- 'Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php',
- 'Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php',
- 'Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php',
- 'Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php',
- 'Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php',
- 'Twig\\ExtensionSet' => __DIR__ . '/..' . '/twig/twig/src/ExtensionSet.php',
- 'Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php',
- 'Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php',
- 'Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php',
- 'Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php',
- 'Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php',
- 'Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php',
- 'Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php',
- 'Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php',
- 'Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php',
- 'Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php',
- 'Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php',
- 'Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php',
- 'Twig\\Extension\\YieldNotReadyExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/YieldNotReadyExtension.php',
- 'Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php',
- 'Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php',
- 'Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php',
- 'Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php',
- 'Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php',
- 'Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php',
- 'Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php',
- 'Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php',
- 'Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php',
- 'Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php',
- 'Twig\\NodeVisitor\\MacroAutoImportNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php',
- 'Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php',
- 'Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php',
- 'Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php',
- 'Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php',
- 'Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php',
- 'Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php',
- 'Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php',
- 'Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php',
- 'Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php',
- 'Twig\\Node\\CaptureNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CaptureNode.php',
- 'Twig\\Node\\CheckSecurityCallNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityCallNode.php',
- 'Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php',
- 'Twig\\Node\\CheckToStringNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckToStringNode.php',
- 'Twig\\Node\\DeprecatedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DeprecatedNode.php',
- 'Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php',
- 'Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php',
- 'Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php',
- 'Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php',
- 'Twig\\Node\\Expression\\ArrowFunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php',
- 'Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php',
- 'Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php',
- 'Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php',
- 'Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php',
- 'Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php',
- 'Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php',
- 'Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php',
- 'Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php',
- 'Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php',
- 'Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php',
- 'Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\HasEveryBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php',
- 'Twig\\Node\\Expression\\Binary\\HasSomeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php',
- 'Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php',
- 'Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php',
- 'Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php',
- 'Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php',
- 'Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php',
- 'Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php',
- 'Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php',
- 'Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php',
- 'Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php',
- 'Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php',
- 'Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php',
- 'Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php',
- 'Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php',
- 'Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php',
- 'Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php',
- 'Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php',
- 'Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php',
- 'Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php',
- 'Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php',
- 'Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php',
- 'Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php',
- 'Twig\\Node\\Expression\\InlinePrint' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/InlinePrint.php',
- 'Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php',
- 'Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php',
- 'Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php',
- 'Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php',
- 'Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php',
- 'Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php',
- 'Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php',
- 'Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php',
- 'Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php',
- 'Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php',
- 'Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php',
- 'Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php',
- 'Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php',
- 'Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php',
- 'Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php',
- 'Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php',
- 'Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php',
- 'Twig\\Node\\Expression\\VariadicExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/VariadicExpression.php',
- 'Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php',
- 'Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php',
- 'Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php',
- 'Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php',
- 'Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php',
- 'Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php',
- 'Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php',
- 'Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php',
- 'Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php',
- 'Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php',
- 'Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php',
- 'Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php',
- 'Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php',
- 'Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php',
- 'Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php',
- 'Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php',
- 'Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php',
- 'Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php',
- 'Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php',
- 'Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php',
- 'Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php',
- 'Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php',
- 'Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php',
- 'Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php',
- 'Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php',
- 'Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php',
- 'Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php',
- 'Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php',
- 'Twig\\Runtime\\EscaperRuntime' => __DIR__ . '/..' . '/twig/twig/src/Runtime/EscaperRuntime.php',
- 'Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php',
- 'Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php',
- 'Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php',
- 'Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php',
- 'Twig\\Sandbox\\SourcePolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SourcePolicyInterface.php',
- 'Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php',
- 'Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php',
- 'Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php',
- 'Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php',
- 'Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php',
- 'Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php',
- 'Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php',
- 'Twig\\TokenParser\\ApplyTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ApplyTokenParser.php',
- 'Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php',
- 'Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php',
- 'Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php',
- 'Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php',
- 'Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php',
- 'Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php',
- 'Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php',
- 'Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php',
- 'Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php',
- 'Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php',
- 'Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php',
- 'Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php',
- 'Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php',
- 'Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php',
- 'Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php',
- 'Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php',
- 'Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php',
- 'Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php',
- 'Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php',
- 'Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php',
- 'Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php',
- 'Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php',
- 'Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php',
- 'Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php',
'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
);
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index d05d036b..749632cc 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -81,17 +81,17 @@
},
{
"name": "crowdsec/bouncer",
- "version": "v2.1.0",
- "version_normalized": "2.1.0.0",
+ "version": "v2.2.0",
+ "version_normalized": "2.2.0.0",
"source": {
"type": "git",
"url": "https://github.com/crowdsecurity/php-cs-bouncer.git",
- "reference": "06b2cf6e94b7f0a7a51bee4f048aac41a970f159"
+ "reference": "0cbb23bfe252e993b6cf04f817471a2ffd461a5d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/crowdsecurity/php-cs-bouncer/zipball/06b2cf6e94b7f0a7a51bee4f048aac41a970f159",
- "reference": "06b2cf6e94b7f0a7a51bee4f048aac41a970f159",
+ "url": "https://api.github.com/repos/crowdsecurity/php-cs-bouncer/zipball/0cbb23bfe252e993b6cf04f817471a2ffd461a5d",
+ "reference": "0cbb23bfe252e993b6cf04f817471a2ffd461a5d",
"shasum": ""
},
"require": {
@@ -109,7 +109,7 @@
"mikey179/vfsstream": "^1.6.11",
"phpunit/phpunit": "^8.5.30 || ^9.3"
},
- "time": "2023-12-14T01:35:17+00:00",
+ "time": "2024-06-20T07:32:01+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
@@ -148,7 +148,7 @@
],
"support": {
"issues": "https://github.com/crowdsecurity/php-cs-bouncer/issues",
- "source": "https://github.com/crowdsecurity/php-cs-bouncer/tree/v2.1.0"
+ "source": "https://github.com/crowdsecurity/php-cs-bouncer/tree/v2.2.0"
},
"install-path": "../crowdsec/bouncer"
},
@@ -1486,17 +1486,17 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4"
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4",
- "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
+ "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
"shasum": ""
},
"require": {
@@ -1508,7 +1508,7 @@
"suggest": {
"ext-ctype": "For best performance"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-05-31T15:07:36+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1548,7 +1548,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
},
"funding": [
{
@@ -1568,17 +1568,17 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec"
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
- "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
"shasum": ""
},
"require": {
@@ -1590,7 +1590,7 @@
"suggest": {
"ext-mbstring": "For best performance"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-06-19T12:30:46+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1631,7 +1631,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
},
"funding": [
{
@@ -1651,23 +1651,23 @@
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "21bd091060673a1177ae842c0ef8fe30893114d2"
+ "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2",
- "reference": "21bd091060673a1177ae842c0ef8fe30893114d2",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1",
+ "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-05-31T15:07:36+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1710,7 +1710,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0"
},
"funding": [
{
@@ -1730,23 +1730,23 @@
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b"
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
- "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433",
+ "reference": "77fa7995ac1b21ab60769b7323d600a991a90433",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-05-31T15:07:36+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1793,7 +1793,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0"
},
"funding": [
{
@@ -1813,23 +1813,23 @@
},
{
"name": "symfony/polyfill-php81",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
+ "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af",
+ "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-06-19T12:30:46+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1872,7 +1872,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0"
},
"funding": [
{
@@ -1892,17 +1892,17 @@
},
{
"name": "symfony/polyfill-uuid",
- "version": "v1.29.0",
- "version_normalized": "1.29.0.0",
+ "version": "v1.30.0",
+ "version_normalized": "1.30.0.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-uuid.git",
- "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853"
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853",
- "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853",
+ "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9",
+ "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9",
"shasum": ""
},
"require": {
@@ -1914,7 +1914,7 @@
"suggest": {
"ext-uuid": "For best performance"
},
- "time": "2024-01-29T20:11:03+00:00",
+ "time": "2024-05-31T15:07:36+00:00",
"type": "library",
"extra": {
"thanks": {
@@ -1954,7 +1954,7 @@
"uuid"
],
"support": {
- "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0"
+ "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0"
},
"funding": [
{
@@ -2210,88 +2210,6 @@
}
],
"install-path": "../symfony/var-exporter"
- },
- {
- "name": "twig/twig",
- "version": "v3.10.3",
- "version_normalized": "3.10.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "67f29781ffafa520b0bbfbd8384674b42db04572"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572",
- "reference": "67f29781ffafa520b0bbfbd8384674b42db04572",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-ctype": "^1.8",
- "symfony/polyfill-mbstring": "^1.3",
- "symfony/polyfill-php80": "^1.22"
- },
- "require-dev": {
- "psr/container": "^1.0|^2.0",
- "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
- },
- "time": "2024-05-16T10:04:27+00:00",
- "type": "library",
- "installation-source": "dist",
- "autoload": {
- "files": [
- "src/Resources/core.php",
- "src/Resources/debug.php",
- "src/Resources/escaper.php",
- "src/Resources/string_loader.php"
- ],
- "psr-4": {
- "Twig\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Twig Team",
- "role": "Contributors"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "https://twig.symfony.com",
- "keywords": [
- "templating"
- ],
- "support": {
- "issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v3.10.3"
- },
- "funding": [
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/twig/twig",
- "type": "tidelift"
- }
- ],
- "install-path": "../twig/twig"
}
],
"dev": false,
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index 5cf1c243..49e110f6 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -3,7 +3,7 @@
'name' => 'crowdsec/wordpress-bouncer',
'pretty_version' => 'dev-main',
'version' => 'dev-main',
- 'reference' => 'c634aaf3a3b0b8bd1e6568b42c234e5c0896dfbf',
+ 'reference' => 'de51eb531d505c09640ea96aabe26d7cf6054942',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -20,9 +20,9 @@
'dev_requirement' => false,
),
'crowdsec/bouncer' => array(
- 'pretty_version' => 'v2.1.0',
- 'version' => '2.1.0.0',
- 'reference' => '06b2cf6e94b7f0a7a51bee4f048aac41a970f159',
+ 'pretty_version' => 'v2.2.0',
+ 'version' => '2.2.0.0',
+ 'reference' => '0cbb23bfe252e993b6cf04f817471a2ffd461a5d',
'type' => 'library',
'install_path' => __DIR__ . '/../crowdsec/bouncer',
'aliases' => array(),
@@ -67,7 +67,7 @@
'crowdsec/wordpress-bouncer' => array(
'pretty_version' => 'dev-main',
'version' => 'dev-main',
- 'reference' => 'c634aaf3a3b0b8bd1e6568b42c234e5c0896dfbf',
+ 'reference' => 'de51eb531d505c09640ea96aabe26d7cf6054942',
'type' => 'project',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
@@ -233,54 +233,54 @@
'dev_requirement' => false,
),
'symfony/polyfill-ctype' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => 'ef4d7e442ca910c4764bce785146269b30cb5fc4',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '0424dff1c58f028c451efff2045f5d92410bd540',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-mbstring' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => '9773676c8a1bb1f8d4340a62efe641cf76eda7ec',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => 'fd22ab50000ef01661e2a31d850ebaa297f8e03c',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php73' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => '21bd091060673a1177ae842c0ef8fe30893114d2',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => 'ec444d3f3f6505bb28d11afa41e75faadebc10a1',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php73',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php80' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => '87b68208d5c1188808dd7839ee1e6c8ec3b02f1b',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '77fa7995ac1b21ab60769b7323d600a991a90433',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php80',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-php81' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => 'c565ad1e63f30e7477fc40738343c62b40bc672d',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '3fb075789fb91f9ad9af537c4012d523085bd5af',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-php81',
'aliases' => array(),
'dev_requirement' => false,
),
'symfony/polyfill-uuid' => array(
- 'pretty_version' => 'v1.29.0',
- 'version' => '1.29.0.0',
- 'reference' => '3abdd21b0ceaa3000ee950097bc3cf9efc137853',
+ 'pretty_version' => 'v1.30.0',
+ 'version' => '1.30.0.0',
+ 'reference' => '2ba1f33797470debcda07fe9dce20a0003df18e9',
'type' => 'library',
'install_path' => __DIR__ . '/../symfony/polyfill-uuid',
'aliases' => array(),
@@ -314,13 +314,10 @@
'dev_requirement' => false,
),
'twig/twig' => array(
- 'pretty_version' => 'v3.10.3',
- 'version' => '3.10.3.0',
- 'reference' => '67f29781ffafa520b0bbfbd8384674b42db04572',
- 'type' => 'library',
- 'install_path' => __DIR__ . '/../twig/twig',
- 'aliases' => array(),
'dev_requirement' => false,
+ 'replaced' => array(
+ 0 => '*',
+ ),
),
),
);
diff --git a/vendor/crowdsec/bouncer/src/AbstractBouncer.php b/vendor/crowdsec/bouncer/src/AbstractBouncer.php
index 5036bbdd..f634d9d9 100644
--- a/vendor/crowdsec/bouncer/src/AbstractBouncer.php
+++ b/vendor/crowdsec/bouncer/src/AbstractBouncer.php
@@ -45,7 +45,7 @@ abstract class AbstractBouncer
public function __construct(
array $configs,
AbstractRemediation $remediationEngine,
- LoggerInterface $logger = null
+ ?LoggerInterface $logger = null
) {
// @codeCoverageIgnoreStart
if (!$logger) {
@@ -513,7 +513,7 @@ private function displayCaptchaWall(string $ip): void
*
* @return string The HTML compiled template
*/
- private function getBanHtml(): string
+ protected function getBanHtml(): string
{
$template = new Template('ban.html.twig');
@@ -528,7 +528,7 @@ private function getCache(): AbstractCache
/**
* Returns a default "CrowdSec Captcha (401)" HTML template.
*/
- private function getCaptchaHtml(
+ protected function getCaptchaHtml(
bool $error,
string $captchaImageSrc,
string $captchaResolutionFormUrl
diff --git a/vendor/crowdsec/bouncer/src/Constants.php b/vendor/crowdsec/bouncer/src/Constants.php
index 0c9d83b8..3f41940b 100644
--- a/vendor/crowdsec/bouncer/src/Constants.php
+++ b/vendor/crowdsec/bouncer/src/Constants.php
@@ -39,7 +39,7 @@ class Constants extends RemConstants
/** @var string Path for html templates folder (e.g. ban and captcha wall) */
public const TEMPLATES_DIR = __DIR__ . '/templates';
/** @var string The last version of this library */
- public const VERSION = 'v2.1.0';
+ public const VERSION = 'v2.2.0';
/** @var string The "disabled" x-forwarded-for setting */
public const X_FORWARDED_DISABLED = 'no_forward';
}
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
index 2e0b9694..1ad33a86 100644
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -48,6 +48,8 @@
* - mb_strstr - Finds first occurrence of a string within another
* - mb_strwidth - Return width of string
* - mb_substr_count - Count the number of substring occurrences
+ * - mb_ucfirst - Make a string's first character uppercase
+ * - mb_lcfirst - Make a string's first character lowercase
*
* Not implemented:
* - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
@@ -80,6 +82,21 @@ final class Mbstring
public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{
+ if (\is_array($s)) {
+ if (PHP_VERSION_ID < 70200) {
+ trigger_error('mb_convert_encoding() expects parameter 1 to be string, array given', \E_USER_WARNING);
+
+ return null;
+ }
+
+ $r = [];
+ foreach ($s as $str) {
+ $r[] = self::mb_convert_encoding($str, $toEncoding, $fromEncoding);
+ }
+
+ return $r;
+ }
+
if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
$fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
} else {
@@ -410,7 +427,7 @@ 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)) {
+ 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;
@@ -437,7 +454,6 @@ public static function mb_check_encoding($var = null, $encoding = null)
}
return true;
-
}
public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
@@ -827,7 +843,7 @@ 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
+ 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');
@@ -835,17 +851,8 @@ public static function mb_str_pad(string $string, int $length, string $pad_strin
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));
+ } else {
+ self::assertEncoding($encoding, 'mb_str_pad(): Argument #5 ($encoding) must be a valid encoding, "%s" given');
}
if (self::mb_strlen($pad_string, $encoding) <= 0) {
@@ -871,6 +878,34 @@ public static function mb_str_pad(string $string, int $length, string $pad_strin
}
}
+ public static function mb_ucfirst(string $string, ?string $encoding = null): string
+ {
+ if (null === $encoding) {
+ $encoding = self::mb_internal_encoding();
+ } else {
+ self::assertEncoding($encoding, 'mb_ucfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
+ }
+
+ $firstChar = mb_substr($string, 0, 1, $encoding);
+ $firstChar = mb_convert_case($firstChar, \MB_CASE_TITLE, $encoding);
+
+ return $firstChar.mb_substr($string, 1, null, $encoding);
+ }
+
+ public static function mb_lcfirst(string $string, ?string $encoding = null): string
+ {
+ if (null === $encoding) {
+ $encoding = self::mb_internal_encoding();
+ } else {
+ self::assertEncoding($encoding, 'mb_lcfirst(): Argument #2 ($encoding) must be a valid encoding, "%s" given');
+ }
+
+ $firstChar = mb_substr($string, 0, 1, $encoding);
+ $firstChar = mb_convert_case($firstChar, \MB_CASE_LOWER, $encoding);
+
+ return $firstChar.mb_substr($string, 1, null, $encoding);
+ }
+
private static function getSubpart($pos, $part, $haystack, $encoding)
{
if (false === $pos) {
@@ -944,4 +979,18 @@ private static function getEncoding($encoding)
return $encoding;
}
+
+ private static function assertEncoding(string $encoding, string $errorFormat): void
+ {
+ try {
+ $validEncoding = @self::mb_check_encoding('', $encoding);
+ } catch (\ValueError $e) {
+ throw new \ValueError(\sprintf($errorFormat, $encoding));
+ }
+
+ // BC for PHP 7.3 and lower
+ if (!$validEncoding) {
+ throw new \ValueError(\sprintf($errorFormat, $encoding));
+ }
+ }
}
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php
index ecf1a035..6e4b5fce 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -136,6 +136,14 @@ function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstrin
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 (!function_exists('mb_ucfirst')) {
+ function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
+}
+
+if (!function_exists('mb_lcfirst')) {
+ function mb_lcfirst(string $string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
+}
+
if (extension_loaded('mbstring')) {
return;
}
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap80.php b/vendor/symfony/polyfill-mbstring/bootstrap80.php
index 2f9fb5b4..ec2ae427 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap80.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap80.php
@@ -132,6 +132,14 @@ function mb_str_split(?string $string, ?int $length = 1, ?string $encoding = nul
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 (!function_exists('mb_ucfirst')) {
+ function mb_ucfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_ucfirst($string, $encoding); }
+}
+
+if (!function_exists('mb_lcfirst')) {
+ function mb_lcfirst($string, ?string $encoding = null): string { return p\Mbstring::mb_lcfirst($string, $encoding); }
+}
+
if (extension_loaded('mbstring')) {
return;
}
diff --git a/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php b/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php
index eb5952ee..5ff93fca 100644
--- a/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php
+++ b/vendor/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php
@@ -32,7 +32,7 @@ public function __set(string $name, $value): void
}
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');
+ throw new TypeError('Cannot assign '.gettype($value).' to property CURLStringFile::$data of type string');
}
$this->name = 'data://application/octet-stream;base64,'.base64_encode($value);
diff --git a/vendor/twig/twig/CHANGELOG b/vendor/twig/twig/CHANGELOG
deleted file mode 100644
index aecaab23..00000000
--- a/vendor/twig/twig/CHANGELOG
+++ /dev/null
@@ -1,257 +0,0 @@
-# 3.10.3 (2024-05-16)
-
- * Fix missing ; in generated code
-
-# 3.10.2 (2024-05-14)
-
- * Fix support for the deprecated escaper signature
-
-# 3.10.1 (2024-05-12)
-
- * Fix BC break on escaper extension
- * Fix constant return type
-
-# 3.10.0 (2024-05-11)
-
- * Make `CoreExtension::formatDate`, `CoreExtension::convertDate`, and
- `CoreExtension::formatNumber` part of the public API
- * Add `needs_charset` option for filters and functions
- * Extract the escaping logic from the `EscaperExtension` class to a new
- `EscaperRuntime` class.
-
- The following methods from ``Twig\\Extension\\EscaperExtension`` are
- deprecated: ``setEscaper()``, ``getEscapers()``, ``setSafeClasses``,
- ``addSafeClasses()``. Use the same methods on the
- ``Twig\\Runtime\\EscaperRuntime`` class instead.
- * Fix capturing output from extensions that still use echo
- * Fix a PHP warning in the Lexer on malformed templates
- * Fix blocks not available under some circumstances
- * Synchronize source context in templates when setting a Node on a Node
-
-# 3.9.3 (2024-04-18)
-
- * Add missing `twig_escape_filter_is_safe` deprecated function
- * Fix yield usage with CaptureNode
- * Add missing unwrap call when using a TemplateWrapper instance internally
- * Ensure Lexer is initialized early on
-
-# 3.9.2 (2024-04-17)
-
- * Fix usage of display_end hook
-
-# 3.9.1 (2024-04-17)
-
- * Fix missing `$blocks` variable in `CaptureNode`
-
-# 3.9.0 (2024-04-16)
-
- * Add support for PHP 8.4
- * Deprecate AbstractNodeVisitor
- * Deprecate passing Template to Environment::resolveTemplate(), Environment::load(), and Template::loadTemplate()
- * Add a new "yield" mode for output generation;
- Node implementations that use "echo" or "print" should use "yield" instead;
- all Node implementations should be flagged with `#[YieldReady]` once they've been made ready for "yield";
- the "use_yield" Environment option can be turned on when all nodes have been made `#[YieldReady]`;
- "yield" will be the only strategy supported in the next major version
- * Add return type for Symfony 7 compatibility
- * Fix premature loop exit in Security Policy lookup of allowed methods/properties
- * Deprecate all internal extension functions in favor of methods on the extension classes
- * Mark all extension functions as @internal
- * Add SourcePolicyInterface to selectively enable the Sandbox based on a template's Source
- * Throw a proper Twig exception when using cycle on an empty array
-
-# 3.8.0 (2023-11-21)
-
- * Catch errors thrown during template rendering
- * Fix IntlExtension::formatDateTime use of date formatter prototype
- * Fix premature loop exit in Security Policy lookup of allowed methods/properties
- * Remove NumberFormatter::TYPE_CURRENCY (deprecated in PHP 8.3)
- * Restore return type annotations
- * Allow Symfony 7 packages to be installed
- * Deprecate `twig_test_iterable` function. Use the native `is_iterable` instead.
-
-# 3.7.1 (2023-08-28)
-
- * Fix some phpdocs
-
-# 3.7.0 (2023-07-26)
-
- * Add support for the ...spread operator on arrays and hashes
-
-# 3.6.1 (2023-06-08)
-
- * Suppress some native return type deprecation messages
-
-# 3.6.0 (2023-05-03)
-
- * Allow psr/container 2.0
- * Add the new PHP 8.0 IntlDateFormatter::RELATIVE_* constants for date formatting
- * Make the Lexer initialize itself lazily
-
-# 3.5.1 (2023-02-08)
-
- * Arrow functions passed to the "reduce" filter now accept the current key as a third argument
- * Restores the leniency of the matches twig comparison
- * Fix error messages in sandboxed mode for "has some" and "has every"
-
-# 3.5.0 (2022-12-27)
-
- * Make Twig\ExpressionParser non-internal
- * Add "has some" and "has every" operators
- * Add Compile::reset()
- * Throw a better runtime error when the "matches" regexp is not valid
- * Add "twig *_names" intl functions
- * Fix optimizing closures callbacks
- * Add a better exception when getting an undefined constant via `constant`
- * Fix `if` nodes when outside of a block and with an empty body
-
-# 3.4.3 (2022-09-28)
-
- * Fix a security issue on filesystem loader (possibility to load a template outside a configured directory)
-
-# 3.4.2 (2022-08-12)
-
- * Allow inherited magic method to still run with calling class
- * Fix CallExpression::reflectCallable() throwing TypeError
- * Fix typo in naming (currency_code)
-
-# 3.4.1 (2022-05-17)
-
-* Fix optimizing non-public named closures
-
-# 3.4.0 (2022-05-22)
-
- * Add support for named closures
-
-# 3.3.10 (2022-04-06)
-
- * Enable bytecode invalidation when auto_reload is enabled
-
-# 3.3.9 (2022-03-25)
-
- * Fix custom escapers when using multiple Twig environments
- * Add support for "constant('class', object)"
- * Do not reuse internally generated variable names during parsing
-
-# 3.3.8 (2022-02-04)
-
- * Fix a security issue when in a sandbox: the `sort` filter must require a Closure for the `arrow` parameter
- * Fix deprecation notice on `round`
- * Fix call to deprecated `convertToHtml` method
-
-# 3.3.7 (2022-01-03)
-
-* Allow more null support when Twig expects a string (for better 8.1 support)
-* Only use Commonmark extensions if markdown enabled
-
-# 3.3.6 (2022-01-03)
-
-* Only use Commonmark extensions if markdown enabled
-
-# 3.3.5 (2022-01-03)
-
-* Allow CommonMark extensions to easily be added
-* Allow null when Twig expects a string (for better 8.1 support)
-* Make some performance optimizations
-* Allow Symfony translation contract v3+
-
-# 3.3.4 (2021-11-25)
-
- * Bump minimum supported Symfony component versions
- * Fix a deprecated message
-
-# 3.3.3 (2021-09-17)
-
- * Allow Symfony 6
- * Improve compatibility with PHP 8.1
- * Explicitly specify the encoding for mb_ord in JS escaper
-
-# 3.3.2 (2021-05-16)
-
- * Revert "Throw a proper exception when a template name is an absolute path (as it has never been supported)"
-
-# 3.3.1 (2021-05-12)
-
- * Fix PHP 8.1 compatibility
- * Throw a proper exception when a template name is an absolute path (as it has never been supported)
-
-# 3.3.0 (2021-02-08)
-
- * Fix macro calls in a "cache" tag
- * Add the slug filter
- * Allow extra bundle to be compatible with Twig 2
-
-# 3.2.1 (2021-01-05)
-
- * Fix extra bundle compat with older versions of Symfony
-
-# 3.2.0 (2021-01-05)
-
- * Add the Cache extension in the "extra" repositories: "cache" tag
- * Add "registerUndefinedTokenParserCallback"
- * Mark built-in node visitors as @internal
- * Fix "odd" not working for negative numbers
-
-# 3.1.1 (2020-10-27)
-
- * Fix "include(template_from_string())"
-
-# 3.1.0 (2020-10-21)
-
- * Fix sandbox support when using "include(template_from_string())"
- * Make round brackets optional for one argument tests like "same as" or "divisible by"
- * Add support for ES2015 style object initialisation shortcut { a } is the same as { 'a': a }
-
-# 3.0.5 (2020-08-05)
-
- * Fix twig_compare w.r.t. whitespace trimming
- * Fix sandbox not disabled if syntax error occurs within {% sandbox %} tag
- * Fix a regression when not using a space before an operator
- * Restrict callables to closures in filters
- * Allow trailing commas in argument lists (in calls as well as definitions)
-
-# 3.0.4 (2020-07-05)
-
- * Fix comparison operators
- * Fix options not taken into account when using "Michelf\MarkdownExtra"
- * Fix "Twig\Extra\Intl\IntlExtension::getCountryName()" to accept "null" as a first argument
- * Throw exception in case non-Traversable data is passed to "filter"
- * Fix context optimization on PHP 7.4
- * Fix PHP 8 compatibility
- * Fix ambiguous syntax parsing
-
-# 3.0.3 (2020-02-11)
-
- * Add a check to ensure that iconv() is defined
-
-# 3.0.2 (2020-02-11)
-
- * Avoid exceptions when an intl resource is not found
- * Fix implementation of case-insensitivity for method names
-
-# 3.0.1 (2019-12-28)
-
- * fixed Symfony 5.0 support for the HTML extra extension
-
-# 3.0.0 (2019-11-15)
-
- * fixed number formatter in Intl extra extension when using a formatter prototype
-
-# 3.0.0-BETA1 (2019-11-11)
-
- * removed the "if" condition support on the "for" tag
- * made the in, <, >, <=, >=, ==, and != operators more strict when comparing strings and integers/floats
- * removed the "filter" tag
- * added type hints everywhere
- * changed Environment::resolveTemplate() to always return a TemplateWrapper instance
- * removed Template::__toString()
- * removed Parser::isReservedMacroName()
- * removed SanboxedPrintNode
- * removed Node::setTemplateName()
- * made classes marked as "@final" final
- * removed InitRuntimeInterface, ExistsLoaderInterface, and SourceContextLoaderInterface
- * removed the "spaceless" tag
- * removed Twig\Environment::getBaseTemplateClass() and Twig\Environment::setBaseTemplateClass()
- * removed the "base_template_class" option on Twig\Environment
- * bumped minimum PHP version to 7.2
- * removed PSR-0 classes
diff --git a/vendor/twig/twig/LICENSE b/vendor/twig/twig/LICENSE
deleted file mode 100644
index fd8234e5..00000000
--- a/vendor/twig/twig/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2009-present by the Twig Team.
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
- * Neither the name of Twig nor the names of its contributors
- may be used to endorse or promote products derived from this software
- without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/twig/twig/README.rst b/vendor/twig/twig/README.rst
deleted file mode 100644
index 7bf8c673..00000000
--- a/vendor/twig/twig/README.rst
+++ /dev/null
@@ -1,23 +0,0 @@
-Twig, the flexible, fast, and secure template language for PHP
-==============================================================
-
-Twig is a template language for PHP.
-
-Twig uses a syntax similar to the Django and Jinja template languages which
-inspired the Twig runtime environment.
-
-Sponsors
---------
-
-.. raw:: html
-
-
-
-
-
-More Information
-----------------
-
-Read the `documentation`_ for more information.
-
-.. _documentation: https://twig.symfony.com/documentation
diff --git a/vendor/twig/twig/composer.json b/vendor/twig/twig/composer.json
deleted file mode 100644
index 57ba9296..00000000
--- a/vendor/twig/twig/composer.json
+++ /dev/null
@@ -1,53 +0,0 @@
-{
- "name": "twig/twig",
- "type": "library",
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "keywords": ["templating"],
- "homepage": "https://twig.symfony.com",
- "license": "BSD-3-Clause",
- "minimum-stability": "dev",
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Twig Team",
- "role": "Contributors"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- }
- ],
- "require": {
- "php": ">=7.2.5",
- "symfony/polyfill-php80": "^1.22",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-mbstring": "^1.3",
- "symfony/polyfill-ctype": "^1.8"
- },
- "require-dev": {
- "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0",
- "psr/container": "^1.0|^2.0"
- },
- "autoload": {
- "files": [
- "src/Resources/core.php",
- "src/Resources/debug.php",
- "src/Resources/escaper.php",
- "src/Resources/string_loader.php"
- ],
- "psr-4" : {
- "Twig\\" : "src/"
- }
- },
- "autoload-dev": {
- "psr-4" : {
- "Twig\\Tests\\" : "tests/"
- }
- }
-}
diff --git a/vendor/twig/twig/src/Attribute/YieldReady.php b/vendor/twig/twig/src/Attribute/YieldReady.php
deleted file mode 100644
index 335c4351..00000000
--- a/vendor/twig/twig/src/Attribute/YieldReady.php
+++ /dev/null
@@ -1,20 +0,0 @@
-
- */
-interface CacheInterface
-{
- /**
- * Generates a cache key for the given template class name.
- */
- public function generateKey(string $name, string $className): string;
-
- /**
- * Writes the compiled template to cache.
- *
- * @param string $content The template representation as a PHP class
- */
- public function write(string $key, string $content): void;
-
- /**
- * Loads a template from the cache.
- */
- public function load(string $key): void;
-
- /**
- * Returns the modification timestamp of a key.
- */
- public function getTimestamp(string $key): int;
-}
diff --git a/vendor/twig/twig/src/Cache/FilesystemCache.php b/vendor/twig/twig/src/Cache/FilesystemCache.php
deleted file mode 100644
index 4024adbd..00000000
--- a/vendor/twig/twig/src/Cache/FilesystemCache.php
+++ /dev/null
@@ -1,87 +0,0 @@
-
- */
-class FilesystemCache implements CacheInterface
-{
- public const FORCE_BYTECODE_INVALIDATION = 1;
-
- private $directory;
- private $options;
-
- public function __construct(string $directory, int $options = 0)
- {
- $this->directory = rtrim($directory, '\/').'/';
- $this->options = $options;
- }
-
- public function generateKey(string $name, string $className): string
- {
- $hash = hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', $className);
-
- return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
- }
-
- public function load(string $key): void
- {
- if (is_file($key)) {
- @include_once $key;
- }
- }
-
- public function write(string $key, string $content): void
- {
- $dir = \dirname($key);
- if (!is_dir($dir)) {
- if (false === @mkdir($dir, 0777, true)) {
- clearstatcache(true, $dir);
- if (!is_dir($dir)) {
- throw new \RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
- }
- }
- } elseif (!is_writable($dir)) {
- throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
- }
-
- $tmpFile = tempnam($dir, basename($key));
- if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
- @chmod($key, 0666 & ~umask());
-
- if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
- // Compile cached file into bytecode cache
- if (\function_exists('opcache_invalidate') && filter_var(\ini_get('opcache.enable'), \FILTER_VALIDATE_BOOLEAN)) {
- @opcache_invalidate($key, true);
- } elseif (\function_exists('apc_compile_file')) {
- apc_compile_file($key);
- }
- }
-
- return;
- }
-
- throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key));
- }
-
- public function getTimestamp(string $key): int
- {
- if (!is_file($key)) {
- return 0;
- }
-
- return (int) @filemtime($key);
- }
-}
diff --git a/vendor/twig/twig/src/Cache/NullCache.php b/vendor/twig/twig/src/Cache/NullCache.php
deleted file mode 100644
index 8d20d59d..00000000
--- a/vendor/twig/twig/src/Cache/NullCache.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
- */
-final class NullCache implements CacheInterface
-{
- public function generateKey(string $name, string $className): string
- {
- return '';
- }
-
- public function write(string $key, string $content): void
- {
- }
-
- public function load(string $key): void
- {
- }
-
- public function getTimestamp(string $key): int
- {
- return 0;
- }
-}
diff --git a/vendor/twig/twig/src/Compiler.php b/vendor/twig/twig/src/Compiler.php
deleted file mode 100644
index a2379d13..00000000
--- a/vendor/twig/twig/src/Compiler.php
+++ /dev/null
@@ -1,258 +0,0 @@
-
- */
-class Compiler
-{
- private $lastLine;
- private $source;
- private $indentation;
- private $env;
- private $debugInfo = [];
- private $sourceOffset;
- private $sourceLine;
- private $varNameSalt = 0;
- private $didUseEcho = false;
- private $didUseEchoStack = [];
-
- public function __construct(Environment $env)
- {
- $this->env = $env;
- }
-
- public function getEnvironment(): Environment
- {
- return $this->env;
- }
-
- public function getSource(): string
- {
- return $this->source;
- }
-
- /**
- * @return $this
- */
- public function reset(int $indentation = 0)
- {
- $this->lastLine = null;
- $this->source = '';
- $this->debugInfo = [];
- $this->sourceOffset = 0;
- // source code starts at 1 (as we then increment it when we encounter new lines)
- $this->sourceLine = 1;
- $this->indentation = $indentation;
- $this->varNameSalt = 0;
-
- return $this;
- }
-
- /**
- * @return $this
- */
- public function compile(Node $node, int $indentation = 0)
- {
- $this->reset($indentation);
- $this->didUseEchoStack[] = $this->didUseEcho;
-
- try {
- $this->didUseEcho = false;
- $node->compile($this);
-
- if ($this->didUseEcho) {
- trigger_deprecation('twig/twig', '3.9', 'Using "%s" is deprecated, use "yield" instead in "%s", then flag the class with #[YieldReady].', $this->didUseEcho, \get_class($node));
- }
-
- return $this;
- } finally {
- $this->didUseEcho = array_pop($this->didUseEchoStack);
- }
- }
-
- /**
- * @return $this
- */
- public function subcompile(Node $node, bool $raw = true)
- {
- if (!$raw) {
- $this->source .= str_repeat(' ', $this->indentation * 4);
- }
-
- $this->didUseEchoStack[] = $this->didUseEcho;
-
- try {
- $this->didUseEcho = false;
- $node->compile($this);
-
- if ($this->didUseEcho) {
- trigger_deprecation('twig/twig', '3.9', 'Using "%s" is deprecated, use "yield" instead in "%s", then flag the class with #[YieldReady].', $this->didUseEcho, \get_class($node));
- }
-
- return $this;
- } finally {
- $this->didUseEcho = array_pop($this->didUseEchoStack);
- }
- }
-
- /**
- * Adds a raw string to the compiled code.
- *
- * @return $this
- */
- public function raw(string $string)
- {
- $this->checkForEcho($string);
- $this->source .= $string;
-
- return $this;
- }
-
- /**
- * Writes a string to the compiled code by adding indentation.
- *
- * @return $this
- */
- public function write(...$strings)
- {
- foreach ($strings as $string) {
- $this->checkForEcho($string);
- $this->source .= str_repeat(' ', $this->indentation * 4).$string;
- }
-
- return $this;
- }
-
- /**
- * Adds a quoted string to the compiled code.
- *
- * @return $this
- */
- public function string(string $value)
- {
- $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
-
- return $this;
- }
-
- /**
- * Returns a PHP representation of a given value.
- *
- * @return $this
- */
- public function repr($value)
- {
- if (\is_int($value) || \is_float($value)) {
- if (false !== $locale = setlocale(\LC_NUMERIC, '0')) {
- setlocale(\LC_NUMERIC, 'C');
- }
-
- $this->raw(var_export($value, true));
-
- if (false !== $locale) {
- setlocale(\LC_NUMERIC, $locale);
- }
- } elseif (null === $value) {
- $this->raw('null');
- } elseif (\is_bool($value)) {
- $this->raw($value ? 'true' : 'false');
- } elseif (\is_array($value)) {
- $this->raw('array(');
- $first = true;
- foreach ($value as $key => $v) {
- if (!$first) {
- $this->raw(', ');
- }
- $first = false;
- $this->repr($key);
- $this->raw(' => ');
- $this->repr($v);
- }
- $this->raw(')');
- } else {
- $this->string($value);
- }
-
- return $this;
- }
-
- /**
- * @return $this
- */
- public function addDebugInfo(Node $node)
- {
- if ($node->getTemplateLine() != $this->lastLine) {
- $this->write(sprintf("// line %d\n", $node->getTemplateLine()));
-
- $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
- $this->sourceOffset = \strlen($this->source);
- $this->debugInfo[$this->sourceLine] = $node->getTemplateLine();
-
- $this->lastLine = $node->getTemplateLine();
- }
-
- return $this;
- }
-
- public function getDebugInfo(): array
- {
- ksort($this->debugInfo);
-
- return $this->debugInfo;
- }
-
- /**
- * @return $this
- */
- public function indent(int $step = 1)
- {
- $this->indentation += $step;
-
- return $this;
- }
-
- /**
- * @return $this
- *
- * @throws \LogicException When trying to outdent too much so the indentation would become negative
- */
- public function outdent(int $step = 1)
- {
- // can't outdent by more steps than the current indentation level
- if ($this->indentation < $step) {
- throw new \LogicException('Unable to call outdent() as the indentation would become negative.');
- }
-
- $this->indentation -= $step;
-
- return $this;
- }
-
- public function getVarName(): string
- {
- return sprintf('__internal_compile_%d', $this->varNameSalt++);
- }
-
- private function checkForEcho(string $string): void
- {
- if ($this->didUseEcho) {
- return;
- }
-
- $this->didUseEcho = preg_match('/^\s*+(echo|print)\b/', $string, $m) ? $m[1] : false;
- }
-}
diff --git a/vendor/twig/twig/src/Environment.php b/vendor/twig/twig/src/Environment.php
deleted file mode 100644
index b035249b..00000000
--- a/vendor/twig/twig/src/Environment.php
+++ /dev/null
@@ -1,879 +0,0 @@
-
- */
-class Environment
-{
- public const VERSION = '3.10.3';
- public const VERSION_ID = 301003;
- public const MAJOR_VERSION = 3;
- public const MINOR_VERSION = 10;
- public const RELEASE_VERSION = 3;
- public const EXTRA_VERSION = '';
-
- private $charset;
- private $loader;
- private $debug;
- private $autoReload;
- private $cache;
- private $lexer;
- private $parser;
- private $compiler;
- /** @var array */
- private $globals = [];
- private $resolvedGlobals;
- private $loadedTemplates;
- private $strictVariables;
- private $templateClassPrefix = '__TwigTemplate_';
- private $originalCache;
- private $extensionSet;
- private $runtimeLoaders = [];
- private $runtimes = [];
- private $optionsHash;
- /** @var bool */
- private $useYield;
- private $defaultRuntimeLoader;
-
- /**
- * Constructor.
- *
- * Available options:
- *
- * * debug: When set to true, it automatically set "auto_reload" to true as
- * well (default to false).
- *
- * * charset: The charset used by the templates (default to UTF-8).
- *
- * * cache: An absolute path where to store the compiled templates,
- * a \Twig\Cache\CacheInterface implementation,
- * or false to disable compilation cache (default).
- *
- * * auto_reload: Whether to reload the template if the original source changed.
- * If you don't provide the auto_reload option, it will be
- * determined automatically based on the debug value.
- *
- * * strict_variables: Whether to ignore invalid variables in templates
- * (default to false).
- *
- * * autoescape: Whether to enable auto-escaping (default to html):
- * * false: disable auto-escaping
- * * html, js: set the autoescaping to one of the supported strategies
- * * name: set the autoescaping strategy based on the template name extension
- * * PHP callback: a PHP callback that returns an escaping strategy based on the template "name"
- *
- * * optimizations: A flag that indicates which optimizations to apply
- * (default to -1 which means that all optimizations are enabled;
- * set it to 0 to disable).
- *
- * * use_yield: Enable templates to exclusively use "yield" instead of "echo"
- * (default to "false", but switch it to "true" when possible
- * as this will be the only supported mode in Twig 4.0)
- */
- public function __construct(LoaderInterface $loader, $options = [])
- {
- $this->setLoader($loader);
-
- $options = array_merge([
- 'debug' => false,
- 'charset' => 'UTF-8',
- 'strict_variables' => false,
- 'autoescape' => 'html',
- 'cache' => false,
- 'auto_reload' => null,
- 'optimizations' => -1,
- 'use_yield' => false,
- ], $options);
-
- $this->useYield = (bool) $options['use_yield'];
- $this->debug = (bool) $options['debug'];
- $this->setCharset($options['charset'] ?? 'UTF-8');
- $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
- $this->strictVariables = (bool) $options['strict_variables'];
- $this->setCache($options['cache']);
- $this->extensionSet = new ExtensionSet();
- $this->defaultRuntimeLoader = new FactoryRuntimeLoader([
- EscaperRuntime::class => function () { return new EscaperRuntime($this->charset); },
- ]);
-
- $this->addExtension(new CoreExtension());
- $escaperExt = new EscaperExtension($options['autoescape']);
- $escaperExt->setEnvironment($this, false);
- $this->addExtension($escaperExt);
- if (\PHP_VERSION_ID >= 80000) {
- $this->addExtension(new YieldNotReadyExtension($this->useYield));
- }
- $this->addExtension(new OptimizerExtension($options['optimizations']));
- }
-
- /**
- * @internal
- */
- public function useYield(): bool
- {
- return $this->useYield;
- }
-
- /**
- * Enables debugging mode.
- */
- public function enableDebug()
- {
- $this->debug = true;
- $this->updateOptionsHash();
- }
-
- /**
- * Disables debugging mode.
- */
- public function disableDebug()
- {
- $this->debug = false;
- $this->updateOptionsHash();
- }
-
- /**
- * Checks if debug mode is enabled.
- *
- * @return bool true if debug mode is enabled, false otherwise
- */
- public function isDebug()
- {
- return $this->debug;
- }
-
- /**
- * Enables the auto_reload option.
- */
- public function enableAutoReload()
- {
- $this->autoReload = true;
- }
-
- /**
- * Disables the auto_reload option.
- */
- public function disableAutoReload()
- {
- $this->autoReload = false;
- }
-
- /**
- * Checks if the auto_reload option is enabled.
- *
- * @return bool true if auto_reload is enabled, false otherwise
- */
- public function isAutoReload()
- {
- return $this->autoReload;
- }
-
- /**
- * Enables the strict_variables option.
- */
- public function enableStrictVariables()
- {
- $this->strictVariables = true;
- $this->updateOptionsHash();
- }
-
- /**
- * Disables the strict_variables option.
- */
- public function disableStrictVariables()
- {
- $this->strictVariables = false;
- $this->updateOptionsHash();
- }
-
- /**
- * Checks if the strict_variables option is enabled.
- *
- * @return bool true if strict_variables is enabled, false otherwise
- */
- public function isStrictVariables()
- {
- return $this->strictVariables;
- }
-
- /**
- * Gets the current cache implementation.
- *
- * @param bool $original Whether to return the original cache option or the real cache instance
- *
- * @return CacheInterface|string|false A Twig\Cache\CacheInterface implementation,
- * an absolute path to the compiled templates,
- * or false to disable cache
- */
- public function getCache($original = true)
- {
- return $original ? $this->originalCache : $this->cache;
- }
-
- /**
- * Sets the current cache implementation.
- *
- * @param CacheInterface|string|false $cache A Twig\Cache\CacheInterface implementation,
- * an absolute path to the compiled templates,
- * or false to disable cache
- */
- public function setCache($cache)
- {
- if (\is_string($cache)) {
- $this->originalCache = $cache;
- $this->cache = new FilesystemCache($cache, $this->autoReload ? FilesystemCache::FORCE_BYTECODE_INVALIDATION : 0);
- } elseif (false === $cache) {
- $this->originalCache = $cache;
- $this->cache = new NullCache();
- } elseif ($cache instanceof CacheInterface) {
- $this->originalCache = $this->cache = $cache;
- } else {
- throw new \LogicException('Cache can only be a string, false, or a \Twig\Cache\CacheInterface implementation.');
- }
- }
-
- /**
- * Gets the template class associated with the given string.
- *
- * The generated template class is based on the following parameters:
- *
- * * The cache key for the given template;
- * * The currently enabled extensions;
- * * PHP version;
- * * Twig version;
- * * Options with what environment was created.
- *
- * @param string $name The name for which to calculate the template class name
- * @param int|null $index The index if it is an embedded template
- *
- * @internal
- */
- public function getTemplateClass(string $name, ?int $index = null): string
- {
- $key = $this->getLoader()->getCacheKey($name).$this->optionsHash;
-
- return $this->templateClassPrefix.hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', $key).(null === $index ? '' : '___'.$index);
- }
-
- /**
- * Renders a template.
- *
- * @param string|TemplateWrapper $name The template name
- *
- * @throws LoaderError When the template cannot be found
- * @throws SyntaxError When an error occurred during compilation
- * @throws RuntimeError When an error occurred during rendering
- */
- public function render($name, array $context = []): string
- {
- return $this->load($name)->render($context);
- }
-
- /**
- * Displays a template.
- *
- * @param string|TemplateWrapper $name The template name
- *
- * @throws LoaderError When the template cannot be found
- * @throws SyntaxError When an error occurred during compilation
- * @throws RuntimeError When an error occurred during rendering
- */
- public function display($name, array $context = []): void
- {
- $this->load($name)->display($context);
- }
-
- /**
- * Loads a template.
- *
- * @param string|TemplateWrapper $name The template name
- *
- * @throws LoaderError When the template cannot be found
- * @throws RuntimeError When a previously generated cache is corrupted
- * @throws SyntaxError When an error occurred during compilation
- */
- public function load($name): TemplateWrapper
- {
- if ($name instanceof TemplateWrapper) {
- return $name;
- }
- if ($name instanceof Template) {
- trigger_deprecation('twig/twig', '3.9', 'Passing a "%s" instance to "%s" is deprecated.', self::class, __METHOD__);
-
- return $name;
- }
-
- return new TemplateWrapper($this, $this->loadTemplate($this->getTemplateClass($name), $name));
- }
-
- /**
- * Loads a template internal representation.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The template name
- * @param int|null $index The index if it is an embedded template
- *
- * @throws LoaderError When the template cannot be found
- * @throws RuntimeError When a previously generated cache is corrupted
- * @throws SyntaxError When an error occurred during compilation
- *
- * @internal
- */
- public function loadTemplate(string $cls, string $name, ?int $index = null): Template
- {
- $mainCls = $cls;
- if (null !== $index) {
- $cls .= '___'.$index;
- }
-
- if (isset($this->loadedTemplates[$cls])) {
- return $this->loadedTemplates[$cls];
- }
-
- if (!class_exists($cls, false)) {
- $key = $this->cache->generateKey($name, $mainCls);
-
- if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) {
- $this->cache->load($key);
- }
-
- if (!class_exists($cls, false)) {
- $source = $this->getLoader()->getSourceContext($name);
- $content = $this->compileSource($source);
- $this->cache->write($key, $content);
- $this->cache->load($key);
-
- if (!class_exists($mainCls, false)) {
- /* Last line of defense if either $this->bcWriteCacheFile was used,
- * $this->cache is implemented as a no-op or we have a race condition
- * where the cache was cleared between the above calls to write to and load from
- * the cache.
- */
- eval('?>'.$content);
- }
-
- if (!class_exists($cls, false)) {
- throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache might be corrupted.', $name, $index), -1, $source);
- }
- }
- }
-
- $this->extensionSet->initRuntime();
-
- return $this->loadedTemplates[$cls] = new $cls($this);
- }
-
- /**
- * Creates a template from source.
- *
- * This method should not be used as a generic way to load templates.
- *
- * @param string $template The template source
- * @param string|null $name An optional name of the template to be used in error messages
- *
- * @throws LoaderError When the template cannot be found
- * @throws SyntaxError When an error occurred during compilation
- */
- public function createTemplate(string $template, ?string $name = null): TemplateWrapper
- {
- $hash = hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', $template, false);
- if (null !== $name) {
- $name = sprintf('%s (string template %s)', $name, $hash);
- } else {
- $name = sprintf('__string_template__%s', $hash);
- }
-
- $loader = new ChainLoader([
- new ArrayLoader([$name => $template]),
- $current = $this->getLoader(),
- ]);
-
- $this->setLoader($loader);
- try {
- return new TemplateWrapper($this, $this->loadTemplate($this->getTemplateClass($name), $name));
- } finally {
- $this->setLoader($current);
- }
- }
-
- /**
- * Returns true if the template is still fresh.
- *
- * Besides checking the loader for freshness information,
- * this method also checks if the enabled extensions have
- * not changed.
- *
- * @param int $time The last modification time of the cached template
- */
- public function isTemplateFresh(string $name, int $time): bool
- {
- return $this->extensionSet->getLastModified() <= $time && $this->getLoader()->isFresh($name, $time);
- }
-
- /**
- * Tries to load a template consecutively from an array.
- *
- * Similar to load() but it also accepts instances of \Twig\TemplateWrapper
- * and an array of templates where each is tried to be loaded.
- *
- * @param string|TemplateWrapper|array $names A template or an array of templates to try consecutively
- *
- * @throws LoaderError When none of the templates can be found
- * @throws SyntaxError When an error occurred during compilation
- */
- public function resolveTemplate($names): TemplateWrapper
- {
- if (!\is_array($names)) {
- return $this->load($names);
- }
-
- $count = \count($names);
- foreach ($names as $name) {
- if ($name instanceof Template) {
- trigger_deprecation('twig/twig', '3.9', 'Passing a "%s" instance to "%s" is deprecated.', Template::class, __METHOD__);
-
- return new TemplateWrapper($this, $name);
- }
- if ($name instanceof TemplateWrapper) {
- return $name;
- }
-
- if (1 !== $count && !$this->getLoader()->exists($name)) {
- continue;
- }
-
- return $this->load($name);
- }
-
- throw new LoaderError(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
- }
-
- public function setLexer(Lexer $lexer)
- {
- $this->lexer = $lexer;
- }
-
- /**
- * @throws SyntaxError When the code is syntactically wrong
- */
- public function tokenize(Source $source): TokenStream
- {
- if (null === $this->lexer) {
- $this->lexer = new Lexer($this);
- }
-
- return $this->lexer->tokenize($source);
- }
-
- public function setParser(Parser $parser)
- {
- $this->parser = $parser;
- }
-
- /**
- * Converts a token stream to a node tree.
- *
- * @throws SyntaxError When the token stream is syntactically or semantically wrong
- */
- public function parse(TokenStream $stream): ModuleNode
- {
- if (null === $this->parser) {
- $this->parser = new Parser($this);
- }
-
- return $this->parser->parse($stream);
- }
-
- public function setCompiler(Compiler $compiler)
- {
- $this->compiler = $compiler;
- }
-
- /**
- * Compiles a node and returns the PHP code.
- */
- public function compile(Node $node): string
- {
- if (null === $this->compiler) {
- $this->compiler = new Compiler($this);
- }
-
- return $this->compiler->compile($node)->getSource();
- }
-
- /**
- * Compiles a template source code.
- *
- * @throws SyntaxError When there was an error during tokenizing, parsing or compiling
- */
- public function compileSource(Source $source): string
- {
- try {
- return $this->compile($this->parse($this->tokenize($source)));
- } catch (Error $e) {
- $e->setSourceContext($source);
- throw $e;
- } catch (\Exception $e) {
- throw new SyntaxError(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
- }
- }
-
- public function setLoader(LoaderInterface $loader)
- {
- $this->loader = $loader;
- }
-
- public function getLoader(): LoaderInterface
- {
- return $this->loader;
- }
-
- public function setCharset(string $charset)
- {
- if ('UTF8' === $charset = strtoupper($charset ?: '')) {
- // iconv on Windows requires "UTF-8" instead of "UTF8"
- $charset = 'UTF-8';
- }
-
- $this->charset = $charset;
- }
-
- public function getCharset(): string
- {
- return $this->charset;
- }
-
- public function hasExtension(string $class): bool
- {
- return $this->extensionSet->hasExtension($class);
- }
-
- public function addRuntimeLoader(RuntimeLoaderInterface $loader)
- {
- $this->runtimeLoaders[] = $loader;
- }
-
- /**
- * @template TExtension of ExtensionInterface
- *
- * @param class-string $class
- *
- * @return TExtension
- */
- public function getExtension(string $class): ExtensionInterface
- {
- return $this->extensionSet->getExtension($class);
- }
-
- /**
- * Returns the runtime implementation of a Twig element (filter/function/tag/test).
- *
- * @template TRuntime of object
- *
- * @param class-string $class A runtime class name
- *
- * @return TRuntime The runtime implementation
- *
- * @throws RuntimeError When the template cannot be found
- */
- public function getRuntime(string $class)
- {
- if (isset($this->runtimes[$class])) {
- return $this->runtimes[$class];
- }
-
- foreach ($this->runtimeLoaders as $loader) {
- if (null !== $runtime = $loader->load($class)) {
- return $this->runtimes[$class] = $runtime;
- }
- }
-
- if (null !== $runtime = $this->defaultRuntimeLoader->load($class)) {
- return $this->runtimes[$class] = $runtime;
- }
-
- throw new RuntimeError(sprintf('Unable to load the "%s" runtime.', $class));
- }
-
- public function addExtension(ExtensionInterface $extension)
- {
- $this->extensionSet->addExtension($extension);
- $this->updateOptionsHash();
- }
-
- /**
- * @param ExtensionInterface[] $extensions An array of extensions
- */
- public function setExtensions(array $extensions)
- {
- $this->extensionSet->setExtensions($extensions);
- $this->updateOptionsHash();
- }
-
- /**
- * @return ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on)
- */
- public function getExtensions(): array
- {
- return $this->extensionSet->getExtensions();
- }
-
- public function addTokenParser(TokenParserInterface $parser)
- {
- $this->extensionSet->addTokenParser($parser);
- }
-
- /**
- * @return TokenParserInterface[]
- *
- * @internal
- */
- public function getTokenParsers(): array
- {
- return $this->extensionSet->getTokenParsers();
- }
-
- /**
- * @internal
- */
- public function getTokenParser(string $name): ?TokenParserInterface
- {
- return $this->extensionSet->getTokenParser($name);
- }
-
- public function registerUndefinedTokenParserCallback(callable $callable): void
- {
- $this->extensionSet->registerUndefinedTokenParserCallback($callable);
- }
-
- public function addNodeVisitor(NodeVisitorInterface $visitor)
- {
- $this->extensionSet->addNodeVisitor($visitor);
- }
-
- /**
- * @return NodeVisitorInterface[]
- *
- * @internal
- */
- public function getNodeVisitors(): array
- {
- return $this->extensionSet->getNodeVisitors();
- }
-
- public function addFilter(TwigFilter $filter)
- {
- $this->extensionSet->addFilter($filter);
- }
-
- /**
- * @internal
- */
- public function getFilter(string $name): ?TwigFilter
- {
- return $this->extensionSet->getFilter($name);
- }
-
- public function registerUndefinedFilterCallback(callable $callable): void
- {
- $this->extensionSet->registerUndefinedFilterCallback($callable);
- }
-
- /**
- * Gets the registered Filters.
- *
- * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback.
- *
- * @return TwigFilter[]
- *
- * @see registerUndefinedFilterCallback
- *
- * @internal
- */
- public function getFilters(): array
- {
- return $this->extensionSet->getFilters();
- }
-
- public function addTest(TwigTest $test)
- {
- $this->extensionSet->addTest($test);
- }
-
- /**
- * @return TwigTest[]
- *
- * @internal
- */
- public function getTests(): array
- {
- return $this->extensionSet->getTests();
- }
-
- /**
- * @internal
- */
- public function getTest(string $name): ?TwigTest
- {
- return $this->extensionSet->getTest($name);
- }
-
- public function addFunction(TwigFunction $function)
- {
- $this->extensionSet->addFunction($function);
- }
-
- /**
- * @internal
- */
- public function getFunction(string $name): ?TwigFunction
- {
- return $this->extensionSet->getFunction($name);
- }
-
- public function registerUndefinedFunctionCallback(callable $callable): void
- {
- $this->extensionSet->registerUndefinedFunctionCallback($callable);
- }
-
- /**
- * Gets registered functions.
- *
- * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback.
- *
- * @return TwigFunction[]
- *
- * @see registerUndefinedFunctionCallback
- *
- * @internal
- */
- public function getFunctions(): array
- {
- return $this->extensionSet->getFunctions();
- }
-
- /**
- * Registers a Global.
- *
- * New globals can be added before compiling or rendering a template;
- * but after, you can only update existing globals.
- *
- * @param mixed $value The global value
- */
- public function addGlobal(string $name, $value)
- {
- if ($this->extensionSet->isInitialized() && !\array_key_exists($name, $this->getGlobals())) {
- throw new \LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
- }
-
- if (null !== $this->resolvedGlobals) {
- $this->resolvedGlobals[$name] = $value;
- } else {
- $this->globals[$name] = $value;
- }
- }
-
- /**
- * @internal
- *
- * @return array
- */
- public function getGlobals(): array
- {
- if ($this->extensionSet->isInitialized()) {
- if (null === $this->resolvedGlobals) {
- $this->resolvedGlobals = array_merge($this->extensionSet->getGlobals(), $this->globals);
- }
-
- return $this->resolvedGlobals;
- }
-
- return array_merge($this->extensionSet->getGlobals(), $this->globals);
- }
-
- public function mergeGlobals(array $context): array
- {
- // we don't use array_merge as the context being generally
- // bigger than globals, this code is faster.
- foreach ($this->getGlobals() as $key => $value) {
- if (!\array_key_exists($key, $context)) {
- $context[$key] = $value;
- }
- }
-
- return $context;
- }
-
- /**
- * @internal
- *
- * @return array}>
- */
- public function getUnaryOperators(): array
- {
- return $this->extensionSet->getUnaryOperators();
- }
-
- /**
- * @internal
- *
- * @return array, associativity: ExpressionParser::OPERATOR_*}>
- */
- public function getBinaryOperators(): array
- {
- return $this->extensionSet->getBinaryOperators();
- }
-
- private function updateOptionsHash(): void
- {
- $this->optionsHash = implode(':', [
- $this->extensionSet->getSignature(),
- \PHP_MAJOR_VERSION,
- \PHP_MINOR_VERSION,
- self::VERSION,
- (int) $this->debug,
- (int) $this->strictVariables,
- $this->useYield ? '1' : '0',
- ]);
- }
-}
diff --git a/vendor/twig/twig/src/Error/Error.php b/vendor/twig/twig/src/Error/Error.php
deleted file mode 100644
index 0df21359..00000000
--- a/vendor/twig/twig/src/Error/Error.php
+++ /dev/null
@@ -1,227 +0,0 @@
-
- */
-class Error extends \Exception
-{
- private $lineno;
- private $name;
- private $rawMessage;
- private $sourcePath;
- private $sourceCode;
-
- /**
- * Constructor.
- *
- * By default, automatic guessing is enabled.
- *
- * @param string $message The error message
- * @param int $lineno The template line where the error occurred
- * @param Source|null $source The source context where the error occurred
- */
- public function __construct(string $message, int $lineno = -1, ?Source $source = null, ?\Throwable $previous = null)
- {
- parent::__construct('', 0, $previous);
-
- if (null === $source) {
- $name = null;
- } else {
- $name = $source->getName();
- $this->sourceCode = $source->getCode();
- $this->sourcePath = $source->getPath();
- }
-
- $this->lineno = $lineno;
- $this->name = $name;
- $this->rawMessage = $message;
- $this->updateRepr();
- }
-
- public function getRawMessage(): string
- {
- return $this->rawMessage;
- }
-
- public function getTemplateLine(): int
- {
- return $this->lineno;
- }
-
- public function setTemplateLine(int $lineno): void
- {
- $this->lineno = $lineno;
-
- $this->updateRepr();
- }
-
- public function getSourceContext(): ?Source
- {
- return $this->name ? new Source($this->sourceCode, $this->name, $this->sourcePath) : null;
- }
-
- public function setSourceContext(?Source $source = null): void
- {
- if (null === $source) {
- $this->sourceCode = $this->name = $this->sourcePath = null;
- } else {
- $this->sourceCode = $source->getCode();
- $this->name = $source->getName();
- $this->sourcePath = $source->getPath();
- }
-
- $this->updateRepr();
- }
-
- public function guess(): void
- {
- $this->guessTemplateInfo();
- $this->updateRepr();
- }
-
- public function appendMessage($rawMessage): void
- {
- $this->rawMessage .= $rawMessage;
- $this->updateRepr();
- }
-
- private function updateRepr(): void
- {
- $this->message = $this->rawMessage;
-
- if ($this->sourcePath && $this->lineno > 0) {
- $this->file = $this->sourcePath;
- $this->line = $this->lineno;
-
- return;
- }
-
- $dot = false;
- if (str_ends_with($this->message, '.')) {
- $this->message = substr($this->message, 0, -1);
- $dot = true;
- }
-
- $questionMark = false;
- if (str_ends_with($this->message, '?')) {
- $this->message = substr($this->message, 0, -1);
- $questionMark = true;
- }
-
- if ($this->name) {
- if (\is_string($this->name) || (\is_object($this->name) && method_exists($this->name, '__toString'))) {
- $name = sprintf('"%s"', $this->name);
- } else {
- $name = json_encode($this->name);
- }
- $this->message .= sprintf(' in %s', $name);
- }
-
- if ($this->lineno && $this->lineno >= 0) {
- $this->message .= sprintf(' at line %d', $this->lineno);
- }
-
- if ($dot) {
- $this->message .= '.';
- }
-
- if ($questionMark) {
- $this->message .= '?';
- }
- }
-
- private function guessTemplateInfo(): void
- {
- $template = null;
- $templateClass = null;
-
- $backtrace = debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS | \DEBUG_BACKTRACE_PROVIDE_OBJECT);
- foreach ($backtrace as $trace) {
- if (isset($trace['object']) && $trace['object'] instanceof Template) {
- $currentClass = \get_class($trace['object']);
- $isEmbedContainer = null === $templateClass ? false : str_starts_with($templateClass, $currentClass);
- if (null === $this->name || ($this->name == $trace['object']->getTemplateName() && !$isEmbedContainer)) {
- $template = $trace['object'];
- $templateClass = \get_class($trace['object']);
- }
- }
- }
-
- // update template name
- if (null !== $template && null === $this->name) {
- $this->name = $template->getTemplateName();
- }
-
- // update template path if any
- if (null !== $template && null === $this->sourcePath) {
- $src = $template->getSourceContext();
- $this->sourceCode = $src->getCode();
- $this->sourcePath = $src->getPath();
- }
-
- if (null === $template || $this->lineno > -1) {
- return;
- }
-
- $r = new \ReflectionObject($template);
- $file = $r->getFileName();
-
- $exceptions = [$e = $this];
- while ($e = $e->getPrevious()) {
- $exceptions[] = $e;
- }
-
- while ($e = array_pop($exceptions)) {
- $traces = $e->getTrace();
- array_unshift($traces, ['file' => $e->getFile(), 'line' => $e->getLine()]);
-
- while ($trace = array_shift($traces)) {
- if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) {
- continue;
- }
-
- foreach ($template->getDebugInfo() as $codeLine => $templateLine) {
- if ($codeLine <= $trace['line']) {
- // update template line
- $this->lineno = $templateLine;
-
- return;
- }
- }
- }
- }
- }
-}
diff --git a/vendor/twig/twig/src/Error/LoaderError.php b/vendor/twig/twig/src/Error/LoaderError.php
deleted file mode 100644
index 7c8c23c1..00000000
--- a/vendor/twig/twig/src/Error/LoaderError.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-class LoaderError extends Error
-{
-}
diff --git a/vendor/twig/twig/src/Error/RuntimeError.php b/vendor/twig/twig/src/Error/RuntimeError.php
deleted file mode 100644
index f6b84766..00000000
--- a/vendor/twig/twig/src/Error/RuntimeError.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
- */
-class RuntimeError extends Error
-{
-}
diff --git a/vendor/twig/twig/src/Error/SyntaxError.php b/vendor/twig/twig/src/Error/SyntaxError.php
deleted file mode 100644
index 77c437c6..00000000
--- a/vendor/twig/twig/src/Error/SyntaxError.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- */
-class SyntaxError extends Error
-{
- /**
- * Tweaks the error message to include suggestions.
- *
- * @param string $name The original name of the item that does not exist
- * @param array $items An array of possible items
- */
- public function addSuggestions(string $name, array $items): void
- {
- $alternatives = [];
- foreach ($items as $item) {
- $lev = levenshtein($name, $item);
- if ($lev <= \strlen($name) / 3 || str_contains($item, $name)) {
- $alternatives[$item] = $lev;
- }
- }
-
- if (!$alternatives) {
- return;
- }
-
- asort($alternatives);
-
- $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', array_keys($alternatives))));
- }
-}
diff --git a/vendor/twig/twig/src/ExpressionParser.php b/vendor/twig/twig/src/ExpressionParser.php
deleted file mode 100644
index 6839bc93..00000000
--- a/vendor/twig/twig/src/ExpressionParser.php
+++ /dev/null
@@ -1,841 +0,0 @@
-
- */
-class ExpressionParser
-{
- public const OPERATOR_LEFT = 1;
- public const OPERATOR_RIGHT = 2;
-
- private $parser;
- private $env;
- /** @var array}> */
- private $unaryOperators;
- /** @var array, associativity: self::OPERATOR_*}> */
- private $binaryOperators;
-
- public function __construct(Parser $parser, Environment $env)
- {
- $this->parser = $parser;
- $this->env = $env;
- $this->unaryOperators = $env->getUnaryOperators();
- $this->binaryOperators = $env->getBinaryOperators();
- }
-
- public function parseExpression($precedence = 0, $allowArrow = false)
- {
- if ($allowArrow && $arrow = $this->parseArrow()) {
- return $arrow;
- }
-
- $expr = $this->getPrimary();
- $token = $this->parser->getCurrentToken();
- while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
- $op = $this->binaryOperators[$token->getValue()];
- $this->parser->getStream()->next();
-
- if ('is not' === $token->getValue()) {
- $expr = $this->parseNotTestExpression($expr);
- } elseif ('is' === $token->getValue()) {
- $expr = $this->parseTestExpression($expr);
- } elseif (isset($op['callable'])) {
- $expr = $op['callable']($this->parser, $expr);
- } else {
- $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence'], true);
- $class = $op['class'];
- $expr = new $class($expr, $expr1, $token->getLine());
- }
-
- $token = $this->parser->getCurrentToken();
- }
-
- if (0 === $precedence) {
- return $this->parseConditionalExpression($expr);
- }
-
- return $expr;
- }
-
- /**
- * @return ArrowFunctionExpression|null
- */
- private function parseArrow()
- {
- $stream = $this->parser->getStream();
-
- // short array syntax (one argument, no parentheses)?
- if ($stream->look(1)->test(/* Token::ARROW_TYPE */ 12)) {
- $line = $stream->getCurrent()->getLine();
- $token = $stream->expect(/* Token::NAME_TYPE */ 5);
- $names = [new AssignNameExpression($token->getValue(), $token->getLine())];
- $stream->expect(/* Token::ARROW_TYPE */ 12);
-
- return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
- }
-
- // first, determine if we are parsing an arrow function by finding => (long form)
- $i = 0;
- if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- return null;
- }
- ++$i;
- while (true) {
- // variable name
- ++$i;
- if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- ++$i;
- }
- if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) {
- return null;
- }
- ++$i;
- if (!$stream->look($i)->test(/* Token::ARROW_TYPE */ 12)) {
- return null;
- }
-
- // yes, let's parse it properly
- $token = $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '(');
- $line = $token->getLine();
-
- $names = [];
- while (true) {
- $token = $stream->expect(/* Token::NAME_TYPE */ 5);
- $names[] = new AssignNameExpression($token->getValue(), $token->getLine());
-
- if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- }
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')');
- $stream->expect(/* Token::ARROW_TYPE */ 12);
-
- return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
- }
-
- private function getPrimary(): AbstractExpression
- {
- $token = $this->parser->getCurrentToken();
-
- if ($this->isUnary($token)) {
- $operator = $this->unaryOperators[$token->getValue()];
- $this->parser->getStream()->next();
- $expr = $this->parseExpression($operator['precedence']);
- $class = $operator['class'];
-
- return $this->parsePostfixExpression(new $class($expr, $token->getLine()));
- } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- $this->parser->getStream()->next();
- $expr = $this->parseExpression();
- $this->parser->getStream()->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'An opened parenthesis is not properly closed');
-
- return $this->parsePostfixExpression($expr);
- }
-
- return $this->parsePrimaryExpression();
- }
-
- private function parseConditionalExpression($expr): AbstractExpression
- {
- while ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, '?')) {
- if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
- $expr2 = $this->parseExpression();
- if ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
- // Ternary operator (expr ? expr2 : expr3)
- $expr3 = $this->parseExpression();
- } else {
- // Ternary without else (expr ? expr2)
- $expr3 = new ConstantExpression('', $this->parser->getCurrentToken()->getLine());
- }
- } else {
- // Ternary without then (expr ?: expr3)
- $expr2 = $expr;
- $expr3 = $this->parseExpression();
- }
-
- $expr = new ConditionalExpression($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
- }
-
- return $expr;
- }
-
- private function isUnary(Token $token): bool
- {
- return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->unaryOperators[$token->getValue()]);
- }
-
- private function isBinary(Token $token): bool
- {
- return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->binaryOperators[$token->getValue()]);
- }
-
- public function parsePrimaryExpression()
- {
- $token = $this->parser->getCurrentToken();
- switch ($token->getType()) {
- case /* Token::NAME_TYPE */ 5:
- $this->parser->getStream()->next();
- switch ($token->getValue()) {
- case 'true':
- case 'TRUE':
- $node = new ConstantExpression(true, $token->getLine());
- break;
-
- case 'false':
- case 'FALSE':
- $node = new ConstantExpression(false, $token->getLine());
- break;
-
- case 'none':
- case 'NONE':
- case 'null':
- case 'NULL':
- $node = new ConstantExpression(null, $token->getLine());
- break;
-
- default:
- if ('(' === $this->parser->getCurrentToken()->getValue()) {
- $node = $this->getFunctionNode($token->getValue(), $token->getLine());
- } else {
- $node = new NameExpression($token->getValue(), $token->getLine());
- }
- }
- break;
-
- case /* Token::NUMBER_TYPE */ 6:
- $this->parser->getStream()->next();
- $node = new ConstantExpression($token->getValue(), $token->getLine());
- break;
-
- case /* Token::STRING_TYPE */ 7:
- case /* Token::INTERPOLATION_START_TYPE */ 10:
- $node = $this->parseStringExpression();
- break;
-
- case /* Token::OPERATOR_TYPE */ 8:
- if (preg_match(Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) {
- // in this context, string operators are variable names
- $this->parser->getStream()->next();
- $node = new NameExpression($token->getValue(), $token->getLine());
- break;
- }
-
- if (isset($this->unaryOperators[$token->getValue()])) {
- $class = $this->unaryOperators[$token->getValue()]['class'];
- if (!\in_array($class, [NegUnary::class, PosUnary::class])) {
- throw new SyntaxError(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- }
-
- $this->parser->getStream()->next();
- $expr = $this->parsePrimaryExpression();
-
- $node = new $class($expr, $token->getLine());
- break;
- }
-
- // no break
- default:
- if ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '[')) {
- $node = $this->parseArrayExpression();
- } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '{')) {
- $node = $this->parseHashExpression();
- } elseif ($token->test(/* Token::OPERATOR_TYPE */ 8, '=') && ('==' === $this->parser->getStream()->look(-1)->getValue() || '!=' === $this->parser->getStream()->look(-1)->getValue())) {
- throw new SyntaxError(sprintf('Unexpected operator of value "%s". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead.', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- } else {
- throw new SyntaxError(sprintf('Unexpected token "%s" of value "%s".', Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- }
- }
-
- return $this->parsePostfixExpression($node);
- }
-
- public function parseStringExpression()
- {
- $stream = $this->parser->getStream();
-
- $nodes = [];
- // a string cannot be followed by another string in a single expression
- $nextCanBeString = true;
- while (true) {
- if ($nextCanBeString && $token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) {
- $nodes[] = new ConstantExpression($token->getValue(), $token->getLine());
- $nextCanBeString = false;
- } elseif ($stream->nextIf(/* Token::INTERPOLATION_START_TYPE */ 10)) {
- $nodes[] = $this->parseExpression();
- $stream->expect(/* Token::INTERPOLATION_END_TYPE */ 11);
- $nextCanBeString = true;
- } else {
- break;
- }
- }
-
- $expr = array_shift($nodes);
- foreach ($nodes as $node) {
- $expr = new ConcatBinary($expr, $node, $node->getTemplateLine());
- }
-
- return $expr;
- }
-
- public function parseArrayExpression()
- {
- $stream = $this->parser->getStream();
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '[', 'An array element was expected');
-
- $node = new ArrayExpression([], $stream->getCurrent()->getLine());
- $first = true;
- while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
- if (!$first) {
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'An array element must be followed by a comma');
-
- // trailing ,?
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
- break;
- }
- }
- $first = false;
-
- if ($stream->test(/* Token::SPREAD_TYPE */ 13)) {
- $stream->next();
- $expr = $this->parseExpression();
- $expr->setAttribute('spread', true);
- $node->addElement($expr);
- } else {
- $node->addElement($this->parseExpression());
- }
- }
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']', 'An opened array is not properly closed');
-
- return $node;
- }
-
- public function parseHashExpression()
- {
- $stream = $this->parser->getStream();
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '{', 'A hash element was expected');
-
- $node = new ArrayExpression([], $stream->getCurrent()->getLine());
- $first = true;
- while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) {
- if (!$first) {
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'A hash value must be followed by a comma');
-
- // trailing ,?
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) {
- break;
- }
- }
- $first = false;
-
- if ($stream->test(/* Token::SPREAD_TYPE */ 13)) {
- $stream->next();
- $value = $this->parseExpression();
- $value->setAttribute('spread', true);
- $node->addElement($value);
- continue;
- }
-
- // a hash key can be:
- //
- // * a number -- 12
- // * a string -- 'a'
- // * a name, which is equivalent to a string -- a
- // * an expression, which must be enclosed in parentheses -- (1 + 2)
- if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) {
- $key = new ConstantExpression($token->getValue(), $token->getLine());
-
- // {a} is a shortcut for {a:a}
- if ($stream->test(Token::PUNCTUATION_TYPE, [',', '}'])) {
- $value = new NameExpression($key->getAttribute('value'), $key->getTemplateLine());
- $node->addElement($value, $key);
- continue;
- }
- } elseif (($token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) || $token = $stream->nextIf(/* Token::NUMBER_TYPE */ 6)) {
- $key = new ConstantExpression($token->getValue(), $token->getLine());
- } elseif ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- $key = $this->parseExpression();
- } else {
- $current = $stream->getCurrent();
-
- throw new SyntaxError(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $stream->getSourceContext());
- }
-
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ':', 'A hash key must be followed by a colon (:)');
- $value = $this->parseExpression();
-
- $node->addElement($value, $key);
- }
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '}', 'An opened hash is not properly closed');
-
- return $node;
- }
-
- public function parsePostfixExpression($node)
- {
- while (true) {
- $token = $this->parser->getCurrentToken();
- if (/* Token::PUNCTUATION_TYPE */ 9 == $token->getType()) {
- if ('.' == $token->getValue() || '[' == $token->getValue()) {
- $node = $this->parseSubscriptExpression($node);
- } elseif ('|' == $token->getValue()) {
- $node = $this->parseFilterExpression($node);
- } else {
- break;
- }
- } else {
- break;
- }
- }
-
- return $node;
- }
-
- public function getFunctionNode($name, $line)
- {
- switch ($name) {
- case 'parent':
- $this->parseArguments();
- if (!\count($this->parser->getBlockStack())) {
- throw new SyntaxError('Calling "parent" outside a block is forbidden.', $line, $this->parser->getStream()->getSourceContext());
- }
-
- if (!$this->parser->getParent() && !$this->parser->hasTraits()) {
- throw new SyntaxError('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new ParentExpression($this->parser->peekBlockStack(), $line);
- case 'block':
- $args = $this->parseArguments();
- if (\count($args) < 1) {
- throw new SyntaxError('The "block" function takes one argument (the block name).', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new BlockReferenceExpression($args->getNode('0'), \count($args) > 1 ? $args->getNode('1') : null, $line);
- case 'attribute':
- $args = $this->parseArguments();
- if (\count($args) < 2) {
- throw new SyntaxError('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new GetAttrExpression($args->getNode('0'), $args->getNode('1'), \count($args) > 2 ? $args->getNode('2') : null, Template::ANY_CALL, $line);
- default:
- if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) {
- $arguments = new ArrayExpression([], $line);
- foreach ($this->parseArguments() as $n) {
- $arguments->addElement($n);
- }
-
- $node = new MethodCallExpression($alias['node'], $alias['name'], $arguments, $line);
- $node->setAttribute('safe', true);
-
- return $node;
- }
-
- $args = $this->parseArguments(true);
- $class = $this->getFunctionNodeClass($name, $line);
-
- return new $class($name, $args, $line);
- }
- }
-
- public function parseSubscriptExpression($node)
- {
- $stream = $this->parser->getStream();
- $token = $stream->next();
- $lineno = $token->getLine();
- $arguments = new ArrayExpression([], $lineno);
- $type = Template::ANY_CALL;
- if ('.' == $token->getValue()) {
- $token = $stream->next();
- if (
- /* Token::NAME_TYPE */ 5 == $token->getType()
- ||
- /* Token::NUMBER_TYPE */ 6 == $token->getType()
- ||
- (/* Token::OPERATOR_TYPE */ 8 == $token->getType() && preg_match(Lexer::REGEX_NAME, $token->getValue()))
- ) {
- $arg = new ConstantExpression($token->getValue(), $lineno);
-
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- $type = Template::METHOD_CALL;
- foreach ($this->parseArguments() as $n) {
- $arguments->addElement($n);
- }
- }
- } else {
- throw new SyntaxError(sprintf('Expected name or number, got value "%s" of type %s.', $token->getValue(), Token::typeToEnglish($token->getType())), $lineno, $stream->getSourceContext());
- }
-
- if ($node instanceof NameExpression && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
- $name = $arg->getAttribute('value');
-
- $node = new MethodCallExpression($node, 'macro_'.$name, $arguments, $lineno);
- $node->setAttribute('safe', true);
-
- return $node;
- }
- } else {
- $type = Template::ARRAY_CALL;
-
- // slice?
- $slice = false;
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
- $slice = true;
- $arg = new ConstantExpression(0, $token->getLine());
- } else {
- $arg = $this->parseExpression();
- }
-
- if ($stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
- $slice = true;
- }
-
- if ($slice) {
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
- $length = new ConstantExpression(null, $token->getLine());
- } else {
- $length = $this->parseExpression();
- }
-
- $class = $this->getFilterNodeClass('slice', $token->getLine());
- $arguments = new Node([$arg, $length]);
- $filter = new $class($node, new ConstantExpression('slice', $token->getLine()), $arguments, $token->getLine());
-
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']');
-
- return $filter;
- }
-
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']');
- }
-
- return new GetAttrExpression($node, $arg, $arguments, $type, $lineno);
- }
-
- public function parseFilterExpression($node)
- {
- $this->parser->getStream()->next();
-
- return $this->parseFilterExpressionRaw($node);
- }
-
- public function parseFilterExpressionRaw($node, $tag = null)
- {
- while (true) {
- $token = $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5);
-
- $name = new ConstantExpression($token->getValue(), $token->getLine());
- if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- $arguments = new Node();
- } else {
- $arguments = $this->parseArguments(true, false, true);
- }
-
- $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
-
- $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
-
- if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '|')) {
- break;
- }
-
- $this->parser->getStream()->next();
- }
-
- return $node;
- }
-
- /**
- * Parses arguments.
- *
- * @param bool $namedArguments Whether to allow named arguments or not
- * @param bool $definition Whether we are parsing arguments for a function definition
- *
- * @return Node
- *
- * @throws SyntaxError
- */
- public function parseArguments($namedArguments = false, $definition = false, $allowArrow = false)
- {
- $args = [];
- $stream = $this->parser->getStream();
-
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '(', 'A list of arguments must begin with an opening parenthesis');
- while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) {
- if (!empty($args)) {
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'Arguments must be separated by a comma');
-
- // if the comma above was a trailing comma, early exit the argument parse loop
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) {
- break;
- }
- }
-
- if ($definition) {
- $token = $stream->expect(/* Token::NAME_TYPE */ 5, null, 'An argument must be a name');
- $value = new NameExpression($token->getValue(), $this->parser->getCurrentToken()->getLine());
- } else {
- $value = $this->parseExpression(0, $allowArrow);
- }
-
- $name = null;
- if ($namedArguments && $token = $stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) {
- if (!$value instanceof NameExpression) {
- throw new SyntaxError(sprintf('A parameter name must be a string, "%s" given.', \get_class($value)), $token->getLine(), $stream->getSourceContext());
- }
- $name = $value->getAttribute('name');
-
- if ($definition) {
- $value = $this->parsePrimaryExpression();
-
- if (!$this->checkConstantExpression($value)) {
- throw new SyntaxError('A default value for an argument must be a constant (a boolean, a string, a number, or an array).', $token->getLine(), $stream->getSourceContext());
- }
- } else {
- $value = $this->parseExpression(0, $allowArrow);
- }
- }
-
- if ($definition) {
- if (null === $name) {
- $name = $value->getAttribute('name');
- $value = new ConstantExpression(null, $this->parser->getCurrentToken()->getLine());
- }
- $args[$name] = $value;
- } else {
- if (null === $name) {
- $args[] = $value;
- } else {
- $args[$name] = $value;
- }
- }
- }
- $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'A list of arguments must be closed by a parenthesis');
-
- return new Node($args);
- }
-
- public function parseAssignmentExpression()
- {
- $stream = $this->parser->getStream();
- $targets = [];
- while (true) {
- $token = $this->parser->getCurrentToken();
- if ($stream->test(/* Token::OPERATOR_TYPE */ 8) && preg_match(Lexer::REGEX_NAME, $token->getValue())) {
- // in this context, string operators are variable names
- $this->parser->getStream()->next();
- } else {
- $stream->expect(/* Token::NAME_TYPE */ 5, null, 'Only variables can be assigned to');
- }
- $value = $token->getValue();
- if (\in_array(strtr($value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), ['true', 'false', 'none', 'null'])) {
- throw new SyntaxError(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext());
- }
- $targets[] = new AssignNameExpression($value, $token->getLine());
-
- if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- }
-
- return new Node($targets);
- }
-
- public function parseMultitargetExpression()
- {
- $targets = [];
- while (true) {
- $targets[] = $this->parseExpression();
- if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- }
-
- return new Node($targets);
- }
-
- private function parseNotTestExpression(Node $node): NotUnary
- {
- return new NotUnary($this->parseTestExpression($node), $this->parser->getCurrentToken()->getLine());
- }
-
- private function parseTestExpression(Node $node): TestExpression
- {
- $stream = $this->parser->getStream();
- [$name, $test] = $this->getTest($node->getTemplateLine());
-
- $class = $this->getTestNodeClass($test);
- $arguments = null;
- if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
- $arguments = $this->parseArguments(true);
- } elseif ($test->hasOneMandatoryArgument()) {
- $arguments = new Node([0 => $this->parsePrimaryExpression()]);
- }
-
- if ('defined' === $name && $node instanceof NameExpression && null !== $alias = $this->parser->getImportedSymbol('function', $node->getAttribute('name'))) {
- $node = new MethodCallExpression($alias['node'], $alias['name'], new ArrayExpression([], $node->getTemplateLine()), $node->getTemplateLine());
- $node->setAttribute('safe', true);
- }
-
- return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
- }
-
- private function getTest(int $line): array
- {
- $stream = $this->parser->getStream();
- $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
-
- if ($test = $this->env->getTest($name)) {
- return [$name, $test];
- }
-
- if ($stream->test(/* Token::NAME_TYPE */ 5)) {
- // try 2-words tests
- $name = $name.' '.$this->parser->getCurrentToken()->getValue();
-
- if ($test = $this->env->getTest($name)) {
- $stream->next();
-
- return [$name, $test];
- }
- }
-
- $e = new SyntaxError(sprintf('Unknown "%s" test.', $name), $line, $stream->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getTests()));
-
- throw $e;
- }
-
- private function getTestNodeClass(TwigTest $test): string
- {
- if ($test->isDeprecated()) {
- $stream = $this->parser->getStream();
- $message = sprintf('Twig Test "%s" is deprecated', $test->getName());
-
- if ($test->getDeprecatedVersion()) {
- $message .= sprintf(' since version %s', $test->getDeprecatedVersion());
- }
- if ($test->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $test->getAlternative());
- }
- $src = $stream->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $stream->getCurrent()->getLine());
-
- @trigger_error($message, \E_USER_DEPRECATED);
- }
-
- return $test->getNodeClass();
- }
-
- private function getFunctionNodeClass(string $name, int $line): string
- {
- if (!$function = $this->env->getFunction($name)) {
- $e = new SyntaxError(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getStream()->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getFunctions()));
-
- throw $e;
- }
-
- if ($function->isDeprecated()) {
- $message = sprintf('Twig Function "%s" is deprecated', $function->getName());
- if ($function->getDeprecatedVersion()) {
- $message .= sprintf(' since version %s', $function->getDeprecatedVersion());
- }
- if ($function->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $function->getAlternative());
- }
- $src = $this->parser->getStream()->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
-
- @trigger_error($message, \E_USER_DEPRECATED);
- }
-
- return $function->getNodeClass();
- }
-
- private function getFilterNodeClass(string $name, int $line): string
- {
- if (!$filter = $this->env->getFilter($name)) {
- $e = new SyntaxError(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getStream()->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getFilters()));
-
- throw $e;
- }
-
- if ($filter->isDeprecated()) {
- $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
- if ($filter->getDeprecatedVersion()) {
- $message .= sprintf(' since version %s', $filter->getDeprecatedVersion());
- }
- if ($filter->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
- }
- $src = $this->parser->getStream()->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
-
- @trigger_error($message, \E_USER_DEPRECATED);
- }
-
- return $filter->getNodeClass();
- }
-
- // checks that the node only contains "constant" elements
- private function checkConstantExpression(Node $node): bool
- {
- if (!($node instanceof ConstantExpression || $node instanceof ArrayExpression
- || $node instanceof NegUnary || $node instanceof PosUnary
- )) {
- return false;
- }
-
- foreach ($node as $n) {
- if (!$this->checkConstantExpression($n)) {
- return false;
- }
- }
-
- return true;
- }
-}
diff --git a/vendor/twig/twig/src/Extension/AbstractExtension.php b/vendor/twig/twig/src/Extension/AbstractExtension.php
deleted file mode 100644
index 422925f3..00000000
--- a/vendor/twig/twig/src/Extension/AbstractExtension.php
+++ /dev/null
@@ -1,45 +0,0 @@
-dateFormats[0] = $format;
- }
-
- if (null !== $dateIntervalFormat) {
- $this->dateFormats[1] = $dateIntervalFormat;
- }
- }
-
- /**
- * Gets the default format to be used by the date filter.
- *
- * @return array The default date format string and the default date interval format string
- */
- public function getDateFormat()
- {
- return $this->dateFormats;
- }
-
- /**
- * Sets the default timezone to be used by the date filter.
- *
- * @param \DateTimeZone|string $timezone The default timezone string or a \DateTimeZone object
- */
- public function setTimezone($timezone)
- {
- $this->timezone = $timezone instanceof \DateTimeZone ? $timezone : new \DateTimeZone($timezone);
- }
-
- /**
- * Gets the default timezone to be used by the date filter.
- *
- * @return \DateTimeZone The default timezone currently in use
- */
- public function getTimezone()
- {
- if (null === $this->timezone) {
- $this->timezone = new \DateTimeZone(date_default_timezone_get());
- }
-
- return $this->timezone;
- }
-
- /**
- * Sets the default format to be used by the number_format filter.
- *
- * @param int $decimal the number of decimal places to use
- * @param string $decimalPoint the character(s) to use for the decimal point
- * @param string $thousandSep the character(s) to use for the thousands separator
- */
- public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
- {
- $this->numberFormat = [$decimal, $decimalPoint, $thousandSep];
- }
-
- /**
- * Get the default format used by the number_format filter.
- *
- * @return array The arguments for number_format()
- */
- public function getNumberFormat()
- {
- return $this->numberFormat;
- }
-
- public function getTokenParsers(): array
- {
- return [
- new ApplyTokenParser(),
- new ForTokenParser(),
- new IfTokenParser(),
- new ExtendsTokenParser(),
- new IncludeTokenParser(),
- new BlockTokenParser(),
- new UseTokenParser(),
- new MacroTokenParser(),
- new ImportTokenParser(),
- new FromTokenParser(),
- new SetTokenParser(),
- new FlushTokenParser(),
- new DoTokenParser(),
- new EmbedTokenParser(),
- new WithTokenParser(),
- new DeprecatedTokenParser(),
- ];
- }
-
- public function getFilters(): array
- {
- return [
- // formatting filters
- new TwigFilter('date', [$this, 'formatDate']),
- new TwigFilter('date_modify', [$this, 'modifyDate']),
- new TwigFilter('format', [self::class, 'sprintf']),
- new TwigFilter('replace', [self::class, 'replace']),
- new TwigFilter('number_format', [$this, 'formatNumber']),
- new TwigFilter('abs', 'abs'),
- new TwigFilter('round', [self::class, 'round']),
-
- // encoding
- new TwigFilter('url_encode', [self::class, 'urlencode']),
- new TwigFilter('json_encode', 'json_encode'),
- new TwigFilter('convert_encoding', [self::class, 'convertEncoding']),
-
- // string filters
- new TwigFilter('title', [self::class, 'titleCase'], ['needs_charset' => true]),
- new TwigFilter('capitalize', [self::class, 'capitalize'], ['needs_charset' => true]),
- new TwigFilter('upper', [self::class, 'upper'], ['needs_charset' => true]),
- new TwigFilter('lower', [self::class, 'lower'], ['needs_charset' => true]),
- new TwigFilter('striptags', [self::class, 'striptags']),
- new TwigFilter('trim', [self::class, 'trim']),
- new TwigFilter('nl2br', [self::class, 'nl2br'], ['pre_escape' => 'html', 'is_safe' => ['html']]),
- new TwigFilter('spaceless', [self::class, 'spaceless'], ['is_safe' => ['html']]),
-
- // array helpers
- new TwigFilter('join', [self::class, 'join']),
- new TwigFilter('split', [self::class, 'split'], ['needs_charset' => true]),
- new TwigFilter('sort', [self::class, 'sort'], ['needs_environment' => true]),
- new TwigFilter('merge', [self::class, 'merge']),
- new TwigFilter('batch', [self::class, 'batch']),
- new TwigFilter('column', [self::class, 'column']),
- new TwigFilter('filter', [self::class, 'filter'], ['needs_environment' => true]),
- new TwigFilter('map', [self::class, 'map'], ['needs_environment' => true]),
- new TwigFilter('reduce', [self::class, 'reduce'], ['needs_environment' => true]),
-
- // string/array filters
- new TwigFilter('reverse', [self::class, 'reverse'], ['needs_charset' => true]),
- new TwigFilter('length', [self::class, 'length'], ['needs_charset' => true]),
- new TwigFilter('slice', [self::class, 'slice'], ['needs_charset' => true]),
- new TwigFilter('first', [self::class, 'first'], ['needs_charset' => true]),
- new TwigFilter('last', [self::class, 'last'], ['needs_charset' => true]),
-
- // iteration and runtime
- new TwigFilter('default', [self::class, 'default'], ['node_class' => DefaultFilter::class]),
- new TwigFilter('keys', [self::class, 'keys']),
- ];
- }
-
- public function getFunctions(): array
- {
- return [
- new TwigFunction('max', 'max'),
- new TwigFunction('min', 'min'),
- new TwigFunction('range', 'range'),
- new TwigFunction('constant', [self::class, 'constant']),
- new TwigFunction('cycle', [self::class, 'cycle']),
- new TwigFunction('random', [self::class, 'random'], ['needs_charset' => true]),
- new TwigFunction('date', [$this, 'convertDate']),
- new TwigFunction('include', [self::class, 'include'], ['needs_environment' => true, 'needs_context' => true, 'is_safe' => ['all']]),
- new TwigFunction('source', [self::class, 'source'], ['needs_environment' => true, 'is_safe' => ['all']]),
- ];
- }
-
- public function getTests(): array
- {
- return [
- new TwigTest('even', null, ['node_class' => EvenTest::class]),
- new TwigTest('odd', null, ['node_class' => OddTest::class]),
- new TwigTest('defined', null, ['node_class' => DefinedTest::class]),
- new TwigTest('same as', null, ['node_class' => SameasTest::class, 'one_mandatory_argument' => true]),
- new TwigTest('none', null, ['node_class' => NullTest::class]),
- new TwigTest('null', null, ['node_class' => NullTest::class]),
- new TwigTest('divisible by', null, ['node_class' => DivisiblebyTest::class, 'one_mandatory_argument' => true]),
- new TwigTest('constant', null, ['node_class' => ConstantTest::class]),
- new TwigTest('empty', [self::class, 'testEmpty']),
- new TwigTest('iterable', 'is_iterable'),
- ];
- }
-
- public function getNodeVisitors(): array
- {
- return [new MacroAutoImportNodeVisitor()];
- }
-
- public function getOperators(): array
- {
- return [
- [
- 'not' => ['precedence' => 50, 'class' => NotUnary::class],
- '-' => ['precedence' => 500, 'class' => NegUnary::class],
- '+' => ['precedence' => 500, 'class' => PosUnary::class],
- ],
- [
- 'or' => ['precedence' => 10, 'class' => OrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'and' => ['precedence' => 15, 'class' => AndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'b-or' => ['precedence' => 16, 'class' => BitwiseOrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'b-xor' => ['precedence' => 17, 'class' => BitwiseXorBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'b-and' => ['precedence' => 18, 'class' => BitwiseAndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '==' => ['precedence' => 20, 'class' => EqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '!=' => ['precedence' => 20, 'class' => NotEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '<=>' => ['precedence' => 20, 'class' => SpaceshipBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '<' => ['precedence' => 20, 'class' => LessBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '>' => ['precedence' => 20, 'class' => GreaterBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '>=' => ['precedence' => 20, 'class' => GreaterEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '<=' => ['precedence' => 20, 'class' => LessEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'not in' => ['precedence' => 20, 'class' => NotInBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'in' => ['precedence' => 20, 'class' => InBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'matches' => ['precedence' => 20, 'class' => MatchesBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'starts with' => ['precedence' => 20, 'class' => StartsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'ends with' => ['precedence' => 20, 'class' => EndsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'has some' => ['precedence' => 20, 'class' => HasSomeBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'has every' => ['precedence' => 20, 'class' => HasEveryBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '..' => ['precedence' => 25, 'class' => RangeBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '+' => ['precedence' => 30, 'class' => AddBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '-' => ['precedence' => 30, 'class' => SubBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '~' => ['precedence' => 40, 'class' => ConcatBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '*' => ['precedence' => 60, 'class' => MulBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '/' => ['precedence' => 60, 'class' => DivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '//' => ['precedence' => 60, 'class' => FloorDivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '%' => ['precedence' => 60, 'class' => ModBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'is' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- 'is not' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT],
- '**' => ['precedence' => 200, 'class' => PowerBinary::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT],
- '??' => ['precedence' => 300, 'class' => NullCoalesceExpression::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT],
- ],
- ];
- }
-
- /**
- * Cycles over a value.
- *
- * @param \ArrayAccess|array $values
- * @param int $position The cycle position
- *
- * @return string The next value in the cycle
- *
- * @internal
- */
- public static function cycle($values, $position): string
- {
- if (!\is_array($values) && !$values instanceof \ArrayAccess) {
- return $values;
- }
-
- if (!\count($values)) {
- throw new RuntimeError('The "cycle" function does not work on empty arrays.');
- }
-
- return $values[$position % \count($values)];
- }
-
- /**
- * Returns a random value depending on the supplied parameter type:
- * - a random item from a \Traversable or array
- * - a random character from a string
- * - a random integer between 0 and the integer parameter.
- *
- * @param \Traversable|array|int|float|string $values The values to pick a random item from
- * @param int|null $max Maximum value used when $values is an int
- *
- * @return mixed A random value from the given sequence
- *
- * @throws RuntimeError when $values is an empty array (does not apply to an empty string which is returned as is)
- *
- * @internal
- */
- public static function random(string $charset, $values = null, $max = null)
- {
- if (null === $values) {
- return null === $max ? mt_rand() : mt_rand(0, (int) $max);
- }
-
- if (\is_int($values) || \is_float($values)) {
- if (null === $max) {
- if ($values < 0) {
- $max = 0;
- $min = $values;
- } else {
- $max = $values;
- $min = 0;
- }
- } else {
- $min = $values;
- }
-
- return mt_rand((int) $min, (int) $max);
- }
-
- if (\is_string($values)) {
- if ('' === $values) {
- return '';
- }
-
- if ('UTF-8' !== $charset) {
- $values = self::convertEncoding($values, 'UTF-8', $charset);
- }
-
- // unicode version of str_split()
- // split at all positions, but not after the start and not before the end
- $values = preg_split('/(? $value) {
- $values[$i] = self::convertEncoding($value, $charset, 'UTF-8');
- }
- }
- }
-
- if (!is_iterable($values)) {
- return $values;
- }
-
- $values = self::toArray($values);
-
- if (0 === \count($values)) {
- throw new RuntimeError('The random function cannot pick from an empty array.');
- }
-
- return $values[array_rand($values, 1)];
- }
-
- /**
- * Formats a date.
- *
- * {{ post.published_at|date("m/d/Y") }}
- *
- * @param \DateTimeInterface|\DateInterval|string $date A date
- * @param string|null $format The target format, null to use the default
- * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged
- */
- public function formatDate($date, $format = null, $timezone = null): string
- {
- if (null === $format) {
- $formats = $this->getDateFormat();
- $format = $date instanceof \DateInterval ? $formats[1] : $formats[0];
- }
-
- if ($date instanceof \DateInterval) {
- return $date->format($format);
- }
-
- return $this->convertDate($date, $timezone)->format($format);
- }
-
- /**
- * Returns a new date object modified.
- *
- * {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
- *
- * @param \DateTimeInterface|string $date A date
- * @param string $modifier A modifier string
- *
- * @return \DateTime|\DateTimeImmutable
- *
- * @internal
- */
- public function modifyDate($date, $modifier)
- {
- return $this->convertDate($date, false)->modify($modifier);
- }
-
- /**
- * Returns a formatted string.
- *
- * @param string|null $format
- * @param ...$values
- *
- * @internal
- */
- public static function sprintf($format, ...$values): string
- {
- return sprintf($format ?? '', ...$values);
- }
-
- /**
- * @internal
- */
- public static function dateConverter(Environment $env, $date, $format = null, $timezone = null): string
- {
- return $env->getExtension(self::class)->formatDate($date, $format, $timezone);
- }
-
- /**
- * Converts an input to a \DateTime instance.
- *
- * {% if date(user.created_at) < date('+2days') %}
- * {# do something #}
- * {% endif %}
- *
- * @param \DateTimeInterface|string|null $date A date or null to use the current time
- * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged
- *
- * @return \DateTime|\DateTimeImmutable
- */
- public function convertDate($date = null, $timezone = null)
- {
- // determine the timezone
- if (false !== $timezone) {
- if (null === $timezone) {
- $timezone = $this->getTimezone();
- } elseif (!$timezone instanceof \DateTimeZone) {
- $timezone = new \DateTimeZone($timezone);
- }
- }
-
- // immutable dates
- if ($date instanceof \DateTimeImmutable) {
- return false !== $timezone ? $date->setTimezone($timezone) : $date;
- }
-
- if ($date instanceof \DateTime) {
- $date = clone $date;
- if (false !== $timezone) {
- $date->setTimezone($timezone);
- }
-
- return $date;
- }
-
- if (null === $date || 'now' === $date) {
- if (null === $date) {
- $date = 'now';
- }
-
- return new \DateTime($date, false !== $timezone ? $timezone : $this->getTimezone());
- }
-
- $asString = (string) $date;
- if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) {
- $date = new \DateTime('@'.$date);
- } else {
- $date = new \DateTime($date, $this->getTimezone());
- }
-
- if (false !== $timezone) {
- $date->setTimezone($timezone);
- }
-
- return $date;
- }
-
- /**
- * Replaces strings within a string.
- *
- * @param string|null $str String to replace in
- * @param array|\Traversable $from Replace values
- *
- * @internal
- */
- public static function replace($str, $from): string
- {
- if (!is_iterable($from)) {
- throw new RuntimeError(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', \is_object($from) ? \get_class($from) : \gettype($from)));
- }
-
- return strtr($str ?? '', self::toArray($from));
- }
-
- /**
- * Rounds a number.
- *
- * @param int|float|string|null $value The value to round
- * @param int|float $precision The rounding precision
- * @param string $method The method to use for rounding
- *
- * @return int|float The rounded number
- *
- * @internal
- */
- public static function round($value, $precision = 0, $method = 'common')
- {
- $value = (float) $value;
-
- if ('common' === $method) {
- return round($value, $precision);
- }
-
- if ('ceil' !== $method && 'floor' !== $method) {
- throw new RuntimeError('The round filter only supports the "common", "ceil", and "floor" methods.');
- }
-
- return $method($value * 10 ** $precision) / 10 ** $precision;
- }
-
- /**
- * Formats a number.
- *
- * All of the formatting options can be left null, in that case the defaults will
- * be used. Supplying any of the parameters will override the defaults set in the
- * environment object.
- *
- * @param mixed $number A float/int/string of the number to format
- * @param int|null $decimal the number of decimal points to display
- * @param string|null $decimalPoint the character(s) to use for the decimal point
- * @param string|null $thousandSep the character(s) to use for the thousands separator
- */
- public function formatNumber($number, $decimal = null, $decimalPoint = null, $thousandSep = null): string
- {
- $defaults = $this->getNumberFormat();
- if (null === $decimal) {
- $decimal = $defaults[0];
- }
-
- if (null === $decimalPoint) {
- $decimalPoint = $defaults[1];
- }
-
- if (null === $thousandSep) {
- $thousandSep = $defaults[2];
- }
-
- return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
- }
-
- /**
- * URL encodes (RFC 3986) a string as a path segment or an array as a query string.
- *
- * @param string|array|null $url A URL or an array of query parameters
- *
- * @internal
- */
- public static function urlencode($url): string
- {
- if (\is_array($url)) {
- return http_build_query($url, '', '&', \PHP_QUERY_RFC3986);
- }
-
- return rawurlencode($url ?? '');
- }
-
- /**
- * Merges any number of arrays or Traversable objects.
- *
- * {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
- *
- * {% set items = items|merge({ 'peugeot': 'car' }, { 'banana': 'fruit' }) %}
- *
- * {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car', 'banana': 'fruit' } #}
- *
- * @param array|\Traversable ...$arrays Any number of arrays or Traversable objects to merge
- *
- * @internal
- */
- public static function merge(...$arrays): array
- {
- $result = [];
-
- foreach ($arrays as $argNumber => $array) {
- if (!is_iterable($array)) {
- throw new RuntimeError(sprintf('The merge filter only works with arrays or "Traversable", got "%s" for argument %d.', \gettype($array), $argNumber + 1));
- }
-
- $result = array_merge($result, self::toArray($array));
- }
-
- return $result;
- }
-
- /**
- * Slices a variable.
- *
- * @param mixed $item A variable
- * @param int $start Start of the slice
- * @param int $length Size of the slice
- * @param bool $preserveKeys Whether to preserve key or not (when the input is an array)
- *
- * @return mixed The sliced variable
- *
- * @internal
- */
- public static function slice(string $charset, $item, $start, $length = null, $preserveKeys = false)
- {
- if ($item instanceof \Traversable) {
- while ($item instanceof \IteratorAggregate) {
- $item = $item->getIterator();
- }
-
- if ($start >= 0 && $length >= 0 && $item instanceof \Iterator) {
- try {
- return iterator_to_array(new \LimitIterator($item, $start, $length ?? -1), $preserveKeys);
- } catch (\OutOfBoundsException $e) {
- return [];
- }
- }
-
- $item = iterator_to_array($item, $preserveKeys);
- }
-
- if (\is_array($item)) {
- return \array_slice($item, $start, $length, $preserveKeys);
- }
-
- return mb_substr((string) $item, $start, $length, $charset);
- }
-
- /**
- * Returns the first element of the item.
- *
- * @param mixed $item A variable
- *
- * @return mixed The first element of the item
- *
- * @internal
- */
- public static function first(string $charset, $item)
- {
- $elements = self::slice($charset, $item, 0, 1, false);
-
- return \is_string($elements) ? $elements : current($elements);
- }
-
- /**
- * Returns the last element of the item.
- *
- * @param mixed $item A variable
- *
- * @return mixed The last element of the item
- *
- * @internal
- */
- public static function last(string $charset, $item)
- {
- $elements = self::slice($charset, $item, -1, 1, false);
-
- return \is_string($elements) ? $elements : current($elements);
- }
-
- /**
- * Joins the values to a string.
- *
- * The separators between elements are empty strings per default, you can define them with the optional parameters.
- *
- * {{ [1, 2, 3]|join(', ', ' and ') }}
- * {# returns 1, 2 and 3 #}
- *
- * {{ [1, 2, 3]|join('|') }}
- * {# returns 1|2|3 #}
- *
- * {{ [1, 2, 3]|join }}
- * {# returns 123 #}
- *
- * @param array $value An array
- * @param string $glue The separator
- * @param string|null $and The separator for the last pair
- *
- * @internal
- */
- public static function join($value, $glue = '', $and = null): string
- {
- if (!is_iterable($value)) {
- $value = (array) $value;
- }
-
- $value = self::toArray($value, false);
-
- if (0 === \count($value)) {
- return '';
- }
-
- if (null === $and || $and === $glue) {
- return implode($glue, $value);
- }
-
- if (1 === \count($value)) {
- return $value[0];
- }
-
- return implode($glue, \array_slice($value, 0, -1)).$and.$value[\count($value) - 1];
- }
-
- /**
- * Splits the string into an array.
- *
- * {{ "one,two,three"|split(',') }}
- * {# returns [one, two, three] #}
- *
- * {{ "one,two,three,four,five"|split(',', 3) }}
- * {# returns [one, two, "three,four,five"] #}
- *
- * {{ "123"|split('') }}
- * {# returns [1, 2, 3] #}
- *
- * {{ "aabbcc"|split('', 2) }}
- * {# returns [aa, bb, cc] #}
- *
- * @param string|null $value A string
- * @param string $delimiter The delimiter
- * @param int|null $limit The limit
- *
- * @internal
- */
- public static function split(string $charset, $value, $delimiter, $limit = null): array
- {
- $value = $value ?? '';
-
- if ('' !== $delimiter) {
- return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit);
- }
-
- if ($limit <= 1) {
- return preg_split('/(?getIterator();
- }
-
- $keys = [];
- if ($array instanceof \Iterator) {
- $array->rewind();
- while ($array->valid()) {
- $keys[] = $array->key();
- $array->next();
- }
-
- return $keys;
- }
-
- foreach ($array as $key => $item) {
- $keys[] = $key;
- }
-
- return $keys;
- }
-
- if (!\is_array($array)) {
- return [];
- }
-
- return array_keys($array);
- }
-
- /**
- * Reverses a variable.
- *
- * @param array|\Traversable|string|null $item An array, a \Traversable instance, or a string
- * @param bool $preserveKeys Whether to preserve key or not
- *
- * @return mixed The reversed input
- *
- * @internal
- */
- public static function reverse(string $charset, $item, $preserveKeys = false)
- {
- if ($item instanceof \Traversable) {
- return array_reverse(iterator_to_array($item), $preserveKeys);
- }
-
- if (\is_array($item)) {
- return array_reverse($item, $preserveKeys);
- }
-
- $string = (string) $item;
-
- if ('UTF-8' !== $charset) {
- $string = self::convertEncoding($string, 'UTF-8', $charset);
- }
-
- preg_match_all('/./us', $string, $matches);
-
- $string = implode('', array_reverse($matches[0]));
-
- if ('UTF-8' !== $charset) {
- $string = self::convertEncoding($string, $charset, 'UTF-8');
- }
-
- return $string;
- }
-
- /**
- * Sorts an array.
- *
- * @param array|\Traversable $array
- *
- * @internal
- */
- public static function sort(Environment $env, $array, $arrow = null): array
- {
- if ($array instanceof \Traversable) {
- $array = iterator_to_array($array);
- } elseif (!\is_array($array)) {
- throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array)));
- }
-
- if (null !== $arrow) {
- self::checkArrowInSandbox($env, $arrow, 'sort', 'filter');
-
- uasort($array, $arrow);
- } else {
- asort($array);
- }
-
- return $array;
- }
-
- /**
- * @internal
- */
- public static function inFilter($value, $compare)
- {
- if ($value instanceof Markup) {
- $value = (string) $value;
- }
- if ($compare instanceof Markup) {
- $compare = (string) $compare;
- }
-
- if (\is_string($compare)) {
- if (\is_string($value) || \is_int($value) || \is_float($value)) {
- return '' === $value || str_contains($compare, (string) $value);
- }
-
- return false;
- }
-
- if (!is_iterable($compare)) {
- return false;
- }
-
- if (\is_object($value) || \is_resource($value)) {
- if (!\is_array($compare)) {
- foreach ($compare as $item) {
- if ($item === $value) {
- return true;
- }
- }
-
- return false;
- }
-
- return \in_array($value, $compare, true);
- }
-
- foreach ($compare as $item) {
- if (0 === self::compare($value, $item)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Compares two values using a more strict version of the PHP non-strict comparison operator.
- *
- * @see https://wiki.php.net/rfc/string_to_number_comparison
- * @see https://wiki.php.net/rfc/trailing_whitespace_numerics
- *
- * @internal
- */
- public static function compare($a, $b)
- {
- // int <=> string
- if (\is_int($a) && \is_string($b)) {
- $bTrim = trim($b, " \t\n\r\v\f");
- if (!is_numeric($bTrim)) {
- return (string) $a <=> $b;
- }
- if ((int) $bTrim == $bTrim) {
- return $a <=> (int) $bTrim;
- } else {
- return (float) $a <=> (float) $bTrim;
- }
- }
- if (\is_string($a) && \is_int($b)) {
- $aTrim = trim($a, " \t\n\r\v\f");
- if (!is_numeric($aTrim)) {
- return $a <=> (string) $b;
- }
- if ((int) $aTrim == $aTrim) {
- return (int) $aTrim <=> $b;
- } else {
- return (float) $aTrim <=> (float) $b;
- }
- }
-
- // float <=> string
- if (\is_float($a) && \is_string($b)) {
- if (is_nan($a)) {
- return 1;
- }
- $bTrim = trim($b, " \t\n\r\v\f");
- if (!is_numeric($bTrim)) {
- return (string) $a <=> $b;
- }
-
- return $a <=> (float) $bTrim;
- }
- if (\is_string($a) && \is_float($b)) {
- if (is_nan($b)) {
- return 1;
- }
- $aTrim = trim($a, " \t\n\r\v\f");
- if (!is_numeric($aTrim)) {
- return $a <=> (string) $b;
- }
-
- return (float) $aTrim <=> $b;
- }
-
- // fallback to <=>
- return $a <=> $b;
- }
-
- /**
- * @throws RuntimeError When an invalid pattern is used
- *
- * @internal
- */
- public static function matches(string $regexp, ?string $str): int
- {
- set_error_handler(function ($t, $m) use ($regexp) {
- throw new RuntimeError(sprintf('Regexp "%s" passed to "matches" is not valid', $regexp).substr($m, 12));
- });
- try {
- return preg_match($regexp, $str ?? '');
- } finally {
- restore_error_handler();
- }
- }
-
- /**
- * Returns a trimmed string.
- *
- * @param string|null $string
- * @param string|null $characterMask
- * @param string $side
- *
- * @throws RuntimeError When an invalid trimming side is used (not a string or not 'left', 'right', or 'both')
- *
- * @internal
- */
- public static function trim($string, $characterMask = null, $side = 'both'): string
- {
- if (null === $characterMask) {
- $characterMask = " \t\n\r\0\x0B";
- }
-
- switch ($side) {
- case 'both':
- return trim($string ?? '', $characterMask);
- case 'left':
- return ltrim($string ?? '', $characterMask);
- case 'right':
- return rtrim($string ?? '', $characterMask);
- default:
- throw new RuntimeError('Trimming side must be "left", "right" or "both".');
- }
- }
-
- /**
- * Inserts HTML line breaks before all newlines in a string.
- *
- * @param string|null $string
- *
- * @internal
- */
- public static function nl2br($string): string
- {
- return nl2br($string ?? '');
- }
-
- /**
- * Removes whitespaces between HTML tags.
- *
- * @param string|null $content
- *
- * @internal
- */
- public static function spaceless($content): string
- {
- return trim(preg_replace('/>\s+', '><', $content ?? ''));
- }
-
- /**
- * @param string|null $string
- * @param string $to
- * @param string $from
- *
- * @internal
- */
- public static function convertEncoding($string, $to, $from): string
- {
- if (!\function_exists('iconv')) {
- throw new RuntimeError('Unable to convert encoding: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.');
- }
-
- return iconv($from, $to, $string ?? '');
- }
-
- /**
- * Returns the length of a variable.
- *
- * @param mixed $thing A variable
- *
- * @internal
- */
- public static function length(string $charset, $thing): int
- {
- if (null === $thing) {
- return 0;
- }
-
- if (\is_scalar($thing)) {
- return mb_strlen($thing, $charset);
- }
-
- if ($thing instanceof \Countable || \is_array($thing) || $thing instanceof \SimpleXMLElement) {
- return \count($thing);
- }
-
- if ($thing instanceof \Traversable) {
- return iterator_count($thing);
- }
-
- if (method_exists($thing, '__toString')) {
- return mb_strlen((string) $thing, $charset);
- }
-
- return 1;
- }
-
- /**
- * Converts a string to uppercase.
- *
- * @param string|null $string A string
- *
- * @internal
- */
- public static function upper(string $charset, $string): string
- {
- return mb_strtoupper($string ?? '', $charset);
- }
-
- /**
- * Converts a string to lowercase.
- *
- * @param string|null $string A string
- *
- * @internal
- */
- public static function lower(string $charset, $string): string
- {
- return mb_strtolower($string ?? '', $charset);
- }
-
- /**
- * Strips HTML and PHP tags from a string.
- *
- * @param string|null $string
- * @param string[]|string|null $allowable_tags
- *
- * @internal
- */
- public static function striptags($string, $allowable_tags = null): string
- {
- return strip_tags($string ?? '', $allowable_tags);
- }
-
- /**
- * Returns a titlecased string.
- *
- * @param string|null $string A string
- *
- * @internal
- */
- public static function titleCase(string $charset, $string): string
- {
- return mb_convert_case($string ?? '', \MB_CASE_TITLE, $charset);
- }
-
- /**
- * Returns a capitalized string.
- *
- * @param string|null $string A string
- *
- * @internal
- */
- public static function capitalize(string $charset, $string): string
- {
- return mb_strtoupper(mb_substr($string ?? '', 0, 1, $charset), $charset).mb_strtolower(mb_substr($string ?? '', 1, null, $charset), $charset);
- }
-
- /**
- * @internal
- */
- public static function callMacro(Template $template, string $method, array $args, int $lineno, array $context, Source $source)
- {
- if (!method_exists($template, $method)) {
- $parent = $template;
- while ($parent = $parent->getParent($context)) {
- if (method_exists($parent, $method)) {
- return $parent->$method(...$args);
- }
- }
-
- throw new RuntimeError(sprintf('Macro "%s" is not defined in template "%s".', substr($method, \strlen('macro_')), $template->getTemplateName()), $lineno, $source);
- }
-
- return $template->$method(...$args);
- }
-
- /**
- * @internal
- */
- public static function ensureTraversable($seq)
- {
- if (is_iterable($seq)) {
- return $seq;
- }
-
- return [];
- }
-
- /**
- * @internal
- */
- public static function toArray($seq, $preserveKeys = true)
- {
- if ($seq instanceof \Traversable) {
- return iterator_to_array($seq, $preserveKeys);
- }
-
- if (!\is_array($seq)) {
- return $seq;
- }
-
- return $preserveKeys ? $seq : array_values($seq);
- }
-
- /**
- * Checks if a variable is empty.
- *
- * {# evaluates to true if the foo variable is null, false, or the empty string #}
- * {% if foo is empty %}
- * {# ... #}
- * {% endif %}
- *
- * @param mixed $value A variable
- *
- * @internal
- */
- public static function testEmpty($value): bool
- {
- if ($value instanceof \Countable) {
- return 0 === \count($value);
- }
-
- if ($value instanceof \Traversable) {
- return !iterator_count($value);
- }
-
- if (\is_object($value) && method_exists($value, '__toString')) {
- return '' === (string) $value;
- }
-
- return '' === $value || false === $value || null === $value || [] === $value;
- }
-
- /**
- * Renders a template.
- *
- * @param array $context
- * @param string|array|TemplateWrapper $template The template to render or an array of templates to try consecutively
- * @param array $variables The variables to pass to the template
- * @param bool $withContext
- * @param bool $ignoreMissing Whether to ignore missing templates or not
- * @param bool $sandboxed Whether to sandbox the template or not
- *
- * @internal
- */
- public static function include(Environment $env, $context, $template, $variables = [], $withContext = true, $ignoreMissing = false, $sandboxed = false): string
- {
- $alreadySandboxed = false;
- $sandbox = null;
- if ($withContext) {
- $variables = array_merge($context, $variables);
- }
-
- if ($isSandboxed = $sandboxed && $env->hasExtension(SandboxExtension::class)) {
- $sandbox = $env->getExtension(SandboxExtension::class);
- if (!$alreadySandboxed = $sandbox->isSandboxed()) {
- $sandbox->enableSandbox();
- }
-
- foreach ((\is_array($template) ? $template : [$template]) as $name) {
- // if a Template instance is passed, it might have been instantiated outside of a sandbox, check security
- if ($name instanceof TemplateWrapper || $name instanceof Template) {
- $name->unwrap()->checkSecurity();
- }
- }
- }
-
- try {
- $loaded = null;
- try {
- $loaded = $env->resolveTemplate($template);
- } catch (LoaderError $e) {
- if (!$ignoreMissing) {
- throw $e;
- }
- }
-
- return $loaded ? $loaded->render($variables) : '';
- } finally {
- if ($isSandboxed && !$alreadySandboxed) {
- $sandbox->disableSandbox();
- }
- }
- }
-
- /**
- * Returns a template content without rendering it.
- *
- * @param string $name The template name
- * @param bool $ignoreMissing Whether to ignore missing templates or not
- *
- * @internal
- */
- public static function source(Environment $env, $name, $ignoreMissing = false): string
- {
- $loader = $env->getLoader();
- try {
- return $loader->getSourceContext($name)->getCode();
- } catch (LoaderError $e) {
- if (!$ignoreMissing) {
- throw $e;
- }
-
- return '';
- }
- }
-
- /**
- * Provides the ability to get constants from instances as well as class/global constants.
- *
- * @param string $constant The name of the constant
- * @param object|null $object The object to get the constant from
- *
- * @return mixed Class constants can return many types like scalars, arrays, and
- * objects depending on the PHP version (\BackedEnum, \UnitEnum, etc.)
- *
- * @internal
- */
- public static function constant($constant, $object = null)
- {
- if (null !== $object) {
- if ('class' === $constant) {
- return \get_class($object);
- }
-
- $constant = \get_class($object).'::'.$constant;
- }
-
- if (!\defined($constant)) {
- if ('::class' === strtolower(substr($constant, -7))) {
- throw new RuntimeError(sprintf('You cannot use the Twig function "constant()" to access "%s". You could provide an object and call constant("class", $object) or use the class name directly as a string.', $constant));
- }
-
- throw new RuntimeError(sprintf('Constant "%s" is undefined.', $constant));
- }
-
- return \constant($constant);
- }
-
- /**
- * Checks if a constant exists.
- *
- * @param string $constant The name of the constant
- * @param object|null $object The object to get the constant from
- *
- * @internal
- */
- public static function constantIsDefined($constant, $object = null): bool
- {
- if (null !== $object) {
- if ('class' === $constant) {
- return true;
- }
-
- $constant = \get_class($object).'::'.$constant;
- }
-
- return \defined($constant);
- }
-
- /**
- * Batches item.
- *
- * @param array $items An array of items
- * @param int $size The size of the batch
- * @param mixed $fill A value used to fill missing items
- *
- * @internal
- */
- public static function batch($items, $size, $fill = null, $preserveKeys = true): array
- {
- if (!is_iterable($items)) {
- throw new RuntimeError(sprintf('The "batch" filter expects an array or "Traversable", got "%s".', \is_object($items) ? \get_class($items) : \gettype($items)));
- }
-
- $size = ceil($size);
-
- $result = array_chunk(self::toArray($items, $preserveKeys), $size, $preserveKeys);
-
- if (null !== $fill && $result) {
- $last = \count($result) - 1;
- if ($fillCount = $size - \count($result[$last])) {
- for ($i = 0; $i < $fillCount; ++$i) {
- $result[$last][] = $fill;
- }
- }
- }
-
- return $result;
- }
-
- /**
- * Returns the attribute value for a given array/object.
- *
- * @param mixed $object The object or array from where to get the item
- * @param mixed $item The item to get from the array or object
- * @param array $arguments An array of arguments to pass if the item is an object method
- * @param string $type The type of attribute (@see \Twig\Template constants)
- * @param bool $isDefinedTest Whether this is only a defined check
- * @param bool $ignoreStrictCheck Whether to ignore the strict attribute check or not
- * @param int $lineno The template line where the attribute was called
- *
- * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true
- *
- * @throws RuntimeError if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false
- *
- * @internal
- */
- public static function getAttribute(Environment $env, Source $source, $object, $item, array $arguments = [], $type = /* Template::ANY_CALL */ 'any', $isDefinedTest = false, $ignoreStrictCheck = false, $sandboxed = false, int $lineno = -1)
- {
- // array
- if (/* Template::METHOD_CALL */ 'method' !== $type) {
- $arrayItem = \is_bool($item) || \is_float($item) ? (int) $item : $item;
-
- if (((\is_array($object) || $object instanceof \ArrayObject) && (isset($object[$arrayItem]) || \array_key_exists($arrayItem, (array) $object)))
- || ($object instanceof \ArrayAccess && isset($object[$arrayItem]))
- ) {
- if ($isDefinedTest) {
- return true;
- }
-
- return $object[$arrayItem];
- }
-
- if (/* Template::ARRAY_CALL */ 'array' === $type || !\is_object($object)) {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$env->isStrictVariables()) {
- return;
- }
-
- if ($object instanceof \ArrayAccess) {
- $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, \get_class($object));
- } elseif (\is_object($object)) {
- $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, \get_class($object));
- } elseif (\is_array($object)) {
- if (empty($object)) {
- $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem);
- } else {
- $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object)));
- }
- } elseif (/* Template::ARRAY_CALL */ 'array' === $type) {
- if (null === $object) {
- $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item);
- } else {
- $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
- }
- } elseif (null === $object) {
- $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item);
- } else {
- $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
- }
-
- throw new RuntimeError($message, $lineno, $source);
- }
- }
-
- if (!\is_object($object)) {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$env->isStrictVariables()) {
- return;
- }
-
- if (null === $object) {
- $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
- } elseif (\is_array($object)) {
- $message = sprintf('Impossible to invoke a method ("%s") on an array.', $item);
- } else {
- $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
- }
-
- throw new RuntimeError($message, $lineno, $source);
- }
-
- if ($object instanceof Template) {
- throw new RuntimeError('Accessing \Twig\Template attributes is forbidden.', $lineno, $source);
- }
-
- // object property
- if (/* Template::METHOD_CALL */ 'method' !== $type) {
- if (isset($object->$item) || \array_key_exists((string) $item, (array) $object)) {
- if ($isDefinedTest) {
- return true;
- }
-
- if ($sandboxed) {
- $env->getExtension(SandboxExtension::class)->checkPropertyAllowed($object, $item, $lineno, $source);
- }
-
- return $object->$item;
- }
- }
-
- static $cache = [];
-
- $class = \get_class($object);
-
- // object method
- // precedence: getXxx() > isXxx() > hasXxx()
- if (!isset($cache[$class])) {
- $methods = get_class_methods($object);
- sort($methods);
- $lcMethods = array_map(function ($value) { return strtr($value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); }, $methods);
- $classCache = [];
- foreach ($methods as $i => $method) {
- $classCache[$method] = $method;
- $classCache[$lcName = $lcMethods[$i]] = $method;
-
- if ('g' === $lcName[0] && str_starts_with($lcName, 'get')) {
- $name = substr($method, 3);
- $lcName = substr($lcName, 3);
- } elseif ('i' === $lcName[0] && str_starts_with($lcName, 'is')) {
- $name = substr($method, 2);
- $lcName = substr($lcName, 2);
- } elseif ('h' === $lcName[0] && str_starts_with($lcName, 'has')) {
- $name = substr($method, 3);
- $lcName = substr($lcName, 3);
- if (\in_array('is'.$lcName, $lcMethods)) {
- continue;
- }
- } else {
- continue;
- }
-
- // skip get() and is() methods (in which case, $name is empty)
- if ($name) {
- if (!isset($classCache[$name])) {
- $classCache[$name] = $method;
- }
-
- if (!isset($classCache[$lcName])) {
- $classCache[$lcName] = $method;
- }
- }
- }
- $cache[$class] = $classCache;
- }
-
- $call = false;
- if (isset($cache[$class][$item])) {
- $method = $cache[$class][$item];
- } elseif (isset($cache[$class][$lcItem = strtr($item, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')])) {
- $method = $cache[$class][$lcItem];
- } elseif (isset($cache[$class]['__call'])) {
- $method = $item;
- $call = true;
- } else {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$env->isStrictVariables()) {
- return;
- }
-
- throw new RuntimeError(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()"/"has%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), $lineno, $source);
- }
-
- if ($isDefinedTest) {
- return true;
- }
-
- if ($sandboxed) {
- $env->getExtension(SandboxExtension::class)->checkMethodAllowed($object, $method, $lineno, $source);
- }
-
- // Some objects throw exceptions when they have __call, and the method we try
- // to call is not supported. If ignoreStrictCheck is true, we should return null.
- try {
- $ret = $object->$method(...$arguments);
- } catch (\BadMethodCallException $e) {
- if ($call && ($ignoreStrictCheck || !$env->isStrictVariables())) {
- return;
- }
- throw $e;
- }
-
- return $ret;
- }
-
- /**
- * Returns the values from a single column in the input array.
- *
- *
- * {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %}
- *
- * {% set fruits = items|column('fruit') %}
- *
- * {# fruits now contains ['apple', 'orange'] #}
- *
- *
- * @param array|\Traversable $array An array
- * @param int|string $name The column name
- * @param int|string|null $index The column to use as the index/keys for the returned array
- *
- * @return array The array of values
- *
- * @internal
- */
- public static function column($array, $name, $index = null): array
- {
- if ($array instanceof \Traversable) {
- $array = iterator_to_array($array);
- } elseif (!\is_array($array)) {
- throw new RuntimeError(sprintf('The column filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($array)));
- }
-
- return array_column($array, $name, $index);
- }
-
- /**
- * @internal
- */
- public static function filter(Environment $env, $array, $arrow)
- {
- if (!is_iterable($array)) {
- throw new RuntimeError(sprintf('The "filter" filter expects an array or "Traversable", got "%s".', \is_object($array) ? \get_class($array) : \gettype($array)));
- }
-
- self::checkArrowInSandbox($env, $arrow, 'filter', 'filter');
-
- if (\is_array($array)) {
- return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
- }
-
- // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator
- return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow);
- }
-
- /**
- * @internal
- */
- public static function map(Environment $env, $array, $arrow)
- {
- self::checkArrowInSandbox($env, $arrow, 'map', 'filter');
-
- $r = [];
- foreach ($array as $k => $v) {
- $r[$k] = $arrow($v, $k);
- }
-
- return $r;
- }
-
- /**
- * @internal
- */
- public static function reduce(Environment $env, $array, $arrow, $initial = null)
- {
- self::checkArrowInSandbox($env, $arrow, 'reduce', 'filter');
-
- if (!\is_array($array) && !$array instanceof \Traversable) {
- throw new RuntimeError(sprintf('The "reduce" filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($array)));
- }
-
- $accumulator = $initial;
- foreach ($array as $key => $value) {
- $accumulator = $arrow($accumulator, $value, $key);
- }
-
- return $accumulator;
- }
-
- /**
- * @internal
- */
- public static function arraySome(Environment $env, $array, $arrow)
- {
- self::checkArrowInSandbox($env, $arrow, 'has some', 'operator');
-
- foreach ($array as $k => $v) {
- if ($arrow($v, $k)) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * @internal
- */
- public static function arrayEvery(Environment $env, $array, $arrow)
- {
- self::checkArrowInSandbox($env, $arrow, 'has every', 'operator');
-
- foreach ($array as $k => $v) {
- if (!$arrow($v, $k)) {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * @internal
- */
- public static function checkArrowInSandbox(Environment $env, $arrow, $thing, $type)
- {
- if (!$arrow instanceof \Closure && $env->hasExtension(SandboxExtension::class) && $env->getExtension(SandboxExtension::class)->isSandboxed()) {
- throw new RuntimeError(sprintf('The callable passed to the "%s" %s must be a Closure in sandbox mode.', $thing, $type));
- }
- }
-
- /**
- * @internal to be removed in Twig 4
- */
- public static function captureOutput(iterable $body): string
- {
- $output = '';
- $level = ob_get_level();
- ob_start();
-
- try {
- foreach ($body as $data) {
- if (ob_get_length()) {
- $output .= ob_get_clean();
- ob_start();
- }
-
- $output .= $data;
- }
-
- if (ob_get_length()) {
- $output .= ob_get_clean();
- }
- } finally {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
- }
-
- return $output;
- }
-}
diff --git a/vendor/twig/twig/src/Extension/DebugExtension.php b/vendor/twig/twig/src/Extension/DebugExtension.php
deleted file mode 100644
index cefb44c5..00000000
--- a/vendor/twig/twig/src/Extension/DebugExtension.php
+++ /dev/null
@@ -1,64 +0,0 @@
- $isDumpOutputHtmlSafe ? ['html'] : [], 'needs_context' => true, 'needs_environment' => true, 'is_variadic' => true]),
- ];
- }
-
- /**
- * @internal
- */
- public static function dump(Environment $env, $context, ...$vars)
- {
- if (!$env->isDebug()) {
- return;
- }
-
- ob_start();
-
- if (!$vars) {
- $vars = [];
- foreach ($context as $key => $value) {
- if (!$value instanceof Template && !$value instanceof TemplateWrapper) {
- $vars[$key] = $value;
- }
- }
-
- var_dump($vars);
- } else {
- var_dump(...$vars);
- }
-
- return ob_get_clean();
- }
-}
diff --git a/vendor/twig/twig/src/Extension/EscaperExtension.php b/vendor/twig/twig/src/Extension/EscaperExtension.php
deleted file mode 100644
index 3360ef67..00000000
--- a/vendor/twig/twig/src/Extension/EscaperExtension.php
+++ /dev/null
@@ -1,210 +0,0 @@
-setDefaultStrategy($defaultStrategy);
- }
-
- public function getTokenParsers(): array
- {
- return [new AutoEscapeTokenParser()];
- }
-
- public function getNodeVisitors(): array
- {
- return [new EscaperNodeVisitor()];
- }
-
- public function getFilters(): array
- {
- return [
- new TwigFilter('escape', [EscaperRuntime::class, 'escape'], ['is_safe_callback' => [self::class, 'escapeFilterIsSafe']]),
- new TwigFilter('e', [EscaperRuntime::class, 'escape'], ['is_safe_callback' => [self::class, 'escapeFilterIsSafe']]),
- new TwigFilter('raw', [self::class, 'raw'], ['is_safe' => ['all']]),
- ];
- }
-
- /**
- * @deprecated since Twig 3.10
- */
- public function setEnvironment(Environment $environment, bool $triggerDeprecation = true): void
- {
- if ($triggerDeprecation) {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated and not needed if you are using methods from "Twig\Runtime\EscaperRuntime".', __METHOD__);
- }
-
- $this->environment = $environment;
- $this->escaper = $environment->getRuntime(EscaperRuntime::class);
- }
-
- /**
- * @deprecated since Twig 3.10
- */
- public function setEscaperRuntime(EscaperRuntime $escaper)
- {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated and not needed if you are using methods from "Twig\Runtime\EscaperRuntime".', __METHOD__);
-
- $this->escaper = $escaper;
- }
-
- /**
- * Sets the default strategy to use when not defined by the user.
- *
- * The strategy can be a valid PHP callback that takes the template
- * name as an argument and returns the strategy to use.
- *
- * @param string|false|callable(string $templateName): string $defaultStrategy An escaping strategy
- */
- public function setDefaultStrategy($defaultStrategy): void
- {
- if ('name' === $defaultStrategy) {
- $defaultStrategy = [FileExtensionEscapingStrategy::class, 'guess'];
- }
-
- $this->defaultStrategy = $defaultStrategy;
- }
-
- /**
- * Gets the default strategy to use when not defined by the user.
- *
- * @param string $name The template name
- *
- * @return string|false The default strategy to use for the template
- */
- public function getDefaultStrategy(string $name)
- {
- // disable string callables to avoid calling a function named html or js,
- // or any other upcoming escaping strategy
- if (!\is_string($this->defaultStrategy) && false !== $this->defaultStrategy) {
- return \call_user_func($this->defaultStrategy, $name);
- }
-
- return $this->defaultStrategy;
- }
-
- /**
- * Defines a new escaper to be used via the escape filter.
- *
- * @param string $strategy The strategy name that should be used as a strategy in the escape call
- * @param callable(Environment, string, string) $callable A valid PHP callable
- *
- * @deprecated since Twig 3.10
- */
- public function setEscaper($strategy, callable $callable)
- {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated, use the "Twig\Runtime\EscaperRuntime::setEscaper()" method instead (be warned that Environment is not passed anymore to the callable).', __METHOD__);
-
- if (!isset($this->environment)) {
- throw new \LogicException(sprintf('You must call "setEnvironment()" before calling "%s()".', __METHOD__));
- }
-
- $this->escapers[$strategy] = $callable;
- $callable = function ($string, $charset) use ($callable) {
- return $callable($this->environment, $string, $charset);
- };
-
- $this->escaper->setEscaper($strategy, $callable);
- }
-
- /**
- * Gets all defined escapers.
- *
- * @return array An array of escapers
- *
- * @deprecated since Twig 3.10
- */
- public function getEscapers()
- {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated, use the "Twig\Runtime\EscaperRuntime::getEscaper()" method instead.', __METHOD__);
-
- return $this->escapers;
- }
-
- /**
- * @deprecated since Twig 3.10
- */
- public function setSafeClasses(array $safeClasses = [])
- {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated, use the "Twig\Runtime\EscaperRuntime::setSafeClasses()" method instead.', __METHOD__);
-
- if (!isset($this->escaper)) {
- throw new \LogicException(sprintf('You must call "setEnvironment()" before calling "%s()".', __METHOD__));
- }
-
- $this->escaper->setSafeClasses($safeClasses);
- }
-
- /**
- * @deprecated since Twig 3.10
- */
- public function addSafeClass(string $class, array $strategies)
- {
- trigger_deprecation('twig/twig', '3.10', 'The "%s()" method is deprecated, use the "Twig\Runtime\EscaperRuntime::addSafeClass()" method instead.', __METHOD__);
-
- if (!isset($this->escaper)) {
- throw new \LogicException(sprintf('You must call "setEnvironment()" before calling "%s()".', __METHOD__));
- }
-
- $this->escaper->addSafeClass($class, $strategies);
- }
-
- /**
- * Marks a variable as being safe.
- *
- * @param string $string A PHP variable
- *
- * @internal
- */
- public static function raw($string)
- {
- return $string;
- }
-
- /**
- * @internal
- */
- public static function escapeFilterIsSafe(Node $filterArgs)
- {
- foreach ($filterArgs as $arg) {
- if ($arg instanceof ConstantExpression) {
- return [$arg->getAttribute('value')];
- }
-
- return [];
- }
-
- return ['html'];
- }
-}
diff --git a/vendor/twig/twig/src/Extension/ExtensionInterface.php b/vendor/twig/twig/src/Extension/ExtensionInterface.php
deleted file mode 100644
index ab9c2c37..00000000
--- a/vendor/twig/twig/src/Extension/ExtensionInterface.php
+++ /dev/null
@@ -1,76 +0,0 @@
-
- */
-interface ExtensionInterface
-{
- /**
- * Returns the token parser instances to add to the existing list.
- *
- * @return TokenParserInterface[]
- */
- public function getTokenParsers();
-
- /**
- * Returns the node visitor instances to add to the existing list.
- *
- * @return NodeVisitorInterface[]
- */
- public function getNodeVisitors();
-
- /**
- * Returns a list of filters to add to the existing list.
- *
- * @return TwigFilter[]
- */
- public function getFilters();
-
- /**
- * Returns a list of tests to add to the existing list.
- *
- * @return TwigTest[]
- */
- public function getTests();
-
- /**
- * Returns a list of functions to add to the existing list.
- *
- * @return TwigFunction[]
- */
- public function getFunctions();
-
- /**
- * Returns a list of operators to add to the existing list.
- *
- * @return array First array of unary operators, second array of binary operators
- *
- * @psalm-return array{
- * array}>,
- * array, associativity: ExpressionParser::OPERATOR_*}>
- * }
- */
- public function getOperators();
-}
diff --git a/vendor/twig/twig/src/Extension/GlobalsInterface.php b/vendor/twig/twig/src/Extension/GlobalsInterface.php
deleted file mode 100644
index 6f1dfe8a..00000000
--- a/vendor/twig/twig/src/Extension/GlobalsInterface.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
- */
-interface GlobalsInterface
-{
- /**
- * @return array
- */
- public function getGlobals(): array;
-}
diff --git a/vendor/twig/twig/src/Extension/OptimizerExtension.php b/vendor/twig/twig/src/Extension/OptimizerExtension.php
deleted file mode 100644
index 965bfdb0..00000000
--- a/vendor/twig/twig/src/Extension/OptimizerExtension.php
+++ /dev/null
@@ -1,29 +0,0 @@
-optimizers = $optimizers;
- }
-
- public function getNodeVisitors(): array
- {
- return [new OptimizerNodeVisitor($this->optimizers)];
- }
-}
diff --git a/vendor/twig/twig/src/Extension/ProfilerExtension.php b/vendor/twig/twig/src/Extension/ProfilerExtension.php
deleted file mode 100644
index 43e4a449..00000000
--- a/vendor/twig/twig/src/Extension/ProfilerExtension.php
+++ /dev/null
@@ -1,52 +0,0 @@
-actives[] = $profile;
- }
-
- /**
- * @return void
- */
- public function enter(Profile $profile)
- {
- $this->actives[0]->addProfile($profile);
- array_unshift($this->actives, $profile);
- }
-
- /**
- * @return void
- */
- public function leave(Profile $profile)
- {
- $profile->leave();
- array_shift($this->actives);
-
- if (1 === \count($this->actives)) {
- $this->actives[0]->leave();
- }
- }
-
- public function getNodeVisitors(): array
- {
- return [new ProfilerNodeVisitor(static::class)];
- }
-}
diff --git a/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php b/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php
deleted file mode 100644
index 63bc3b1a..00000000
--- a/vendor/twig/twig/src/Extension/RuntimeExtensionInterface.php
+++ /dev/null
@@ -1,19 +0,0 @@
-
- */
-interface RuntimeExtensionInterface
-{
-}
diff --git a/vendor/twig/twig/src/Extension/SandboxExtension.php b/vendor/twig/twig/src/Extension/SandboxExtension.php
deleted file mode 100644
index 921df287..00000000
--- a/vendor/twig/twig/src/Extension/SandboxExtension.php
+++ /dev/null
@@ -1,135 +0,0 @@
-policy = $policy;
- $this->sandboxedGlobally = $sandboxed;
- $this->sourcePolicy = $sourcePolicy;
- }
-
- public function getTokenParsers(): array
- {
- return [new SandboxTokenParser()];
- }
-
- public function getNodeVisitors(): array
- {
- return [new SandboxNodeVisitor()];
- }
-
- public function enableSandbox(): void
- {
- $this->sandboxed = true;
- }
-
- public function disableSandbox(): void
- {
- $this->sandboxed = false;
- }
-
- public function isSandboxed(?Source $source = null): bool
- {
- return $this->sandboxedGlobally || $this->sandboxed || $this->isSourceSandboxed($source);
- }
-
- public function isSandboxedGlobally(): bool
- {
- return $this->sandboxedGlobally;
- }
-
- private function isSourceSandboxed(?Source $source): bool
- {
- if (null === $source || null === $this->sourcePolicy) {
- return false;
- }
-
- return $this->sourcePolicy->enableSandbox($source);
- }
-
- public function setSecurityPolicy(SecurityPolicyInterface $policy)
- {
- $this->policy = $policy;
- }
-
- public function getSecurityPolicy(): SecurityPolicyInterface
- {
- return $this->policy;
- }
-
- public function checkSecurity($tags, $filters, $functions, ?Source $source = null): void
- {
- if ($this->isSandboxed($source)) {
- $this->policy->checkSecurity($tags, $filters, $functions);
- }
- }
-
- public function checkMethodAllowed($obj, $method, int $lineno = -1, ?Source $source = null): void
- {
- if ($this->isSandboxed($source)) {
- try {
- $this->policy->checkMethodAllowed($obj, $method);
- } catch (SecurityNotAllowedMethodError $e) {
- $e->setSourceContext($source);
- $e->setTemplateLine($lineno);
-
- throw $e;
- }
- }
- }
-
- public function checkPropertyAllowed($obj, $property, int $lineno = -1, ?Source $source = null): void
- {
- if ($this->isSandboxed($source)) {
- try {
- $this->policy->checkPropertyAllowed($obj, $property);
- } catch (SecurityNotAllowedPropertyError $e) {
- $e->setSourceContext($source);
- $e->setTemplateLine($lineno);
-
- throw $e;
- }
- }
- }
-
- public function ensureToStringAllowed($obj, int $lineno = -1, ?Source $source = null)
- {
- if ($this->isSandboxed($source) && \is_object($obj) && method_exists($obj, '__toString')) {
- try {
- $this->policy->checkMethodAllowed($obj, '__toString');
- } catch (SecurityNotAllowedMethodError $e) {
- $e->setSourceContext($source);
- $e->setTemplateLine($lineno);
-
- throw $e;
- }
- }
-
- return $obj;
- }
-}
diff --git a/vendor/twig/twig/src/Extension/StagingExtension.php b/vendor/twig/twig/src/Extension/StagingExtension.php
deleted file mode 100644
index 0ea47f90..00000000
--- a/vendor/twig/twig/src/Extension/StagingExtension.php
+++ /dev/null
@@ -1,100 +0,0 @@
-
- *
- * @internal
- */
-final class StagingExtension extends AbstractExtension
-{
- private $functions = [];
- private $filters = [];
- private $visitors = [];
- private $tokenParsers = [];
- private $tests = [];
-
- public function addFunction(TwigFunction $function): void
- {
- if (isset($this->functions[$function->getName()])) {
- throw new \LogicException(sprintf('Function "%s" is already registered.', $function->getName()));
- }
-
- $this->functions[$function->getName()] = $function;
- }
-
- public function getFunctions(): array
- {
- return $this->functions;
- }
-
- public function addFilter(TwigFilter $filter): void
- {
- if (isset($this->filters[$filter->getName()])) {
- throw new \LogicException(sprintf('Filter "%s" is already registered.', $filter->getName()));
- }
-
- $this->filters[$filter->getName()] = $filter;
- }
-
- public function getFilters(): array
- {
- return $this->filters;
- }
-
- public function addNodeVisitor(NodeVisitorInterface $visitor): void
- {
- $this->visitors[] = $visitor;
- }
-
- public function getNodeVisitors(): array
- {
- return $this->visitors;
- }
-
- public function addTokenParser(TokenParserInterface $parser): void
- {
- if (isset($this->tokenParsers[$parser->getTag()])) {
- throw new \LogicException(sprintf('Tag "%s" is already registered.', $parser->getTag()));
- }
-
- $this->tokenParsers[$parser->getTag()] = $parser;
- }
-
- public function getTokenParsers(): array
- {
- return $this->tokenParsers;
- }
-
- public function addTest(TwigTest $test): void
- {
- if (isset($this->tests[$test->getName()])) {
- throw new \LogicException(sprintf('Test "%s" is already registered.', $test->getName()));
- }
-
- $this->tests[$test->getName()] = $test;
- }
-
- public function getTests(): array
- {
- return $this->tests;
- }
-}
diff --git a/vendor/twig/twig/src/Extension/StringLoaderExtension.php b/vendor/twig/twig/src/Extension/StringLoaderExtension.php
deleted file mode 100644
index 12f5c30a..00000000
--- a/vendor/twig/twig/src/Extension/StringLoaderExtension.php
+++ /dev/null
@@ -1,41 +0,0 @@
- true]),
- ];
- }
-
- /**
- * Loads a template from a string.
- *
- * {{ include(template_from_string("Hello {{ name }}")) }}
- *
- * @param string $template A template as a string or object implementing __toString()
- * @param string|null $name An optional name of the template to be used in error messages
- *
- * @internal
- */
- public static function templateFromString(Environment $env, $template, ?string $name = null): TemplateWrapper
- {
- return $env->createTemplate((string) $template, $name);
- }
-}
diff --git a/vendor/twig/twig/src/Extension/YieldNotReadyExtension.php b/vendor/twig/twig/src/Extension/YieldNotReadyExtension.php
deleted file mode 100644
index 2503c8d8..00000000
--- a/vendor/twig/twig/src/Extension/YieldNotReadyExtension.php
+++ /dev/null
@@ -1,32 +0,0 @@
-useYield = $useYield;
- }
-
- public function getNodeVisitors(): array
- {
- return [new YieldNotReadyNodeVisitor($this->useYield)];
- }
-}
diff --git a/vendor/twig/twig/src/ExtensionSet.php b/vendor/twig/twig/src/ExtensionSet.php
deleted file mode 100644
index d32200ce..00000000
--- a/vendor/twig/twig/src/ExtensionSet.php
+++ /dev/null
@@ -1,480 +0,0 @@
-
- *
- * @internal
- */
-final class ExtensionSet
-{
- private $extensions;
- private $initialized = false;
- private $runtimeInitialized = false;
- private $staging;
- private $parsers;
- private $visitors;
- /** @var array */
- private $filters;
- /** @var array */
- private $tests;
- /** @var array */
- private $functions;
- /** @var array}> */
- private $unaryOperators;
- /** @var array, associativity: ExpressionParser::OPERATOR_*}> */
- private $binaryOperators;
- /** @var array */
- private $globals;
- private $functionCallbacks = [];
- private $filterCallbacks = [];
- private $parserCallbacks = [];
- private $lastModified = 0;
-
- public function __construct()
- {
- $this->staging = new StagingExtension();
- }
-
- public function initRuntime()
- {
- $this->runtimeInitialized = true;
- }
-
- public function hasExtension(string $class): bool
- {
- return isset($this->extensions[ltrim($class, '\\')]);
- }
-
- public function getExtension(string $class): ExtensionInterface
- {
- $class = ltrim($class, '\\');
-
- if (!isset($this->extensions[$class])) {
- throw new RuntimeError(sprintf('The "%s" extension is not enabled.', $class));
- }
-
- return $this->extensions[$class];
- }
-
- /**
- * @param ExtensionInterface[] $extensions
- */
- public function setExtensions(array $extensions): void
- {
- foreach ($extensions as $extension) {
- $this->addExtension($extension);
- }
- }
-
- /**
- * @return ExtensionInterface[]
- */
- public function getExtensions(): array
- {
- return $this->extensions;
- }
-
- public function getSignature(): string
- {
- return json_encode(array_keys($this->extensions));
- }
-
- public function isInitialized(): bool
- {
- return $this->initialized || $this->runtimeInitialized;
- }
-
- public function getLastModified(): int
- {
- if (0 !== $this->lastModified) {
- return $this->lastModified;
- }
-
- foreach ($this->extensions as $extension) {
- $r = new \ReflectionObject($extension);
- if (is_file($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModified) {
- $this->lastModified = $extensionTime;
- }
- }
-
- return $this->lastModified;
- }
-
- public function addExtension(ExtensionInterface $extension): void
- {
- $class = \get_class($extension);
-
- if ($this->initialized) {
- throw new \LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $class));
- }
-
- if (isset($this->extensions[$class])) {
- throw new \LogicException(sprintf('Unable to register extension "%s" as it is already registered.', $class));
- }
-
- $this->extensions[$class] = $extension;
- }
-
- public function addFunction(TwigFunction $function): void
- {
- if ($this->initialized) {
- throw new \LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $function->getName()));
- }
-
- $this->staging->addFunction($function);
- }
-
- /**
- * @return TwigFunction[]
- */
- public function getFunctions(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->functions;
- }
-
- public function getFunction(string $name): ?TwigFunction
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- if (isset($this->functions[$name])) {
- return $this->functions[$name];
- }
-
- foreach ($this->functions as $pattern => $function) {
- $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
- if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) {
- array_shift($matches);
- $function->setArguments($matches);
-
- return $function;
- }
- }
-
- foreach ($this->functionCallbacks as $callback) {
- if (false !== $function = $callback($name)) {
- return $function;
- }
- }
-
- return null;
- }
-
- public function registerUndefinedFunctionCallback(callable $callable): void
- {
- $this->functionCallbacks[] = $callable;
- }
-
- public function addFilter(TwigFilter $filter): void
- {
- if ($this->initialized) {
- throw new \LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $filter->getName()));
- }
-
- $this->staging->addFilter($filter);
- }
-
- /**
- * @return TwigFilter[]
- */
- public function getFilters(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->filters;
- }
-
- public function getFilter(string $name): ?TwigFilter
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- if (isset($this->filters[$name])) {
- return $this->filters[$name];
- }
-
- foreach ($this->filters as $pattern => $filter) {
- $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
- if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) {
- array_shift($matches);
- $filter->setArguments($matches);
-
- return $filter;
- }
- }
-
- foreach ($this->filterCallbacks as $callback) {
- if (false !== $filter = $callback($name)) {
- return $filter;
- }
- }
-
- return null;
- }
-
- public function registerUndefinedFilterCallback(callable $callable): void
- {
- $this->filterCallbacks[] = $callable;
- }
-
- public function addNodeVisitor(NodeVisitorInterface $visitor): void
- {
- if ($this->initialized) {
- throw new \LogicException('Unable to add a node visitor as extensions have already been initialized.');
- }
-
- $this->staging->addNodeVisitor($visitor);
- }
-
- /**
- * @return NodeVisitorInterface[]
- */
- public function getNodeVisitors(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->visitors;
- }
-
- public function addTokenParser(TokenParserInterface $parser): void
- {
- if ($this->initialized) {
- throw new \LogicException('Unable to add a token parser as extensions have already been initialized.');
- }
-
- $this->staging->addTokenParser($parser);
- }
-
- /**
- * @return TokenParserInterface[]
- */
- public function getTokenParsers(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->parsers;
- }
-
- public function getTokenParser(string $name): ?TokenParserInterface
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- if (isset($this->parsers[$name])) {
- return $this->parsers[$name];
- }
-
- foreach ($this->parserCallbacks as $callback) {
- if (false !== $parser = $callback($name)) {
- return $parser;
- }
- }
-
- return null;
- }
-
- public function registerUndefinedTokenParserCallback(callable $callable): void
- {
- $this->parserCallbacks[] = $callable;
- }
-
- /**
- * @return array
- */
- public function getGlobals(): array
- {
- if (null !== $this->globals) {
- return $this->globals;
- }
-
- $globals = [];
- foreach ($this->extensions as $extension) {
- if (!$extension instanceof GlobalsInterface) {
- continue;
- }
-
- $extGlobals = $extension->getGlobals();
- if (!\is_array($extGlobals)) {
- throw new \UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', \get_class($extension)));
- }
-
- $globals = array_merge($globals, $extGlobals);
- }
-
- if ($this->initialized) {
- $this->globals = $globals;
- }
-
- return $globals;
- }
-
- public function addTest(TwigTest $test): void
- {
- if ($this->initialized) {
- throw new \LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $test->getName()));
- }
-
- $this->staging->addTest($test);
- }
-
- /**
- * @return TwigTest[]
- */
- public function getTests(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->tests;
- }
-
- public function getTest(string $name): ?TwigTest
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- if (isset($this->tests[$name])) {
- return $this->tests[$name];
- }
-
- foreach ($this->tests as $pattern => $test) {
- $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
- if ($count) {
- if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
- array_shift($matches);
- $test->setArguments($matches);
-
- return $test;
- }
- }
- }
-
- return null;
- }
-
- /**
- * @return array}>
- */
- public function getUnaryOperators(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->unaryOperators;
- }
-
- /**
- * @return array, associativity: ExpressionParser::OPERATOR_*}>
- */
- public function getBinaryOperators(): array
- {
- if (!$this->initialized) {
- $this->initExtensions();
- }
-
- return $this->binaryOperators;
- }
-
- private function initExtensions(): void
- {
- $this->parsers = [];
- $this->filters = [];
- $this->functions = [];
- $this->tests = [];
- $this->visitors = [];
- $this->unaryOperators = [];
- $this->binaryOperators = [];
-
- foreach ($this->extensions as $extension) {
- $this->initExtension($extension);
- }
- $this->initExtension($this->staging);
- // Done at the end only, so that an exception during initialization does not mark the environment as initialized when catching the exception
- $this->initialized = true;
- }
-
- private function initExtension(ExtensionInterface $extension): void
- {
- // filters
- foreach ($extension->getFilters() as $filter) {
- $this->filters[$filter->getName()] = $filter;
- }
-
- // functions
- foreach ($extension->getFunctions() as $function) {
- $this->functions[$function->getName()] = $function;
- }
-
- // tests
- foreach ($extension->getTests() as $test) {
- $this->tests[$test->getName()] = $test;
- }
-
- // token parsers
- foreach ($extension->getTokenParsers() as $parser) {
- if (!$parser instanceof TokenParserInterface) {
- throw new \LogicException('getTokenParsers() must return an array of \Twig\TokenParser\TokenParserInterface.');
- }
-
- $this->parsers[$parser->getTag()] = $parser;
- }
-
- // node visitors
- foreach ($extension->getNodeVisitors() as $visitor) {
- $this->visitors[] = $visitor;
- }
-
- // operators
- if ($operators = $extension->getOperators()) {
- if (!\is_array($operators)) {
- throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array with operators, got "%s".', \get_class($extension), \is_object($operators) ? \get_class($operators) : \gettype($operators).(\is_resource($operators) ? '' : '#'.$operators)));
- }
-
- if (2 !== \count($operators)) {
- throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array of 2 elements, got %d.', \get_class($extension), \count($operators)));
- }
-
- $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
- $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
- }
- }
-}
diff --git a/vendor/twig/twig/src/FileExtensionEscapingStrategy.php b/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
deleted file mode 100644
index 812071bf..00000000
--- a/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- */
-class FileExtensionEscapingStrategy
-{
- /**
- * Guesses the best autoescaping strategy based on the file name.
- *
- * @param string $name The template name
- *
- * @return string|false The escaping strategy name to use or false to disable
- */
- public static function guess(string $name)
- {
- if (\in_array(substr($name, -1), ['/', '\\'])) {
- return 'html'; // return html for directories
- }
-
- if (str_ends_with($name, '.twig')) {
- $name = substr($name, 0, -5);
- }
-
- $extension = pathinfo($name, \PATHINFO_EXTENSION);
-
- switch ($extension) {
- case 'js':
- return 'js';
-
- case 'css':
- return 'css';
-
- case 'txt':
- return false;
-
- default:
- return 'html';
- }
- }
-}
diff --git a/vendor/twig/twig/src/Lexer.php b/vendor/twig/twig/src/Lexer.php
deleted file mode 100644
index e15e896f..00000000
--- a/vendor/twig/twig/src/Lexer.php
+++ /dev/null
@@ -1,519 +0,0 @@
-
- */
-class Lexer
-{
- private $isInitialized = false;
-
- private $tokens;
- private $code;
- private $cursor;
- private $lineno;
- private $end;
- private $state;
- private $states;
- private $brackets;
- private $env;
- private $source;
- private $options;
- private $regexes;
- private $position;
- private $positions;
- private $currentVarBlockLine;
-
- public const STATE_DATA = 0;
- public const STATE_BLOCK = 1;
- public const STATE_VAR = 2;
- public const STATE_STRING = 3;
- public const STATE_INTERPOLATION = 4;
-
- public const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
- public const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?([Ee][\+\-][0-9]+)?/A';
- public const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
- public const REGEX_DQ_STRING_DELIM = '/"/A';
- public const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
- public const PUNCTUATION = '()[]{}?:.,|';
-
- public function __construct(Environment $env, array $options = [])
- {
- $this->env = $env;
-
- $this->options = array_merge([
- 'tag_comment' => ['{#', '#}'],
- 'tag_block' => ['{%', '%}'],
- 'tag_variable' => ['{{', '}}'],
- 'whitespace_trim' => '-',
- 'whitespace_line_trim' => '~',
- 'whitespace_line_chars' => ' \t\0\x0B',
- 'interpolation' => ['#{', '}'],
- ], $options);
- }
-
- private function initialize()
- {
- if ($this->isInitialized) {
- return;
- }
-
- // when PHP 7.3 is the min version, we will be able to remove the '#' part in preg_quote as it's part of the default
- $this->regexes = [
- // }}
- 'lex_var' => '{
- \s*
- (?:'.
- preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '#').'\s*'. // -}}\s*
- '|'.
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_variable'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~}}[ \t\0\x0B]*
- '|'.
- preg_quote($this->options['tag_variable'][1], '#'). // }}
- ')
- }Ax',
-
- // %}
- 'lex_block' => '{
- \s*
- (?:'.
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*\n?'. // -%}\s*\n?
- '|'.
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
- '|'.
- preg_quote($this->options['tag_block'][1], '#').'\n?'. // %}\n?
- ')
- }Ax',
-
- // {% endverbatim %}
- 'lex_raw_data' => '{'.
- preg_quote($this->options['tag_block'][0], '#'). // {%
- '('.
- $this->options['whitespace_trim']. // -
- '|'.
- $this->options['whitespace_line_trim']. // ~
- ')?\s*endverbatim\s*'.
- '(?:'.
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}
- '|'.
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
- '|'.
- preg_quote($this->options['tag_block'][1], '#'). // %}
- ')
- }sx',
-
- 'operator' => $this->getOperatorRegex(),
-
- // #}
- 'lex_comment' => '{
- (?:'.
- preg_quote($this->options['whitespace_trim'].$this->options['tag_comment'][1], '#').'\s*\n?'. // -#}\s*\n?
- '|'.
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_comment'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~#}[ \t\0\x0B]*
- '|'.
- preg_quote($this->options['tag_comment'][1], '#').'\n?'. // #}\n?
- ')
- }sx',
-
- // verbatim %}
- 'lex_block_raw' => '{
- \s*verbatim\s*
- (?:'.
- preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}\s*
- '|'.
- preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
- '|'.
- preg_quote($this->options['tag_block'][1], '#'). // %}
- ')
- }Asx',
-
- 'lex_block_line' => '{\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '#').'}As',
-
- // {{ or {% or {#
- 'lex_tokens_start' => '{
- ('.
- preg_quote($this->options['tag_variable'][0], '#'). // {{
- '|'.
- preg_quote($this->options['tag_block'][0], '#'). // {%
- '|'.
- preg_quote($this->options['tag_comment'][0], '#'). // {#
- ')('.
- preg_quote($this->options['whitespace_trim'], '#'). // -
- '|'.
- preg_quote($this->options['whitespace_line_trim'], '#'). // ~
- ')?
- }sx',
- 'interpolation_start' => '{'.preg_quote($this->options['interpolation'][0], '#').'\s*}A',
- 'interpolation_end' => '{\s*'.preg_quote($this->options['interpolation'][1], '#').'}A',
- ];
-
- $this->isInitialized = true;
- }
-
- public function tokenize(Source $source): TokenStream
- {
- $this->initialize();
-
- $this->source = $source;
- $this->code = str_replace(["\r\n", "\r"], "\n", $source->getCode());
- $this->cursor = 0;
- $this->lineno = 1;
- $this->end = \strlen($this->code);
- $this->tokens = [];
- $this->state = self::STATE_DATA;
- $this->states = [];
- $this->brackets = [];
- $this->position = -1;
-
- // find all token starts in one go
- preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, \PREG_OFFSET_CAPTURE);
- $this->positions = $matches;
-
- while ($this->cursor < $this->end) {
- // dispatch to the lexing functions depending
- // on the current state
- switch ($this->state) {
- case self::STATE_DATA:
- $this->lexData();
- break;
-
- case self::STATE_BLOCK:
- $this->lexBlock();
- break;
-
- case self::STATE_VAR:
- $this->lexVar();
- break;
-
- case self::STATE_STRING:
- $this->lexString();
- break;
-
- case self::STATE_INTERPOLATION:
- $this->lexInterpolation();
- break;
- }
- }
-
- $this->pushToken(/* Token::EOF_TYPE */ -1);
-
- if (!empty($this->brackets)) {
- [$expect, $lineno] = array_pop($this->brackets);
- throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
-
- return new TokenStream($this->tokens, $this->source);
- }
-
- private function lexData(): void
- {
- // if no matches are left we return the rest of the template as simple text token
- if ($this->position == \count($this->positions[0]) - 1) {
- $this->pushToken(/* Token::TEXT_TYPE */ 0, substr($this->code, $this->cursor));
- $this->cursor = $this->end;
-
- return;
- }
-
- // Find the first token after the current cursor
- $position = $this->positions[0][++$this->position];
- while ($position[1] < $this->cursor) {
- if ($this->position == \count($this->positions[0]) - 1) {
- return;
- }
- $position = $this->positions[0][++$this->position];
- }
-
- // push the template text first
- $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
-
- // trim?
- if (isset($this->positions[2][$this->position][0])) {
- if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
- // whitespace_trim detected ({%-, {{- or {#-)
- $text = rtrim($text);
- } elseif ($this->options['whitespace_line_trim'] === $this->positions[2][$this->position][0]) {
- // whitespace_line_trim detected ({%~, {{~ or {#~)
- // don't trim \r and \n
- $text = rtrim($text, " \t\0\x0B");
- }
- }
- $this->pushToken(/* Token::TEXT_TYPE */ 0, $text);
- $this->moveCursor($textContent.$position[0]);
-
- switch ($this->positions[1][$this->position][0]) {
- case $this->options['tag_comment'][0]:
- $this->lexComment();
- break;
-
- case $this->options['tag_block'][0]:
- // raw data?
- if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, 0, $this->cursor)) {
- $this->moveCursor($match[0]);
- $this->lexRawData();
- // {% line \d+ %}
- } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, 0, $this->cursor)) {
- $this->moveCursor($match[0]);
- $this->lineno = (int) $match[1];
- } else {
- $this->pushToken(/* Token::BLOCK_START_TYPE */ 1);
- $this->pushState(self::STATE_BLOCK);
- $this->currentVarBlockLine = $this->lineno;
- }
- break;
-
- case $this->options['tag_variable'][0]:
- $this->pushToken(/* Token::VAR_START_TYPE */ 2);
- $this->pushState(self::STATE_VAR);
- $this->currentVarBlockLine = $this->lineno;
- break;
- }
- }
-
- private function lexBlock(): void
- {
- if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, 0, $this->cursor)) {
- $this->pushToken(/* Token::BLOCK_END_TYPE */ 3);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- private function lexVar(): void
- {
- if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, 0, $this->cursor)) {
- $this->pushToken(/* Token::VAR_END_TYPE */ 4);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- private function lexExpression(): void
- {
- // whitespace
- if (preg_match('/\s+/A', $this->code, $match, 0, $this->cursor)) {
- $this->moveCursor($match[0]);
-
- if ($this->cursor >= $this->end) {
- throw new SyntaxError(sprintf('Unclosed "%s".', self::STATE_BLOCK === $this->state ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
- }
- }
-
- // spread operator
- if ('.' === $this->code[$this->cursor] && ($this->cursor + 2 < $this->end) && '.' === $this->code[$this->cursor + 1] && '.' === $this->code[$this->cursor + 2]) {
- $this->pushToken(Token::SPREAD_TYPE, '...');
- $this->moveCursor('...');
- }
- // arrow function
- elseif ('=' === $this->code[$this->cursor] && ($this->cursor + 1 < $this->end) && '>' === $this->code[$this->cursor + 1]) {
- $this->pushToken(Token::ARROW_TYPE, '=>');
- $this->moveCursor('=>');
- }
- // operators
- elseif (preg_match($this->regexes['operator'], $this->code, $match, 0, $this->cursor)) {
- $this->pushToken(/* Token::OPERATOR_TYPE */ 8, preg_replace('/\s+/', ' ', $match[0]));
- $this->moveCursor($match[0]);
- }
- // names
- elseif (preg_match(self::REGEX_NAME, $this->code, $match, 0, $this->cursor)) {
- $this->pushToken(/* Token::NAME_TYPE */ 5, $match[0]);
- $this->moveCursor($match[0]);
- }
- // numbers
- elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, 0, $this->cursor)) {
- $number = (float) $match[0]; // floats
- if (ctype_digit($match[0]) && $number <= \PHP_INT_MAX) {
- $number = (int) $match[0]; // integers lower than the maximum
- }
- $this->pushToken(/* Token::NUMBER_TYPE */ 6, $number);
- $this->moveCursor($match[0]);
- }
- // punctuation
- elseif (str_contains(self::PUNCTUATION, $this->code[$this->cursor])) {
- // opening bracket
- if (str_contains('([{', $this->code[$this->cursor])) {
- $this->brackets[] = [$this->code[$this->cursor], $this->lineno];
- }
- // closing bracket
- elseif (str_contains(')]}', $this->code[$this->cursor])) {
- if (empty($this->brackets)) {
- throw new SyntaxError(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
-
- [$expect, $lineno] = array_pop($this->brackets);
- if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) {
- throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
- }
-
- $this->pushToken(/* Token::PUNCTUATION_TYPE */ 9, $this->code[$this->cursor]);
- ++$this->cursor;
- }
- // strings
- elseif (preg_match(self::REGEX_STRING, $this->code, $match, 0, $this->cursor)) {
- $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes(substr($match[0], 1, -1)));
- $this->moveCursor($match[0]);
- }
- // opening double quoted string
- elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
- $this->brackets[] = ['"', $this->lineno];
- $this->pushState(self::STATE_STRING);
- $this->moveCursor($match[0]);
- }
- // unlexable
- else {
- throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
- }
-
- private function lexRawData(): void
- {
- if (!preg_match($this->regexes['lex_raw_data'], $this->code, $match, \PREG_OFFSET_CAPTURE, $this->cursor)) {
- throw new SyntaxError('Unexpected end of file: Unclosed "verbatim" block.', $this->lineno, $this->source);
- }
-
- $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
- $this->moveCursor($text.$match[0][0]);
-
- // trim?
- if (isset($match[1][0])) {
- if ($this->options['whitespace_trim'] === $match[1][0]) {
- // whitespace_trim detected ({%-, {{- or {#-)
- $text = rtrim($text);
- } else {
- // whitespace_line_trim detected ({%~, {{~ or {#~)
- // don't trim \r and \n
- $text = rtrim($text, " \t\0\x0B");
- }
- }
-
- $this->pushToken(/* Token::TEXT_TYPE */ 0, $text);
- }
-
- private function lexComment(): void
- {
- if (!preg_match($this->regexes['lex_comment'], $this->code, $match, \PREG_OFFSET_CAPTURE, $this->cursor)) {
- throw new SyntaxError('Unclosed comment.', $this->lineno, $this->source);
- }
-
- $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]);
- }
-
- private function lexString(): void
- {
- if (preg_match($this->regexes['interpolation_start'], $this->code, $match, 0, $this->cursor)) {
- $this->brackets[] = [$this->options['interpolation'][0], $this->lineno];
- $this->pushToken(/* Token::INTERPOLATION_START_TYPE */ 10);
- $this->moveCursor($match[0]);
- $this->pushState(self::STATE_INTERPOLATION);
- } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, 0, $this->cursor) && '' !== $match[0]) {
- $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes($match[0]));
- $this->moveCursor($match[0]);
- } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
- [$expect, $lineno] = array_pop($this->brackets);
- if ('"' != $this->code[$this->cursor]) {
- throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
-
- $this->popState();
- ++$this->cursor;
- } else {
- // unlexable
- throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
- }
-
- private function lexInterpolation(): void
- {
- $bracket = end($this->brackets);
- if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, 0, $this->cursor)) {
- array_pop($this->brackets);
- $this->pushToken(/* Token::INTERPOLATION_END_TYPE */ 11);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- private function pushToken($type, $value = ''): void
- {
- // do not push empty text tokens
- if (/* Token::TEXT_TYPE */ 0 === $type && '' === $value) {
- return;
- }
-
- $this->tokens[] = new Token($type, $value, $this->lineno);
- }
-
- private function moveCursor($text): void
- {
- $this->cursor += \strlen($text);
- $this->lineno += substr_count($text, "\n");
- }
-
- private function getOperatorRegex(): string
- {
- $operators = array_merge(
- ['='],
- array_keys($this->env->getUnaryOperators()),
- array_keys($this->env->getBinaryOperators())
- );
-
- $operators = array_combine($operators, array_map('strlen', $operators));
- arsort($operators);
-
- $regex = [];
- foreach ($operators as $operator => $length) {
- // an operator that ends with a character must be followed by
- // a whitespace, a parenthesis, an opening map [ or sequence {
- $r = preg_quote($operator, '/');
- if (ctype_alpha($operator[$length - 1])) {
- $r .= '(?=[\s()\[{])';
- }
-
- // an operator that begins with a character must not have a dot or pipe before
- if (ctype_alpha($operator[0])) {
- $r = '(?states[] = $this->state;
- $this->state = $state;
- }
-
- private function popState(): void
- {
- if (0 === \count($this->states)) {
- throw new \LogicException('Cannot pop state without a previous state.');
- }
-
- $this->state = array_pop($this->states);
- }
-}
diff --git a/vendor/twig/twig/src/Loader/ArrayLoader.php b/vendor/twig/twig/src/Loader/ArrayLoader.php
deleted file mode 100644
index 5d726c35..00000000
--- a/vendor/twig/twig/src/Loader/ArrayLoader.php
+++ /dev/null
@@ -1,77 +0,0 @@
-
- */
-final class ArrayLoader implements LoaderInterface
-{
- private $templates = [];
-
- /**
- * @param array $templates An array of templates (keys are the names, and values are the source code)
- */
- public function __construct(array $templates = [])
- {
- $this->templates = $templates;
- }
-
- public function setTemplate(string $name, string $template): void
- {
- $this->templates[$name] = $template;
- }
-
- public function getSourceContext(string $name): Source
- {
- if (!isset($this->templates[$name])) {
- throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
- }
-
- return new Source($this->templates[$name], $name);
- }
-
- public function exists(string $name): bool
- {
- return isset($this->templates[$name]);
- }
-
- public function getCacheKey(string $name): string
- {
- if (!isset($this->templates[$name])) {
- throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
- }
-
- return $name.':'.$this->templates[$name];
- }
-
- public function isFresh(string $name, int $time): bool
- {
- if (!isset($this->templates[$name])) {
- throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
- }
-
- return true;
- }
-}
diff --git a/vendor/twig/twig/src/Loader/ChainLoader.php b/vendor/twig/twig/src/Loader/ChainLoader.php
deleted file mode 100644
index fbf4f3a0..00000000
--- a/vendor/twig/twig/src/Loader/ChainLoader.php
+++ /dev/null
@@ -1,119 +0,0 @@
-
- */
-final class ChainLoader implements LoaderInterface
-{
- private $hasSourceCache = [];
- private $loaders = [];
-
- /**
- * @param LoaderInterface[] $loaders
- */
- public function __construct(array $loaders = [])
- {
- foreach ($loaders as $loader) {
- $this->addLoader($loader);
- }
- }
-
- public function addLoader(LoaderInterface $loader): void
- {
- $this->loaders[] = $loader;
- $this->hasSourceCache = [];
- }
-
- /**
- * @return LoaderInterface[]
- */
- public function getLoaders(): array
- {
- return $this->loaders;
- }
-
- public function getSourceContext(string $name): Source
- {
- $exceptions = [];
- foreach ($this->loaders as $loader) {
- if (!$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->getSourceContext($name);
- } catch (LoaderError $e) {
- $exceptions[] = $e->getMessage();
- }
- }
-
- throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-
- public function exists(string $name): bool
- {
- if (isset($this->hasSourceCache[$name])) {
- return $this->hasSourceCache[$name];
- }
-
- foreach ($this->loaders as $loader) {
- if ($loader->exists($name)) {
- return $this->hasSourceCache[$name] = true;
- }
- }
-
- return $this->hasSourceCache[$name] = false;
- }
-
- public function getCacheKey(string $name): string
- {
- $exceptions = [];
- foreach ($this->loaders as $loader) {
- if (!$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->getCacheKey($name);
- } catch (LoaderError $e) {
- $exceptions[] = \get_class($loader).': '.$e->getMessage();
- }
- }
-
- throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-
- public function isFresh(string $name, int $time): bool
- {
- $exceptions = [];
- foreach ($this->loaders as $loader) {
- if (!$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->isFresh($name, $time);
- } catch (LoaderError $e) {
- $exceptions[] = \get_class($loader).': '.$e->getMessage();
- }
- }
-
- throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-}
diff --git a/vendor/twig/twig/src/Loader/FilesystemLoader.php b/vendor/twig/twig/src/Loader/FilesystemLoader.php
deleted file mode 100644
index 8472796f..00000000
--- a/vendor/twig/twig/src/Loader/FilesystemLoader.php
+++ /dev/null
@@ -1,283 +0,0 @@
-
- */
-class FilesystemLoader implements LoaderInterface
-{
- /** Identifier of the main namespace. */
- public const MAIN_NAMESPACE = '__main__';
-
- protected $paths = [];
- protected $cache = [];
- protected $errorCache = [];
-
- private $rootPath;
-
- /**
- * @param string|array $paths A path or an array of paths where to look for templates
- * @param string|null $rootPath The root path common to all relative paths (null for getcwd())
- */
- public function __construct($paths = [], ?string $rootPath = null)
- {
- $this->rootPath = ($rootPath ?? getcwd()).\DIRECTORY_SEPARATOR;
- if (null !== $rootPath && false !== ($realPath = realpath($rootPath))) {
- $this->rootPath = $realPath.\DIRECTORY_SEPARATOR;
- }
-
- if ($paths) {
- $this->setPaths($paths);
- }
- }
-
- /**
- * Returns the paths to the templates.
- */
- public function getPaths(string $namespace = self::MAIN_NAMESPACE): array
- {
- return $this->paths[$namespace] ?? [];
- }
-
- /**
- * Returns the path namespaces.
- *
- * The main namespace is always defined.
- */
- public function getNamespaces(): array
- {
- return array_keys($this->paths);
- }
-
- /**
- * @param string|array $paths A path or an array of paths where to look for templates
- */
- public function setPaths($paths, string $namespace = self::MAIN_NAMESPACE): void
- {
- if (!\is_array($paths)) {
- $paths = [$paths];
- }
-
- $this->paths[$namespace] = [];
- foreach ($paths as $path) {
- $this->addPath($path, $namespace);
- }
- }
-
- /**
- * @throws LoaderError
- */
- public function addPath(string $path, string $namespace = self::MAIN_NAMESPACE): void
- {
- // invalidate the cache
- $this->cache = $this->errorCache = [];
-
- $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
- if (!is_dir($checkPath)) {
- throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
- }
-
- $this->paths[$namespace][] = rtrim($path, '/\\');
- }
-
- /**
- * @throws LoaderError
- */
- public function prependPath(string $path, string $namespace = self::MAIN_NAMESPACE): void
- {
- // invalidate the cache
- $this->cache = $this->errorCache = [];
-
- $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
- if (!is_dir($checkPath)) {
- throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
- }
-
- $path = rtrim($path, '/\\');
-
- if (!isset($this->paths[$namespace])) {
- $this->paths[$namespace][] = $path;
- } else {
- array_unshift($this->paths[$namespace], $path);
- }
- }
-
- public function getSourceContext(string $name): Source
- {
- if (null === $path = $this->findTemplate($name)) {
- return new Source('', $name, '');
- }
-
- return new Source(file_get_contents($path), $name, $path);
- }
-
- public function getCacheKey(string $name): string
- {
- if (null === $path = $this->findTemplate($name)) {
- return '';
- }
- $len = \strlen($this->rootPath);
- if (0 === strncmp($this->rootPath, $path, $len)) {
- return substr($path, $len);
- }
-
- return $path;
- }
-
- /**
- * @return bool
- */
- public function exists(string $name)
- {
- $name = $this->normalizeName($name);
-
- if (isset($this->cache[$name])) {
- return true;
- }
-
- return null !== $this->findTemplate($name, false);
- }
-
- public function isFresh(string $name, int $time): bool
- {
- // false support to be removed in 3.0
- if (null === $path = $this->findTemplate($name)) {
- return false;
- }
-
- return filemtime($path) < $time;
- }
-
- /**
- * @return string|null
- */
- protected function findTemplate(string $name, bool $throw = true)
- {
- $name = $this->normalizeName($name);
-
- if (isset($this->cache[$name])) {
- return $this->cache[$name];
- }
-
- if (isset($this->errorCache[$name])) {
- if (!$throw) {
- return null;
- }
-
- throw new LoaderError($this->errorCache[$name]);
- }
-
- try {
- [$namespace, $shortname] = $this->parseName($name);
-
- $this->validateName($shortname);
- } catch (LoaderError $e) {
- if (!$throw) {
- return null;
- }
-
- throw $e;
- }
-
- if (!isset($this->paths[$namespace])) {
- $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
-
- if (!$throw) {
- return null;
- }
-
- throw new LoaderError($this->errorCache[$name]);
- }
-
- foreach ($this->paths[$namespace] as $path) {
- if (!$this->isAbsolutePath($path)) {
- $path = $this->rootPath.$path;
- }
-
- if (is_file($path.'/'.$shortname)) {
- if (false !== $realpath = realpath($path.'/'.$shortname)) {
- return $this->cache[$name] = $realpath;
- }
-
- return $this->cache[$name] = $path.'/'.$shortname;
- }
- }
-
- $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
-
- if (!$throw) {
- return null;
- }
-
- throw new LoaderError($this->errorCache[$name]);
- }
-
- private function normalizeName(string $name): string
- {
- return preg_replace('#/{2,}#', '/', str_replace('\\', '/', $name));
- }
-
- private function parseName(string $name, string $default = self::MAIN_NAMESPACE): array
- {
- if (isset($name[0]) && '@' == $name[0]) {
- if (false === $pos = strpos($name, '/')) {
- throw new LoaderError(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
- }
-
- $namespace = substr($name, 1, $pos - 1);
- $shortname = substr($name, $pos + 1);
-
- return [$namespace, $shortname];
- }
-
- return [$default, $name];
- }
-
- private function validateName(string $name): void
- {
- if (str_contains($name, "\0")) {
- throw new LoaderError('A template name cannot contain NUL bytes.');
- }
-
- $name = ltrim($name, '/');
- $parts = explode('/', $name);
- $level = 0;
- foreach ($parts as $part) {
- if ('..' === $part) {
- --$level;
- } elseif ('.' !== $part) {
- ++$level;
- }
-
- if ($level < 0) {
- throw new LoaderError(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
- }
- }
- }
-
- private function isAbsolutePath(string $file): bool
- {
- return strspn($file, '/\\', 0, 1)
- || (\strlen($file) > 3 && ctype_alpha($file[0])
- && ':' === $file[1]
- && strspn($file, '/\\', 2, 1)
- )
- || null !== parse_url($file, \PHP_URL_SCHEME)
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Loader/LoaderInterface.php b/vendor/twig/twig/src/Loader/LoaderInterface.php
deleted file mode 100644
index fec7e85f..00000000
--- a/vendor/twig/twig/src/Loader/LoaderInterface.php
+++ /dev/null
@@ -1,49 +0,0 @@
-
- */
-interface LoaderInterface
-{
- /**
- * Returns the source context for a given template logical name.
- *
- * @throws LoaderError When $name is not found
- */
- public function getSourceContext(string $name): Source;
-
- /**
- * Gets the cache key to use for the cache for a given template name.
- *
- * @throws LoaderError When $name is not found
- */
- public function getCacheKey(string $name): string;
-
- /**
- * @param int $time Timestamp of the last modification time of the cached template
- *
- * @throws LoaderError When $name is not found
- */
- public function isFresh(string $name, int $time): bool;
-
- /**
- * @return bool
- */
- public function exists(string $name);
-}
diff --git a/vendor/twig/twig/src/Markup.php b/vendor/twig/twig/src/Markup.php
deleted file mode 100644
index 1788acc4..00000000
--- a/vendor/twig/twig/src/Markup.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
- */
-class Markup implements \Countable, \JsonSerializable
-{
- private $content;
- private $charset;
-
- public function __construct($content, $charset)
- {
- $this->content = (string) $content;
- $this->charset = $charset;
- }
-
- public function __toString()
- {
- return $this->content;
- }
-
- /**
- * @return int
- */
- #[\ReturnTypeWillChange]
- public function count()
- {
- return mb_strlen($this->content, $this->charset);
- }
-
- /**
- * @return mixed
- */
- #[\ReturnTypeWillChange]
- public function jsonSerialize()
- {
- return $this->content;
- }
-}
diff --git a/vendor/twig/twig/src/Node/AutoEscapeNode.php b/vendor/twig/twig/src/Node/AutoEscapeNode.php
deleted file mode 100644
index f9bc17e0..00000000
--- a/vendor/twig/twig/src/Node/AutoEscapeNode.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-#[YieldReady]
-class AutoEscapeNode extends Node
-{
- public function __construct($value, Node $body, int $lineno, string $tag = 'autoescape')
- {
- parent::__construct(['body' => $body], ['value' => $value], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->subcompile($this->getNode('body'));
- }
-}
diff --git a/vendor/twig/twig/src/Node/BlockNode.php b/vendor/twig/twig/src/Node/BlockNode.php
deleted file mode 100644
index 65174c02..00000000
--- a/vendor/twig/twig/src/Node/BlockNode.php
+++ /dev/null
@@ -1,47 +0,0 @@
-
- */
-#[YieldReady]
-class BlockNode extends Node
-{
- public function __construct(string $name, Node $body, int $lineno, ?string $tag = null)
- {
- parent::__construct(['body' => $body], ['name' => $name], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf("public function block_%s(\$context, array \$blocks = [])\n", $this->getAttribute('name')), "{\n")
- ->indent()
- ->write("\$macros = \$this->macros;\n")
- ;
-
- $compiler
- ->subcompile($this->getNode('body'))
- ->write("return; yield '';\n") // needed when body doesn't yield anything
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/BlockReferenceNode.php b/vendor/twig/twig/src/Node/BlockReferenceNode.php
deleted file mode 100644
index f48082be..00000000
--- a/vendor/twig/twig/src/Node/BlockReferenceNode.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
- */
-#[YieldReady]
-class BlockReferenceNode extends Node implements NodeOutputInterface
-{
- public function __construct(string $name, int $lineno, ?string $tag = null)
- {
- parent::__construct([], ['name' => $name], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf("yield from \$this->unwrap()->yieldBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name')))
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/BodyNode.php b/vendor/twig/twig/src/Node/BodyNode.php
deleted file mode 100644
index 08115b3b..00000000
--- a/vendor/twig/twig/src/Node/BodyNode.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
-#[YieldReady]
-class BodyNode extends Node
-{
-}
diff --git a/vendor/twig/twig/src/Node/CaptureNode.php b/vendor/twig/twig/src/Node/CaptureNode.php
deleted file mode 100644
index b1cb357f..00000000
--- a/vendor/twig/twig/src/Node/CaptureNode.php
+++ /dev/null
@@ -1,57 +0,0 @@
-
- */
-#[YieldReady]
-class CaptureNode extends Node
-{
- public function __construct(Node $body, int $lineno, ?string $tag = null)
- {
- parent::__construct(['body' => $body], ['raw' => false], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $useYield = $compiler->getEnvironment()->useYield();
-
- if (!$this->getAttribute('raw')) {
- $compiler->raw("('' === \$tmp = ");
- }
- $compiler
- ->raw($useYield ? "implode('', iterator_to_array(" : '\\Twig\\Extension\\CoreExtension::captureOutput(')
- ->raw("(function () use (&\$context, \$macros, \$blocks) {\n")
- ->indent()
- ->subcompile($this->getNode('body'))
- ->write("return; yield '';\n")
- ->outdent()
- ->write('})()')
- ;
- if ($useYield) {
- $compiler->raw(', false))');
- } else {
- $compiler->raw(')');
- }
- if (!$this->getAttribute('raw')) {
- $compiler->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset());");
- } else {
- $compiler->raw(';');
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/CheckSecurityCallNode.php b/vendor/twig/twig/src/Node/CheckSecurityCallNode.php
deleted file mode 100644
index 66aaeb52..00000000
--- a/vendor/twig/twig/src/Node/CheckSecurityCallNode.php
+++ /dev/null
@@ -1,30 +0,0 @@
-
- */
-#[YieldReady]
-class CheckSecurityCallNode extends Node
-{
- public function compile(Compiler $compiler)
- {
- $compiler
- ->write("\$this->sandbox = \$this->env->getExtension(SandboxExtension::class);\n")
- ->write("\$this->checkSecurity();\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/CheckSecurityNode.php b/vendor/twig/twig/src/Node/CheckSecurityNode.php
deleted file mode 100644
index 6e591aad..00000000
--- a/vendor/twig/twig/src/Node/CheckSecurityNode.php
+++ /dev/null
@@ -1,85 +0,0 @@
-
- */
-#[YieldReady]
-class CheckSecurityNode extends Node
-{
- private $usedFilters;
- private $usedTags;
- private $usedFunctions;
-
- /**
- * @param array $usedFilters
- * @param array $usedTags
- * @param array $usedFunctions
- */
- public function __construct(array $usedFilters, array $usedTags, array $usedFunctions)
- {
- $this->usedFilters = $usedFilters;
- $this->usedTags = $usedTags;
- $this->usedFunctions = $usedFunctions;
-
- parent::__construct();
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->write("\n")
- ->write("public function checkSecurity()\n")
- ->write("{\n")
- ->indent()
- ->write('static $tags = ')->repr(array_filter($this->usedTags))->raw(";\n")
- ->write('static $filters = ')->repr(array_filter($this->usedFilters))->raw(";\n")
- ->write('static $functions = ')->repr(array_filter($this->usedFunctions))->raw(";\n\n")
- ->write("try {\n")
- ->indent()
- ->write("\$this->sandbox->checkSecurity(\n")
- ->indent()
- ->write(!$this->usedTags ? "[],\n" : "['".implode("', '", array_keys($this->usedTags))."'],\n")
- ->write(!$this->usedFilters ? "[],\n" : "['".implode("', '", array_keys($this->usedFilters))."'],\n")
- ->write(!$this->usedFunctions ? "[],\n" : "['".implode("', '", array_keys($this->usedFunctions))."'],\n")
- ->write("\$this->source\n")
- ->outdent()
- ->write(");\n")
- ->outdent()
- ->write("} catch (SecurityError \$e) {\n")
- ->indent()
- ->write("\$e->setSourceContext(\$this->source);\n\n")
- ->write("if (\$e instanceof SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n")
- ->outdent()
- ->write("} elseif (\$e instanceof SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n")
- ->outdent()
- ->write("} elseif (\$e instanceof SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n")
- ->outdent()
- ->write("}\n\n")
- ->write("throw \$e;\n")
- ->outdent()
- ->write("}\n\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/CheckToStringNode.php b/vendor/twig/twig/src/Node/CheckToStringNode.php
deleted file mode 100644
index 81fb9240..00000000
--- a/vendor/twig/twig/src/Node/CheckToStringNode.php
+++ /dev/null
@@ -1,47 +0,0 @@
-
- */
-#[YieldReady]
-class CheckToStringNode extends AbstractExpression
-{
- public function __construct(AbstractExpression $expr)
- {
- parent::__construct(['expr' => $expr], [], $expr->getTemplateLine(), $expr->getNodeTag());
- }
-
- public function compile(Compiler $compiler): void
- {
- $expr = $this->getNode('expr');
- $compiler
- ->raw('$this->sandbox->ensureToStringAllowed(')
- ->subcompile($expr)
- ->raw(', ')
- ->repr($expr->getTemplateLine())
- ->raw(', $this->source)')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/DeprecatedNode.php b/vendor/twig/twig/src/Node/DeprecatedNode.php
deleted file mode 100644
index 2dc425dd..00000000
--- a/vendor/twig/twig/src/Node/DeprecatedNode.php
+++ /dev/null
@@ -1,55 +0,0 @@
-
- */
-#[YieldReady]
-class DeprecatedNode extends Node
-{
- public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null)
- {
- parent::__construct(['expr' => $expr], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- $expr = $this->getNode('expr');
-
- if ($expr instanceof ConstantExpression) {
- $compiler->write('@trigger_error(')
- ->subcompile($expr);
- } else {
- $varName = $compiler->getVarName();
- $compiler->write(sprintf('$%s = ', $varName))
- ->subcompile($expr)
- ->raw(";\n")
- ->write(sprintf('@trigger_error($%s', $varName));
- }
-
- $compiler
- ->raw('.')
- ->string(sprintf(' ("%s" at line %d).', $this->getTemplateName(), $this->getTemplateLine()))
- ->raw(", E_USER_DEPRECATED);\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/DoNode.php b/vendor/twig/twig/src/Node/DoNode.php
deleted file mode 100644
index 445016ab..00000000
--- a/vendor/twig/twig/src/Node/DoNode.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-#[YieldReady]
-class DoNode extends Node
-{
- public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null)
- {
- parent::__construct(['expr' => $expr], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write('')
- ->subcompile($this->getNode('expr'))
- ->raw(";\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/EmbedNode.php b/vendor/twig/twig/src/Node/EmbedNode.php
deleted file mode 100644
index 54550946..00000000
--- a/vendor/twig/twig/src/Node/EmbedNode.php
+++ /dev/null
@@ -1,50 +0,0 @@
-
- */
-#[YieldReady]
-class EmbedNode extends IncludeNode
-{
- // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
- public function __construct(string $name, int $index, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, ?string $tag = null)
- {
- parent::__construct(new ConstantExpression('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('index', $index);
- }
-
- protected function addGetTemplate(Compiler $compiler): void
- {
- $compiler
- ->write('$this->loadTemplate(')
- ->string($this->getAttribute('name'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(', ')
- ->string($this->getAttribute('index'))
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/AbstractExpression.php b/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
deleted file mode 100644
index 42da0559..00000000
--- a/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
-abstract class AbstractExpression extends Node
-{
-}
diff --git a/vendor/twig/twig/src/Node/Expression/ArrayExpression.php b/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
deleted file mode 100644
index 5f8b0f63..00000000
--- a/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
+++ /dev/null
@@ -1,135 +0,0 @@
-index = -1;
- foreach ($this->getKeyValuePairs() as $pair) {
- if ($pair['key'] instanceof ConstantExpression && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
- $this->index = $pair['key']->getAttribute('value');
- }
- }
- }
-
- public function getKeyValuePairs(): array
- {
- $pairs = [];
- foreach (array_chunk($this->nodes, 2) as $pair) {
- $pairs[] = [
- 'key' => $pair[0],
- 'value' => $pair[1],
- ];
- }
-
- return $pairs;
- }
-
- public function hasElement(AbstractExpression $key): bool
- {
- foreach ($this->getKeyValuePairs() as $pair) {
- // we compare the string representation of the keys
- // to avoid comparing the line numbers which are not relevant here.
- if ((string) $key === (string) $pair['key']) {
- return true;
- }
- }
-
- return false;
- }
-
- public function addElement(AbstractExpression $value, ?AbstractExpression $key = null): void
- {
- if (null === $key) {
- $key = new ConstantExpression(++$this->index, $value->getTemplateLine());
- }
-
- array_push($this->nodes, $key, $value);
- }
-
- public function compile(Compiler $compiler): void
- {
- $keyValuePairs = $this->getKeyValuePairs();
- $needsArrayMergeSpread = \PHP_VERSION_ID < 80100 && $this->hasSpreadItem($keyValuePairs);
-
- if ($needsArrayMergeSpread) {
- $compiler->raw('CoreExtension::merge(');
- }
- $compiler->raw('[');
- $first = true;
- $reopenAfterMergeSpread = false;
- $nextIndex = 0;
- foreach ($keyValuePairs as $pair) {
- if ($reopenAfterMergeSpread) {
- $compiler->raw(', [');
- $reopenAfterMergeSpread = false;
- }
-
- if ($needsArrayMergeSpread && $pair['value']->hasAttribute('spread')) {
- $compiler->raw('], ')->subcompile($pair['value']);
- $first = true;
- $reopenAfterMergeSpread = true;
- continue;
- }
- if (!$first) {
- $compiler->raw(', ');
- }
- $first = false;
-
- if ($pair['value']->hasAttribute('spread') && !$needsArrayMergeSpread) {
- $compiler->raw('...')->subcompile($pair['value']);
- ++$nextIndex;
- } else {
- $key = $pair['key'] instanceof ConstantExpression ? $pair['key']->getAttribute('value') : null;
-
- if ($nextIndex !== $key) {
- if (\is_int($key)) {
- $nextIndex = $key + 1;
- }
- $compiler
- ->subcompile($pair['key'])
- ->raw(' => ')
- ;
- } else {
- ++$nextIndex;
- }
-
- $compiler->subcompile($pair['value']);
- }
- }
- if (!$reopenAfterMergeSpread) {
- $compiler->raw(']');
- }
- if ($needsArrayMergeSpread) {
- $compiler->raw(')');
- }
- }
-
- private function hasSpreadItem(array $pairs): bool
- {
- foreach ($pairs as $pair) {
- if ($pair['value']->hasAttribute('spread')) {
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php b/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php
deleted file mode 100644
index eaad03c9..00000000
--- a/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php
+++ /dev/null
@@ -1,64 +0,0 @@
-
- */
-class ArrowFunctionExpression extends AbstractExpression
-{
- public function __construct(AbstractExpression $expr, Node $names, $lineno, $tag = null)
- {
- parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->raw('function (')
- ;
- foreach ($this->getNode('names') as $i => $name) {
- if ($i) {
- $compiler->raw(', ');
- }
-
- $compiler
- ->raw('$__')
- ->raw($name->getAttribute('name'))
- ->raw('__')
- ;
- }
- $compiler
- ->raw(') use ($context, $macros) { ')
- ;
- foreach ($this->getNode('names') as $name) {
- $compiler
- ->raw('$context["')
- ->raw($name->getAttribute('name'))
- ->raw('"] = $__')
- ->raw($name->getAttribute('name'))
- ->raw('__; ')
- ;
- }
- $compiler
- ->raw('return ')
- ->subcompile($this->getNode('expr'))
- ->raw('; }')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php b/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
deleted file mode 100644
index 7dd1bc4a..00000000
--- a/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
+++ /dev/null
@@ -1,27 +0,0 @@
-raw('$context[')
- ->string($this->getAttribute('name'))
- ->raw(']')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
deleted file mode 100644
index c424e5cc..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
+++ /dev/null
@@ -1,42 +0,0 @@
- $left, 'right' => $right], [], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('left'))
- ->raw(' ')
- ;
- $this->operator($compiler);
- $compiler
- ->raw(' ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- abstract public function operator(Compiler $compiler): Compiler;
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
deleted file mode 100644
index ee4307e3..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('+');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
deleted file mode 100644
index 5f2380da..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('&&');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
deleted file mode 100644
index db7d6d61..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('&');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
deleted file mode 100644
index ce803dd9..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('|');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
deleted file mode 100644
index 5c297850..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('^');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
deleted file mode 100644
index f825ab87..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('.');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
deleted file mode 100644
index e3817d1c..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('/');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
deleted file mode 100644
index 73fa20b1..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
+++ /dev/null
@@ -1,35 +0,0 @@
-getVarName();
- $right = $compiler->getVarName();
- $compiler
- ->raw(sprintf('(is_string($%s = ', $left))
- ->subcompile($this->getNode('left'))
- ->raw(sprintf(') && is_string($%s = ', $right))
- ->subcompile($this->getNode('right'))
- ->raw(sprintf(') && str_ends_with($%1$s, $%2$s))', $left, $right))
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
deleted file mode 100644
index 5f423196..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(0 === CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('==');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
deleted file mode 100644
index d7e7980e..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
+++ /dev/null
@@ -1,29 +0,0 @@
-raw('(int) floor(');
- parent::compile($compiler);
- $compiler->raw(')');
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('/');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
deleted file mode 100644
index f42de3f8..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(1 === CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('>');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
deleted file mode 100644
index 0c4f43fd..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(0 <= CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('>=');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php
deleted file mode 100644
index c57bb20e..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('CoreExtension::arrayEvery($this->env, ')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php
deleted file mode 100644
index 12293f84..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('CoreExtension::arraySome($this->env, ')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
deleted file mode 100644
index 68a98fe1..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('CoreExtension::inFilter(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('in');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
deleted file mode 100644
index fb3264a2..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(-1 === CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('<');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
deleted file mode 100644
index 8f365389..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(0 >= CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('<=');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
deleted file mode 100644
index 4669044e..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('CoreExtension::matches(')
- ->subcompile($this->getNode('right'))
- ->raw(', ')
- ->subcompile($this->getNode('left'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
deleted file mode 100644
index 271b45ca..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('%');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
deleted file mode 100644
index 6d4c1e0b..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('*');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
deleted file mode 100644
index d137ef62..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
+++ /dev/null
@@ -1,39 +0,0 @@
-= 80000) {
- parent::compile($compiler);
-
- return;
- }
-
- $compiler
- ->raw('(0 !== CoreExtension::compare(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw('))')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('!=');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
deleted file mode 100644
index 80c8755d..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('!CoreExtension::inFilter(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('not in');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
deleted file mode 100644
index 21f87c91..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('||');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
deleted file mode 100644
index c9f4c669..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
+++ /dev/null
@@ -1,22 +0,0 @@
-raw('**');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
deleted file mode 100644
index 55982c81..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
+++ /dev/null
@@ -1,33 +0,0 @@
-raw('range(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('..');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php
deleted file mode 100644
index ae5a4a49..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php
+++ /dev/null
@@ -1,22 +0,0 @@
-raw('<=>');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
deleted file mode 100644
index 22eff92a..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
+++ /dev/null
@@ -1,35 +0,0 @@
-getVarName();
- $right = $compiler->getVarName();
- $compiler
- ->raw(sprintf('(is_string($%s = ', $left))
- ->subcompile($this->getNode('left'))
- ->raw(sprintf(') && is_string($%s = ', $right))
- ->subcompile($this->getNode('right'))
- ->raw(sprintf(') && str_starts_with($%1$s, $%2$s))', $left, $right))
- ;
- }
-
- public function operator(Compiler $compiler): Compiler
- {
- return $compiler->raw('');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
deleted file mode 100644
index eeb87fac..00000000
--- a/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('-');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php b/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
deleted file mode 100644
index 13e72df1..00000000
--- a/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
+++ /dev/null
@@ -1,87 +0,0 @@
-
- */
-class BlockReferenceExpression extends AbstractExpression
-{
- public function __construct(Node $name, ?Node $template, int $lineno, ?string $tag = null)
- {
- $nodes = ['name' => $name];
- if (null !== $template) {
- $nodes['template'] = $template;
- }
-
- parent::__construct($nodes, ['is_defined_test' => false, 'output' => false], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- if ($this->getAttribute('is_defined_test')) {
- $this->compileTemplateCall($compiler, 'hasBlock');
- } else {
- if ($this->getAttribute('output')) {
- $compiler->addDebugInfo($this);
-
- $compiler->write('yield from ');
- $this
- ->compileTemplateCall($compiler, 'yieldBlock')
- ->raw(";\n");
- } else {
- $this->compileTemplateCall($compiler, 'renderBlock');
- }
- }
- }
-
- private function compileTemplateCall(Compiler $compiler, string $method): Compiler
- {
- if (!$this->hasNode('template')) {
- $compiler->write('$this');
- } else {
- $compiler
- ->write('$this->loadTemplate(')
- ->subcompile($this->getNode('template'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')')
- ;
- }
-
- $compiler->raw(sprintf('->unwrap()->%s', $method));
-
- return $this->compileBlockArguments($compiler);
- }
-
- private function compileBlockArguments(Compiler $compiler): Compiler
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('name'))
- ->raw(', $context');
-
- if (!$this->hasNode('template')) {
- $compiler->raw(', $blocks');
- }
-
- return $compiler->raw(')');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/CallExpression.php b/vendor/twig/twig/src/Node/Expression/CallExpression.php
deleted file mode 100644
index d6ac5fc4..00000000
--- a/vendor/twig/twig/src/Node/Expression/CallExpression.php
+++ /dev/null
@@ -1,332 +0,0 @@
-getAttribute('callable');
-
- if (\is_string($callable) && !str_contains($callable, '::')) {
- $compiler->raw($callable);
- } else {
- [$r, $callable] = $this->reflectCallable($callable);
-
- if (\is_string($callable)) {
- $compiler->raw($callable);
- } elseif (\is_array($callable) && \is_string($callable[0])) {
- if (!$r instanceof \ReflectionMethod || $r->isStatic()) {
- $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1]));
- } else {
- $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1]));
- }
- } elseif (\is_array($callable) && $callable[0] instanceof ExtensionInterface) {
- $class = \get_class($callable[0]);
- if (!$compiler->getEnvironment()->hasExtension($class)) {
- // Compile a non-optimized call to trigger a \Twig\Error\RuntimeError, which cannot be a compile-time error
- $compiler->raw(sprintf('$this->env->getExtension(\'%s\')', $class));
- } else {
- $compiler->raw(sprintf('$this->extensions[\'%s\']', ltrim($class, '\\')));
- }
-
- $compiler->raw(sprintf('->%s', $callable[1]));
- } else {
- $compiler->raw(sprintf('$this->env->get%s(\'%s\')->getCallable()', ucfirst($this->getAttribute('type')), $this->getAttribute('name')));
- }
- }
-
- $this->compileArguments($compiler);
- }
-
- protected function compileArguments(Compiler $compiler, $isArray = false): void
- {
- $compiler->raw($isArray ? '[' : '(');
-
- $first = true;
-
- if ($this->hasAttribute('needs_charset') && $this->getAttribute('needs_charset')) {
- $compiler->raw('$this->env->getCharset()');
- $first = false;
- }
-
- if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->raw('$this->env');
- $first = false;
- }
-
- if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->raw('$context');
- $first = false;
- }
-
- if ($this->hasAttribute('arguments')) {
- foreach ($this->getAttribute('arguments') as $argument) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->string($argument);
- $first = false;
- }
- }
-
- if ($this->hasNode('node')) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->subcompile($this->getNode('node'));
- $first = false;
- }
-
- if ($this->hasNode('arguments')) {
- $callable = $this->getAttribute('callable');
- $arguments = $this->getArguments($callable, $this->getNode('arguments'));
- foreach ($arguments as $node) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->subcompile($node);
- $first = false;
- }
- }
-
- $compiler->raw($isArray ? ']' : ')');
- }
-
- protected function getArguments($callable, $arguments)
- {
- $callType = $this->getAttribute('type');
- $callName = $this->getAttribute('name');
-
- $parameters = [];
- $named = false;
- foreach ($arguments as $name => $node) {
- if (!\is_int($name)) {
- $named = true;
- $name = $this->normalizeName($name);
- } elseif ($named) {
- throw new SyntaxError(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
- }
-
- $parameters[$name] = $node;
- }
-
- $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic');
- if (!$named && !$isVariadic) {
- return $parameters;
- }
-
- if (!$callable) {
- if ($named) {
- $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName);
- } else {
- $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName);
- }
-
- throw new \LogicException($message);
- }
-
- [$callableParameters, $isPhpVariadic] = $this->getCallableParameters($callable, $isVariadic);
- $arguments = [];
- $names = [];
- $missingArguments = [];
- $optionalArguments = [];
- $pos = 0;
- foreach ($callableParameters as $callableParameter) {
- $name = $this->normalizeName($callableParameter->name);
- if (\PHP_VERSION_ID >= 80000 && 'range' === $callable) {
- if ('start' === $name) {
- $name = 'low';
- } elseif ('end' === $name) {
- $name = 'high';
- }
- }
-
- $names[] = $name;
-
- if (\array_key_exists($name, $parameters)) {
- if (\array_key_exists($pos, $parameters)) {
- throw new SyntaxError(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
- }
-
- if (\count($missingArguments)) {
- throw new SyntaxError(sprintf(
- 'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".',
- $name, $callType, $callName, implode(', ', $names), \count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments)
- ), $this->getTemplateLine(), $this->getSourceContext());
- }
-
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $parameters[$name];
- unset($parameters[$name]);
- $optionalArguments = [];
- } elseif (\array_key_exists($pos, $parameters)) {
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $parameters[$pos];
- unset($parameters[$pos]);
- $optionalArguments = [];
- ++$pos;
- } elseif ($callableParameter->isDefaultValueAvailable()) {
- $optionalArguments[] = new ConstantExpression($callableParameter->getDefaultValue(), -1);
- } elseif ($callableParameter->isOptional()) {
- if (empty($parameters)) {
- break;
- } else {
- $missingArguments[] = $name;
- }
- } else {
- throw new SyntaxError(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
- }
- }
-
- if ($isVariadic) {
- $arbitraryArguments = $isPhpVariadic ? new VariadicExpression([], -1) : new ArrayExpression([], -1);
- foreach ($parameters as $key => $value) {
- if (\is_int($key)) {
- $arbitraryArguments->addElement($value);
- } else {
- $arbitraryArguments->addElement($value, new ConstantExpression($key, -1));
- }
- unset($parameters[$key]);
- }
-
- if ($arbitraryArguments->count()) {
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $arbitraryArguments;
- }
- }
-
- if (!empty($parameters)) {
- $unknownParameter = null;
- foreach ($parameters as $parameter) {
- if ($parameter instanceof Node) {
- $unknownParameter = $parameter;
- break;
- }
- }
-
- throw new SyntaxError(
- sprintf(
- 'Unknown argument%s "%s" for %s "%s(%s)".',
- \count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names)
- ),
- $unknownParameter ? $unknownParameter->getTemplateLine() : $this->getTemplateLine(),
- $unknownParameter ? $unknownParameter->getSourceContext() : $this->getSourceContext()
- );
- }
-
- return $arguments;
- }
-
- protected function normalizeName(string $name): string
- {
- return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], $name));
- }
-
- private function getCallableParameters($callable, bool $isVariadic): array
- {
- [$r, , $callableName] = $this->reflectCallable($callable);
-
- $parameters = $r->getParameters();
- if ($this->hasNode('node')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('needs_charset') && $this->getAttribute('needs_charset')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
- foreach ($this->getAttribute('arguments') as $argument) {
- array_shift($parameters);
- }
- }
- $isPhpVariadic = false;
- if ($isVariadic) {
- $argument = end($parameters);
- $isArray = $argument && $argument->hasType() && 'array' === $argument->getType()->getName();
- if ($isArray && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) {
- array_pop($parameters);
- } elseif ($argument && $argument->isVariadic()) {
- array_pop($parameters);
- $isPhpVariadic = true;
- } else {
- throw new \LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = []".', $callableName, $this->getAttribute('type'), $this->getAttribute('name')));
- }
- }
-
- return [$parameters, $isPhpVariadic];
- }
-
- private function reflectCallable($callable)
- {
- if (null !== $this->reflector) {
- return $this->reflector;
- }
-
- if (\is_string($callable) && false !== $pos = strpos($callable, '::')) {
- $callable = [substr($callable, 0, $pos), substr($callable, 2 + $pos)];
- }
-
- if (\is_array($callable) && method_exists($callable[0], $callable[1])) {
- $r = new \ReflectionMethod($callable[0], $callable[1]);
-
- return $this->reflector = [$r, $callable, $r->class.'::'.$r->name];
- }
-
- $checkVisibility = $callable instanceof \Closure;
- try {
- $closure = \Closure::fromCallable($callable);
- } catch (\TypeError $e) {
- throw new \LogicException(sprintf('Callback for %s "%s" is not callable in the current scope.', $this->getAttribute('type'), $this->getAttribute('name')), 0, $e);
- }
- $r = new \ReflectionFunction($closure);
-
- if (str_contains($r->name, '{closure')) {
- return $this->reflector = [$r, $callable, 'Closure'];
- }
-
- if ($object = $r->getClosureThis()) {
- $callable = [$object, $r->name];
- $callableName = get_debug_type($object).'::'.$r->name;
- } elseif (\PHP_VERSION_ID >= 80111 && $class = $r->getClosureCalledClass()) {
- $callableName = $class->name.'::'.$r->name;
- } elseif (\PHP_VERSION_ID < 80111 && $class = $r->getClosureScopeClass()) {
- $callableName = (\is_array($callable) ? $callable[0] : $class->name).'::'.$r->name;
- } else {
- $callable = $callableName = $r->name;
- }
-
- if ($checkVisibility && \is_array($callable) && method_exists(...$callable) && !(new \ReflectionMethod(...$callable))->isPublic()) {
- $callable = $r->getClosure();
- }
-
- return $this->reflector = [$r, $callable, $callableName];
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php b/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
deleted file mode 100644
index d7db9935..00000000
--- a/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
+++ /dev/null
@@ -1,45 +0,0 @@
- $expr1, 'expr2' => $expr2, 'expr3' => $expr3], [], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- // Ternary with no then uses Elvis operator
- if ($this->getNode('expr1') === $this->getNode('expr2')) {
- $compiler
- ->raw('((')
- ->subcompile($this->getNode('expr1'))
- ->raw(') ?: (')
- ->subcompile($this->getNode('expr3'))
- ->raw('))');
- } else {
- $compiler
- ->raw('((')
- ->subcompile($this->getNode('expr1'))
- ->raw(') ? (')
- ->subcompile($this->getNode('expr2'))
- ->raw(') : (')
- ->subcompile($this->getNode('expr3'))
- ->raw('))');
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/ConstantExpression.php b/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
deleted file mode 100644
index 7ddbcc6f..00000000
--- a/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
+++ /dev/null
@@ -1,28 +0,0 @@
- $value], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->repr($this->getAttribute('value'));
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php b/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
deleted file mode 100644
index 7eb0ea77..00000000
--- a/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
- */
-class DefaultFilter extends FilterExpression
-{
- public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, ?string $tag = null)
- {
- $default = new FilterExpression($node, new ConstantExpression('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine());
-
- if ('default' === $filterName->getAttribute('value') && ($node instanceof NameExpression || $node instanceof GetAttrExpression)) {
- $test = new DefinedTest(clone $node, 'defined', new Node(), $node->getTemplateLine());
- $false = \count($arguments) ? $arguments->getNode('0') : new ConstantExpression('', $node->getTemplateLine());
-
- $node = new ConditionalExpression($test, $default, $false, $node->getTemplateLine());
- } else {
- $node = $default;
- }
-
- parent::__construct($node, $filterName, $arguments, $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->subcompile($this->getNode('node'));
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/FilterExpression.php b/vendor/twig/twig/src/Node/Expression/FilterExpression.php
deleted file mode 100644
index c803d570..00000000
--- a/vendor/twig/twig/src/Node/Expression/FilterExpression.php
+++ /dev/null
@@ -1,41 +0,0 @@
- $node, 'filter' => $filterName, 'arguments' => $arguments], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $name = $this->getNode('filter')->getAttribute('value');
- $filter = $compiler->getEnvironment()->getFilter($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'filter');
- $this->setAttribute('needs_charset', $filter->needsCharset());
- $this->setAttribute('needs_environment', $filter->needsEnvironment());
- $this->setAttribute('needs_context', $filter->needsContext());
- $this->setAttribute('arguments', $filter->getArguments());
- $this->setAttribute('callable', $filter->getCallable());
- $this->setAttribute('is_variadic', $filter->isVariadic());
-
- $this->compileCallable($compiler);
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/FunctionExpression.php b/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
deleted file mode 100644
index d903a9e8..00000000
--- a/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
+++ /dev/null
@@ -1,45 +0,0 @@
- $arguments], ['name' => $name, 'is_defined_test' => false], $lineno);
- }
-
- public function compile(Compiler $compiler)
- {
- $name = $this->getAttribute('name');
- $function = $compiler->getEnvironment()->getFunction($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'function');
- $this->setAttribute('needs_charset', $function->needsCharset());
- $this->setAttribute('needs_environment', $function->needsEnvironment());
- $this->setAttribute('needs_context', $function->needsContext());
- $this->setAttribute('arguments', $function->getArguments());
- $callable = $function->getCallable();
- if ('constant' === $name && $this->getAttribute('is_defined_test')) {
- $callable = [CoreExtension::class, 'constantIsDefined'];
- }
- $this->setAttribute('callable', $callable);
- $this->setAttribute('is_variadic', $function->isVariadic());
-
- $this->compileCallable($compiler);
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php b/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
deleted file mode 100644
index 29a446b8..00000000
--- a/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
+++ /dev/null
@@ -1,87 +0,0 @@
- $node, 'attribute' => $attribute];
- if (null !== $arguments) {
- $nodes['arguments'] = $arguments;
- }
-
- parent::__construct($nodes, ['type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'optimizable' => true], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $env = $compiler->getEnvironment();
-
- // optimize array calls
- if (
- $this->getAttribute('optimizable')
- && (!$env->isStrictVariables() || $this->getAttribute('ignore_strict_check'))
- && !$this->getAttribute('is_defined_test')
- && Template::ARRAY_CALL === $this->getAttribute('type')
- ) {
- $var = '$'.$compiler->getVarName();
- $compiler
- ->raw('(('.$var.' = ')
- ->subcompile($this->getNode('node'))
- ->raw(') && is_array(')
- ->raw($var)
- ->raw(') || ')
- ->raw($var)
- ->raw(' instanceof ArrayAccess ? (')
- ->raw($var)
- ->raw('[')
- ->subcompile($this->getNode('attribute'))
- ->raw('] ?? null) : null)')
- ;
-
- return;
- }
-
- $compiler->raw('CoreExtension::getAttribute($this->env, $this->source, ');
-
- if ($this->getAttribute('ignore_strict_check')) {
- $this->getNode('node')->setAttribute('ignore_strict_check', true);
- }
-
- $compiler
- ->subcompile($this->getNode('node'))
- ->raw(', ')
- ->subcompile($this->getNode('attribute'))
- ;
-
- if ($this->hasNode('arguments')) {
- $compiler->raw(', ')->subcompile($this->getNode('arguments'));
- } else {
- $compiler->raw(', []');
- }
-
- $compiler->raw(', ')
- ->repr($this->getAttribute('type'))
- ->raw(', ')->repr($this->getAttribute('is_defined_test'))
- ->raw(', ')->repr($this->getAttribute('ignore_strict_check'))
- ->raw(', ')->repr($env->hasExtension(SandboxExtension::class))
- ->raw(', ')->repr($this->getNode('node')->getTemplateLine())
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/InlinePrint.php b/vendor/twig/twig/src/Node/Expression/InlinePrint.php
deleted file mode 100644
index 0a3c2e4f..00000000
--- a/vendor/twig/twig/src/Node/Expression/InlinePrint.php
+++ /dev/null
@@ -1,34 +0,0 @@
- $node], [], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('yield ')
- ->subcompile($this->getNode('node'))
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php b/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
deleted file mode 100644
index 6fa1c3f9..00000000
--- a/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
+++ /dev/null
@@ -1,62 +0,0 @@
- $node, 'arguments' => $arguments], ['method' => $method, 'safe' => false, 'is_defined_test' => false], $lineno);
-
- if ($node instanceof NameExpression) {
- $node->setAttribute('always_defined', true);
- }
- }
-
- public function compile(Compiler $compiler): void
- {
- if ($this->getAttribute('is_defined_test')) {
- $compiler
- ->raw('method_exists($macros[')
- ->repr($this->getNode('node')->getAttribute('name'))
- ->raw('], ')
- ->repr($this->getAttribute('method'))
- ->raw(')')
- ;
-
- return;
- }
-
- $compiler
- ->raw('CoreExtension::callMacro($macros[')
- ->repr($this->getNode('node')->getAttribute('name'))
- ->raw('], ')
- ->repr($this->getAttribute('method'))
- ->raw(', [')
- ;
- $first = true;
- foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $first = false;
-
- $compiler->subcompile($pair['value']);
- }
- $compiler
- ->raw('], ')
- ->repr($this->getTemplateLine())
- ->raw(', $context, $this->getSourceContext())');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/NameExpression.php b/vendor/twig/twig/src/Node/Expression/NameExpression.php
deleted file mode 100644
index c3563f01..00000000
--- a/vendor/twig/twig/src/Node/Expression/NameExpression.php
+++ /dev/null
@@ -1,97 +0,0 @@
- '$this->getTemplateName()',
- '_context' => '$context',
- '_charset' => '$this->env->getCharset()',
- ];
-
- public function __construct(string $name, int $lineno)
- {
- parent::__construct([], ['name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $name = $this->getAttribute('name');
-
- $compiler->addDebugInfo($this);
-
- if ($this->getAttribute('is_defined_test')) {
- if ($this->isSpecial()) {
- $compiler->repr(true);
- } elseif (\PHP_VERSION_ID >= 70400) {
- $compiler
- ->raw('array_key_exists(')
- ->string($name)
- ->raw(', $context)')
- ;
- } else {
- $compiler
- ->raw('(isset($context[')
- ->string($name)
- ->raw(']) || array_key_exists(')
- ->string($name)
- ->raw(', $context))')
- ;
- }
- } elseif ($this->isSpecial()) {
- $compiler->raw($this->specialVars[$name]);
- } elseif ($this->getAttribute('always_defined')) {
- $compiler
- ->raw('$context[')
- ->string($name)
- ->raw(']')
- ;
- } else {
- if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
- $compiler
- ->raw('($context[')
- ->string($name)
- ->raw('] ?? null)')
- ;
- } else {
- $compiler
- ->raw('(isset($context[')
- ->string($name)
- ->raw(']) || array_key_exists(')
- ->string($name)
- ->raw(', $context) ? $context[')
- ->string($name)
- ->raw('] : (function () { throw new RuntimeError(\'Variable ')
- ->string($name)
- ->raw(' does not exist.\', ')
- ->repr($this->lineno)
- ->raw(', $this->source); })()')
- ->raw(')')
- ;
- }
- }
- }
-
- public function isSpecial()
- {
- return isset($this->specialVars[$this->getAttribute('name')]);
- }
-
- public function isSimple()
- {
- return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php b/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
deleted file mode 100644
index a72bc4fc..00000000
--- a/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
+++ /dev/null
@@ -1,60 +0,0 @@
-getTemplateLine());
- // for "block()", we don't need the null test as the return value is always a string
- if (!$left instanceof BlockReferenceExpression) {
- $test = new AndBinary(
- $test,
- new NotUnary(new NullTest($left, 'null', new Node(), $left->getTemplateLine()), $left->getTemplateLine()),
- $left->getTemplateLine()
- );
- }
-
- parent::__construct($test, $left, $right, $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- /*
- * This optimizes only one case. PHP 7 also supports more complex expressions
- * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works,
- * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced
- * cases might be implemented as an optimizer node visitor, but has not been done
- * as benefits are probably not worth the added complexity.
- */
- if ($this->getNode('expr2') instanceof NameExpression) {
- $this->getNode('expr2')->setAttribute('always_defined', true);
- $compiler
- ->raw('((')
- ->subcompile($this->getNode('expr2'))
- ->raw(') ?? (')
- ->subcompile($this->getNode('expr3'))
- ->raw('))')
- ;
- } else {
- parent::compile($compiler);
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/ParentExpression.php b/vendor/twig/twig/src/Node/Expression/ParentExpression.php
deleted file mode 100644
index 59d833ac..00000000
--- a/vendor/twig/twig/src/Node/Expression/ParentExpression.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- */
-class ParentExpression extends AbstractExpression
-{
- public function __construct(string $name, int $lineno, ?string $tag = null)
- {
- parent::__construct([], ['output' => false, 'name' => $name], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- if ($this->getAttribute('output')) {
- $compiler
- ->addDebugInfo($this)
- ->write('yield from $this->yieldParentBlock(')
- ->string($this->getAttribute('name'))
- ->raw(", \$context, \$blocks);\n")
- ;
- } else {
- $compiler
- ->raw('$this->renderParentBlock(')
- ->string($this->getAttribute('name'))
- ->raw(', $context, $blocks)')
- ;
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/TempNameExpression.php b/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
deleted file mode 100644
index 004c704a..00000000
--- a/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
+++ /dev/null
@@ -1,31 +0,0 @@
- $name], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('$_')
- ->raw($this->getAttribute('name'))
- ->raw('_')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php b/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
deleted file mode 100644
index 867fd095..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
+++ /dev/null
@@ -1,49 +0,0 @@
-
- */
-class ConstantTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' === constant(')
- ;
-
- if ($this->getNode('arguments')->hasNode('1')) {
- $compiler
- ->raw('get_class(')
- ->subcompile($this->getNode('arguments')->getNode('1'))
- ->raw(')."::".')
- ;
- }
-
- $compiler
- ->subcompile($this->getNode('arguments')->getNode('0'))
- ->raw('))')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php b/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
deleted file mode 100644
index 3953bbbe..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
+++ /dev/null
@@ -1,74 +0,0 @@
-
- */
-class DefinedTest extends TestExpression
-{
- public function __construct(Node $node, string $name, ?Node $arguments, int $lineno)
- {
- if ($node instanceof NameExpression) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof GetAttrExpression) {
- $node->setAttribute('is_defined_test', true);
- $this->changeIgnoreStrictCheck($node);
- } elseif ($node instanceof BlockReferenceExpression) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof FunctionExpression && 'constant' === $node->getAttribute('name')) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof ConstantExpression || $node instanceof ArrayExpression) {
- $node = new ConstantExpression(true, $node->getTemplateLine());
- } elseif ($node instanceof MethodCallExpression) {
- $node->setAttribute('is_defined_test', true);
- } else {
- throw new SyntaxError('The "defined" test only works with simple variables.', $lineno);
- }
-
- parent::__construct($node, $name, $arguments, $lineno);
- }
-
- private function changeIgnoreStrictCheck(GetAttrExpression $node)
- {
- $node->setAttribute('optimizable', false);
- $node->setAttribute('ignore_strict_check', true);
-
- if ($node->getNode('node') instanceof GetAttrExpression) {
- $this->changeIgnoreStrictCheck($node->getNode('node'));
- }
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->subcompile($this->getNode('node'));
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php b/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
deleted file mode 100644
index 90d58a49..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
-class DivisiblebyTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(0 == ')
- ->subcompile($this->getNode('node'))
- ->raw(' % ')
- ->subcompile($this->getNode('arguments')->getNode('0'))
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php b/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
deleted file mode 100644
index a0e3ed62..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- */
-class EvenTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' % 2 == 0')
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/NullTest.php b/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
deleted file mode 100644
index 45b54ae3..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- */
-class NullTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(null === ')
- ->subcompile($this->getNode('node'))
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/OddTest.php b/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
deleted file mode 100644
index d56c7111..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- */
-class OddTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' % 2 != 0')
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php b/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
deleted file mode 100644
index f1e24db6..00000000
--- a/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- */
-class SameasTest extends TestExpression
-{
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' === ')
- ->subcompile($this->getNode('arguments')->getNode('0'))
- ->raw(')')
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/TestExpression.php b/vendor/twig/twig/src/Node/Expression/TestExpression.php
deleted file mode 100644
index e518bd8f..00000000
--- a/vendor/twig/twig/src/Node/Expression/TestExpression.php
+++ /dev/null
@@ -1,42 +0,0 @@
- $node];
- if (null !== $arguments) {
- $nodes['arguments'] = $arguments;
- }
-
- parent::__construct($nodes, ['name' => $name], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $name = $this->getAttribute('name');
- $test = $compiler->getEnvironment()->getTest($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'test');
- $this->setAttribute('arguments', $test->getArguments());
- $this->setAttribute('callable', $test->getCallable());
- $this->setAttribute('is_variadic', $test->isVariadic());
-
- $this->compileCallable($compiler);
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
deleted file mode 100644
index e31e3f84..00000000
--- a/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
+++ /dev/null
@@ -1,34 +0,0 @@
- $node], [], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->raw(' ');
- $this->operator($compiler);
- $compiler->subcompile($this->getNode('node'));
- }
-
- abstract public function operator(Compiler $compiler): Compiler;
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
deleted file mode 100644
index dc2f2350..00000000
--- a/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('-');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
deleted file mode 100644
index 55c11bac..00000000
--- a/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('!');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
deleted file mode 100644
index 4b0a0620..00000000
--- a/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
+++ /dev/null
@@ -1,23 +0,0 @@
-raw('+');
- }
-}
diff --git a/vendor/twig/twig/src/Node/Expression/VariadicExpression.php b/vendor/twig/twig/src/Node/Expression/VariadicExpression.php
deleted file mode 100644
index a1bdb48c..00000000
--- a/vendor/twig/twig/src/Node/Expression/VariadicExpression.php
+++ /dev/null
@@ -1,24 +0,0 @@
-raw('...');
-
- parent::compile($compiler);
- }
-}
diff --git a/vendor/twig/twig/src/Node/FlushNode.php b/vendor/twig/twig/src/Node/FlushNode.php
deleted file mode 100644
index 8a3dde6f..00000000
--- a/vendor/twig/twig/src/Node/FlushNode.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
- */
-#[YieldReady]
-class FlushNode extends Node
-{
- public function __construct(int $lineno, string $tag)
- {
- parent::__construct([], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write("flush();\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/ForLoopNode.php b/vendor/twig/twig/src/Node/ForLoopNode.php
deleted file mode 100644
index 503687c2..00000000
--- a/vendor/twig/twig/src/Node/ForLoopNode.php
+++ /dev/null
@@ -1,51 +0,0 @@
-
- */
-#[YieldReady]
-class ForLoopNode extends Node
-{
- public function __construct(int $lineno, ?string $tag = null)
- {
- parent::__construct([], ['with_loop' => false, 'ifexpr' => false, 'else' => false], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- if ($this->getAttribute('else')) {
- $compiler->write("\$context['_iterated'] = true;\n");
- }
-
- if ($this->getAttribute('with_loop')) {
- $compiler
- ->write("++\$context['loop']['index0'];\n")
- ->write("++\$context['loop']['index'];\n")
- ->write("\$context['loop']['first'] = false;\n")
- ->write("if (isset(\$context['loop']['length'])) {\n")
- ->indent()
- ->write("--\$context['loop']['revindex0'];\n")
- ->write("--\$context['loop']['revindex'];\n")
- ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")
- ->outdent()
- ->write("}\n")
- ;
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/ForNode.php b/vendor/twig/twig/src/Node/ForNode.php
deleted file mode 100644
index 5222cf9b..00000000
--- a/vendor/twig/twig/src/Node/ForNode.php
+++ /dev/null
@@ -1,109 +0,0 @@
-
- */
-#[YieldReady]
-class ForNode extends Node
-{
- private $loop;
-
- public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, ?Node $ifexpr, Node $body, ?Node $else, int $lineno, ?string $tag = null)
- {
- $body = new Node([$body, $this->loop = new ForLoopNode($lineno, $tag)]);
-
- $nodes = ['key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body];
- if (null !== $else) {
- $nodes['else'] = $else;
- }
-
- parent::__construct($nodes, ['with_loop' => true], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write("\$context['_parent'] = \$context;\n")
- ->write("\$context['_seq'] = CoreExtension::ensureTraversable(")
- ->subcompile($this->getNode('seq'))
- ->raw(");\n")
- ;
-
- if ($this->hasNode('else')) {
- $compiler->write("\$context['_iterated'] = false;\n");
- }
-
- if ($this->getAttribute('with_loop')) {
- $compiler
- ->write("\$context['loop'] = [\n")
- ->write(" 'parent' => \$context['_parent'],\n")
- ->write(" 'index0' => 0,\n")
- ->write(" 'index' => 1,\n")
- ->write(" 'first' => true,\n")
- ->write("];\n")
- ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof \Countable)) {\n")
- ->indent()
- ->write("\$length = count(\$context['_seq']);\n")
- ->write("\$context['loop']['revindex0'] = \$length - 1;\n")
- ->write("\$context['loop']['revindex'] = \$length;\n")
- ->write("\$context['loop']['length'] = \$length;\n")
- ->write("\$context['loop']['last'] = 1 === \$length;\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-
- $this->loop->setAttribute('else', $this->hasNode('else'));
- $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop'));
-
- $compiler
- ->write("foreach (\$context['_seq'] as ")
- ->subcompile($this->getNode('key_target'))
- ->raw(' => ')
- ->subcompile($this->getNode('value_target'))
- ->raw(") {\n")
- ->indent()
- ->subcompile($this->getNode('body'))
- ->outdent()
- ->write("}\n")
- ;
-
- if ($this->hasNode('else')) {
- $compiler
- ->write("if (!\$context['_iterated']) {\n")
- ->indent()
- ->subcompile($this->getNode('else'))
- ->outdent()
- ->write("}\n")
- ;
- }
-
- $compiler->write("\$_parent = \$context['_parent'];\n");
-
- // remove some "private" loop variables (needed for nested loops)
- $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");
-
- // keep the values set in the inner context for variables defined in the outer context
- $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n");
- }
-}
diff --git a/vendor/twig/twig/src/Node/IfNode.php b/vendor/twig/twig/src/Node/IfNode.php
deleted file mode 100644
index 1b883305..00000000
--- a/vendor/twig/twig/src/Node/IfNode.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- */
-#[YieldReady]
-class IfNode extends Node
-{
- public function __construct(Node $tests, ?Node $else, int $lineno, ?string $tag = null)
- {
- $nodes = ['tests' => $tests];
- if (null !== $else) {
- $nodes['else'] = $else;
- }
-
- parent::__construct($nodes, [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
- for ($i = 0, $count = \count($this->getNode('tests')); $i < $count; $i += 2) {
- if ($i > 0) {
- $compiler
- ->outdent()
- ->write('} elseif (')
- ;
- } else {
- $compiler
- ->write('if (')
- ;
- }
-
- $compiler
- ->subcompile($this->getNode('tests')->getNode((string) $i))
- ->raw(") {\n")
- ->indent()
- ;
- // The node might not exists if the content is empty
- if ($this->getNode('tests')->hasNode((string) ($i + 1))) {
- $compiler->subcompile($this->getNode('tests')->getNode((string) ($i + 1)));
- }
- }
-
- if ($this->hasNode('else')) {
- $compiler
- ->outdent()
- ->write("} else {\n")
- ->indent()
- ->subcompile($this->getNode('else'))
- ;
- }
-
- $compiler
- ->outdent()
- ->write("}\n");
- }
-}
diff --git a/vendor/twig/twig/src/Node/ImportNode.php b/vendor/twig/twig/src/Node/ImportNode.php
deleted file mode 100644
index db47bfe6..00000000
--- a/vendor/twig/twig/src/Node/ImportNode.php
+++ /dev/null
@@ -1,65 +0,0 @@
-
- */
-#[YieldReady]
-class ImportNode extends Node
-{
- public function __construct(AbstractExpression $expr, AbstractExpression $var, int $lineno, ?string $tag = null, bool $global = true)
- {
- parent::__construct(['expr' => $expr, 'var' => $var], ['global' => $global], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write('$macros[')
- ->repr($this->getNode('var')->getAttribute('name'))
- ->raw('] = ')
- ;
-
- if ($this->getAttribute('global')) {
- $compiler
- ->raw('$this->macros[')
- ->repr($this->getNode('var')->getAttribute('name'))
- ->raw('] = ')
- ;
- }
-
- if ($this->getNode('expr') instanceof NameExpression && '_self' === $this->getNode('expr')->getAttribute('name')) {
- $compiler->raw('$this');
- } else {
- $compiler
- ->raw('$this->loadTemplate(')
- ->subcompile($this->getNode('expr'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')->unwrap()')
- ;
- }
-
- $compiler->raw(";\n");
- }
-}
diff --git a/vendor/twig/twig/src/Node/IncludeNode.php b/vendor/twig/twig/src/Node/IncludeNode.php
deleted file mode 100644
index f10779a8..00000000
--- a/vendor/twig/twig/src/Node/IncludeNode.php
+++ /dev/null
@@ -1,110 +0,0 @@
-
- */
-#[YieldReady]
-class IncludeNode extends Node implements NodeOutputInterface
-{
- public function __construct(AbstractExpression $expr, ?AbstractExpression $variables, bool $only, bool $ignoreMissing, int $lineno, ?string $tag = null)
- {
- $nodes = ['expr' => $expr];
- if (null !== $variables) {
- $nodes['variables'] = $variables;
- }
-
- parent::__construct($nodes, ['only' => $only, 'ignore_missing' => $ignoreMissing], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- if ($this->getAttribute('ignore_missing')) {
- $template = $compiler->getVarName();
-
- $compiler
- ->write(sprintf("$%s = null;\n", $template))
- ->write("try {\n")
- ->indent()
- ->write(sprintf('$%s = ', $template))
- ;
-
- $this->addGetTemplate($compiler);
-
- $compiler
- ->raw(";\n")
- ->outdent()
- ->write("} catch (LoaderError \$e) {\n")
- ->indent()
- ->write("// ignore missing template\n")
- ->outdent()
- ->write("}\n")
- ->write(sprintf("if ($%s) {\n", $template))
- ->indent()
- ->write(sprintf('yield from $%s->unwrap()->yield(', $template))
- ;
-
- $this->addTemplateArguments($compiler);
- $compiler
- ->raw(");\n")
- ->outdent()
- ->write("}\n")
- ;
- } else {
- $compiler->write('yield from ');
- $this->addGetTemplate($compiler);
- $compiler->raw('->unwrap()->yield(');
- $this->addTemplateArguments($compiler);
- $compiler->raw(");\n");
- }
- }
-
- protected function addGetTemplate(Compiler $compiler)
- {
- $compiler
- ->write('$this->loadTemplate(')
- ->subcompile($this->getNode('expr'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')')
- ;
- }
-
- protected function addTemplateArguments(Compiler $compiler)
- {
- if (!$this->hasNode('variables')) {
- $compiler->raw(false === $this->getAttribute('only') ? '$context' : '[]');
- } elseif (false === $this->getAttribute('only')) {
- $compiler
- ->raw('CoreExtension::merge($context, ')
- ->subcompile($this->getNode('variables'))
- ->raw(')')
- ;
- } else {
- $compiler->raw('CoreExtension::toArray(');
- $compiler->subcompile($this->getNode('variables'));
- $compiler->raw(')');
- }
- }
-}
diff --git a/vendor/twig/twig/src/Node/MacroNode.php b/vendor/twig/twig/src/Node/MacroNode.php
deleted file mode 100644
index 78e1b6f7..00000000
--- a/vendor/twig/twig/src/Node/MacroNode.php
+++ /dev/null
@@ -1,99 +0,0 @@
-
- */
-#[YieldReady]
-class MacroNode extends Node
-{
- public const VARARGS_NAME = 'varargs';
-
- public function __construct(string $name, Node $body, Node $arguments, int $lineno, ?string $tag = null)
- {
- foreach ($arguments as $argumentName => $argument) {
- if (self::VARARGS_NAME === $argumentName) {
- throw new SyntaxError(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getTemplateLine(), $argument->getSourceContext());
- }
- }
-
- parent::__construct(['body' => $body, 'arguments' => $arguments], ['name' => $name], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf('public function macro_%s(', $this->getAttribute('name')))
- ;
-
- $count = \count($this->getNode('arguments'));
- $pos = 0;
- foreach ($this->getNode('arguments') as $name => $default) {
- $compiler
- ->raw('$__'.$name.'__ = ')
- ->subcompile($default)
- ;
-
- if (++$pos < $count) {
- $compiler->raw(', ');
- }
- }
-
- if ($count) {
- $compiler->raw(', ');
- }
-
- $compiler
- ->raw('...$__varargs__')
- ->raw(")\n")
- ->write("{\n")
- ->indent()
- ->write("\$macros = \$this->macros;\n")
- ->write("\$context = \$this->env->mergeGlobals([\n")
- ->indent()
- ;
-
- foreach ($this->getNode('arguments') as $name => $default) {
- $compiler
- ->write('')
- ->string($name)
- ->raw(' => $__'.$name.'__')
- ->raw(",\n")
- ;
- }
-
- $node = new CaptureNode($this->getNode('body'), $this->getNode('body')->lineno, $this->getNode('body')->tag);
-
- $compiler
- ->write('')
- ->string(self::VARARGS_NAME)
- ->raw(' => ')
- ->raw("\$__varargs__,\n")
- ->outdent()
- ->write("]);\n\n")
- ->write("\$blocks = [];\n\n")
- ->write('return ')
- ->subcompile($node)
- ->raw("\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/ModuleNode.php b/vendor/twig/twig/src/Node/ModuleNode.php
deleted file mode 100644
index df5d78d0..00000000
--- a/vendor/twig/twig/src/Node/ModuleNode.php
+++ /dev/null
@@ -1,500 +0,0 @@
-
- */
-#[YieldReady]
-final class ModuleNode extends Node
-{
- public function __construct(Node $body, ?AbstractExpression $parent, Node $blocks, Node $macros, Node $traits, $embeddedTemplates, Source $source)
- {
- $nodes = [
- 'body' => $body,
- 'blocks' => $blocks,
- 'macros' => $macros,
- 'traits' => $traits,
- 'display_start' => new Node(),
- 'display_end' => new Node(),
- 'constructor_start' => new Node(),
- 'constructor_end' => new Node(),
- 'class_end' => new Node(),
- ];
- if (null !== $parent) {
- $nodes['parent'] = $parent;
- }
-
- // embedded templates are set as attributes so that they are only visited once by the visitors
- parent::__construct($nodes, [
- 'index' => null,
- 'embedded_templates' => $embeddedTemplates,
- ], 1);
-
- // populate the template name of all node children
- $this->setSourceContext($source);
- }
-
- public function setIndex($index)
- {
- $this->setAttribute('index', $index);
- }
-
- public function compile(Compiler $compiler): void
- {
- $this->compileTemplate($compiler);
-
- foreach ($this->getAttribute('embedded_templates') as $template) {
- $compiler->subcompile($template);
- }
- }
-
- protected function compileTemplate(Compiler $compiler)
- {
- if (!$this->getAttribute('index')) {
- $compiler->write('compileClassHeader($compiler);
-
- $this->compileConstructor($compiler);
-
- $this->compileGetParent($compiler);
-
- $this->compileDisplay($compiler);
-
- $compiler->subcompile($this->getNode('blocks'));
-
- $this->compileMacros($compiler);
-
- $this->compileGetTemplateName($compiler);
-
- $this->compileIsTraitable($compiler);
-
- $this->compileDebugInfo($compiler);
-
- $this->compileGetSourceContext($compiler);
-
- $this->compileClassFooter($compiler);
- }
-
- protected function compileGetParent(Compiler $compiler)
- {
- if (!$this->hasNode('parent')) {
- return;
- }
- $parent = $this->getNode('parent');
-
- $compiler
- ->write("protected function doGetParent(array \$context)\n", "{\n")
- ->indent()
- ->addDebugInfo($parent)
- ->write('return ')
- ;
-
- if ($parent instanceof ConstantExpression) {
- $compiler->subcompile($parent);
- } else {
- $compiler
- ->raw('$this->loadTemplate(')
- ->subcompile($parent)
- ->raw(', ')
- ->repr($this->getSourceContext()->getName())
- ->raw(', ')
- ->repr($parent->getTemplateLine())
- ->raw(')')
- ;
- }
-
- $compiler
- ->raw(";\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileClassHeader(Compiler $compiler)
- {
- $compiler
- ->write("\n\n")
- ;
- if (!$this->getAttribute('index')) {
- $compiler
- ->write("use Twig\Environment;\n")
- ->write("use Twig\Error\LoaderError;\n")
- ->write("use Twig\Error\RuntimeError;\n")
- ->write("use Twig\Extension\CoreExtension;\n")
- ->write("use Twig\Extension\SandboxExtension;\n")
- ->write("use Twig\Markup;\n")
- ->write("use Twig\Sandbox\SecurityError;\n")
- ->write("use Twig\Sandbox\SecurityNotAllowedTagError;\n")
- ->write("use Twig\Sandbox\SecurityNotAllowedFilterError;\n")
- ->write("use Twig\Sandbox\SecurityNotAllowedFunctionError;\n")
- ->write("use Twig\Source;\n")
- ->write("use Twig\Template;\n\n")
- ;
- }
- $compiler
- // if the template name contains */, add a blank to avoid a PHP parse error
- ->write('/* '.str_replace('*/', '* /', $this->getSourceContext()->getName())." */\n")
- ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getSourceContext()->getName(), $this->getAttribute('index')))
- ->raw(" extends Template\n")
- ->write("{\n")
- ->indent()
- ->write("private \$source;\n")
- ->write("private \$macros = [];\n\n")
- ;
- }
-
- protected function compileConstructor(Compiler $compiler)
- {
- $compiler
- ->write("public function __construct(Environment \$env)\n", "{\n")
- ->indent()
- ->subcompile($this->getNode('constructor_start'))
- ->write("parent::__construct(\$env);\n\n")
- ->write("\$this->source = \$this->getSourceContext();\n\n")
- ;
-
- // parent
- if (!$this->hasNode('parent')) {
- $compiler->write("\$this->parent = false;\n\n");
- }
-
- $countTraits = \count($this->getNode('traits'));
- if ($countTraits) {
- // traits
- foreach ($this->getNode('traits') as $i => $trait) {
- $node = $trait->getNode('template');
-
- $compiler
- ->addDebugInfo($node)
- ->write(sprintf('$_trait_%s = $this->loadTemplate(', $i))
- ->subcompile($node)
- ->raw(', ')
- ->repr($node->getTemplateName())
- ->raw(', ')
- ->repr($node->getTemplateLine())
- ->raw(");\n")
- ->write(sprintf("if (!\$_trait_%s->unwrap()->isTraitable()) {\n", $i))
- ->indent()
- ->write("throw new RuntimeError('Template \"'.")
- ->subcompile($trait->getNode('template'))
- ->raw(".'\" cannot be used as a trait.', ")
- ->repr($node->getTemplateLine())
- ->raw(", \$this->source);\n")
- ->outdent()
- ->write("}\n")
- ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->unwrap()->getBlocks();\n\n", $i, $i))
- ;
-
- foreach ($trait->getNode('targets') as $key => $value) {
- $compiler
- ->write(sprintf('if (!isset($_trait_%s_blocks[', $i))
- ->string($key)
- ->raw("])) {\n")
- ->indent()
- ->write("throw new RuntimeError('Block ")
- ->string($key)
- ->raw(' is not defined in trait ')
- ->subcompile($trait->getNode('template'))
- ->raw(".', ")
- ->repr($node->getTemplateLine())
- ->raw(", \$this->source);\n")
- ->outdent()
- ->write("}\n\n")
-
- ->write(sprintf('$_trait_%s_blocks[', $i))
- ->subcompile($value)
- ->raw(sprintf('] = $_trait_%s_blocks[', $i))
- ->string($key)
- ->raw(sprintf(']; unset($_trait_%s_blocks[', $i))
- ->string($key)
- ->raw("]);\n\n")
- ;
- }
- }
-
- if ($countTraits > 1) {
- $compiler
- ->write("\$this->traits = array_merge(\n")
- ->indent()
- ;
-
- for ($i = 0; $i < $countTraits; ++$i) {
- $compiler
- ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i))
- ;
- }
-
- $compiler
- ->outdent()
- ->write(");\n\n")
- ;
- } else {
- $compiler
- ->write("\$this->traits = \$_trait_0_blocks;\n\n")
- ;
- }
-
- $compiler
- ->write("\$this->blocks = array_merge(\n")
- ->indent()
- ->write("\$this->traits,\n")
- ->write("[\n")
- ;
- } else {
- $compiler
- ->write("\$this->blocks = [\n")
- ;
- }
-
- // blocks
- $compiler
- ->indent()
- ;
-
- foreach ($this->getNode('blocks') as $name => $node) {
- $compiler
- ->write(sprintf("'%s' => [\$this, 'block_%s'],\n", $name, $name))
- ;
- }
-
- if ($countTraits) {
- $compiler
- ->outdent()
- ->write("]\n")
- ->outdent()
- ->write(");\n")
- ;
- } else {
- $compiler
- ->outdent()
- ->write("];\n")
- ;
- }
-
- $compiler
- ->subcompile($this->getNode('constructor_end'))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileDisplay(Compiler $compiler)
- {
- $compiler
- ->write("protected function doDisplay(array \$context, array \$blocks = [])\n", "{\n")
- ->indent()
- ->write("\$macros = \$this->macros;\n")
- ->subcompile($this->getNode('display_start'))
- ->subcompile($this->getNode('body'))
- ;
-
- if ($this->hasNode('parent')) {
- $parent = $this->getNode('parent');
-
- $compiler->addDebugInfo($parent);
- if ($parent instanceof ConstantExpression) {
- $compiler
- ->write('$this->parent = $this->loadTemplate(')
- ->subcompile($parent)
- ->raw(', ')
- ->repr($this->getSourceContext()->getName())
- ->raw(', ')
- ->repr($parent->getTemplateLine())
- ->raw(");\n")
- ;
- }
- $compiler->write('yield from ');
-
- if ($parent instanceof ConstantExpression) {
- $compiler->raw('$this->parent');
- } else {
- $compiler->raw('$this->getParent($context)');
- }
- $compiler->raw("->unwrap()->yield(\$context, array_merge(\$this->blocks, \$blocks));\n");
- }
-
- $compiler->subcompile($this->getNode('display_end'));
-
- if (!$this->hasNode('parent')) {
- $compiler->write("return; yield '';\n"); // ensure at least one yield call even for templates with no output
- }
-
- $compiler
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileClassFooter(Compiler $compiler)
- {
- $compiler
- ->subcompile($this->getNode('class_end'))
- ->outdent()
- ->write("}\n")
- ;
- }
-
- protected function compileMacros(Compiler $compiler)
- {
- $compiler->subcompile($this->getNode('macros'));
- }
-
- protected function compileGetTemplateName(Compiler $compiler)
- {
- $compiler
- ->write("/**\n")
- ->write(" * @codeCoverageIgnore\n")
- ->write(" */\n")
- ->write("public function getTemplateName()\n", "{\n")
- ->indent()
- ->write('return ')
- ->repr($this->getSourceContext()->getName())
- ->raw(";\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileIsTraitable(Compiler $compiler)
- {
- // A template can be used as a trait if:
- // * it has no parent
- // * it has no macros
- // * it has no body
- //
- // Put another way, a template can be used as a trait if it
- // only contains blocks and use statements.
- $traitable = !$this->hasNode('parent') && 0 === \count($this->getNode('macros'));
- if ($traitable) {
- if ($this->getNode('body') instanceof BodyNode) {
- $nodes = $this->getNode('body')->getNode('0');
- } else {
- $nodes = $this->getNode('body');
- }
-
- if (!\count($nodes)) {
- $nodes = new Node([$nodes]);
- }
-
- foreach ($nodes as $node) {
- if (!\count($node)) {
- continue;
- }
-
- if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) {
- continue;
- }
-
- if ($node instanceof BlockReferenceNode) {
- continue;
- }
-
- $traitable = false;
- break;
- }
- }
-
- if ($traitable) {
- return;
- }
-
- $compiler
- ->write("/**\n")
- ->write(" * @codeCoverageIgnore\n")
- ->write(" */\n")
- ->write("public function isTraitable()\n", "{\n")
- ->indent()
- ->write("return false;\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileDebugInfo(Compiler $compiler)
- {
- $compiler
- ->write("/**\n")
- ->write(" * @codeCoverageIgnore\n")
- ->write(" */\n")
- ->write("public function getDebugInfo()\n", "{\n")
- ->indent()
- ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileGetSourceContext(Compiler $compiler)
- {
- $compiler
- ->write("public function getSourceContext()\n", "{\n")
- ->indent()
- ->write('return new Source(')
- ->string($compiler->getEnvironment()->isDebug() ? $this->getSourceContext()->getCode() : '')
- ->raw(', ')
- ->string($this->getSourceContext()->getName())
- ->raw(', ')
- ->string($this->getSourceContext()->getPath())
- ->raw(");\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-
- protected function compileLoadTemplate(Compiler $compiler, $node, $var)
- {
- if ($node instanceof ConstantExpression) {
- $compiler
- ->write(sprintf('%s = $this->loadTemplate(', $var))
- ->subcompile($node)
- ->raw(', ')
- ->repr($node->getTemplateName())
- ->raw(', ')
- ->repr($node->getTemplateLine())
- ->raw(");\n")
- ;
- } else {
- throw new \LogicException('Trait templates can only be constant nodes.');
- }
- }
-
- private function hasNodeOutputNodes(Node $node): bool
- {
- if ($node instanceof NodeOutputInterface) {
- return true;
- }
-
- foreach ($node as $child) {
- if ($this->hasNodeOutputNodes($child)) {
- return true;
- }
- }
-
- return false;
- }
-}
diff --git a/vendor/twig/twig/src/Node/Node.php b/vendor/twig/twig/src/Node/Node.php
deleted file mode 100644
index 4ac94f1b..00000000
--- a/vendor/twig/twig/src/Node/Node.php
+++ /dev/null
@@ -1,183 +0,0 @@
-
- */
-#[YieldReady]
-class Node implements \Countable, \IteratorAggregate
-{
- protected $nodes;
- protected $attributes;
- protected $lineno;
- protected $tag;
-
- private $sourceContext;
-
- /**
- * @param array $nodes An array of named nodes
- * @param array $attributes An array of attributes (should not be nodes)
- * @param int $lineno The line number
- * @param string $tag The tag name associated with the Node
- */
- public function __construct(array $nodes = [], array $attributes = [], int $lineno = 0, ?string $tag = null)
- {
- foreach ($nodes as $name => $node) {
- if (!$node instanceof self) {
- throw new \InvalidArgumentException(sprintf('Using "%s" for the value of node "%s" of "%s" is not supported. You must pass a \Twig\Node\Node instance.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, static::class));
- }
- }
- $this->nodes = $nodes;
- $this->attributes = $attributes;
- $this->lineno = $lineno;
- $this->tag = $tag;
- }
-
- public function __toString()
- {
- $attributes = [];
- foreach ($this->attributes as $name => $value) {
- $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
- }
-
- $repr = [static::class.'('.implode(', ', $attributes)];
-
- if (\count($this->nodes)) {
- foreach ($this->nodes as $name => $node) {
- $len = \strlen($name) + 4;
- $noderepr = [];
- foreach (explode("\n", (string) $node) as $line) {
- $noderepr[] = str_repeat(' ', $len).$line;
- }
-
- $repr[] = sprintf(' %s: %s', $name, ltrim(implode("\n", $noderepr)));
- }
-
- $repr[] = ')';
- } else {
- $repr[0] .= ')';
- }
-
- return implode("\n", $repr);
- }
-
- /**
- * @return void
- */
- public function compile(Compiler $compiler)
- {
- foreach ($this->nodes as $node) {
- $compiler->subcompile($node);
- }
- }
-
- public function getTemplateLine(): int
- {
- return $this->lineno;
- }
-
- public function getNodeTag(): ?string
- {
- return $this->tag;
- }
-
- public function hasAttribute(string $name): bool
- {
- return \array_key_exists($name, $this->attributes);
- }
-
- public function getAttribute(string $name)
- {
- if (!\array_key_exists($name, $this->attributes)) {
- throw new \LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, static::class));
- }
-
- return $this->attributes[$name];
- }
-
- public function setAttribute(string $name, $value): void
- {
- $this->attributes[$name] = $value;
- }
-
- public function removeAttribute(string $name): void
- {
- unset($this->attributes[$name]);
- }
-
- public function hasNode(string $name): bool
- {
- return isset($this->nodes[$name]);
- }
-
- public function getNode(string $name): self
- {
- if (!isset($this->nodes[$name])) {
- throw new \LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, static::class));
- }
-
- return $this->nodes[$name];
- }
-
- public function setNode(string $name, self $node): void
- {
- if (null !== $this->sourceContext) {
- $node->setSourceContext($this->sourceContext);
- }
- $this->nodes[$name] = $node;
- }
-
- public function removeNode(string $name): void
- {
- unset($this->nodes[$name]);
- }
-
- /**
- * @return int
- */
- #[\ReturnTypeWillChange]
- public function count()
- {
- return \count($this->nodes);
- }
-
- public function getIterator(): \Traversable
- {
- return new \ArrayIterator($this->nodes);
- }
-
- public function getTemplateName(): ?string
- {
- return $this->sourceContext ? $this->sourceContext->getName() : null;
- }
-
- public function setSourceContext(Source $source): void
- {
- $this->sourceContext = $source;
- foreach ($this->nodes as $node) {
- $node->setSourceContext($source);
- }
- }
-
- public function getSourceContext(): ?Source
- {
- return $this->sourceContext;
- }
-}
diff --git a/vendor/twig/twig/src/Node/NodeCaptureInterface.php b/vendor/twig/twig/src/Node/NodeCaptureInterface.php
deleted file mode 100644
index 9fb6a0ca..00000000
--- a/vendor/twig/twig/src/Node/NodeCaptureInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-interface NodeCaptureInterface
-{
-}
diff --git a/vendor/twig/twig/src/Node/NodeOutputInterface.php b/vendor/twig/twig/src/Node/NodeOutputInterface.php
deleted file mode 100644
index 5e35b406..00000000
--- a/vendor/twig/twig/src/Node/NodeOutputInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-interface NodeOutputInterface
-{
-}
diff --git a/vendor/twig/twig/src/Node/PrintNode.php b/vendor/twig/twig/src/Node/PrintNode.php
deleted file mode 100644
index a6a89bd7..00000000
--- a/vendor/twig/twig/src/Node/PrintNode.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
- */
-#[YieldReady]
-class PrintNode extends Node implements NodeOutputInterface
-{
- public function __construct(AbstractExpression $expr, int $lineno, ?string $tag = null)
- {
- parent::__construct(['expr' => $expr], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- $compiler
- ->write('yield ')
- ->subcompile($this->getNode('expr'))
- ->raw(";\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/SandboxNode.php b/vendor/twig/twig/src/Node/SandboxNode.php
deleted file mode 100644
index 80aecbdb..00000000
--- a/vendor/twig/twig/src/Node/SandboxNode.php
+++ /dev/null
@@ -1,54 +0,0 @@
-
- */
-#[YieldReady]
-class SandboxNode extends Node
-{
- public function __construct(Node $body, int $lineno, ?string $tag = null)
- {
- parent::__construct(['body' => $body], [], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->addDebugInfo($this)
- ->write("if (!\$alreadySandboxed = \$this->sandbox->isSandboxed()) {\n")
- ->indent()
- ->write("\$this->sandbox->enableSandbox();\n")
- ->outdent()
- ->write("}\n")
- ->write("try {\n")
- ->indent()
- ->subcompile($this->getNode('body'))
- ->outdent()
- ->write("} finally {\n")
- ->indent()
- ->write("if (!\$alreadySandboxed) {\n")
- ->indent()
- ->write("\$this->sandbox->disableSandbox();\n")
- ->outdent()
- ->write("}\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/SetNode.php b/vendor/twig/twig/src/Node/SetNode.php
deleted file mode 100644
index 0900f154..00000000
--- a/vendor/twig/twig/src/Node/SetNode.php
+++ /dev/null
@@ -1,96 +0,0 @@
-
- */
-#[YieldReady]
-class SetNode extends Node implements NodeCaptureInterface
-{
- public function __construct(bool $capture, Node $names, Node $values, int $lineno, ?string $tag = null)
- {
- /*
- * Optimizes the node when capture is used for a large block of text.
- *
- * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig\Markup("foo");
- */
- $safe = false;
- if ($capture) {
- $safe = true;
- if ($values instanceof TextNode) {
- $values = new ConstantExpression($values->getAttribute('data'), $values->getTemplateLine());
- $capture = false;
- } else {
- $values = new CaptureNode($values, $values->getTemplateLine());
- }
- }
-
- parent::__construct(['names' => $names, 'values' => $values], ['capture' => $capture, 'safe' => $safe], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- if (\count($this->getNode('names')) > 1) {
- $compiler->write('[');
- foreach ($this->getNode('names') as $idx => $node) {
- if ($idx) {
- $compiler->raw(', ');
- }
-
- $compiler->subcompile($node);
- }
- $compiler->raw(']');
- } else {
- $compiler->subcompile($this->getNode('names'), false);
- }
- $compiler->raw(' = ');
-
- if ($this->getAttribute('capture')) {
- $compiler->subcompile($this->getNode('values'));
- } else {
- if (\count($this->getNode('names')) > 1) {
- $compiler->write('[');
- foreach ($this->getNode('values') as $idx => $value) {
- if ($idx) {
- $compiler->raw(', ');
- }
-
- $compiler->subcompile($value);
- }
- $compiler->raw(']');
- } else {
- if ($this->getAttribute('safe')) {
- $compiler
- ->raw("('' === \$tmp = ")
- ->subcompile($this->getNode('values'))
- ->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset())")
- ;
- } else {
- $compiler->subcompile($this->getNode('values'));
- }
- }
-
- $compiler->raw(';');
- }
-
- $compiler->raw("\n");
- }
-}
diff --git a/vendor/twig/twig/src/Node/TextNode.php b/vendor/twig/twig/src/Node/TextNode.php
deleted file mode 100644
index fae65fb2..00000000
--- a/vendor/twig/twig/src/Node/TextNode.php
+++ /dev/null
@@ -1,41 +0,0 @@
-
- */
-#[YieldReady]
-class TextNode extends Node implements NodeOutputInterface
-{
- public function __construct(string $data, int $lineno)
- {
- parent::__construct([], ['data' => $data], $lineno);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- $compiler
- ->write('yield ')
- ->string($this->getAttribute('data'))
- ->raw(";\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Node/WithNode.php b/vendor/twig/twig/src/Node/WithNode.php
deleted file mode 100644
index 9b8c5788..00000000
--- a/vendor/twig/twig/src/Node/WithNode.php
+++ /dev/null
@@ -1,72 +0,0 @@
-
- */
-#[YieldReady]
-class WithNode extends Node
-{
- public function __construct(Node $body, ?Node $variables, bool $only, int $lineno, ?string $tag = null)
- {
- $nodes = ['body' => $body];
- if (null !== $variables) {
- $nodes['variables'] = $variables;
- }
-
- parent::__construct($nodes, ['only' => $only], $lineno, $tag);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler->addDebugInfo($this);
-
- $parentContextName = $compiler->getVarName();
-
- $compiler->write(sprintf("\$%s = \$context;\n", $parentContextName));
-
- if ($this->hasNode('variables')) {
- $node = $this->getNode('variables');
- $varsName = $compiler->getVarName();
- $compiler
- ->write(sprintf('$%s = ', $varsName))
- ->subcompile($node)
- ->raw(";\n")
- ->write(sprintf("if (!is_iterable(\$%s)) {\n", $varsName))
- ->indent()
- ->write("throw new RuntimeError('Variables passed to the \"with\" tag must be a hash.', ")
- ->repr($node->getTemplateLine())
- ->raw(", \$this->getSourceContext());\n")
- ->outdent()
- ->write("}\n")
- ->write(sprintf("\$%s = CoreExtension::toArray(\$%s);\n", $varsName, $varsName))
- ;
-
- if ($this->getAttribute('only')) {
- $compiler->write("\$context = [];\n");
- }
-
- $compiler->write(sprintf("\$context = \$this->env->mergeGlobals(array_merge(\$context, \$%s));\n", $varsName));
- }
-
- $compiler
- ->subcompile($this->getNode('body'))
- ->write(sprintf("\$context = \$%s;\n", $parentContextName))
- ;
- }
-}
diff --git a/vendor/twig/twig/src/NodeTraverser.php b/vendor/twig/twig/src/NodeTraverser.php
deleted file mode 100644
index 47a2d5ca..00000000
--- a/vendor/twig/twig/src/NodeTraverser.php
+++ /dev/null
@@ -1,76 +0,0 @@
-
- */
-final class NodeTraverser
-{
- private $env;
- private $visitors = [];
-
- /**
- * @param NodeVisitorInterface[] $visitors
- */
- public function __construct(Environment $env, array $visitors = [])
- {
- $this->env = $env;
- foreach ($visitors as $visitor) {
- $this->addVisitor($visitor);
- }
- }
-
- public function addVisitor(NodeVisitorInterface $visitor): void
- {
- $this->visitors[$visitor->getPriority()][] = $visitor;
- }
-
- /**
- * Traverses a node and calls the registered visitors.
- */
- public function traverse(Node $node): Node
- {
- ksort($this->visitors);
- foreach ($this->visitors as $visitors) {
- foreach ($visitors as $visitor) {
- $node = $this->traverseForVisitor($visitor, $node);
- }
- }
-
- return $node;
- }
-
- private function traverseForVisitor(NodeVisitorInterface $visitor, Node $node): ?Node
- {
- $node = $visitor->enterNode($node, $this->env);
-
- foreach ($node as $k => $n) {
- if (null !== $m = $this->traverseForVisitor($visitor, $n)) {
- if ($m !== $n) {
- $node->setNode($k, $m);
- }
- } else {
- $node->removeNode($k);
- }
- }
-
- return $visitor->leaveNode($node, $this->env);
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
deleted file mode 100644
index 5de35fd0..00000000
--- a/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
+++ /dev/null
@@ -1,49 +0,0 @@
-
- *
- * @deprecated since 3.9 (to be removed in 4.0)
- */
-abstract class AbstractNodeVisitor implements NodeVisitorInterface
-{
- final public function enterNode(Node $node, Environment $env): Node
- {
- return $this->doEnterNode($node, $env);
- }
-
- final public function leaveNode(Node $node, Environment $env): ?Node
- {
- return $this->doLeaveNode($node, $env);
- }
-
- /**
- * Called before child nodes are visited.
- *
- * @return Node The modified node
- */
- abstract protected function doEnterNode(Node $node, Environment $env);
-
- /**
- * Called after child nodes are visited.
- *
- * @return Node|null The modified node or null if the node must be removed
- */
- abstract protected function doLeaveNode(Node $node, Environment $env);
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
deleted file mode 100644
index 91e2ea89..00000000
--- a/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
+++ /dev/null
@@ -1,204 +0,0 @@
-
- *
- * @internal
- */
-final class EscaperNodeVisitor implements NodeVisitorInterface
-{
- private $statusStack = [];
- private $blocks = [];
- private $safeAnalysis;
- private $traverser;
- private $defaultStrategy = false;
- private $safeVars = [];
-
- public function __construct()
- {
- $this->safeAnalysis = new SafeAnalysisNodeVisitor();
- }
-
- public function enterNode(Node $node, Environment $env): Node
- {
- if ($node instanceof ModuleNode) {
- if ($env->hasExtension(EscaperExtension::class) && $defaultStrategy = $env->getExtension(EscaperExtension::class)->getDefaultStrategy($node->getTemplateName())) {
- $this->defaultStrategy = $defaultStrategy;
- }
- $this->safeVars = [];
- $this->blocks = [];
- } elseif ($node instanceof AutoEscapeNode) {
- $this->statusStack[] = $node->getAttribute('value');
- } elseif ($node instanceof BlockNode) {
- $this->statusStack[] = $this->blocks[$node->getAttribute('name')] ?? $this->needEscaping();
- } elseif ($node instanceof ImportNode) {
- $this->safeVars[] = $node->getNode('var')->getAttribute('name');
- }
-
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- if ($node instanceof ModuleNode) {
- $this->defaultStrategy = false;
- $this->safeVars = [];
- $this->blocks = [];
- } elseif ($node instanceof FilterExpression) {
- return $this->preEscapeFilterNode($node, $env);
- } elseif ($node instanceof PrintNode && false !== $type = $this->needEscaping()) {
- $expression = $node->getNode('expr');
- if ($expression instanceof ConditionalExpression && $this->shouldUnwrapConditional($expression, $env, $type)) {
- return new DoNode($this->unwrapConditional($expression, $env, $type), $expression->getTemplateLine());
- }
-
- return $this->escapePrintNode($node, $env, $type);
- }
-
- if ($node instanceof AutoEscapeNode || $node instanceof BlockNode) {
- array_pop($this->statusStack);
- } elseif ($node instanceof BlockReferenceNode) {
- $this->blocks[$node->getAttribute('name')] = $this->needEscaping();
- }
-
- return $node;
- }
-
- private function shouldUnwrapConditional(ConditionalExpression $expression, Environment $env, string $type): bool
- {
- $expr2Safe = $this->isSafeFor($type, $expression->getNode('expr2'), $env);
- $expr3Safe = $this->isSafeFor($type, $expression->getNode('expr3'), $env);
-
- return $expr2Safe !== $expr3Safe;
- }
-
- private function unwrapConditional(ConditionalExpression $expression, Environment $env, string $type): ConditionalExpression
- {
- // convert "echo a ? b : c" to "a ? echo b : echo c" recursively
- $expr2 = $expression->getNode('expr2');
- if ($expr2 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr2, $env, $type)) {
- $expr2 = $this->unwrapConditional($expr2, $env, $type);
- } else {
- $expr2 = $this->escapeInlinePrintNode(new InlinePrint($expr2, $expr2->getTemplateLine()), $env, $type);
- }
- $expr3 = $expression->getNode('expr3');
- if ($expr3 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr3, $env, $type)) {
- $expr3 = $this->unwrapConditional($expr3, $env, $type);
- } else {
- $expr3 = $this->escapeInlinePrintNode(new InlinePrint($expr3, $expr3->getTemplateLine()), $env, $type);
- }
-
- return new ConditionalExpression($expression->getNode('expr1'), $expr2, $expr3, $expression->getTemplateLine());
- }
-
- private function escapeInlinePrintNode(InlinePrint $node, Environment $env, string $type): Node
- {
- $expression = $node->getNode('node');
-
- if ($this->isSafeFor($type, $expression, $env)) {
- return $node;
- }
-
- return new InlinePrint($this->getEscaperFilter($type, $expression), $node->getTemplateLine());
- }
-
- private function escapePrintNode(PrintNode $node, Environment $env, string $type): Node
- {
- $expression = $node->getNode('expr');
-
- if ($this->isSafeFor($type, $expression, $env)) {
- return $node;
- }
-
- $class = \get_class($node);
-
- return new $class($this->getEscaperFilter($type, $expression), $node->getTemplateLine());
- }
-
- private function preEscapeFilterNode(FilterExpression $filter, Environment $env): FilterExpression
- {
- $name = $filter->getNode('filter')->getAttribute('value');
-
- $type = $env->getFilter($name)->getPreEscape();
- if (null === $type) {
- return $filter;
- }
-
- $node = $filter->getNode('node');
- if ($this->isSafeFor($type, $node, $env)) {
- return $filter;
- }
-
- $filter->setNode('node', $this->getEscaperFilter($type, $node));
-
- return $filter;
- }
-
- private function isSafeFor(string $type, Node $expression, Environment $env): bool
- {
- $safe = $this->safeAnalysis->getSafe($expression);
-
- if (null === $safe) {
- if (null === $this->traverser) {
- $this->traverser = new NodeTraverser($env, [$this->safeAnalysis]);
- }
-
- $this->safeAnalysis->setSafeVars($this->safeVars);
-
- $this->traverser->traverse($expression);
- $safe = $this->safeAnalysis->getSafe($expression);
- }
-
- return \in_array($type, $safe) || \in_array('all', $safe);
- }
-
- private function needEscaping()
- {
- if (\count($this->statusStack)) {
- return $this->statusStack[\count($this->statusStack) - 1];
- }
-
- return $this->defaultStrategy ?: false;
- }
-
- private function getEscaperFilter(string $type, Node $node): FilterExpression
- {
- $line = $node->getTemplateLine();
- $name = new ConstantExpression('escape', $line);
- $args = new Node([new ConstantExpression($type, $line), new ConstantExpression(null, $line), new ConstantExpression(true, $line)]);
-
- return new FilterExpression($node, $name, $args, $line);
- }
-
- public function getPriority(): int
- {
- return 0;
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php
deleted file mode 100644
index d6a7781b..00000000
--- a/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php
+++ /dev/null
@@ -1,74 +0,0 @@
-
- *
- * @internal
- */
-final class MacroAutoImportNodeVisitor implements NodeVisitorInterface
-{
- private $inAModule = false;
- private $hasMacroCalls = false;
-
- public function enterNode(Node $node, Environment $env): Node
- {
- if ($node instanceof ModuleNode) {
- $this->inAModule = true;
- $this->hasMacroCalls = false;
- }
-
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): Node
- {
- if ($node instanceof ModuleNode) {
- $this->inAModule = false;
- if ($this->hasMacroCalls) {
- $node->getNode('constructor_end')->setNode('_auto_macro_import', new ImportNode(new NameExpression('_self', 0), new AssignNameExpression('_self', 0), 0, 'import', true));
- }
- } elseif ($this->inAModule) {
- if (
- $node instanceof GetAttrExpression
- && $node->getNode('node') instanceof NameExpression
- && '_self' === $node->getNode('node')->getAttribute('name')
- && $node->getNode('attribute') instanceof ConstantExpression
- ) {
- $this->hasMacroCalls = true;
-
- $name = $node->getNode('attribute')->getAttribute('value');
- $node = new MethodCallExpression($node->getNode('node'), 'macro_'.$name, $node->getNode('arguments'), $node->getTemplateLine());
- $node->setAttribute('safe', true);
- }
- }
-
- return $node;
- }
-
- public function getPriority(): int
- {
- // we must be ran before auto-escaping
- return -10;
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php b/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
deleted file mode 100644
index 59e836db..00000000
--- a/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- */
-interface NodeVisitorInterface
-{
- /**
- * Called before child nodes are visited.
- *
- * @return Node The modified node
- */
- public function enterNode(Node $node, Environment $env): Node;
-
- /**
- * Called after child nodes are visited.
- *
- * @return Node|null The modified node or null if the node must be removed
- */
- public function leaveNode(Node $node, Environment $env): ?Node;
-
- /**
- * Returns the priority for this visitor.
- *
- * Priority should be between -10 and 10 (0 is the default).
- *
- * @return int The priority level
- */
- public function getPriority();
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
deleted file mode 100644
index 6af056ac..00000000
--- a/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
+++ /dev/null
@@ -1,260 +0,0 @@
-
- *
- * @internal
- */
-final class OptimizerNodeVisitor implements NodeVisitorInterface
-{
- public const OPTIMIZE_ALL = -1;
- public const OPTIMIZE_NONE = 0;
- public const OPTIMIZE_FOR = 2;
- public const OPTIMIZE_RAW_FILTER = 4;
- public const OPTIMIZE_TEXT_NODES = 8;
-
- private $loops = [];
- private $loopsTargets = [];
- private $optimizers;
-
- /**
- * @param int $optimizers The optimizer mode
- */
- public function __construct(int $optimizers = -1)
- {
- if ($optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER)) {
- throw new \InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers));
- }
-
- $this->optimizers = $optimizers;
- }
-
- public function enterNode(Node $node, Environment $env): Node
- {
- if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
- $this->enterOptimizeFor($node);
- }
-
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
- $this->leaveOptimizeFor($node);
- }
-
- if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
- $node = $this->optimizeRawFilter($node);
- }
-
- $node = $this->optimizePrintNode($node);
-
- if (self::OPTIMIZE_TEXT_NODES === (self::OPTIMIZE_TEXT_NODES & $this->optimizers)) {
- $node = $this->mergeTextNodeCalls($node);
- }
-
- return $node;
- }
-
- private function mergeTextNodeCalls(Node $node): Node
- {
- $text = '';
- $names = [];
- foreach ($node as $k => $n) {
- if (!$n instanceof TextNode) {
- return $node;
- }
-
- $text .= $n->getAttribute('data');
- $names[] = $k;
- }
-
- if (!$text) {
- return $node;
- }
-
- if (Node::class === get_class($node)) {
- return new TextNode($text, $node->getTemplateLine());
- }
-
- foreach ($names as $i => $name) {
- if (0 === $i) {
- $node->setNode($name, new TextNode($text, $node->getTemplateLine()));
- } else {
- $node->removeNode($name);
- }
- }
-
- return $node;
- }
-
- /**
- * Optimizes print nodes.
- *
- * It replaces:
- *
- * * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
- */
- private function optimizePrintNode(Node $node): Node
- {
- if (!$node instanceof PrintNode) {
- return $node;
- }
-
- $exprNode = $node->getNode('expr');
-
- if ($exprNode instanceof ConstantExpression && \is_string($exprNode->getAttribute('value'))) {
- return new TextNode($exprNode->getAttribute('value'), $exprNode->getTemplateLine());
- }
-
- if (
- $exprNode instanceof BlockReferenceExpression
- || $exprNode instanceof ParentExpression
- ) {
- $exprNode->setAttribute('output', true);
-
- return $exprNode;
- }
-
- return $node;
- }
-
- /**
- * Removes "raw" filters.
- */
- private function optimizeRawFilter(Node $node): Node
- {
- if ($node instanceof FilterExpression && 'raw' == $node->getNode('filter')->getAttribute('value')) {
- return $node->getNode('node');
- }
-
- return $node;
- }
-
- /**
- * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
- */
- private function enterOptimizeFor(Node $node): void
- {
- if ($node instanceof ForNode) {
- // disable the loop variable by default
- $node->setAttribute('with_loop', false);
- array_unshift($this->loops, $node);
- array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name'));
- array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name'));
- } elseif (!$this->loops) {
- // we are outside a loop
- return;
- }
-
- // when do we need to add the loop variable back?
-
- // the loop variable is referenced for the current loop
- elseif ($node instanceof NameExpression && 'loop' === $node->getAttribute('name')) {
- $node->setAttribute('always_defined', true);
- $this->addLoopToCurrent();
- }
-
- // optimize access to loop targets
- elseif ($node instanceof NameExpression && \in_array($node->getAttribute('name'), $this->loopsTargets)) {
- $node->setAttribute('always_defined', true);
- }
-
- // block reference
- elseif ($node instanceof BlockReferenceNode || $node instanceof BlockReferenceExpression) {
- $this->addLoopToCurrent();
- }
-
- // include without the only attribute
- elseif ($node instanceof IncludeNode && !$node->getAttribute('only')) {
- $this->addLoopToAll();
- }
-
- // include function without the with_context=false parameter
- elseif ($node instanceof FunctionExpression
- && 'include' === $node->getAttribute('name')
- && (!$node->getNode('arguments')->hasNode('with_context')
- || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value')
- )
- ) {
- $this->addLoopToAll();
- }
-
- // the loop variable is referenced via an attribute
- elseif ($node instanceof GetAttrExpression
- && (!$node->getNode('attribute') instanceof ConstantExpression
- || 'parent' === $node->getNode('attribute')->getAttribute('value')
- )
- && (true === $this->loops[0]->getAttribute('with_loop')
- || ($node->getNode('node') instanceof NameExpression
- && 'loop' === $node->getNode('node')->getAttribute('name')
- )
- )
- ) {
- $this->addLoopToAll();
- }
- }
-
- /**
- * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
- */
- private function leaveOptimizeFor(Node $node): void
- {
- if ($node instanceof ForNode) {
- array_shift($this->loops);
- array_shift($this->loopsTargets);
- array_shift($this->loopsTargets);
- }
- }
-
- private function addLoopToCurrent(): void
- {
- $this->loops[0]->setAttribute('with_loop', true);
- }
-
- private function addLoopToAll(): void
- {
- foreach ($this->loops as $loop) {
- $loop->setAttribute('with_loop', true);
- }
- }
-
- public function getPriority(): int
- {
- return 255;
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
deleted file mode 100644
index 6df046e1..00000000
--- a/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
+++ /dev/null
@@ -1,160 +0,0 @@
-safeVars = $safeVars;
- }
-
- public function getSafe(Node $node)
- {
- $hash = spl_object_hash($node);
- if (!isset($this->data[$hash])) {
- return;
- }
-
- foreach ($this->data[$hash] as $bucket) {
- if ($bucket['key'] !== $node) {
- continue;
- }
-
- if (\in_array('html_attr', $bucket['value'])) {
- $bucket['value'][] = 'html';
- }
-
- return $bucket['value'];
- }
- }
-
- private function setSafe(Node $node, array $safe): void
- {
- $hash = spl_object_hash($node);
- if (isset($this->data[$hash])) {
- foreach ($this->data[$hash] as &$bucket) {
- if ($bucket['key'] === $node) {
- $bucket['value'] = $safe;
-
- return;
- }
- }
- }
- $this->data[$hash][] = [
- 'key' => $node,
- 'value' => $safe,
- ];
- }
-
- public function enterNode(Node $node, Environment $env): Node
- {
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- if ($node instanceof ConstantExpression) {
- // constants are marked safe for all
- $this->setSafe($node, ['all']);
- } elseif ($node instanceof BlockReferenceExpression) {
- // blocks are safe by definition
- $this->setSafe($node, ['all']);
- } elseif ($node instanceof ParentExpression) {
- // parent block is safe by definition
- $this->setSafe($node, ['all']);
- } elseif ($node instanceof ConditionalExpression) {
- // intersect safeness of both operands
- $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
- $this->setSafe($node, $safe);
- } elseif ($node instanceof FilterExpression) {
- // filter expression is safe when the filter is safe
- $name = $node->getNode('filter')->getAttribute('value');
- $args = $node->getNode('arguments');
- if ($filter = $env->getFilter($name)) {
- $safe = $filter->getSafe($args);
- if (null === $safe) {
- $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
- }
- $this->setSafe($node, $safe);
- } else {
- $this->setSafe($node, []);
- }
- } elseif ($node instanceof FunctionExpression) {
- // function expression is safe when the function is safe
- $name = $node->getAttribute('name');
- $args = $node->getNode('arguments');
- if ($function = $env->getFunction($name)) {
- $this->setSafe($node, $function->getSafe($args));
- } else {
- $this->setSafe($node, []);
- }
- } elseif ($node instanceof MethodCallExpression) {
- if ($node->getAttribute('safe')) {
- $this->setSafe($node, ['all']);
- } else {
- $this->setSafe($node, []);
- }
- } elseif ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression) {
- $name = $node->getNode('node')->getAttribute('name');
- if (\in_array($name, $this->safeVars)) {
- $this->setSafe($node, ['all']);
- } else {
- $this->setSafe($node, []);
- }
- } else {
- $this->setSafe($node, []);
- }
-
- return $node;
- }
-
- private function intersectSafe(?array $a = null, ?array $b = null): array
- {
- if (null === $a || null === $b) {
- return [];
- }
-
- if (\in_array('all', $a)) {
- return $b;
- }
-
- if (\in_array('all', $b)) {
- return $a;
- }
-
- return array_intersect($a, $b);
- }
-
- public function getPriority(): int
- {
- return 0;
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
deleted file mode 100644
index d1108394..00000000
--- a/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
+++ /dev/null
@@ -1,139 +0,0 @@
-
- *
- * @internal
- */
-final class SandboxNodeVisitor implements NodeVisitorInterface
-{
- private $inAModule = false;
- /** @var array */
- private $tags;
- /** @var array */
- private $filters;
- /** @var array */
- private $functions;
- private $needsToStringWrap = false;
-
- public function enterNode(Node $node, Environment $env): Node
- {
- if ($node instanceof ModuleNode) {
- $this->inAModule = true;
- $this->tags = [];
- $this->filters = [];
- $this->functions = [];
-
- return $node;
- } elseif ($this->inAModule) {
- // look for tags
- if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) {
- $this->tags[$node->getNodeTag()] = $node->getTemplateLine();
- }
-
- // look for filters
- if ($node instanceof FilterExpression && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) {
- $this->filters[$node->getNode('filter')->getAttribute('value')] = $node->getTemplateLine();
- }
-
- // look for functions
- if ($node instanceof FunctionExpression && !isset($this->functions[$node->getAttribute('name')])) {
- $this->functions[$node->getAttribute('name')] = $node->getTemplateLine();
- }
-
- // the .. operator is equivalent to the range() function
- if ($node instanceof RangeBinary && !isset($this->functions['range'])) {
- $this->functions['range'] = $node->getTemplateLine();
- }
-
- if ($node instanceof PrintNode) {
- $this->needsToStringWrap = true;
- $this->wrapNode($node, 'expr');
- }
-
- if ($node instanceof SetNode && !$node->getAttribute('capture')) {
- $this->needsToStringWrap = true;
- }
-
- // wrap outer nodes that can implicitly call __toString()
- if ($this->needsToStringWrap) {
- if ($node instanceof ConcatBinary) {
- $this->wrapNode($node, 'left');
- $this->wrapNode($node, 'right');
- }
- if ($node instanceof FilterExpression) {
- $this->wrapNode($node, 'node');
- $this->wrapArrayNode($node, 'arguments');
- }
- if ($node instanceof FunctionExpression) {
- $this->wrapArrayNode($node, 'arguments');
- }
- }
- }
-
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- if ($node instanceof ModuleNode) {
- $this->inAModule = false;
-
- $node->setNode('constructor_end', new Node([new CheckSecurityCallNode(), $node->getNode('constructor_end')]));
- $node->setNode('class_end', new Node([new CheckSecurityNode($this->filters, $this->tags, $this->functions), $node->getNode('class_end')]));
- } elseif ($this->inAModule) {
- if ($node instanceof PrintNode || $node instanceof SetNode) {
- $this->needsToStringWrap = false;
- }
- }
-
- return $node;
- }
-
- private function wrapNode(Node $node, string $name): void
- {
- $expr = $node->getNode($name);
- if ($expr instanceof NameExpression || $expr instanceof GetAttrExpression) {
- $node->setNode($name, new CheckToStringNode($expr));
- }
- }
-
- private function wrapArrayNode(Node $node, string $name): void
- {
- $args = $node->getNode($name);
- foreach ($args as $name => $_) {
- $this->wrapNode($args, $name);
- }
- }
-
- public function getPriority(): int
- {
- return 0;
- }
-}
diff --git a/vendor/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php
deleted file mode 100644
index 34c3ac18..00000000
--- a/vendor/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php
+++ /dev/null
@@ -1,60 +0,0 @@
-useYield = $useYield;
- }
-
- public function enterNode(Node $node, Environment $env): Node
- {
- $class = \get_class($node);
-
- if ($node instanceof AbstractExpression || isset($this->yieldReadyNodes[$class])) {
- return $node;
- }
-
- if (!$this->yieldReadyNodes[$class] = (bool) (new \ReflectionClass($class))->getAttributes(YieldReady::class)) {
- if ($this->useYield) {
- throw new \LogicException(sprintf('You cannot enable the "use_yield" option of Twig as node "%s" is not marked as ready for it; please make it ready and then flag it with the #[YieldReady] attribute.', $class));
- }
-
- trigger_deprecation('twig/twig', '3.9', 'Twig node "%s" is not marked as ready for using "yield" instead of "echo"; please make it ready and then flag it with the #[YieldReady] attribute.', $class);
- }
-
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- return $node;
- }
-
- public function getPriority(): int
- {
- return 255;
- }
-}
diff --git a/vendor/twig/twig/src/Parser.php b/vendor/twig/twig/src/Parser.php
deleted file mode 100644
index adcaee31..00000000
--- a/vendor/twig/twig/src/Parser.php
+++ /dev/null
@@ -1,350 +0,0 @@
-
- */
-class Parser
-{
- private $stack = [];
- private $stream;
- private $parent;
- private $visitors;
- private $expressionParser;
- private $blocks;
- private $blockStack;
- private $macros;
- private $env;
- private $importedSymbols;
- private $traits;
- private $embeddedTemplates = [];
- private $varNameSalt = 0;
-
- public function __construct(Environment $env)
- {
- $this->env = $env;
- }
-
- public function getVarName(): string
- {
- return sprintf('__internal_parse_%d', $this->varNameSalt++);
- }
-
- public function parse(TokenStream $stream, $test = null, bool $dropNeedle = false): ModuleNode
- {
- $vars = get_object_vars($this);
- unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames'], $vars['varNameSalt']);
- $this->stack[] = $vars;
-
- // node visitors
- if (null === $this->visitors) {
- $this->visitors = $this->env->getNodeVisitors();
- }
-
- if (null === $this->expressionParser) {
- $this->expressionParser = new ExpressionParser($this, $this->env);
- }
-
- $this->stream = $stream;
- $this->parent = null;
- $this->blocks = [];
- $this->macros = [];
- $this->traits = [];
- $this->blockStack = [];
- $this->importedSymbols = [[]];
- $this->embeddedTemplates = [];
-
- try {
- $body = $this->subparse($test, $dropNeedle);
-
- if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) {
- $body = new Node();
- }
- } catch (SyntaxError $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($this->stream->getSourceContext());
- }
-
- if (!$e->getTemplateLine()) {
- $e->setTemplateLine($this->stream->getCurrent()->getLine());
- }
-
- throw $e;
- }
-
- $node = new ModuleNode(new BodyNode([$body]), $this->parent, new Node($this->blocks), new Node($this->macros), new Node($this->traits), $this->embeddedTemplates, $stream->getSourceContext());
-
- $traverser = new NodeTraverser($this->env, $this->visitors);
-
- /**
- * @var ModuleNode $node
- */
- $node = $traverser->traverse($node);
-
- // restore previous stack so previous parse() call can resume working
- foreach (array_pop($this->stack) as $key => $val) {
- $this->$key = $val;
- }
-
- return $node;
- }
-
- public function subparse($test, bool $dropNeedle = false): Node
- {
- $lineno = $this->getCurrentToken()->getLine();
- $rv = [];
- while (!$this->stream->isEOF()) {
- switch ($this->getCurrentToken()->getType()) {
- case /* Token::TEXT_TYPE */ 0:
- $token = $this->stream->next();
- $rv[] = new TextNode($token->getValue(), $token->getLine());
- break;
-
- case /* Token::VAR_START_TYPE */ 2:
- $token = $this->stream->next();
- $expr = $this->expressionParser->parseExpression();
- $this->stream->expect(/* Token::VAR_END_TYPE */ 4);
- $rv[] = new PrintNode($expr, $token->getLine());
- break;
-
- case /* Token::BLOCK_START_TYPE */ 1:
- $this->stream->next();
- $token = $this->getCurrentToken();
-
- if (/* Token::NAME_TYPE */ 5 !== $token->getType()) {
- throw new SyntaxError('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
- }
-
- if (null !== $test && $test($token)) {
- if ($dropNeedle) {
- $this->stream->next();
- }
-
- if (1 === \count($rv)) {
- return $rv[0];
- }
-
- return new Node($rv, [], $lineno);
- }
-
- if (!$subparser = $this->env->getTokenParser($token->getValue())) {
- if (null !== $test) {
- $e = new SyntaxError(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
-
- if (\is_array($test) && isset($test[0]) && $test[0] instanceof TokenParserInterface) {
- $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno));
- }
- } else {
- $e = new SyntaxError(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
- $e->addSuggestions($token->getValue(), array_keys($this->env->getTokenParsers()));
- }
-
- throw $e;
- }
-
- $this->stream->next();
-
- $subparser->setParser($this);
- $node = $subparser->parse($token);
- if (null !== $node) {
- $rv[] = $node;
- }
- break;
-
- default:
- throw new SyntaxError('Lexer or parser ended up in unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext());
- }
- }
-
- if (1 === \count($rv)) {
- return $rv[0];
- }
-
- return new Node($rv, [], $lineno);
- }
-
- public function getBlockStack(): array
- {
- return $this->blockStack;
- }
-
- public function peekBlockStack()
- {
- return $this->blockStack[\count($this->blockStack) - 1] ?? null;
- }
-
- public function popBlockStack(): void
- {
- array_pop($this->blockStack);
- }
-
- public function pushBlockStack($name): void
- {
- $this->blockStack[] = $name;
- }
-
- public function hasBlock(string $name): bool
- {
- return isset($this->blocks[$name]);
- }
-
- public function getBlock(string $name): Node
- {
- return $this->blocks[$name];
- }
-
- public function setBlock(string $name, BlockNode $value): void
- {
- $this->blocks[$name] = new BodyNode([$value], [], $value->getTemplateLine());
- }
-
- public function hasMacro(string $name): bool
- {
- return isset($this->macros[$name]);
- }
-
- public function setMacro(string $name, MacroNode $node): void
- {
- $this->macros[$name] = $node;
- }
-
- public function addTrait($trait): void
- {
- $this->traits[] = $trait;
- }
-
- public function hasTraits(): bool
- {
- return \count($this->traits) > 0;
- }
-
- public function embedTemplate(ModuleNode $template)
- {
- $template->setIndex(mt_rand());
-
- $this->embeddedTemplates[] = $template;
- }
-
- public function addImportedSymbol(string $type, string $alias, ?string $name = null, ?AbstractExpression $node = null): void
- {
- $this->importedSymbols[0][$type][$alias] = ['name' => $name, 'node' => $node];
- }
-
- public function getImportedSymbol(string $type, string $alias)
- {
- // if the symbol does not exist in the current scope (0), try in the main/global scope (last index)
- return $this->importedSymbols[0][$type][$alias] ?? ($this->importedSymbols[\count($this->importedSymbols) - 1][$type][$alias] ?? null);
- }
-
- public function isMainScope(): bool
- {
- return 1 === \count($this->importedSymbols);
- }
-
- public function pushLocalScope(): void
- {
- array_unshift($this->importedSymbols, []);
- }
-
- public function popLocalScope(): void
- {
- array_shift($this->importedSymbols);
- }
-
- public function getExpressionParser(): ExpressionParser
- {
- return $this->expressionParser;
- }
-
- public function getParent(): ?Node
- {
- return $this->parent;
- }
-
- public function setParent(?Node $parent): void
- {
- $this->parent = $parent;
- }
-
- public function getStream(): TokenStream
- {
- return $this->stream;
- }
-
- public function getCurrentToken(): Token
- {
- return $this->stream->getCurrent();
- }
-
- private function filterBodyNodes(Node $node, bool $nested = false): ?Node
- {
- // check that the body does not contain non-empty output nodes
- if (
- ($node instanceof TextNode && !ctype_space($node->getAttribute('data')))
- || (!$node instanceof TextNode && !$node instanceof BlockReferenceNode && $node instanceof NodeOutputInterface)
- ) {
- if (str_contains((string) $node, \chr(0xEF).\chr(0xBB).\chr(0xBF))) {
- $t = substr($node->getAttribute('data'), 3);
- if ('' === $t || ctype_space($t)) {
- // bypass empty nodes starting with a BOM
- return null;
- }
- }
-
- throw new SyntaxError('A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
- }
-
- // bypass nodes that "capture" the output
- if ($node instanceof NodeCaptureInterface) {
- // a "block" tag in such a node will serve as a block definition AND be displayed in place as well
- return $node;
- }
-
- // "block" tags that are not captured (see above) are only used for defining
- // the content of the block. In such a case, nesting it does not work as
- // expected as the definition is not part of the default template code flow.
- if ($nested && $node instanceof BlockReferenceNode) {
- throw new SyntaxError('A block definition cannot be nested under non-capturing nodes.', $node->getTemplateLine(), $this->stream->getSourceContext());
- }
-
- if ($node instanceof NodeOutputInterface) {
- return null;
- }
-
- // here, $nested means "being at the root level of a child template"
- // we need to discard the wrapping "Node" for the "body" node
- $nested = $nested || Node::class !== \get_class($node);
- foreach ($node as $k => $n) {
- if (null !== $n && null === $this->filterBodyNodes($n, $nested)) {
- $node->removeNode($k);
- }
- }
-
- return $node;
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php b/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
deleted file mode 100644
index 4da43e47..00000000
--- a/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
+++ /dev/null
@@ -1,63 +0,0 @@
-
- */
-abstract class BaseDumper
-{
- private $root;
-
- public function dump(Profile $profile): string
- {
- return $this->dumpProfile($profile);
- }
-
- abstract protected function formatTemplate(Profile $profile, $prefix): string;
-
- abstract protected function formatNonTemplate(Profile $profile, $prefix): string;
-
- abstract protected function formatTime(Profile $profile, $percent): string;
-
- private function dumpProfile(Profile $profile, $prefix = '', $sibling = false): string
- {
- if ($profile->isRoot()) {
- $this->root = $profile->getDuration();
- $start = $profile->getName();
- } else {
- if ($profile->isTemplate()) {
- $start = $this->formatTemplate($profile, $prefix);
- } else {
- $start = $this->formatNonTemplate($profile, $prefix);
- }
- $prefix .= $sibling ? '│ ' : ' ';
- }
-
- $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
-
- if ($profile->getDuration() * 1000 < 1) {
- $str = $start."\n";
- } else {
- $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
- }
-
- $nCount = \count($profile->getProfiles());
- foreach ($profile as $i => $p) {
- $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
- }
-
- return $str;
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php b/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
deleted file mode 100644
index 03abe0fa..00000000
--- a/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
+++ /dev/null
@@ -1,72 +0,0 @@
-
- */
-final class BlackfireDumper
-{
- public function dump(Profile $profile): string
- {
- $data = [];
- $this->dumpProfile('main()', $profile, $data);
- $this->dumpChildren('main()', $profile, $data);
-
- $start = sprintf('%f', microtime(true));
- $str = << $values) {
- $str .= "$name//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n";
- }
-
- return $str;
- }
-
- private function dumpChildren(string $parent, Profile $profile, &$data)
- {
- foreach ($profile as $p) {
- if ($p->isTemplate()) {
- $name = $p->getTemplate();
- } else {
- $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName());
- }
- $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data);
- $this->dumpChildren($name, $p, $data);
- }
- }
-
- private function dumpProfile(string $edge, Profile $profile, &$data)
- {
- if (isset($data[$edge])) {
- ++$data[$edge]['ct'];
- $data[$edge]['wt'] += floor($profile->getDuration() * 1000000);
- $data[$edge]['mu'] += $profile->getMemoryUsage();
- $data[$edge]['pmu'] += $profile->getPeakMemoryUsage();
- } else {
- $data[$edge] = [
- 'ct' => 1,
- 'wt' => floor($profile->getDuration() * 1000000),
- 'mu' => $profile->getMemoryUsage(),
- 'pmu' => $profile->getPeakMemoryUsage(),
- ];
- }
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php b/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
deleted file mode 100644
index 3c0daf1c..00000000
--- a/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
+++ /dev/null
@@ -1,47 +0,0 @@
-
- */
-final class HtmlDumper extends BaseDumper
-{
- private static $colors = [
- 'block' => '#dfd',
- 'macro' => '#ddf',
- 'template' => '#ffd',
- 'big' => '#d44',
- ];
-
- public function dump(Profile $profile): string
- {
- return ''.parent::dump($profile).'
';
- }
-
- protected function formatTemplate(Profile $profile, $prefix): string
- {
- return sprintf('%sâ”” %s', $prefix, self::$colors['template'], $profile->getTemplate());
- }
-
- protected function formatNonTemplate(Profile $profile, $prefix): string
- {
- return sprintf('%sâ”” %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), self::$colors[$profile->getType()] ?? 'auto', $profile->getName());
- }
-
- protected function formatTime(Profile $profile, $percent): string
- {
- return sprintf('%.2fms/%.0f%%', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent);
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php b/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
deleted file mode 100644
index 31561c46..00000000
--- a/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- */
-final class TextDumper extends BaseDumper
-{
- protected function formatTemplate(Profile $profile, $prefix): string
- {
- return sprintf('%sâ”” %s', $prefix, $profile->getTemplate());
- }
-
- protected function formatNonTemplate(Profile $profile, $prefix): string
- {
- return sprintf('%sâ”” %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName());
- }
-
- protected function formatTime(Profile $profile, $percent): string
- {
- return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent);
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php b/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
deleted file mode 100644
index 7b71f8b3..00000000
--- a/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- */
-#[YieldReady]
-class EnterProfileNode extends Node
-{
- public function __construct(string $extensionName, string $type, string $name, string $varName)
- {
- parent::__construct([], ['extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName]);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->write(sprintf('$%s = $this->extensions[', $this->getAttribute('var_name')))
- ->repr($this->getAttribute('extension_name'))
- ->raw("];\n")
- ->write(sprintf('$%s->enter($%s = new \Twig\Profiler\Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
- ->repr($this->getAttribute('type'))
- ->raw(', ')
- ->repr($this->getAttribute('name'))
- ->raw("));\n\n")
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php b/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
deleted file mode 100644
index 7e9ef9b6..00000000
--- a/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
- */
-#[YieldReady]
-class LeaveProfileNode extends Node
-{
- public function __construct(string $varName)
- {
- parent::__construct([], ['var_name' => $varName]);
- }
-
- public function compile(Compiler $compiler): void
- {
- $compiler
- ->write("\n")
- ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
- ;
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php b/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
deleted file mode 100644
index 91abee80..00000000
--- a/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
+++ /dev/null
@@ -1,70 +0,0 @@
-
- */
-final class ProfilerNodeVisitor implements NodeVisitorInterface
-{
- private $extensionName;
- private $varName;
-
- public function __construct(string $extensionName)
- {
- $this->extensionName = $extensionName;
- $this->varName = sprintf('__internal_%s', hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', $extensionName));
- }
-
- public function enterNode(Node $node, Environment $env): Node
- {
- return $node;
- }
-
- public function leaveNode(Node $node, Environment $env): ?Node
- {
- if ($node instanceof ModuleNode) {
- $node->setNode('display_start', new Node([new EnterProfileNode($this->extensionName, Profile::TEMPLATE, $node->getTemplateName(), $this->varName), $node->getNode('display_start')]));
- $node->setNode('display_end', new Node([new LeaveProfileNode($this->varName), $node->getNode('display_end')]));
- } elseif ($node instanceof BlockNode) {
- $node->setNode('body', new BodyNode([
- new EnterProfileNode($this->extensionName, Profile::BLOCK, $node->getAttribute('name'), $this->varName),
- $node->getNode('body'),
- new LeaveProfileNode($this->varName),
- ]));
- } elseif ($node instanceof MacroNode) {
- $node->setNode('body', new BodyNode([
- new EnterProfileNode($this->extensionName, Profile::MACRO, $node->getAttribute('name'), $this->varName),
- $node->getNode('body'),
- new LeaveProfileNode($this->varName),
- ]));
- }
-
- return $node;
- }
-
- public function getPriority(): int
- {
- return 0;
- }
-}
diff --git a/vendor/twig/twig/src/Profiler/Profile.php b/vendor/twig/twig/src/Profiler/Profile.php
deleted file mode 100644
index 72506b7c..00000000
--- a/vendor/twig/twig/src/Profiler/Profile.php
+++ /dev/null
@@ -1,181 +0,0 @@
-
- */
-final class Profile implements \IteratorAggregate, \Serializable
-{
- public const ROOT = 'ROOT';
- public const BLOCK = 'block';
- public const TEMPLATE = 'template';
- public const MACRO = 'macro';
-
- private $template;
- private $name;
- private $type;
- private $starts = [];
- private $ends = [];
- private $profiles = [];
-
- public function __construct(string $template = 'main', string $type = self::ROOT, string $name = 'main')
- {
- $this->template = $template;
- $this->type = $type;
- $this->name = str_starts_with($name, '__internal_') ? 'INTERNAL' : $name;
- $this->enter();
- }
-
- public function getTemplate(): string
- {
- return $this->template;
- }
-
- public function getType(): string
- {
- return $this->type;
- }
-
- public function getName(): string
- {
- return $this->name;
- }
-
- public function isRoot(): bool
- {
- return self::ROOT === $this->type;
- }
-
- public function isTemplate(): bool
- {
- return self::TEMPLATE === $this->type;
- }
-
- public function isBlock(): bool
- {
- return self::BLOCK === $this->type;
- }
-
- public function isMacro(): bool
- {
- return self::MACRO === $this->type;
- }
-
- /**
- * @return Profile[]
- */
- public function getProfiles(): array
- {
- return $this->profiles;
- }
-
- public function addProfile(self $profile): void
- {
- $this->profiles[] = $profile;
- }
-
- /**
- * Returns the duration in microseconds.
- */
- public function getDuration(): float
- {
- if ($this->isRoot() && $this->profiles) {
- // for the root node with children, duration is the sum of all child durations
- $duration = 0;
- foreach ($this->profiles as $profile) {
- $duration += $profile->getDuration();
- }
-
- return $duration;
- }
-
- return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0;
- }
-
- /**
- * Returns the memory usage in bytes.
- */
- public function getMemoryUsage(): int
- {
- return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0;
- }
-
- /**
- * Returns the peak memory usage in bytes.
- */
- public function getPeakMemoryUsage(): int
- {
- return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0;
- }
-
- /**
- * Starts the profiling.
- */
- public function enter(): void
- {
- $this->starts = [
- 'wt' => microtime(true),
- 'mu' => memory_get_usage(),
- 'pmu' => memory_get_peak_usage(),
- ];
- }
-
- /**
- * Stops the profiling.
- */
- public function leave(): void
- {
- $this->ends = [
- 'wt' => microtime(true),
- 'mu' => memory_get_usage(),
- 'pmu' => memory_get_peak_usage(),
- ];
- }
-
- public function reset(): void
- {
- $this->starts = $this->ends = $this->profiles = [];
- $this->enter();
- }
-
- public function getIterator(): \Traversable
- {
- return new \ArrayIterator($this->profiles);
- }
-
- public function serialize(): string
- {
- return serialize($this->__serialize());
- }
-
- public function unserialize($data): void
- {
- $this->__unserialize(unserialize($data));
- }
-
- /**
- * @internal
- */
- public function __serialize(): array
- {
- return [$this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles];
- }
-
- /**
- * @internal
- */
- public function __unserialize(array $data): void
- {
- [$this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles] = $data;
- }
-}
diff --git a/vendor/twig/twig/src/Resources/core.php b/vendor/twig/twig/src/Resources/core.php
deleted file mode 100644
index e5372cda..00000000
--- a/vendor/twig/twig/src/Resources/core.php
+++ /dev/null
@@ -1,541 +0,0 @@
-getCharset(), $values, $max);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_date_format_filter(Environment $env, $date, $format = null, $timezone = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return $env->getExtension(CoreExtension::class)->formatDate($date, $format, $timezone);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_date_modify_filter(Environment $env, $date, $modifier)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return $env->getExtension(CoreExtension::class)->modifyDate($date, $modifier);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_sprintf($format, ...$values)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::sprintf($format, ...$values);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_date_converter(Environment $env, $date = null, $timezone = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return $env->getExtension(CoreExtension::class)->convertDate($date, $timezone);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_replace_filter($str, $from)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::replace($str, $from);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_round($value, $precision = 0, $method = 'common')
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::round($value, $precision, $method);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_number_format_filter(Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return $env->getExtension(CoreExtension::class)->formatNumber($number, $decimal, $decimalPoint, $thousandSep);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_urlencode_filter($url)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::urlencode($url);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_merge(...$arrays)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::merge(...$arrays);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_slice(Environment $env, $item, $start, $length = null, $preserveKeys = false)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::slice($env->getCharset(), $item, $start, $length, $preserveKeys);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_first(Environment $env, $item)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::first($env->getCharset(), $item);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_last(Environment $env, $item)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::last($env->getCharset(), $item);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_join_filter($value, $glue = '', $and = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::join($value, $glue, $and);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_split_filter(Environment $env, $value, $delimiter, $limit = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::split($env->getCharset(), $value, $delimiter, $limit);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_get_array_keys_filter($array)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::keys($array);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_reverse_filter(Environment $env, $item, $preserveKeys = false)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::reverse($env->getCharset(), $item, $preserveKeys);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_sort_filter(Environment $env, $array, $arrow = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::sort($env, $array, $arrow);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_matches(string $regexp, ?string $str)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::matches($regexp, $str);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_trim_filter($string, $characterMask = null, $side = 'both')
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::trim($string, $characterMask, $side);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_nl2br($string)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::nl2br($string);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_spaceless($content)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::spaceless($content);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_convert_encoding($string, $to, $from)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::convertEncoding($string, $to, $from);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_length_filter(Environment $env, $thing)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::length($env->getCharset(), $thing);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_upper_filter(Environment $env, $string)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::upper($env->getCharset(), $string);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_lower_filter(Environment $env, $string)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::lower($env->getCharset(), $string);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_striptags($string, $allowable_tags = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::striptags($string, $allowable_tags);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_title_string_filter(Environment $env, $string)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::titleCase($env->getCharset(), $string);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_capitalize_string_filter(Environment $env, $string)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::capitalize($env->getCharset(), $string);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_test_empty($value)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::testEmpty($value);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_test_iterable($value)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return is_iterable($value);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_include(Environment $env, $context, $template, $variables = [], $withContext = true, $ignoreMissing = false, $sandboxed = false)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::include($env, $context, $template, $variables, $withContext, $ignoreMissing, $sandboxed);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_source(Environment $env, $name, $ignoreMissing = false)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::source($env, $name, $ignoreMissing);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_constant($constant, $object = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::constant($constant, $object);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_constant_is_defined($constant, $object = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::constantIsDefined($constant, $object);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::batch($items, $size, $fill, $preserveKeys);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_column($array, $name, $index = null): array
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::column($array, $name, $index);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_filter(Environment $env, $array, $arrow)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::filter($env, $array, $arrow);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_map(Environment $env, $array, $arrow)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::map($env, $array, $arrow);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_reduce(Environment $env, $array, $arrow, $initial = null)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::reduce($env, $array, $arrow, $initial);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_some(Environment $env, $array, $arrow)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::arraySome($env, $array, $arrow);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_array_every(Environment $env, $array, $arrow)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::arrayEvery($env, $array, $arrow);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_check_arrow_in_sandbox(Environment $env, $arrow, $thing, $type)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return CoreExtension::checkArrowInSandbox($env, $arrow, $thing, $type);
-}
diff --git a/vendor/twig/twig/src/Resources/debug.php b/vendor/twig/twig/src/Resources/debug.php
deleted file mode 100644
index 104b4f4e..00000000
--- a/vendor/twig/twig/src/Resources/debug.php
+++ /dev/null
@@ -1,25 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-use Twig\Environment;
-use Twig\Extension\DebugExtension;
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_var_dump(Environment $env, $context, ...$vars)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- DebugExtension::dump($env, $context, ...$vars);
-}
diff --git a/vendor/twig/twig/src/Resources/escaper.php b/vendor/twig/twig/src/Resources/escaper.php
deleted file mode 100644
index a2ee8e7a..00000000
--- a/vendor/twig/twig/src/Resources/escaper.php
+++ /dev/null
@@ -1,51 +0,0 @@
-getRuntime(EscaperRuntime::class)->escape($string, $strategy, $charset, $autoescape);
-}
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_escape_filter_is_safe(Node $filterArgs)
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return EscaperExtension::escapeFilterIsSafe($filterArgs);
-}
diff --git a/vendor/twig/twig/src/Resources/string_loader.php b/vendor/twig/twig/src/Resources/string_loader.php
deleted file mode 100644
index 8f0e6492..00000000
--- a/vendor/twig/twig/src/Resources/string_loader.php
+++ /dev/null
@@ -1,26 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-use Twig\Environment;
-use Twig\Extension\StringLoaderExtension;
-use Twig\TemplateWrapper;
-
-/**
- * @internal
- *
- * @deprecated since Twig 3.9
- */
-function twig_template_from_string(Environment $env, $template, ?string $name = null): TemplateWrapper
-{
- trigger_deprecation('twig/twig', '3.9', 'Using the internal "%s" function is deprecated.', __FUNCTION__);
-
- return StringLoaderExtension::templateFromString($env, $template, $name);
-}
diff --git a/vendor/twig/twig/src/Runtime/EscaperRuntime.php b/vendor/twig/twig/src/Runtime/EscaperRuntime.php
deleted file mode 100644
index eb5dfd06..00000000
--- a/vendor/twig/twig/src/Runtime/EscaperRuntime.php
+++ /dev/null
@@ -1,328 +0,0 @@
-charset = $charset;
- }
-
- /**
- * Defines a new escaper to be used via the escape filter.
- *
- * @param string $strategy The strategy name that should be used as a strategy in the escape call
- * @param callable(string $string, string $charset) $callable A valid PHP callable
- */
- public function setEscaper($strategy, callable $callable)
- {
- $this->escapers[$strategy] = $callable;
- }
-
- /**
- * Gets all defined escapers.
- *
- * @return array An array of escapers
- */
- public function getEscapers()
- {
- return $this->escapers;
- }
-
- public function setSafeClasses(array $safeClasses = [])
- {
- $this->safeClasses = [];
- $this->safeLookup = [];
- foreach ($safeClasses as $class => $strategies) {
- $this->addSafeClass($class, $strategies);
- }
- }
-
- public function addSafeClass(string $class, array $strategies)
- {
- $class = ltrim($class, '\\');
- if (!isset($this->safeClasses[$class])) {
- $this->safeClasses[$class] = [];
- }
- $this->safeClasses[$class] = array_merge($this->safeClasses[$class], $strategies);
-
- foreach ($strategies as $strategy) {
- $this->safeLookup[$strategy][$class] = true;
- }
- }
-
- /**
- * Escapes a string.
- *
- * @param mixed $string The value to be escaped
- * @param string $strategy The escaping strategy
- * @param string|null $charset The charset
- * @param bool $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false)
- *
- * @throws RuntimeError
- */
- public function escape($string, string $strategy = 'html', ?string $charset = null, bool $autoescape = false)
- {
- if ($autoescape && $string instanceof Markup) {
- return $string;
- }
-
- if (!\is_string($string)) {
- if (\is_object($string) && method_exists($string, '__toString')) {
- if ($autoescape) {
- $c = \get_class($string);
- if (!isset($this->safeClasses[$c])) {
- $this->safeClasses[$c] = [];
- foreach (class_parents($string) + class_implements($string) as $class) {
- if (isset($this->safeClasses[$class])) {
- $this->safeClasses[$c] = array_unique(array_merge($this->safeClasses[$c], $this->safeClasses[$class]));
- foreach ($this->safeClasses[$class] as $s) {
- $this->safeLookup[$s][$c] = true;
- }
- }
- }
- }
- if (isset($this->safeLookup[$strategy][$c]) || isset($this->safeLookup['all'][$c])) {
- return (string) $string;
- }
- }
-
- $string = (string) $string;
- } elseif (\in_array($strategy, ['html', 'js', 'css', 'html_attr', 'url'])) {
- // we return the input as is (which can be of any type)
- return $string;
- }
- }
-
- if ('' === $string) {
- return '';
- }
-
- $charset = $charset ?: $this->charset;
-
- switch ($strategy) {
- case 'html':
- // see https://www.php.net/htmlspecialchars
-
- // Using a static variable to avoid initializing the array
- // each time the function is called. Moving the declaration on the
- // top of the function slow downs other escaping strategies.
- static $htmlspecialcharsCharsets = [
- 'ISO-8859-1' => true, 'ISO8859-1' => true,
- 'ISO-8859-15' => true, 'ISO8859-15' => true,
- 'utf-8' => true, 'UTF-8' => true,
- 'CP866' => true, 'IBM866' => true, '866' => true,
- 'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true,
- '1251' => true,
- 'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true,
- 'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true,
- 'BIG5' => true, '950' => true,
- 'GB2312' => true, '936' => true,
- 'BIG5-HKSCS' => true,
- 'SHIFT_JIS' => true, 'SJIS' => true, '932' => true,
- 'EUC-JP' => true, 'EUCJP' => true,
- 'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true,
- ];
-
- if (isset($htmlspecialcharsCharsets[$charset])) {
- return htmlspecialchars($string, \ENT_QUOTES | \ENT_SUBSTITUTE, $charset);
- }
-
- if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) {
- // cache the lowercase variant for future iterations
- $htmlspecialcharsCharsets[$charset] = true;
-
- return htmlspecialchars($string, \ENT_QUOTES | \ENT_SUBSTITUTE, $charset);
- }
-
- $string = $this->convertEncoding($string, 'UTF-8', $charset);
- $string = htmlspecialchars($string, \ENT_QUOTES | \ENT_SUBSTITUTE, 'UTF-8');
-
- return iconv('UTF-8', $charset, $string);
-
- case 'js':
- // escape all non-alphanumeric characters
- // into their \x or \uHHHH representations
- if ('UTF-8' !== $charset) {
- $string = $this->convertEncoding($string, 'UTF-8', $charset);
- }
-
- if (!preg_match('//u', $string)) {
- throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', function ($matches) {
- $char = $matches[0];
-
- /*
- * A few characters have short escape sequences in JSON and JavaScript.
- * Escape sequences supported only by JavaScript, not JSON, are omitted.
- * \" is also supported but omitted, because the resulting string is not HTML safe.
- */
- static $shortMap = [
- '\\' => '\\\\',
- '/' => '\\/',
- "\x08" => '\b',
- "\x0C" => '\f',
- "\x0A" => '\n',
- "\x0D" => '\r',
- "\x09" => '\t',
- ];
-
- if (isset($shortMap[$char])) {
- return $shortMap[$char];
- }
-
- $codepoint = mb_ord($char, 'UTF-8');
- if (0x10000 > $codepoint) {
- return sprintf('\u%04X', $codepoint);
- }
-
- // Split characters outside the BMP into surrogate pairs
- // https://tools.ietf.org/html/rfc2781.html#section-2.1
- $u = $codepoint - 0x10000;
- $high = 0xD800 | ($u >> 10);
- $low = 0xDC00 | ($u & 0x3FF);
-
- return sprintf('\u%04X\u%04X', $high, $low);
- }, $string);
-
- if ('UTF-8' !== $charset) {
- $string = iconv('UTF-8', $charset, $string);
- }
-
- return $string;
-
- case 'css':
- if ('UTF-8' !== $charset) {
- $string = $this->convertEncoding($string, 'UTF-8', $charset);
- }
-
- if (!preg_match('//u', $string)) {
- throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', function ($matches) {
- $char = $matches[0];
-
- return sprintf('\\%X ', 1 === \strlen($char) ? \ord($char) : mb_ord($char, 'UTF-8'));
- }, $string);
-
- if ('UTF-8' !== $charset) {
- $string = iconv('UTF-8', $charset, $string);
- }
-
- return $string;
-
- case 'html_attr':
- if ('UTF-8' !== $charset) {
- $string = $this->convertEncoding($string, 'UTF-8', $charset);
- }
-
- if (!preg_match('//u', $string)) {
- throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', function ($matches) {
- /**
- * This function is adapted from code coming from Zend Framework.
- *
- * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (https://www.zend.com)
- * @license https://framework.zend.com/license/new-bsd New BSD License
- */
- $chr = $matches[0];
- $ord = \ord($chr);
-
- /*
- * The following replaces characters undefined in HTML with the
- * hex entity for the Unicode replacement character.
- */
- if (($ord <= 0x1F && "\t" != $chr && "\n" != $chr && "\r" != $chr) || ($ord >= 0x7F && $ord <= 0x9F)) {
- return '�';
- }
-
- /*
- * Check if the current character to escape has a name entity we should
- * replace it with while grabbing the hex value of the character.
- */
- if (1 === \strlen($chr)) {
- /*
- * While HTML supports far more named entities, the lowest common denominator
- * has become HTML5's XML Serialisation which is restricted to the those named
- * entities that XML supports. Using HTML entities would result in this error:
- * XML Parsing Error: undefined entity
- */
- static $entityMap = [
- 34 => '"', /* quotation mark */
- 38 => '&', /* ampersand */
- 60 => '<', /* less-than sign */
- 62 => '>', /* greater-than sign */
- ];
-
- if (isset($entityMap[$ord])) {
- return $entityMap[$ord];
- }
-
- return sprintf('%02X;', $ord);
- }
-
- /*
- * Per OWASP recommendations, we'll use hex entities for any other
- * characters where a named entity does not exist.
- */
- return sprintf('%04X;', mb_ord($chr, 'UTF-8'));
- }, $string);
-
- if ('UTF-8' !== $charset) {
- $string = iconv('UTF-8', $charset, $string);
- }
-
- return $string;
-
- case 'url':
- return rawurlencode($string);
-
- default:
- if (\array_key_exists($strategy, $this->escapers)) {
- return $this->escapers[$strategy]($string, $charset);
- }
-
- $validStrategies = implode('", "', array_merge(['html', 'js', 'url', 'css', 'html_attr'], array_keys($this->escapers)));
-
- throw new RuntimeError(sprintf('Invalid escaping strategy "%s" (valid ones: "%s").', $strategy, $validStrategies));
- }
- }
-
- private function convertEncoding(string $string, string $to, string $from)
- {
- if (!\function_exists('iconv')) {
- throw new RuntimeError('Unable to convert encoding: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.');
- }
-
- return iconv($from, $to, $string);
- }
-}
diff --git a/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php b/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
deleted file mode 100644
index b360d7be..00000000
--- a/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
- * @author Robin Chalas
- */
-class ContainerRuntimeLoader implements RuntimeLoaderInterface
-{
- private $container;
-
- public function __construct(ContainerInterface $container)
- {
- $this->container = $container;
- }
-
- public function load(string $class)
- {
- return $this->container->has($class) ? $this->container->get($class) : null;
- }
-}
diff --git a/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php b/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
deleted file mode 100644
index 13064839..00000000
--- a/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
+++ /dev/null
@@ -1,41 +0,0 @@
-
- */
-class FactoryRuntimeLoader implements RuntimeLoaderInterface
-{
- private $map;
-
- /**
- * @param array $map An array where keys are class names and values factory callables
- */
- public function __construct(array $map = [])
- {
- $this->map = $map;
- }
-
- public function load(string $class)
- {
- if (!isset($this->map[$class])) {
- return null;
- }
-
- $runtimeFactory = $this->map[$class];
-
- return $runtimeFactory();
- }
-}
diff --git a/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php b/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
deleted file mode 100644
index 9e5b2048..00000000
--- a/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
- */
-interface RuntimeLoaderInterface
-{
- /**
- * Creates the runtime implementation of a Twig element (filter/function/test).
- *
- * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class
- */
- public function load(string $class);
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityError.php b/vendor/twig/twig/src/Sandbox/SecurityError.php
deleted file mode 100644
index 30a404f2..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityError.php
+++ /dev/null
@@ -1,23 +0,0 @@
-
- */
-class SecurityError extends Error
-{
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
deleted file mode 100644
index 02d30636..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-final class SecurityNotAllowedFilterError extends SecurityError
-{
- private $filterName;
-
- public function __construct(string $message, string $functionName)
- {
- parent::__construct($message);
- $this->filterName = $functionName;
- }
-
- public function getFilterName(): string
- {
- return $this->filterName;
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
deleted file mode 100644
index 4f76dc6e..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-final class SecurityNotAllowedFunctionError extends SecurityError
-{
- private $functionName;
-
- public function __construct(string $message, string $functionName)
- {
- parent::__construct($message);
- $this->functionName = $functionName;
- }
-
- public function getFunctionName(): string
- {
- return $this->functionName;
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
deleted file mode 100644
index 8df9d0ba..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-final class SecurityNotAllowedMethodError extends SecurityError
-{
- private $className;
- private $methodName;
-
- public function __construct(string $message, string $className, string $methodName)
- {
- parent::__construct($message);
- $this->className = $className;
- $this->methodName = $methodName;
- }
-
- public function getClassName(): string
- {
- return $this->className;
- }
-
- public function getMethodName()
- {
- return $this->methodName;
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
deleted file mode 100644
index 42ec4f38..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-final class SecurityNotAllowedPropertyError extends SecurityError
-{
- private $className;
- private $propertyName;
-
- public function __construct(string $message, string $className, string $propertyName)
- {
- parent::__construct($message);
- $this->className = $className;
- $this->propertyName = $propertyName;
- }
-
- public function getClassName(): string
- {
- return $this->className;
- }
-
- public function getPropertyName()
- {
- return $this->propertyName;
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
deleted file mode 100644
index 4522150e..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-final class SecurityNotAllowedTagError extends SecurityError
-{
- private $tagName;
-
- public function __construct(string $message, string $tagName)
- {
- parent::__construct($message);
- $this->tagName = $tagName;
- }
-
- public function getTagName(): string
- {
- return $this->tagName;
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php b/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
deleted file mode 100644
index a725aa4f..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
+++ /dev/null
@@ -1,124 +0,0 @@
-
- */
-final class SecurityPolicy implements SecurityPolicyInterface
-{
- private $allowedTags;
- private $allowedFilters;
- private $allowedMethods;
- private $allowedProperties;
- private $allowedFunctions;
-
- public function __construct(array $allowedTags = [], array $allowedFilters = [], array $allowedMethods = [], array $allowedProperties = [], array $allowedFunctions = [])
- {
- $this->allowedTags = $allowedTags;
- $this->allowedFilters = $allowedFilters;
- $this->setAllowedMethods($allowedMethods);
- $this->allowedProperties = $allowedProperties;
- $this->allowedFunctions = $allowedFunctions;
- }
-
- public function setAllowedTags(array $tags): void
- {
- $this->allowedTags = $tags;
- }
-
- public function setAllowedFilters(array $filters): void
- {
- $this->allowedFilters = $filters;
- }
-
- public function setAllowedMethods(array $methods): void
- {
- $this->allowedMethods = [];
- foreach ($methods as $class => $m) {
- $this->allowedMethods[$class] = array_map(function ($value) { return strtr($value, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); }, \is_array($m) ? $m : [$m]);
- }
- }
-
- public function setAllowedProperties(array $properties): void
- {
- $this->allowedProperties = $properties;
- }
-
- public function setAllowedFunctions(array $functions): void
- {
- $this->allowedFunctions = $functions;
- }
-
- public function checkSecurity($tags, $filters, $functions): void
- {
- foreach ($tags as $tag) {
- if (!\in_array($tag, $this->allowedTags)) {
- throw new SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag);
- }
- }
-
- foreach ($filters as $filter) {
- if (!\in_array($filter, $this->allowedFilters)) {
- throw new SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter);
- }
- }
-
- foreach ($functions as $function) {
- if (!\in_array($function, $this->allowedFunctions)) {
- throw new SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function);
- }
- }
- }
-
- public function checkMethodAllowed($obj, $method): void
- {
- if ($obj instanceof Template || $obj instanceof Markup) {
- return;
- }
-
- $allowed = false;
- $method = strtr($method, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz');
- foreach ($this->allowedMethods as $class => $methods) {
- if ($obj instanceof $class && \in_array($method, $methods)) {
- $allowed = true;
- break;
- }
- }
-
- if (!$allowed) {
- $class = \get_class($obj);
- throw new SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method);
- }
- }
-
- public function checkPropertyAllowed($obj, $property): void
- {
- $allowed = false;
- foreach ($this->allowedProperties as $class => $properties) {
- if ($obj instanceof $class && \in_array($property, \is_array($properties) ? $properties : [$properties])) {
- $allowed = true;
- break;
- }
- }
-
- if (!$allowed) {
- $class = \get_class($obj);
- throw new SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property);
- }
- }
-}
diff --git a/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php b/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
deleted file mode 100644
index 36471c54..00000000
--- a/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
+++ /dev/null
@@ -1,45 +0,0 @@
-
- */
-interface SecurityPolicyInterface
-{
- /**
- * @param string[] $tags
- * @param string[] $filters
- * @param string[] $functions
- *
- * @throws SecurityError
- */
- public function checkSecurity($tags, $filters, $functions): void;
-
- /**
- * @param object $obj
- * @param string $method
- *
- * @throws SecurityNotAllowedMethodError
- */
- public function checkMethodAllowed($obj, $method): void;
-
- /**
- * @param object $obj
- * @param string $property
- *
- * @throws SecurityNotAllowedPropertyError
- */
- public function checkPropertyAllowed($obj, $property): void;
-}
diff --git a/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php b/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php
deleted file mode 100644
index b952f1ea..00000000
--- a/vendor/twig/twig/src/Sandbox/SourcePolicyInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
-final class Source
-{
- private $code;
- private $name;
- private $path;
-
- /**
- * @param string $code The template source code
- * @param string $name The template logical name
- * @param string $path The filesystem path of the template if any
- */
- public function __construct(string $code, string $name, string $path = '')
- {
- $this->code = $code;
- $this->name = $name;
- $this->path = $path;
- }
-
- public function getCode(): string
- {
- return $this->code;
- }
-
- public function getName(): string
- {
- return $this->name;
- }
-
- public function getPath(): string
- {
- return $this->path;
- }
-}
diff --git a/vendor/twig/twig/src/Template.php b/vendor/twig/twig/src/Template.php
deleted file mode 100644
index e0883773..00000000
--- a/vendor/twig/twig/src/Template.php
+++ /dev/null
@@ -1,505 +0,0 @@
-load()
- * instead, which returns an instance of \Twig\TemplateWrapper.
- *
- * @author Fabien Potencier
- *
- * @internal
- */
-abstract class Template
-{
- public const ANY_CALL = 'any';
- public const ARRAY_CALL = 'array';
- public const METHOD_CALL = 'method';
-
- protected $parent;
- protected $parents = [];
- protected $env;
- protected $blocks = [];
- protected $traits = [];
- protected $extensions = [];
- protected $sandbox;
-
- private $useYield;
-
- public function __construct(Environment $env)
- {
- $this->env = $env;
- $this->useYield = $env->useYield();
- $this->extensions = $env->getExtensions();
- }
-
- /**
- * Returns the template name.
- *
- * @return string The template name
- */
- abstract public function getTemplateName();
-
- /**
- * Returns debug information about the template.
- *
- * @return array Debug information
- */
- abstract public function getDebugInfo();
-
- /**
- * Returns information about the original template source code.
- *
- * @return Source
- */
- abstract public function getSourceContext();
-
- /**
- * Returns the parent template.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @return self|TemplateWrapper|false The parent template or false if there is no parent
- */
- public function getParent(array $context)
- {
- if (null !== $this->parent) {
- return $this->parent;
- }
-
- try {
- if (!$parent = $this->doGetParent($context)) {
- return false;
- }
-
- if ($parent instanceof self || $parent instanceof TemplateWrapper) {
- return $this->parents[$parent->getSourceContext()->getName()] = $parent;
- }
-
- if (!isset($this->parents[$parent])) {
- $this->parents[$parent] = $this->loadTemplate($parent);
- }
- } catch (LoaderError $e) {
- $e->setSourceContext(null);
- $e->guess();
-
- throw $e;
- }
-
- return $this->parents[$parent];
- }
-
- protected function doGetParent(array $context)
- {
- return false;
- }
-
- public function isTraitable()
- {
- return true;
- }
-
- /**
- * Displays a parent block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to display from the parent
- * @param array $context The context
- * @param array $blocks The current set of blocks
- */
- public function displayParentBlock($name, array $context, array $blocks = [])
- {
- foreach ($this->yieldParentBlock($name, $context, $blocks) as $data) {
- echo $data;
- }
- }
-
- /**
- * Displays a block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to display
- * @param array $context The context
- * @param array $blocks The current set of blocks
- * @param bool $useBlocks Whether to use the current set of blocks
- */
- public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null)
- {
- foreach ($this->yieldBlock($name, $context, $blocks, $useBlocks, $templateContext) as $data) {
- echo $data;
- }
- }
-
- /**
- * Renders a parent block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to render from the parent
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return string The rendered block
- */
- public function renderParentBlock($name, array $context, array $blocks = [])
- {
- $content = '';
- foreach ($this->yieldParentBlock($name, $context, $blocks) as $data) {
- $content .= $data;
- }
-
- return $content;
- }
-
- /**
- * Renders a block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to render
- * @param array $context The context
- * @param array $blocks The current set of blocks
- * @param bool $useBlocks Whether to use the current set of blocks
- *
- * @return string The rendered block
- */
- public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true)
- {
- $content = '';
- foreach ($this->yieldBlock($name, $context, $blocks, $useBlocks) as $data) {
- $content .= $data;
- }
-
- return $content;
- }
-
- /**
- * Returns whether a block exists or not in the current context of the template.
- *
- * This method checks blocks defined in the current template
- * or defined in "used" traits or defined in parent templates.
- *
- * @param string $name The block name
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return bool true if the block exists, false otherwise
- */
- public function hasBlock($name, array $context, array $blocks = [])
- {
- if (isset($blocks[$name])) {
- return $blocks[$name][0] instanceof self;
- }
-
- if (isset($this->blocks[$name])) {
- return true;
- }
-
- if ($parent = $this->getParent($context)) {
- return $parent->hasBlock($name, $context);
- }
-
- return false;
- }
-
- /**
- * Returns all block names in the current context of the template.
- *
- * This method checks blocks defined in the current template
- * or defined in "used" traits or defined in parent templates.
- *
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return array An array of block names
- */
- public function getBlockNames(array $context, array $blocks = [])
- {
- $names = array_merge(array_keys($blocks), array_keys($this->blocks));
-
- if ($parent = $this->getParent($context)) {
- $names = array_merge($names, $parent->getBlockNames($context));
- }
-
- return array_unique($names);
- }
-
- /**
- * @param string|TemplateWrapper|array $template
- *
- * @return self|TemplateWrapper
- */
- protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
- {
- try {
- if (\is_array($template)) {
- return $this->env->resolveTemplate($template);
- }
-
- if ($template instanceof TemplateWrapper) {
- return $template;
- }
-
- if ($template instanceof self) {
- trigger_deprecation('twig/twig', '3.9', 'Passing a "%s" instance to "%s" is deprecated.', self::class, __METHOD__);
-
- return $template;
- }
-
- if ($template === $this->getTemplateName()) {
- $class = static::class;
- if (false !== $pos = strrpos($class, '___', -1)) {
- $class = substr($class, 0, $pos);
- }
- } else {
- $class = $this->env->getTemplateClass($template);
- }
-
- return $this->env->loadTemplate($class, $template, $index);
- } catch (Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($templateName ? new Source('', $templateName) : $this->getSourceContext());
- }
-
- if ($e->getTemplateLine() > 0) {
- throw $e;
- }
-
- if (!$line) {
- $e->guess();
- } else {
- $e->setTemplateLine($line);
- }
-
- throw $e;
- }
- }
-
- /**
- * @internal
- *
- * @return self
- */
- public function unwrap()
- {
- return $this;
- }
-
- /**
- * Returns all blocks.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @return array An array of blocks
- */
- public function getBlocks()
- {
- return $this->blocks;
- }
-
- public function display(array $context, array $blocks = []): void
- {
- foreach ($this->yield($context, $blocks) as $data) {
- echo $data;
- }
- }
-
- public function render(array $context): string
- {
- $content = '';
- foreach ($this->yield($context) as $data) {
- $content .= $data;
- }
-
- return $content;
- }
-
- /**
- * @return iterable
- */
- public function yield(array $context, array $blocks = []): iterable
- {
- $context = $this->env->mergeGlobals($context);
- $blocks = array_merge($this->blocks, $blocks);
-
- try {
- if ($this->useYield) {
- yield from $this->doDisplay($context, $blocks);
-
- return;
- }
-
- $level = ob_get_level();
- ob_start();
-
- foreach ($this->doDisplay($context, $blocks) as $data) {
- if (ob_get_length()) {
- $data = ob_get_clean().$data;
- ob_start();
- }
-
- yield $data;
- }
-
- if (ob_get_length()) {
- yield ob_get_clean();
- }
- } catch (Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($this->getSourceContext());
- }
-
- // this is mostly useful for \Twig\Error\LoaderError exceptions
- // see \Twig\Error\LoaderError
- if (-1 === $e->getTemplateLine()) {
- $e->guess();
- }
-
- throw $e;
- } catch (\Throwable $e) {
- $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
- $e->guess();
-
- throw $e;
- } finally {
- if (!$this->useYield) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
- }
- }
- }
-
- /**
- * @return iterable
- */
- public function yieldBlock($name, array $context, array $blocks = [], $useBlocks = true, ?self $templateContext = null)
- {
- if ($useBlocks && isset($blocks[$name])) {
- $template = $blocks[$name][0];
- $block = $blocks[$name][1];
- } elseif (isset($this->blocks[$name])) {
- $template = $this->blocks[$name][0];
- $block = $this->blocks[$name][1];
- } else {
- $template = null;
- $block = null;
- }
-
- // avoid RCEs when sandbox is enabled
- if (null !== $template && !$template instanceof self) {
- throw new \LogicException('A block must be a method on a \Twig\Template instance.');
- }
-
- if (null !== $template) {
- try {
- if ($this->useYield) {
- yield from $template->$block($context, $blocks);
-
- return;
- }
-
- $level = ob_get_level();
- ob_start();
-
- foreach ($template->$block($context, $blocks) as $data) {
- if (ob_get_length()) {
- $data = ob_get_clean().$data;
- ob_start();
- }
-
- yield $data;
- }
-
- if (ob_get_length()) {
- yield ob_get_clean();
- }
- } catch (Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($template->getSourceContext());
- }
-
- // this is mostly useful for \Twig\Error\LoaderError exceptions
- // see \Twig\Error\LoaderError
- if (-1 === $e->getTemplateLine()) {
- $e->guess();
- }
-
- throw $e;
- } catch (\Throwable $e) {
- $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
- $e->guess();
-
- throw $e;
- } finally {
- if (!$this->useYield) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
- }
- }
- } elseif ($parent = $this->getParent($context)) {
- yield from $parent->unwrap()->yieldBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this);
- } elseif (isset($blocks[$name])) {
- throw new RuntimeError(sprintf('Block "%s" should not call parent() in "%s" as the block does not exist in the parent template "%s".', $name, $blocks[$name][0]->getTemplateName(), $this->getTemplateName()), -1, $blocks[$name][0]->getSourceContext());
- } else {
- throw new RuntimeError(sprintf('Block "%s" on template "%s" does not exist.', $name, $this->getTemplateName()), -1, ($templateContext ?? $this)->getSourceContext());
- }
- }
-
- /**
- * Yields a parent block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to display from the parent
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return iterable
- */
- public function yieldParentBlock($name, array $context, array $blocks = [])
- {
- if (isset($this->traits[$name])) {
- yield from $this->traits[$name][0]->yieldBlock($name, $context, $blocks, false);
- } elseif ($parent = $this->getParent($context)) {
- yield from $parent->unwrap()->yieldBlock($name, $context, $blocks, false);
- } else {
- throw new RuntimeError(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext());
- }
- }
-
- /**
- * Auto-generated method to display the template with the given context.
- *
- * @param array $context An array of parameters to pass to the template
- * @param array $blocks An array of blocks to pass to the template
- */
- abstract protected function doDisplay(array $context, array $blocks = []);
-}
diff --git a/vendor/twig/twig/src/TemplateWrapper.php b/vendor/twig/twig/src/TemplateWrapper.php
deleted file mode 100644
index fcfb070c..00000000
--- a/vendor/twig/twig/src/TemplateWrapper.php
+++ /dev/null
@@ -1,93 +0,0 @@
-
- */
-final class TemplateWrapper
-{
- private $env;
- private $template;
-
- /**
- * This method is for internal use only and should never be called
- * directly (use Twig\Environment::load() instead).
- *
- * @internal
- */
- public function __construct(Environment $env, Template $template)
- {
- $this->env = $env;
- $this->template = $template;
- }
-
- public function render(array $context = []): string
- {
- return $this->template->render($context);
- }
-
- public function display(array $context = [])
- {
- // using func_get_args() allows to not expose the blocks argument
- // as it should only be used by internal code
- $this->template->display($context, \func_get_args()[1] ?? []);
- }
-
- public function hasBlock(string $name, array $context = []): bool
- {
- return $this->template->hasBlock($name, $context);
- }
-
- /**
- * @return string[] An array of defined template block names
- */
- public function getBlockNames(array $context = []): array
- {
- return $this->template->getBlockNames($context);
- }
-
- public function renderBlock(string $name, array $context = []): string
- {
- return $this->template->renderBlock($name, $this->env->mergeGlobals($context));
- }
-
- public function displayBlock(string $name, array $context = [])
- {
- $context = $this->env->mergeGlobals($context);
- foreach ($this->template->yieldBlock($name, $context) as $data) {
- echo $data;
- }
- }
-
- public function getSourceContext(): Source
- {
- return $this->template->getSourceContext();
- }
-
- public function getTemplateName(): string
- {
- return $this->template->getTemplateName();
- }
-
- /**
- * @internal
- *
- * @return Template
- */
- public function unwrap()
- {
- return $this->template;
- }
-}
diff --git a/vendor/twig/twig/src/Test/IntegrationTestCase.php b/vendor/twig/twig/src/Test/IntegrationTestCase.php
deleted file mode 100644
index d0731ce1..00000000
--- a/vendor/twig/twig/src/Test/IntegrationTestCase.php
+++ /dev/null
@@ -1,267 +0,0 @@
-
- * @author Karma Dordrak
- */
-abstract class IntegrationTestCase extends TestCase
-{
- /**
- * @return string
- */
- abstract protected function getFixturesDir();
-
- /**
- * @return RuntimeLoaderInterface[]
- */
- protected function getRuntimeLoaders()
- {
- return [];
- }
-
- /**
- * @return ExtensionInterface[]
- */
- protected function getExtensions()
- {
- return [];
- }
-
- /**
- * @return TwigFilter[]
- */
- protected function getTwigFilters()
- {
- return [];
- }
-
- /**
- * @return TwigFunction[]
- */
- protected function getTwigFunctions()
- {
- return [];
- }
-
- /**
- * @return TwigTest[]
- */
- protected function getTwigTests()
- {
- return [];
- }
-
- /**
- * @dataProvider getTests
- */
- public function testIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
- {
- $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation);
- }
-
- /**
- * @dataProvider getLegacyTests
- *
- * @group legacy
- */
- public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
- {
- $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation);
- }
-
- public function getTests($name, $legacyTests = false)
- {
- $fixturesDir = realpath($this->getFixturesDir());
- $tests = [];
-
- foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
- if (!preg_match('/\.test$/', $file)) {
- continue;
- }
-
- if ($legacyTests xor str_contains($file->getRealpath(), '.legacy.test')) {
- continue;
- }
-
- $test = file_get_contents($file->getRealpath());
-
- if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) {
- $message = $match[1];
- $condition = $match[2];
- $deprecation = $match[3];
- $templates = self::parseTemplates($match[4]);
- $exception = $match[6];
- $outputs = [[null, $match[5], null, '']];
- } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) {
- $message = $match[1];
- $condition = $match[2];
- $deprecation = $match[3];
- $templates = self::parseTemplates($match[4]);
- $exception = false;
- preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, \PREG_SET_ORDER);
- } else {
- throw new \InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file)));
- }
-
- $tests[] = [str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs, $deprecation];
- }
-
- if ($legacyTests && empty($tests)) {
- // add a dummy test to avoid a PHPUnit message
- return [['not', '-', '', [], '', []]];
- }
-
- return $tests;
- }
-
- public function getLegacyTests()
- {
- return $this->getTests('testLegacyIntegration', true);
- }
-
- protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
- {
- if (!$outputs) {
- $this->markTestSkipped('no tests to run');
- }
-
- if ($condition) {
- $ret = '';
- eval('$ret = '.$condition.';');
- if (!$ret) {
- $this->markTestSkipped($condition);
- }
- }
-
- $loader = new ArrayLoader($templates);
-
- foreach ($outputs as $i => $match) {
- $config = array_merge([
- 'cache' => false,
- 'strict_variables' => true,
- ], $match[2] ? eval($match[2].';') : []);
- $twig = new Environment($loader, $config);
- $twig->addGlobal('global', 'global');
- foreach ($this->getRuntimeLoaders() as $runtimeLoader) {
- $twig->addRuntimeLoader($runtimeLoader);
- }
-
- foreach ($this->getExtensions() as $extension) {
- $twig->addExtension($extension);
- }
-
- foreach ($this->getTwigFilters() as $filter) {
- $twig->addFilter($filter);
- }
-
- foreach ($this->getTwigTests() as $test) {
- $twig->addTest($test);
- }
-
- foreach ($this->getTwigFunctions() as $function) {
- $twig->addFunction($function);
- }
-
- // avoid using the same PHP class name for different cases
- $p = new \ReflectionProperty($twig, 'templateClassPrefix');
- $p->setAccessible(true);
- $p->setValue($twig, '__TwigTemplate_'.hash(\PHP_VERSION_ID < 80100 ? 'sha256' : 'xxh128', uniqid((string) mt_rand(), true), false).'_');
-
- $deprecations = [];
- try {
- $prevHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$deprecations, &$prevHandler) {
- if (\E_USER_DEPRECATED === $type) {
- $deprecations[] = $msg;
-
- return true;
- }
-
- return $prevHandler ? $prevHandler($type, $msg, $file, $line, $context) : false;
- });
-
- $template = $twig->load('index.twig');
- } catch (\Exception $e) {
- if (false !== $exception) {
- $message = $e->getMessage();
- $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $message)));
- $last = substr($message, \strlen($message) - 1);
- $this->assertTrue('.' === $last || '?' === $last, 'Exception message must end with a dot or a question mark.');
-
- return;
- }
-
- throw new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e);
- } finally {
- restore_error_handler();
- }
-
- $this->assertSame($deprecation, implode("\n", $deprecations));
-
- try {
- $output = trim($template->render(eval($match[1].';')), "\n ");
- } catch (\Exception $e) {
- if (false !== $exception) {
- $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $e->getMessage())));
-
- return;
- }
-
- $e = new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e);
-
- $output = trim(sprintf('%s: %s', \get_class($e), $e->getMessage()));
- }
-
- if (false !== $exception) {
- [$class] = explode(':', $exception);
- $constraintClass = class_exists('PHPUnit\Framework\Constraint\Exception') ? 'PHPUnit\Framework\Constraint\Exception' : 'PHPUnit_Framework_Constraint_Exception';
- $this->assertThat(null, new $constraintClass($class));
- }
-
- $expected = trim($match[3], "\n ");
-
- if ($expected !== $output) {
- printf("Compiled templates that failed on case %d:\n", $i + 1);
-
- foreach (array_keys($templates) as $name) {
- echo "Template: $name\n";
- echo $twig->compile($twig->parse($twig->tokenize($twig->getLoader()->getSourceContext($name))));
- }
- }
- $this->assertEquals($expected, $output, $message.' (in '.$file.')');
- }
- }
-
- protected static function parseTemplates($test)
- {
- $templates = [];
- preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, \PREG_SET_ORDER);
- foreach ($matches as $match) {
- $templates[$match[1] ?: 'index.twig'] = $match[2];
- }
-
- return $templates;
- }
-}
diff --git a/vendor/twig/twig/src/Test/NodeTestCase.php b/vendor/twig/twig/src/Test/NodeTestCase.php
deleted file mode 100644
index 30d6810f..00000000
--- a/vendor/twig/twig/src/Test/NodeTestCase.php
+++ /dev/null
@@ -1,70 +0,0 @@
-assertNodeCompilation($source, $node, $environment, $isPattern);
- }
-
- public function assertNodeCompilation($source, Node $node, ?Environment $environment = null, $isPattern = false)
- {
- $compiler = $this->getCompiler($environment);
- $compiler->compile($node);
-
- if ($isPattern) {
- $this->assertStringMatchesFormat($source, trim($compiler->getSource()));
- } else {
- $this->assertEquals($source, trim($compiler->getSource()));
- }
- }
-
- protected function getCompiler(?Environment $environment = null)
- {
- return new Compiler($environment ?? $this->getEnvironment());
- }
-
- protected function getEnvironment()
- {
- return $this->currentEnv = new Environment(new ArrayLoader([]));
- }
-
- protected function getVariableGetter($name, $line = false)
- {
- $line = $line > 0 ? "// line $line\n" : '';
-
- return sprintf('%s($context["%s"] ?? null)', $line, $name);
- }
-
- protected function getAttributeGetter()
- {
- return 'CoreExtension::getAttribute($this->env, $this->source, ';
- }
-}
diff --git a/vendor/twig/twig/src/Token.php b/vendor/twig/twig/src/Token.php
deleted file mode 100644
index 59279b8f..00000000
--- a/vendor/twig/twig/src/Token.php
+++ /dev/null
@@ -1,184 +0,0 @@
-
- */
-final class Token
-{
- private $value;
- private $type;
- private $lineno;
-
- public const EOF_TYPE = -1;
- public const TEXT_TYPE = 0;
- public const BLOCK_START_TYPE = 1;
- public const VAR_START_TYPE = 2;
- public const BLOCK_END_TYPE = 3;
- public const VAR_END_TYPE = 4;
- public const NAME_TYPE = 5;
- public const NUMBER_TYPE = 6;
- public const STRING_TYPE = 7;
- public const OPERATOR_TYPE = 8;
- public const PUNCTUATION_TYPE = 9;
- public const INTERPOLATION_START_TYPE = 10;
- public const INTERPOLATION_END_TYPE = 11;
- public const ARROW_TYPE = 12;
- public const SPREAD_TYPE = 13;
-
- public function __construct(int $type, $value, int $lineno)
- {
- $this->type = $type;
- $this->value = $value;
- $this->lineno = $lineno;
- }
-
- public function __toString()
- {
- return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value);
- }
-
- /**
- * Tests the current token for a type and/or a value.
- *
- * Parameters may be:
- * * just type
- * * type and value (or array of possible values)
- * * just value (or array of possible values) (NAME_TYPE is used as type)
- *
- * @param array|string|int $type The type to test
- * @param array|string|null $values The token value
- */
- public function test($type, $values = null): bool
- {
- if (null === $values && !\is_int($type)) {
- $values = $type;
- $type = self::NAME_TYPE;
- }
-
- return ($this->type === $type) && (
- null === $values
- || (\is_array($values) && \in_array($this->value, $values))
- || $this->value == $values
- );
- }
-
- public function getLine(): int
- {
- return $this->lineno;
- }
-
- public function getType(): int
- {
- return $this->type;
- }
-
- public function getValue()
- {
- return $this->value;
- }
-
- public static function typeToString(int $type, bool $short = false): string
- {
- switch ($type) {
- case self::EOF_TYPE:
- $name = 'EOF_TYPE';
- break;
- case self::TEXT_TYPE:
- $name = 'TEXT_TYPE';
- break;
- case self::BLOCK_START_TYPE:
- $name = 'BLOCK_START_TYPE';
- break;
- case self::VAR_START_TYPE:
- $name = 'VAR_START_TYPE';
- break;
- case self::BLOCK_END_TYPE:
- $name = 'BLOCK_END_TYPE';
- break;
- case self::VAR_END_TYPE:
- $name = 'VAR_END_TYPE';
- break;
- case self::NAME_TYPE:
- $name = 'NAME_TYPE';
- break;
- case self::NUMBER_TYPE:
- $name = 'NUMBER_TYPE';
- break;
- case self::STRING_TYPE:
- $name = 'STRING_TYPE';
- break;
- case self::OPERATOR_TYPE:
- $name = 'OPERATOR_TYPE';
- break;
- case self::PUNCTUATION_TYPE:
- $name = 'PUNCTUATION_TYPE';
- break;
- case self::INTERPOLATION_START_TYPE:
- $name = 'INTERPOLATION_START_TYPE';
- break;
- case self::INTERPOLATION_END_TYPE:
- $name = 'INTERPOLATION_END_TYPE';
- break;
- case self::ARROW_TYPE:
- $name = 'ARROW_TYPE';
- break;
- case self::SPREAD_TYPE:
- $name = 'SPREAD_TYPE';
- break;
- default:
- throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
- }
-
- return $short ? $name : 'Twig\Token::'.$name;
- }
-
- public static function typeToEnglish(int $type): string
- {
- switch ($type) {
- case self::EOF_TYPE:
- return 'end of template';
- case self::TEXT_TYPE:
- return 'text';
- case self::BLOCK_START_TYPE:
- return 'begin of statement block';
- case self::VAR_START_TYPE:
- return 'begin of print statement';
- case self::BLOCK_END_TYPE:
- return 'end of statement block';
- case self::VAR_END_TYPE:
- return 'end of print statement';
- case self::NAME_TYPE:
- return 'name';
- case self::NUMBER_TYPE:
- return 'number';
- case self::STRING_TYPE:
- return 'string';
- case self::OPERATOR_TYPE:
- return 'operator';
- case self::PUNCTUATION_TYPE:
- return 'punctuation';
- case self::INTERPOLATION_START_TYPE:
- return 'begin of string interpolation';
- case self::INTERPOLATION_END_TYPE:
- return 'end of string interpolation';
- case self::ARROW_TYPE:
- return 'arrow function';
- case self::SPREAD_TYPE:
- return 'spread operator';
- default:
- throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
- }
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php b/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
deleted file mode 100644
index 720ea676..00000000
--- a/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
- */
-abstract class AbstractTokenParser implements TokenParserInterface
-{
- /**
- * @var Parser
- */
- protected $parser;
-
- public function setParser(Parser $parser): void
- {
- $this->parser = $parser;
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php b/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php
deleted file mode 100644
index 4dbf3040..00000000
--- a/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php
+++ /dev/null
@@ -1,60 +0,0 @@
-getLine();
- $name = $this->parser->getVarName();
-
- $ref = new TempNameExpression($name, $lineno);
- $ref->setAttribute('always_defined', true);
-
- $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
-
- $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse([$this, 'decideApplyEnd'], true);
- $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
-
- return new Node([
- new SetNode(true, $ref, $body, $lineno, $this->getTag()),
- new PrintNode($filter, $lineno, $this->getTag()),
- ]);
- }
-
- public function decideApplyEnd(Token $token): bool
- {
- return $token->test('endapply');
- }
-
- public function getTag(): string
- {
- return 'apply';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php b/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
deleted file mode 100644
index b674bea4..00000000
--- a/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
+++ /dev/null
@@ -1,58 +0,0 @@
-getLine();
- $stream = $this->parser->getStream();
-
- if ($stream->test(/* Token::BLOCK_END_TYPE */ 3)) {
- $value = 'html';
- } else {
- $expr = $this->parser->getExpressionParser()->parseExpression();
- if (!$expr instanceof ConstantExpression) {
- throw new SyntaxError('An escaping strategy must be a string or false.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- $value = $expr->getAttribute('value');
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new AutoEscapeNode($value, $body, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endautoescape');
- }
-
- public function getTag(): string
- {
- return 'autoescape';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/BlockTokenParser.php b/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
deleted file mode 100644
index 5878131b..00000000
--- a/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
+++ /dev/null
@@ -1,78 +0,0 @@
-
- * {% block title %}{% endblock %} - My Webpage
- * {% endblock %}
- *
- * @internal
- */
-final class BlockTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
- if ($this->parser->hasBlock($name)) {
- throw new SyntaxError(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getTemplateLine()), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- $this->parser->setBlock($name, $block = new BlockNode($name, new Node([]), $lineno));
- $this->parser->pushLocalScope();
- $this->parser->pushBlockStack($name);
-
- if ($stream->nextIf(/* Token::BLOCK_END_TYPE */ 3)) {
- $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
- if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) {
- $value = $token->getValue();
-
- if ($value != $name) {
- throw new SyntaxError(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
- } else {
- $body = new Node([
- new PrintNode($this->parser->getExpressionParser()->parseExpression(), $lineno),
- ]);
- }
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $block->setNode('body', $body);
- $this->parser->popBlockStack();
- $this->parser->popLocalScope();
-
- return new BlockReferenceNode($name, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endblock');
- }
-
- public function getTag(): string
- {
- return 'block';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php b/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php
deleted file mode 100644
index 31416c79..00000000
--- a/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php
+++ /dev/null
@@ -1,43 +0,0 @@
-
- *
- * @internal
- */
-final class DeprecatedTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $expr = $this->parser->getExpressionParser()->parseExpression();
-
- $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
-
- return new DeprecatedNode($expr, $token->getLine(), $this->getTag());
- }
-
- public function getTag(): string
- {
- return 'deprecated';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/DoTokenParser.php b/vendor/twig/twig/src/TokenParser/DoTokenParser.php
deleted file mode 100644
index 32c8f12f..00000000
--- a/vendor/twig/twig/src/TokenParser/DoTokenParser.php
+++ /dev/null
@@ -1,38 +0,0 @@
-parser->getExpressionParser()->parseExpression();
-
- $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new DoNode($expr, $token->getLine(), $this->getTag());
- }
-
- public function getTag(): string
- {
- return 'do';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php b/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
deleted file mode 100644
index adf683cc..00000000
--- a/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
+++ /dev/null
@@ -1,73 +0,0 @@
-parser->getStream();
-
- $parent = $this->parser->getExpressionParser()->parseExpression();
-
- [$variables, $only, $ignoreMissing] = $this->parseArguments();
-
- $parentToken = $fakeParentToken = new Token(/* Token::STRING_TYPE */ 7, '__parent__', $token->getLine());
- if ($parent instanceof ConstantExpression) {
- $parentToken = new Token(/* Token::STRING_TYPE */ 7, $parent->getAttribute('value'), $token->getLine());
- } elseif ($parent instanceof NameExpression) {
- $parentToken = new Token(/* Token::NAME_TYPE */ 5, $parent->getAttribute('name'), $token->getLine());
- }
-
- // inject a fake parent to make the parent() function work
- $stream->injectTokens([
- new Token(/* Token::BLOCK_START_TYPE */ 1, '', $token->getLine()),
- new Token(/* Token::NAME_TYPE */ 5, 'extends', $token->getLine()),
- $parentToken,
- new Token(/* Token::BLOCK_END_TYPE */ 3, '', $token->getLine()),
- ]);
-
- $module = $this->parser->parse($stream, [$this, 'decideBlockEnd'], true);
-
- // override the parent with the correct one
- if ($fakeParentToken === $parentToken) {
- $module->setNode('parent', $parent);
- }
-
- $this->parser->embedTemplate($module);
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new EmbedNode($module->getTemplateName(), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endembed');
- }
-
- public function getTag(): string
- {
- return 'embed';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php b/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
deleted file mode 100644
index 0ca46dd2..00000000
--- a/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
+++ /dev/null
@@ -1,52 +0,0 @@
-parser->getStream();
-
- if ($this->parser->peekBlockStack()) {
- throw new SyntaxError('Cannot use "extend" in a block.', $token->getLine(), $stream->getSourceContext());
- } elseif (!$this->parser->isMainScope()) {
- throw new SyntaxError('Cannot use "extend" in a macro.', $token->getLine(), $stream->getSourceContext());
- }
-
- if (null !== $this->parser->getParent()) {
- throw new SyntaxError('Multiple extends tags are forbidden.', $token->getLine(), $stream->getSourceContext());
- }
- $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new Node();
- }
-
- public function getTag(): string
- {
- return 'extends';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/FlushTokenParser.php b/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
deleted file mode 100644
index 02c74aa1..00000000
--- a/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
+++ /dev/null
@@ -1,38 +0,0 @@
-parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new FlushNode($token->getLine(), $this->getTag());
- }
-
- public function getTag(): string
- {
- return 'flush';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/ForTokenParser.php b/vendor/twig/twig/src/TokenParser/ForTokenParser.php
deleted file mode 100644
index 1af6da8f..00000000
--- a/vendor/twig/twig/src/TokenParser/ForTokenParser.php
+++ /dev/null
@@ -1,78 +0,0 @@
-
- * {% for user in users %}
- * {{ user.username|e }}
- * {% endfor %}
- *
- *
- * @internal
- */
-final class ForTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
- $stream->expect(/* Token::OPERATOR_TYPE */ 8, 'in');
- $seq = $this->parser->getExpressionParser()->parseExpression();
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $body = $this->parser->subparse([$this, 'decideForFork']);
- if ('else' == $stream->next()->getValue()) {
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $else = $this->parser->subparse([$this, 'decideForEnd'], true);
- } else {
- $else = null;
- }
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- if (\count($targets) > 1) {
- $keyTarget = $targets->getNode('0');
- $keyTarget = new AssignNameExpression($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
- $valueTarget = $targets->getNode('1');
- } else {
- $keyTarget = new AssignNameExpression('_key', $lineno);
- $valueTarget = $targets->getNode('0');
- }
- $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
-
- return new ForNode($keyTarget, $valueTarget, $seq, null, $body, $else, $lineno, $this->getTag());
- }
-
- public function decideForFork(Token $token): bool
- {
- return $token->test(['else', 'endfor']);
- }
-
- public function decideForEnd(Token $token): bool
- {
- return $token->test('endfor');
- }
-
- public function getTag(): string
- {
- return 'for';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/FromTokenParser.php b/vendor/twig/twig/src/TokenParser/FromTokenParser.php
deleted file mode 100644
index 31b6cde4..00000000
--- a/vendor/twig/twig/src/TokenParser/FromTokenParser.php
+++ /dev/null
@@ -1,66 +0,0 @@
-parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
- $stream->expect(/* Token::NAME_TYPE */ 5, 'import');
-
- $targets = [];
- while (true) {
- $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
-
- $alias = $name;
- if ($stream->nextIf('as')) {
- $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
- }
-
- $targets[$name] = $alias;
-
- if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $var = new AssignNameExpression($this->parser->getVarName(), $token->getLine());
- $node = new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope());
-
- foreach ($targets as $name => $alias) {
- $this->parser->addImportedSymbol('function', $alias, 'macro_'.$name, $var);
- }
-
- return $node;
- }
-
- public function getTag(): string
- {
- return 'from';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/IfTokenParser.php b/vendor/twig/twig/src/TokenParser/IfTokenParser.php
deleted file mode 100644
index c0fe6df0..00000000
--- a/vendor/twig/twig/src/TokenParser/IfTokenParser.php
+++ /dev/null
@@ -1,89 +0,0 @@
-
- * {% for user in users %}
- * {{ user.username|e }}
- * {% endfor %}
- *
- * {% endif %}
- *
- * @internal
- */
-final class IfTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $lineno = $token->getLine();
- $expr = $this->parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $body = $this->parser->subparse([$this, 'decideIfFork']);
- $tests = [$expr, $body];
- $else = null;
-
- $end = false;
- while (!$end) {
- switch ($stream->next()->getValue()) {
- case 'else':
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $else = $this->parser->subparse([$this, 'decideIfEnd']);
- break;
-
- case 'elseif':
- $expr = $this->parser->getExpressionParser()->parseExpression();
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $body = $this->parser->subparse([$this, 'decideIfFork']);
- $tests[] = $expr;
- $tests[] = $body;
- break;
-
- case 'endif':
- $end = true;
- break;
-
- default:
- throw new SyntaxError(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new IfNode(new Node($tests), $else, $lineno, $this->getTag());
- }
-
- public function decideIfFork(Token $token): bool
- {
- return $token->test(['elseif', 'else', 'endif']);
- }
-
- public function decideIfEnd(Token $token): bool
- {
- return $token->test(['endif']);
- }
-
- public function getTag(): string
- {
- return 'if';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/ImportTokenParser.php b/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
deleted file mode 100644
index 44cb4dad..00000000
--- a/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
+++ /dev/null
@@ -1,44 +0,0 @@
-parser->getExpressionParser()->parseExpression();
- $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5, 'as');
- $var = new AssignNameExpression($this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5)->getValue(), $token->getLine());
- $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $this->parser->addImportedSymbol('template', $var->getAttribute('name'));
-
- return new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope());
- }
-
- public function getTag(): string
- {
- return 'import';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php b/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
deleted file mode 100644
index fda5bfd8..00000000
--- a/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
+++ /dev/null
@@ -1,69 +0,0 @@
-parser->getExpressionParser()->parseExpression();
-
- [$variables, $only, $ignoreMissing] = $this->parseArguments();
-
- return new IncludeNode($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
- }
-
- protected function parseArguments()
- {
- $stream = $this->parser->getStream();
-
- $ignoreMissing = false;
- if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'ignore')) {
- $stream->expect(/* Token::NAME_TYPE */ 5, 'missing');
-
- $ignoreMissing = true;
- }
-
- $variables = null;
- if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'with')) {
- $variables = $this->parser->getExpressionParser()->parseExpression();
- }
-
- $only = false;
- if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'only')) {
- $only = true;
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return [$variables, $only, $ignoreMissing];
- }
-
- public function getTag(): string
- {
- return 'include';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/MacroTokenParser.php b/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
deleted file mode 100644
index f584927e..00000000
--- a/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
+++ /dev/null
@@ -1,66 +0,0 @@
-
- * {% endmacro %}
- *
- * @internal
- */
-final class MacroTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
-
- $arguments = $this->parser->getExpressionParser()->parseArguments(true, true);
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $this->parser->pushLocalScope();
- $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
- if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) {
- $value = $token->getValue();
-
- if ($value != $name) {
- throw new SyntaxError(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
- $this->parser->popLocalScope();
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $this->parser->setMacro($name, new MacroNode($name, new BodyNode([$body]), $arguments, $lineno, $this->getTag()));
-
- return new Node();
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endmacro');
- }
-
- public function getTag(): string
- {
- return 'macro';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php b/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
deleted file mode 100644
index c919556e..00000000
--- a/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
+++ /dev/null
@@ -1,66 +0,0 @@
-parser->getStream();
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- // in a sandbox tag, only include tags are allowed
- if (!$body instanceof IncludeNode) {
- foreach ($body as $node) {
- if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) {
- continue;
- }
-
- if (!$node instanceof IncludeNode) {
- throw new SyntaxError('Only "include" tags are allowed within a "sandbox" section.', $node->getTemplateLine(), $stream->getSourceContext());
- }
- }
- }
-
- return new SandboxNode($body, $token->getLine(), $this->getTag());
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endsandbox');
- }
-
- public function getTag(): string
- {
- return 'sandbox';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/SetTokenParser.php b/vendor/twig/twig/src/TokenParser/SetTokenParser.php
deleted file mode 100644
index 2fbdfe09..00000000
--- a/vendor/twig/twig/src/TokenParser/SetTokenParser.php
+++ /dev/null
@@ -1,73 +0,0 @@
-getLine();
- $stream = $this->parser->getStream();
- $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
-
- $capture = false;
- if ($stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) {
- $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- if (\count($names) !== \count($values)) {
- throw new SyntaxError('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- } else {
- $capture = true;
-
- if (\count($names) > 1) {
- throw new SyntaxError('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $values = $this->parser->subparse([$this, 'decideBlockEnd'], true);
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
- }
-
- return new SetNode($capture, $names, $values, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Token $token): bool
- {
- return $token->test('endset');
- }
-
- public function getTag(): string
- {
- return 'set';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/TokenParserInterface.php b/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
deleted file mode 100644
index bb8db3e5..00000000
--- a/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- */
-interface TokenParserInterface
-{
- /**
- * Sets the parser associated with this token parser.
- */
- public function setParser(Parser $parser): void;
-
- /**
- * Parses a token and returns a node.
- *
- * @return Node
- *
- * @throws SyntaxError
- */
- public function parse(Token $token);
-
- /**
- * Gets the tag name associated with this token parser.
- *
- * @return string
- */
- public function getTag();
-}
diff --git a/vendor/twig/twig/src/TokenParser/UseTokenParser.php b/vendor/twig/twig/src/TokenParser/UseTokenParser.php
deleted file mode 100644
index 3cdbb98a..00000000
--- a/vendor/twig/twig/src/TokenParser/UseTokenParser.php
+++ /dev/null
@@ -1,73 +0,0 @@
-parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
-
- if (!$template instanceof ConstantExpression) {
- throw new SyntaxError('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
-
- $targets = [];
- if ($stream->nextIf('with')) {
- while (true) {
- $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
-
- $alias = $name;
- if ($stream->nextIf('as')) {
- $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
- }
-
- $targets[$name] = new ConstantExpression($alias, -1);
-
- if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
- break;
- }
- }
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $this->parser->addTrait(new Node(['template' => $template, 'targets' => new Node($targets)]));
-
- return new Node();
- }
-
- public function getTag(): string
- {
- return 'use';
- }
-}
diff --git a/vendor/twig/twig/src/TokenParser/WithTokenParser.php b/vendor/twig/twig/src/TokenParser/WithTokenParser.php
deleted file mode 100644
index 7d8cbe26..00000000
--- a/vendor/twig/twig/src/TokenParser/WithTokenParser.php
+++ /dev/null
@@ -1,56 +0,0 @@
-
- *
- * @internal
- */
-final class WithTokenParser extends AbstractTokenParser
-{
- public function parse(Token $token): Node
- {
- $stream = $this->parser->getStream();
-
- $variables = null;
- $only = false;
- if (!$stream->test(/* Token::BLOCK_END_TYPE */ 3)) {
- $variables = $this->parser->getExpressionParser()->parseExpression();
- $only = (bool) $stream->nextIf(/* Token::NAME_TYPE */ 5, 'only');
- }
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- $body = $this->parser->subparse([$this, 'decideWithEnd'], true);
-
- $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
-
- return new WithNode($body, $variables, $only, $token->getLine(), $this->getTag());
- }
-
- public function decideWithEnd(Token $token): bool
- {
- return $token->test('endwith');
- }
-
- public function getTag(): string
- {
- return 'with';
- }
-}
diff --git a/vendor/twig/twig/src/TokenStream.php b/vendor/twig/twig/src/TokenStream.php
deleted file mode 100644
index 89e7e0f3..00000000
--- a/vendor/twig/twig/src/TokenStream.php
+++ /dev/null
@@ -1,130 +0,0 @@
-
- */
-final class TokenStream
-{
- private $tokens;
- private $current = 0;
- private $source;
-
- public function __construct(array $tokens, ?Source $source = null)
- {
- $this->tokens = $tokens;
- $this->source = $source ?: new Source('', '');
- }
-
- public function __toString()
- {
- return implode("\n", $this->tokens);
- }
-
- public function injectTokens(array $tokens)
- {
- $this->tokens = array_merge(\array_slice($this->tokens, 0, $this->current), $tokens, \array_slice($this->tokens, $this->current));
- }
-
- /**
- * Sets the pointer to the next token and returns the old one.
- */
- public function next(): Token
- {
- if (!isset($this->tokens[++$this->current])) {
- throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source);
- }
-
- return $this->tokens[$this->current - 1];
- }
-
- /**
- * Tests a token, sets the pointer to the next one and returns it or throws a syntax error.
- *
- * @return Token|null The next token if the condition is true, null otherwise
- */
- public function nextIf($primary, $secondary = null)
- {
- return $this->tokens[$this->current]->test($primary, $secondary) ? $this->next() : null;
- }
-
- /**
- * Tests a token and returns it or throws a syntax error.
- */
- public function expect($type, $value = null, ?string $message = null): Token
- {
- $token = $this->tokens[$this->current];
- if (!$token->test($type, $value)) {
- $line = $token->getLine();
- throw new SyntaxError(sprintf('%sUnexpected token "%s"%s ("%s" expected%s).',
- $message ? $message.'. ' : '',
- Token::typeToEnglish($token->getType()),
- $token->getValue() ? sprintf(' of value "%s"', $token->getValue()) : '',
- Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''),
- $line,
- $this->source
- );
- }
- $this->next();
-
- return $token;
- }
-
- /**
- * Looks at the next token.
- */
- public function look(int $number = 1): Token
- {
- if (!isset($this->tokens[$this->current + $number])) {
- throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source);
- }
-
- return $this->tokens[$this->current + $number];
- }
-
- /**
- * Tests the current token.
- */
- public function test($primary, $secondary = null): bool
- {
- return $this->tokens[$this->current]->test($primary, $secondary);
- }
-
- /**
- * Checks if end of stream was reached.
- */
- public function isEOF(): bool
- {
- return /* Token::EOF_TYPE */ -1 === $this->tokens[$this->current]->getType();
- }
-
- public function getCurrent(): Token
- {
- return $this->tokens[$this->current];
- }
-
- /**
- * Gets the source associated with this stream.
- *
- * @internal
- */
- public function getSourceContext(): Source
- {
- return $this->source;
- }
-}
diff --git a/vendor/twig/twig/src/TwigFilter.php b/vendor/twig/twig/src/TwigFilter.php
deleted file mode 100644
index c02469b9..00000000
--- a/vendor/twig/twig/src/TwigFilter.php
+++ /dev/null
@@ -1,140 +0,0 @@
-
- *
- * @see https://twig.symfony.com/doc/templates.html#filters
- */
-final class TwigFilter
-{
- private $name;
- private $callable;
- private $options;
- private $arguments = [];
-
- /**
- * @param callable|array{class-string, string}|null $callable A callable implementing the filter. If null, you need to overwrite the "node_class" option to customize compilation.
- */
- public function __construct(string $name, $callable = null, array $options = [])
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge([
- 'needs_environment' => false,
- 'needs_context' => false,
- 'needs_charset' => false,
- 'is_variadic' => false,
- 'is_safe' => null,
- 'is_safe_callback' => null,
- 'pre_escape' => null,
- 'preserves_safety' => null,
- 'node_class' => FilterExpression::class,
- 'deprecated' => false,
- 'alternative' => null,
- ], $options);
- }
-
- public function getName(): string
- {
- return $this->name;
- }
-
- /**
- * Returns the callable to execute for this filter.
- *
- * @return callable|array{class-string, string}|null
- */
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass(): string
- {
- return $this->options['node_class'];
- }
-
- public function setArguments(array $arguments): void
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments(): array
- {
- return $this->arguments;
- }
-
- public function needsCharset(): bool
- {
- return $this->options['needs_charset'];
- }
-
- public function needsEnvironment(): bool
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext(): bool
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Node $filterArgs): ?array
- {
- if (null !== $this->options['is_safe']) {
- return $this->options['is_safe'];
- }
-
- if (null !== $this->options['is_safe_callback']) {
- return $this->options['is_safe_callback']($filterArgs);
- }
-
- return null;
- }
-
- public function getPreservesSafety(): ?array
- {
- return $this->options['preserves_safety'];
- }
-
- public function getPreEscape(): ?string
- {
- return $this->options['pre_escape'];
- }
-
- public function isVariadic(): bool
- {
- return $this->options['is_variadic'];
- }
-
- public function isDeprecated(): bool
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion(): string
- {
- return \is_bool($this->options['deprecated']) ? '' : $this->options['deprecated'];
- }
-
- public function getAlternative(): ?string
- {
- return $this->options['alternative'];
- }
-}
diff --git a/vendor/twig/twig/src/TwigFunction.php b/vendor/twig/twig/src/TwigFunction.php
deleted file mode 100644
index c15def63..00000000
--- a/vendor/twig/twig/src/TwigFunction.php
+++ /dev/null
@@ -1,128 +0,0 @@
-
- *
- * @see https://twig.symfony.com/doc/templates.html#functions
- */
-final class TwigFunction
-{
- private $name;
- private $callable;
- private $options;
- private $arguments = [];
-
- /**
- * @param callable|array{class-string, string}|null $callable A callable implementing the function. If null, you need to overwrite the "node_class" option to customize compilation.
- */
- public function __construct(string $name, $callable = null, array $options = [])
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge([
- 'needs_environment' => false,
- 'needs_context' => false,
- 'needs_charset' => false,
- 'is_variadic' => false,
- 'is_safe' => null,
- 'is_safe_callback' => null,
- 'node_class' => FunctionExpression::class,
- 'deprecated' => false,
- 'alternative' => null,
- ], $options);
- }
-
- public function getName(): string
- {
- return $this->name;
- }
-
- /**
- * Returns the callable to execute for this function.
- *
- * @return callable|array{class-string, string}|null
- */
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass(): string
- {
- return $this->options['node_class'];
- }
-
- public function setArguments(array $arguments): void
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments(): array
- {
- return $this->arguments;
- }
-
- public function needsCharset(): bool
- {
- return $this->options['needs_charset'];
- }
-
- public function needsEnvironment(): bool
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext(): bool
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Node $functionArgs): ?array
- {
- if (null !== $this->options['is_safe']) {
- return $this->options['is_safe'];
- }
-
- if (null !== $this->options['is_safe_callback']) {
- return $this->options['is_safe_callback']($functionArgs);
- }
-
- return [];
- }
-
- public function isVariadic(): bool
- {
- return (bool) $this->options['is_variadic'];
- }
-
- public function isDeprecated(): bool
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion(): string
- {
- return \is_bool($this->options['deprecated']) ? '' : $this->options['deprecated'];
- }
-
- public function getAlternative(): ?string
- {
- return $this->options['alternative'];
- }
-}
diff --git a/vendor/twig/twig/src/TwigTest.php b/vendor/twig/twig/src/TwigTest.php
deleted file mode 100644
index 3769ec16..00000000
--- a/vendor/twig/twig/src/TwigTest.php
+++ /dev/null
@@ -1,100 +0,0 @@
-
- *
- * @see https://twig.symfony.com/doc/templates.html#test-operator
- */
-final class TwigTest
-{
- private $name;
- private $callable;
- private $options;
- private $arguments = [];
-
- /**
- * @param callable|array{class-string, string}|null $callable A callable implementing the test. If null, you need to overwrite the "node_class" option to customize compilation.
- */
- public function __construct(string $name, $callable = null, array $options = [])
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge([
- 'is_variadic' => false,
- 'node_class' => TestExpression::class,
- 'deprecated' => false,
- 'alternative' => null,
- 'one_mandatory_argument' => false,
- ], $options);
- }
-
- public function getName(): string
- {
- return $this->name;
- }
-
- /**
- * Returns the callable to execute for this test.
- *
- * @return callable|array{class-string, string}|null
- */
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass(): string
- {
- return $this->options['node_class'];
- }
-
- public function setArguments(array $arguments): void
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments(): array
- {
- return $this->arguments;
- }
-
- public function isVariadic(): bool
- {
- return (bool) $this->options['is_variadic'];
- }
-
- public function isDeprecated(): bool
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion(): string
- {
- return \is_bool($this->options['deprecated']) ? '' : $this->options['deprecated'];
- }
-
- public function getAlternative(): ?string
- {
- return $this->options['alternative'];
- }
-
- public function hasOneMandatoryArgument(): bool
- {
- return (bool) $this->options['one_mandatory_argument'];
- }
-}
diff --git a/vendor/twig/twig/src/Util/DeprecationCollector.php b/vendor/twig/twig/src/Util/DeprecationCollector.php
deleted file mode 100644
index 378b666b..00000000
--- a/vendor/twig/twig/src/Util/DeprecationCollector.php
+++ /dev/null
@@ -1,77 +0,0 @@
-
- */
-final class DeprecationCollector
-{
- private $twig;
-
- public function __construct(Environment $twig)
- {
- $this->twig = $twig;
- }
-
- /**
- * Returns deprecations for templates contained in a directory.
- *
- * @param string $dir A directory where templates are stored
- * @param string $ext Limit the loaded templates by extension
- *
- * @return array An array of deprecations
- */
- public function collectDir(string $dir, string $ext = '.twig'): array
- {
- $iterator = new \RegexIterator(
- new \RecursiveIteratorIterator(
- new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY
- ), '{'.preg_quote($ext).'$}'
- );
-
- return $this->collect(new TemplateDirIterator($iterator));
- }
-
- /**
- * Returns deprecations for passed templates.
- *
- * @param \Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template)
- *
- * @return array An array of deprecations
- */
- public function collect(\Traversable $iterator): array
- {
- $deprecations = [];
- set_error_handler(function ($type, $msg) use (&$deprecations) {
- if (\E_USER_DEPRECATED === $type) {
- $deprecations[] = $msg;
- }
- });
-
- foreach ($iterator as $name => $contents) {
- try {
- $this->twig->parse($this->twig->tokenize(new Source($contents, $name)));
- } catch (SyntaxError $e) {
- // ignore templates containing syntax errors
- }
- }
-
- restore_error_handler();
-
- return $deprecations;
- }
-}
diff --git a/vendor/twig/twig/src/Util/TemplateDirIterator.php b/vendor/twig/twig/src/Util/TemplateDirIterator.php
deleted file mode 100644
index 3bef14be..00000000
--- a/vendor/twig/twig/src/Util/TemplateDirIterator.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
-class TemplateDirIterator extends \IteratorIterator
-{
- /**
- * @return mixed
- */
- #[\ReturnTypeWillChange]
- public function current()
- {
- return file_get_contents(parent::current());
- }
-
- /**
- * @return mixed
- */
- #[\ReturnTypeWillChange]
- public function key()
- {
- return (string) parent::key();
- }
-}