aboutsummaryrefslogtreecommitdiff
path: root/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler
diff options
context:
space:
mode:
Diffstat (limited to 'srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler')
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php228
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php192
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php41
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowirePass.php475
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php84
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php87
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php78
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php90
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php88
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php43
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php245
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/Compiler.php119
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php27
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php89
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php56
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php37
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php231
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php220
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PassConfig.php269
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php138
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php75
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php66
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php122
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php33
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php39
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php98
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatablePassInterface.php25
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatedPass.php83
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php94
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php227
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php190
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php40
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php44
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php38
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php71
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php168
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php136
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php112
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php87
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php40
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php80
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php52
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php38
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php135
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php98
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php99
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php118
-rw-r--r--srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php120
48 files changed, 5365 insertions, 0 deletions
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php
new file mode 100644
index 0000000..ad3cb52
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php
@@ -0,0 +1,228 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\ExpressionLanguage;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractRecursivePass implements CompilerPassInterface
+{
+ /**
+ * @var ContainerBuilder
+ */
+ protected $container;
+ protected $currentId;
+
+ private $processExpressions = false;
+ private $expressionLanguage;
+ private $inExpression = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->container = $container;
+
+ try {
+ $this->processValue($container->getDefinitions(), true);
+ } finally {
+ $this->container = null;
+ }
+ }
+
+ protected function enableExpressionProcessing()
+ {
+ $this->processExpressions = true;
+ }
+
+ protected function inExpression(bool $reset = true): bool
+ {
+ $inExpression = $this->inExpression;
+ if ($reset) {
+ $this->inExpression = false;
+ }
+
+ return $inExpression;
+ }
+
+ /**
+ * Processes a value found in a definition tree.
+ *
+ * @param mixed $value
+ * @param bool $isRoot
+ *
+ * @return mixed The processed value
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (\is_array($value)) {
+ foreach ($value as $k => $v) {
+ if ($isRoot) {
+ $this->currentId = $k;
+ }
+ if ($v !== $processedValue = $this->processValue($v, $isRoot)) {
+ $value[$k] = $processedValue;
+ }
+ }
+ } elseif ($value instanceof ArgumentInterface) {
+ $value->setValues($this->processValue($value->getValues()));
+ } elseif ($value instanceof Expression && $this->processExpressions) {
+ $this->getExpressionLanguage()->compile((string) $value, ['this' => 'container']);
+ } elseif ($value instanceof Definition) {
+ $value->setArguments($this->processValue($value->getArguments()));
+ $value->setProperties($this->processValue($value->getProperties()));
+ $value->setMethodCalls($this->processValue($value->getMethodCalls()));
+
+ $changes = $value->getChanges();
+ if (isset($changes['factory'])) {
+ $value->setFactory($this->processValue($value->getFactory()));
+ }
+ if (isset($changes['configurator'])) {
+ $value->setConfigurator($this->processValue($value->getConfigurator()));
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * @param bool $required
+ *
+ * @return \ReflectionFunctionAbstract|null
+ *
+ * @throws RuntimeException
+ */
+ protected function getConstructor(Definition $definition, $required)
+ {
+ if ($definition->isSynthetic()) {
+ return null;
+ }
+
+ if (\is_string($factory = $definition->getFactory())) {
+ if (!\function_exists($factory)) {
+ throw new RuntimeException(sprintf('Invalid service "%s": function "%s" does not exist.', $this->currentId, $factory));
+ }
+ $r = new \ReflectionFunction($factory);
+ if (false !== $r->getFileName() && file_exists($r->getFileName())) {
+ $this->container->fileExists($r->getFileName());
+ }
+
+ return $r;
+ }
+
+ if ($factory) {
+ list($class, $method) = $factory;
+ if ($class instanceof Reference) {
+ $class = $this->container->findDefinition((string) $class)->getClass();
+ } elseif ($class instanceof Definition) {
+ $class = $class->getClass();
+ } elseif (null === $class) {
+ $class = $definition->getClass();
+ }
+
+ if ('__construct' === $method) {
+ throw new RuntimeException(sprintf('Invalid service "%s": "__construct()" cannot be used as a factory method.', $this->currentId));
+ }
+
+ return $this->getReflectionMethod(new Definition($class), $method);
+ }
+
+ $class = $definition->getClass();
+
+ try {
+ if (!$r = $this->container->getReflectionClass($class)) {
+ throw new RuntimeException(sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class));
+ }
+ } catch (\ReflectionException $e) {
+ throw new RuntimeException(sprintf('Invalid service "%s": %s.', $this->currentId, lcfirst(rtrim($e->getMessage(), '.'))));
+ }
+ if (!$r = $r->getConstructor()) {
+ if ($required) {
+ throw new RuntimeException(sprintf('Invalid service "%s": class%s has no constructor.', $this->currentId, sprintf($class !== $this->currentId ? ' "%s"' : '', $class)));
+ }
+ } elseif (!$r->isPublic()) {
+ throw new RuntimeException(sprintf('Invalid service "%s": %s must be public.', $this->currentId, sprintf($class !== $this->currentId ? 'constructor of class "%s"' : 'its constructor', $class)));
+ }
+
+ return $r;
+ }
+
+ /**
+ * @param string $method
+ *
+ * @throws RuntimeException
+ *
+ * @return \ReflectionFunctionAbstract
+ */
+ protected function getReflectionMethod(Definition $definition, $method)
+ {
+ if ('__construct' === $method) {
+ return $this->getConstructor($definition, true);
+ }
+
+ if (!$class = $definition->getClass()) {
+ throw new RuntimeException(sprintf('Invalid service "%s": the class is not set.', $this->currentId));
+ }
+
+ if (!$r = $this->container->getReflectionClass($class)) {
+ throw new RuntimeException(sprintf('Invalid service "%s": class "%s" does not exist.', $this->currentId, $class));
+ }
+
+ if (!$r->hasMethod($method)) {
+ throw new RuntimeException(sprintf('Invalid service "%s": method "%s()" does not exist.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method));
+ }
+
+ $r = $r->getMethod($method);
+ if (!$r->isPublic()) {
+ throw new RuntimeException(sprintf('Invalid service "%s": method "%s()" must be public.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method));
+ }
+
+ return $r;
+ }
+
+ private function getExpressionLanguage(): ExpressionLanguage
+ {
+ if (null === $this->expressionLanguage) {
+ if (!class_exists(ExpressionLanguage::class)) {
+ throw new LogicException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
+ }
+
+ $providers = $this->container->getExpressionLanguageProviders();
+ $this->expressionLanguage = new ExpressionLanguage(null, $providers, function (string $arg): string {
+ if ('""' === substr_replace($arg, '', 1, -1)) {
+ $id = stripcslashes(substr($arg, 1, -1));
+ $this->inExpression = true;
+ $arg = $this->processValue(new Reference($id));
+ $this->inExpression = false;
+ if (!$arg instanceof Reference) {
+ throw new RuntimeException(sprintf('"%s::processValue()" must return a Reference when processing an expression, %s returned for service("%s").', \get_class($this), \is_object($arg) ? \get_class($arg) : \gettype($arg), $id));
+ }
+ $arg = sprintf('"%s"', $arg);
+ }
+
+ return sprintf('$this->get(%s)', $arg);
+ });
+ }
+
+ return $this->expressionLanguage;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
new file mode 100644
index 0000000..59a27ae
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AnalyzeServiceReferencesPass.php
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Run this pass before passes that need to know more about the relation of
+ * your services.
+ *
+ * This class will populate the ServiceReferenceGraph with information. You can
+ * retrieve the graph in other passes from the compiler.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class AnalyzeServiceReferencesPass extends AbstractRecursivePass implements RepeatablePassInterface
+{
+ private $graph;
+ private $currentDefinition;
+ private $onlyConstructorArguments;
+ private $hasProxyDumper;
+ private $lazy;
+ private $byConstructor;
+ private $definitions;
+ private $aliases;
+
+ /**
+ * @param bool $onlyConstructorArguments Sets this Service Reference pass to ignore method calls
+ */
+ public function __construct(bool $onlyConstructorArguments = false, bool $hasProxyDumper = true)
+ {
+ $this->onlyConstructorArguments = $onlyConstructorArguments;
+ $this->hasProxyDumper = $hasProxyDumper;
+ $this->enableExpressionProcessing();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setRepeatedPass(RepeatedPass $repeatedPass)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ /**
+ * Processes a ContainerBuilder object to populate the service reference graph.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->container = $container;
+ $this->graph = $container->getCompiler()->getServiceReferenceGraph();
+ $this->graph->clear();
+ $this->lazy = false;
+ $this->byConstructor = false;
+ $this->definitions = $container->getDefinitions();
+ $this->aliases = $container->getAliases();
+
+ foreach ($this->aliases as $id => $alias) {
+ $targetId = $this->getDefinitionId((string) $alias);
+ $this->graph->connect($id, $alias, $targetId, null !== $targetId ? $this->container->getDefinition($targetId) : null, null);
+ }
+
+ try {
+ parent::process($container);
+ } finally {
+ $this->aliases = $this->definitions = [];
+ }
+ }
+
+ protected function processValue($value, $isRoot = false)
+ {
+ $lazy = $this->lazy;
+ $inExpression = $this->inExpression();
+
+ if ($value instanceof ArgumentInterface) {
+ $this->lazy = true;
+ parent::processValue($value->getValues());
+ $this->lazy = $lazy;
+
+ return $value;
+ }
+ if ($value instanceof Reference) {
+ $targetId = $this->getDefinitionId((string) $value);
+ $targetDefinition = null !== $targetId ? $this->container->getDefinition($targetId) : null;
+
+ $this->graph->connect(
+ $this->currentId,
+ $this->currentDefinition,
+ $targetId,
+ $targetDefinition,
+ $value,
+ $this->lazy || ($this->hasProxyDumper && $targetDefinition && $targetDefinition->isLazy()),
+ ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE === $value->getInvalidBehavior(),
+ $this->byConstructor
+ );
+
+ if ($inExpression) {
+ $this->graph->connect(
+ '.internal.reference_in_expression',
+ null,
+ $targetId,
+ $targetDefinition,
+ $value,
+ $this->lazy || ($targetDefinition && $targetDefinition->isLazy()),
+ true
+ );
+ }
+
+ return $value;
+ }
+ if (!$value instanceof Definition) {
+ return parent::processValue($value, $isRoot);
+ }
+ if ($isRoot) {
+ if ($value->isSynthetic() || $value->isAbstract()) {
+ return $value;
+ }
+ $this->currentDefinition = $value;
+ } elseif ($this->currentDefinition === $value) {
+ return $value;
+ }
+ $this->lazy = false;
+
+ $byConstructor = $this->byConstructor;
+ $this->byConstructor = $isRoot || $byConstructor;
+ $this->processValue($value->getFactory());
+ $this->processValue($value->getArguments());
+
+ $properties = $value->getProperties();
+ $setters = $value->getMethodCalls();
+
+ // Any references before a "wither" are part of the constructor-instantiation graph
+ $lastWitherIndex = null;
+ foreach ($setters as $k => $call) {
+ if ($call[2] ?? false) {
+ $lastWitherIndex = $k;
+ }
+ }
+
+ if (null !== $lastWitherIndex) {
+ $this->processValue($properties);
+ $setters = $properties = [];
+
+ foreach ($value->getMethodCalls() as $k => $call) {
+ if (null === $lastWitherIndex) {
+ $setters[] = $call;
+ continue;
+ }
+
+ if ($lastWitherIndex === $k) {
+ $lastWitherIndex = null;
+ }
+
+ $this->processValue($call);
+ }
+ }
+
+ $this->byConstructor = $byConstructor;
+
+ if (!$this->onlyConstructorArguments) {
+ $this->processValue($properties);
+ $this->processValue($setters);
+ $this->processValue($value->getConfigurator());
+ }
+ $this->lazy = $lazy;
+
+ return $value;
+ }
+
+ private function getDefinitionId(string $id): ?string
+ {
+ while (isset($this->aliases[$id])) {
+ $id = (string) $this->aliases[$id];
+ }
+
+ return isset($this->definitions[$id]) ? $id : null;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php
new file mode 100644
index 0000000..0342068
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutoAliasServicePass.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * Sets a service to be an alias of another one, given a format pattern.
+ */
+class AutoAliasServicePass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) {
+ foreach ($tags as $tag) {
+ if (!isset($tag['format'])) {
+ throw new InvalidArgumentException(sprintf('Missing tag information "format" on auto_alias service "%s".', $serviceId));
+ }
+
+ $aliasId = $container->getParameterBag()->resolveValue($tag['format']);
+ if ($container->hasDefinition($aliasId) || $container->hasAlias($aliasId)) {
+ $container->setAlias($serviceId, new Alias($aliasId, true));
+ }
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowirePass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowirePass.php
new file mode 100644
index 0000000..8d46fd6
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowirePass.php
@@ -0,0 +1,475 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\Config\Resource\ClassExistenceResource;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\AutowiringFailedException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper;
+use Symfony\Component\DependencyInjection\TypedReference;
+
+/**
+ * Inspects existing service definitions and wires the autowired ones using the type hints of their classes.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class AutowirePass extends AbstractRecursivePass
+{
+ private $types;
+ private $ambiguousServiceTypes;
+ private $lastFailure;
+ private $throwOnAutowiringException;
+ private $decoratedClass;
+ private $decoratedId;
+ private $methodCalls;
+ private $getPreviousValue;
+ private $decoratedMethodIndex;
+ private $decoratedMethodArgumentIndex;
+ private $typesClone;
+
+ public function __construct(bool $throwOnAutowireException = true)
+ {
+ $this->throwOnAutowiringException = $throwOnAutowireException;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ try {
+ $this->typesClone = clone $this;
+ parent::process($container);
+ } finally {
+ $this->decoratedClass = null;
+ $this->decoratedId = null;
+ $this->methodCalls = null;
+ $this->getPreviousValue = null;
+ $this->decoratedMethodIndex = null;
+ $this->decoratedMethodArgumentIndex = null;
+ $this->typesClone = null;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ try {
+ return $this->doProcessValue($value, $isRoot);
+ } catch (AutowiringFailedException $e) {
+ if ($this->throwOnAutowiringException) {
+ throw $e;
+ }
+
+ $this->container->getDefinition($this->currentId)->addError($e->getMessageCallback() ?? $e->getMessage());
+
+ return parent::processValue($value, $isRoot);
+ }
+ }
+
+ /**
+ * @return mixed
+ */
+ private function doProcessValue($value, bool $isRoot = false)
+ {
+ if ($value instanceof TypedReference) {
+ if ($ref = $this->getAutowiredReference($value)) {
+ return $ref;
+ }
+ if (ContainerBuilder::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $value->getInvalidBehavior()) {
+ $message = $this->createTypeNotFoundMessageCallback($value, 'it');
+
+ // since the error message varies by referenced id and $this->currentId, so should the id of the dummy errored definition
+ $this->container->register($id = sprintf('.errored.%s.%s', $this->currentId, (string) $value), $value->getType())
+ ->addError($message);
+
+ return new TypedReference($id, $value->getType(), $value->getInvalidBehavior(), $value->getName());
+ }
+ }
+ $value = parent::processValue($value, $isRoot);
+
+ if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
+ return $value;
+ }
+ if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) {
+ $this->container->log($this, sprintf('Skipping service "%s": Class or interface "%s" cannot be loaded.', $this->currentId, $value->getClass()));
+
+ return $value;
+ }
+
+ $this->methodCalls = $value->getMethodCalls();
+
+ try {
+ $constructor = $this->getConstructor($value, false);
+ } catch (RuntimeException $e) {
+ throw new AutowiringFailedException($this->currentId, $e->getMessage(), 0, $e);
+ }
+
+ if ($constructor) {
+ array_unshift($this->methodCalls, [$constructor, $value->getArguments()]);
+ }
+
+ $this->methodCalls = $this->autowireCalls($reflectionClass, $isRoot);
+
+ if ($constructor) {
+ list(, $arguments) = array_shift($this->methodCalls);
+
+ if ($arguments !== $value->getArguments()) {
+ $value->setArguments($arguments);
+ }
+ }
+
+ if ($this->methodCalls !== $value->getMethodCalls()) {
+ $value->setMethodCalls($this->methodCalls);
+ }
+
+ return $value;
+ }
+
+ private function autowireCalls(\ReflectionClass $reflectionClass, bool $isRoot): array
+ {
+ $this->decoratedId = null;
+ $this->decoratedClass = null;
+ $this->getPreviousValue = null;
+
+ if ($isRoot && ($definition = $this->container->getDefinition($this->currentId)) && $this->container->has($this->decoratedId = $definition->innerServiceId)) {
+ $this->decoratedClass = $this->container->findDefinition($this->decoratedId)->getClass();
+ }
+
+ foreach ($this->methodCalls as $i => $call) {
+ $this->decoratedMethodIndex = $i;
+ list($method, $arguments) = $call;
+
+ if ($method instanceof \ReflectionFunctionAbstract) {
+ $reflectionMethod = $method;
+ } else {
+ $definition = new Definition($reflectionClass->name);
+ try {
+ $reflectionMethod = $this->getReflectionMethod($definition, $method);
+ } catch (RuntimeException $e) {
+ if ($definition->getFactory()) {
+ continue;
+ }
+ throw $e;
+ }
+ }
+
+ $arguments = $this->autowireMethod($reflectionMethod, $arguments);
+
+ if ($arguments !== $call[1]) {
+ $this->methodCalls[$i][1] = $arguments;
+ }
+ }
+
+ return $this->methodCalls;
+ }
+
+ /**
+ * Autowires the constructor or a method.
+ *
+ * @return array The autowired arguments
+ *
+ * @throws AutowiringFailedException
+ */
+ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, array $arguments): array
+ {
+ $class = $reflectionMethod instanceof \ReflectionMethod ? $reflectionMethod->class : $this->currentId;
+ $method = $reflectionMethod->name;
+ $parameters = $reflectionMethod->getParameters();
+ if ($reflectionMethod->isVariadic()) {
+ array_pop($parameters);
+ }
+
+ foreach ($parameters as $index => $parameter) {
+ if (\array_key_exists($index, $arguments) && '' !== $arguments[$index]) {
+ continue;
+ }
+
+ $type = ProxyHelper::getTypeHint($reflectionMethod, $parameter, true);
+
+ if (!$type) {
+ if (isset($arguments[$index])) {
+ continue;
+ }
+
+ // no default value? Then fail
+ if (!$parameter->isDefaultValueAvailable()) {
+ // For core classes, isDefaultValueAvailable() can
+ // be false when isOptional() returns true. If the
+ // argument *is* optional, allow it to be missing
+ if ($parameter->isOptional()) {
+ continue;
+ }
+ $type = ProxyHelper::getTypeHint($reflectionMethod, $parameter, false);
+ $type = $type ? sprintf('is type-hinted "%s"', ltrim($type, '\\')) : 'has no type-hint';
+
+ throw new AutowiringFailedException($this->currentId, sprintf('Cannot autowire service "%s": argument "$%s" of method "%s()" %s, you should configure its value explicitly.', $this->currentId, $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method, $type));
+ }
+
+ // specifically pass the default value
+ $arguments[$index] = $parameter->getDefaultValue();
+
+ continue;
+ }
+
+ $getValue = function () use ($type, $parameter, $class, $method) {
+ if (!$value = $this->getAutowiredReference($ref = new TypedReference($type, $type, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $parameter->name))) {
+ $failureMessage = $this->createTypeNotFoundMessageCallback($ref, sprintf('argument "$%s" of method "%s()"', $parameter->name, $class !== $this->currentId ? $class.'::'.$method : $method));
+
+ if ($parameter->isDefaultValueAvailable()) {
+ $value = $parameter->getDefaultValue();
+ } elseif (!$parameter->allowsNull()) {
+ throw new AutowiringFailedException($this->currentId, $failureMessage);
+ }
+ }
+
+ return $value;
+ };
+
+ if ($this->decoratedClass && $isDecorated = is_a($this->decoratedClass, $type, true)) {
+ if ($this->getPreviousValue) {
+ // The inner service is injected only if there is only 1 argument matching the type of the decorated class
+ // across all arguments of all autowired methods.
+ // If a second matching argument is found, the default behavior is restored.
+
+ $getPreviousValue = $this->getPreviousValue;
+ $this->methodCalls[$this->decoratedMethodIndex][1][$this->decoratedMethodArgumentIndex] = $getPreviousValue();
+ $this->decoratedClass = null; // Prevent further checks
+ } else {
+ $arguments[$index] = new TypedReference($this->decoratedId, $this->decoratedClass);
+ $this->getPreviousValue = $getValue;
+ $this->decoratedMethodArgumentIndex = $index;
+
+ continue;
+ }
+ }
+
+ $arguments[$index] = $getValue();
+ }
+
+ if ($parameters && !isset($arguments[++$index])) {
+ while (0 <= --$index) {
+ $parameter = $parameters[$index];
+ if (!$parameter->isDefaultValueAvailable() || $parameter->getDefaultValue() !== $arguments[$index]) {
+ break;
+ }
+ unset($arguments[$index]);
+ }
+ }
+
+ // it's possible index 1 was set, then index 0, then 2, etc
+ // make sure that we re-order so they're injected as expected
+ ksort($arguments);
+
+ return $arguments;
+ }
+
+ /**
+ * Returns a reference to the service matching the given type, if any.
+ */
+ private function getAutowiredReference(TypedReference $reference): ?TypedReference
+ {
+ $this->lastFailure = null;
+ $type = $reference->getType();
+
+ if ($type !== (string) $reference) {
+ return $reference;
+ }
+
+ if (null !== $name = $reference->getName()) {
+ if ($this->container->has($alias = $type.' $'.$name) && !$this->container->findDefinition($alias)->isAbstract()) {
+ return new TypedReference($alias, $type, $reference->getInvalidBehavior());
+ }
+
+ if ($this->container->has($name) && !$this->container->findDefinition($name)->isAbstract()) {
+ foreach ($this->container->getAliases() as $id => $alias) {
+ if ($name === (string) $alias && 0 === strpos($id, $type.' $')) {
+ return new TypedReference($name, $type, $reference->getInvalidBehavior());
+ }
+ }
+ }
+ }
+
+ if ($this->container->has($type) && !$this->container->findDefinition($type)->isAbstract()) {
+ return new TypedReference($type, $type, $reference->getInvalidBehavior());
+ }
+
+ return null;
+ }
+
+ /**
+ * Populates the list of available types.
+ */
+ private function populateAvailableTypes(ContainerBuilder $container)
+ {
+ $this->types = [];
+ $this->ambiguousServiceTypes = [];
+
+ foreach ($container->getDefinitions() as $id => $definition) {
+ $this->populateAvailableType($container, $id, $definition);
+ }
+ }
+
+ /**
+ * Populates the list of available types for a given definition.
+ */
+ private function populateAvailableType(ContainerBuilder $container, string $id, Definition $definition)
+ {
+ // Never use abstract services
+ if ($definition->isAbstract()) {
+ return;
+ }
+
+ if ('' === $id || '.' === $id[0] || $definition->isDeprecated() || !$reflectionClass = $container->getReflectionClass($definition->getClass(), false)) {
+ return;
+ }
+
+ foreach ($reflectionClass->getInterfaces() as $reflectionInterface) {
+ $this->set($reflectionInterface->name, $id);
+ }
+
+ do {
+ $this->set($reflectionClass->name, $id);
+ } while ($reflectionClass = $reflectionClass->getParentClass());
+ }
+
+ /**
+ * Associates a type and a service id if applicable.
+ */
+ private function set(string $type, string $id)
+ {
+ // is this already a type/class that is known to match multiple services?
+ if (isset($this->ambiguousServiceTypes[$type])) {
+ $this->ambiguousServiceTypes[$type][] = $id;
+
+ return;
+ }
+
+ // check to make sure the type doesn't match multiple services
+ if (!isset($this->types[$type]) || $this->types[$type] === $id) {
+ $this->types[$type] = $id;
+
+ return;
+ }
+
+ // keep an array of all services matching this type
+ if (!isset($this->ambiguousServiceTypes[$type])) {
+ $this->ambiguousServiceTypes[$type] = [$this->types[$type]];
+ unset($this->types[$type]);
+ }
+ $this->ambiguousServiceTypes[$type][] = $id;
+ }
+
+ private function createTypeNotFoundMessageCallback(TypedReference $reference, string $label): callable
+ {
+ if (null === $this->typesClone->container) {
+ $this->typesClone->container = new ContainerBuilder($this->container->getParameterBag());
+ $this->typesClone->container->setAliases($this->container->getAliases());
+ $this->typesClone->container->setDefinitions($this->container->getDefinitions());
+ $this->typesClone->container->setResourceTracking(false);
+ }
+ $currentId = $this->currentId;
+
+ return (function () use ($reference, $label, $currentId) {
+ return $this->createTypeNotFoundMessage($reference, $label, $currentId);
+ })->bindTo($this->typesClone);
+ }
+
+ private function createTypeNotFoundMessage(TypedReference $reference, string $label, string $currentId): string
+ {
+ if (!$r = $this->container->getReflectionClass($type = $reference->getType(), false)) {
+ // either $type does not exist or a parent class does not exist
+ try {
+ $resource = new ClassExistenceResource($type, false);
+ // isFresh() will explode ONLY if a parent class/trait does not exist
+ $resource->isFresh(0);
+ $parentMsg = false;
+ } catch (\ReflectionException $e) {
+ $parentMsg = $e->getMessage();
+ }
+
+ $message = sprintf('has type "%s" but this class %s.', $type, $parentMsg ? sprintf('is missing a parent class (%s)', $parentMsg) : 'was not found');
+ } else {
+ $alternatives = $this->createTypeAlternatives($this->container, $reference);
+ $message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists';
+ $message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $alternatives);
+
+ if ($r->isInterface() && !$alternatives) {
+ $message .= ' Did you create a class that implements this interface?';
+ }
+ }
+
+ $message = sprintf('Cannot autowire service "%s": %s %s', $currentId, $label, $message);
+
+ if (null !== $this->lastFailure) {
+ $message = $this->lastFailure."\n".$message;
+ $this->lastFailure = null;
+ }
+
+ return $message;
+ }
+
+ private function createTypeAlternatives(ContainerBuilder $container, TypedReference $reference): string
+ {
+ // try suggesting available aliases first
+ if ($message = $this->getAliasesSuggestionForType($container, $type = $reference->getType())) {
+ return ' '.$message;
+ }
+ if (null === $this->ambiguousServiceTypes) {
+ $this->populateAvailableTypes($container);
+ }
+
+ $servicesAndAliases = $container->getServiceIds();
+ if (!$container->has($type) && false !== $key = array_search(strtolower($type), array_map('strtolower', $servicesAndAliases))) {
+ return sprintf(' Did you mean "%s"?', $servicesAndAliases[$key]);
+ } elseif (isset($this->ambiguousServiceTypes[$type])) {
+ $message = sprintf('one of these existing services: "%s"', implode('", "', $this->ambiguousServiceTypes[$type]));
+ } elseif (isset($this->types[$type])) {
+ $message = sprintf('the existing "%s" service', $this->types[$type]);
+ } else {
+ return '';
+ }
+
+ return sprintf(' You should maybe alias this %s to %s.', class_exists($type, false) ? 'class' : 'interface', $message);
+ }
+
+ private function getAliasesSuggestionForType(ContainerBuilder $container, string $type): ?string
+ {
+ $aliases = [];
+ foreach (class_parents($type) + class_implements($type) as $parent) {
+ if ($container->has($parent) && !$container->findDefinition($parent)->isAbstract()) {
+ $aliases[] = $parent;
+ }
+ }
+
+ if (1 < $len = \count($aliases)) {
+ $message = 'Try changing the type-hint to one of its parents: ';
+ for ($i = 0, --$len; $i < $len; ++$i) {
+ $message .= sprintf('%s "%s", ', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]);
+ }
+ $message .= sprintf('or %s "%s".', class_exists($aliases[$i], false) ? 'class' : 'interface', $aliases[$i]);
+
+ return $message;
+ }
+
+ if ($aliases) {
+ return sprintf('Try changing the type-hint to "%s" instead.', $aliases[0]);
+ }
+
+ return null;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php
new file mode 100644
index 0000000..20d3113
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/AutowireRequiredMethodsPass.php
@@ -0,0 +1,84 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Looks for definitions with autowiring enabled and registers their corresponding "@required" methods as setters.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class AutowireRequiredMethodsPass extends AbstractRecursivePass
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ $value = parent::processValue($value, $isRoot);
+
+ if (!$value instanceof Definition || !$value->isAutowired() || $value->isAbstract() || !$value->getClass()) {
+ return $value;
+ }
+ if (!$reflectionClass = $this->container->getReflectionClass($value->getClass(), false)) {
+ return $value;
+ }
+
+ $alreadyCalledMethods = [];
+ $withers = [];
+
+ foreach ($value->getMethodCalls() as list($method)) {
+ $alreadyCalledMethods[strtolower($method)] = true;
+ }
+
+ foreach ($reflectionClass->getMethods() as $reflectionMethod) {
+ $r = $reflectionMethod;
+
+ if ($r->isConstructor() || isset($alreadyCalledMethods[strtolower($r->name)])) {
+ continue;
+ }
+
+ while (true) {
+ if (false !== $doc = $r->getDocComment()) {
+ if (false !== stripos($doc, '@required') && preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) {
+ if (preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@return\s++static[\s\*]#i', $doc)) {
+ $withers[] = [$reflectionMethod->name, [], true];
+ } else {
+ $value->addMethodCall($reflectionMethod->name, []);
+ }
+ break;
+ }
+ if (false === stripos($doc, '@inheritdoc') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+(?:\{@inheritdoc\}|@inheritdoc)(?:\s|\*/$)#i', $doc)) {
+ break;
+ }
+ }
+ try {
+ $r = $r->getPrototype();
+ } catch (\ReflectionException $e) {
+ break; // method has no prototype
+ }
+ }
+ }
+
+ if ($withers) {
+ // Prepend withers to prevent creating circular loops
+ $setters = $value->getMethodCalls();
+ $value->setMethodCalls($withers);
+ foreach ($setters as $call) {
+ $value->addMethodCall($call[0], $call[1], $call[2] ?? false);
+ }
+ }
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php
new file mode 100644
index 0000000..d289c05
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckArgumentsValidityPass.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * Checks if arguments of methods are properly configured.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CheckArgumentsValidityPass extends AbstractRecursivePass
+{
+ private $throwExceptions;
+
+ public function __construct(bool $throwExceptions = true)
+ {
+ $this->throwExceptions = $throwExceptions;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Definition) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $i = 0;
+ foreach ($value->getArguments() as $k => $v) {
+ if ($k !== $i++) {
+ if (!\is_int($k)) {
+ $msg = sprintf('Invalid constructor argument for service "%s": integer expected but found string "%s". Check your service definition.', $this->currentId, $k);
+ $value->addError($msg);
+ if ($this->throwExceptions) {
+ throw new RuntimeException($msg);
+ }
+
+ break;
+ }
+
+ $msg = sprintf('Invalid constructor argument %d for service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $this->currentId, $i);
+ $value->addError($msg);
+ if ($this->throwExceptions) {
+ throw new RuntimeException($msg);
+ }
+ }
+ }
+
+ foreach ($value->getMethodCalls() as $methodCall) {
+ $i = 0;
+ foreach ($methodCall[1] as $k => $v) {
+ if ($k !== $i++) {
+ if (!\is_int($k)) {
+ $msg = sprintf('Invalid argument for method call "%s" of service "%s": integer expected but found string "%s". Check your service definition.', $methodCall[0], $this->currentId, $k);
+ $value->addError($msg);
+ if ($this->throwExceptions) {
+ throw new RuntimeException($msg);
+ }
+
+ break;
+ }
+
+ $msg = sprintf('Invalid argument %d for method call "%s" of service "%s": argument %d must be defined before. Check your service definition.', 1 + $k, $methodCall[0], $this->currentId, $i);
+ $value->addError($msg);
+ if ($this->throwExceptions) {
+ throw new RuntimeException($msg);
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php
new file mode 100644
index 0000000..55d911c
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckCircularReferencesPass.php
@@ -0,0 +1,78 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+
+/**
+ * Checks your services for circular references.
+ *
+ * References from method calls are ignored since we might be able to resolve
+ * these references depending on the order in which services are called.
+ *
+ * Circular reference from method calls will only be detected at run-time.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckCircularReferencesPass implements CompilerPassInterface
+{
+ private $currentPath;
+ private $checkedNodes;
+
+ /**
+ * Checks the ContainerBuilder object for circular references.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $graph = $container->getCompiler()->getServiceReferenceGraph();
+
+ $this->checkedNodes = [];
+ foreach ($graph->getNodes() as $id => $node) {
+ $this->currentPath = [$id];
+
+ $this->checkOutEdges($node->getOutEdges());
+ }
+ }
+
+ /**
+ * Checks for circular references.
+ *
+ * @param ServiceReferenceGraphEdge[] $edges An array of Edges
+ *
+ * @throws ServiceCircularReferenceException when a circular reference is found
+ */
+ private function checkOutEdges(array $edges)
+ {
+ foreach ($edges as $edge) {
+ $node = $edge->getDestNode();
+ $id = $node->getId();
+
+ if (empty($this->checkedNodes[$id])) {
+ // Don't check circular references for lazy edges
+ if (!$node->getValue() || (!$edge->isLazy() && !$edge->isWeak())) {
+ $searchKey = array_search($id, $this->currentPath);
+ $this->currentPath[] = $id;
+
+ if (false !== $searchKey) {
+ throw new ServiceCircularReferenceException($id, \array_slice($this->currentPath, $searchKey));
+ }
+
+ $this->checkOutEdges($node->getOutEdges());
+ }
+
+ $this->checkedNodes[$id] = true;
+ array_pop($this->currentPath);
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php
new file mode 100644
index 0000000..bb87f47
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckDefinitionValidityPass.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Loader\FileLoader;
+
+/**
+ * This pass validates each definition individually only taking the information
+ * into account which is contained in the definition itself.
+ *
+ * Later passes can rely on the following, and specifically do not need to
+ * perform these checks themselves:
+ *
+ * - non synthetic, non abstract services always have a class set
+ * - synthetic services are always public
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckDefinitionValidityPass implements CompilerPassInterface
+{
+ /**
+ * Processes the ContainerBuilder to validate the Definition.
+ *
+ * @throws RuntimeException When the Definition is invalid
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getDefinitions() as $id => $definition) {
+ // synthetic service is public
+ if ($definition->isSynthetic() && !$definition->isPublic()) {
+ throw new RuntimeException(sprintf('A synthetic service ("%s") must be public.', $id));
+ }
+
+ // non-synthetic, non-abstract service has class
+ if (!$definition->isAbstract() && !$definition->isSynthetic() && !$definition->getClass() && (!$definition->getFactory() || !preg_match(FileLoader::ANONYMOUS_ID_REGEXP, $id))) {
+ if ($definition->getFactory()) {
+ throw new RuntimeException(sprintf('Please add the class to service "%s" even if it is constructed by a factory since we might need to add method calls based on compile-time checks.', $id));
+ }
+ if (class_exists($id) || interface_exists($id, false)) {
+ if (0 === strpos($id, '\\') && 1 < substr_count($id, '\\')) {
+ throw new RuntimeException(sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface. Please specify the class attribute explicitly or remove the leading backslash by renaming the service to "%s" to get rid of this error.', $id, substr($id, 1)));
+ }
+
+ throw new RuntimeException(sprintf('The definition for "%s" has no class attribute, and appears to reference a class or interface in the global namespace. Leaving out the "class" attribute is only allowed for namespaced classes. Please specify the class attribute explicitly to get rid of this error.', $id));
+ }
+
+ throw new RuntimeException(sprintf('The definition for "%s" has no class. If you intend to inject this service dynamically at runtime, please mark it as synthetic=true. If this is an abstract definition solely used by child definitions, please add abstract=true, otherwise specify a class to get rid of this error.', $id));
+ }
+
+ // tag attribute values must be scalars
+ foreach ($definition->getTags() as $name => $tags) {
+ foreach ($tags as $attributes) {
+ foreach ($attributes as $attribute => $value) {
+ if (!is_scalar($value) && null !== $value) {
+ throw new RuntimeException(sprintf('A "tags" attribute must be of a scalar-type for service "%s", tag "%s", attribute "%s".', $id, $name, $attribute));
+ }
+ }
+ }
+ }
+
+ if ($definition->isPublic() && !$definition->isPrivate()) {
+ $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
+ if (null !== $usedEnvs) {
+ throw new EnvParameterException([$resolvedId], null, 'A service name ("%s") cannot contain dynamic values.');
+ }
+ }
+ }
+
+ foreach ($container->getAliases() as $id => $alias) {
+ if ($alias->isPublic() && !$alias->isPrivate()) {
+ $resolvedId = $container->resolveEnvPlaceholders($id, null, $usedEnvs);
+ if (null !== $usedEnvs) {
+ throw new EnvParameterException([$resolvedId], null, 'An alias name ("%s") cannot contain dynamic values.');
+ }
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
new file mode 100644
index 0000000..eef7158
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckExceptionOnInvalidReferenceBehaviorPass.php
@@ -0,0 +1,88 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Checks that all references are pointing to a valid service.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckExceptionOnInvalidReferenceBehaviorPass extends AbstractRecursivePass
+{
+ private $serviceLocatorContextIds = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->serviceLocatorContextIds = [];
+ foreach ($container->findTaggedServiceIds('container.service_locator_context') as $id => $tags) {
+ $this->serviceLocatorContextIds[$id] = $tags[0]['id'];
+ $container->getDefinition($id)->clearTag('container.service_locator_context');
+ }
+
+ try {
+ return parent::process($container);
+ } finally {
+ $this->serviceLocatorContextIds = [];
+ }
+ }
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Reference) {
+ return parent::processValue($value, $isRoot);
+ }
+ if (ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $value->getInvalidBehavior() || $this->container->has($id = (string) $value)) {
+ return $value;
+ }
+
+ $currentId = $this->currentId;
+ $graph = $this->container->getCompiler()->getServiceReferenceGraph();
+
+ if (isset($this->serviceLocatorContextIds[$currentId])) {
+ $currentId = $this->serviceLocatorContextIds[$currentId];
+ $locator = $this->container->getDefinition($this->currentId)->getFactory()[0];
+
+ foreach ($locator->getArgument(0) as $k => $v) {
+ if ($v->getValues()[0] === $value) {
+ if ($k !== $id) {
+ $currentId = $k.'" in the container provided to "'.$currentId;
+ }
+ throw new ServiceNotFoundException($id, $currentId);
+ }
+ }
+ }
+
+ if ('.' === $currentId[0] && $graph->hasNode($currentId)) {
+ foreach ($graph->getNode($currentId)->getInEdges() as $edge) {
+ if (!$edge->getValue() instanceof Reference || ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE < $edge->getValue()->getInvalidBehavior()) {
+ continue;
+ }
+ $sourceId = $edge->getSourceNode()->getId();
+
+ if ('.' !== $sourceId[0]) {
+ $currentId = $sourceId;
+ break;
+ }
+ }
+ }
+
+ throw new ServiceNotFoundException($id, $currentId);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php
new file mode 100644
index 0000000..8f2a3bd
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckReferenceValidityPass.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Checks the validity of references.
+ *
+ * The following checks are performed by this pass:
+ * - target definitions are not abstract
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class CheckReferenceValidityPass extends AbstractRecursivePass
+{
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($isRoot && $value instanceof Definition && ($value->isSynthetic() || $value->isAbstract())) {
+ return $value;
+ }
+ if ($value instanceof Reference && $this->container->hasDefinition((string) $value)) {
+ $targetDefinition = $this->container->getDefinition((string) $value);
+
+ if ($targetDefinition->isAbstract()) {
+ throw new RuntimeException(sprintf('The definition "%s" has a reference to an abstract definition "%s". Abstract definitions cannot be the target of references.', $this->currentId, $value));
+ }
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php
new file mode 100644
index 0000000..0743cbb
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CheckTypeDeclarationsPass.php
@@ -0,0 +1,245 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
+use Symfony\Component\DependencyInjection\Container;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\InvalidParameterTypeException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\ExpressionLanguage;
+use Symfony\Component\DependencyInjection\Parameter;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+use Symfony\Component\ExpressionLanguage\Expression;
+
+/**
+ * Checks whether injected parameters are compatible with type declarations.
+ *
+ * This pass should be run after all optimization passes.
+ *
+ * It can be added either:
+ * * before removing passes to check all services even if they are not currently used,
+ * * after removing passes to check only services are used in the app.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ * @author Julien Maulny <jmaulny@darkmira.fr>
+ */
+final class CheckTypeDeclarationsPass extends AbstractRecursivePass
+{
+ private const SCALAR_TYPES = ['int', 'float', 'bool', 'string'];
+
+ private $autoload;
+ private $skippedIds;
+
+ private $expressionLanguage;
+
+ /**
+ * @param bool $autoload Whether services who's class in not loaded should be checked or not.
+ * Defaults to false to save loading code during compilation.
+ * @param array $skippedIds An array indexed by the service ids to skip
+ */
+ public function __construct(bool $autoload = false, array $skippedIds = [])
+ {
+ $this->autoload = $autoload;
+ $this->skippedIds = $skippedIds;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (isset($this->skippedIds[$this->currentId])) {
+ return $value;
+ }
+
+ if (!$value instanceof Definition || $value->hasErrors()) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if (!$this->autoload && !class_exists($class = $value->getClass(), false) && !interface_exists($class, false)) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if (ServiceLocator::class === $value->getClass()) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if ($constructor = $this->getConstructor($value, false)) {
+ $this->checkTypeDeclarations($value, $constructor, $value->getArguments());
+ }
+
+ foreach ($value->getMethodCalls() as $methodCall) {
+ try {
+ $reflectionMethod = $this->getReflectionMethod($value, $methodCall[0]);
+ } catch (RuntimeException $e) {
+ if ($value->getFactory()) {
+ continue;
+ }
+
+ throw $e;
+ }
+
+ $this->checkTypeDeclarations($value, $reflectionMethod, $methodCall[1]);
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ /**
+ * @throws InvalidArgumentException When not enough parameters are defined for the method
+ */
+ private function checkTypeDeclarations(Definition $checkedDefinition, \ReflectionFunctionAbstract $reflectionFunction, array $values): void
+ {
+ $numberOfRequiredParameters = $reflectionFunction->getNumberOfRequiredParameters();
+
+ if (\count($values) < $numberOfRequiredParameters) {
+ throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": "%s::%s()" requires %d arguments, %d passed.', $this->currentId, $reflectionFunction->class, $reflectionFunction->name, $numberOfRequiredParameters, \count($values)));
+ }
+
+ $reflectionParameters = $reflectionFunction->getParameters();
+ $checksCount = min($reflectionFunction->getNumberOfParameters(), \count($values));
+
+ $envPlaceholderUniquePrefix = $this->container->getParameterBag() instanceof EnvPlaceholderParameterBag ? $this->container->getParameterBag()->getEnvPlaceholderUniquePrefix() : null;
+
+ for ($i = 0; $i < $checksCount; ++$i) {
+ if (!$reflectionParameters[$i]->hasType() || $reflectionParameters[$i]->isVariadic()) {
+ continue;
+ }
+
+ $this->checkType($checkedDefinition, $values[$i], $reflectionParameters[$i], $envPlaceholderUniquePrefix);
+ }
+
+ if ($reflectionFunction->isVariadic() && ($lastParameter = end($reflectionParameters))->hasType()) {
+ $variadicParameters = \array_slice($values, $lastParameter->getPosition());
+
+ foreach ($variadicParameters as $variadicParameter) {
+ $this->checkType($checkedDefinition, $variadicParameter, $lastParameter, $envPlaceholderUniquePrefix);
+ }
+ }
+ }
+
+ /**
+ * @throws InvalidParameterTypeException When a parameter is not compatible with the declared type
+ */
+ private function checkType(Definition $checkedDefinition, $value, \ReflectionParameter $parameter, ?string $envPlaceholderUniquePrefix): void
+ {
+ $type = $parameter->getType()->getName();
+
+ if ($value instanceof Reference) {
+ if (!$this->container->has($value = (string) $value)) {
+ return;
+ }
+
+ if ('service_container' === $value && is_a($type, Container::class, true)) {
+ return;
+ }
+
+ $value = $this->container->findDefinition($value);
+ }
+
+ if ('self' === $type) {
+ $type = $parameter->getDeclaringClass()->getName();
+ }
+
+ if ('static' === $type) {
+ $type = $checkedDefinition->getClass();
+ }
+
+ if ($value instanceof Definition) {
+ $class = $value->getClass();
+
+ if (!$class || (!$this->autoload && !class_exists($class, false) && !interface_exists($class, false))) {
+ return;
+ }
+
+ if ('callable' === $type && method_exists($class, '__invoke')) {
+ return;
+ }
+
+ if ('iterable' === $type && is_subclass_of($class, 'Traversable')) {
+ return;
+ }
+
+ if ('object' === $type) {
+ return;
+ }
+
+ if (is_a($class, $type, true)) {
+ return;
+ }
+
+ throw new InvalidParameterTypeException($this->currentId, $class, $parameter);
+ }
+
+ if ($value instanceof Parameter) {
+ $value = $this->container->getParameter($value);
+ } elseif ($value instanceof Expression) {
+ $value = $this->getExpressionLanguage()->evaluate($value, ['container' => $this->container]);
+ } elseif (\is_string($value)) {
+ if ('%' === ($value[0] ?? '') && preg_match('/^%([^%]+)%$/', $value, $match)) {
+ // Only array parameters are not inlined when dumped.
+ $value = [];
+ } elseif ($envPlaceholderUniquePrefix && false !== strpos($value, 'env_')) {
+ // If the value is an env placeholder that is either mixed with a string or with another env placeholder, then its resolved value will always be a string, so we don't need to resolve it.
+ // We don't need to change the value because it is already a string.
+ if ('' === preg_replace('/'.$envPlaceholderUniquePrefix.'_\w+_[a-f0-9]{32}/U', '', $value, -1, $c) && 1 === $c) {
+ try {
+ $value = $this->container->resolveEnvPlaceholders($value, true);
+ } catch (EnvNotFoundException | RuntimeException $e) {
+ // If an env placeholder cannot be resolved, we skip the validation.
+ return;
+ }
+ }
+ }
+ }
+
+ if (null === $value && $parameter->allowsNull()) {
+ return;
+ }
+
+ if (\in_array($type, self::SCALAR_TYPES, true) && is_scalar($value)) {
+ return;
+ }
+
+ if ('callable' === $type && \is_array($value) && isset($value[0]) && ($value[0] instanceof Reference || $value[0] instanceof Definition)) {
+ return;
+ }
+
+ if ('iterable' === $type && (\is_array($value) || $value instanceof \Traversable || $value instanceof IteratorArgument)) {
+ return;
+ }
+
+ if ('Traversable' === $type && ($value instanceof \Traversable || $value instanceof IteratorArgument)) {
+ return;
+ }
+
+ $checkFunction = sprintf('is_%s', $parameter->getType()->getName());
+
+ if (!$parameter->getType()->isBuiltin() || !$checkFunction($value)) {
+ throw new InvalidParameterTypeException($this->currentId, \is_object($value) ? \get_class($value) : \gettype($value), $parameter);
+ }
+ }
+
+ private function getExpressionLanguage(): ExpressionLanguage
+ {
+ if (null === $this->expressionLanguage) {
+ $this->expressionLanguage = new ExpressionLanguage(null, $this->container->getExpressionLanguageProviders());
+ }
+
+ return $this->expressionLanguage;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/Compiler.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/Compiler.php
new file mode 100644
index 0000000..14dedf0
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/Compiler.php
@@ -0,0 +1,119 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\EnvParameterException;
+
+/**
+ * This class is used to remove circular dependencies between individual passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class Compiler
+{
+ private $passConfig;
+ private $log = [];
+ private $serviceReferenceGraph;
+
+ public function __construct()
+ {
+ $this->passConfig = new PassConfig();
+ $this->serviceReferenceGraph = new ServiceReferenceGraph();
+ }
+
+ /**
+ * Returns the PassConfig.
+ *
+ * @return PassConfig The PassConfig instance
+ */
+ public function getPassConfig()
+ {
+ return $this->passConfig;
+ }
+
+ /**
+ * Returns the ServiceReferenceGraph.
+ *
+ * @return ServiceReferenceGraph The ServiceReferenceGraph instance
+ */
+ public function getServiceReferenceGraph()
+ {
+ return $this->serviceReferenceGraph;
+ }
+
+ /**
+ * Adds a pass to the PassConfig.
+ *
+ * @param string $type The type of the pass
+ * @param int $priority Used to sort the passes
+ */
+ public function addPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
+ {
+ $this->passConfig->addPass($pass, $type, $priority);
+ }
+
+ /**
+ * @final
+ */
+ public function log(CompilerPassInterface $pass, string $message)
+ {
+ if (false !== strpos($message, "\n")) {
+ $message = str_replace("\n", "\n".\get_class($pass).': ', trim($message));
+ }
+
+ $this->log[] = \get_class($pass).': '.$message;
+ }
+
+ /**
+ * Returns the log.
+ *
+ * @return array Log array
+ */
+ public function getLog()
+ {
+ return $this->log;
+ }
+
+ /**
+ * Run the Compiler and process all Passes.
+ */
+ public function compile(ContainerBuilder $container)
+ {
+ try {
+ foreach ($this->passConfig->getPasses() as $pass) {
+ $pass->process($container);
+ }
+ } catch (\Exception $e) {
+ $usedEnvs = [];
+ $prev = $e;
+
+ do {
+ $msg = $prev->getMessage();
+
+ if ($msg !== $resolvedMsg = $container->resolveEnvPlaceholders($msg, null, $usedEnvs)) {
+ $r = new \ReflectionProperty($prev, 'message');
+ $r->setAccessible(true);
+ $r->setValue($prev, $resolvedMsg);
+ }
+ } while ($prev = $prev->getPrevious());
+
+ if ($usedEnvs) {
+ $e = new EnvParameterException($usedEnvs, $e);
+ }
+
+ throw $e;
+ } finally {
+ $this->getServiceReferenceGraph()->clear();
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php
new file mode 100644
index 0000000..3085006
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/CompilerPassInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Interface that must be implemented by compilation passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+interface CompilerPassInterface
+{
+ /**
+ * You can modify the container here before it is dumped to PHP code.
+ */
+ public function process(ContainerBuilder $container);
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php
new file mode 100644
index 0000000..da909ae
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DecoratorServicePass.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Overwrites a service but keeps the overridden one.
+ *
+ * @author Christophe Coevoet <stof@notk.org>
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Diego Saint Esteben <diego@saintesteben.me>
+ */
+class DecoratorServicePass implements CompilerPassInterface
+{
+ public function process(ContainerBuilder $container)
+ {
+ $definitions = new \SplPriorityQueue();
+ $order = PHP_INT_MAX;
+
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if (!$decorated = $definition->getDecoratedService()) {
+ continue;
+ }
+ $definitions->insert([$id, $definition], [$decorated[2], --$order]);
+ }
+ $decoratingDefinitions = [];
+
+ foreach ($definitions as list($id, $definition)) {
+ $decoratedService = $definition->getDecoratedService();
+ list($inner, $renamedId) = $decoratedService;
+ $invalidBehavior = $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
+
+ $definition->setDecoratedService(null);
+
+ if (!$renamedId) {
+ $renamedId = $id.'.inner';
+ }
+ $definition->innerServiceId = $renamedId;
+ $definition->decorationOnInvalid = $invalidBehavior;
+
+ // we create a new alias/service for the service we are replacing
+ // to be able to reference it in the new one
+ if ($container->hasAlias($inner)) {
+ $alias = $container->getAlias($inner);
+ $public = $alias->isPublic();
+ $private = $alias->isPrivate();
+ $container->setAlias($renamedId, new Alias((string) $alias, false));
+ } elseif ($container->hasDefinition($inner)) {
+ $decoratedDefinition = $container->getDefinition($inner);
+ $public = $decoratedDefinition->isPublic();
+ $private = $decoratedDefinition->isPrivate();
+ $decoratedDefinition->setPublic(false);
+ $container->setDefinition($renamedId, $decoratedDefinition);
+ $decoratingDefinitions[$inner] = $decoratedDefinition;
+ } elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
+ $container->removeDefinition($id);
+ continue;
+ } elseif (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
+ $public = $definition->isPublic();
+ $private = $definition->isPrivate();
+ } else {
+ throw new ServiceNotFoundException($inner, $id);
+ }
+
+ if (isset($decoratingDefinitions[$inner])) {
+ $decoratingDefinition = $decoratingDefinitions[$inner];
+ $definition->setTags(array_merge($decoratingDefinition->getTags(), $definition->getTags()));
+ $decoratingDefinition->setTags([]);
+ $decoratingDefinitions[$inner] = $definition;
+ }
+
+ $container->setAlias($inner, $id)->setPublic($public)->setPrivate($private);
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php
new file mode 100644
index 0000000..5ee0ff1
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Throws an exception for any Definitions that have errors and still exist.
+ *
+ * @author Ryan Weaver <ryan@knpuniversity.com>
+ */
+class DefinitionErrorExceptionPass extends AbstractRecursivePass
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Definition || !$value->hasErrors()) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if ($isRoot && !$value->isPublic()) {
+ $graph = $this->container->getCompiler()->getServiceReferenceGraph();
+ $runtimeException = false;
+ foreach ($graph->getNode($this->currentId)->getInEdges() as $edge) {
+ if (!$edge->getValue() instanceof Reference || ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE !== $edge->getValue()->getInvalidBehavior()) {
+ $runtimeException = false;
+ break;
+ }
+ $runtimeException = true;
+ }
+ if ($runtimeException) {
+ return parent::processValue($value, $isRoot);
+ }
+ }
+
+ // only show the first error so the user can focus on it
+ $errors = $value->getErrors();
+ $message = reset($errors);
+
+ throw new RuntimeException($message);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php
new file mode 100644
index 0000000..27e5048
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ExtensionCompilerPass.php
@@ -0,0 +1,37 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * A pass to automatically process extensions if they implement
+ * CompilerPassInterface.
+ *
+ * @author Wouter J <wouter@wouterj.nl>
+ */
+class ExtensionCompilerPass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getExtensions() as $extension) {
+ if (!$extension instanceof CompilerPassInterface) {
+ continue;
+ }
+
+ $extension->process($container);
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php
new file mode 100644
index 0000000..ac3b4fe
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/InlineServiceDefinitionsPass.php
@@ -0,0 +1,231 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Inline service definitions where this is possible.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class InlineServiceDefinitionsPass extends AbstractRecursivePass implements RepeatablePassInterface
+{
+ private $analyzingPass;
+ private $repeatedPass;
+ private $cloningIds = [];
+ private $connectedIds = [];
+ private $notInlinedIds = [];
+ private $inlinedIds = [];
+ private $graph;
+
+ public function __construct(AnalyzeServiceReferencesPass $analyzingPass = null)
+ {
+ $this->analyzingPass = $analyzingPass;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setRepeatedPass(RepeatedPass $repeatedPass)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED);
+ $this->repeatedPass = $repeatedPass;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ $this->container = $container;
+ if ($this->analyzingPass) {
+ $analyzedContainer = new ContainerBuilder();
+ $analyzedContainer->setAliases($container->getAliases());
+ $analyzedContainer->setDefinitions($container->getDefinitions());
+ foreach ($container->getExpressionLanguageProviders() as $provider) {
+ $analyzedContainer->addExpressionLanguageProvider($provider);
+ }
+ } else {
+ $analyzedContainer = $container;
+ }
+ try {
+ $remainingInlinedIds = [];
+ $this->connectedIds = $this->notInlinedIds = $container->getDefinitions();
+ do {
+ if ($this->analyzingPass) {
+ $analyzedContainer->setDefinitions(array_intersect_key($analyzedContainer->getDefinitions(), $this->connectedIds));
+ $this->analyzingPass->process($analyzedContainer);
+ }
+ $this->graph = $analyzedContainer->getCompiler()->getServiceReferenceGraph();
+ $notInlinedIds = $this->notInlinedIds;
+ $this->connectedIds = $this->notInlinedIds = $this->inlinedIds = [];
+
+ foreach ($analyzedContainer->getDefinitions() as $id => $definition) {
+ if (!$this->graph->hasNode($id)) {
+ continue;
+ }
+ foreach ($this->graph->getNode($id)->getOutEdges() as $edge) {
+ if (isset($notInlinedIds[$edge->getSourceNode()->getId()])) {
+ $this->currentId = $id;
+ $this->processValue($definition, true);
+ break;
+ }
+ }
+ }
+
+ foreach ($this->inlinedIds as $id => $isPublicOrNotShared) {
+ if ($isPublicOrNotShared) {
+ $remainingInlinedIds[$id] = $id;
+ } else {
+ $container->removeDefinition($id);
+ $analyzedContainer->removeDefinition($id);
+ }
+ }
+ } while ($this->inlinedIds && $this->analyzingPass);
+
+ if ($this->inlinedIds && $this->repeatedPass) {
+ $this->repeatedPass->setRepeat();
+ }
+
+ foreach ($remainingInlinedIds as $id) {
+ $definition = $container->getDefinition($id);
+
+ if (!$definition->isShared() && !$definition->isPublic()) {
+ $container->removeDefinition($id);
+ }
+ }
+ } finally {
+ $this->container = null;
+ $this->connectedIds = $this->notInlinedIds = $this->inlinedIds = [];
+ $this->graph = null;
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof ArgumentInterface) {
+ // Reference found in ArgumentInterface::getValues() are not inlineable
+ return $value;
+ }
+
+ if ($value instanceof Definition && $this->cloningIds) {
+ if ($value->isShared()) {
+ return $value;
+ }
+ $value = clone $value;
+ }
+
+ if (!$value instanceof Reference) {
+ return parent::processValue($value, $isRoot);
+ } elseif (!$this->container->hasDefinition($id = (string) $value)) {
+ return $value;
+ }
+
+ $definition = $this->container->getDefinition($id);
+
+ if (!$this->isInlineableDefinition($id, $definition)) {
+ return $value;
+ }
+
+ $this->container->log($this, sprintf('Inlined service "%s" to "%s".', $id, $this->currentId));
+ $this->inlinedIds[$id] = $definition->isPublic() || !$definition->isShared();
+ $this->notInlinedIds[$this->currentId] = true;
+
+ if ($definition->isShared()) {
+ return $definition;
+ }
+
+ if (isset($this->cloningIds[$id])) {
+ $ids = array_keys($this->cloningIds);
+ $ids[] = $id;
+
+ throw new ServiceCircularReferenceException($id, \array_slice($ids, array_search($id, $ids)));
+ }
+
+ $this->cloningIds[$id] = true;
+ try {
+ return $this->processValue($definition);
+ } finally {
+ unset($this->cloningIds[$id]);
+ }
+ }
+
+ /**
+ * Checks if the definition is inlineable.
+ */
+ private function isInlineableDefinition(string $id, Definition $definition): bool
+ {
+ if ($definition->hasErrors() || $definition->isDeprecated() || $definition->isLazy() || $definition->isSynthetic()) {
+ return false;
+ }
+
+ if (!$definition->isShared()) {
+ if (!$this->graph->hasNode($id)) {
+ return true;
+ }
+
+ foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
+ $srcId = $edge->getSourceNode()->getId();
+ $this->connectedIds[$srcId] = true;
+ if ($edge->isWeak() || $edge->isLazy()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ if ($definition->isPublic()) {
+ return false;
+ }
+
+ if (!$this->graph->hasNode($id)) {
+ return true;
+ }
+
+ if ($this->currentId == $id) {
+ return false;
+ }
+ $this->connectedIds[$id] = true;
+
+ $srcIds = [];
+ $srcCount = 0;
+ $isReferencedByConstructor = false;
+ foreach ($this->graph->getNode($id)->getInEdges() as $edge) {
+ $isReferencedByConstructor = $isReferencedByConstructor || $edge->isReferencedByConstructor();
+ $srcId = $edge->getSourceNode()->getId();
+ $this->connectedIds[$srcId] = true;
+ if ($edge->isWeak() || $edge->isLazy()) {
+ return false;
+ }
+ $srcIds[$srcId] = true;
+ ++$srcCount;
+ }
+
+ if (1 !== \count($srcIds)) {
+ $this->notInlinedIds[$id] = true;
+
+ return false;
+ }
+
+ if ($srcCount > 1 && \is_array($factory = $definition->getFactory()) && ($factory[0] instanceof Reference || $factory[0] instanceof Definition)) {
+ return false;
+ }
+
+ return $this->container->getDefinition($srcId)->isShared();
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php
new file mode 100644
index 0000000..264dd80
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/MergeExtensionConfigurationPass.php
@@ -0,0 +1,220 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\Config\Definition\BaseNode;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\Extension;
+use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
+use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
+
+/**
+ * Merges extension configs into the container builder.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class MergeExtensionConfigurationPass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $parameters = $container->getParameterBag()->all();
+ $definitions = $container->getDefinitions();
+ $aliases = $container->getAliases();
+ $exprLangProviders = $container->getExpressionLanguageProviders();
+ $configAvailable = class_exists(BaseNode::class);
+
+ foreach ($container->getExtensions() as $extension) {
+ if ($extension instanceof PrependExtensionInterface) {
+ $extension->prepend($container);
+ }
+ }
+
+ foreach ($container->getExtensions() as $name => $extension) {
+ if (!$config = $container->getExtensionConfig($name)) {
+ // this extension was not called
+ continue;
+ }
+ $resolvingBag = $container->getParameterBag();
+ if ($resolvingBag instanceof EnvPlaceholderParameterBag && $extension instanceof Extension) {
+ // create a dedicated bag so that we can track env vars per-extension
+ $resolvingBag = new MergeExtensionConfigurationParameterBag($resolvingBag);
+ if ($configAvailable) {
+ BaseNode::setPlaceholderUniquePrefix($resolvingBag->getEnvPlaceholderUniquePrefix());
+ }
+ }
+ $config = $resolvingBag->resolveValue($config);
+
+ try {
+ $tmpContainer = new MergeExtensionConfigurationContainerBuilder($extension, $resolvingBag);
+ $tmpContainer->setResourceTracking($container->isTrackingResources());
+ $tmpContainer->addObjectResource($extension);
+ if ($extension instanceof ConfigurationExtensionInterface && null !== $configuration = $extension->getConfiguration($config, $tmpContainer)) {
+ $tmpContainer->addObjectResource($configuration);
+ }
+
+ foreach ($exprLangProviders as $provider) {
+ $tmpContainer->addExpressionLanguageProvider($provider);
+ }
+
+ $extension->load($config, $tmpContainer);
+ } catch (\Exception $e) {
+ if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
+ $container->getParameterBag()->mergeEnvPlaceholders($resolvingBag);
+ }
+
+ throw $e;
+ } finally {
+ if ($configAvailable) {
+ BaseNode::resetPlaceholders();
+ }
+ }
+
+ if ($resolvingBag instanceof MergeExtensionConfigurationParameterBag) {
+ // don't keep track of env vars that are *overridden* when configs are merged
+ $resolvingBag->freezeAfterProcessing($extension, $tmpContainer);
+ }
+
+ $container->merge($tmpContainer);
+ $container->getParameterBag()->add($parameters);
+ }
+
+ $container->addDefinitions($definitions);
+ $container->addAliases($aliases);
+ }
+}
+
+/**
+ * @internal
+ */
+class MergeExtensionConfigurationParameterBag extends EnvPlaceholderParameterBag
+{
+ private $processedEnvPlaceholders;
+
+ public function __construct(parent $parameterBag)
+ {
+ parent::__construct($parameterBag->all());
+ $this->mergeEnvPlaceholders($parameterBag);
+ }
+
+ public function freezeAfterProcessing(Extension $extension, ContainerBuilder $container)
+ {
+ if (!$config = $extension->getProcessedConfigs()) {
+ // Extension::processConfiguration() wasn't called, we cannot know how configs were merged
+ return;
+ }
+ $this->processedEnvPlaceholders = [];
+
+ // serialize config and container to catch env vars nested in object graphs
+ $config = serialize($config).serialize($container->getDefinitions()).serialize($container->getAliases()).serialize($container->getParameterBag()->all());
+
+ foreach (parent::getEnvPlaceholders() as $env => $placeholders) {
+ foreach ($placeholders as $placeholder) {
+ if (false !== stripos($config, $placeholder)) {
+ $this->processedEnvPlaceholders[$env] = $placeholders;
+ break;
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getEnvPlaceholders(): array
+ {
+ return null !== $this->processedEnvPlaceholders ? $this->processedEnvPlaceholders : parent::getEnvPlaceholders();
+ }
+
+ public function getUnusedEnvPlaceholders(): array
+ {
+ return null === $this->processedEnvPlaceholders ? [] : array_diff_key(parent::getEnvPlaceholders(), $this->processedEnvPlaceholders);
+ }
+}
+
+/**
+ * A container builder preventing using methods that wouldn't have any effect from extensions.
+ *
+ * @internal
+ */
+class MergeExtensionConfigurationContainerBuilder extends ContainerBuilder
+{
+ private $extensionClass;
+
+ public function __construct(ExtensionInterface $extension, ParameterBagInterface $parameterBag = null)
+ {
+ parent::__construct($parameterBag);
+
+ $this->extensionClass = \get_class($extension);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function addCompilerPass(CompilerPassInterface $pass, $type = PassConfig::TYPE_BEFORE_OPTIMIZATION, int $priority = 0): self
+ {
+ throw new LogicException(sprintf('You cannot add compiler pass "%s" from extension "%s". Compiler passes must be registered before the container is compiled.', \get_class($pass), $this->extensionClass));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function registerExtension(ExtensionInterface $extension)
+ {
+ throw new LogicException(sprintf('You cannot register extension "%s" from "%s". Extensions must be registered before the container is compiled.', \get_class($extension), $this->extensionClass));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function compile(bool $resolveEnvPlaceholders = false)
+ {
+ throw new LogicException(sprintf('Cannot compile the container in extension "%s".', $this->extensionClass));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function resolveEnvPlaceholders($value, $format = null, array &$usedEnvs = null)
+ {
+ if (true !== $format || !\is_string($value)) {
+ return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
+ }
+
+ $bag = $this->getParameterBag();
+ $value = $bag->resolveValue($value);
+
+ if (!$bag instanceof EnvPlaceholderParameterBag) {
+ return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
+ }
+
+ foreach ($bag->getEnvPlaceholders() as $env => $placeholders) {
+ if (false === strpos($env, ':')) {
+ continue;
+ }
+ foreach ($placeholders as $placeholder) {
+ if (false !== stripos($value, $placeholder)) {
+ throw new RuntimeException(sprintf('Using a cast in "env(%s)" is incompatible with resolution at compile time in "%s". The logic in the extension should be moved to a compiler pass, or an env parameter with no cast should be used instead.', $env, $this->extensionClass));
+ }
+ }
+ }
+
+ return parent::resolveEnvPlaceholders($value, $format, $usedEnvs);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PassConfig.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PassConfig.php
new file mode 100644
index 0000000..8cc328e
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PassConfig.php
@@ -0,0 +1,269 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * Compiler Pass Configuration.
+ *
+ * This class has a default configuration embedded.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class PassConfig
+{
+ const TYPE_AFTER_REMOVING = 'afterRemoving';
+ const TYPE_BEFORE_OPTIMIZATION = 'beforeOptimization';
+ const TYPE_BEFORE_REMOVING = 'beforeRemoving';
+ const TYPE_OPTIMIZE = 'optimization';
+ const TYPE_REMOVE = 'removing';
+
+ private $mergePass;
+ private $afterRemovingPasses = [];
+ private $beforeOptimizationPasses = [];
+ private $beforeRemovingPasses = [];
+ private $optimizationPasses;
+ private $removingPasses;
+
+ public function __construct()
+ {
+ $this->mergePass = new MergeExtensionConfigurationPass();
+
+ $this->beforeOptimizationPasses = [
+ 100 => [
+ new ResolveClassPass(),
+ new ResolveInstanceofConditionalsPass(),
+ new RegisterEnvVarProcessorsPass(),
+ ],
+ -1000 => [new ExtensionCompilerPass()],
+ ];
+
+ $this->optimizationPasses = [[
+ new ValidateEnvPlaceholdersPass(),
+ new ResolveChildDefinitionsPass(),
+ new RegisterServiceSubscribersPass(),
+ new ResolveParameterPlaceHoldersPass(false),
+ new ResolveFactoryClassPass(),
+ new ResolveNamedArgumentsPass(),
+ new AutowireRequiredMethodsPass(),
+ new ResolveBindingsPass(),
+ new ServiceLocatorTagPass(),
+ new DecoratorServicePass(),
+ new CheckDefinitionValidityPass(),
+ new AutowirePass(false),
+ new ResolveTaggedIteratorArgumentPass(),
+ new ResolveServiceSubscribersPass(),
+ new ResolveReferencesToAliasesPass(),
+ new ResolveInvalidReferencesPass(),
+ new AnalyzeServiceReferencesPass(true),
+ new CheckCircularReferencesPass(),
+ new CheckReferenceValidityPass(),
+ new CheckArgumentsValidityPass(false),
+ ]];
+
+ $this->beforeRemovingPasses = [
+ -100 => [
+ new ResolvePrivatesPass(),
+ ],
+ ];
+
+ $this->removingPasses = [[
+ new RemovePrivateAliasesPass(),
+ new ReplaceAliasByActualDefinitionPass(),
+ new RemoveAbstractDefinitionsPass(),
+ new RemoveUnusedDefinitionsPass(),
+ new InlineServiceDefinitionsPass(new AnalyzeServiceReferencesPass()),
+ new AnalyzeServiceReferencesPass(),
+ new DefinitionErrorExceptionPass(),
+ ]];
+
+ $this->afterRemovingPasses = [[
+ new CheckExceptionOnInvalidReferenceBehaviorPass(),
+ new ResolveHotPathPass(),
+ ]];
+ }
+
+ /**
+ * Returns all passes in order to be processed.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getPasses()
+ {
+ return array_merge(
+ [$this->mergePass],
+ $this->getBeforeOptimizationPasses(),
+ $this->getOptimizationPasses(),
+ $this->getBeforeRemovingPasses(),
+ $this->getRemovingPasses(),
+ $this->getAfterRemovingPasses()
+ );
+ }
+
+ /**
+ * Adds a pass.
+ *
+ * @param string $type The pass type
+ * @param int $priority Used to sort the passes
+ *
+ * @throws InvalidArgumentException when a pass type doesn't exist
+ */
+ public function addPass(CompilerPassInterface $pass, $type = self::TYPE_BEFORE_OPTIMIZATION, int $priority = 0)
+ {
+ $property = $type.'Passes';
+ if (!isset($this->$property)) {
+ throw new InvalidArgumentException(sprintf('Invalid type "%s".', $type));
+ }
+
+ $passes = &$this->$property;
+
+ if (!isset($passes[$priority])) {
+ $passes[$priority] = [];
+ }
+ $passes[$priority][] = $pass;
+ }
+
+ /**
+ * Gets all passes for the AfterRemoving pass.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getAfterRemovingPasses()
+ {
+ return $this->sortPasses($this->afterRemovingPasses);
+ }
+
+ /**
+ * Gets all passes for the BeforeOptimization pass.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getBeforeOptimizationPasses()
+ {
+ return $this->sortPasses($this->beforeOptimizationPasses);
+ }
+
+ /**
+ * Gets all passes for the BeforeRemoving pass.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getBeforeRemovingPasses()
+ {
+ return $this->sortPasses($this->beforeRemovingPasses);
+ }
+
+ /**
+ * Gets all passes for the Optimization pass.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getOptimizationPasses()
+ {
+ return $this->sortPasses($this->optimizationPasses);
+ }
+
+ /**
+ * Gets all passes for the Removing pass.
+ *
+ * @return CompilerPassInterface[]
+ */
+ public function getRemovingPasses()
+ {
+ return $this->sortPasses($this->removingPasses);
+ }
+
+ /**
+ * Gets the Merge pass.
+ *
+ * @return CompilerPassInterface
+ */
+ public function getMergePass()
+ {
+ return $this->mergePass;
+ }
+
+ public function setMergePass(CompilerPassInterface $pass)
+ {
+ $this->mergePass = $pass;
+ }
+
+ /**
+ * Sets the AfterRemoving passes.
+ *
+ * @param CompilerPassInterface[] $passes
+ */
+ public function setAfterRemovingPasses(array $passes)
+ {
+ $this->afterRemovingPasses = [$passes];
+ }
+
+ /**
+ * Sets the BeforeOptimization passes.
+ *
+ * @param CompilerPassInterface[] $passes
+ */
+ public function setBeforeOptimizationPasses(array $passes)
+ {
+ $this->beforeOptimizationPasses = [$passes];
+ }
+
+ /**
+ * Sets the BeforeRemoving passes.
+ *
+ * @param CompilerPassInterface[] $passes
+ */
+ public function setBeforeRemovingPasses(array $passes)
+ {
+ $this->beforeRemovingPasses = [$passes];
+ }
+
+ /**
+ * Sets the Optimization passes.
+ *
+ * @param CompilerPassInterface[] $passes
+ */
+ public function setOptimizationPasses(array $passes)
+ {
+ $this->optimizationPasses = [$passes];
+ }
+
+ /**
+ * Sets the Removing passes.
+ *
+ * @param CompilerPassInterface[] $passes
+ */
+ public function setRemovingPasses(array $passes)
+ {
+ $this->removingPasses = [$passes];
+ }
+
+ /**
+ * Sort passes by priority.
+ *
+ * @param array $passes CompilerPassInterface instances with their priority as key
+ *
+ * @return CompilerPassInterface[]
+ */
+ private function sortPasses(array $passes): array
+ {
+ if (0 === \count($passes)) {
+ return [];
+ }
+
+ krsort($passes);
+
+ // Flatten the array
+ return array_merge(...$passes);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
new file mode 100644
index 0000000..9b3760b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/PriorityTaggedServiceTrait.php
@@ -0,0 +1,138 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\TypedReference;
+
+/**
+ * Trait that allows a generic method to find and sort service by priority option in the tag.
+ *
+ * @author Iltar van der Berg <kjarli@gmail.com>
+ */
+trait PriorityTaggedServiceTrait
+{
+ /**
+ * Finds all services with the given tag name and order them by their priority.
+ *
+ * The order of additions must be respected for services having the same priority,
+ * and knowing that the \SplPriorityQueue class does not respect the FIFO method,
+ * we should not use that class.
+ *
+ * @see https://bugs.php.net/53710
+ * @see https://bugs.php.net/60926
+ *
+ * @param string|TaggedIteratorArgument $tagName
+ *
+ * @return Reference[]
+ */
+ private function findAndSortTaggedServices($tagName, ContainerBuilder $container): array
+ {
+ $indexAttribute = $defaultIndexMethod = $needsIndexes = $defaultPriorityMethod = null;
+
+ if ($tagName instanceof TaggedIteratorArgument) {
+ $indexAttribute = $tagName->getIndexAttribute();
+ $defaultIndexMethod = $tagName->getDefaultIndexMethod();
+ $needsIndexes = $tagName->needsIndexes();
+ $defaultPriorityMethod = $tagName->getDefaultPriorityMethod();
+ $tagName = $tagName->getTag();
+ }
+
+ $services = [];
+
+ foreach ($container->findTaggedServiceIds($tagName, true) as $serviceId => $attributes) {
+ $class = $r = null;
+ $priority = 0;
+ if (isset($attributes[0]['priority'])) {
+ $priority = $attributes[0]['priority'];
+ } elseif ($defaultPriorityMethod) {
+ $class = $container->getDefinition($serviceId)->getClass();
+ $class = $container->getParameterBag()->resolveValue($class) ?: null;
+
+ if (($r = $container->getReflectionClass($class)) && $r->hasMethod($defaultPriorityMethod)) {
+ if (!($rm = $r->getMethod($defaultPriorityMethod))->isStatic()) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should be static: tag "%s" on service "%s".', $class, $defaultPriorityMethod, $tagName, $serviceId));
+ }
+
+ if (!$rm->isPublic()) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should be public: tag "%s" on service "%s".', $class, $defaultPriorityMethod, $tagName, $serviceId));
+ }
+
+ $priority = $rm->invoke(null);
+
+ if (!\is_int($priority)) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should return an integer, got %s: tag "%s" on service "%s".', $class, $defaultPriorityMethod, \gettype($priority), $tagName, $serviceId));
+ }
+ }
+ }
+
+ if (null === $indexAttribute && !$needsIndexes) {
+ $services[$priority][] = new Reference($serviceId);
+
+ continue;
+ }
+
+ if (!$class) {
+ $class = $container->getDefinition($serviceId)->getClass();
+ $class = $container->getParameterBag()->resolveValue($class) ?: null;
+ }
+
+ if (null !== $indexAttribute && isset($attributes[0][$indexAttribute])) {
+ $services[$priority][$attributes[0][$indexAttribute]] = new TypedReference($serviceId, $class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $attributes[0][$indexAttribute]);
+
+ continue;
+ }
+
+ if (!$r && !$r = $container->getReflectionClass($class)) {
+ throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $serviceId));
+ }
+
+ $class = $r->name;
+
+ if (!$r->hasMethod($defaultIndexMethod)) {
+ if ($needsIndexes) {
+ $services[$priority][$serviceId] = new TypedReference($serviceId, $class);
+
+ continue;
+ }
+
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" not found: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute));
+ }
+
+ if (!($rm = $r->getMethod($defaultIndexMethod))->isStatic()) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should be static: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute));
+ }
+
+ if (!$rm->isPublic()) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should be public: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, $tagName, $serviceId, $indexAttribute));
+ }
+
+ $key = $rm->invoke(null);
+
+ if (!\is_string($key)) {
+ throw new InvalidArgumentException(sprintf('Method "%s::%s()" should return a string, got %s: tag "%s" on service "%s" is missing "%s" attribute.', $class, $defaultIndexMethod, \gettype($key), $tagName, $serviceId, $indexAttribute));
+ }
+
+ $services[$priority][$key] = new TypedReference($serviceId, $class, ContainerBuilder::EXCEPTION_ON_INVALID_REFERENCE, $key);
+ }
+
+ if ($services) {
+ krsort($services);
+ $services = array_merge(...$services);
+ }
+
+ return $services;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php
new file mode 100644
index 0000000..a9a133b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterEnvVarProcessorsPass.php
@@ -0,0 +1,75 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\EnvVarProcessor;
+use Symfony\Component\DependencyInjection\EnvVarProcessorInterface;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Creates the container.env_var_processors_locator service.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class RegisterEnvVarProcessorsPass implements CompilerPassInterface
+{
+ private static $allowedTypes = ['array', 'bool', 'float', 'int', 'string'];
+
+ public function process(ContainerBuilder $container)
+ {
+ $bag = $container->getParameterBag();
+ $types = [];
+ $processors = [];
+ foreach ($container->findTaggedServiceIds('container.env_var_processor') as $id => $tags) {
+ if (!$r = $container->getReflectionClass($class = $container->getDefinition($id)->getClass())) {
+ throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id));
+ } elseif (!$r->isSubclassOf(EnvVarProcessorInterface::class)) {
+ throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, EnvVarProcessorInterface::class));
+ }
+ foreach ($class::getProvidedTypes() as $prefix => $type) {
+ $processors[$prefix] = new Reference($id);
+ $types[$prefix] = self::validateProvidedTypes($type, $class);
+ }
+ }
+
+ if ($bag instanceof EnvPlaceholderParameterBag) {
+ foreach (EnvVarProcessor::getProvidedTypes() as $prefix => $type) {
+ if (!isset($types[$prefix])) {
+ $types[$prefix] = self::validateProvidedTypes($type, EnvVarProcessor::class);
+ }
+ }
+ $bag->setProvidedTypes($types);
+ }
+
+ if ($processors) {
+ $container->setAlias('container.env_var_processors_locator', (string) ServiceLocatorTagPass::register($container, $processors))
+ ->setPublic(true)
+ ;
+ }
+ }
+
+ private static function validateProvidedTypes(string $types, string $class): array
+ {
+ $types = explode('|', $types);
+
+ foreach ($types as $type) {
+ if (!\in_array($type, self::$allowedTypes)) {
+ throw new InvalidArgumentException(sprintf('Invalid type "%s" returned by "%s::getProvidedTypes()", expected one of "%s".', $type, $class, implode('", "', self::$allowedTypes)));
+ }
+ }
+
+ return $types;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php
new file mode 100644
index 0000000..571eab3
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterReverseContainerPass.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class RegisterReverseContainerPass implements CompilerPassInterface
+{
+ private $beforeRemoving;
+ private $serviceId;
+ private $tagName;
+
+ public function __construct(bool $beforeRemoving, string $serviceId = 'reverse_container', string $tagName = 'container.reversible')
+ {
+ $this->beforeRemoving = $beforeRemoving;
+ $this->serviceId = $serviceId;
+ $this->tagName = $tagName;
+ }
+
+ public function process(ContainerBuilder $container)
+ {
+ if (!$container->hasDefinition($this->serviceId)) {
+ return;
+ }
+
+ $refType = $this->beforeRemoving ? ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE : ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
+ $services = [];
+ foreach ($container->findTaggedServiceIds($this->tagName) as $id => $tags) {
+ $services[$id] = new Reference($id, $refType);
+ }
+
+ if ($this->beforeRemoving) {
+ // prevent inlining of the reverse container
+ $services[$this->serviceId] = new Reference($this->serviceId, $refType);
+ }
+ $locator = $container->getDefinition($this->serviceId)->getArgument(1);
+
+ if ($locator instanceof Reference) {
+ $locator = $container->getDefinition((string) $locator);
+ }
+ if ($locator instanceof Definition) {
+ foreach ($services as $id => $ref) {
+ $services[$id] = new ServiceClosureArgument($ref);
+ }
+ $locator->replaceArgument(0, $services);
+ } else {
+ $locator->setValues($services);
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php
new file mode 100644
index 0000000..14bf000
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RegisterServiceSubscribersPass.php
@@ -0,0 +1,122 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Psr\Container\ContainerInterface as PsrContainerInterface;
+use Symfony\Component\DependencyInjection\Argument\BoundArgument;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\TypedReference;
+use Symfony\Contracts\Service\ServiceProviderInterface;
+use Symfony\Contracts\Service\ServiceSubscriberInterface;
+
+/**
+ * Compiler pass to register tagged services that require a service locator.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class RegisterServiceSubscribersPass extends AbstractRecursivePass
+{
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Definition || $value->isAbstract() || $value->isSynthetic() || !$value->hasTag('container.service_subscriber')) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $serviceMap = [];
+ $autowire = $value->isAutowired();
+
+ foreach ($value->getTag('container.service_subscriber') as $attributes) {
+ if (!$attributes) {
+ $autowire = true;
+ continue;
+ }
+ ksort($attributes);
+ if ([] !== array_diff(array_keys($attributes), ['id', 'key'])) {
+ throw new InvalidArgumentException(sprintf('The "container.service_subscriber" tag accepts only the "key" and "id" attributes, "%s" given for service "%s".', implode('", "', array_keys($attributes)), $this->currentId));
+ }
+ if (!\array_key_exists('id', $attributes)) {
+ throw new InvalidArgumentException(sprintf('Missing "id" attribute on "container.service_subscriber" tag with key="%s" for service "%s".', $attributes['key'], $this->currentId));
+ }
+ if (!\array_key_exists('key', $attributes)) {
+ $attributes['key'] = $attributes['id'];
+ }
+ if (isset($serviceMap[$attributes['key']])) {
+ continue;
+ }
+ $serviceMap[$attributes['key']] = new Reference($attributes['id']);
+ }
+ $class = $value->getClass();
+
+ if (!$r = $this->container->getReflectionClass($class)) {
+ throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $this->currentId));
+ }
+ if (!$r->isSubclassOf(ServiceSubscriberInterface::class)) {
+ throw new InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $this->currentId, ServiceSubscriberInterface::class));
+ }
+ $class = $r->name;
+
+ $subscriberMap = [];
+
+ foreach ($class::getSubscribedServices() as $key => $type) {
+ if (!\is_string($type) || !preg_match('/^\??[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)*+$/', $type)) {
+ throw new InvalidArgumentException(sprintf('"%s::getSubscribedServices()" must return valid PHP types for service "%s" key "%s", "%s" returned.', $class, $this->currentId, $key, \is_string($type) ? $type : \gettype($type)));
+ }
+ if ($optionalBehavior = '?' === $type[0]) {
+ $type = substr($type, 1);
+ $optionalBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE;
+ }
+ if (\is_int($name = $key)) {
+ $key = $type;
+ $name = null;
+ }
+ if (!isset($serviceMap[$key])) {
+ if (!$autowire) {
+ throw new InvalidArgumentException(sprintf('Service "%s" misses a "container.service_subscriber" tag with "key"/"id" attributes corresponding to entry "%s" as returned by "%s::getSubscribedServices()".', $this->currentId, $key, $class));
+ }
+ $serviceMap[$key] = new Reference($type);
+ }
+
+ if (false !== $i = strpos($name, '::get')) {
+ $name = lcfirst(substr($name, 5 + $i));
+ } elseif (false !== strpos($name, '::')) {
+ $name = null;
+ }
+
+ if (null !== $name && !$this->container->has($name) && !$this->container->has($type.' $'.$name)) {
+ $camelCaseName = lcfirst(str_replace(' ', '', ucwords(preg_replace('/[^a-zA-Z0-9\x7f-\xff]++/', ' ', $name))));
+ $name = $this->container->has($type.' $'.$camelCaseName) ? $camelCaseName : $name;
+ }
+
+ $subscriberMap[$key] = new TypedReference((string) $serviceMap[$key], $type, $optionalBehavior ?: ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, $name);
+ unset($serviceMap[$key]);
+ }
+
+ if ($serviceMap = array_keys($serviceMap)) {
+ $message = sprintf(1 < \count($serviceMap) ? 'keys "%s" do' : 'key "%s" does', str_replace('%', '%%', implode('", "', $serviceMap)));
+ throw new InvalidArgumentException(sprintf('Service %s not exist in the map returned by "%s::getSubscribedServices()" for service "%s".', $message, $class, $this->currentId));
+ }
+
+ $locatorRef = ServiceLocatorTagPass::register($this->container, $subscriberMap, $this->currentId);
+
+ $value->addTag('container.service_subscriber.locator', ['id' => (string) $locatorRef]);
+
+ $value->setBindings([
+ PsrContainerInterface::class => new BoundArgument($locatorRef, false),
+ ServiceProviderInterface::class => new BoundArgument($locatorRef, false),
+ ] + $value->getBindings());
+
+ return parent::processValue($value);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php
new file mode 100644
index 0000000..04b6852
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveAbstractDefinitionsPass.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Removes abstract Definitions.
+ */
+class RemoveAbstractDefinitionsPass implements CompilerPassInterface
+{
+ /**
+ * Removes abstract definitions from the ContainerBuilder.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if ($definition->isAbstract()) {
+ $container->removeDefinition($id);
+ $container->log($this, sprintf('Removed service "%s"; reason: abstract.', $id));
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php
new file mode 100644
index 0000000..75b36d2
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemovePrivateAliasesPass.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Remove private aliases from the container. They were only used to establish
+ * dependencies between services, and these dependencies have been resolved in
+ * one of the previous passes.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class RemovePrivateAliasesPass implements CompilerPassInterface
+{
+ /**
+ * Removes private aliases from the ContainerBuilder.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getAliases() as $id => $alias) {
+ if ($alias->isPublic()) {
+ continue;
+ }
+
+ $container->removeAlias($id);
+ $container->log($this, sprintf('Removed service "%s"; reason: private alias.', $id));
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php
new file mode 100644
index 0000000..287af23
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RemoveUnusedDefinitionsPass.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Removes unused service definitions from the container.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class RemoveUnusedDefinitionsPass extends AbstractRecursivePass implements RepeatablePassInterface
+{
+ private $connectedIds = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setRepeatedPass(RepeatedPass $repeatedPass)
+ {
+ @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2.', __METHOD__), E_USER_DEPRECATED);
+ }
+
+ /**
+ * Processes the ContainerBuilder to remove unused definitions.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ try {
+ $this->enableExpressionProcessing();
+ $this->container = $container;
+ $connectedIds = [];
+ $aliases = $container->getAliases();
+
+ foreach ($aliases as $id => $alias) {
+ if ($alias->isPublic()) {
+ $this->connectedIds[] = (string) $aliases[$id];
+ }
+ }
+
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if ($definition->isPublic()) {
+ $connectedIds[$id] = true;
+ $this->processValue($definition);
+ }
+ }
+
+ while ($this->connectedIds) {
+ $ids = $this->connectedIds;
+ $this->connectedIds = [];
+ foreach ($ids as $id) {
+ if (!isset($connectedIds[$id]) && $container->hasDefinition($id)) {
+ $connectedIds[$id] = true;
+ $this->processValue($container->getDefinition($id));
+ }
+ }
+ }
+
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if (!isset($connectedIds[$id])) {
+ $container->removeDefinition($id);
+ $container->resolveEnvPlaceholders(!$definition->hasErrors() ? serialize($definition) : $definition);
+ $container->log($this, sprintf('Removed service "%s"; reason: unused.', $id));
+ }
+ }
+ } finally {
+ $this->container = null;
+ $this->connectedIds = [];
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Reference) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if (ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior()) {
+ $this->connectedIds[] = (string) $value;
+ }
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatablePassInterface.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatablePassInterface.php
new file mode 100644
index 0000000..11a5b0d
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatablePassInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+/**
+ * Interface that must be implemented by passes that are run as part of an
+ * RepeatedPass.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @deprecated since Symfony 4.2.
+ */
+interface RepeatablePassInterface extends CompilerPassInterface
+{
+ public function setRepeatedPass(RepeatedPass $repeatedPass);
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatedPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatedPass.php
new file mode 100644
index 0000000..b8add1b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/RepeatedPass.php
@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+@trigger_error(sprintf('The "%s" class is deprecated since Symfony 4.2.', RepeatedPass::class), E_USER_DEPRECATED);
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * A pass that might be run repeatedly.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @deprecated since Symfony 4.2.
+ */
+class RepeatedPass implements CompilerPassInterface
+{
+ /**
+ * @var bool
+ */
+ private $repeat = false;
+
+ private $passes;
+
+ /**
+ * @param RepeatablePassInterface[] $passes An array of RepeatablePassInterface objects
+ *
+ * @throws InvalidArgumentException when the passes don't implement RepeatablePassInterface
+ */
+ public function __construct(array $passes)
+ {
+ foreach ($passes as $pass) {
+ if (!$pass instanceof RepeatablePassInterface) {
+ throw new InvalidArgumentException('$passes must be an array of RepeatablePassInterface.');
+ }
+
+ $pass->setRepeatedPass($this);
+ }
+
+ $this->passes = $passes;
+ }
+
+ /**
+ * Process the repeatable passes that run more than once.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ do {
+ $this->repeat = false;
+ foreach ($this->passes as $pass) {
+ $pass->process($container);
+ }
+ } while ($this->repeat);
+ }
+
+ /**
+ * Sets if the pass should repeat.
+ */
+ public function setRepeat()
+ {
+ $this->repeat = true;
+ }
+
+ /**
+ * Returns the passes.
+ *
+ * @return RepeatablePassInterface[] An array of RepeatablePassInterface objects
+ */
+ public function getPasses()
+ {
+ return $this->passes;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php
new file mode 100644
index 0000000..9981096
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ReplaceAliasByActualDefinitionPass.php
@@ -0,0 +1,94 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Replaces aliases with actual service definitions, effectively removing these
+ * aliases.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ReplaceAliasByActualDefinitionPass extends AbstractRecursivePass
+{
+ private $replacements;
+
+ /**
+ * Process the Container to replace aliases with service definitions.
+ *
+ * @throws InvalidArgumentException if the service definition does not exist
+ */
+ public function process(ContainerBuilder $container)
+ {
+ // First collect all alias targets that need to be replaced
+ $seenAliasTargets = [];
+ $replacements = [];
+ foreach ($container->getAliases() as $definitionId => $target) {
+ $targetId = (string) $target;
+ // Special case: leave this target alone
+ if ('service_container' === $targetId) {
+ continue;
+ }
+ // Check if target needs to be replaces
+ if (isset($replacements[$targetId])) {
+ $container->setAlias($definitionId, $replacements[$targetId])->setPublic($target->isPublic())->setPrivate($target->isPrivate());
+ }
+ // No need to process the same target twice
+ if (isset($seenAliasTargets[$targetId])) {
+ continue;
+ }
+ // Process new target
+ $seenAliasTargets[$targetId] = true;
+ try {
+ $definition = $container->getDefinition($targetId);
+ } catch (ServiceNotFoundException $e) {
+ if ('' !== $e->getId() && '@' === $e->getId()[0]) {
+ throw new ServiceNotFoundException($e->getId(), $e->getSourceId(), null, [substr($e->getId(), 1)]);
+ }
+
+ throw $e;
+ }
+ if ($definition->isPublic()) {
+ continue;
+ }
+ // Remove private definition and schedule for replacement
+ $definition->setPublic(!$target->isPrivate());
+ $definition->setPrivate($target->isPrivate());
+ $container->setDefinition($definitionId, $definition);
+ $container->removeDefinition($targetId);
+ $replacements[$targetId] = $definitionId;
+ }
+ $this->replacements = $replacements;
+
+ parent::process($container);
+ $this->replacements = [];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof Reference && isset($this->replacements[$referenceId = (string) $value])) {
+ // Perform the replacement
+ $newId = $this->replacements[$referenceId];
+ $value = new Reference($newId, $value->getInvalidBehavior());
+ $this->container->log($this, sprintf('Changed reference of service "%s" previously pointing to "%s" to "%s".', $this->currentId, $referenceId, $newId));
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php
new file mode 100644
index 0000000..e76c43b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveBindingsPass.php
@@ -0,0 +1,227 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\BoundArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
+use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\TypedReference;
+
+/**
+ * @author Guilhem Niot <guilhem.niot@gmail.com>
+ */
+class ResolveBindingsPass extends AbstractRecursivePass
+{
+ private $usedBindings = [];
+ private $unusedBindings = [];
+ private $errorMessages = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->usedBindings = $container->getRemovedBindingIds();
+
+ try {
+ parent::process($container);
+
+ foreach ($this->unusedBindings as list($key, $serviceId, $bindingType, $file)) {
+ $argumentType = $argumentName = $message = null;
+
+ if (false !== strpos($key, ' ')) {
+ list($argumentType, $argumentName) = explode(' ', $key, 2);
+ } elseif ('$' === $key[0]) {
+ $argumentName = $key;
+ } else {
+ $argumentType = $key;
+ }
+
+ if ($argumentType) {
+ $message .= sprintf('of type "%s" ', $argumentType);
+ }
+
+ if ($argumentName) {
+ $message .= sprintf('named "%s" ', $argumentName);
+ }
+
+ if (BoundArgument::DEFAULTS_BINDING === $bindingType) {
+ $message .= 'under "_defaults"';
+ } elseif (BoundArgument::INSTANCEOF_BINDING === $bindingType) {
+ $message .= 'under "_instanceof"';
+ } else {
+ $message .= sprintf('for service "%s"', $serviceId);
+ }
+
+ if ($file) {
+ $message .= sprintf(' in file "%s"', $file);
+ }
+
+ $message = sprintf('A binding is configured for an argument %s, but no corresponding argument has been found. It may be unused and should be removed, or it may have a typo.', $message);
+
+ if ($this->errorMessages) {
+ $message .= sprintf("\nCould be related to%s:", 1 < \count($this->errorMessages) ? ' one of' : '');
+ }
+ foreach ($this->errorMessages as $m) {
+ $message .= "\n - ".$m;
+ }
+ throw new InvalidArgumentException($message);
+ }
+ } finally {
+ $this->usedBindings = [];
+ $this->unusedBindings = [];
+ $this->errorMessages = [];
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof TypedReference && $value->getType() === (string) $value) {
+ // Already checked
+ $bindings = $this->container->getDefinition($this->currentId)->getBindings();
+ $name = $value->getName();
+
+ if (isset($name, $bindings[$name = $value.' $'.$name])) {
+ return $this->getBindingValue($bindings[$name]);
+ }
+
+ if (isset($bindings[$value->getType()])) {
+ return $this->getBindingValue($bindings[$value->getType()]);
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ if (!$value instanceof Definition || !$bindings = $value->getBindings()) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ foreach ($bindings as $key => $binding) {
+ list($bindingValue, $bindingId, $used, $bindingType, $file) = $binding->getValues();
+ if ($used) {
+ $this->usedBindings[$bindingId] = true;
+ unset($this->unusedBindings[$bindingId]);
+ } elseif (!isset($this->usedBindings[$bindingId])) {
+ $this->unusedBindings[$bindingId] = [$key, $this->currentId, $bindingType, $file];
+ }
+
+ if (preg_match('/^(?:(?:array|bool|float|int|string) )?\$/', $key)) {
+ continue;
+ }
+
+ if (null !== $bindingValue && !$bindingValue instanceof Reference && !$bindingValue instanceof Definition && !$bindingValue instanceof TaggedIteratorArgument && !$bindingValue instanceof ServiceLocatorArgument) {
+ throw new InvalidArgumentException(sprintf('Invalid value for binding key "%s" for service "%s": expected null, %s, %s, %s or ServiceLocatorArgument, %s given.', $key, $this->currentId, Reference::class, Definition::class, TaggedIteratorArgument::class, \gettype($bindingValue)));
+ }
+ }
+
+ if ($value->isAbstract()) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $calls = $value->getMethodCalls();
+
+ try {
+ if ($constructor = $this->getConstructor($value, false)) {
+ $calls[] = [$constructor, $value->getArguments()];
+ }
+ } catch (RuntimeException $e) {
+ $this->errorMessages[] = $e->getMessage();
+ $this->container->getDefinition($this->currentId)->addError($e->getMessage());
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ foreach ($calls as $i => $call) {
+ list($method, $arguments) = $call;
+
+ if ($method instanceof \ReflectionFunctionAbstract) {
+ $reflectionMethod = $method;
+ } else {
+ try {
+ $reflectionMethod = $this->getReflectionMethod($value, $method);
+ } catch (RuntimeException $e) {
+ if ($value->getFactory()) {
+ continue;
+ }
+ throw $e;
+ }
+ }
+
+ foreach ($reflectionMethod->getParameters() as $key => $parameter) {
+ if (\array_key_exists($key, $arguments) && '' !== $arguments[$key]) {
+ continue;
+ }
+
+ $typeHint = ProxyHelper::getTypeHint($reflectionMethod, $parameter);
+
+ if (\array_key_exists($k = ltrim($typeHint, '\\').' $'.$parameter->name, $bindings)) {
+ $arguments[$key] = $this->getBindingValue($bindings[$k]);
+
+ continue;
+ }
+
+ if (\array_key_exists('$'.$parameter->name, $bindings)) {
+ $arguments[$key] = $this->getBindingValue($bindings['$'.$parameter->name]);
+
+ continue;
+ }
+
+ if (!$typeHint || '\\' !== $typeHint[0] || !isset($bindings[$typeHint = substr($typeHint, 1)])) {
+ continue;
+ }
+
+ $arguments[$key] = $this->getBindingValue($bindings[$typeHint]);
+ }
+
+ if ($arguments !== $call[1]) {
+ ksort($arguments);
+ $calls[$i][1] = $arguments;
+ }
+ }
+
+ if ($constructor) {
+ list(, $arguments) = array_pop($calls);
+
+ if ($arguments !== $value->getArguments()) {
+ $value->setArguments($arguments);
+ }
+ }
+
+ if ($calls !== $value->getMethodCalls()) {
+ $value->setMethodCalls($calls);
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ /**
+ * @return mixed
+ */
+ private function getBindingValue(BoundArgument $binding)
+ {
+ list($bindingValue, $bindingId) = $binding->getValues();
+
+ $this->usedBindings[$bindingId] = true;
+ unset($this->unusedBindings[$bindingId]);
+
+ return $bindingValue;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php
new file mode 100644
index 0000000..453e3f6
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveChildDefinitionsPass.php
@@ -0,0 +1,190 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\ExceptionInterface;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+
+/**
+ * This replaces all ChildDefinition instances with their equivalent fully
+ * merged Definition instance.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveChildDefinitionsPass extends AbstractRecursivePass
+{
+ private $currentPath;
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Definition) {
+ return parent::processValue($value, $isRoot);
+ }
+ if ($isRoot) {
+ // yes, we are specifically fetching the definition from the
+ // container to ensure we are not operating on stale data
+ $value = $this->container->getDefinition($this->currentId);
+ }
+ if ($value instanceof ChildDefinition) {
+ $this->currentPath = [];
+ $value = $this->resolveDefinition($value);
+ if ($isRoot) {
+ $this->container->setDefinition($this->currentId, $value);
+ }
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+
+ /**
+ * Resolves the definition.
+ *
+ * @throws RuntimeException When the definition is invalid
+ */
+ private function resolveDefinition(ChildDefinition $definition): Definition
+ {
+ try {
+ return $this->doResolveDefinition($definition);
+ } catch (ServiceCircularReferenceException $e) {
+ throw $e;
+ } catch (ExceptionInterface $e) {
+ $r = new \ReflectionProperty($e, 'message');
+ $r->setAccessible(true);
+ $r->setValue($e, sprintf('Service "%s": %s', $this->currentId, $e->getMessage()));
+
+ throw $e;
+ }
+ }
+
+ private function doResolveDefinition(ChildDefinition $definition): Definition
+ {
+ if (!$this->container->has($parent = $definition->getParent())) {
+ throw new RuntimeException(sprintf('Parent definition "%s" does not exist.', $parent));
+ }
+
+ $searchKey = array_search($parent, $this->currentPath);
+ $this->currentPath[] = $parent;
+
+ if (false !== $searchKey) {
+ throw new ServiceCircularReferenceException($parent, \array_slice($this->currentPath, $searchKey));
+ }
+
+ $parentDef = $this->container->findDefinition($parent);
+ if ($parentDef instanceof ChildDefinition) {
+ $id = $this->currentId;
+ $this->currentId = $parent;
+ $parentDef = $this->resolveDefinition($parentDef);
+ $this->container->setDefinition($parent, $parentDef);
+ $this->currentId = $id;
+ }
+
+ $this->container->log($this, sprintf('Resolving inheritance for "%s" (parent: %s).', $this->currentId, $parent));
+ $def = new Definition();
+
+ // merge in parent definition
+ // purposely ignored attributes: abstract, shared, tags, autoconfigured
+ $def->setClass($parentDef->getClass());
+ $def->setArguments($parentDef->getArguments());
+ $def->setMethodCalls($parentDef->getMethodCalls());
+ $def->setProperties($parentDef->getProperties());
+ if ($parentDef->isDeprecated()) {
+ $def->setDeprecated(true, $parentDef->getDeprecationMessage('%service_id%'));
+ }
+ $def->setFactory($parentDef->getFactory());
+ $def->setConfigurator($parentDef->getConfigurator());
+ $def->setFile($parentDef->getFile());
+ $def->setPublic($parentDef->isPublic());
+ $def->setLazy($parentDef->isLazy());
+ $def->setAutowired($parentDef->isAutowired());
+ $def->setChanges($parentDef->getChanges());
+
+ $def->setBindings($definition->getBindings() + $parentDef->getBindings());
+
+ // overwrite with values specified in the decorator
+ $changes = $definition->getChanges();
+ if (isset($changes['class'])) {
+ $def->setClass($definition->getClass());
+ }
+ if (isset($changes['factory'])) {
+ $def->setFactory($definition->getFactory());
+ }
+ if (isset($changes['configurator'])) {
+ $def->setConfigurator($definition->getConfigurator());
+ }
+ if (isset($changes['file'])) {
+ $def->setFile($definition->getFile());
+ }
+ if (isset($changes['public'])) {
+ $def->setPublic($definition->isPublic());
+ } else {
+ $def->setPrivate($definition->isPrivate() || $parentDef->isPrivate());
+ }
+ if (isset($changes['lazy'])) {
+ $def->setLazy($definition->isLazy());
+ }
+ if (isset($changes['deprecated'])) {
+ $def->setDeprecated($definition->isDeprecated(), $definition->getDeprecationMessage('%service_id%'));
+ }
+ if (isset($changes['autowired'])) {
+ $def->setAutowired($definition->isAutowired());
+ }
+ if (isset($changes['shared'])) {
+ $def->setShared($definition->isShared());
+ }
+ if (isset($changes['decorated_service'])) {
+ $decoratedService = $definition->getDecoratedService();
+ if (null === $decoratedService) {
+ $def->setDecoratedService($decoratedService);
+ } else {
+ $def->setDecoratedService($decoratedService[0], $decoratedService[1], $decoratedService[2], $decoratedService[3] ?? ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE);
+ }
+ }
+
+ // merge arguments
+ foreach ($definition->getArguments() as $k => $v) {
+ if (is_numeric($k)) {
+ $def->addArgument($v);
+ } elseif (0 === strpos($k, 'index_')) {
+ $def->replaceArgument((int) substr($k, \strlen('index_')), $v);
+ } else {
+ $def->setArgument($k, $v);
+ }
+ }
+
+ // merge properties
+ foreach ($definition->getProperties() as $k => $v) {
+ $def->setProperty($k, $v);
+ }
+
+ // append method calls
+ if ($calls = $definition->getMethodCalls()) {
+ $def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
+ }
+
+ $def->addError($parentDef);
+ $def->addError($definition);
+
+ // these attributes are always taken from the child
+ $def->setAbstract($definition->isAbstract());
+ $def->setTags($definition->getTags());
+ // autoconfigure is never taken from parent (on purpose)
+ // and it's not legal on an instanceof
+ $def->setAutoconfigured($definition->isAutoconfigured());
+
+ return $def;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php
new file mode 100644
index 0000000..5932472
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveClassPass.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveClassPass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if ($definition->isSynthetic() || null !== $definition->getClass()) {
+ continue;
+ }
+ if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $id)) {
+ if ($definition instanceof ChildDefinition && !class_exists($id)) {
+ throw new InvalidArgumentException(sprintf('Service definition "%s" has a parent but no class, and its name looks like a FQCN. Either the class is missing or you want to inherit it from the parent service. To resolve this ambiguity, please rename this service to a non-FQCN (e.g. using dots), or create the missing class.', $id));
+ }
+ $definition->setClass($id);
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php
new file mode 100644
index 0000000..9e1edd4
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveEnvPlaceholdersPass.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Replaces env var placeholders by their current values.
+ */
+class ResolveEnvPlaceholdersPass extends AbstractRecursivePass
+{
+ protected function processValue($value, $isRoot = false)
+ {
+ if (\is_string($value)) {
+ return $this->container->resolveEnvPlaceholders($value, true);
+ }
+ if ($value instanceof Definition) {
+ $changes = $value->getChanges();
+ if (isset($changes['class'])) {
+ $value->setClass($this->container->resolveEnvPlaceholders($value->getClass(), true));
+ }
+ if (isset($changes['file'])) {
+ $value->setFile($this->container->resolveEnvPlaceholders($value->getFile(), true));
+ }
+ }
+
+ $value = parent::processValue($value, $isRoot);
+
+ if ($value && \is_array($value) && !$isRoot) {
+ $value = array_combine($this->container->resolveEnvPlaceholders(array_keys($value), true), $value);
+ }
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php
new file mode 100644
index 0000000..848da7f
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveFactoryClassPass.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
+ */
+class ResolveFactoryClassPass extends AbstractRecursivePass
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof Definition && \is_array($factory = $value->getFactory()) && null === $factory[0]) {
+ if (null === $class = $value->getClass()) {
+ throw new RuntimeException(sprintf('The "%s" service is defined to be created by a factory, but is missing the factory class. Did you forget to define the factory or service class?', $this->currentId));
+ }
+
+ $factory[0] = $class;
+ $value->setFactory($factory);
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php
new file mode 100644
index 0000000..bfdd91c
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveHotPathPass.php
@@ -0,0 +1,71 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Propagate "container.hot_path" tags to referenced services.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveHotPathPass extends AbstractRecursivePass
+{
+ private $tagName;
+ private $resolvedIds = [];
+
+ public function __construct(string $tagName = 'container.hot_path')
+ {
+ $this->tagName = $tagName;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ try {
+ parent::process($container);
+ $container->getDefinition('service_container')->clearTag($this->tagName);
+ } finally {
+ $this->resolvedIds = [];
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof ArgumentInterface) {
+ return $value;
+ }
+ if ($value instanceof Definition && $isRoot && (isset($this->resolvedIds[$this->currentId]) || !$value->hasTag($this->tagName) || $value->isDeprecated())) {
+ return $value->isDeprecated() ? $value->clearTag($this->tagName) : $value;
+ }
+ if ($value instanceof Reference && ContainerBuilder::IGNORE_ON_UNINITIALIZED_REFERENCE !== $value->getInvalidBehavior() && $this->container->has($id = (string) $value)) {
+ $definition = $this->container->findDefinition($id);
+ if (!$definition->hasTag($this->tagName) && !$definition->isDeprecated()) {
+ $this->resolvedIds[$id] = true;
+ $definition->addTag($this->tagName);
+ parent::processValue($definition, false);
+ }
+
+ return $value;
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php
new file mode 100644
index 0000000..96afb03
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInstanceofConditionalsPass.php
@@ -0,0 +1,168 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ChildDefinition;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+
+/**
+ * Applies instanceof conditionals to definitions.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveInstanceofConditionalsPass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getAutoconfiguredInstanceof() as $interface => $definition) {
+ if ($definition->getArguments()) {
+ throw new InvalidArgumentException(sprintf('Autoconfigured instanceof for type "%s" defines arguments but these are not supported and should be removed.', $interface));
+ }
+ }
+
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if ($definition instanceof ChildDefinition) {
+ // don't apply "instanceof" to children: it will be applied to their parent
+ continue;
+ }
+ $container->setDefinition($id, $this->processDefinition($container, $id, $definition));
+ }
+ }
+
+ private function processDefinition(ContainerBuilder $container, string $id, Definition $definition): Definition
+ {
+ $instanceofConditionals = $definition->getInstanceofConditionals();
+ $autoconfiguredInstanceof = $definition->isAutoconfigured() ? $container->getAutoconfiguredInstanceof() : [];
+ if (!$instanceofConditionals && !$autoconfiguredInstanceof) {
+ return $definition;
+ }
+
+ if (!$class = $container->getParameterBag()->resolveValue($definition->getClass())) {
+ return $definition;
+ }
+
+ $conditionals = $this->mergeConditionals($autoconfiguredInstanceof, $instanceofConditionals, $container);
+
+ $definition->setInstanceofConditionals([]);
+ $parent = $shared = null;
+ $instanceofTags = [];
+ $instanceofCalls = [];
+ $instanceofBindings = [];
+ $reflectionClass = null;
+
+ foreach ($conditionals as $interface => $instanceofDefs) {
+ if ($interface !== $class && !(null === $reflectionClass ? $reflectionClass = ($container->getReflectionClass($class, false) ?: false) : $reflectionClass)) {
+ continue;
+ }
+
+ if ($interface !== $class && !is_subclass_of($class, $interface)) {
+ continue;
+ }
+
+ foreach ($instanceofDefs as $key => $instanceofDef) {
+ /** @var ChildDefinition $instanceofDef */
+ $instanceofDef = clone $instanceofDef;
+ $instanceofDef->setAbstract(true)->setParent($parent ?: '.abstract.instanceof.'.$id);
+ $parent = '.instanceof.'.$interface.'.'.$key.'.'.$id;
+ $container->setDefinition($parent, $instanceofDef);
+ $instanceofTags[] = $instanceofDef->getTags();
+ $instanceofBindings = $instanceofDef->getBindings() + $instanceofBindings;
+
+ foreach ($instanceofDef->getMethodCalls() as $methodCall) {
+ $instanceofCalls[] = $methodCall;
+ }
+
+ $instanceofDef->setTags([]);
+ $instanceofDef->setMethodCalls([]);
+ $instanceofDef->setBindings([]);
+
+ if (isset($instanceofDef->getChanges()['shared'])) {
+ $shared = $instanceofDef->isShared();
+ }
+ }
+ }
+
+ if ($parent) {
+ $bindings = $definition->getBindings();
+ $abstract = $container->setDefinition('.abstract.instanceof.'.$id, $definition);
+
+ // cast Definition to ChildDefinition
+ $definition->setBindings([]);
+ $definition = serialize($definition);
+ $definition = substr_replace($definition, '53', 2, 2);
+ $definition = substr_replace($definition, 'Child', 44, 0);
+ /** @var ChildDefinition $definition */
+ $definition = unserialize($definition);
+ $definition->setParent($parent);
+
+ if (null !== $shared && !isset($definition->getChanges()['shared'])) {
+ $definition->setShared($shared);
+ }
+
+ // Don't add tags to service decorators
+ if (null === $definition->getDecoratedService()) {
+ $i = \count($instanceofTags);
+ while (0 <= --$i) {
+ foreach ($instanceofTags[$i] as $k => $v) {
+ foreach ($v as $v) {
+ if ($definition->hasTag($k) && \in_array($v, $definition->getTag($k))) {
+ continue;
+ }
+ $definition->addTag($k, $v);
+ }
+ }
+ }
+ }
+
+ $definition->setMethodCalls(array_merge($instanceofCalls, $definition->getMethodCalls()));
+ $definition->setBindings($bindings + $instanceofBindings);
+
+ // reset fields with "merge" behavior
+ $abstract
+ ->setBindings([])
+ ->setArguments([])
+ ->setMethodCalls([])
+ ->setDecoratedService(null)
+ ->setTags([])
+ ->setAbstract(true);
+ }
+
+ return $definition;
+ }
+
+ private function mergeConditionals(array $autoconfiguredInstanceof, array $instanceofConditionals, ContainerBuilder $container): array
+ {
+ // make each value an array of ChildDefinition
+ $conditionals = array_map(function ($childDef) { return [$childDef]; }, $autoconfiguredInstanceof);
+
+ foreach ($instanceofConditionals as $interface => $instanceofDef) {
+ // make sure the interface/class exists (but don't validate automaticInstanceofConditionals)
+ if (!$container->getReflectionClass($interface)) {
+ throw new RuntimeException(sprintf('"%s" is set as an "instanceof" conditional, but it does not exist.', $interface));
+ }
+
+ if (!isset($autoconfiguredInstanceof[$interface])) {
+ $conditionals[$interface] = [];
+ }
+
+ $conditionals[$interface][] = $instanceofDef;
+ }
+
+ return $conditionals;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php
new file mode 100644
index 0000000..948de42
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveInvalidReferencesPass.php
@@ -0,0 +1,136 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\ArgumentInterface;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\RuntimeException;
+use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\TypedReference;
+
+/**
+ * Emulates the invalid behavior if the reference is not found within the
+ * container.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveInvalidReferencesPass implements CompilerPassInterface
+{
+ private $container;
+ private $signalingException;
+ private $currentId;
+
+ /**
+ * Process the ContainerBuilder to resolve invalid references.
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->container = $container;
+ $this->signalingException = new RuntimeException('Invalid reference.');
+
+ try {
+ foreach ($container->getDefinitions() as $this->currentId => $definition) {
+ $this->processValue($definition);
+ }
+ } finally {
+ $this->container = $this->signalingException = null;
+ }
+ }
+
+ /**
+ * Processes arguments to determine invalid references.
+ *
+ * @return mixed
+ *
+ * @throws RuntimeException When an invalid reference is found
+ */
+ private function processValue($value, int $rootLevel = 0, int $level = 0)
+ {
+ if ($value instanceof ServiceClosureArgument) {
+ $value->setValues($this->processValue($value->getValues(), 1, 1));
+ } elseif ($value instanceof ArgumentInterface) {
+ $value->setValues($this->processValue($value->getValues(), $rootLevel, 1 + $level));
+ } elseif ($value instanceof Definition) {
+ if ($value->isSynthetic() || $value->isAbstract()) {
+ return $value;
+ }
+ $value->setArguments($this->processValue($value->getArguments(), 0));
+ $value->setProperties($this->processValue($value->getProperties(), 1));
+ $value->setMethodCalls($this->processValue($value->getMethodCalls(), 2));
+ } elseif (\is_array($value)) {
+ $i = 0;
+
+ foreach ($value as $k => $v) {
+ try {
+ if (false !== $i && $k !== $i++) {
+ $i = false;
+ }
+ if ($v !== $processedValue = $this->processValue($v, $rootLevel, 1 + $level)) {
+ $value[$k] = $processedValue;
+ }
+ } catch (RuntimeException $e) {
+ if ($rootLevel < $level || ($rootLevel && !$level)) {
+ unset($value[$k]);
+ } elseif ($rootLevel) {
+ throw $e;
+ } else {
+ $value[$k] = null;
+ }
+ }
+ }
+
+ // Ensure numerically indexed arguments have sequential numeric keys.
+ if (false !== $i) {
+ $value = array_values($value);
+ }
+ } elseif ($value instanceof Reference) {
+ if ($this->container->has($id = (string) $value)) {
+ return $value;
+ }
+
+ $currentDefinition = $this->container->getDefinition($this->currentId);
+
+ // resolve decorated service behavior depending on decorator service
+ if ($currentDefinition->innerServiceId === $id && ContainerInterface::NULL_ON_INVALID_REFERENCE === $currentDefinition->decorationOnInvalid) {
+ return null;
+ }
+
+ $invalidBehavior = $value->getInvalidBehavior();
+
+ if (ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior && $value instanceof TypedReference && !$this->container->has($id)) {
+ $e = new ServiceNotFoundException($id, $this->currentId);
+
+ // since the error message varies by $id and $this->currentId, so should the id of the dummy errored definition
+ $this->container->register($id = sprintf('.errored.%s.%s', $this->currentId, $id), $value->getType())
+ ->addError($e->getMessage());
+
+ return new TypedReference($id, $value->getType(), $value->getInvalidBehavior());
+ }
+
+ // resolve invalid behavior
+ if (ContainerInterface::NULL_ON_INVALID_REFERENCE === $invalidBehavior) {
+ $value = null;
+ } elseif (ContainerInterface::IGNORE_ON_INVALID_REFERENCE === $invalidBehavior) {
+ if (0 < $level || $rootLevel) {
+ throw $this->signalingException;
+ }
+ $value = null;
+ }
+ }
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php
new file mode 100644
index 0000000..6004cc3
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveNamedArgumentsPass.php
@@ -0,0 +1,112 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\LazyProxy\ProxyHelper;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Resolves named arguments to their corresponding numeric index.
+ *
+ * @author Kévin Dunglas <dunglas@gmail.com>
+ */
+class ResolveNamedArgumentsPass extends AbstractRecursivePass
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Definition) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $calls = $value->getMethodCalls();
+ $calls[] = ['__construct', $value->getArguments()];
+
+ foreach ($calls as $i => $call) {
+ list($method, $arguments) = $call;
+ $parameters = null;
+ $resolvedArguments = [];
+
+ foreach ($arguments as $key => $argument) {
+ if (\is_int($key)) {
+ $resolvedArguments[$key] = $argument;
+ continue;
+ }
+
+ if (null === $parameters) {
+ $r = $this->getReflectionMethod($value, $method);
+ $class = $r instanceof \ReflectionMethod ? $r->class : $this->currentId;
+ $method = $r->getName();
+ $parameters = $r->getParameters();
+ }
+
+ if (isset($key[0]) && '$' !== $key[0] && !class_exists($key) && !interface_exists($key, false)) {
+ throw new InvalidArgumentException(sprintf('Invalid service "%s": did you forget to add the "$" prefix to argument "%s"?', $this->currentId, $key));
+ }
+
+ if (isset($key[0]) && '$' === $key[0]) {
+ foreach ($parameters as $j => $p) {
+ if ($key === '$'.$p->name) {
+ if ($p->isVariadic() && \is_array($argument)) {
+ foreach ($argument as $variadicArgument) {
+ $resolvedArguments[$j++] = $variadicArgument;
+ }
+ } else {
+ $resolvedArguments[$j] = $argument;
+ }
+
+ continue 2;
+ }
+ }
+
+ throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument named "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key));
+ }
+
+ if (null !== $argument && !$argument instanceof Reference && !$argument instanceof Definition) {
+ throw new InvalidArgumentException(sprintf('Invalid service "%s": the value of argument "%s" of method "%s()" must be null, an instance of %s or an instance of %s, %s given.', $this->currentId, $key, $class !== $this->currentId ? $class.'::'.$method : $method, Reference::class, Definition::class, \gettype($argument)));
+ }
+
+ $typeFound = false;
+ foreach ($parameters as $j => $p) {
+ if (!\array_key_exists($j, $resolvedArguments) && ProxyHelper::getTypeHint($r, $p, true) === $key) {
+ $resolvedArguments[$j] = $argument;
+ $typeFound = true;
+ }
+ }
+
+ if (!$typeFound) {
+ throw new InvalidArgumentException(sprintf('Invalid service "%s": method "%s()" has no argument type-hinted as "%s". Check your service definition.', $this->currentId, $class !== $this->currentId ? $class.'::'.$method : $method, $key));
+ }
+ }
+
+ if ($resolvedArguments !== $call[1]) {
+ ksort($resolvedArguments);
+ $calls[$i][1] = $resolvedArguments;
+ }
+ }
+
+ list(, $arguments) = array_pop($calls);
+
+ if ($arguments !== $value->getArguments()) {
+ $value->setArguments($arguments);
+ }
+ if ($calls !== $value->getMethodCalls()) {
+ $value->setMethodCalls($calls);
+ }
+
+ return parent::processValue($value, $isRoot);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php
new file mode 100644
index 0000000..2dec13f
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveParameterPlaceHoldersPass.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
+
+/**
+ * Resolves all parameter placeholders "%somevalue%" to their real values.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveParameterPlaceHoldersPass extends AbstractRecursivePass
+{
+ private $bag;
+ private $resolveArrays;
+
+ public function __construct(bool $resolveArrays = true)
+ {
+ $this->resolveArrays = $resolveArrays;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @throws ParameterNotFoundException
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->bag = $container->getParameterBag();
+
+ try {
+ parent::process($container);
+
+ $aliases = [];
+ foreach ($container->getAliases() as $name => $target) {
+ $this->currentId = $name;
+ $aliases[$this->bag->resolveValue($name)] = $target;
+ }
+ $container->setAliases($aliases);
+ } catch (ParameterNotFoundException $e) {
+ $e->setSourceId($this->currentId);
+
+ throw $e;
+ }
+
+ $this->bag->resolve();
+ $this->bag = null;
+ }
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if (\is_string($value)) {
+ $v = $this->bag->resolveValue($value);
+
+ return $this->resolveArrays || !$v || !\is_array($v) ? $v : $value;
+ }
+ if ($value instanceof Definition) {
+ $value->setBindings($this->processValue($value->getBindings()));
+ $changes = $value->getChanges();
+ if (isset($changes['class'])) {
+ $value->setClass($this->bag->resolveValue($value->getClass()));
+ }
+ if (isset($changes['file'])) {
+ $value->setFile($this->bag->resolveValue($value->getFile()));
+ }
+ }
+
+ $value = parent::processValue($value, $isRoot);
+
+ if ($value && \is_array($value)) {
+ $value = array_combine($this->bag->resolveValue(array_keys($value)), $value);
+ }
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php
new file mode 100644
index 0000000..1bd9934
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolvePrivatesPass.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolvePrivatesPass implements CompilerPassInterface
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ foreach ($container->getDefinitions() as $id => $definition) {
+ if ($definition->isPrivate()) {
+ $definition->setPublic(false);
+ $definition->setPrivate(true);
+ }
+ }
+
+ foreach ($container->getAliases() as $id => $alias) {
+ if ($alias->isPrivate()) {
+ $alias->setPublic(false);
+ $alias->setPrivate(true);
+ }
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
new file mode 100644
index 0000000..bf9ea2b
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Replaces all references to aliases with references to the actual service.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ResolveReferencesToAliasesPass extends AbstractRecursivePass
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ parent::process($container);
+
+ foreach ($container->getAliases() as $id => $alias) {
+ $aliasId = (string) $alias;
+ $this->currentId = $id;
+
+ if ($aliasId !== $defId = $this->getDefinitionId($aliasId, $container)) {
+ $container->setAlias($id, $defId)->setPublic($alias->isPublic())->setPrivate($alias->isPrivate());
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof Reference) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $defId = $this->getDefinitionId($id = (string) $value, $this->container);
+
+ return $defId !== $id ? new Reference($defId, $value->getInvalidBehavior()) : $value;
+ }
+
+ private function getDefinitionId(string $id, ContainerBuilder $container): string
+ {
+ if (!$container->hasAlias($id)) {
+ return $id;
+ }
+
+ $alias = $container->getAlias($id);
+
+ if ($alias->isDeprecated()) {
+ @trigger_error(sprintf('%s. It is being referenced by the "%s" %s.', rtrim($alias->getDeprecationMessage($id), '. '), $this->currentId, $container->hasDefinition($this->currentId) ? 'service' : 'alias'), E_USER_DEPRECATED);
+ }
+
+ $seen = [];
+ do {
+ if (isset($seen[$id])) {
+ throw new ServiceCircularReferenceException($id, array_merge(array_keys($seen), [$id]));
+ }
+
+ $seen[$id] = true;
+ $id = (string) $container->getAlias($id);
+ } while ($container->hasAlias($id));
+
+ return $id;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php
new file mode 100644
index 0000000..399f349
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveServiceSubscribersPass.php
@@ -0,0 +1,52 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Psr\Container\ContainerInterface;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Contracts\Service\ServiceProviderInterface;
+
+/**
+ * Compiler pass to inject their service locator to service subscribers.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResolveServiceSubscribersPass extends AbstractRecursivePass
+{
+ private $serviceLocator;
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof Reference && $this->serviceLocator && \in_array((string) $value, [ContainerInterface::class, ServiceProviderInterface::class], true)) {
+ return new Reference($this->serviceLocator);
+ }
+
+ if (!$value instanceof Definition) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $serviceLocator = $this->serviceLocator;
+ $this->serviceLocator = null;
+
+ if ($value->hasTag('container.service_subscriber.locator')) {
+ $this->serviceLocator = $value->getTag('container.service_subscriber.locator')[0]['id'];
+ $value->clearTag('container.service_subscriber.locator');
+ }
+
+ try {
+ return parent::processValue($value);
+ } finally {
+ $this->serviceLocator = $serviceLocator;
+ }
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php
new file mode 100644
index 0000000..a430572
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ResolveTaggedIteratorArgumentPass.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument;
+
+/**
+ * Resolves all TaggedIteratorArgument arguments.
+ *
+ * @author Roland Franssen <franssen.roland@gmail.com>
+ */
+class ResolveTaggedIteratorArgumentPass extends AbstractRecursivePass
+{
+ use PriorityTaggedServiceTrait;
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function processValue($value, $isRoot = false)
+ {
+ if (!$value instanceof TaggedIteratorArgument) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ $value->setValues($this->findAndSortTaggedServices($value, $this->container));
+
+ return $value;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php
new file mode 100644
index 0000000..5fdbe56
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceLocatorTagPass.php
@@ -0,0 +1,135 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
+use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Reference;
+use Symfony\Component\DependencyInjection\ServiceLocator;
+
+/**
+ * Applies the "container.service_locator" tag by wrapping references into ServiceClosureArgument instances.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+final class ServiceLocatorTagPass extends AbstractRecursivePass
+{
+ use PriorityTaggedServiceTrait;
+
+ protected function processValue($value, $isRoot = false)
+ {
+ if ($value instanceof ServiceLocatorArgument) {
+ if ($value->getTaggedIteratorArgument()) {
+ $value->setValues($this->findAndSortTaggedServices($value->getTaggedIteratorArgument(), $this->container));
+ }
+
+ return self::register($this->container, $value->getValues());
+ }
+
+ if (!$value instanceof Definition || !$value->hasTag('container.service_locator')) {
+ return parent::processValue($value, $isRoot);
+ }
+
+ if (!$value->getClass()) {
+ $value->setClass(ServiceLocator::class);
+ }
+
+ $arguments = $value->getArguments();
+ if (!isset($arguments[0]) || !\is_array($arguments[0])) {
+ throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set.', $this->currentId));
+ }
+
+ $i = 0;
+
+ foreach ($arguments[0] as $k => $v) {
+ if ($v instanceof ServiceClosureArgument) {
+ continue;
+ }
+ if (!$v instanceof Reference) {
+ throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set, "%s" found for key "%s".', $this->currentId, \is_object($v) ? \get_class($v) : \gettype($v), $k));
+ }
+
+ if ($i === $k) {
+ unset($arguments[0][$k]);
+
+ $k = (string) $v;
+ ++$i;
+ } elseif (\is_int($k)) {
+ $i = null;
+ }
+ $arguments[0][$k] = new ServiceClosureArgument($v);
+ }
+ ksort($arguments[0]);
+
+ $value->setArguments($arguments);
+
+ $id = '.service_locator.'.ContainerBuilder::hash($value);
+
+ if ($isRoot) {
+ if ($id !== $this->currentId) {
+ $this->container->setAlias($id, new Alias($this->currentId, false));
+ }
+
+ return $value;
+ }
+
+ $this->container->setDefinition($id, $value->setPublic(false));
+
+ return new Reference($id);
+ }
+
+ /**
+ * @param Reference[] $refMap
+ */
+ public static function register(ContainerBuilder $container, array $refMap, string $callerId = null): Reference
+ {
+ foreach ($refMap as $id => $ref) {
+ if (!$ref instanceof Reference) {
+ throw new InvalidArgumentException(sprintf('Invalid service locator definition: only services can be referenced, "%s" found for key "%s". Inject parameter values using constructors instead.', \is_object($ref) ? \get_class($ref) : \gettype($ref), $id));
+ }
+ $refMap[$id] = new ServiceClosureArgument($ref);
+ }
+ ksort($refMap);
+
+ $locator = (new Definition(ServiceLocator::class))
+ ->addArgument($refMap)
+ ->setPublic(false)
+ ->addTag('container.service_locator');
+
+ if (null !== $callerId && $container->hasDefinition($callerId)) {
+ $locator->setBindings($container->getDefinition($callerId)->getBindings());
+ }
+
+ if (!$container->hasDefinition($id = '.service_locator.'.ContainerBuilder::hash($locator))) {
+ $container->setDefinition($id, $locator);
+ }
+
+ if (null !== $callerId) {
+ $locatorId = $id;
+ // Locators are shared when they hold the exact same list of factories;
+ // to have them specialized per consumer service, we use a cloning factory
+ // to derivate customized instances from the prototype one.
+ $container->register($id .= '.'.$callerId, ServiceLocator::class)
+ ->setPublic(false)
+ ->setFactory([new Reference($locatorId), 'withContext'])
+ ->addTag('container.service_locator_context', ['id' => $callerId])
+ ->addArgument($callerId)
+ ->addArgument(new Reference('service_container'));
+ }
+
+ return new Reference($id);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php
new file mode 100644
index 0000000..308abc6
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraph.php
@@ -0,0 +1,98 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+
+/**
+ * This is a directed graph of your services.
+ *
+ * This information can be used by your compiler passes instead of collecting
+ * it themselves which improves performance quite a lot.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ *
+ * @final
+ */
+class ServiceReferenceGraph
+{
+ /**
+ * @var ServiceReferenceGraphNode[]
+ */
+ private $nodes = [];
+
+ public function hasNode(string $id): bool
+ {
+ return isset($this->nodes[$id]);
+ }
+
+ /**
+ * Gets a node by identifier.
+ *
+ * @throws InvalidArgumentException if no node matches the supplied identifier
+ */
+ public function getNode(string $id): ServiceReferenceGraphNode
+ {
+ if (!isset($this->nodes[$id])) {
+ throw new InvalidArgumentException(sprintf('There is no node with id "%s".', $id));
+ }
+
+ return $this->nodes[$id];
+ }
+
+ /**
+ * Returns all nodes.
+ *
+ * @return ServiceReferenceGraphNode[]
+ */
+ public function getNodes(): array
+ {
+ return $this->nodes;
+ }
+
+ /**
+ * Clears all nodes.
+ */
+ public function clear()
+ {
+ foreach ($this->nodes as $node) {
+ $node->clear();
+ }
+ $this->nodes = [];
+ }
+
+ /**
+ * Connects 2 nodes together in the Graph.
+ */
+ public function connect(?string $sourceId, $sourceValue, ?string $destId, $destValue = null, $reference = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false)
+ {
+ if (null === $sourceId || null === $destId) {
+ return;
+ }
+
+ $sourceNode = $this->createNode($sourceId, $sourceValue);
+ $destNode = $this->createNode($destId, $destValue);
+ $edge = new ServiceReferenceGraphEdge($sourceNode, $destNode, $reference, $lazy, $weak, $byConstructor);
+
+ $sourceNode->addOutEdge($edge);
+ $destNode->addInEdge($edge);
+ }
+
+ private function createNode(string $id, $value): ServiceReferenceGraphNode
+ {
+ if (isset($this->nodes[$id]) && $this->nodes[$id]->getValue() === $value) {
+ return $this->nodes[$id];
+ }
+
+ return $this->nodes[$id] = new ServiceReferenceGraphNode($id, $value);
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php
new file mode 100644
index 0000000..9861456
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphEdge.php
@@ -0,0 +1,99 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+/**
+ * Represents an edge in your service graph.
+ *
+ * Value is typically a reference.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceReferenceGraphEdge
+{
+ private $sourceNode;
+ private $destNode;
+ private $value;
+ private $lazy;
+ private $weak;
+ private $byConstructor;
+
+ public function __construct(ServiceReferenceGraphNode $sourceNode, ServiceReferenceGraphNode $destNode, $value = null, bool $lazy = false, bool $weak = false, bool $byConstructor = false)
+ {
+ $this->sourceNode = $sourceNode;
+ $this->destNode = $destNode;
+ $this->value = $value;
+ $this->lazy = $lazy;
+ $this->weak = $weak;
+ $this->byConstructor = $byConstructor;
+ }
+
+ /**
+ * Returns the value of the edge.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Returns the source node.
+ *
+ * @return ServiceReferenceGraphNode
+ */
+ public function getSourceNode()
+ {
+ return $this->sourceNode;
+ }
+
+ /**
+ * Returns the destination node.
+ *
+ * @return ServiceReferenceGraphNode
+ */
+ public function getDestNode()
+ {
+ return $this->destNode;
+ }
+
+ /**
+ * Returns true if the edge is lazy, meaning it's a dependency not requiring direct instantiation.
+ *
+ * @return bool
+ */
+ public function isLazy()
+ {
+ return $this->lazy;
+ }
+
+ /**
+ * Returns true if the edge is weak, meaning it shouldn't prevent removing the target service.
+ *
+ * @return bool
+ */
+ public function isWeak()
+ {
+ return $this->weak;
+ }
+
+ /**
+ * Returns true if the edge links with a constructor argument.
+ *
+ * @return bool
+ */
+ public function isReferencedByConstructor()
+ {
+ return $this->byConstructor;
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php
new file mode 100644
index 0000000..fec1424
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ServiceReferenceGraphNode.php
@@ -0,0 +1,118 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Alias;
+use Symfony\Component\DependencyInjection\Definition;
+
+/**
+ * Represents a node in your service graph.
+ *
+ * Value is typically a definition, or an alias.
+ *
+ * @author Johannes M. Schmitt <schmittjoh@gmail.com>
+ */
+class ServiceReferenceGraphNode
+{
+ private $id;
+ private $inEdges = [];
+ private $outEdges = [];
+ private $value;
+
+ /**
+ * @param string $id The node identifier
+ * @param mixed $value The node value
+ */
+ public function __construct(string $id, $value)
+ {
+ $this->id = $id;
+ $this->value = $value;
+ }
+
+ public function addInEdge(ServiceReferenceGraphEdge $edge)
+ {
+ $this->inEdges[] = $edge;
+ }
+
+ public function addOutEdge(ServiceReferenceGraphEdge $edge)
+ {
+ $this->outEdges[] = $edge;
+ }
+
+ /**
+ * Checks if the value of this node is an Alias.
+ *
+ * @return bool True if the value is an Alias instance
+ */
+ public function isAlias()
+ {
+ return $this->value instanceof Alias;
+ }
+
+ /**
+ * Checks if the value of this node is a Definition.
+ *
+ * @return bool True if the value is a Definition instance
+ */
+ public function isDefinition()
+ {
+ return $this->value instanceof Definition;
+ }
+
+ /**
+ * Returns the identifier.
+ *
+ * @return string
+ */
+ public function getId()
+ {
+ return $this->id;
+ }
+
+ /**
+ * Returns the in edges.
+ *
+ * @return ServiceReferenceGraphEdge[]
+ */
+ public function getInEdges()
+ {
+ return $this->inEdges;
+ }
+
+ /**
+ * Returns the out edges.
+ *
+ * @return ServiceReferenceGraphEdge[]
+ */
+ public function getOutEdges()
+ {
+ return $this->outEdges;
+ }
+
+ /**
+ * Returns the value of this Node.
+ *
+ * @return mixed The value
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Clears all edges.
+ */
+ public function clear()
+ {
+ $this->inEdges = $this->outEdges = [];
+ }
+}
diff --git a/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php
new file mode 100644
index 0000000..8fd84fa
--- /dev/null
+++ b/srcs/phpmyadmin/vendor/symfony/dependency-injection/Compiler/ValidateEnvPlaceholdersPass.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Compiler;
+
+use Symfony\Component\Config\Definition\BaseNode;
+use Symfony\Component\Config\Definition\Exception\TreeWithoutRootNodeException;
+use Symfony\Component\Config\Definition\Processor;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Extension\ConfigurationExtensionInterface;
+use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+
+/**
+ * Validates environment variable placeholders used in extension configuration with dummy values.
+ *
+ * @author Roland Franssen <franssen.roland@gmail.com>
+ */
+class ValidateEnvPlaceholdersPass implements CompilerPassInterface
+{
+ private static $typeFixtures = ['array' => [], 'bool' => false, 'float' => 0.0, 'int' => 0, 'string' => ''];
+
+ private $extensionConfig = [];
+
+ /**
+ * {@inheritdoc}
+ */
+ public function process(ContainerBuilder $container)
+ {
+ $this->extensionConfig = [];
+
+ if (!class_exists(BaseNode::class) || !$extensions = $container->getExtensions()) {
+ return;
+ }
+
+ $resolvingBag = $container->getParameterBag();
+ if (!$resolvingBag instanceof EnvPlaceholderParameterBag) {
+ return;
+ }
+
+ $defaultBag = new ParameterBag($resolvingBag->all());
+ $envTypes = $resolvingBag->getProvidedTypes();
+ try {
+ foreach ($resolvingBag->getEnvPlaceholders() + $resolvingBag->getUnusedEnvPlaceholders() as $env => $placeholders) {
+ $values = [];
+ if (false === $i = strpos($env, ':')) {
+ $default = $defaultBag->has("env($env)") ? $defaultBag->get("env($env)") : self::$typeFixtures['string'];
+ $defaultType = null !== $default ? self::getType($default) : 'string';
+ $values[$defaultType] = $default;
+ } else {
+ $prefix = substr($env, 0, $i);
+ foreach ($envTypes[$prefix] ?? ['string'] as $type) {
+ $values[$type] = self::$typeFixtures[$type] ?? null;
+ }
+ }
+ foreach ($placeholders as $placeholder) {
+ BaseNode::setPlaceholder($placeholder, $values);
+ }
+ }
+
+ $processor = new Processor();
+
+ foreach ($extensions as $name => $extension) {
+ if (!$extension instanceof ConfigurationExtensionInterface || !$config = array_filter($container->getExtensionConfig($name))) {
+ // this extension has no semantic configuration or was not called
+ continue;
+ }
+
+ $config = $resolvingBag->resolveValue($config);
+
+ if (null === $configuration = $extension->getConfiguration($config, $container)) {
+ continue;
+ }
+
+ try {
+ $this->extensionConfig[$name] = $processor->processConfiguration($configuration, $config);
+ } catch (TreeWithoutRootNodeException $e) {
+ }
+ }
+ } finally {
+ BaseNode::resetPlaceholders();
+ }
+
+ $resolvingBag->clearUnusedEnvPlaceholders();
+ }
+
+ /**
+ * @internal
+ */
+ public function getExtensionConfig(): array
+ {
+ try {
+ return $this->extensionConfig;
+ } finally {
+ $this->extensionConfig = [];
+ }
+ }
+
+ private static function getType($value): string
+ {
+ switch ($type = \gettype($value)) {
+ case 'boolean':
+ return 'bool';
+ case 'double':
+ return 'float';
+ case 'integer':
+ return 'int';
+ }
+
+ return $type;
+ }
+}