+ * @author Nicolas Grekas
*/
class ResolveDefinitionTemplatesPass implements CompilerPassInterface
{
- private $container;
private $compiler;
private $formatter;
+ private $currentId;
/**
* Process the ContainerBuilder to replace DefinitionDecorator instances with their real Definition instances.
@@ -35,44 +36,80 @@ class ResolveDefinitionTemplatesPass implements CompilerPassInterface
*/
public function process(ContainerBuilder $container)
{
- $this->container = $container;
$this->compiler = $container->getCompiler();
$this->formatter = $this->compiler->getLoggingFormatter();
- foreach ($container->getDefinitions() as $id => $definition) {
- // yes, we are specifically fetching the definition from the
- // container to ensure we are not operating on stale data
- $definition = $container->getDefinition($id);
- if (!$definition instanceof DefinitionDecorator || $definition->isAbstract()) {
- continue;
- }
+ $container->setDefinitions($this->resolveArguments($container, $container->getDefinitions(), true));
+ }
- $this->resolveDefinition($id, $definition);
+ /**
+ * Resolves definition decorator arguments.
+ *
+ * @param ContainerBuilder $container The ContainerBuilder
+ * @param array $arguments An array of arguments
+ * @param bool $isRoot If we are processing the root definitions or not
+ *
+ * @return array
+ */
+ private function resolveArguments(ContainerBuilder $container, array $arguments, $isRoot = false)
+ {
+ foreach ($arguments as $k => $argument) {
+ if ($isRoot) {
+ // yes, we are specifically fetching the definition from the
+ // container to ensure we are not operating on stale data
+ $arguments[$k] = $argument = $container->getDefinition($k);
+ $this->currentId = $k;
+ }
+ if (is_array($argument)) {
+ $arguments[$k] = $this->resolveArguments($container, $argument);
+ } elseif ($argument instanceof Definition) {
+ if ($argument instanceof DefinitionDecorator) {
+ $arguments[$k] = $argument = $this->resolveDefinition($container, $argument);
+ if ($isRoot) {
+ $container->setDefinition($k, $argument);
+ }
+ }
+ $argument->setArguments($this->resolveArguments($container, $argument->getArguments()));
+ $argument->setMethodCalls($this->resolveArguments($container, $argument->getMethodCalls()));
+ $argument->setProperties($this->resolveArguments($container, $argument->getProperties()));
+
+ $configurator = $this->resolveArguments($container, array($argument->getConfigurator()));
+ $argument->setConfigurator($configurator[0]);
+
+ $factory = $this->resolveArguments($container, array($argument->getFactory()));
+ $argument->setFactory($factory[0]);
+ }
}
+
+ return $arguments;
}
/**
* Resolves the definition.
*
- * @param string $id The definition identifier
+ * @param ContainerBuilder $container The ContainerBuilder
* @param DefinitionDecorator $definition
*
* @return Definition
*
* @throws \RuntimeException When the definition is invalid
*/
- private function resolveDefinition($id, DefinitionDecorator $definition)
+ private function resolveDefinition(ContainerBuilder $container, DefinitionDecorator $definition)
{
- if (!$this->container->hasDefinition($parent = $definition->getParent())) {
- throw new RuntimeException(sprintf('The parent definition "%s" defined for definition "%s" does not exist.', $parent, $id));
+ if (!$container->hasDefinition($parent = $definition->getParent())) {
+ throw new RuntimeException(sprintf('The parent definition "%s" defined for definition "%s" does not exist.', $parent, $this->currentId));
}
- $parentDef = $this->container->getDefinition($parent);
+ $parentDef = $container->getDefinition($parent);
if ($parentDef instanceof DefinitionDecorator) {
- $parentDef = $this->resolveDefinition($parent, $parentDef);
+ $id = $this->currentId;
+ $this->currentId = $parent;
+ $parentDef = $this->resolveDefinition($container, $parentDef);
+ $container->setDefinition($parent, $parentDef);
+ $this->currentId = $id;
}
- $this->compiler->addLogMessage($this->formatter->formatResolveInheritance($this, $id, $parent));
+ $this->compiler->addLogMessage($this->formatter->formatResolveInheritance($this, $this->currentId, $parent));
$def = new Definition();
// merge in parent definition
@@ -81,6 +118,7 @@ private function resolveDefinition($id, DefinitionDecorator $definition)
$def->setArguments($parentDef->getArguments());
$def->setMethodCalls($parentDef->getMethodCalls());
$def->setProperties($parentDef->getProperties());
+ $def->setAutowiringTypes($parentDef->getAutowiringTypes());
if ($parentDef->getFactoryClass(false)) {
$def->setFactoryClass($parentDef->getFactoryClass(false));
}
@@ -90,6 +128,9 @@ private function resolveDefinition($id, DefinitionDecorator $definition)
if ($parentDef->getFactoryService(false)) {
$def->setFactoryService($parentDef->getFactoryService(false));
}
+ if ($parentDef->isDeprecated()) {
+ $def->setDeprecated(true, $parentDef->getDeprecationMessage('%service_id%'));
+ }
$def->setFactory($parentDef->getFactory());
$def->setConfigurator($parentDef->getConfigurator());
$def->setFile($parentDef->getFile());
@@ -125,6 +166,9 @@ private function resolveDefinition($id, DefinitionDecorator $definition)
if (isset($changes['lazy'])) {
$def->setLazy($definition->isLazy());
}
+ if (isset($changes['deprecated'])) {
+ $def->setDeprecated($definition->isDeprecated(), $definition->getDeprecationMessage('%service_id%'));
+ }
if (isset($changes['decorated_service'])) {
$decoratedService = $definition->getDecoratedService();
if (null === $decoratedService) {
@@ -159,14 +203,17 @@ private function resolveDefinition($id, DefinitionDecorator $definition)
$def->setMethodCalls(array_merge($def->getMethodCalls(), $calls));
}
+ // merge autowiring types
+ foreach ($definition->getAutowiringTypes() as $autowiringType) {
+ $def->addAutowiringType($autowiringType);
+ }
+
// these attributes are always taken from the child
$def->setAbstract($definition->isAbstract());
- $def->setScope($definition->getScope());
+ $def->setScope($definition->getScope(false), false);
+ $def->setShared($definition->isShared());
$def->setTags($definition->getTags());
- // set new definition on container
- $this->container->setDefinition($id, $def);
-
return $def;
}
}
diff --git a/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php b/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
index c90d76f..3111d7f 100644
--- a/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
+++ b/vendor/symfony/dependency-injection/Compiler/ResolveReferencesToAliasesPass.php
@@ -68,7 +68,7 @@ private function processArguments(array $arguments)
$defId = $this->getDefinitionId($id = (string) $argument);
if ($defId !== $id) {
- $arguments[$k] = new Reference($defId, $argument->getInvalidBehavior(), $argument->isStrict());
+ $arguments[$k] = new Reference($defId, $argument->getInvalidBehavior(), $argument->isStrict(false));
}
}
}
diff --git a/vendor/symfony/dependency-injection/Container.php b/vendor/symfony/dependency-injection/Container.php
index 510d030..7c05663 100644
--- a/vendor/symfony/dependency-injection/Container.php
+++ b/vendor/symfony/dependency-injection/Container.php
@@ -13,6 +13,7 @@
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
+use Symfony\Component\DependencyInjection\Exception\LogicException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException;
@@ -58,7 +59,7 @@
* @author Fabien Potencier
* @author Johannes M. Schmitt
*/
-class Container implements IntrospectableContainerInterface
+class Container implements IntrospectableContainerInterface, ResettableContainerInterface
{
/**
* @var ParameterBagInterface
@@ -164,6 +165,8 @@ public function setParameter($name, $value)
* Setting a service to null resets the service: has() returns false and get()
* behaves in the same way as if the service was never created.
*
+ * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+ *
* @param string $id The service identifier
* @param object $service The service instance
* @param string $scope The scope of the service
@@ -173,6 +176,10 @@ public function setParameter($name, $value)
*/
public function set($id, $service, $scope = self::SCOPE_CONTAINER)
{
+ if (!in_array($scope, array('container', 'request')) || ('request' === $scope && 'request' !== $id)) {
+ @trigger_error('The concept of container scopes is deprecated since version 2.8 and will be removed in 3.0. Omit the third parameter.', E_USER_DEPRECATED);
+ }
+
if (self::SCOPE_PROTOTYPE === $scope) {
throw new InvalidArgumentException(sprintf('You cannot set service "%s" of scope "prototype".', $id));
}
@@ -305,10 +312,7 @@ public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE
$service = $this->$method();
} catch (\Exception $e) {
unset($this->loading[$id]);
-
- if (array_key_exists($id, $this->services)) {
- unset($this->services[$id]);
- }
+ unset($this->services[$id]);
if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) {
return;
@@ -348,6 +352,18 @@ public function initialized($id)
}
/**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ if (!empty($this->scopedServices)) {
+ throw new LogicException('Resetting the container is not allowed when a scope is active.');
+ }
+
+ $this->services = array();
+ }
+
+ /**
* Gets all service ids.
*
* @return array An array of all defined service ids
@@ -373,9 +389,15 @@ public function getServiceIds()
*
* @throws RuntimeException When the parent scope is inactive
* @throws InvalidArgumentException When the scope does not exist
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function enterScope($name)
{
+ if ('request' !== $name) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
if (!isset($this->scopes[$name])) {
throw new InvalidArgumentException(sprintf('The scope "%s" does not exist.', $name));
}
@@ -419,9 +441,15 @@ public function enterScope($name)
* @param string $name The name of the scope to leave
*
* @throws InvalidArgumentException if the scope is not active
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function leaveScope($name)
{
+ if ('request' !== $name) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
if (!isset($this->scopedServices[$name])) {
throw new InvalidArgumentException(sprintf('The scope "%s" is not active.', $name));
}
@@ -464,12 +492,17 @@ public function leaveScope($name)
* @param ScopeInterface $scope
*
* @throws InvalidArgumentException
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function addScope(ScopeInterface $scope)
{
$name = $scope->getName();
$parentScope = $scope->getParentName();
+ if ('request' !== $name) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
if (self::SCOPE_CONTAINER === $name || self::SCOPE_PROTOTYPE === $name) {
throw new InvalidArgumentException(sprintf('The scope "%s" is reserved.', $name));
}
@@ -496,9 +529,15 @@ public function addScope(ScopeInterface $scope)
* @param string $name The name of the scope
*
* @return bool
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function hasScope($name)
{
+ if ('request' !== $name) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
return isset($this->scopes[$name]);
}
@@ -510,9 +549,13 @@ public function hasScope($name)
* @param string $name
*
* @return bool
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function isScopeActive($name)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
return isset($this->scopedServices[$name]);
}
@@ -537,6 +580,10 @@ public static function camelize($id)
*/
public static function underscore($id)
{
- return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), strtr($id, '_', '.')));
+ return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), str_replace('_', '.', $id)));
+ }
+
+ private function __clone()
+ {
}
}
diff --git a/vendor/symfony/dependency-injection/ContainerAware.php b/vendor/symfony/dependency-injection/ContainerAware.php
index af977fe..5686bf8 100644
--- a/vendor/symfony/dependency-injection/ContainerAware.php
+++ b/vendor/symfony/dependency-injection/ContainerAware.php
@@ -15,6 +15,8 @@
* A simple implementation of ContainerAwareInterface.
*
* @author Fabien Potencier
+ *
+ * @deprecated since version 2.8, to be removed in 3.0. Use the ContainerAwareTrait instead.
*/
abstract class ContainerAware implements ContainerAwareInterface
{
@@ -24,9 +26,9 @@
protected $container;
/**
- * Sets the Container associated with this Controller.
+ * Sets the container.
*
- * @param ContainerInterface $container A ContainerInterface instance
+ * @param ContainerInterface|null $container A ContainerInterface instance or null
*/
public function setContainer(ContainerInterface $container = null)
{
diff --git a/vendor/symfony/dependency-injection/ContainerAwareInterface.php b/vendor/symfony/dependency-injection/ContainerAwareInterface.php
index 7007265..fe301b6 100644
--- a/vendor/symfony/dependency-injection/ContainerAwareInterface.php
+++ b/vendor/symfony/dependency-injection/ContainerAwareInterface.php
@@ -19,7 +19,7 @@
interface ContainerAwareInterface
{
/**
- * Sets the Container.
+ * Sets the container.
*
* @param ContainerInterface|null $container A ContainerInterface instance or null
*/
diff --git a/vendor/symfony/dependency-injection/ContainerAwareTrait.php b/vendor/symfony/dependency-injection/ContainerAwareTrait.php
index 57280aa..ccf064f 100644
--- a/vendor/symfony/dependency-injection/ContainerAwareTrait.php
+++ b/vendor/symfony/dependency-injection/ContainerAwareTrait.php
@@ -24,9 +24,9 @@
protected $container;
/**
- * Sets the Container associated with this Controller.
+ * Sets the container.
*
- * @param ContainerInterface $container A ContainerInterface instance
+ * @param ContainerInterface|null $container A ContainerInterface instance or null
*/
public function setContainer(ContainerInterface $container = null)
{
diff --git a/vendor/symfony/dependency-injection/ContainerBuilder.php b/vendor/symfony/dependency-injection/ContainerBuilder.php
index d692873..1347f99 100644
--- a/vendor/symfony/dependency-injection/ContainerBuilder.php
+++ b/vendor/symfony/dependency-injection/ContainerBuilder.php
@@ -89,6 +89,11 @@ class ContainerBuilder extends Container implements TaggedContainerInterface
private $expressionLanguageProviders = array();
/**
+ * @var string[] with tag names used by findTaggedServiceIds
+ */
+ private $usedTags = array();
+
+ /**
* Sets the track resources flag.
*
* If you are not using the loaders and therefore don't want
@@ -330,9 +335,15 @@ public function getCompiler()
* Returns all Scopes.
*
* @return array An array of scopes
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
- public function getScopes()
+ public function getScopes($triggerDeprecationError = true)
{
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
return $this->scopes;
}
@@ -340,15 +351,23 @@ public function getScopes()
* Returns all Scope children.
*
* @return array An array of scope children.
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
- public function getScopeChildren()
+ public function getScopeChildren($triggerDeprecationError = true)
{
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
return $this->scopeChildren;
}
/**
* Sets a service.
*
+ * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+ *
* @param string $id The service identifier
* @param object $service The service instance
* @param string $scope The scope
@@ -843,6 +862,10 @@ public function createService(Definition $definition, $id, $tryProxy = true)
throw new RuntimeException(sprintf('You have requested a synthetic service ("%s"). The DIC does not know how to construct this service.', $id));
}
+ if ($definition->isDeprecated()) {
+ @trigger_error($definition->getDeprecationMessage($id), E_USER_DEPRECATED);
+ }
+
if ($tryProxy && $definition->isLazy()) {
$container = $this;
@@ -876,6 +899,14 @@ public function createService(Definition $definition, $id, $tryProxy = true)
}
$service = call_user_func_array($factory, $arguments);
+
+ if (!$definition->isDeprecated() && is_array($factory) && is_string($factory[0])) {
+ $r = new \ReflectionClass($factory[0]);
+
+ if (0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
+ @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" factory class. It should either be deprecated or its factory upgraded.', $id, $r->name), E_USER_DEPRECATED);
+ }
+ }
} elseif (null !== $definition->getFactoryMethod(false)) {
if (null !== $definition->getFactoryClass(false)) {
$factory = $parameterBag->resolveValue($definition->getFactoryClass(false));
@@ -890,6 +921,10 @@ public function createService(Definition $definition, $id, $tryProxy = true)
$r = new \ReflectionClass($parameterBag->resolveValue($definition->getClass()));
$service = null === $r->getConstructor() ? $r->newInstance() : $r->newInstanceArgs($arguments);
+
+ if (!$definition->isDeprecated() && 0 < strpos($r->getDocComment(), "\n * @deprecated ")) {
+ @trigger_error(sprintf('The "%s" service relies on the deprecated "%s" class. It should either be deprecated or its implementation upgraded.', $id, $r->name), E_USER_DEPRECATED);
+ }
}
if ($tryProxy || !$definition->isLazy()) {
@@ -901,7 +936,7 @@ public function createService(Definition $definition, $id, $tryProxy = true)
$this->callMethod($service, $call);
}
- $properties = $this->resolveServices($parameterBag->resolveValue($definition->getProperties()));
+ $properties = $this->resolveServices($parameterBag->unescapeValue($parameterBag->resolveValue($definition->getProperties())));
foreach ($properties as $name => $value) {
$service->$name = $value;
}
@@ -972,6 +1007,7 @@ public function resolveServices($value)
*/
public function findTaggedServiceIds($name)
{
+ $this->usedTags[] = $name;
$tags = array();
foreach ($this->getDefinitions() as $id => $definition) {
if ($definition->hasTag($name)) {
@@ -997,6 +1033,16 @@ public function findTags()
return array_unique($tags);
}
+ /**
+ * Returns all tags not queried by findTaggedServiceIds.
+ *
+ * @return string[] An array of tags
+ */
+ public function findUnusedTags()
+ {
+ return array_values(array_diff($this->findTags(), $this->usedTags));
+ }
+
public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
{
$this->expressionLanguageProviders[] = $provider;
@@ -1088,7 +1134,7 @@ private function callMethod($service, $call)
}
}
- call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->resolveValue($call[1])));
+ call_user_func_array(array($service, $call[0]), $this->resolveServices($this->getParameterBag()->unescapeValue($this->getParameterBag()->resolveValue($call[1]))));
}
/**
@@ -1102,7 +1148,7 @@ private function callMethod($service, $call)
*/
private function shareService(Definition $definition, $service, $id)
{
- if (self::SCOPE_PROTOTYPE !== $scope = $definition->getScope()) {
+ if ($definition->isShared() && self::SCOPE_PROTOTYPE !== $scope = $definition->getScope(false)) {
if (self::SCOPE_CONTAINER !== $scope && !isset($this->scopedServices[$scope])) {
throw new InactiveScopeException($id, $scope);
}
diff --git a/vendor/symfony/dependency-injection/ContainerInterface.php b/vendor/symfony/dependency-injection/ContainerInterface.php
index 80d6414..d9076eb 100644
--- a/vendor/symfony/dependency-injection/ContainerInterface.php
+++ b/vendor/symfony/dependency-injection/ContainerInterface.php
@@ -32,6 +32,8 @@
/**
* Sets a service.
*
+ * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0.
+ *
* @param string $id The service identifier
* @param object $service The service instance
* @param string $scope The scope of the service
@@ -94,6 +96,8 @@ public function setParameter($name, $value);
* Enters the given scope.
*
* @param string $name
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function enterScope($name);
@@ -101,6 +105,8 @@ public function enterScope($name);
* Leaves the current scope, and re-enters the parent scope.
*
* @param string $name
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function leaveScope($name);
@@ -108,6 +114,8 @@ public function leaveScope($name);
* Adds a scope to the container.
*
* @param ScopeInterface $scope
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function addScope(ScopeInterface $scope);
@@ -117,6 +125,8 @@ public function addScope(ScopeInterface $scope);
* @param string $name
*
* @return bool
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function hasScope($name);
@@ -128,6 +138,8 @@ public function hasScope($name);
* @param string $name
*
* @return bool
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
public function isScopeActive($name);
}
diff --git a/vendor/symfony/dependency-injection/Definition.php b/vendor/symfony/dependency-injection/Definition.php
index 777f4a6..6b7138e 100644
--- a/vendor/symfony/dependency-injection/Definition.php
+++ b/vendor/symfony/dependency-injection/Definition.php
@@ -27,6 +27,9 @@ class Definition
private $factoryClass;
private $factoryMethod;
private $factoryService;
+ private $shared = true;
+ private $deprecated = false;
+ private $deprecationTemplate = 'The "%service_id%" service is deprecated. You should stop using it, as it will soon be removed.';
private $scope = ContainerInterface::SCOPE_CONTAINER;
private $properties = array();
private $calls = array();
@@ -38,6 +41,8 @@ class Definition
private $synchronized = false;
private $lazy = false;
private $decoratedService;
+ private $autowired = false;
+ private $autowiringTypes = array();
protected $arguments;
@@ -139,12 +144,13 @@ public function setFactoryMethod($factoryMethod)
*
* @param null|string $id The decorated service id, use null to remove decoration
* @param null|string $renamedId The new decorated service id
+ * @param int $priority The priority of decoration
*
* @return Definition The current instance
*
* @throws InvalidArgumentException In case the decorated service id and the new decorated service id are equals.
*/
- public function setDecoratedService($id, $renamedId = null)
+ public function setDecoratedService($id, $renamedId = null, $priority = 0)
{
if ($renamedId && $id == $renamedId) {
throw new \InvalidArgumentException(sprintf('The decorated service inner name for "%s" must be different than the service name itself.', $id));
@@ -153,7 +159,7 @@ public function setDecoratedService($id, $renamedId = null)
if (null === $id) {
$this->decoratedService = null;
} else {
- $this->decoratedService = array($id, $renamedId);
+ $this->decoratedService = array($id, $renamedId, (int) $priority);
}
return $this;
@@ -162,7 +168,7 @@ public function setDecoratedService($id, $renamedId = null)
/**
* Gets the service that decorates this service.
*
- * @return null|array An array composed of the decorated service id and the new id for it, null if no service is decorated
+ * @return null|array An array composed of the decorated service id, the new id for it and the priority of decoration, null if no service is decorated
*/
public function getDecoratedService()
{
@@ -495,9 +501,7 @@ public function hasTag($name)
*/
public function clearTag($name)
{
- if (isset($this->tags[$name])) {
- unset($this->tags[$name]);
- }
+ unset($this->tags[$name]);
return $this;
}
@@ -539,14 +543,48 @@ public function getFile()
}
/**
+ * Sets if the service must be shared or not.
+ *
+ * @param bool $shared Whether the service must be shared or not
+ *
+ * @return Definition The current instance
+ */
+ public function setShared($shared)
+ {
+ $this->shared = (bool) $shared;
+
+ return $this;
+ }
+
+ /**
+ * Whether this service is shared.
+ *
+ * @return bool
+ */
+ public function isShared()
+ {
+ return $this->shared;
+ }
+
+ /**
* Sets the scope of the service.
*
* @param string $scope Whether the service must be shared or not
*
* @return Definition The current instance
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
- public function setScope($scope)
+ public function setScope($scope, $triggerDeprecationError = true)
{
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
+ if (ContainerInterface::SCOPE_PROTOTYPE === $scope) {
+ $this->setShared(false);
+ }
+
$this->scope = $scope;
return $this;
@@ -556,9 +594,15 @@ public function setScope($scope)
* Returns the scope of the service.
*
* @return string
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
- public function getScope()
+ public function getScope($triggerDeprecationError = true)
{
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
return $this->scope;
}
@@ -699,6 +743,59 @@ public function isAbstract()
}
/**
+ * Whether this definition is deprecated, that means it should not be called
+ * anymore.
+ *
+ * @param bool $status
+ * @param string $template Template message to use if the definition is deprecated
+ *
+ * @return Definition the current instance
+ *
+ * @throws InvalidArgumentException When the message template is invalid.
+ */
+ public function setDeprecated($status = true, $template = null)
+ {
+ if (null !== $template) {
+ if (preg_match('#[\r\n]|\*/#', $template)) {
+ throw new InvalidArgumentException('Invalid characters found in deprecation template.');
+ }
+
+ if (false === strpos($template, '%service_id%')) {
+ throw new InvalidArgumentException('The deprecation template must contain the "%service_id%" placeholder.');
+ }
+
+ $this->deprecationTemplate = $template;
+ }
+
+ $this->deprecated = (bool) $status;
+
+ return $this;
+ }
+
+ /**
+ * Whether this definition is deprecated, that means it should not be called
+ * anymore.
+ *
+ * @return bool
+ */
+ public function isDeprecated()
+ {
+ return $this->deprecated;
+ }
+
+ /**
+ * Message to use if this definition is deprecated.
+ *
+ * @param string $id Service id relying on this definition
+ *
+ * @return string
+ */
+ public function getDeprecationMessage($id)
+ {
+ return str_replace('%service_id%', $id, $this->deprecationTemplate);
+ }
+
+ /**
* Sets a configurator to call after the service is fully initialized.
*
* @param callable $callable A PHP callable
@@ -721,4 +818,96 @@ public function getConfigurator()
{
return $this->configurator;
}
+
+ /**
+ * Sets types that will default to this definition.
+ *
+ * @param string[] $types
+ *
+ * @return Definition The current instance
+ */
+ public function setAutowiringTypes(array $types)
+ {
+ $this->autowiringTypes = array();
+
+ foreach ($types as $type) {
+ $this->autowiringTypes[$type] = true;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Is the definition autowired?
+ *
+ * @return bool
+ */
+ public function isAutowired()
+ {
+ return $this->autowired;
+ }
+
+ /**
+ * Sets autowired.
+ *
+ * @param $autowired
+ *
+ * @return Definition The current instance
+ */
+ public function setAutowired($autowired)
+ {
+ $this->autowired = $autowired;
+
+ return $this;
+ }
+
+ /**
+ * Gets autowiring types that will default to this definition.
+ *
+ * @return string[]
+ */
+ public function getAutowiringTypes()
+ {
+ return array_keys($this->autowiringTypes);
+ }
+
+ /**
+ * Adds a type that will default to this definition.
+ *
+ * @param string $type
+ *
+ * @return Definition The current instance
+ */
+ public function addAutowiringType($type)
+ {
+ $this->autowiringTypes[$type] = true;
+
+ return $this;
+ }
+
+ /**
+ * Removes a type.
+ *
+ * @param string $type
+ *
+ * @return Definition The current instance
+ */
+ public function removeAutowiringType($type)
+ {
+ unset($this->autowiringTypes[$type]);
+
+ return $this;
+ }
+
+ /**
+ * Will this definition default for the given type?
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ public function hasAutowiringType($type)
+ {
+ return isset($this->autowiringTypes[$type]);
+ }
}
diff --git a/vendor/symfony/dependency-injection/DefinitionDecorator.php b/vendor/symfony/dependency-injection/DefinitionDecorator.php
index 334127a..e9413d9 100644
--- a/vendor/symfony/dependency-injection/DefinitionDecorator.php
+++ b/vendor/symfony/dependency-injection/DefinitionDecorator.php
@@ -150,11 +150,21 @@ public function setLazy($boolean)
/**
* {@inheritdoc}
*/
- public function setDecoratedService($id, $renamedId = null)
+ public function setDecoratedService($id, $renamedId = null, $priority = 0)
{
$this->changes['decorated_service'] = true;
- return parent::setDecoratedService($id, $renamedId);
+ return parent::setDecoratedService($id, $renamedId, $priority);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setDeprecated($boolean = true, $template = null)
+ {
+ $this->changes['deprecated'] = true;
+
+ return parent::setDeprecated($boolean, $template);
}
/**
diff --git a/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php b/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php
index f69d1e9..9710e8b 100644
--- a/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php
+++ b/vendor/symfony/dependency-injection/Dumper/GraphvizDumper.php
@@ -177,7 +177,7 @@ private function findNodes()
} catch (ParameterNotFoundException $e) {
}
- $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => array_merge($this->options['node.definition'], array('style' => ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope() ? 'filled' : 'dotted')));
+ $nodes[$id] = array('class' => str_replace('\\', '\\\\', $class), 'attributes' => array_merge($this->options['node.definition'], array('style' => $definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $definition->getScope(false) ? 'filled' : 'dotted')));
$container->setDefinition($id, new Definition('stdClass'));
}
@@ -205,7 +205,7 @@ private function cloneContainer()
$container->setDefinitions($this->container->getDefinitions());
$container->setAliases($this->container->getAliases());
$container->setResources($this->container->getResources());
- foreach ($this->container->getScopes() as $scope => $parentScope) {
+ foreach ($this->container->getScopes(false) as $scope => $parentScope) {
$container->addScope(new Scope($scope, $parentScope));
}
foreach ($this->container->getExtensions() as $extension) {
diff --git a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
index bb3df8b..23697cb 100644
--- a/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
+++ b/vendor/symfony/dependency-injection/Dumper/PhpDumper.php
@@ -382,9 +382,9 @@ private function addServiceInstance($id, $definition)
$isProxyCandidate = $this->getProxyDumper()->isProxyCandidate($definition);
$instantiation = '';
- if (!$isProxyCandidate && ContainerInterface::SCOPE_CONTAINER === $definition->getScope()) {
+ if (!$isProxyCandidate && $definition->isShared() && ContainerInterface::SCOPE_CONTAINER === $definition->getScope(false)) {
$instantiation = "\$this->services['$id'] = ".($simple ? '' : '$instance');
- } elseif (!$isProxyCandidate && ContainerInterface::SCOPE_PROTOTYPE !== $scope = $definition->getScope()) {
+ } elseif (!$isProxyCandidate && $definition->isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $scope = $definition->getScope(false)) {
$instantiation = "\$this->services['$id'] = \$this->scopedServices['$scope']['$id'] = ".($simple ? '' : '$instance');
} elseif (!$simple) {
$instantiation = '$instance';
@@ -578,7 +578,7 @@ private function addService($id, $definition)
$return[] = sprintf('@return object An instance returned by %s::%s().', $definition->getFactoryService(false), $definition->getFactoryMethod(false));
}
- $scope = $definition->getScope();
+ $scope = $definition->getScope(false);
if (!in_array($scope, array(ContainerInterface::SCOPE_CONTAINER, ContainerInterface::SCOPE_PROTOTYPE))) {
if ($return && 0 === strpos($return[count($return) - 1], '@return')) {
$return[] = '';
@@ -586,11 +586,19 @@ private function addService($id, $definition)
$return[] = sprintf("@throws InactiveScopeException when the '%s' service is requested while the '%s' scope is not active", $id, $scope);
}
- $return = implode("\n * ", $return);
+ if ($definition->isDeprecated()) {
+ if ($return && 0 === strpos($return[count($return) - 1], '@return')) {
+ $return[] = '';
+ }
+
+ $return[] = sprintf('@deprecated %s', $definition->getDeprecationMessage($id));
+ }
+
+ $return = str_replace("\n * \n", "\n *\n", implode("\n * ", $return));
$doc = '';
- if (ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
- $doc .= <<isShared() && ContainerInterface::SCOPE_PROTOTYPE !== $scope) {
+ $doc .= <<<'EOF'
*
* This service is shared.
@@ -599,7 +607,7 @@ private function addService($id, $definition)
}
if (!$definition->isPublic()) {
- $doc .= <<isAutowired()) {
+ $doc = <<isLazy()) {
$lazyInitialization = '$lazyLoad = true';
$lazyInitializationDoc = "\n * @param bool \$lazyLoad whether to try lazy-loading the service with a proxy\n *";
@@ -646,6 +663,10 @@ private function addService($id, $definition)
if ($definition->isSynthetic()) {
$code .= sprintf(" throw new RuntimeException('You have requested a synthetic service (\"%s\"). The DIC does not know how to construct this service.');\n }\n", $id);
} else {
+ if ($definition->isDeprecated()) {
+ $code .= sprintf(" @trigger_error(%s, E_USER_DEPRECATED);\n\n", var_export($definition->getDeprecationMessage($id), true));
+ }
+
$code .=
$this->addServiceInclude($id, $definition).
$this->addServiceLocalTempVariables($id, $definition).
@@ -759,6 +780,10 @@ private function addNewInstance($id, Definition $definition, $return, $instantia
if (null !== $definition->getFactory()) {
$callable = $definition->getFactory();
if (is_array($callable)) {
+ if (!preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/', $callable[1])) {
+ throw new RuntimeException(sprintf('Cannot dump definition because of invalid factory method (%s)', $callable[1] ?: 'n/a'));
+ }
+
if ($callable[0] instanceof Reference
|| ($callable[0] instanceof Definition && $this->definitionVariables->contains($callable[0]))) {
return sprintf(" $return{$instantiation}%s->%s(%s);\n", $this->dumpValue($callable[0]), $callable[1], $arguments ? implode(', ', $arguments) : '');
@@ -860,16 +885,16 @@ public function __construct()
EOF;
- if (count($scopes = $this->container->getScopes()) > 0) {
+ if (count($scopes = $this->container->getScopes(false)) > 0) {
$code .= "\n";
$code .= ' $this->scopes = '.$this->dumpValue($scopes).";\n";
- $code .= ' $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren()).";\n";
+ $code .= ' $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren(false)).";\n";
}
$code .= $this->addMethodMap();
$code .= $this->addAliases();
- $code .= <<services =
- \$this->scopedServices =
- \$this->scopeStacks = array();
+ $this->services =
+ $this->scopedServices =
+ $this->scopeStacks = array();
EOF;
$code .= "\n";
- if (count($scopes = $this->container->getScopes()) > 0) {
+ if (count($scopes = $this->container->getScopes(false)) > 0) {
$code .= ' $this->scopes = '.$this->dumpValue($scopes).";\n";
- $code .= ' $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren()).";\n";
+ $code .= ' $this->scopeChildren = '.$this->dumpValue($this->container->getScopeChildren(false)).";\n";
} else {
$code .= " \$this->scopes = array();\n";
$code .= " \$this->scopeChildren = array();\n";
@@ -918,7 +943,7 @@ public function __construct()
$code .= $this->addMethodMap();
$code .= $this->addAliases();
- $code .= <<container->isFrozen()) {
- $code .= <<parameters[\$name]) || array_key_exists(\$name, \$this->parameters))) {
- throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', \$name));
+ if (!(isset($this->parameters[$name]) || array_key_exists($name, $this->parameters))) {
+ throw new InvalidArgumentException(sprintf('The parameter "%s" must be defined.', $name));
}
- return \$this->parameters[\$name];
+ return $this->parameters[$name];
}
/**
* {@inheritdoc}
*/
- public function hasParameter(\$name)
+ public function hasParameter($name)
{
- \$name = strtolower(\$name);
+ $name = strtolower($name);
- return isset(\$this->parameters[\$name]) || array_key_exists(\$name, \$this->parameters);
+ return isset($this->parameters[$name]) || array_key_exists($name, $this->parameters);
}
/**
* {@inheritdoc}
*/
- public function setParameter(\$name, \$value)
+ public function setParameter($name, $value)
{
throw new LogicException('Impossible to call set() on a frozen ParameterBag.');
}
@@ -1048,11 +1073,11 @@ public function setParameter(\$name, \$value)
*/
public function getParameterBag()
{
- if (null === \$this->parameterBag) {
- \$this->parameterBag = new FrozenParameterBag(\$this->parameters);
+ if (null === $this->parameterBag) {
+ $this->parameterBag = new FrozenParameterBag($this->parameters);
}
- return \$this->parameterBag;
+ return $this->parameterBag;
}
EOF;
@@ -1117,7 +1142,7 @@ private function exportParameters($parameters, $path = '', $indent = 12)
*/
private function endClass()
{
- return <<dumpLiteralClass($this->dumpValue($factory[0])), $factory[1], implode(', ', $arguments));
}
if ($factory[0] instanceof Definition) {
@@ -1342,12 +1371,8 @@ private function dumpValue($value, $interpolate = true)
if (null === $class) {
throw new RuntimeException('Cannot dump definitions which have no class nor factory.');
}
- $class = $this->dumpValue($class);
- if (false !== strpos($class, '$')) {
- throw new RuntimeException('Cannot dump definitions which have a variable class name.');
- }
- return sprintf('new \\%s(%s)', substr(str_replace('\\\\', '\\', $class), 1, -1), implode(', ', $arguments));
+ return sprintf('new %s(%s)', $this->dumpLiteralClass($this->dumpValue($class)), implode(', ', $arguments));
} elseif ($value instanceof Variable) {
return '$'.$value;
} elseif ($value instanceof Reference) {
@@ -1388,9 +1413,18 @@ private function dumpValue($value, $interpolate = true)
* @param string $class
*
* @return string
+ *
+ * @throws RuntimeException
*/
private function dumpLiteralClass($class)
{
+ if (false !== strpos($class, '$')) {
+ throw new RuntimeException('Cannot dump definitions which have a variable class name.');
+ }
+ if (0 !== strpos($class, "'") || !preg_match('/^\'[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*(\\\{2}[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)*\'$/', $class)) {
+ throw new RuntimeException(sprintf('Cannot dump definition because of invalid class name (%s)', $class ?: 'n/a'));
+ }
+
return '\\'.substr(str_replace('\\\\', '\\', $class), 1, -1);
}
diff --git a/vendor/symfony/dependency-injection/Dumper/XmlDumper.php b/vendor/symfony/dependency-injection/Dumper/XmlDumper.php
index bd8e200..07aad3f 100644
--- a/vendor/symfony/dependency-injection/Dumper/XmlDumper.php
+++ b/vendor/symfony/dependency-injection/Dumper/XmlDumper.php
@@ -126,7 +126,10 @@ private function addService($definition, $id, \DOMElement $parent)
if ($definition->getFactoryService(false)) {
$service->setAttribute('factory-service', $definition->getFactoryService(false));
}
- if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope()) {
+ if (!$definition->isShared()) {
+ $service->setAttribute('shared', 'false');
+ }
+ if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope(false)) {
$service->setAttribute('scope', $scope);
}
if (!$definition->isPublic()) {
@@ -142,11 +145,14 @@ private function addService($definition, $id, \DOMElement $parent)
$service->setAttribute('lazy', 'true');
}
if (null !== $decorated = $definition->getDecoratedService()) {
- list($decorated, $renamedId) = $decorated;
+ list($decorated, $renamedId, $priority) = $decorated;
$service->setAttribute('decorates', $decorated);
if (null !== $renamedId) {
$service->setAttribute('decoration-inner-name', $renamedId);
}
+ if (0 !== $priority) {
+ $service->setAttribute('decoration-priority', $priority);
+ }
}
foreach ($definition->getTags() as $name => $tags) {
@@ -191,6 +197,24 @@ private function addService($definition, $id, \DOMElement $parent)
$service->appendChild($factory);
}
+ if ($definition->isDeprecated()) {
+ $deprecated = $this->document->createElement('deprecated');
+ $deprecated->appendChild($this->document->createTextNode($definition->getDeprecationMessage('%service_id%')));
+
+ $service->appendChild($deprecated);
+ }
+
+ if ($definition->isAutowired()) {
+ $service->setAttribute('autowire', 'true');
+ }
+
+ foreach ($definition->getAutowiringTypes() as $autowiringTypeValue) {
+ $autowiringType = $this->document->createElement('autowiring-type');
+ $autowiringType->appendChild($this->document->createTextNode($autowiringTypeValue));
+
+ $service->appendChild($autowiringType);
+ }
+
if ($callable = $definition->getConfigurator()) {
$configurator = $this->document->createElement('configurator');
@@ -283,7 +307,7 @@ private function convertParameters($parameters, $type, \DOMElement $parent, $key
} elseif ($behaviour == ContainerInterface::IGNORE_ON_INVALID_REFERENCE) {
$element->setAttribute('on-invalid', 'ignore');
}
- if (!$value->isStrict()) {
+ if (!$value->isStrict(false)) {
$element->setAttribute('strict', 'false');
}
} elseif ($value instanceof Definition) {
diff --git a/vendor/symfony/dependency-injection/Dumper/YamlDumper.php b/vendor/symfony/dependency-injection/Dumper/YamlDumper.php
index e8e108c..e44fc20 100644
--- a/vendor/symfony/dependency-injection/Dumper/YamlDumper.php
+++ b/vendor/symfony/dependency-injection/Dumper/YamlDumper.php
@@ -100,6 +100,22 @@ private function addService($id, $definition)
$code .= sprintf(" synchronized: true\n");
}
+ if ($definition->isDeprecated()) {
+ $code .= sprintf(" deprecated: %s\n", $definition->getDeprecationMessage('%service_id%'));
+ }
+
+ if ($definition->isAutowired()) {
+ $code .= " autowire: true\n";
+ }
+
+ $autowiringTypesCode = '';
+ foreach ($definition->getAutowiringTypes() as $autowiringType) {
+ $autowiringTypesCode .= sprintf(" - %s\n", $this->dumper->dump($autowiringType));
+ }
+ if ($autowiringTypesCode) {
+ $code .= sprintf(" autowiring_types:\n%s", $autowiringTypesCode);
+ }
+
if ($definition->getFactoryClass(false)) {
$code .= sprintf(" factory_class: %s\n", $definition->getFactoryClass(false));
}
@@ -128,16 +144,23 @@ private function addService($id, $definition)
$code .= sprintf(" calls:\n%s\n", $this->dumper->dump($this->dumpValue($definition->getMethodCalls()), 1, 12));
}
- if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope()) {
+ if (!$definition->isShared()) {
+ $code .= " shared: false\n";
+ }
+
+ if (ContainerInterface::SCOPE_CONTAINER !== $scope = $definition->getScope(false)) {
$code .= sprintf(" scope: %s\n", $scope);
}
if (null !== $decorated = $definition->getDecoratedService()) {
- list($decorated, $renamedId) = $decorated;
+ list($decorated, $renamedId, $priority) = $decorated;
$code .= sprintf(" decorates: %s\n", $decorated);
if (null !== $renamedId) {
$code .= sprintf(" decoration_inner_name: %s\n", $renamedId);
}
+ if (0 !== $priority) {
+ $code .= sprintf(" decoration_priority: %s\n", $priority);
+ }
}
if ($callable = $definition->getFactory()) {
diff --git a/vendor/symfony/dependency-injection/Extension/Extension.php b/vendor/symfony/dependency-injection/Extension/Extension.php
index f8e058b..20ea100 100644
--- a/vendor/symfony/dependency-injection/Extension/Extension.php
+++ b/vendor/symfony/dependency-injection/Extension/Extension.php
@@ -91,9 +91,7 @@ public function getConfiguration(array $config, ContainerBuilder $container)
$container->addResource(new FileResource($r->getFileName()));
if (!method_exists($class, '__construct')) {
- $configuration = new $class();
-
- return $configuration;
+ return new $class();
}
}
}
diff --git a/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php b/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php
index 1fd1baa..6e926fa 100644
--- a/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php
+++ b/vendor/symfony/dependency-injection/Extension/ExtensionInterface.php
@@ -23,12 +23,12 @@
/**
* Loads a specific configuration.
*
- * @param array $config An array of configuration values
+ * @param array $configs An array of configuration values
* @param ContainerBuilder $container A ContainerBuilder instance
*
* @throws \InvalidArgumentException When provided tag is not defined in this extension
*/
- public function load(array $config, ContainerBuilder $container);
+ public function load(array $configs, ContainerBuilder $container);
/**
* Returns the namespace to be used for this extension (XML namespace).
diff --git a/vendor/symfony/dependency-injection/IntrospectableContainerInterface.php b/vendor/symfony/dependency-injection/IntrospectableContainerInterface.php
index e630a1e..4aa0059 100644
--- a/vendor/symfony/dependency-injection/IntrospectableContainerInterface.php
+++ b/vendor/symfony/dependency-injection/IntrospectableContainerInterface.php
@@ -16,6 +16,8 @@
* for containers, allowing logic to be implemented based on a Container's state.
*
* @author Evan Villemez
+ *
+ * @deprecated since version 2.8, to be merged with ContainerInterface in 3.0.
*/
interface IntrospectableContainerInterface extends ContainerInterface
{
diff --git a/vendor/symfony/dependency-injection/LICENSE b/vendor/symfony/dependency-injection/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/dependency-injection/LICENSE
+++ b/vendor/symfony/dependency-injection/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php b/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php
new file mode 100644
index 0000000..ffb8853
--- /dev/null
+++ b/vendor/symfony/dependency-injection/Loader/DirectoryLoader.php
@@ -0,0 +1,56 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Loader;
+
+use Symfony\Component\Config\Resource\DirectoryResource;
+
+/**
+ * DirectoryLoader is a recursive loader to go through directories.
+ *
+ * @author Sebastien Lavoie
+ */
+class DirectoryLoader extends FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($file, $type = null)
+ {
+ $file = rtrim($file, '/');
+ $path = $this->locator->locate($file);
+ $this->container->addResource(new DirectoryResource($path));
+
+ foreach (scandir($path) as $dir) {
+ if ('.' !== $dir[0]) {
+ if (is_dir($path.'/'.$dir)) {
+ $dir .= '/'; // append / to allow recursion
+ }
+
+ $this->setCurrentDir($path);
+
+ $this->import($dir, null, false, $path);
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function supports($resource, $type = null)
+ {
+ if ('directory' === $type) {
+ return true;
+ }
+
+ return null === $type && is_string($resource) && '/' === substr($resource, -1);
+ }
+}
diff --git a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
index ebe330b..b18d634 100644
--- a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php
@@ -93,8 +93,9 @@ private function parseImports(\DOMDocument $xml, $file)
return;
}
+ $defaultDirectory = dirname($file);
foreach ($imports as $import) {
- $this->setCurrentDir(dirname($file));
+ $this->setCurrentDir($defaultDirectory);
$this->import($import->getAttribute('resource'), null, (bool) XmlUtils::phpize($import->getAttribute('ignore-errors')), $file);
}
}
@@ -147,7 +148,7 @@ private function parseDefinition(\DOMElement $service, $file)
$definition = new Definition();
}
- foreach (array('class', 'scope', 'public', 'factory-class', 'factory-method', 'factory-service', 'synthetic', 'lazy', 'abstract') as $key) {
+ foreach (array('class', 'shared', 'public', 'factory-class', 'factory-method', 'factory-service', 'synthetic', 'lazy', 'abstract') as $key) {
if ($value = $service->getAttribute($key)) {
if (in_array($key, array('factory-class', 'factory-method', 'factory-service'))) {
@trigger_error(sprintf('The "%s" attribute of service "%s" in file "%s" is deprecated since version 2.6 and will be removed in 3.0. Use the "factory" element instead.', $key, (string) $service->getAttribute('id'), $file), E_USER_DEPRECATED);
@@ -157,6 +158,20 @@ private function parseDefinition(\DOMElement $service, $file)
}
}
+ if ($value = $service->getAttribute('autowire')) {
+ $definition->setAutowired(XmlUtils::phpize($value));
+ }
+
+ if ($value = $service->getAttribute('scope')) {
+ $triggerDeprecation = 'request' !== (string) $service->getAttribute('id');
+
+ if ($triggerDeprecation) {
+ @trigger_error(sprintf('The "scope" attribute of service "%s" in file "%s" is deprecated since version 2.8 and will be removed in 3.0.', (string) $service->getAttribute('id'), $file), E_USER_DEPRECATED);
+ }
+
+ $definition->setScope(XmlUtils::phpize($value), false);
+ }
+
if ($value = $service->getAttribute('synchronized')) {
$triggerDeprecation = 'request' !== (string) $service->getAttribute('id');
@@ -171,6 +186,10 @@ private function parseDefinition(\DOMElement $service, $file)
$definition->setFile($files[0]->nodeValue);
}
+ if ($deprecated = $this->getChildren($service, 'deprecated')) {
+ $definition->setDeprecated(true, $deprecated[0]->nodeValue);
+ }
+
$definition->setArguments($this->getArgumentsAsPhp($service, 'argument'));
$definition->setProperties($this->getArgumentsAsPhp($service, 'property'));
@@ -233,9 +252,14 @@ private function parseDefinition(\DOMElement $service, $file)
$definition->addTag($tag->getAttribute('name'), $parameters);
}
+ foreach ($this->getChildren($service, 'autowiring-type') as $type) {
+ $definition->addAutowiringType($type->textContent);
+ }
+
if ($value = $service->getAttribute('decorates')) {
$renameId = $service->hasAttribute('decoration-inner-name') ? $service->getAttribute('decoration-inner-name') : null;
- $definition->setDecoratedService($value, $renameId);
+ $priority = $service->hasAttribute('decoration-priority') ? $service->getAttribute('decoration-priority') : 0;
+ $definition->setDecoratedService($value, $renameId, $priority);
}
return $definition;
diff --git a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
index 5b3fb46..5bd19ec 100644
--- a/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
+++ b/vendor/symfony/dependency-injection/Loader/YamlFileLoader.php
@@ -95,12 +95,13 @@ private function parseImports($content, $file)
throw new InvalidArgumentException(sprintf('The "imports" key should contain an array in %s. Check your YAML syntax.', $file));
}
+ $defaultDirectory = dirname($file);
foreach ($content['imports'] as $import) {
if (!is_array($import)) {
throw new InvalidArgumentException(sprintf('The values in the "imports" key should be arrays in %s. Check your YAML syntax.', $file));
}
- $this->setCurrentDir(dirname($file));
+ $this->setCurrentDir($defaultDirectory);
$this->import($import['resource'], null, isset($import['ignore_errors']) ? (bool) $import['ignore_errors'] : false, $file);
}
}
@@ -164,8 +165,15 @@ private function parseDefinition($id, $service, $file)
$definition->setClass($service['class']);
}
+ if (isset($service['shared'])) {
+ $definition->setShared($service['shared']);
+ }
+
if (isset($service['scope'])) {
- $definition->setScope($service['scope']);
+ if ('request' !== $id) {
+ @trigger_error(sprintf('The "scope" key of service "%s" in file "%s" is deprecated since version 2.8 and will be removed in 3.0.', $id, $file), E_USER_DEPRECATED);
+ }
+ $definition->setScope($service['scope'], false);
}
if (isset($service['synthetic'])) {
@@ -189,6 +197,10 @@ private function parseDefinition($id, $service, $file)
$definition->setAbstract($service['abstract']);
}
+ if (array_key_exists('deprecated', $service)) {
+ $definition->setDeprecated(true, $service['deprecated']);
+ }
+
if (isset($service['factory'])) {
if (is_string($service['factory'])) {
if (strpos($service['factory'], ':') !== false && strpos($service['factory'], '::') === false) {
@@ -284,7 +296,30 @@ private function parseDefinition($id, $service, $file)
if (isset($service['decorates'])) {
$renameId = isset($service['decoration_inner_name']) ? $service['decoration_inner_name'] : null;
- $definition->setDecoratedService($service['decorates'], $renameId);
+ $priority = isset($service['decoration_priority']) ? $service['decoration_priority'] : 0;
+ $definition->setDecoratedService($service['decorates'], $renameId, $priority);
+ }
+
+ if (isset($service['autowire'])) {
+ $definition->setAutowired($service['autowire']);
+ }
+
+ if (isset($service['autowiring_types'])) {
+ if (is_string($service['autowiring_types'])) {
+ $definition->addAutowiringType($service['autowiring_types']);
+ } else {
+ if (!is_array($service['autowiring_types'])) {
+ throw new InvalidArgumentException(sprintf('Parameter "autowiring_types" must be a string or an array for service "%s" in %s. Check your YAML syntax.', $id, $file));
+ }
+
+ foreach ($service['autowiring_types'] as $autowiringType) {
+ if (!is_string($autowiringType)) {
+ throw new InvalidArgumentException(sprintf('A "autowiring_types" attribute must be of type string for service "%s" in %s. Check your YAML syntax.', $id, $file));
+ }
+
+ $definition->addAutowiringType($autowiringType);
+ }
+ }
}
$this->container->setDefinition($id, $definition);
diff --git a/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd b/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd
index ac2cba7..3241c43 100644
--- a/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd
+++ b/vendor/symfony/dependency-injection/Loader/schema/dic/services/services-1.0.xsd
@@ -81,12 +81,15 @@
+
+
+
@@ -100,6 +103,8 @@
+
+
diff --git a/vendor/symfony/dependency-injection/Reference.php b/vendor/symfony/dependency-injection/Reference.php
index 6a48249..572062b 100644
--- a/vendor/symfony/dependency-injection/Reference.php
+++ b/vendor/symfony/dependency-injection/Reference.php
@@ -25,6 +25,8 @@ class Reference
/**
* Constructor.
*
+ * Note: The $strict parameter is deprecated since version 2.8 and will be removed in 3.0.
+ *
* @param string $id The service identifier
* @param int $invalidBehavior The behavior when the service does not exist
* @param bool $strict Sets how this reference is validated
@@ -62,9 +64,15 @@ public function getInvalidBehavior()
* Returns true when this Reference is strict.
*
* @return bool
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
- public function isStrict()
+ public function isStrict($triggerDeprecationError = true)
{
+ if ($triggerDeprecationError) {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
return $this->strict;
}
}
diff --git a/vendor/symfony/dependency-injection/ResettableContainerInterface.php b/vendor/symfony/dependency-injection/ResettableContainerInterface.php
new file mode 100644
index 0000000..b74e676
--- /dev/null
+++ b/vendor/symfony/dependency-injection/ResettableContainerInterface.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection;
+
+/**
+ * ResettableContainerInterface defines additional resetting functionality
+ * for containers, allowing to release shared services when the container is
+ * not needed anymore.
+ *
+ * @author Christophe Coevoet
+ */
+interface ResettableContainerInterface extends ContainerInterface
+{
+ /**
+ * Resets shared services from the container.
+ *
+ * The container is not intended to be used again after being reset in a normal workflow. This method is
+ * meant as a way to release references for ref-counting.
+ * A subsequent call to ContainerInterface::get will recreate a new instance of the shared service.
+ */
+ public function reset();
+}
diff --git a/vendor/symfony/dependency-injection/Scope.php b/vendor/symfony/dependency-injection/Scope.php
index 737fe26..b0b8ed6 100644
--- a/vendor/symfony/dependency-injection/Scope.php
+++ b/vendor/symfony/dependency-injection/Scope.php
@@ -15,6 +15,8 @@
* Scope class.
*
* @author Johannes M. Schmitt
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
class Scope implements ScopeInterface
{
diff --git a/vendor/symfony/dependency-injection/ScopeInterface.php b/vendor/symfony/dependency-injection/ScopeInterface.php
index ea55165..11b1097 100644
--- a/vendor/symfony/dependency-injection/ScopeInterface.php
+++ b/vendor/symfony/dependency-injection/ScopeInterface.php
@@ -15,6 +15,8 @@
* Scope Interface.
*
* @author Johannes M. Schmitt
+ *
+ * @deprecated since version 2.8, to be removed in 3.0.
*/
interface ScopeInterface
{
diff --git a/vendor/symfony/dependency-injection/SimpleXMLElement.php b/vendor/symfony/dependency-injection/SimpleXMLElement.php
index 63d44ea..87c67c4 100644
--- a/vendor/symfony/dependency-injection/SimpleXMLElement.php
+++ b/vendor/symfony/dependency-injection/SimpleXMLElement.php
@@ -11,7 +11,7 @@
namespace Symfony\Component\DependencyInjection;
-@trigger_error('The '.__NAMESPACE__.'\SimpleXMLElement method is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
+@trigger_error('The '.__NAMESPACE__.'\SimpleXMLElement class is deprecated since version 2.5 and will be removed in 3.0.', E_USER_DEPRECATED);
use Symfony\Component\Config\Util\XmlUtils;
use Symfony\Component\ExpressionLanguage\Expression;
diff --git a/vendor/symfony/dependency-injection/composer.json b/vendor/symfony/dependency-injection/composer.json
index 87ea6fd..619c9e6 100644
--- a/vendor/symfony/dependency-injection/composer.json
+++ b/vendor/symfony/dependency-injection/composer.json
@@ -19,9 +19,9 @@
"php": ">=5.3.9"
},
"require-dev": {
- "symfony/yaml": "~2.1",
- "symfony/config": "~2.2",
- "symfony/expression-language": "~2.6"
+ "symfony/yaml": "~2.1|~3.0.0",
+ "symfony/config": "~2.2|~3.0.0",
+ "symfony/expression-language": "~2.6|~3.0.0"
},
"conflict": {
"symfony/expression-language": "<2.6"
@@ -32,12 +32,15 @@
"symfony/proxy-manager-bridge": "Generate service proxies to lazy load them"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" }
+ "psr-4": { "Symfony\\Component\\DependencyInjection\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php b/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
index b92defe..6a02e9f 100644
--- a/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/ContainerAwareEventDispatcher.php
@@ -132,6 +132,16 @@ public function getListeners($eventName = null)
}
/**
+ * {@inheritdoc}
+ */
+ public function getListenerPriority($eventName, $listener)
+ {
+ $this->lazyLoad($eventName);
+
+ return parent::getListenerPriority($eventName, $listener);
+ }
+
+ /**
* Adds a service as event subscriber.
*
* @param string $serviceId The service ID of the subscriber service
diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
index 7653ccf..35df816 100644
--- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php
@@ -102,6 +102,14 @@ public function getListeners($eventName = null)
/**
* {@inheritdoc}
*/
+ public function getListenerPriority($eventName, $listener)
+ {
+ return $this->dispatcher->getListenerPriority($eventName, $listener);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function hasListeners($eventName = null)
{
return $this->dispatcher->hasListeners($eventName);
@@ -186,6 +194,8 @@ public function getNotCalledListeners()
}
}
+ uasort($notCalled, array($this, 'sortListenersByPriority'));
+
return $notCalled;
}
@@ -285,6 +295,7 @@ private function getListenerInfo($listener, $eventName)
{
$info = array(
'event' => $eventName,
+ 'priority' => $this->getListenerPriority($eventName, $listener),
);
if ($listener instanceof \Closure) {
$info += array(
@@ -332,4 +343,25 @@ private function getListenerInfo($listener, $eventName)
return $info;
}
+
+ private function sortListenersByPriority($a, $b)
+ {
+ if (is_int($a['priority']) && !is_int($b['priority'])) {
+ return 1;
+ }
+
+ if (!is_int($a['priority']) && is_int($b['priority'])) {
+ return -1;
+ }
+
+ if ($a['priority'] === $b['priority']) {
+ return 0;
+ }
+
+ if ($a['priority'] > $b['priority']) {
+ return -1;
+ }
+
+ return 1;
+ }
}
diff --git a/vendor/symfony/event-dispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/EventDispatcher.php
index b54d07b..65c5cb6 100644
--- a/vendor/symfony/event-dispatcher/EventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/EventDispatcher.php
@@ -76,6 +76,29 @@ public function getListeners($eventName = null)
}
/**
+ * Gets the listener priority for a specific event.
+ *
+ * Returns null if the event or the listener does not exist.
+ *
+ * @param string $eventName The name of the event
+ * @param callable $listener The listener
+ *
+ * @return int|null The event listener priority
+ */
+ public function getListenerPriority($eventName, $listener)
+ {
+ if (!isset($this->listeners[$eventName])) {
+ return;
+ }
+
+ foreach ($this->listeners[$eventName] as $priority => $listeners) {
+ if (false !== ($key = array_search($listener, $listeners, true))) {
+ return $priority;
+ }
+ }
+ }
+
+ /**
* {@inheritdoc}
*/
public function hasListeners($eventName = null)
@@ -169,8 +192,6 @@ protected function doDispatch($listeners, $eventName, Event $event)
*/
private function sortListeners($eventName)
{
- $this->sorted[$eventName] = array();
-
krsort($this->listeners[$eventName]);
$this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]);
}
diff --git a/vendor/symfony/event-dispatcher/EventSubscriberInterface.php b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php
index ec53e54..8af7789 100644
--- a/vendor/symfony/event-dispatcher/EventSubscriberInterface.php
+++ b/vendor/symfony/event-dispatcher/EventSubscriberInterface.php
@@ -38,7 +38,7 @@
*
* * array('eventName' => 'methodName')
* * array('eventName' => array('methodName', $priority))
- * * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
+ * * array('eventName' => array(array('methodName1', $priority), array('methodName2')))
*
* @return array The event names to listen to
*/
diff --git a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
index 7ef9ece..13e8572 100644
--- a/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
+++ b/vendor/symfony/event-dispatcher/ImmutableEventDispatcher.php
@@ -86,6 +86,14 @@ public function getListeners($eventName = null)
/**
* {@inheritdoc}
*/
+ public function getListenerPriority($eventName, $listener)
+ {
+ return $this->dispatcher->getListenerPriority($eventName, $listener);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
public function hasListeners($eventName = null)
{
return $this->dispatcher->hasListeners($eventName);
diff --git a/vendor/symfony/event-dispatcher/LICENSE b/vendor/symfony/event-dispatcher/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/event-dispatcher/LICENSE
+++ b/vendor/symfony/event-dispatcher/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php
index 2e4c3fd..0169ede 100644
--- a/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php
+++ b/vendor/symfony/event-dispatcher/Tests/AbstractEventDispatcherTest.php
@@ -108,6 +108,20 @@ public function testGetAllListenersSortsByPriority()
$this->assertSame($expected, $this->dispatcher->getListeners());
}
+ public function testGetListenerPriority()
+ {
+ $listener1 = new TestEventListener();
+ $listener2 = new TestEventListener();
+
+ $this->dispatcher->addListener('pre.foo', $listener1, -10);
+ $this->dispatcher->addListener('pre.foo', $listener2);
+
+ $this->assertSame(-10, $this->dispatcher->getListenerPriority('pre.foo', $listener1));
+ $this->assertSame(0, $this->dispatcher->getListenerPriority('pre.foo', $listener2));
+ $this->assertNull($this->dispatcher->getListenerPriority('pre.bar', $listener2));
+ $this->assertNull($this->dispatcher->getListenerPriority('pre.foo', function () {}));
+ }
+
public function testDispatch()
{
$this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
diff --git a/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php
index 6f2fbcb..18a4b3f 100644
--- a/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php
+++ b/vendor/symfony/event-dispatcher/Tests/ContainerAwareEventDispatcherTest.php
@@ -92,6 +92,7 @@ public function testPreventDuplicateListenerService()
/**
* @expectedException \InvalidArgumentException
+ * @group legacy
*/
public function testTriggerAListenerServiceOutOfScope()
{
@@ -111,6 +112,9 @@ public function testTriggerAListenerServiceOutOfScope()
$dispatcher->dispatch('onEvent');
}
+ /**
+ * @group legacy
+ */
public function testReEnteringAScope()
{
$event = new Event();
diff --git a/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php b/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php
index 4aa6226..1d4a8c8 100644
--- a/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php
+++ b/vendor/symfony/event-dispatcher/Tests/Debug/TraceableEventDispatcherTest.php
@@ -25,7 +25,7 @@ public function testAddRemoveListener()
$dispatcher = new EventDispatcher();
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
- $tdispatcher->addListener('foo', $listener = function () {; });
+ $tdispatcher->addListener('foo', $listener = function () {});
$listeners = $dispatcher->getListeners('foo');
$this->assertCount(1, $listeners);
$this->assertSame($listener, $listeners[0]);
@@ -39,7 +39,7 @@ public function testGetListeners()
$dispatcher = new EventDispatcher();
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
- $tdispatcher->addListener('foo', $listener = function () {; });
+ $tdispatcher->addListener('foo', $listener = function () {});
$this->assertSame($dispatcher->getListeners('foo'), $tdispatcher->getListeners('foo'));
}
@@ -51,7 +51,7 @@ public function testHasListeners()
$this->assertFalse($dispatcher->hasListeners('foo'));
$this->assertFalse($tdispatcher->hasListeners('foo'));
- $tdispatcher->addListener('foo', $listener = function () {; });
+ $tdispatcher->addListener('foo', $listener = function () {});
$this->assertTrue($dispatcher->hasListeners('foo'));
$this->assertTrue($tdispatcher->hasListeners('foo'));
}
@@ -76,14 +76,14 @@ public function testGetCalledListeners()
{
$dispatcher = new EventDispatcher();
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
- $tdispatcher->addListener('foo', $listener = function () {; });
+ $tdispatcher->addListener('foo', $listener = function () {});
$this->assertEquals(array(), $tdispatcher->getCalledListeners());
- $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getNotCalledListeners());
+ $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure', 'priority' => 0)), $tdispatcher->getNotCalledListeners());
$tdispatcher->dispatch('foo');
- $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getCalledListeners());
+ $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure', 'priority' => null)), $tdispatcher->getCalledListeners());
$this->assertEquals(array(), $tdispatcher->getNotCalledListeners());
}
@@ -107,8 +107,8 @@ public function testLogger()
$dispatcher = new EventDispatcher();
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
- $tdispatcher->addListener('foo', $listener1 = function () {; });
- $tdispatcher->addListener('foo', $listener2 = function () {; });
+ $tdispatcher->addListener('foo', $listener1 = function () {});
+ $tdispatcher->addListener('foo', $listener2 = function () {});
$logger->expects($this->at(0))->method('debug')->with('Notified event "foo" to listener "closure".');
$logger->expects($this->at(1))->method('debug')->with('Notified event "foo" to listener "closure".');
@@ -123,7 +123,7 @@ public function testLoggerWithStoppedEvent()
$dispatcher = new EventDispatcher();
$tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger);
$tdispatcher->addListener('foo', $listener1 = function (Event $event) { $event->stopPropagation(); });
- $tdispatcher->addListener('foo', $listener2 = function () {; });
+ $tdispatcher->addListener('foo', $listener2 = function () {});
$logger->expects($this->at(0))->method('debug')->with('Notified event "foo" to listener "closure".');
$logger->expects($this->at(1))->method('debug')->with('Listener "closure" stopped propagation of the event "foo".');
diff --git a/vendor/symfony/event-dispatcher/composer.json b/vendor/symfony/event-dispatcher/composer.json
index 8a6a750..282b770 100644
--- a/vendor/symfony/event-dispatcher/composer.json
+++ b/vendor/symfony/event-dispatcher/composer.json
@@ -19,10 +19,10 @@
"php": ">=5.3.9"
},
"require-dev": {
- "symfony/dependency-injection": "~2.6",
- "symfony/expression-language": "~2.6",
- "symfony/config": "~2.0,>=2.0.5",
- "symfony/stopwatch": "~2.3",
+ "symfony/dependency-injection": "~2.6|~3.0.0",
+ "symfony/expression-language": "~2.6|~3.0.0",
+ "symfony/config": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/stopwatch": "~2.3|~3.0.0",
"psr/log": "~1.0"
},
"suggest": {
@@ -30,12 +30,15 @@
"symfony/http-kernel": ""
},
"autoload": {
- "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" }
+ "psr-4": { "Symfony\\Component\\EventDispatcher\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/http-foundation/BinaryFileResponse.php b/vendor/symfony/http-foundation/BinaryFileResponse.php
index ca407b4..108f040 100644
--- a/vendor/symfony/http-foundation/BinaryFileResponse.php
+++ b/vendor/symfony/http-foundation/BinaryFileResponse.php
@@ -193,6 +193,10 @@ public function prepare(Request $request)
// Use X-Sendfile, do not send any content.
$type = $request->headers->get('X-Sendfile-Type');
$path = $this->file->getRealPath();
+ // Fall back to scheme://path for stream wrapped locations.
+ if (false === $path) {
+ $path = $this->file->getPathname();
+ }
if (strtolower($type) == 'x-accel-redirect') {
// Do X-Accel-Mapping substitutions.
// @link http://wiki.nginx.org/X-accel#X-Accel-Redirect
diff --git a/vendor/symfony/http-foundation/CHANGELOG.md b/vendor/symfony/http-foundation/CHANGELOG.md
index dcdeb4e..9f48e82 100644
--- a/vendor/symfony/http-foundation/CHANGELOG.md
+++ b/vendor/symfony/http-foundation/CHANGELOG.md
@@ -1,6 +1,12 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * Finding deep items in `ParameterBag::get()` is deprecated since version 2.8 and
+ will be removed in 3.0.
+
2.6.0
-----
diff --git a/vendor/symfony/http-foundation/HeaderBag.php b/vendor/symfony/http-foundation/HeaderBag.php
index dc12000..29bac5e 100644
--- a/vendor/symfony/http-foundation/HeaderBag.php
+++ b/vendor/symfony/http-foundation/HeaderBag.php
@@ -111,7 +111,7 @@ public function add(array $headers)
*/
public function get($key, $default = null, $first = true)
{
- $key = strtr(strtolower($key), '_', '-');
+ $key = str_replace('_', '-', strtolower($key));
if (!array_key_exists($key, $this->headers)) {
if (null === $default) {
@@ -137,7 +137,7 @@ public function get($key, $default = null, $first = true)
*/
public function set($key, $values, $replace = true)
{
- $key = strtr(strtolower($key), '_', '-');
+ $key = str_replace('_', '-', strtolower($key));
$values = array_values((array) $values);
@@ -161,7 +161,7 @@ public function set($key, $values, $replace = true)
*/
public function has($key)
{
- return array_key_exists(strtr(strtolower($key), '_', '-'), $this->headers);
+ return array_key_exists(str_replace('_', '-', strtolower($key)), $this->headers);
}
/**
@@ -184,7 +184,7 @@ public function contains($key, $value)
*/
public function remove($key)
{
- $key = strtr(strtolower($key), '_', '-');
+ $key = str_replace('_', '-', strtolower($key));
unset($this->headers[$key]);
diff --git a/vendor/symfony/http-foundation/JsonResponse.php b/vendor/symfony/http-foundation/JsonResponse.php
index 5399d1b..4a10a09 100644
--- a/vendor/symfony/http-foundation/JsonResponse.php
+++ b/vendor/symfony/http-foundation/JsonResponse.php
@@ -106,7 +106,7 @@ public function setData($data = array())
// PHP 5.3 triggers annoying warnings for some
// types that can't be serialized as JSON (INF, resources, etc.)
// but doesn't provide the JsonSerializable interface.
- set_error_handler('var_dump', 0);
+ set_error_handler(function () { return false; });
$data = @json_encode($data, $this->encodingOptions);
} else {
// PHP 5.4 and up wrap exceptions thrown by JsonSerializable
@@ -142,7 +142,7 @@ public function setData($data = array())
}
if (JSON_ERROR_NONE !== json_last_error()) {
- throw new \InvalidArgumentException($this->transformJsonError());
+ throw new \InvalidArgumentException(json_last_error_msg());
}
$this->data = $data;
@@ -196,31 +196,4 @@ protected function update()
return $this->setContent($this->data);
}
-
- private function transformJsonError()
- {
- if (function_exists('json_last_error_msg')) {
- return json_last_error_msg();
- }
-
- switch (json_last_error()) {
- case JSON_ERROR_DEPTH:
- return 'Maximum stack depth exceeded.';
-
- case JSON_ERROR_STATE_MISMATCH:
- return 'Underflow or the modes mismatch.';
-
- case JSON_ERROR_CTRL_CHAR:
- return 'Unexpected control character found.';
-
- case JSON_ERROR_SYNTAX:
- return 'Syntax error, malformed JSON.';
-
- case JSON_ERROR_UTF8:
- return 'Malformed UTF-8 characters, possibly incorrectly encoded.';
-
- default:
- return 'Unknown error.';
- }
- }
}
diff --git a/vendor/symfony/http-foundation/LICENSE b/vendor/symfony/http-foundation/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/http-foundation/LICENSE
+++ b/vendor/symfony/http-foundation/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/http-foundation/ParameterBag.php b/vendor/symfony/http-foundation/ParameterBag.php
index ecc0de1..9400c1b 100644
--- a/vendor/symfony/http-foundation/ParameterBag.php
+++ b/vendor/symfony/http-foundation/ParameterBag.php
@@ -78,7 +78,9 @@ public function add(array $parameters = array())
/**
* Returns a parameter by name.
*
- * @param string $path The key
+ * Note: Finding deep items is deprecated since version 2.8, to be removed in 3.0.
+ *
+ * @param string $key The key
* @param mixed $default The default value if the parameter key does not exist
* @param bool $deep If true, a path like foo[bar] will find deeper items
*
@@ -86,21 +88,25 @@ public function add(array $parameters = array())
*
* @throws \InvalidArgumentException
*/
- public function get($path, $default = null, $deep = false)
+ public function get($key, $default = null, $deep = false)
{
- if (!$deep || false === $pos = strpos($path, '[')) {
- return array_key_exists($path, $this->parameters) ? $this->parameters[$path] : $default;
+ if ($deep) {
+ @trigger_error('Using paths to find deeper items in '.__METHOD__.' is deprecated since version 2.8 and will be removed in 3.0. Filter the returned value in your own code instead.', E_USER_DEPRECATED);
+ }
+
+ if (!$deep || false === $pos = strpos($key, '[')) {
+ return array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
}
- $root = substr($path, 0, $pos);
+ $root = substr($key, 0, $pos);
if (!array_key_exists($root, $this->parameters)) {
return $default;
}
$value = $this->parameters[$root];
$currentKey = null;
- for ($i = $pos, $c = strlen($path); $i < $c; ++$i) {
- $char = $path[$i];
+ for ($i = $pos, $c = strlen($key); $i < $c; ++$i) {
+ $char = $key[$i];
if ('[' === $char) {
if (null !== $currentKey) {
@@ -172,7 +178,7 @@ public function remove($key)
* Returns the alphabetic characters of the parameter value.
*
* @param string $key The parameter key
- * @param mixed $default The default value if the parameter key does not exist
+ * @param string $default The default value if the parameter key does not exist
* @param bool $deep If true, a path like foo[bar] will find deeper items
*
* @return string The filtered value
@@ -186,7 +192,7 @@ public function getAlpha($key, $default = '', $deep = false)
* Returns the alphabetic characters and digits of the parameter value.
*
* @param string $key The parameter key
- * @param mixed $default The default value if the parameter key does not exist
+ * @param string $default The default value if the parameter key does not exist
* @param bool $deep If true, a path like foo[bar] will find deeper items
*
* @return string The filtered value
@@ -200,7 +206,7 @@ public function getAlnum($key, $default = '', $deep = false)
* Returns the digits of the parameter value.
*
* @param string $key The parameter key
- * @param mixed $default The default value if the parameter key does not exist
+ * @param string $default The default value if the parameter key does not exist
* @param bool $deep If true, a path like foo[bar] will find deeper items
*
* @return string The filtered value
@@ -208,14 +214,14 @@ public function getAlnum($key, $default = '', $deep = false)
public function getDigits($key, $default = '', $deep = false)
{
// we need to remove - and + because they're allowed in the filter
- return str_replace(array('-', '+'), '', $this->filter($key, $default, $deep, FILTER_SANITIZE_NUMBER_INT));
+ return str_replace(array('-', '+'), '', $this->filter($key, $default, FILTER_SANITIZE_NUMBER_INT, array(), $deep));
}
/**
* Returns the parameter value converted to integer.
*
* @param string $key The parameter key
- * @param mixed $default The default value if the parameter key does not exist
+ * @param int $default The default value if the parameter key does not exist
* @param bool $deep If true, a path like foo[bar] will find deeper items
*
* @return int The filtered value
@@ -236,7 +242,7 @@ public function getInt($key, $default = 0, $deep = false)
*/
public function getBoolean($key, $default = false, $deep = false)
{
- return $this->filter($key, $default, $deep, FILTER_VALIDATE_BOOLEAN);
+ return $this->filter($key, $default, FILTER_VALIDATE_BOOLEAN, array(), $deep);
}
/**
@@ -244,16 +250,31 @@ public function getBoolean($key, $default = false, $deep = false)
*
* @param string $key Key.
* @param mixed $default Default = null.
- * @param bool $deep Default = false.
* @param int $filter FILTER_* constant.
* @param mixed $options Filter options.
+ * @param bool $deep Default = false.
*
* @see http://php.net/manual/en/function.filter-var.php
*
* @return mixed
*/
- public function filter($key, $default = null, $deep = false, $filter = FILTER_DEFAULT, $options = array())
+ public function filter($key, $default = null, $filter = FILTER_DEFAULT, $options = array(), $deep = false)
{
+ static $filters = null;
+
+ if (null === $filters) {
+ foreach (filter_list() as $tmp) {
+ $filters[filter_id($tmp)] = 1;
+ }
+ }
+ if (is_bool($filter) || !isset($filters[$filter]) || is_array($deep)) {
+ @trigger_error('Passing the $deep boolean as 3rd argument to the '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Remove it altogether as the $deep argument will be removed in 3.0.', E_USER_DEPRECATED);
+ $tmp = $deep;
+ $deep = $filter;
+ $filter = $options;
+ $options = $tmp;
+ }
+
$value = $this->get($key, $default, $deep);
// Always turn $options into an array - this allows filter_var option shortcuts.
diff --git a/vendor/symfony/http-foundation/README.md b/vendor/symfony/http-foundation/README.md
index 11ad6ee..a7dba39 100644
--- a/vendor/symfony/http-foundation/README.md
+++ b/vendor/symfony/http-foundation/README.md
@@ -34,18 +34,6 @@ $response->send();
The Request and the Response classes have many other methods that implement
the HTTP specification.
-Loading
--------
-
-If you are not using Composer but are using PHP 5.3.x, you must add the following to your autoloader:
-
-```php
-// SessionHandlerInterface
-if (!interface_exists('SessionHandlerInterface')) {
- $loader->registerPrefixFallback(__DIR__.'/../vendor/symfony/src/Symfony/Component/HttpFoundation/Resources/stubs');
-}
-```
-
Resources
---------
diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php
index ff8d411..de36953 100644
--- a/vendor/symfony/http-foundation/Request.php
+++ b/vendor/symfony/http-foundation/Request.php
@@ -714,6 +714,8 @@ public static function getHttpMethodParameterOverride()
* It is better to explicitly get request parameters from the appropriate
* public property instead (query, attributes, request).
*
+ * Note: Finding deep items is deprecated since version 2.8, to be removed in 3.0.
+ *
* @param string $key the key
* @param mixed $default the default value
* @param bool $deep is parameter deep in multidimensional array
@@ -722,6 +724,10 @@ public static function getHttpMethodParameterOverride()
*/
public function get($key, $default = null, $deep = false)
{
+ if ($deep) {
+ @trigger_error('Using paths to find deeper items in '.__METHOD__.' is deprecated since version 2.8 and will be removed in 3.0. Filter the returned value in your own code instead.', E_USER_DEPRECATED);
+ }
+
if ($this !== $result = $this->query->get($key, $this, $deep)) {
return $result;
}
diff --git a/vendor/symfony/http-foundation/Response.php b/vendor/symfony/http-foundation/Response.php
index cb706d5..4c2f250 100644
--- a/vendor/symfony/http-foundation/Response.php
+++ b/vendor/symfony/http-foundation/Response.php
@@ -114,7 +114,7 @@ class Response
*
* The list of codes is complete according to the
* {@link http://www.iana.org/assignments/http-status-codes/ Hypertext Transfer Protocol (HTTP) Status Code Registry}
- * (last updated 2012-02-13).
+ * (last updated 2015-05-19).
*
* Unless otherwise noted, the status code is defined in RFC2616.
*
@@ -140,7 +140,6 @@ class Response
303 => 'See Other',
304 => 'Not Modified',
305 => 'Use Proxy',
- 306 => 'Reserved',
307 => 'Temporary Redirect',
308 => 'Permanent Redirect', // RFC7238
400 => 'Bad Request',
@@ -156,10 +155,10 @@ class Response
410 => 'Gone',
411 => 'Length Required',
412 => 'Precondition Failed',
- 413 => 'Request Entity Too Large',
- 414 => 'Request-URI Too Long',
+ 413 => 'Payload Too Large',
+ 414 => 'URI Too Long',
415 => 'Unsupported Media Type',
- 416 => 'Requested Range Not Satisfiable',
+ 416 => 'Range Not Satisfiable',
417 => 'Expectation Failed',
418 => 'I\'m a teapot', // RFC2324
422 => 'Unprocessable Entity', // RFC4918
@@ -198,9 +197,6 @@ public function __construct($content = '', $status = 200, $headers = array())
$this->setContent($content);
$this->setStatusCode($status);
$this->setProtocolVersion('1.0');
- if (!$this->headers->has('Date')) {
- $this->setDate(\DateTime::createFromFormat('U', time(), new \DateTimeZone('UTC')));
- }
}
/**
@@ -329,8 +325,9 @@ public function sendHeaders()
return $this;
}
- // status
- header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
+ if (!$this->headers->has('Date')) {
+ $this->setDate(\DateTime::createFromFormat('U', time()));
+ }
// headers
foreach ($this->headers->allPreserveCase() as $name => $values) {
@@ -339,6 +336,9 @@ public function sendHeaders()
}
}
+ // status
+ header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
+
// cookies
foreach ($this->headers->getCookies() as $cookie) {
setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
@@ -455,7 +455,7 @@ public function setStatusCode($code, $text = null)
}
if (null === $text) {
- $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : '';
+ $this->statusText = isset(self::$statusTexts[$code]) ? self::$statusTexts[$code] : 'unknown status';
return $this;
}
@@ -608,7 +608,11 @@ public function mustRevalidate()
*/
public function getDate()
{
- return $this->headers->getDate('Date', new \DateTime());
+ if (!$this->headers->has('Date')) {
+ $this->setDate(\DateTime::createFromFormat('U', time()));
+ }
+
+ return $this->headers->getDate('Date');
}
/**
@@ -972,7 +976,7 @@ public function getVary()
* Sets the Vary header.
*
* @param string|array $headers
- * @param bool $replace Whether to replace the actual value of not (true by default)
+ * @param bool $replace Whether to replace the actual value or not (true by default)
*
* @return Response
*/
diff --git a/vendor/symfony/http-foundation/ResponseHeaderBag.php b/vendor/symfony/http-foundation/ResponseHeaderBag.php
index 328bf49..06534aa 100644
--- a/vendor/symfony/http-foundation/ResponseHeaderBag.php
+++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php
@@ -99,7 +99,7 @@ public function set($key, $values, $replace = true)
{
parent::set($key, $values, $replace);
- $uniqueKey = strtr(strtolower($key), '_', '-');
+ $uniqueKey = str_replace('_', '-', strtolower($key));
$this->headerNames[$uniqueKey] = $key;
// ensure the cache-control header has sensible defaults
@@ -118,7 +118,7 @@ public function remove($key)
{
parent::remove($key);
- $uniqueKey = strtr(strtolower($key), '_', '-');
+ $uniqueKey = str_replace('_', '-', strtolower($key));
unset($this->headerNames[$uniqueKey]);
if ('cache-control' === $uniqueKey) {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
index f39235c..c00835d 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
@@ -48,8 +48,8 @@ public function __construct($savePath = null)
$baseDir = ltrim(strrchr($savePath, ';'), ';');
}
- if ($baseDir && !is_dir($baseDir)) {
- mkdir($baseDir, 0777, true);
+ if ($baseDir && !is_dir($baseDir) && !@mkdir($baseDir, 0777, true) && !is_dir($baseDir)) {
+ throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s"', $baseDir));
}
ini_set('session.save_path', $savePath);
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
index 1f4117b..00807cf 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
@@ -42,8 +42,8 @@ public function __construct($savePath = null, $name = 'MOCKSESSID', MetadataBag
$savePath = sys_get_temp_dir();
}
- if (!is_dir($savePath)) {
- mkdir($savePath, 0777, true);
+ if (!is_dir($savePath) && !@mkdir($savePath, 0777, true) && !is_dir($savePath)) {
+ throw new \RuntimeException(sprintf('Session Storage was not able to create directory "%s"', $savePath));
}
$this->savePath = $savePath;
diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
index fd03dc8..49b1153 100644
--- a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
@@ -101,11 +101,7 @@ public function __construct(array $options = array(), $handler = null, MetadataB
session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
ini_set('session.use_cookies', 1);
- if (PHP_VERSION_ID >= 50400) {
- session_register_shutdown();
- } else {
- register_shutdown_function('session_write_close');
- }
+ session_register_shutdown();
$this->setMetadataBag($metaBag);
$this->setOptions($options);
@@ -351,7 +347,7 @@ public function setOptions(array $options)
* session.save_handler and session.save_path e.g.
*
* ini_set('session.save_handler', 'files');
- * ini_set('session.save_path', /tmp');
+ * ini_set('session.save_path', '/tmp');
*
* or pass in a NativeSessionHandler instance which configures session.save_handler in the
* constructor, for a template see NativeFileSessionHandler or use handlers in
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
index 1036818..463677b 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
@@ -52,7 +52,7 @@ public function getSaveHandlerName()
*/
public function isSessionHandlerInterface()
{
- return ($this instanceof \SessionHandlerInterface);
+ return $this instanceof \SessionHandlerInterface;
}
/**
diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/http-foundation/composer.json
index 09f9679..e8733d8 100644
--- a/vendor/symfony/http-foundation/composer.json
+++ b/vendor/symfony/http-foundation/composer.json
@@ -16,19 +16,23 @@
}
],
"require": {
- "php": ">=5.3.9"
+ "php": ">=5.3.9",
+ "symfony/polyfill-php54": "~1.0",
+ "symfony/polyfill-php55": "~1.0"
},
"require-dev": {
- "symfony/expression-language": "~2.4"
+ "symfony/expression-language": "~2.4|~3.0.0"
},
"autoload": {
"psr-4": { "Symfony\\Component\\HttpFoundation\\": "" },
- "classmap": [ "Resources/stubs" ]
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/http-kernel/Bundle/Bundle.php b/vendor/symfony/http-kernel/Bundle/Bundle.php
index ebec7ff..bd8f51e 100644
--- a/vendor/symfony/http-kernel/Bundle/Bundle.php
+++ b/vendor/symfony/http-kernel/Bundle/Bundle.php
@@ -11,7 +11,7 @@
namespace Symfony\Component\HttpKernel\Bundle;
-use Symfony\Component\DependencyInjection\ContainerAware;
+use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\Console\Application;
@@ -24,8 +24,12 @@
*
* @author Fabien Potencier
*/
-abstract class Bundle extends ContainerAware implements BundleInterface
+abstract class Bundle implements BundleInterface
{
+ /**
+ * @var ContainerInterface
+ */
+ protected $container;
protected $name;
protected $extension;
protected $path;
@@ -59,6 +63,16 @@ public function build(ContainerBuilder $container)
}
/**
+ * Sets the container.
+ *
+ * @param ContainerInterface|null $container A ContainerInterface instance or null
+ */
+ public function setContainer(ContainerInterface $container = null)
+ {
+ $this->container = $container;
+ }
+
+ /**
* Returns the bundle's container extension.
*
* @return ExtensionInterface|null The container extension
@@ -68,17 +82,17 @@ public function build(ContainerBuilder $container)
public function getContainerExtension()
{
if (null === $this->extension) {
- $class = $this->getContainerExtensionClass();
- if (class_exists($class)) {
- $extension = new $class();
+ $extension = $this->createContainerExtension();
+ if (null !== $extension) {
if (!$extension instanceof ExtensionInterface) {
- throw new \LogicException(sprintf('Extension %s must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', $class));
+ throw new \LogicException(sprintf('Extension %s must implement Symfony\Component\DependencyInjection\Extension\ExtensionInterface.', get_class($extension)));
}
// check naming convention
$basename = preg_replace('/Bundle$/', '', $this->getName());
$expectedAlias = Container::underscore($basename);
+
if ($expectedAlias != $extension->getAlias()) {
throw new \LogicException(sprintf(
'Users will expect the alias of the default extension of a bundle to be the underscored version of the bundle name ("%s"). You can override "Bundle::getContainerExtension()" if you want to use "%s" or another alias.',
@@ -166,6 +180,10 @@ public function registerCommands(Application $application)
return;
}
+ if (!class_exists('Symfony\Component\Finder\Finder')) {
+ throw new \RuntimeException('You need the symfony/finder component to register bundle commands.');
+ }
+
$finder = new Finder();
$finder->files()->name('*Command.php')->in($dir);
@@ -173,7 +191,7 @@ public function registerCommands(Application $application)
foreach ($finder as $file) {
$ns = $prefix;
if ($relativePath = $file->getRelativePath()) {
- $ns .= '\\'.strtr($relativePath, '/', '\\');
+ $ns .= '\\'.str_replace('/', '\\', $relativePath);
}
$class = $ns.'\\'.$file->getBasename('.php');
if ($this->container) {
@@ -200,4 +218,16 @@ protected function getContainerExtensionClass()
return $this->getNamespace().'\\DependencyInjection\\'.$basename.'Extension';
}
+
+ /**
+ * Creates the bundle's container extension.
+ *
+ * @return ExtensionInterface|null
+ */
+ protected function createContainerExtension()
+ {
+ if (class_exists($class = $this->getContainerExtensionClass())) {
+ return new $class();
+ }
+ }
}
diff --git a/vendor/symfony/http-kernel/CHANGELOG.md b/vendor/symfony/http-kernel/CHANGELOG.md
index ad27886..bab3aba 100644
--- a/vendor/symfony/http-kernel/CHANGELOG.md
+++ b/vendor/symfony/http-kernel/CHANGELOG.md
@@ -1,6 +1,11 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * deprecated `Profiler::import` and `Profiler::export`
+
2.7.0
-----
diff --git a/vendor/symfony/http-kernel/Client.php b/vendor/symfony/http-kernel/Client.php
index b344fa1..80b1bd6 100644
--- a/vendor/symfony/http-kernel/Client.php
+++ b/vendor/symfony/http-kernel/Client.php
@@ -105,7 +105,7 @@ protected function getScript($request)
$code = <<
*/
-class EnvParametersResource implements ResourceInterface, \Serializable
+class EnvParametersResource implements SelfCheckingResourceInterface, \Serializable
{
/**
* @var string
diff --git a/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php b/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php
new file mode 100644
index 0000000..b8405d5
--- /dev/null
+++ b/vendor/symfony/http-kernel/DataCollector/AjaxDataCollector.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\DataCollector;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+/**
+ * AjaxDataCollector.
+ *
+ * @author Bart van den Burg
+ */
+class AjaxDataCollector extends DataCollector
+{
+ public function collect(Request $request, Response $response, \Exception $exception = null)
+ {
+ // all collecting is done client side
+ }
+
+ public function getName()
+ {
+ return 'ajax';
+ }
+}
diff --git a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php
index 1258434..11a4cc8 100644
--- a/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php
+++ b/vendor/symfony/http-kernel/DataCollector/LoggerDataCollector.php
@@ -22,6 +22,24 @@
*/
class LoggerDataCollector extends DataCollector implements LateDataCollectorInterface
{
+ private $errorNames = array(
+ E_DEPRECATED => 'E_DEPRECATED',
+ E_USER_DEPRECATED => 'E_USER_DEPRECATED',
+ E_NOTICE => 'E_NOTICE',
+ E_USER_NOTICE => 'E_USER_NOTICE',
+ E_STRICT => 'E_STRICT',
+ E_WARNING => 'E_WARNING',
+ E_USER_WARNING => 'E_USER_WARNING',
+ E_COMPILE_WARNING => 'E_COMPILE_WARNING',
+ E_CORE_WARNING => 'E_CORE_WARNING',
+ E_USER_ERROR => 'E_USER_ERROR',
+ E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
+ E_COMPILE_ERROR => 'E_COMPILE_ERROR',
+ E_PARSE => 'E_PARSE',
+ E_ERROR => 'E_ERROR',
+ E_CORE_ERROR => 'E_CORE_ERROR',
+ );
+
private $logger;
public function __construct($logger = null)
@@ -106,6 +124,9 @@ private function sanitizeLogs($logs)
if (isset($context['type'], $context['file'], $context['line'], $context['level'])) {
$errorId = md5("{$context['type']}/{$context['line']}/{$context['file']}\x00{$log['message']}", true);
$silenced = !($context['type'] & $context['level']);
+ if (isset($this->errorNames[$context['type']])) {
+ $context = array_merge(array('name' => $this->errorNames[$context['type']]), $context);
+ }
if (isset($errorContextById[$errorId])) {
if (isset($errorContextById[$errorId]['errorCount'])) {
diff --git a/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php b/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php
index 4efe7cb..50dde02 100644
--- a/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php
+++ b/vendor/symfony/http-kernel/DependencyInjection/LazyLoadingFragmentHandler.php
@@ -25,11 +25,30 @@ class LazyLoadingFragmentHandler extends FragmentHandler
private $container;
private $rendererIds = array();
- public function __construct(ContainerInterface $container, $debug = false, RequestStack $requestStack = null)
+ /**
+ * Constructor.
+ *
+ * RequestStack will become required in 3.0.
+ *
+ * @param ContainerInterface $container A container
+ * @param RequestStack $requestStack The Request stack that controls the lifecycle of requests
+ * @param bool $debug Whether the debug mode is enabled or not
+ */
+ public function __construct(ContainerInterface $container, $requestStack = null, $debug = false)
{
$this->container = $container;
- parent::__construct(array(), $debug, $requestStack);
+ if ((null !== $requestStack && !$requestStack instanceof RequestStack) || $debug instanceof RequestStack) {
+ $tmp = $debug;
+ $debug = $requestStack;
+ $requestStack = func_num_args() < 3 ? null : $tmp;
+
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ } elseif (!$requestStack instanceof RequestStack) {
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ }
+
+ parent::__construct($requestStack, array(), $debug);
}
/**
diff --git a/vendor/symfony/http-kernel/Event/PostResponseEvent.php b/vendor/symfony/http-kernel/Event/PostResponseEvent.php
index 5d4450b..2406fdd 100644
--- a/vendor/symfony/http-kernel/Event/PostResponseEvent.php
+++ b/vendor/symfony/http-kernel/Event/PostResponseEvent.php
@@ -12,53 +12,26 @@
namespace Symfony\Component\HttpKernel\Event;
use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\EventDispatcher\Event;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Allows to execute logic after a response was sent.
*
+ * Since it's only triggered on master requests, the `getRequestType()` method
+ * will always return the value of `HttpKernelInterface::MASTER_REQUEST`.
+ *
* @author Jordi Boggiano
*/
-class PostResponseEvent extends Event
+class PostResponseEvent extends KernelEvent
{
- /**
- * The kernel in which this event was thrown.
- *
- * @var HttpKernelInterface
- */
- private $kernel;
-
- private $request;
-
private $response;
public function __construct(HttpKernelInterface $kernel, Request $request, Response $response)
{
- $this->kernel = $kernel;
- $this->request = $request;
- $this->response = $response;
- }
+ parent::__construct($kernel, $request, HttpKernelInterface::MASTER_REQUEST);
- /**
- * Returns the kernel in which this event was thrown.
- *
- * @return HttpKernelInterface
- */
- public function getKernel()
- {
- return $this->kernel;
- }
-
- /**
- * Returns the request for which this event was thrown.
- *
- * @return Request
- */
- public function getRequest()
- {
- return $this->request;
+ $this->response = $response;
}
/**
diff --git a/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php b/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php
index f50e4d6..19a4c6d 100644
--- a/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php
+++ b/vendor/symfony/http-kernel/EventListener/DebugHandlersListener.php
@@ -67,7 +67,7 @@ public function configure(Event $event = null)
}
$this->firstCall = false;
if ($this->logger || null !== $this->throwAt) {
- $handler = set_error_handler('var_dump', 0);
+ $handler = set_error_handler('var_dump');
$handler = is_array($handler) ? $handler[0] : null;
restore_error_handler();
if ($handler instanceof ErrorHandler) {
diff --git a/vendor/symfony/http-kernel/EventListener/LocaleListener.php b/vendor/symfony/http-kernel/EventListener/LocaleListener.php
index 564f6dc..0ff3a86 100644
--- a/vendor/symfony/http-kernel/EventListener/LocaleListener.php
+++ b/vendor/symfony/http-kernel/EventListener/LocaleListener.php
@@ -36,10 +36,36 @@ class LocaleListener implements EventSubscriberInterface
private $requestStack;
/**
+ * Constructor.
+ *
* RequestStack will become required in 3.0.
+ *
+ * @param RequestStack $requestStack A RequestStack instance
+ * @param string $defaultLocale The default locale
+ * @param RequestContextAwareInterface|null $router The router
+ *
+ * @throws \InvalidArgumentException
*/
- public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null, RequestStack $requestStack = null)
+ public function __construct($requestStack = null, $defaultLocale = 'en', $router = null)
{
+ if ((null !== $requestStack && !$requestStack instanceof RequestStack) || $defaultLocale instanceof RequestContextAwareInterface || $router instanceof RequestStack) {
+ $tmp = $router;
+ $router = func_num_args() < 2 ? null : $defaultLocale;
+ $defaultLocale = $requestStack;
+ $requestStack = func_num_args() < 3 ? null : $tmp;
+
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as first argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ } elseif (!$requestStack instanceof RequestStack) {
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ }
+
+ if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+ throw new \InvalidArgumentException('RequestStack instance expected.');
+ }
+ if (null !== $router && !$router instanceof RequestContextAwareInterface) {
+ throw new \InvalidArgumentException('Router must implement RequestContextAwareInterface.');
+ }
+
$this->defaultLocale = $defaultLocale;
$this->requestStack = $requestStack;
$this->router = $router;
diff --git a/vendor/symfony/http-kernel/EventListener/ProfilerListener.php b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php
index 06a5bbf..f73f325 100644
--- a/vendor/symfony/http-kernel/EventListener/ProfilerListener.php
+++ b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php
@@ -42,18 +42,30 @@ class ProfilerListener implements EventSubscriberInterface
* Constructor.
*
* @param Profiler $profiler A Profiler instance
+ * @param RequestStack $requestStack A RequestStack instance
* @param RequestMatcherInterface|null $matcher A RequestMatcher instance
* @param bool $onlyException true if the profiler only collects data when an exception occurs, false otherwise
* @param bool $onlyMasterRequests true if the profiler only collects data when the request is a master request, false otherwise
- * @param RequestStack|null $requestStack A RequestStack instance
*/
- public function __construct(Profiler $profiler, RequestMatcherInterface $matcher = null, $onlyException = false, $onlyMasterRequests = false, RequestStack $requestStack = null)
+ public function __construct(Profiler $profiler, $requestStack = null, $matcher = null, $onlyException = false, $onlyMasterRequests = false)
{
- if (null === $requestStack) {
- // Prevent the deprecation notice to be triggered all the time.
- // The onKernelRequest() method fires some logic only when the
- // RequestStack instance is not provided as a dependency.
- @trigger_error('Since version 2.4, the '.__METHOD__.' method must accept a RequestStack instance to get the request instead of using the '.__CLASS__.'::onKernelRequest method that will be removed in 3.0.', E_USER_DEPRECATED);
+ if ($requestStack instanceof RequestMatcherInterface || (null !== $matcher && !$matcher instanceof RequestMatcherInterface) || $onlyMasterRequests instanceof RequestStack) {
+ $tmp = $onlyMasterRequests;
+ $onlyMasterRequests = $onlyException;
+ $onlyException = $matcher;
+ $matcher = $requestStack;
+ $requestStack = func_num_args() < 5 ? null : $tmp;
+
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::onKernelRequest method will be removed in 3.0.', E_USER_DEPRECATED);
+ } elseif (!$requestStack instanceof RequestStack) {
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::onKernelRequest method will be removed in 3.0.', E_USER_DEPRECATED);
+ }
+
+ if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+ throw new \InvalidArgumentException('RequestStack instance expected.');
+ }
+ if (null !== $matcher && !$matcher instanceof RequestMatcherInterface) {
+ throw new \InvalidArgumentException('Matcher must implement RequestMatcherInterface.');
}
$this->profiler = $profiler;
diff --git a/vendor/symfony/http-kernel/EventListener/RouterListener.php b/vendor/symfony/http-kernel/EventListener/RouterListener.php
index 297aab6..761e591 100644
--- a/vendor/symfony/http-kernel/EventListener/RouterListener.php
+++ b/vendor/symfony/http-kernel/EventListener/RouterListener.php
@@ -51,14 +51,35 @@ class RouterListener implements EventSubscriberInterface
* RequestStack will become required in 3.0.
*
* @param UrlMatcherInterface|RequestMatcherInterface $matcher The Url or Request matcher
+ * @param RequestStack $requestStack A RequestStack instance
* @param RequestContext|null $context The RequestContext (can be null when $matcher implements RequestContextAwareInterface)
* @param LoggerInterface|null $logger The logger
- * @param RequestStack|null $requestStack A RequestStack instance
*
* @throws \InvalidArgumentException
*/
- public function __construct($matcher, RequestContext $context = null, LoggerInterface $logger = null, RequestStack $requestStack = null)
+ public function __construct($matcher, $requestStack = null, $context = null, $logger = null)
{
+ if ($requestStack instanceof RequestContext || $context instanceof LoggerInterface || $logger instanceof RequestStack) {
+ $tmp = $requestStack;
+ $requestStack = $logger;
+ $logger = $context;
+ $context = $tmp;
+
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as second argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ } elseif (!$requestStack instanceof RequestStack) {
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ }
+
+ if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+ throw new \InvalidArgumentException('RequestStack instance expected.');
+ }
+ if (null !== $context && !$context instanceof RequestContext) {
+ throw new \InvalidArgumentException('RequestContext instance expected.');
+ }
+ if (null !== $logger && !$logger instanceof LoggerInterface) {
+ throw new \InvalidArgumentException('Logger must implement LoggerInterface.');
+ }
+
if (!$matcher instanceof UrlMatcherInterface && !$matcher instanceof RequestMatcherInterface) {
throw new \InvalidArgumentException('Matcher must either implement UrlMatcherInterface or RequestMatcherInterface.');
}
@@ -67,10 +88,6 @@ public function __construct($matcher, RequestContext $context = null, LoggerInte
throw new \InvalidArgumentException('You must either pass a RequestContext or the matcher must implement RequestContextAwareInterface.');
}
- if (!$requestStack instanceof RequestStack) {
- @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
- }
-
$this->matcher = $matcher;
$this->context = $context ?: $matcher->getContext();
$this->requestStack = $requestStack;
diff --git a/vendor/symfony/http-kernel/Fragment/FragmentHandler.php b/vendor/symfony/http-kernel/Fragment/FragmentHandler.php
index 774870a..dff3773 100644
--- a/vendor/symfony/http-kernel/Fragment/FragmentHandler.php
+++ b/vendor/symfony/http-kernel/Fragment/FragmentHandler.php
@@ -44,12 +44,30 @@ class FragmentHandler
*
* RequestStack will become required in 3.0.
*
+ * @param RequestStack $requestStack The Request stack that controls the lifecycle of requests
* @param FragmentRendererInterface[] $renderers An array of FragmentRendererInterface instances
* @param bool $debug Whether the debug mode is enabled or not
- * @param RequestStack|null $requestStack The Request stack that controls the lifecycle of requests
*/
- public function __construct(array $renderers = array(), $debug = false, RequestStack $requestStack = null)
+ public function __construct($requestStack = null, $renderers = array(), $debug = false)
{
+ if (is_array($requestStack)) {
+ $tmp = $debug;
+ $debug = func_num_args() < 2 ? false : $renderers;
+ $renderers = $requestStack;
+ $requestStack = func_num_args() < 3 ? null : $tmp;
+
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack to be given as first argument as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ } elseif (!$requestStack instanceof RequestStack) {
+ @trigger_error('The '.__METHOD__.' method now requires a RequestStack instance as '.__CLASS__.'::setRequest method will not be supported anymore in 3.0.', E_USER_DEPRECATED);
+ }
+
+ if (null !== $requestStack && !$requestStack instanceof RequestStack) {
+ throw new \InvalidArgumentException('RequestStack instance expected.');
+ }
+ if (!is_array($renderers)) {
+ throw new \InvalidArgumentException('Renderers must be an array.');
+ }
+
$this->requestStack = $requestStack;
foreach ($renderers as $renderer) {
$this->addRenderer($renderer);
diff --git a/vendor/symfony/http-kernel/HttpCache/Store.php b/vendor/symfony/http-kernel/HttpCache/Store.php
index 044d14e..433b0ef 100644
--- a/vendor/symfony/http-kernel/HttpCache/Store.php
+++ b/vendor/symfony/http-kernel/HttpCache/Store.php
@@ -32,12 +32,14 @@ class Store implements StoreInterface
* Constructor.
*
* @param string $root The path to the cache directory
+ *
+ * @throws \RuntimeException
*/
public function __construct($root)
{
$this->root = $root;
- if (!is_dir($this->root)) {
- mkdir($this->root, 0777, true);
+ if (!is_dir($this->root) && !@mkdir($this->root, 0777, true) && !is_dir($this->root)) {
+ throw new \RuntimeException(sprintf('Unable to create the store directory (%s).', $this->root));
}
$this->keyCache = new \SplObjectStorage();
$this->locks = array();
@@ -74,7 +76,7 @@ public function cleanup()
public function lock(Request $request)
{
$path = $this->getPath($this->getCacheKey($request).'.lck');
- if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
+ if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
return false;
}
@@ -106,7 +108,10 @@ public function unlock(Request $request)
public function isLocked(Request $request)
{
- return is_file($this->getPath($this->getCacheKey($request).'.lck'));
+ $path = $this->getPath($this->getCacheKey($request).'.lck');
+ clearstatcache(true, $path);
+
+ return is_file($path);
}
/**
@@ -242,10 +247,8 @@ public function invalidate(Request $request)
}
}
- if ($modified) {
- if (false === $this->save($key, serialize($entries))) {
- throw new \RuntimeException('Unable to store the metadata.');
- }
+ if ($modified && false === $this->save($key, serialize($entries))) {
+ throw new \RuntimeException('Unable to store the metadata.');
}
}
@@ -266,7 +269,7 @@ private function requestsMatch($vary, $env1, $env2)
}
foreach (preg_split('/[\s,]+/', $vary) as $header) {
- $key = strtr(strtolower($header), '_', '-');
+ $key = str_replace('_', '-', strtolower($header));
$v1 = isset($env1[$key]) ? $env1[$key] : null;
$v2 = isset($env2[$key]) ? $env2[$key] : null;
if ($v1 !== $v2) {
@@ -338,7 +341,7 @@ private function load($key)
private function save($key, $data)
{
$path = $this->getPath($key);
- if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true)) {
+ if (!is_dir(dirname($path)) && false === @mkdir(dirname($path), 0777, true) && !is_dir(dirname($path))) {
return false;
}
diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php
index a02dcd9..da96ac0 100644
--- a/vendor/symfony/http-kernel/Kernel.php
+++ b/vendor/symfony/http-kernel/Kernel.php
@@ -21,6 +21,7 @@
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
+use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
@@ -58,15 +59,15 @@
protected $startTime;
protected $loadClassCache;
- const VERSION = '2.7.6';
- const VERSION_ID = 20706;
+ const VERSION = '2.8.2';
+ const VERSION_ID = 20802;
const MAJOR_VERSION = 2;
- const MINOR_VERSION = 7;
- const RELEASE_VERSION = 6;
+ const MINOR_VERSION = 8;
+ const RELEASE_VERSION = 2;
const EXTRA_VERSION = '';
- const END_OF_MAINTENANCE = '05/2018';
- const END_OF_LIFE = '05/2019';
+ const END_OF_MAINTENANCE = '11/2018';
+ const END_OF_LIFE = '11/2019';
/**
* Constructor.
@@ -685,6 +686,7 @@ protected function getContainerLoader(ContainerInterface $container)
new YamlFileLoader($container, $locator),
new IniFileLoader($container, $locator),
new PhpFileLoader($container, $locator),
+ new DirectoryLoader($container, $locator),
new ClosureLoader($container),
));
diff --git a/vendor/symfony/http-kernel/LICENSE b/vendor/symfony/http-kernel/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/http-kernel/LICENSE
+++ b/vendor/symfony/http-kernel/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php
index c6395bd..3eb6919 100644
--- a/vendor/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/BaseMemcacheProfilerStorage.php
@@ -11,10 +11,15 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\BaseMemcacheProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* Base Memcache storage for profiling information in a Memcache.
*
* @author Andrej Hudec
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
abstract class BaseMemcacheProfilerStorage implements ProfilerStorageInterface
{
diff --git a/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php
index 581ab64..29da4ab 100644
--- a/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/FileProfilerStorage.php
@@ -41,8 +41,8 @@ public function __construct($dsn)
}
$this->folder = substr($dsn, 5);
- if (!is_dir($this->folder)) {
- mkdir($this->folder, 0777, true);
+ if (!is_dir($this->folder) && false === @mkdir($this->folder, 0777, true) && !is_dir($this->folder)) {
+ throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $this->folder));
}
}
@@ -128,6 +128,8 @@ public function read($token)
/**
* {@inheritdoc}
+ *
+ * @throws \RuntimeException
*/
public function write(Profile $profile)
{
@@ -137,8 +139,8 @@ public function write(Profile $profile)
if (!$profileIndexed) {
// Create directory
$dir = dirname($file);
- if (!is_dir($dir)) {
- mkdir($dir, 0777, true);
+ if (!is_dir($dir) && false === @mkdir($dir, 0777, true) && !is_dir($dir)) {
+ throw new \RuntimeException(sprintf('Unable to create the storage directory (%s).', $dir));
}
}
diff --git a/vendor/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php
index 2727405..997c0dd 100644
--- a/vendor/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/MemcacheProfilerStorage.php
@@ -11,10 +11,15 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\MemcacheProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* Memcache Profiler Storage.
*
* @author Andrej Hudec
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
class MemcacheProfilerStorage extends BaseMemcacheProfilerStorage
{
diff --git a/vendor/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php
index 0c57373..edf6ff1 100644
--- a/vendor/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/MemcachedProfilerStorage.php
@@ -11,10 +11,15 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\MemcachedProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* Memcached Profiler Storage.
*
* @author Andrej Hudec
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
class MemcachedProfilerStorage extends BaseMemcacheProfilerStorage
{
diff --git a/vendor/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php
index f35a7f7..fddc87e 100644
--- a/vendor/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/MongoDbProfilerStorage.php
@@ -11,6 +11,12 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\MongoDbProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
+/**
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
+ */
class MongoDbProfilerStorage implements ProfilerStorageInterface
{
protected $dsn;
diff --git a/vendor/symfony/http-kernel/Profiler/MysqlProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/MysqlProfilerStorage.php
index 92e8a1b..45d9cff 100644
--- a/vendor/symfony/http-kernel/Profiler/MysqlProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/MysqlProfilerStorage.php
@@ -11,10 +11,15 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\MysqlProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* A ProfilerStorage for Mysql.
*
* @author Jan Schumann
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
class MysqlProfilerStorage extends PdoProfilerStorage
{
diff --git a/vendor/symfony/http-kernel/Profiler/PdoProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/PdoProfilerStorage.php
index 48f813f..27da159 100644
--- a/vendor/symfony/http-kernel/Profiler/PdoProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/PdoProfilerStorage.php
@@ -11,11 +11,16 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\PdoProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* Base PDO storage for profiling information in a PDO database.
*
* @author Fabien Potencier
* @author Jan Schumann
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
abstract class PdoProfilerStorage implements ProfilerStorageInterface
{
@@ -188,9 +193,8 @@ protected function fetch($db, $query, array $args = array())
$stmt->bindValue($arg, $val, is_int($val) ? \PDO::PARAM_INT : \PDO::PARAM_STR);
}
$stmt->execute();
- $return = $stmt->fetchAll(\PDO::FETCH_ASSOC);
- return $return;
+ return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
protected function close($db)
diff --git a/vendor/symfony/http-kernel/Profiler/Profiler.php b/vendor/symfony/http-kernel/Profiler/Profiler.php
index 864f624..378bf5d 100644
--- a/vendor/symfony/http-kernel/Profiler/Profiler.php
+++ b/vendor/symfony/http-kernel/Profiler/Profiler.php
@@ -137,9 +137,13 @@ public function purge()
* @param Profile $profile A Profile instance
*
* @return string The exported data
+ *
+ * @deprecated since Symfony 2.8, to be removed in 3.0.
*/
public function export(Profile $profile)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
return base64_encode(serialize($profile));
}
@@ -149,9 +153,13 @@ public function export(Profile $profile)
* @param string $data A data string as exported by the export() method
*
* @return Profile A Profile instance
+ *
+ * @deprecated since Symfony 2.8, to be removed in 3.0.
*/
public function import($data)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED);
+
$profile = unserialize(base64_decode($data));
if ($this->storage->read($profile->getToken())) {
diff --git a/vendor/symfony/http-kernel/Profiler/RedisProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/RedisProfilerStorage.php
index b0e14ea..2568e3b 100644
--- a/vendor/symfony/http-kernel/Profiler/RedisProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/RedisProfilerStorage.php
@@ -11,11 +11,16 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\RedisProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* RedisProfilerStorage stores profiling information in Redis.
*
* @author Andrej Hudec
* @author Stephane PY
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
class RedisProfilerStorage implements ProfilerStorageInterface
{
diff --git a/vendor/symfony/http-kernel/Profiler/SqliteProfilerStorage.php b/vendor/symfony/http-kernel/Profiler/SqliteProfilerStorage.php
index 4a996fd..2f78864 100644
--- a/vendor/symfony/http-kernel/Profiler/SqliteProfilerStorage.php
+++ b/vendor/symfony/http-kernel/Profiler/SqliteProfilerStorage.php
@@ -11,10 +11,15 @@
namespace Symfony\Component\HttpKernel\Profiler;
+@trigger_error('The '.__NAMESPACE__.'\SqliteProfilerStorage class is deprecated since Symfony 2.8 and will be removed in 3.0. Use FileProfilerStorage instead.', E_USER_DEPRECATED);
+
/**
* SqliteProfilerStorage stores profiling information in a SQLite database.
*
* @author Fabien Potencier
+ *
+ * @deprecated Deprecated since Symfony 2.8, to be removed in Symfony 3.0.
+ * Use {@link FileProfilerStorage} instead.
*/
class SqliteProfilerStorage extends PdoProfilerStorage
{
diff --git a/vendor/symfony/http-kernel/UriSigner.php b/vendor/symfony/http-kernel/UriSigner.php
index 6ddce87..c2d0d79 100644
--- a/vendor/symfony/http-kernel/UriSigner.php
+++ b/vendor/symfony/http-kernel/UriSigner.php
@@ -51,7 +51,7 @@ public function sign($uri)
$uri = $this->buildUrl($url, $params);
- return $uri.(false === (strpos($uri, '?')) ? '?' : '&').'_hash='.$this->computeHash($uri);
+ return $uri.(false === strpos($uri, '?') ? '?' : '&').'_hash='.$this->computeHash($uri);
}
/**
@@ -91,7 +91,7 @@ private function computeHash($uri)
private function buildUrl(array $url, array $params = array())
{
- ksort($params);
+ ksort($params, SORT_STRING);
$url['query'] = http_build_query($params, '', '&');
$scheme = isset($url['scheme']) ? $url['scheme'].'://' : '';
diff --git a/vendor/symfony/http-kernel/composer.json b/vendor/symfony/http-kernel/composer.json
index 623d732..d0e92d5 100644
--- a/vendor/symfony/http-kernel/composer.json
+++ b/vendor/symfony/http-kernel/composer.json
@@ -17,27 +17,27 @@
],
"require": {
"php": ">=5.3.9",
- "symfony/event-dispatcher": "~2.6,>=2.6.7",
- "symfony/http-foundation": "~2.5,>=2.5.4",
+ "symfony/event-dispatcher": "~2.6,>=2.6.7|~3.0.0",
+ "symfony/http-foundation": "~2.5,>=2.5.4|~3.0.0",
"symfony/debug": "~2.6,>=2.6.2",
"psr/log": "~1.0"
},
"require-dev": {
- "symfony/browser-kit": "~2.3",
- "symfony/class-loader": "~2.1",
- "symfony/config": "~2.7",
- "symfony/console": "~2.3",
- "symfony/css-selector": "~2.0,>=2.0.5",
- "symfony/dependency-injection": "~2.2",
- "symfony/dom-crawler": "~2.0,>=2.0.5",
- "symfony/expression-language": "~2.4",
- "symfony/finder": "~2.0,>=2.0.5",
- "symfony/process": "~2.0,>=2.0.5",
- "symfony/routing": "~2.2",
- "symfony/stopwatch": "~2.3",
- "symfony/templating": "~2.2",
- "symfony/translation": "~2.0,>=2.0.5",
- "symfony/var-dumper": "~2.6"
+ "symfony/browser-kit": "~2.3|~3.0.0",
+ "symfony/class-loader": "~2.1|~3.0.0",
+ "symfony/config": "~2.8",
+ "symfony/console": "~2.3|~3.0.0",
+ "symfony/css-selector": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/dependency-injection": "~2.8|~3.0.0",
+ "symfony/dom-crawler": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/expression-language": "~2.4|~3.0.0",
+ "symfony/finder": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/process": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/routing": "~2.8|~3.0.0",
+ "symfony/stopwatch": "~2.3|~3.0.0",
+ "symfony/templating": "~2.2|~3.0.0",
+ "symfony/translation": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/var-dumper": "~2.6|~3.0.0"
},
"conflict": {
"symfony/config": "<2.7"
@@ -52,12 +52,15 @@
"symfony/var-dumper": ""
},
"autoload": {
- "psr-4": { "Symfony\\Component\\HttpKernel\\": "" }
+ "psr-4": { "Symfony\\Component\\HttpKernel\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/http-kernel/phpunit.xml.dist b/vendor/symfony/http-kernel/phpunit.xml.dist
index 1314966..17c4893 100644
--- a/vendor/symfony/http-kernel/phpunit.xml.dist
+++ b/vendor/symfony/http-kernel/phpunit.xml.dist
@@ -25,4 +25,14 @@
+
+
+
+
+
+ Symfony\Component\HttpFoundation
+
+
+
+
diff --git a/vendor/symfony/event-dispatcher/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE
similarity index 96%
copy from vendor/symfony/event-dispatcher/LICENSE
copy to vendor/symfony/polyfill-mbstring/LICENSE
index 43028bc..39fa189 100644
--- a/vendor/symfony/event-dispatcher/LICENSE
+++ b/vendor/symfony/polyfill-mbstring/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2014-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
new file mode 100644
index 0000000..31f678b
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -0,0 +1,604 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Mbstring;
+
+/**
+ * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
+ *
+ * Implemented:
+ * - mb_convert_encoding - Convert character encoding
+ * - mb_convert_variables - Convert character code in variable(s)
+ * - mb_decode_mimeheader - Decode string in MIME header field
+ * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
+ * - mb_convert_case - Perform case folding on a string
+ * - mb_get_info - Get internal settings of mbstring
+ * - mb_http_input - Detect HTTP input character encoding
+ * - mb_http_output - Set/Get HTTP output character encoding
+ * - mb_internal_encoding - Set/Get internal character encoding
+ * - mb_list_encodings - Returns an array of all supported encodings
+ * - mb_output_handler - Callback function converts character encoding in output buffer
+ * - mb_strlen - Get string length
+ * - mb_strpos - Find position of first occurrence of string in a string
+ * - mb_strrpos - Find position of last occurrence of a string in a string
+ * - mb_strtolower - Make a string lowercase
+ * - mb_strtoupper - Make a string uppercase
+ * - mb_substitute_character - Set/Get substitution character
+ * - mb_substr - Get part of string
+ * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive
+ * - mb_stristr - Finds first occurrence of a string within another, case insensitive
+ * - mb_strrchr - Finds the last occurrence of a character in a string within another
+ * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive
+ * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive
+ * - mb_strstr - Finds first occurrence of a string within anothers
+ * - mb_strwidth - Return width of string
+ * - mb_substr_count - Count the number of substring occurrences
+ *
+ * Not implemented:
+ * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
+ * - mb_ereg_* - Regular expression with multibyte support
+ * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable
+ * - mb_preferred_mime_name - Get MIME charset string
+ * - mb_regex_encoding - Returns current encoding for multibyte regex as string
+ * - mb_regex_set_options - Set/Get the default options for mbregex functions
+ * - mb_send_mail - Send encoded mail
+ * - mb_split - Split multibyte string using regular expression
+ * - mb_strcut - Get part of string
+ * - mb_strimwidth - Get truncated string with specified width
+ *
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+final class Mbstring
+{
+ const MB_CASE_FOLD = PHP_INT_MAX;
+
+ private static $encodingList = array('ASCII', 'UTF-8');
+ private static $language = 'neutral';
+ private static $internalEncoding = 'UTF-8';
+ private static $caseFold = array(
+ array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
+ array('μ','s','ι', 'σ','β', 'θ', 'φ', 'π', 'κ', 'ρ', 'ε', "\xE1\xB9\xA1",'ι'),
+ );
+
+ public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
+ {
+ if (is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
+ $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
+ } else {
+ $fromEncoding = self::getEncoding($fromEncoding);
+ }
+
+ $toEncoding = self::getEncoding($toEncoding);
+
+ if ('BASE64' === $fromEncoding) {
+ $s = base64_decode($s);
+ $fromEncoding = $toEncoding;
+ }
+
+ if ('BASE64' === $toEncoding) {
+ return base64_encode($s);
+ }
+
+ if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
+ if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
+ $fromEncoding = 'Windows-1252';
+ }
+ if ('UTF-8' !== $fromEncoding) {
+ $s = iconv($fromEncoding, 'UTF-8', $s);
+ }
+
+ return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
+ }
+
+ if ('HTML-ENTITIES' === $fromEncoding) {
+ $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
+ $fromEncoding = 'UTF-8';
+ }
+
+ return iconv($fromEncoding, $toEncoding, $s);
+ }
+
+ public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
+ {
+ $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
+
+ $ok = true;
+ array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
+ if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
+ $ok = false;
+ }
+ });
+
+ return $ok ? $fromEncoding : false;
+ }
+
+ public static function mb_decode_mimeheader($s)
+ {
+ return iconv_mime_decode($s, 2, self::$internalEncoding);
+ }
+
+ public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
+ {
+ trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
+ }
+
+ public static function mb_convert_case($s, $mode, $encoding = null)
+ {
+ if ('' === $s .= '') {
+ return '';
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding) {
+ $encoding = null;
+ } else {
+ $s = iconv($encoding, 'UTF-8', $s);
+ }
+
+ if (MB_CASE_TITLE == $mode) {
+ $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
+ $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
+ } else {
+ if (MB_CASE_UPPER == $mode) {
+ static $upper = null;
+ if (null === $upper) {
+ $upper = self::getData('upperCase');
+ }
+ $map = $upper;
+ } else {
+ if (self::MB_CASE_FOLD === $mode) {
+ $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
+ }
+
+ static $lower = null;
+ if (null === $lower) {
+ $lower = self::getData('lowerCase');
+ }
+ $map = $lower;
+ }
+
+ static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+ $i = 0;
+ $len = strlen($s);
+
+ while ($i < $len) {
+ $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+ $uchr = substr($s, $i, $ulen);
+ $i += $ulen;
+
+ if (isset($map[$uchr])) {
+ $uchr = $map[$uchr];
+ $nlen = strlen($uchr);
+
+ if ($nlen == $ulen) {
+ $nlen = $i;
+ do {
+ $s[--$nlen] = $uchr[--$ulen];
+ } while ($ulen);
+ } else {
+ $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
+ $len += $nlen - $ulen;
+ $i += $nlen - $ulen;
+ }
+ }
+ }
+ }
+
+ if (null === $encoding) {
+ return $s;
+ }
+
+ return iconv('UTF-8', $encoding, $s);
+ }
+
+ public static function mb_internal_encoding($encoding = null)
+ {
+ if (null === $encoding) {
+ return self::$internalEncoding;
+ }
+
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
+ self::$internalEncoding = $encoding;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static function mb_language($lang = null)
+ {
+ if (null === $lang) {
+ return self::$language;
+ }
+
+ switch ($lang = strtolower($lang)) {
+ case 'uni':
+ case 'neutral':
+ self::$language = $lang;
+
+ return true;
+ }
+
+ return false;
+ }
+
+ public static function mb_list_encodings()
+ {
+ return array('UTF-8');
+ }
+
+ public static function mb_encoding_aliases($encoding)
+ {
+ switch (strtoupper($encoding)) {
+ case 'UTF8':
+ case 'UTF-8':
+ return array('utf8');
+ }
+
+ return false;
+ }
+
+ public static function mb_check_encoding($var = null, $encoding = null)
+ {
+ if (null === $encoding) {
+ if (null === $var) {
+ return false;
+ }
+ $encoding = self::$internalEncoding;
+ }
+
+ return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
+ }
+
+ public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
+ {
+ if (null === $encodingList) {
+ $encodingList = self::$encodingList;
+ } else {
+ if (!is_array($encodingList)) {
+ $encodingList = array_map('trim', explode(',', $encodingList));
+ }
+ $encodingList = array_map('strtoupper', $encodingList);
+ }
+
+ foreach ($encodingList as $enc) {
+ switch ($enc) {
+ case 'ASCII':
+ if (!preg_match('/[\x80-\xFF]/', $str)) {
+ return $enc;
+ }
+ break;
+
+ case 'UTF8':
+ case 'UTF-8':
+ if (preg_match('//u', $str)) {
+ return 'UTF-8';
+ }
+ break;
+
+ default:
+ if (0 === strncmp($enc, 'ISO-8859-', 9)) {
+ return $enc;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public static function mb_detect_order($encodingList = null)
+ {
+ if (null === $encodingList) {
+ return self::$encodingList;
+ }
+
+ if (!is_array($encodingList)) {
+ $encodingList = array_map('trim', explode(',', $encodingList));
+ }
+ $encodingList = array_map('strtoupper', $encodingList);
+
+ foreach ($encodingList as $enc) {
+ switch ($enc) {
+ default:
+ if (strncmp($enc, 'ISO-8859-', 9)) {
+ return false;
+ }
+ case 'ASCII':
+ case 'UTF8':
+ case 'UTF-8':
+ }
+ }
+
+ self::$encodingList = $encodingList;
+
+ return true;
+ }
+
+ public static function mb_strlen($s, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ return iconv_strlen($s, $encoding);
+ }
+
+ public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ if ('' === $needle .= '') {
+ trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
+
+ return false;
+ }
+
+ return iconv_strpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ if ($offset != (int) $offset) {
+ $offset = 0;
+ } elseif ($offset = (int) $offset) {
+ if ($offset < 0) {
+ $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
+ $offset = 0;
+ } else {
+ $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
+ }
+ }
+
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+ return false !== $pos ? $offset + $pos : false;
+ }
+
+ public static function mb_strtolower($s, $encoding = null)
+ {
+ return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
+ }
+
+ public static function mb_strtoupper($s, $encoding = null)
+ {
+ return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
+ }
+
+ public static function mb_substitute_character($c = null)
+ {
+ if (0 === strcasecmp($c, 'none')) {
+ return true;
+ }
+
+ return null !== $c ? false : 'none';
+ }
+
+ public static function mb_substr($s, $start, $length = null, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ if ($start < 0) {
+ $start = iconv_strlen($s, $encoding) + $start;
+ if ($start < 0) {
+ $start = 0;
+ }
+ }
+
+ if (null === $length) {
+ $length = 2147483647;
+ } elseif ($length < 0) {
+ $length = iconv_strlen($s, $encoding) + $length - $start;
+ if ($length < 0) {
+ return '';
+ }
+ }
+
+ return iconv_substr($s, $start, $length, $encoding).'';
+ }
+
+ public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+ return self::mb_strpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
+ $pos = iconv_strrpos($haystack, $needle, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $needle = self::mb_substr($needle, 0, 1, $encoding);
+ $pos = self::mb_strripos($haystack, $needle, $encoding);
+
+ return self::getSubpart($pos, $part, $haystack, $encoding);
+ }
+
+ public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
+ {
+ $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
+ $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
+
+ return self::mb_strrpos($haystack, $needle, $offset, $encoding);
+ }
+
+ public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
+ {
+ $pos = strpos($haystack, $needle);
+ if (false === $pos) {
+ return false;
+ }
+ if ($part) {
+ return substr($haystack, 0, $pos);
+ }
+
+ return substr($haystack, $pos);
+ }
+
+ public static function mb_get_info($type = 'all')
+ {
+ $info = array(
+ 'internal_encoding' => self::$internalEncoding,
+ 'http_output' => 'pass',
+ 'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
+ 'func_overload' => 0,
+ 'func_overload_list' => 'no overload',
+ 'mail_charset' => 'UTF-8',
+ 'mail_header_encoding' => 'BASE64',
+ 'mail_body_encoding' => 'BASE64',
+ 'illegal_chars' => 0,
+ 'encoding_translation' => 'Off',
+ 'language' => self::$language,
+ 'detect_order' => self::$encodingList,
+ 'substitute_character' => 'none',
+ 'strict_detection' => 'Off',
+ );
+
+ if ('all' === $type) {
+ return $info;
+ }
+ if (isset($info[$type])) {
+ return $info[$type];
+ }
+
+ return false;
+ }
+
+ public static function mb_http_input($type = '')
+ {
+ return false;
+ }
+
+ public static function mb_http_output($encoding = null)
+ {
+ return null !== $encoding ? 'pass' === $encoding : 'pass';
+ }
+
+ public static function mb_strwidth($s, $encoding = null)
+ {
+ $encoding = self::getEncoding($encoding);
+
+ if ('UTF-8' !== $encoding) {
+ $s = iconv($encoding, 'UTF-8', $s);
+ }
+
+ $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
+
+ return ($wide << 1) + iconv_strlen($s, 'UTF-8');
+ }
+
+ public static function mb_substr_count($haystack, $needle, $encoding = null)
+ {
+ return substr_count($haystack, $needle);
+ }
+
+ public static function mb_output_handler($contents, $status)
+ {
+ return $contents;
+ }
+
+ private static function getSubpart($pos, $part, $haystack, $encoding)
+ {
+ if (false === $pos) {
+ return false;
+ }
+ if ($part) {
+ return self::mb_substr($haystack, 0, $pos, $encoding);
+ }
+
+ return self::mb_substr($haystack, $pos, null, $encoding);
+ }
+
+ private static function html_encoding_callback($m)
+ {
+ $i = 1;
+ $entities = '';
+ $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
+
+ while (isset($m[$i])) {
+ if (0x80 > $m[$i]) {
+ $entities .= chr($m[$i++]);
+ continue;
+ }
+ if (0xF0 <= $m[$i]) {
+ $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+ } elseif (0xE0 <= $m[$i]) {
+ $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
+ } else {
+ $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
+ }
+
+ $entities .= ''.$c.';';
+ }
+
+ return $entities;
+ }
+
+ private static function title_case_lower($s)
+ {
+ return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
+ }
+
+ private static function title_case_upper($s)
+ {
+ return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
+ }
+
+ private static function getData($file)
+ {
+ if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.ser')) {
+ return unserialize(file_get_contents($file));
+ }
+
+ return false;
+ }
+
+ private static function getEncoding($encoding)
+ {
+ if (null === $encoding) {
+ return self::$internalEncoding;
+ }
+
+ $encoding = strtoupper($encoding);
+
+ if ('8BIT' === $encoding || 'BINARY' === $encoding) {
+ return 'CP850';
+ }
+ if ('UTF8' === $encoding) {
+ return 'UTF-8';
+ }
+
+ return $encoding;
+ }
+}
diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md
new file mode 100644
index 0000000..342e828
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/README.md
@@ -0,0 +1,13 @@
+Symfony Polyfill / Mbstring
+===========================
+
+This component provides a partial, native PHP implementation for the
+[Mbstring](http://php.net/mbstring) extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser
new file mode 100644
index 0000000..13dabdd
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.ser
@@ -0,0 +1 @@
+a:1092:{s:1:"A";s:1:"a";s:1:"B";s:1:"b";s:1:"C";s:1:"c";s:1:"D";s:1:"d";s:1:"E";s:1:"e";s:1:"F";s:1:"f";s:1:"G";s:1:"g";s:1:"H";s:1:"h";s:1:"I";s:1:"i";s:1:"J";s:1:"j";s:1:"K";s:1:"k";s:1:"L";s:1:"l";s:1:"M";s:1:"m";s:1:"N";s:1:"n";s:1:"O";s:1:"o";s:1:"P";s:1:"p";s:1:"Q";s:1:"q";s:1:"R";s:1:"r";s:1:"S";s:1:"s";s:1:"T";s:1:"t";s:1:"U";s:1:"u";s:1:"V";s:1:"v";s:1:"W";s:1:"w";s:1:"X";s:1:"x";s:1:"Y";s:1:"y";s:1:"Z";s:1:"z";s:2:"À";s:2:"à";s:2:"Á";s:2:"á";s:2:"Â";s:2:"â";s:2:"Ã";s:2:"ã";s:2:"Ä";s:2:"ä";s:2:"Å";s:2:"å";s:2:"Æ";s:2:"æ";s:2:"Ç";s:2:"ç";s:2:"È";s:2:"è";s:2:"É";s:2:"é";s:2:"Ê";s:2:"ê";s:2:"Ë";s:2:"ë";s:2:"Ì";s:2:"ì";s:2:"Í";s:2:"í";s:2:"Î";s:2:"î";s:2:"Ï";s:2:"ï";s:2:"Ð";s:2:"ð";s:2:"Ñ";s:2:"ñ";s:2:"Ò";s:2:"ò";s:2:"Ó";s:2:"ó";s:2:"Ô";s:2:"ô";s:2:"Õ";s:2:"õ";s:2:"Ö";s:2:"ö";s:2:"Ø";s:2:"ø";s:2:"Ù";s:2:"ù";s:2:"Ú";s:2:"ú";s:2:"Û";s:2:"û";s:2:"Ü";s:2:"ü";s:2:"Ý";s:2:"ý";s:2:"Þ";s:2:"þ";s:2:"Ā";s:2:"ā";s:2:"Ă";s:2:"ă";s:2:"Ą";s:2:"ą";s:2:"Ć";s:2:"ć";s:2:"Ĉ";s:2:"ĉ";s:2:"Ċ";s:2:"ċ";s:2:"Č";s:2:"č";s:2:"Ď";s:2:"ď";s:2:"Đ";s:2:"đ";s:2:"Ē";s:2:"ē";s:2:"Ĕ";s:2:"ĕ";s:2:"Ė";s:2:"ė";s:2:"Ę";s:2:"ę";s:2:"Ě";s:2:"ě";s:2:"Ĝ";s:2:"ĝ";s:2:"Ğ";s:2:"ğ";s:2:"Ġ";s:2:"ġ";s:2:"Ģ";s:2:"ģ";s:2:"Ĥ";s:2:"ĥ";s:2:"Ħ";s:2:"ħ";s:2:"Ĩ";s:2:"ĩ";s:2:"Ī";s:2:"ī";s:2:"Ĭ";s:2:"ĭ";s:2:"Į";s:2:"į";s:2:"İ";s:1:"i";s:2:"IJ";s:2:"ij";s:2:"Ĵ";s:2:"ĵ";s:2:"Ķ";s:2:"ķ";s:2:"Ĺ";s:2:"ĺ";s:2:"Ļ";s:2:"ļ";s:2:"Ľ";s:2:"ľ";s:2:"Ŀ";s:2:"ŀ";s:2:"Ł";s:2:"ł";s:2:"Ń";s:2:"ń";s:2:"Ņ";s:2:"ņ";s:2:"Ň";s:2:"ň";s:2:"Ŋ";s:2:"ŋ";s:2:"Ō";s:2:"ō";s:2:"Ŏ";s:2:"ŏ";s:2:"Ő";s:2:"ő";s:2:"Œ";s:2:"œ";s:2:"Ŕ";s:2:"ŕ";s:2:"Ŗ";s:2:"ŗ";s:2:"Ř";s:2:"ř";s:2:"Ś";s:2:"ś";s:2:"Ŝ";s:2:"ŝ";s:2:"Ş";s:2:"ş";s:2:"Š";s:2:"š";s:2:"Ţ";s:2:"ţ";s:2:"Ť";s:2:"ť";s:2:"Ŧ";s:2:"ŧ";s:2:"Ũ";s:2:"ũ";s:2:"Ū";s:2:"ū";s:2:"Ŭ";s:2:"ŭ";s:2:"Ů";s:2:"ů";s:2:"Ű";s:2:"ű";s:2:"Ų";s:2:"ų";s:2:"Ŵ";s:2:"ŵ";s:2:"Ŷ";s:2:"ŷ";s:2:"Ÿ";s:2:"ÿ";s:2:"Ź";s:2:"ź";s:2:"Ż";s:2:"ż";s:2:"Ž";s:2:"ž";s:2:"Ɓ";s:2:"ɓ";s:2:"Ƃ";s:2:"ƃ";s:2:"Ƅ";s:2:"ƅ";s:2:"Ɔ";s:2:"ɔ";s:2:"Ƈ";s:2:"ƈ";s:2:"Ɖ";s:2:"ɖ";s:2:"Ɗ";s:2:"ɗ";s:2:"Ƌ";s:2:"ƌ";s:2:"Ǝ";s:2:"ǝ";s:2:"Ə";s:2:"ə";s:2:"Ɛ";s:2:"ɛ";s:2:"Ƒ";s:2:"ƒ";s:2:"Ɠ";s:2:"ɠ";s:2:"Ɣ";s:2:"ɣ";s:2:"Ɩ";s:2:"ɩ";s:2:"Ɨ";s:2:"ɨ";s:2:"Ƙ";s:2:"ƙ";s:2:"Ɯ";s:2:"ɯ";s:2:"Ɲ";s:2:"ɲ";s:2:"Ɵ";s:2:"ɵ";s:2:"Ơ";s:2:"ơ";s:2:"Ƣ";s:2:"ƣ";s:2:"Ƥ";s:2:"ƥ";s:2:"Ʀ";s:2:"ʀ";s:2:"Ƨ";s:2:"ƨ";s:2:"Ʃ";s:2:"ʃ";s:2:"Ƭ";s:2:"ƭ";s:2:"Ʈ";s:2:"ʈ";s:2:"Ư";s:2:"ư";s:2:"Ʊ";s:2:"ʊ";s:2:"Ʋ";s:2:"ʋ";s:2:"Ƴ";s:2:"ƴ";s:2:"Ƶ";s:2:"ƶ";s:2:"Ʒ";s:2:"ʒ";s:2:"Ƹ";s:2:"ƹ";s:2:"Ƽ";s:2:"ƽ";s:2:"DŽ";s:2:"dž";s:2:"Dž";s:2:"dž";s:2:"LJ";s:2:"lj";s:2:"Lj";s:2:"lj";s:2:"NJ";s:2:"nj";s:2:"Nj";s:2:"nj";s:2:"Ǎ";s:2:"ǎ";s:2:"Ǐ";s:2:"ǐ";s:2:"Ǒ";s:2:"ǒ";s:2:"Ǔ";s:2:"ǔ";s:2:"Ǖ";s:2:"ǖ";s:2:"Ǘ";s:2:"ǘ";s:2:"Ǚ";s:2:"ǚ";s:2:"Ǜ";s:2:"ǜ";s:2:"Ǟ";s:2:"ǟ";s:2:"Ǡ";s:2:"ǡ";s:2:"Ǣ";s:2:"ǣ";s:2:"Ǥ";s:2:"ǥ";s:2:"Ǧ";s:2:"ǧ";s:2:"Ǩ";s:2:"ǩ";s:2:"Ǫ";s:2:"ǫ";s:2:"Ǭ";s:2:"ǭ";s:2:"Ǯ";s:2:"ǯ";s:2:"DZ";s:2:"dz";s:2:"Dz";s:2:"dz";s:2:"Ǵ";s:2:"ǵ";s:2:"Ƕ";s:2:"ƕ";s:2:"Ƿ";s:2:"ƿ";s:2:"Ǹ";s:2:"ǹ";s:2:"Ǻ";s:2:"ǻ";s:2:"Ǽ";s:2:"ǽ";s:2:"Ǿ";s:2:"ǿ";s:2:"Ȁ";s:2:"ȁ";s:2:"Ȃ";s:2:"ȃ";s:2:"Ȅ";s:2:"ȅ";s:2:"Ȇ";s:2:"ȇ";s:2:"Ȉ";s:2:"ȉ";s:2:"Ȋ";s:2:"ȋ";s:2:"Ȍ";s:2:"ȍ";s:2:"Ȏ";s:2:"ȏ";s:2:"Ȑ";s:2:"ȑ";s:2:"Ȓ";s:2:"ȓ";s:2:"Ȕ";s:2:"ȕ";s:2:"Ȗ";s:2:"ȗ";s:2:"Ș";s:2:"ș";s:2:"Ț";s:2:"ț";s:2:"Ȝ";s:2:"ȝ";s:2:"Ȟ";s:2:"ȟ";s:2:"Ƞ";s:2:"ƞ";s:2:"Ȣ";s:2:"ȣ";s:2:"Ȥ";s:2:"ȥ";s:2:"Ȧ";s:2:"ȧ";s:2:"Ȩ";s:2:"ȩ";s:2:"Ȫ";s:2:"ȫ";s:2:"Ȭ";s:2:"ȭ";s:2:"Ȯ";s:2:"ȯ";s:2:"Ȱ";s:2:"ȱ";s:2:"Ȳ";s:2:"ȳ";s:2:"Ⱥ";s:3:"ⱥ";s:2:"Ȼ";s:2:"ȼ";s:2:"Ƚ";s:2:"ƚ";s:2:"Ⱦ";s:3:"ⱦ";s:2:"Ɂ";s:2:"ɂ";s:2:"Ƀ";s:2:"ƀ";s:2:"Ʉ";s:2:"ʉ";s:2:"Ʌ";s:2:"ʌ";s:2:"Ɇ";s:2:"ɇ";s:2:"Ɉ";s:2:"ɉ";s:2:"Ɋ";s:2:"ɋ";s:2:"Ɍ";s:2:"ɍ";s:2:"Ɏ";s:2:"ɏ";s:2:"Ͱ";s:2:"ͱ";s:2:"Ͳ";s:2:"ͳ";s:2:"Ͷ";s:2:"ͷ";s:2:"Ϳ";s:2:"ϳ";s:2:"Ά";s:2:"ά";s:2:"Έ";s:2:"έ";s:2:"Ή";s:2:"ή";s:2:"Ί";s:2:"ί";s:2:"Ό";s:2:"ό";s:2:"Ύ";s:2:"ύ";s:2:"Ώ";s:2:"ώ";s:2:"Α";s:2:"α";s:2:"Β";s:2:"β";s:2:"Γ";s:2:"γ";s:2:"Δ";s:2:"δ";s:2:"Ε";s:2:"ε";s:2:"Ζ";s:2:"ζ";s:2:"Η";s:2:"η";s:2:"Θ";s:2:"θ";s:2:"Ι";s:2:"ι";s:2:"Κ";s:2:"κ";s:2:"Λ";s:2:"λ";s:2:"Μ";s:2:"μ";s:2:"Ν";s:2:"ν";s:2:"Ξ";s:2:"ξ";s:2:"Ο";s:2:"ο";s:2:"Π";s:2:"π";s:2:"Ρ";s:2:"ρ";s:2:"Σ";s:2:"σ";s:2:"Τ";s:2:"τ";s:2:"Υ";s:2:"υ";s:2:"Φ";s:2:"φ";s:2:"Χ";s:2:"χ";s:2:"Ψ";s:2:"ψ";s:2:"Ω";s:2:"ω";s:2:"Ϊ";s:2:"ϊ";s:2:"Ϋ";s:2:"ϋ";s:2:"Ϗ";s:2:"ϗ";s:2:"Ϙ";s:2:"ϙ";s:2:"Ϛ";s:2:"ϛ";s:2:"Ϝ";s:2:"ϝ";s:2:"Ϟ";s:2:"ϟ";s:2:"Ϡ";s:2:"ϡ";s:2:"Ϣ";s:2:"ϣ";s:2:"Ϥ";s:2:"ϥ";s:2:"Ϧ";s:2:"ϧ";s:2:"Ϩ";s:2:"ϩ";s:2:"Ϫ";s:2:"ϫ";s:2:"Ϭ";s:2:"ϭ";s:2:"Ϯ";s:2:"ϯ";s:2:"ϴ";s:2:"θ";s:2:"Ϸ";s:2:"ϸ";s:2:"Ϲ";s:2:"ϲ";s:2:"Ϻ";s:2:"ϻ";s:2:"Ͻ";s:2:"ͻ";s:2:"Ͼ";s:2:"ͼ";s:2:"Ͽ";s:2:"ͽ";s:2:"Ѐ";s:2:"ѐ";s:2:"Ё";s:2:"ё";s:2:"Ђ";s:2:"ђ";s:2:"Ѓ";s:2:"ѓ";s:2:"Є";s:2:"є";s:2:"Ѕ";s:2:"ѕ";s:2:"І";s:2:"і";s:2:"Ї";s:2:"ї";s:2:"Ј";s:2:"ј";s:2:"Љ";s:2:"љ";s:2:"Њ";s:2:"њ";s:2:"Ћ";s:2:"ћ";s:2:"Ќ";s:2:"ќ";s:2:"Ѝ";s:2:"ѝ";s:2:"Ў";s:2:"ў";s:2:"Џ";s:2:"џ";s:2:"А";s:2:"а";s:2:"Б";s:2:"б";s:2:"В";s:2:"в";s:2:"Г";s:2:"г";s:2:"Д";s:2:"д";s:2:"Е";s:2:"е";s:2:"Ж";s:2:"ж";s:2:"З";s:2:"з";s:2:"И";s:2:"и";s:2:"Й";s:2:"й";s:2:"К";s:2:"к";s:2:"Л";s:2:"л";s:2:"М";s:2:"м";s:2:"Н";s:2:"н";s:2:"О";s:2:"о";s:2:"П";s:2:"п";s:2:"Р";s:2:"р";s:2:"С";s:2:"с";s:2:"Т";s:2:"т";s:2:"У";s:2:"у";s:2:"Ф";s:2:"ф";s:2:"Х";s:2:"х";s:2:"Ц";s:2:"ц";s:2:"Ч";s:2:"ч";s:2:"Ш";s:2:"ш";s:2:"Щ";s:2:"щ";s:2:"Ъ";s:2:"ъ";s:2:"Ы";s:2:"ы";s:2:"Ь";s:2:"ь";s:2:"Э";s:2:"э";s:2:"Ю";s:2:"ю";s:2:"Я";s:2:"я";s:2:"Ѡ";s:2:"ѡ";s:2:"Ѣ";s:2:"ѣ";s:2:"Ѥ";s:2:"ѥ";s:2:"Ѧ";s:2:"ѧ";s:2:"Ѩ";s:2:"ѩ";s:2:"Ѫ";s:2:"ѫ";s:2:"Ѭ";s:2:"ѭ";s:2:"Ѯ";s:2:"ѯ";s:2:"Ѱ";s:2:"ѱ";s:2:"Ѳ";s:2:"ѳ";s:2:"Ѵ";s:2:"ѵ";s:2:"Ѷ";s:2:"ѷ";s:2:"Ѹ";s:2:"ѹ";s:2:"Ѻ";s:2:"ѻ";s:2:"Ѽ";s:2:"ѽ";s:2:"Ѿ";s:2:"ѿ";s:2:"Ҁ";s:2:"ҁ";s:2:"Ҋ";s:2:"ҋ";s:2:"Ҍ";s:2:"ҍ";s:2:"Ҏ";s:2:"ҏ";s:2:"Ґ";s:2:"ґ";s:2:"Ғ";s:2:"ғ";s:2:"Ҕ";s:2:"ҕ";s:2:"Җ";s:2:"җ";s:2:"Ҙ";s:2:"ҙ";s:2:"Қ";s:2:"қ";s:2:"Ҝ";s:2:"ҝ";s:2:"Ҟ";s:2:"ҟ";s:2:"Ҡ";s:2:"ҡ";s:2:"Ң";s:2:"ң";s:2:"Ҥ";s:2:"ҥ";s:2:"Ҧ";s:2:"ҧ";s:2:"Ҩ";s:2:"ҩ";s:2:"Ҫ";s:2:"ҫ";s:2:"Ҭ";s:2:"ҭ";s:2:"Ү";s:2:"ү";s:2:"Ұ";s:2:"ұ";s:2:"Ҳ";s:2:"ҳ";s:2:"Ҵ";s:2:"ҵ";s:2:"Ҷ";s:2:"ҷ";s:2:"Ҹ";s:2:"ҹ";s:2:"Һ";s:2:"һ";s:2:"Ҽ";s:2:"ҽ";s:2:"Ҿ";s:2:"ҿ";s:2:"Ӏ";s:2:"ӏ";s:2:"Ӂ";s:2:"ӂ";s:2:"Ӄ";s:2:"ӄ";s:2:"Ӆ";s:2:"ӆ";s:2:"Ӈ";s:2:"ӈ";s:2:"Ӊ";s:2:"ӊ";s:2:"Ӌ";s:2:"ӌ";s:2:"Ӎ";s:2:"ӎ";s:2:"Ӑ";s:2:"ӑ";s:2:"Ӓ";s:2:"ӓ";s:2:"Ӕ";s:2:"ӕ";s:2:"Ӗ";s:2:"ӗ";s:2:"Ә";s:2:"ә";s:2:"Ӛ";s:2:"ӛ";s:2:"Ӝ";s:2:"ӝ";s:2:"Ӟ";s:2:"ӟ";s:2:"Ӡ";s:2:"ӡ";s:2:"Ӣ";s:2:"ӣ";s:2:"Ӥ";s:2:"ӥ";s:2:"Ӧ";s:2:"ӧ";s:2:"Ө";s:2:"ө";s:2:"Ӫ";s:2:"ӫ";s:2:"Ӭ";s:2:"ӭ";s:2:"Ӯ";s:2:"ӯ";s:2:"Ӱ";s:2:"ӱ";s:2:"Ӳ";s:2:"ӳ";s:2:"Ӵ";s:2:"ӵ";s:2:"Ӷ";s:2:"ӷ";s:2:"Ӹ";s:2:"ӹ";s:2:"Ӻ";s:2:"ӻ";s:2:"Ӽ";s:2:"ӽ";s:2:"Ӿ";s:2:"ӿ";s:2:"Ԁ";s:2:"ԁ";s:2:"Ԃ";s:2:"ԃ";s:2:"Ԅ";s:2:"ԅ";s:2:"Ԇ";s:2:"ԇ";s:2:"Ԉ";s:2:"ԉ";s:2:"Ԋ";s:2:"ԋ";s:2:"Ԍ";s:2:"ԍ";s:2:"Ԏ";s:2:"ԏ";s:2:"Ԑ";s:2:"ԑ";s:2:"Ԓ";s:2:"ԓ";s:2:"Ԕ";s:2:"ԕ";s:2:"Ԗ";s:2:"ԗ";s:2:"Ԙ";s:2:"ԙ";s:2:"Ԛ";s:2:"ԛ";s:2:"Ԝ";s:2:"ԝ";s:2:"Ԟ";s:2:"ԟ";s:2:"Ԡ";s:2:"ԡ";s:2:"Ԣ";s:2:"ԣ";s:2:"Ԥ";s:2:"ԥ";s:2:"Ԧ";s:2:"ԧ";s:2:"Ԩ";s:2:"ԩ";s:2:"Ԫ";s:2:"ԫ";s:2:"Ԭ";s:2:"ԭ";s:2:"Ԯ";s:2:"ԯ";s:2:"Ա";s:2:"ա";s:2:"Բ";s:2:"բ";s:2:"Գ";s:2:"գ";s:2:"Դ";s:2:"դ";s:2:"Ե";s:2:"ե";s:2:"Զ";s:2:"զ";s:2:"Է";s:2:"է";s:2:"Ը";s:2:"ը";s:2:"Թ";s:2:"թ";s:2:"Ժ";s:2:"ժ";s:2:"Ի";s:2:"ի";s:2:"Լ";s:2:"լ";s:2:"Խ";s:2:"խ";s:2:"Ծ";s:2:"ծ";s:2:"Կ";s:2:"կ";s:2:"Հ";s:2:"հ";s:2:"Ձ";s:2:"ձ";s:2:"Ղ";s:2:"ղ";s:2:"Ճ";s:2:"ճ";s:2:"Մ";s:2:"մ";s:2:"Յ";s:2:"յ";s:2:"Ն";s:2:"ն";s:2:"Շ";s:2:"շ";s:2:"Ո";s:2:"ո";s:2:"Չ";s:2:"չ";s:2:"Պ";s:2:"պ";s:2:"Ջ";s:2:"ջ";s:2:"Ռ";s:2:"ռ";s:2:"Ս";s:2:"ս";s:2:"Վ";s:2:"վ";s:2:"Տ";s:2:"տ";s:2:"Ր";s:2:"ր";s:2:"Ց";s:2:"ց";s:2:"Ւ";s:2:"ւ";s:2:"Փ";s:2:"փ";s:2:"Ք";s:2:"ք";s:2:"Օ";s:2:"օ";s:2:"Ֆ";s:2:"ֆ";s:3:"Ⴀ";s:3:"ⴀ";s:3:"Ⴁ";s:3:"ⴁ";s:3:"Ⴂ";s:3:"ⴂ";s:3:"Ⴃ";s:3:"ⴃ";s:3:"Ⴄ";s:3:"ⴄ";s:3:"Ⴅ";s:3:"ⴅ";s:3:"Ⴆ";s:3:"ⴆ";s:3:"Ⴇ";s:3:"ⴇ";s:3:"Ⴈ";s:3:"ⴈ";s:3:"Ⴉ";s:3:"ⴉ";s:3:"Ⴊ";s:3:"ⴊ";s:3:"Ⴋ";s:3:"ⴋ";s:3:"Ⴌ";s:3:"ⴌ";s:3:"Ⴍ";s:3:"ⴍ";s:3:"Ⴎ";s:3:"ⴎ";s:3:"Ⴏ";s:3:"ⴏ";s:3:"Ⴐ";s:3:"ⴐ";s:3:"Ⴑ";s:3:"ⴑ";s:3:"Ⴒ";s:3:"ⴒ";s:3:"Ⴓ";s:3:"ⴓ";s:3:"Ⴔ";s:3:"ⴔ";s:3:"Ⴕ";s:3:"ⴕ";s:3:"Ⴖ";s:3:"ⴖ";s:3:"Ⴗ";s:3:"ⴗ";s:3:"Ⴘ";s:3:"ⴘ";s:3:"Ⴙ";s:3:"ⴙ";s:3:"Ⴚ";s:3:"ⴚ";s:3:"Ⴛ";s:3:"ⴛ";s:3:"Ⴜ";s:3:"ⴜ";s:3:"Ⴝ";s:3:"ⴝ";s:3:"Ⴞ";s:3:"ⴞ";s:3:"Ⴟ";s:3:"ⴟ";s:3:"Ⴠ";s:3:"ⴠ";s:3:"Ⴡ";s:3:"ⴡ";s:3:"Ⴢ";s:3:"ⴢ";s:3:"Ⴣ";s:3:"ⴣ";s:3:"Ⴤ";s:3:"ⴤ";s:3:"Ⴥ";s:3:"ⴥ";s:3:"Ⴧ";s:3:"ⴧ";s:3:"Ⴭ";s:3:"ⴭ";s:3:"Ḁ";s:3:"ḁ";s:3:"Ḃ";s:3:"ḃ";s:3:"Ḅ";s:3:"ḅ";s:3:"Ḇ";s:3:"ḇ";s:3:"Ḉ";s:3:"ḉ";s:3:"Ḋ";s:3:"ḋ";s:3:"Ḍ";s:3:"ḍ";s:3:"Ḏ";s:3:"ḏ";s:3:"Ḑ";s:3:"ḑ";s:3:"Ḓ";s:3:"ḓ";s:3:"Ḕ";s:3:"ḕ";s:3:"Ḗ";s:3:"ḗ";s:3:"Ḙ";s:3:"ḙ";s:3:"Ḛ";s:3:"ḛ";s:3:"Ḝ";s:3:"ḝ";s:3:"Ḟ";s:3:"ḟ";s:3:"Ḡ";s:3:"ḡ";s:3:"Ḣ";s:3:"ḣ";s:3:"Ḥ";s:3:"ḥ";s:3:"Ḧ";s:3:"ḧ";s:3:"Ḩ";s:3:"ḩ";s:3:"Ḫ";s:3:"ḫ";s:3:"Ḭ";s:3:"ḭ";s:3:"Ḯ";s:3:"ḯ";s:3:"Ḱ";s:3:"ḱ";s:3:"Ḳ";s:3:"ḳ";s:3:"Ḵ";s:3:"ḵ";s:3:"Ḷ";s:3:"ḷ";s:3:"Ḹ";s:3:"ḹ";s:3:"Ḻ";s:3:"ḻ";s:3:"Ḽ";s:3:"ḽ";s:3:"Ḿ";s:3:"ḿ";s:3:"Ṁ";s:3:"ṁ";s:3:"Ṃ";s:3:"ṃ";s:3:"Ṅ";s:3:"ṅ";s:3:"Ṇ";s:3:"ṇ";s:3:"Ṉ";s:3:"ṉ";s:3:"Ṋ";s:3:"ṋ";s:3:"Ṍ";s:3:"ṍ";s:3:"Ṏ";s:3:"ṏ";s:3:"Ṑ";s:3:"ṑ";s:3:"Ṓ";s:3:"ṓ";s:3:"Ṕ";s:3:"ṕ";s:3:"Ṗ";s:3:"ṗ";s:3:"Ṙ";s:3:"ṙ";s:3:"Ṛ";s:3:"ṛ";s:3:"Ṝ";s:3:"ṝ";s:3:"Ṟ";s:3:"ṟ";s:3:"Ṡ";s:3:"ṡ";s:3:"Ṣ";s:3:"ṣ";s:3:"Ṥ";s:3:"ṥ";s:3:"Ṧ";s:3:"ṧ";s:3:"Ṩ";s:3:"ṩ";s:3:"Ṫ";s:3:"ṫ";s:3:"Ṭ";s:3:"ṭ";s:3:"Ṯ";s:3:"ṯ";s:3:"Ṱ";s:3:"ṱ";s:3:"Ṳ";s:3:"ṳ";s:3:"Ṵ";s:3:"ṵ";s:3:"Ṷ";s:3:"ṷ";s:3:"Ṹ";s:3:"ṹ";s:3:"Ṻ";s:3:"ṻ";s:3:"Ṽ";s:3:"ṽ";s:3:"Ṿ";s:3:"ṿ";s:3:"Ẁ";s:3:"ẁ";s:3:"Ẃ";s:3:"ẃ";s:3:"Ẅ";s:3:"ẅ";s:3:"Ẇ";s:3:"ẇ";s:3:"Ẉ";s:3:"ẉ";s:3:"Ẋ";s:3:"ẋ";s:3:"Ẍ";s:3:"ẍ";s:3:"Ẏ";s:3:"ẏ";s:3:"Ẑ";s:3:"ẑ";s:3:"Ẓ";s:3:"ẓ";s:3:"Ẕ";s:3:"ẕ";s:3:"ẞ";s:2:"ß";s:3:"Ạ";s:3:"ạ";s:3:"Ả";s:3:"ả";s:3:"Ấ";s:3:"ấ";s:3:"Ầ";s:3:"ầ";s:3:"Ẩ";s:3:"ẩ";s:3:"Ẫ";s:3:"ẫ";s:3:"Ậ";s:3:"ậ";s:3:"Ắ";s:3:"ắ";s:3:"Ằ";s:3:"ằ";s:3:"Ẳ";s:3:"ẳ";s:3:"Ẵ";s:3:"ẵ";s:3:"Ặ";s:3:"ặ";s:3:"Ẹ";s:3:"ẹ";s:3:"Ẻ";s:3:"ẻ";s:3:"Ẽ";s:3:"ẽ";s:3:"Ế";s:3:"ế";s:3:"Ề";s:3:"ề";s:3:"Ể";s:3:"ể";s:3:"Ễ";s:3:"ễ";s:3:"Ệ";s:3:"ệ";s:3:"Ỉ";s:3:"ỉ";s:3:"Ị";s:3:"ị";s:3:"Ọ";s:3:"ọ";s:3:"Ỏ";s:3:"ỏ";s:3:"Ố";s:3:"ố";s:3:"Ồ";s:3:"ồ";s:3:"Ổ";s:3:"ổ";s:3:"Ỗ";s:3:"ỗ";s:3:"Ộ";s:3:"ộ";s:3:"Ớ";s:3:"ớ";s:3:"Ờ";s:3:"ờ";s:3:"Ở";s:3:"ở";s:3:"Ỡ";s:3:"ỡ";s:3:"Ợ";s:3:"ợ";s:3:"Ụ";s:3:"ụ";s:3:"Ủ";s:3:"ủ";s:3:"Ứ";s:3:"ứ";s:3:"Ừ";s:3:"ừ";s:3:"Ử";s:3:"ử";s:3:"Ữ";s:3:"ữ";s:3:"Ự";s:3:"ự";s:3:"Ỳ";s:3:"ỳ";s:3:"Ỵ";s:3:"ỵ";s:3:"Ỷ";s:3:"ỷ";s:3:"Ỹ";s:3:"ỹ";s:3:"Ỻ";s:3:"ỻ";s:3:"Ỽ";s:3:"ỽ";s:3:"Ỿ";s:3:"ỿ";s:3:"Ἀ";s:3:"ἀ";s:3:"Ἁ";s:3:"ἁ";s:3:"Ἂ";s:3:"ἂ";s:3:"Ἃ";s:3:"ἃ";s:3:"Ἄ";s:3:"ἄ";s:3:"Ἅ";s:3:"ἅ";s:3:"Ἆ";s:3:"ἆ";s:3:"Ἇ";s:3:"ἇ";s:3:"Ἐ";s:3:"ἐ";s:3:"Ἑ";s:3:"ἑ";s:3:"Ἒ";s:3:"ἒ";s:3:"Ἓ";s:3:"ἓ";s:3:"Ἔ";s:3:"ἔ";s:3:"Ἕ";s:3:"ἕ";s:3:"Ἠ";s:3:"ἠ";s:3:"Ἡ";s:3:"ἡ";s:3:"Ἢ";s:3:"ἢ";s:3:"Ἣ";s:3:"ἣ";s:3:"Ἤ";s:3:"ἤ";s:3:"Ἥ";s:3:"ἥ";s:3:"Ἦ";s:3:"ἦ";s:3:"Ἧ";s:3:"ἧ";s:3:"Ἰ";s:3:"ἰ";s:3:"Ἱ";s:3:"ἱ";s:3:"Ἲ";s:3:"ἲ";s:3:"Ἳ";s:3:"ἳ";s:3:"Ἴ";s:3:"ἴ";s:3:"Ἵ";s:3:"ἵ";s:3:"Ἶ";s:3:"ἶ";s:3:"Ἷ";s:3:"ἷ";s:3:"Ὀ";s:3:"ὀ";s:3:"Ὁ";s:3:"ὁ";s:3:"Ὂ";s:3:"ὂ";s:3:"Ὃ";s:3:"ὃ";s:3:"Ὄ";s:3:"ὄ";s:3:"Ὅ";s:3:"ὅ";s:3:"Ὑ";s:3:"ὑ";s:3:"Ὓ";s:3:"ὓ";s:3:"Ὕ";s:3:"ὕ";s:3:"Ὗ";s:3:"ὗ";s:3:"Ὠ";s:3:"ὠ";s:3:"Ὡ";s:3:"ὡ";s:3:"Ὢ";s:3:"ὢ";s:3:"Ὣ";s:3:"ὣ";s:3:"Ὤ";s:3:"ὤ";s:3:"Ὥ";s:3:"ὥ";s:3:"Ὦ";s:3:"ὦ";s:3:"Ὧ";s:3:"ὧ";s:3:"ᾈ";s:3:"ᾀ";s:3:"ᾉ";s:3:"ᾁ";s:3:"ᾊ";s:3:"ᾂ";s:3:"ᾋ";s:3:"ᾃ";s:3:"ᾌ";s:3:"ᾄ";s:3:"ᾍ";s:3:"ᾅ";s:3:"ᾎ";s:3:"ᾆ";s:3:"ᾏ";s:3:"ᾇ";s:3:"ᾘ";s:3:"ᾐ";s:3:"ᾙ";s:3:"ᾑ";s:3:"ᾚ";s:3:"ᾒ";s:3:"ᾛ";s:3:"ᾓ";s:3:"ᾜ";s:3:"ᾔ";s:3:"ᾝ";s:3:"ᾕ";s:3:"ᾞ";s:3:"ᾖ";s:3:"ᾟ";s:3:"ᾗ";s:3:"ᾨ";s:3:"ᾠ";s:3:"ᾩ";s:3:"ᾡ";s:3:"ᾪ";s:3:"ᾢ";s:3:"ᾫ";s:3:"ᾣ";s:3:"ᾬ";s:3:"ᾤ";s:3:"ᾭ";s:3:"ᾥ";s:3:"ᾮ";s:3:"ᾦ";s:3:"ᾯ";s:3:"ᾧ";s:3:"Ᾰ";s:3:"ᾰ";s:3:"Ᾱ";s:3:"ᾱ";s:3:"Ὰ";s:3:"ὰ";s:3:"Ά";s:3:"ά";s:3:"ᾼ";s:3:"ᾳ";s:3:"Ὲ";s:3:"ὲ";s:3:"Έ";s:3:"έ";s:3:"Ὴ";s:3:"ὴ";s:3:"Ή";s:3:"ή";s:3:"ῌ";s:3:"ῃ";s:3:"Ῐ";s:3:"ῐ";s:3:"Ῑ";s:3:"ῑ";s:3:"Ὶ";s:3:"ὶ";s:3:"Ί";s:3:"ί";s:3:"Ῠ";s:3:"ῠ";s:3:"Ῡ";s:3:"ῡ";s:3:"Ὺ";s:3:"ὺ";s:3:"Ύ";s:3:"ύ";s:3:"Ῥ";s:3:"ῥ";s:3:"Ὸ";s:3:"ὸ";s:3:"Ό";s:3:"ό";s:3:"Ὼ";s:3:"ὼ";s:3:"Ώ";s:3:"ώ";s:3:"ῼ";s:3:"ῳ";s:3:"Ω";s:2:"ω";s:3:"K";s:1:"k";s:3:"Å";s:2:"å";s:3:"Ⅎ";s:3:"ⅎ";s:3:"Ⅰ";s:3:"ⅰ";s:3:"Ⅱ";s:3:"ⅱ";s:3:"Ⅲ";s:3:"ⅲ";s:3:"Ⅳ";s:3:"ⅳ";s:3:"Ⅴ";s:3:"ⅴ";s:3:"Ⅵ";s:3:"ⅵ";s:3:"Ⅶ";s:3:"ⅶ";s:3:"Ⅷ";s:3:"ⅷ";s:3:"Ⅸ";s:3:"ⅸ";s:3:"Ⅹ";s:3:"ⅹ";s:3:"Ⅺ";s:3:"ⅺ";s:3:"Ⅻ";s:3:"ⅻ";s:3:"Ⅼ";s:3:"ⅼ";s:3:"Ⅽ";s:3:"ⅽ";s:3:"Ⅾ";s:3:"ⅾ";s:3:"Ⅿ";s:3:"ⅿ";s:3:"Ↄ";s:3:"ↄ";s:3:"Ⓐ";s:3:"ⓐ";s:3:"Ⓑ";s:3:"ⓑ";s:3:"Ⓒ";s:3:"ⓒ";s:3:"Ⓓ";s:3:"ⓓ";s:3:"Ⓔ";s:3:"ⓔ";s:3:"Ⓕ";s:3:"ⓕ";s:3:"Ⓖ";s:3:"ⓖ";s:3:"Ⓗ";s:3:"ⓗ";s:3:"Ⓘ";s:3:"ⓘ";s:3:"Ⓙ";s:3:"ⓙ";s:3:"Ⓚ";s:3:"ⓚ";s:3:"Ⓛ";s:3:"ⓛ";s:3:"Ⓜ";s:3:"ⓜ";s:3:"Ⓝ";s:3:"ⓝ";s:3:"Ⓞ";s:3:"ⓞ";s:3:"Ⓟ";s:3:"ⓟ";s:3:"Ⓠ";s:3:"ⓠ";s:3:"Ⓡ";s:3:"ⓡ";s:3:"Ⓢ";s:3:"ⓢ";s:3:"Ⓣ";s:3:"ⓣ";s:3:"Ⓤ";s:3:"ⓤ";s:3:"Ⓥ";s:3:"ⓥ";s:3:"Ⓦ";s:3:"ⓦ";s:3:"Ⓧ";s:3:"ⓧ";s:3:"Ⓨ";s:3:"ⓨ";s:3:"Ⓩ";s:3:"ⓩ";s:3:"Ⰰ";s:3:"ⰰ";s:3:"Ⰱ";s:3:"ⰱ";s:3:"Ⰲ";s:3:"ⰲ";s:3:"Ⰳ";s:3:"ⰳ";s:3:"Ⰴ";s:3:"ⰴ";s:3:"Ⰵ";s:3:"ⰵ";s:3:"Ⰶ";s:3:"ⰶ";s:3:"Ⰷ";s:3:"ⰷ";s:3:"Ⰸ";s:3:"ⰸ";s:3:"Ⰹ";s:3:"ⰹ";s:3:"Ⰺ";s:3:"ⰺ";s:3:"Ⰻ";s:3:"ⰻ";s:3:"Ⰼ";s:3:"ⰼ";s:3:"Ⰽ";s:3:"ⰽ";s:3:"Ⰾ";s:3:"ⰾ";s:3:"Ⰿ";s:3:"ⰿ";s:3:"Ⱀ";s:3:"ⱀ";s:3:"Ⱁ";s:3:"ⱁ";s:3:"Ⱂ";s:3:"ⱂ";s:3:"Ⱃ";s:3:"ⱃ";s:3:"Ⱄ";s:3:"ⱄ";s:3:"Ⱅ";s:3:"ⱅ";s:3:"Ⱆ";s:3:"ⱆ";s:3:"Ⱇ";s:3:"ⱇ";s:3:"Ⱈ";s:3:"ⱈ";s:3:"Ⱉ";s:3:"ⱉ";s:3:"Ⱊ";s:3:"ⱊ";s:3:"Ⱋ";s:3:"ⱋ";s:3:"Ⱌ";s:3:"ⱌ";s:3:"Ⱍ";s:3:"ⱍ";s:3:"Ⱎ";s:3:"ⱎ";s:3:"Ⱏ";s:3:"ⱏ";s:3:"Ⱐ";s:3:"ⱐ";s:3:"Ⱑ";s:3:"ⱑ";s:3:"Ⱒ";s:3:"ⱒ";s:3:"Ⱓ";s:3:"ⱓ";s:3:"Ⱔ";s:3:"ⱔ";s:3:"Ⱕ";s:3:"ⱕ";s:3:"Ⱖ";s:3:"ⱖ";s:3:"Ⱗ";s:3:"ⱗ";s:3:"Ⱘ";s:3:"ⱘ";s:3:"Ⱙ";s:3:"ⱙ";s:3:"Ⱚ";s:3:"ⱚ";s:3:"Ⱛ";s:3:"ⱛ";s:3:"Ⱜ";s:3:"ⱜ";s:3:"Ⱝ";s:3:"ⱝ";s:3:"Ⱞ";s:3:"ⱞ";s:3:"Ⱡ";s:3:"ⱡ";s:3:"Ɫ";s:2:"ɫ";s:3:"Ᵽ";s:3:"ᵽ";s:3:"Ɽ";s:2:"ɽ";s:3:"Ⱨ";s:3:"ⱨ";s:3:"Ⱪ";s:3:"ⱪ";s:3:"Ⱬ";s:3:"ⱬ";s:3:"Ɑ";s:2:"ɑ";s:3:"Ɱ";s:2:"ɱ";s:3:"Ɐ";s:2:"ɐ";s:3:"Ɒ";s:2:"ɒ";s:3:"Ⱳ";s:3:"ⱳ";s:3:"Ⱶ";s:3:"ⱶ";s:3:"Ȿ";s:2:"ȿ";s:3:"Ɀ";s:2:"ɀ";s:3:"Ⲁ";s:3:"ⲁ";s:3:"Ⲃ";s:3:"ⲃ";s:3:"Ⲅ";s:3:"ⲅ";s:3:"Ⲇ";s:3:"ⲇ";s:3:"Ⲉ";s:3:"ⲉ";s:3:"Ⲋ";s:3:"ⲋ";s:3:"Ⲍ";s:3:"ⲍ";s:3:"Ⲏ";s:3:"ⲏ";s:3:"Ⲑ";s:3:"ⲑ";s:3:"Ⲓ";s:3:"ⲓ";s:3:"Ⲕ";s:3:"ⲕ";s:3:"Ⲗ";s:3:"ⲗ";s:3:"Ⲙ";s:3:"ⲙ";s:3:"Ⲛ";s:3:"ⲛ";s:3:"Ⲝ";s:3:"ⲝ";s:3:"Ⲟ";s:3:"ⲟ";s:3:"Ⲡ";s:3:"ⲡ";s:3:"Ⲣ";s:3:"ⲣ";s:3:"Ⲥ";s:3:"ⲥ";s:3:"Ⲧ";s:3:"ⲧ";s:3:"Ⲩ";s:3:"ⲩ";s:3:"Ⲫ";s:3:"ⲫ";s:3:"Ⲭ";s:3:"ⲭ";s:3:"Ⲯ";s:3:"ⲯ";s:3:"Ⲱ";s:3:"ⲱ";s:3:"Ⲳ";s:3:"ⲳ";s:3:"Ⲵ";s:3:"ⲵ";s:3:"Ⲷ";s:3:"ⲷ";s:3:"Ⲹ";s:3:"ⲹ";s:3:"Ⲻ";s:3:"ⲻ";s:3:"Ⲽ";s:3:"ⲽ";s:3:"Ⲿ";s:3:"ⲿ";s:3:"Ⳁ";s:3:"ⳁ";s:3:"Ⳃ";s:3:"ⳃ";s:3:"Ⳅ";s:3:"ⳅ";s:3:"Ⳇ";s:3:"ⳇ";s:3:"Ⳉ";s:3:"ⳉ";s:3:"Ⳋ";s:3:"ⳋ";s:3:"Ⳍ";s:3:"ⳍ";s:3:"Ⳏ";s:3:"ⳏ";s:3:"Ⳑ";s:3:"ⳑ";s:3:"Ⳓ";s:3:"ⳓ";s:3:"Ⳕ";s:3:"ⳕ";s:3:"Ⳗ";s:3:"ⳗ";s:3:"Ⳙ";s:3:"ⳙ";s:3:"Ⳛ";s:3:"ⳛ";s:3:"Ⳝ";s:3:"ⳝ";s:3:"Ⳟ";s:3:"ⳟ";s:3:"Ⳡ";s:3:"ⳡ";s:3:"Ⳣ";s:3:"ⳣ";s:3:"Ⳬ";s:3:"ⳬ";s:3:"Ⳮ";s:3:"ⳮ";s:3:"Ⳳ";s:3:"ⳳ";s:3:"Ꙁ";s:3:"ꙁ";s:3:"Ꙃ";s:3:"ꙃ";s:3:"Ꙅ";s:3:"ꙅ";s:3:"Ꙇ";s:3:"ꙇ";s:3:"Ꙉ";s:3:"ꙉ";s:3:"Ꙋ";s:3:"ꙋ";s:3:"Ꙍ";s:3:"ꙍ";s:3:"Ꙏ";s:3:"ꙏ";s:3:"Ꙑ";s:3:"ꙑ";s:3:"Ꙓ";s:3:"ꙓ";s:3:"Ꙕ";s:3:"ꙕ";s:3:"Ꙗ";s:3:"ꙗ";s:3:"Ꙙ";s:3:"ꙙ";s:3:"Ꙛ";s:3:"ꙛ";s:3:"Ꙝ";s:3:"ꙝ";s:3:"Ꙟ";s:3:"ꙟ";s:3:"Ꙡ";s:3:"ꙡ";s:3:"Ꙣ";s:3:"ꙣ";s:3:"Ꙥ";s:3:"ꙥ";s:3:"Ꙧ";s:3:"ꙧ";s:3:"Ꙩ";s:3:"ꙩ";s:3:"Ꙫ";s:3:"ꙫ";s:3:"Ꙭ";s:3:"ꙭ";s:3:"Ꚁ";s:3:"ꚁ";s:3:"Ꚃ";s:3:"ꚃ";s:3:"Ꚅ";s:3:"ꚅ";s:3:"Ꚇ";s:3:"ꚇ";s:3:"Ꚉ";s:3:"ꚉ";s:3:"Ꚋ";s:3:"ꚋ";s:3:"Ꚍ";s:3:"ꚍ";s:3:"Ꚏ";s:3:"ꚏ";s:3:"Ꚑ";s:3:"ꚑ";s:3:"Ꚓ";s:3:"ꚓ";s:3:"Ꚕ";s:3:"ꚕ";s:3:"Ꚗ";s:3:"ꚗ";s:3:"Ꚙ";s:3:"ꚙ";s:3:"Ꚛ";s:3:"ꚛ";s:3:"Ꜣ";s:3:"ꜣ";s:3:"Ꜥ";s:3:"ꜥ";s:3:"Ꜧ";s:3:"ꜧ";s:3:"Ꜩ";s:3:"ꜩ";s:3:"Ꜫ";s:3:"ꜫ";s:3:"Ꜭ";s:3:"ꜭ";s:3:"Ꜯ";s:3:"ꜯ";s:3:"Ꜳ";s:3:"ꜳ";s:3:"Ꜵ";s:3:"ꜵ";s:3:"Ꜷ";s:3:"ꜷ";s:3:"Ꜹ";s:3:"ꜹ";s:3:"Ꜻ";s:3:"ꜻ";s:3:"Ꜽ";s:3:"ꜽ";s:3:"Ꜿ";s:3:"ꜿ";s:3:"Ꝁ";s:3:"ꝁ";s:3:"Ꝃ";s:3:"ꝃ";s:3:"Ꝅ";s:3:"ꝅ";s:3:"Ꝇ";s:3:"ꝇ";s:3:"Ꝉ";s:3:"ꝉ";s:3:"Ꝋ";s:3:"ꝋ";s:3:"Ꝍ";s:3:"ꝍ";s:3:"Ꝏ";s:3:"ꝏ";s:3:"Ꝑ";s:3:"ꝑ";s:3:"Ꝓ";s:3:"ꝓ";s:3:"Ꝕ";s:3:"ꝕ";s:3:"Ꝗ";s:3:"ꝗ";s:3:"Ꝙ";s:3:"ꝙ";s:3:"Ꝛ";s:3:"ꝛ";s:3:"Ꝝ";s:3:"ꝝ";s:3:"Ꝟ";s:3:"ꝟ";s:3:"Ꝡ";s:3:"ꝡ";s:3:"Ꝣ";s:3:"ꝣ";s:3:"Ꝥ";s:3:"ꝥ";s:3:"Ꝧ";s:3:"ꝧ";s:3:"Ꝩ";s:3:"ꝩ";s:3:"Ꝫ";s:3:"ꝫ";s:3:"Ꝭ";s:3:"ꝭ";s:3:"Ꝯ";s:3:"ꝯ";s:3:"Ꝺ";s:3:"ꝺ";s:3:"Ꝼ";s:3:"ꝼ";s:3:"Ᵹ";s:3:"ᵹ";s:3:"Ꝿ";s:3:"ꝿ";s:3:"Ꞁ";s:3:"ꞁ";s:3:"Ꞃ";s:3:"ꞃ";s:3:"Ꞅ";s:3:"ꞅ";s:3:"Ꞇ";s:3:"ꞇ";s:3:"Ꞌ";s:3:"ꞌ";s:3:"Ɥ";s:2:"ɥ";s:3:"Ꞑ";s:3:"ꞑ";s:3:"Ꞓ";s:3:"ꞓ";s:3:"Ꞗ";s:3:"ꞗ";s:3:"Ꞙ";s:3:"ꞙ";s:3:"Ꞛ";s:3:"ꞛ";s:3:"Ꞝ";s:3:"ꞝ";s:3:"Ꞟ";s:3:"ꞟ";s:3:"Ꞡ";s:3:"ꞡ";s:3:"Ꞣ";s:3:"ꞣ";s:3:"Ꞥ";s:3:"ꞥ";s:3:"Ꞧ";s:3:"ꞧ";s:3:"Ꞩ";s:3:"ꞩ";s:3:"Ɦ";s:2:"ɦ";s:3:"Ɜ";s:2:"ɜ";s:3:"Ɡ";s:2:"ɡ";s:3:"Ɬ";s:2:"ɬ";s:3:"Ʞ";s:2:"ʞ";s:3:"Ʇ";s:2:"ʇ";s:3:"A";s:3:"a";s:3:"B";s:3:"b";s:3:"C";s:3:"c";s:3:"D";s:3:"d";s:3:"E";s:3:"e";s:3:"F";s:3:"f";s:3:"G";s:3:"g";s:3:"H";s:3:"h";s:3:"I";s:3:"i";s:3:"J";s:3:"j";s:3:"K";s:3:"k";s:3:"L";s:3:"l";s:3:"M";s:3:"m";s:3:"N";s:3:"n";s:3:"O";s:3:"o";s:3:"P";s:3:"p";s:3:"Q";s:3:"q";s:3:"R";s:3:"r";s:3:"S";s:3:"s";s:3:"T";s:3:"t";s:3:"U";s:3:"u";s:3:"V";s:3:"v";s:3:"W";s:3:"w";s:3:"X";s:3:"x";s:3:"Y";s:3:"y";s:3:"Z";s:3:"z";s:4:"𐐀";s:4:"𐐨";s:4:"𐐁";s:4:"𐐩";s:4:"𐐂";s:4:"𐐪";s:4:"𐐃";s:4:"𐐫";s:4:"𐐄";s:4:"𐐬";s:4:"𐐅";s:4:"𐐭";s:4:"𐐆";s:4:"𐐮";s:4:"𐐇";s:4:"𐐯";s:4:"𐐈";s:4:"𐐰";s:4:"𐐉";s:4:"𐐱";s:4:"𐐊";s:4:"𐐲";s:4:"𐐋";s:4:"𐐳";s:4:"𐐌";s:4:"𐐴";s:4:"𐐍";s:4:"𐐵";s:4:"𐐎";s:4:"𐐶";s:4:"𐐏";s:4:"𐐷";s:4:"𐐐";s:4:"𐐸";s:4:"𐐑";s:4:"𐐹";s:4:"𐐒";s:4:"𐐺";s:4:"𐐓";s:4:"𐐻";s:4:"𐐔";s:4:"𐐼";s:4:"𐐕";s:4:"𐐽";s:4:"𐐖";s:4:"𐐾";s:4:"𐐗";s:4:"𐐿";s:4:"𐐘";s:4:"𐑀";s:4:"𐐙";s:4:"𐑁";s:4:"𐐚";s:4:"𐑂";s:4:"𐐛";s:4:"𐑃";s:4:"𐐜";s:4:"𐑄";s:4:"𐐝";s:4:"𐑅";s:4:"𐐞";s:4:"𐑆";s:4:"𐐟";s:4:"𐑇";s:4:"𐐠";s:4:"𐑈";s:4:"𐐡";s:4:"𐑉";s:4:"𐐢";s:4:"𐑊";s:4:"𐐣";s:4:"𐑋";s:4:"𐐤";s:4:"𐑌";s:4:"𐐥";s:4:"𐑍";s:4:"𐐦";s:4:"𐑎";s:4:"𐐧";s:4:"𐑏";s:4:"𑢠";s:4:"𑣀";s:4:"𑢡";s:4:"𑣁";s:4:"𑢢";s:4:"𑣂";s:4:"𑢣";s:4:"𑣃";s:4:"𑢤";s:4:"𑣄";s:4:"𑢥";s:4:"𑣅";s:4:"𑢦";s:4:"𑣆";s:4:"𑢧";s:4:"𑣇";s:4:"𑢨";s:4:"𑣈";s:4:"𑢩";s:4:"𑣉";s:4:"𑢪";s:4:"𑣊";s:4:"𑢫";s:4:"𑣋";s:4:"𑢬";s:4:"𑣌";s:4:"𑢭";s:4:"𑣍";s:4:"𑢮";s:4:"𑣎";s:4:"𑢯";s:4:"𑣏";s:4:"𑢰";s:4:"𑣐";s:4:"𑢱";s:4:"𑣑";s:4:"𑢲";s:4:"𑣒";s:4:"𑢳";s:4:"𑣓";s:4:"𑢴";s:4:"𑣔";s:4:"𑢵";s:4:"𑣕";s:4:"𑢶";s:4:"𑣖";s:4:"𑢷";s:4:"𑣗";s:4:"𑢸";s:4:"𑣘";s:4:"𑢹";s:4:"𑣙";s:4:"𑢺";s:4:"𑣚";s:4:"𑢻";s:4:"𑣛";s:4:"𑢼";s:4:"𑣜";s:4:"𑢽";s:4:"𑣝";s:4:"𑢾";s:4:"𑣞";s:4:"𑢿";s:4:"𑣟";}
\ No newline at end of file
diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser
new file mode 100644
index 0000000..e9e0ec2
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.ser
@@ -0,0 +1 @@
+a:1100:{s:1:"a";s:1:"A";s:1:"b";s:1:"B";s:1:"c";s:1:"C";s:1:"d";s:1:"D";s:1:"e";s:1:"E";s:1:"f";s:1:"F";s:1:"g";s:1:"G";s:1:"h";s:1:"H";s:1:"i";s:1:"I";s:1:"j";s:1:"J";s:1:"k";s:1:"K";s:1:"l";s:1:"L";s:1:"m";s:1:"M";s:1:"n";s:1:"N";s:1:"o";s:1:"O";s:1:"p";s:1:"P";s:1:"q";s:1:"Q";s:1:"r";s:1:"R";s:1:"s";s:1:"S";s:1:"t";s:1:"T";s:1:"u";s:1:"U";s:1:"v";s:1:"V";s:1:"w";s:1:"W";s:1:"x";s:1:"X";s:1:"y";s:1:"Y";s:1:"z";s:1:"Z";s:2:"µ";s:2:"Μ";s:2:"à";s:2:"À";s:2:"á";s:2:"Á";s:2:"â";s:2:"Â";s:2:"ã";s:2:"Ã";s:2:"ä";s:2:"Ä";s:2:"å";s:2:"Å";s:2:"æ";s:2:"Æ";s:2:"ç";s:2:"Ç";s:2:"è";s:2:"È";s:2:"é";s:2:"É";s:2:"ê";s:2:"Ê";s:2:"ë";s:2:"Ë";s:2:"ì";s:2:"Ì";s:2:"í";s:2:"Í";s:2:"î";s:2:"Î";s:2:"ï";s:2:"Ï";s:2:"ð";s:2:"Ð";s:2:"ñ";s:2:"Ñ";s:2:"ò";s:2:"Ò";s:2:"ó";s:2:"Ó";s:2:"ô";s:2:"Ô";s:2:"õ";s:2:"Õ";s:2:"ö";s:2:"Ö";s:2:"ø";s:2:"Ø";s:2:"ù";s:2:"Ù";s:2:"ú";s:2:"Ú";s:2:"û";s:2:"Û";s:2:"ü";s:2:"Ü";s:2:"ý";s:2:"Ý";s:2:"þ";s:2:"Þ";s:2:"ÿ";s:2:"Ÿ";s:2:"ā";s:2:"Ā";s:2:"ă";s:2:"Ă";s:2:"ą";s:2:"Ą";s:2:"ć";s:2:"Ć";s:2:"ĉ";s:2:"Ĉ";s:2:"ċ";s:2:"Ċ";s:2:"č";s:2:"Č";s:2:"ď";s:2:"Ď";s:2:"đ";s:2:"Đ";s:2:"ē";s:2:"Ē";s:2:"ĕ";s:2:"Ĕ";s:2:"ė";s:2:"Ė";s:2:"ę";s:2:"Ę";s:2:"ě";s:2:"Ě";s:2:"ĝ";s:2:"Ĝ";s:2:"ğ";s:2:"Ğ";s:2:"ġ";s:2:"Ġ";s:2:"ģ";s:2:"Ģ";s:2:"ĥ";s:2:"Ĥ";s:2:"ħ";s:2:"Ħ";s:2:"ĩ";s:2:"Ĩ";s:2:"ī";s:2:"Ī";s:2:"ĭ";s:2:"Ĭ";s:2:"į";s:2:"Į";s:2:"ı";s:1:"I";s:2:"ij";s:2:"IJ";s:2:"ĵ";s:2:"Ĵ";s:2:"ķ";s:2:"Ķ";s:2:"ĺ";s:2:"Ĺ";s:2:"ļ";s:2:"Ļ";s:2:"ľ";s:2:"Ľ";s:2:"ŀ";s:2:"Ŀ";s:2:"ł";s:2:"Ł";s:2:"ń";s:2:"Ń";s:2:"ņ";s:2:"Ņ";s:2:"ň";s:2:"Ň";s:2:"ŋ";s:2:"Ŋ";s:2:"ō";s:2:"Ō";s:2:"ŏ";s:2:"Ŏ";s:2:"ő";s:2:"Ő";s:2:"œ";s:2:"Œ";s:2:"ŕ";s:2:"Ŕ";s:2:"ŗ";s:2:"Ŗ";s:2:"ř";s:2:"Ř";s:2:"ś";s:2:"Ś";s:2:"ŝ";s:2:"Ŝ";s:2:"ş";s:2:"Ş";s:2:"š";s:2:"Š";s:2:"ţ";s:2:"Ţ";s:2:"ť";s:2:"Ť";s:2:"ŧ";s:2:"Ŧ";s:2:"ũ";s:2:"Ũ";s:2:"ū";s:2:"Ū";s:2:"ŭ";s:2:"Ŭ";s:2:"ů";s:2:"Ů";s:2:"ű";s:2:"Ű";s:2:"ų";s:2:"Ų";s:2:"ŵ";s:2:"Ŵ";s:2:"ŷ";s:2:"Ŷ";s:2:"ź";s:2:"Ź";s:2:"ż";s:2:"Ż";s:2:"ž";s:2:"Ž";s:2:"ſ";s:1:"S";s:2:"ƀ";s:2:"Ƀ";s:2:"ƃ";s:2:"Ƃ";s:2:"ƅ";s:2:"Ƅ";s:2:"ƈ";s:2:"Ƈ";s:2:"ƌ";s:2:"Ƌ";s:2:"ƒ";s:2:"Ƒ";s:2:"ƕ";s:2:"Ƕ";s:2:"ƙ";s:2:"Ƙ";s:2:"ƚ";s:2:"Ƚ";s:2:"ƞ";s:2:"Ƞ";s:2:"ơ";s:2:"Ơ";s:2:"ƣ";s:2:"Ƣ";s:2:"ƥ";s:2:"Ƥ";s:2:"ƨ";s:2:"Ƨ";s:2:"ƭ";s:2:"Ƭ";s:2:"ư";s:2:"Ư";s:2:"ƴ";s:2:"Ƴ";s:2:"ƶ";s:2:"Ƶ";s:2:"ƹ";s:2:"Ƹ";s:2:"ƽ";s:2:"Ƽ";s:2:"ƿ";s:2:"Ƿ";s:2:"Dž";s:2:"DŽ";s:2:"dž";s:2:"DŽ";s:2:"Lj";s:2:"LJ";s:2:"lj";s:2:"LJ";s:2:"Nj";s:2:"NJ";s:2:"nj";s:2:"NJ";s:2:"ǎ";s:2:"Ǎ";s:2:"ǐ";s:2:"Ǐ";s:2:"ǒ";s:2:"Ǒ";s:2:"ǔ";s:2:"Ǔ";s:2:"ǖ";s:2:"Ǖ";s:2:"ǘ";s:2:"Ǘ";s:2:"ǚ";s:2:"Ǚ";s:2:"ǜ";s:2:"Ǜ";s:2:"ǝ";s:2:"Ǝ";s:2:"ǟ";s:2:"Ǟ";s:2:"ǡ";s:2:"Ǡ";s:2:"ǣ";s:2:"Ǣ";s:2:"ǥ";s:2:"Ǥ";s:2:"ǧ";s:2:"Ǧ";s:2:"ǩ";s:2:"Ǩ";s:2:"ǫ";s:2:"Ǫ";s:2:"ǭ";s:2:"Ǭ";s:2:"ǯ";s:2:"Ǯ";s:2:"Dz";s:2:"DZ";s:2:"dz";s:2:"DZ";s:2:"ǵ";s:2:"Ǵ";s:2:"ǹ";s:2:"Ǹ";s:2:"ǻ";s:2:"Ǻ";s:2:"ǽ";s:2:"Ǽ";s:2:"ǿ";s:2:"Ǿ";s:2:"ȁ";s:2:"Ȁ";s:2:"ȃ";s:2:"Ȃ";s:2:"ȅ";s:2:"Ȅ";s:2:"ȇ";s:2:"Ȇ";s:2:"ȉ";s:2:"Ȉ";s:2:"ȋ";s:2:"Ȋ";s:2:"ȍ";s:2:"Ȍ";s:2:"ȏ";s:2:"Ȏ";s:2:"ȑ";s:2:"Ȑ";s:2:"ȓ";s:2:"Ȓ";s:2:"ȕ";s:2:"Ȕ";s:2:"ȗ";s:2:"Ȗ";s:2:"ș";s:2:"Ș";s:2:"ț";s:2:"Ț";s:2:"ȝ";s:2:"Ȝ";s:2:"ȟ";s:2:"Ȟ";s:2:"ȣ";s:2:"Ȣ";s:2:"ȥ";s:2:"Ȥ";s:2:"ȧ";s:2:"Ȧ";s:2:"ȩ";s:2:"Ȩ";s:2:"ȫ";s:2:"Ȫ";s:2:"ȭ";s:2:"Ȭ";s:2:"ȯ";s:2:"Ȯ";s:2:"ȱ";s:2:"Ȱ";s:2:"ȳ";s:2:"Ȳ";s:2:"ȼ";s:2:"Ȼ";s:2:"ȿ";s:3:"Ȿ";s:2:"ɀ";s:3:"Ɀ";s:2:"ɂ";s:2:"Ɂ";s:2:"ɇ";s:2:"Ɇ";s:2:"ɉ";s:2:"Ɉ";s:2:"ɋ";s:2:"Ɋ";s:2:"ɍ";s:2:"Ɍ";s:2:"ɏ";s:2:"Ɏ";s:2:"ɐ";s:3:"Ɐ";s:2:"ɑ";s:3:"Ɑ";s:2:"ɒ";s:3:"Ɒ";s:2:"ɓ";s:2:"Ɓ";s:2:"ɔ";s:2:"Ɔ";s:2:"ɖ";s:2:"Ɖ";s:2:"ɗ";s:2:"Ɗ";s:2:"ə";s:2:"Ə";s:2:"ɛ";s:2:"Ɛ";s:2:"ɜ";s:3:"Ɜ";s:2:"ɠ";s:2:"Ɠ";s:2:"ɡ";s:3:"Ɡ";s:2:"ɣ";s:2:"Ɣ";s:2:"ɥ";s:3:"Ɥ";s:2:"ɦ";s:3:"Ɦ";s:2:"ɨ";s:2:"Ɨ";s:2:"ɩ";s:2:"Ɩ";s:2:"ɫ";s:3:"Ɫ";s:2:"ɬ";s:3:"Ɬ";s:2:"ɯ";s:2:"Ɯ";s:2:"ɱ";s:3:"Ɱ";s:2:"ɲ";s:2:"Ɲ";s:2:"ɵ";s:2:"Ɵ";s:2:"ɽ";s:3:"Ɽ";s:2:"ʀ";s:2:"Ʀ";s:2:"ʃ";s:2:"Ʃ";s:2:"ʇ";s:3:"Ʇ";s:2:"ʈ";s:2:"Ʈ";s:2:"ʉ";s:2:"Ʉ";s:2:"ʊ";s:2:"Ʊ";s:2:"ʋ";s:2:"Ʋ";s:2:"ʌ";s:2:"Ʌ";s:2:"ʒ";s:2:"Ʒ";s:2:"ʞ";s:3:"Ʞ";s:2:"ͅ";s:2:"Ι";s:2:"ͱ";s:2:"Ͱ";s:2:"ͳ";s:2:"Ͳ";s:2:"ͷ";s:2:"Ͷ";s:2:"ͻ";s:2:"Ͻ";s:2:"ͼ";s:2:"Ͼ";s:2:"ͽ";s:2:"Ͽ";s:2:"ά";s:2:"Ά";s:2:"έ";s:2:"Έ";s:2:"ή";s:2:"Ή";s:2:"ί";s:2:"Ί";s:2:"α";s:2:"Α";s:2:"β";s:2:"Β";s:2:"γ";s:2:"Γ";s:2:"δ";s:2:"Δ";s:2:"ε";s:2:"Ε";s:2:"ζ";s:2:"Ζ";s:2:"η";s:2:"Η";s:2:"θ";s:2:"Θ";s:2:"ι";s:2:"Ι";s:2:"κ";s:2:"Κ";s:2:"λ";s:2:"Λ";s:2:"μ";s:2:"Μ";s:2:"ν";s:2:"Ν";s:2:"ξ";s:2:"Ξ";s:2:"ο";s:2:"Ο";s:2:"π";s:2:"Π";s:2:"ρ";s:2:"Ρ";s:2:"ς";s:2:"Σ";s:2:"σ";s:2:"Σ";s:2:"τ";s:2:"Τ";s:2:"υ";s:2:"Υ";s:2:"φ";s:2:"Φ";s:2:"χ";s:2:"Χ";s:2:"ψ";s:2:"Ψ";s:2:"ω";s:2:"Ω";s:2:"ϊ";s:2:"Ϊ";s:2:"ϋ";s:2:"Ϋ";s:2:"ό";s:2:"Ό";s:2:"ύ";s:2:"Ύ";s:2:"ώ";s:2:"Ώ";s:2:"ϐ";s:2:"Β";s:2:"ϑ";s:2:"Θ";s:2:"ϕ";s:2:"Φ";s:2:"ϖ";s:2:"Π";s:2:"ϗ";s:2:"Ϗ";s:2:"ϙ";s:2:"Ϙ";s:2:"ϛ";s:2:"Ϛ";s:2:"ϝ";s:2:"Ϝ";s:2:"ϟ";s:2:"Ϟ";s:2:"ϡ";s:2:"Ϡ";s:2:"ϣ";s:2:"Ϣ";s:2:"ϥ";s:2:"Ϥ";s:2:"ϧ";s:2:"Ϧ";s:2:"ϩ";s:2:"Ϩ";s:2:"ϫ";s:2:"Ϫ";s:2:"ϭ";s:2:"Ϭ";s:2:"ϯ";s:2:"Ϯ";s:2:"ϰ";s:2:"Κ";s:2:"ϱ";s:2:"Ρ";s:2:"ϲ";s:2:"Ϲ";s:2:"ϳ";s:2:"Ϳ";s:2:"ϵ";s:2:"Ε";s:2:"ϸ";s:2:"Ϸ";s:2:"ϻ";s:2:"Ϻ";s:2:"а";s:2:"А";s:2:"б";s:2:"Б";s:2:"в";s:2:"В";s:2:"г";s:2:"Г";s:2:"д";s:2:"Д";s:2:"е";s:2:"Е";s:2:"ж";s:2:"Ж";s:2:"з";s:2:"З";s:2:"и";s:2:"И";s:2:"й";s:2:"Й";s:2:"к";s:2:"К";s:2:"л";s:2:"Л";s:2:"м";s:2:"М";s:2:"н";s:2:"Н";s:2:"о";s:2:"О";s:2:"п";s:2:"П";s:2:"р";s:2:"Р";s:2:"с";s:2:"С";s:2:"т";s:2:"Т";s:2:"у";s:2:"У";s:2:"ф";s:2:"Ф";s:2:"х";s:2:"Х";s:2:"ц";s:2:"Ц";s:2:"ч";s:2:"Ч";s:2:"ш";s:2:"Ш";s:2:"щ";s:2:"Щ";s:2:"ъ";s:2:"Ъ";s:2:"ы";s:2:"Ы";s:2:"ь";s:2:"Ь";s:2:"э";s:2:"Э";s:2:"ю";s:2:"Ю";s:2:"я";s:2:"Я";s:2:"ѐ";s:2:"Ѐ";s:2:"ё";s:2:"Ё";s:2:"ђ";s:2:"Ђ";s:2:"ѓ";s:2:"Ѓ";s:2:"є";s:2:"Є";s:2:"ѕ";s:2:"Ѕ";s:2:"і";s:2:"І";s:2:"ї";s:2:"Ї";s:2:"ј";s:2:"Ј";s:2:"љ";s:2:"Љ";s:2:"њ";s:2:"Њ";s:2:"ћ";s:2:"Ћ";s:2:"ќ";s:2:"Ќ";s:2:"ѝ";s:2:"Ѝ";s:2:"ў";s:2:"Ў";s:2:"џ";s:2:"Џ";s:2:"ѡ";s:2:"Ѡ";s:2:"ѣ";s:2:"Ѣ";s:2:"ѥ";s:2:"Ѥ";s:2:"ѧ";s:2:"Ѧ";s:2:"ѩ";s:2:"Ѩ";s:2:"ѫ";s:2:"Ѫ";s:2:"ѭ";s:2:"Ѭ";s:2:"ѯ";s:2:"Ѯ";s:2:"ѱ";s:2:"Ѱ";s:2:"ѳ";s:2:"Ѳ";s:2:"ѵ";s:2:"Ѵ";s:2:"ѷ";s:2:"Ѷ";s:2:"ѹ";s:2:"Ѹ";s:2:"ѻ";s:2:"Ѻ";s:2:"ѽ";s:2:"Ѽ";s:2:"ѿ";s:2:"Ѿ";s:2:"ҁ";s:2:"Ҁ";s:2:"ҋ";s:2:"Ҋ";s:2:"ҍ";s:2:"Ҍ";s:2:"ҏ";s:2:"Ҏ";s:2:"ґ";s:2:"Ґ";s:2:"ғ";s:2:"Ғ";s:2:"ҕ";s:2:"Ҕ";s:2:"җ";s:2:"Җ";s:2:"ҙ";s:2:"Ҙ";s:2:"қ";s:2:"Қ";s:2:"ҝ";s:2:"Ҝ";s:2:"ҟ";s:2:"Ҟ";s:2:"ҡ";s:2:"Ҡ";s:2:"ң";s:2:"Ң";s:2:"ҥ";s:2:"Ҥ";s:2:"ҧ";s:2:"Ҧ";s:2:"ҩ";s:2:"Ҩ";s:2:"ҫ";s:2:"Ҫ";s:2:"ҭ";s:2:"Ҭ";s:2:"ү";s:2:"Ү";s:2:"ұ";s:2:"Ұ";s:2:"ҳ";s:2:"Ҳ";s:2:"ҵ";s:2:"Ҵ";s:2:"ҷ";s:2:"Ҷ";s:2:"ҹ";s:2:"Ҹ";s:2:"һ";s:2:"Һ";s:2:"ҽ";s:2:"Ҽ";s:2:"ҿ";s:2:"Ҿ";s:2:"ӂ";s:2:"Ӂ";s:2:"ӄ";s:2:"Ӄ";s:2:"ӆ";s:2:"Ӆ";s:2:"ӈ";s:2:"Ӈ";s:2:"ӊ";s:2:"Ӊ";s:2:"ӌ";s:2:"Ӌ";s:2:"ӎ";s:2:"Ӎ";s:2:"ӏ";s:2:"Ӏ";s:2:"ӑ";s:2:"Ӑ";s:2:"ӓ";s:2:"Ӓ";s:2:"ӕ";s:2:"Ӕ";s:2:"ӗ";s:2:"Ӗ";s:2:"ә";s:2:"Ә";s:2:"ӛ";s:2:"Ӛ";s:2:"ӝ";s:2:"Ӝ";s:2:"ӟ";s:2:"Ӟ";s:2:"ӡ";s:2:"Ӡ";s:2:"ӣ";s:2:"Ӣ";s:2:"ӥ";s:2:"Ӥ";s:2:"ӧ";s:2:"Ӧ";s:2:"ө";s:2:"Ө";s:2:"ӫ";s:2:"Ӫ";s:2:"ӭ";s:2:"Ӭ";s:2:"ӯ";s:2:"Ӯ";s:2:"ӱ";s:2:"Ӱ";s:2:"ӳ";s:2:"Ӳ";s:2:"ӵ";s:2:"Ӵ";s:2:"ӷ";s:2:"Ӷ";s:2:"ӹ";s:2:"Ӹ";s:2:"ӻ";s:2:"Ӻ";s:2:"ӽ";s:2:"Ӽ";s:2:"ӿ";s:2:"Ӿ";s:2:"ԁ";s:2:"Ԁ";s:2:"ԃ";s:2:"Ԃ";s:2:"ԅ";s:2:"Ԅ";s:2:"ԇ";s:2:"Ԇ";s:2:"ԉ";s:2:"Ԉ";s:2:"ԋ";s:2:"Ԋ";s:2:"ԍ";s:2:"Ԍ";s:2:"ԏ";s:2:"Ԏ";s:2:"ԑ";s:2:"Ԑ";s:2:"ԓ";s:2:"Ԓ";s:2:"ԕ";s:2:"Ԕ";s:2:"ԗ";s:2:"Ԗ";s:2:"ԙ";s:2:"Ԙ";s:2:"ԛ";s:2:"Ԛ";s:2:"ԝ";s:2:"Ԝ";s:2:"ԟ";s:2:"Ԟ";s:2:"ԡ";s:2:"Ԡ";s:2:"ԣ";s:2:"Ԣ";s:2:"ԥ";s:2:"Ԥ";s:2:"ԧ";s:2:"Ԧ";s:2:"ԩ";s:2:"Ԩ";s:2:"ԫ";s:2:"Ԫ";s:2:"ԭ";s:2:"Ԭ";s:2:"ԯ";s:2:"Ԯ";s:2:"ա";s:2:"Ա";s:2:"բ";s:2:"Բ";s:2:"գ";s:2:"Գ";s:2:"դ";s:2:"Դ";s:2:"ե";s:2:"Ե";s:2:"զ";s:2:"Զ";s:2:"է";s:2:"Է";s:2:"ը";s:2:"Ը";s:2:"թ";s:2:"Թ";s:2:"ժ";s:2:"Ժ";s:2:"ի";s:2:"Ի";s:2:"լ";s:2:"Լ";s:2:"խ";s:2:"Խ";s:2:"ծ";s:2:"Ծ";s:2:"կ";s:2:"Կ";s:2:"հ";s:2:"Հ";s:2:"ձ";s:2:"Ձ";s:2:"ղ";s:2:"Ղ";s:2:"ճ";s:2:"Ճ";s:2:"մ";s:2:"Մ";s:2:"յ";s:2:"Յ";s:2:"ն";s:2:"Ն";s:2:"շ";s:2:"Շ";s:2:"ո";s:2:"Ո";s:2:"չ";s:2:"Չ";s:2:"պ";s:2:"Պ";s:2:"ջ";s:2:"Ջ";s:2:"ռ";s:2:"Ռ";s:2:"ս";s:2:"Ս";s:2:"վ";s:2:"Վ";s:2:"տ";s:2:"Տ";s:2:"ր";s:2:"Ր";s:2:"ց";s:2:"Ց";s:2:"ւ";s:2:"Ւ";s:2:"փ";s:2:"Փ";s:2:"ք";s:2:"Ք";s:2:"օ";s:2:"Օ";s:2:"ֆ";s:2:"Ֆ";s:3:"ᵹ";s:3:"Ᵹ";s:3:"ᵽ";s:3:"Ᵽ";s:3:"ḁ";s:3:"Ḁ";s:3:"ḃ";s:3:"Ḃ";s:3:"ḅ";s:3:"Ḅ";s:3:"ḇ";s:3:"Ḇ";s:3:"ḉ";s:3:"Ḉ";s:3:"ḋ";s:3:"Ḋ";s:3:"ḍ";s:3:"Ḍ";s:3:"ḏ";s:3:"Ḏ";s:3:"ḑ";s:3:"Ḑ";s:3:"ḓ";s:3:"Ḓ";s:3:"ḕ";s:3:"Ḕ";s:3:"ḗ";s:3:"Ḗ";s:3:"ḙ";s:3:"Ḙ";s:3:"ḛ";s:3:"Ḛ";s:3:"ḝ";s:3:"Ḝ";s:3:"ḟ";s:3:"Ḟ";s:3:"ḡ";s:3:"Ḡ";s:3:"ḣ";s:3:"Ḣ";s:3:"ḥ";s:3:"Ḥ";s:3:"ḧ";s:3:"Ḧ";s:3:"ḩ";s:3:"Ḩ";s:3:"ḫ";s:3:"Ḫ";s:3:"ḭ";s:3:"Ḭ";s:3:"ḯ";s:3:"Ḯ";s:3:"ḱ";s:3:"Ḱ";s:3:"ḳ";s:3:"Ḳ";s:3:"ḵ";s:3:"Ḵ";s:3:"ḷ";s:3:"Ḷ";s:3:"ḹ";s:3:"Ḹ";s:3:"ḻ";s:3:"Ḻ";s:3:"ḽ";s:3:"Ḽ";s:3:"ḿ";s:3:"Ḿ";s:3:"ṁ";s:3:"Ṁ";s:3:"ṃ";s:3:"Ṃ";s:3:"ṅ";s:3:"Ṅ";s:3:"ṇ";s:3:"Ṇ";s:3:"ṉ";s:3:"Ṉ";s:3:"ṋ";s:3:"Ṋ";s:3:"ṍ";s:3:"Ṍ";s:3:"ṏ";s:3:"Ṏ";s:3:"ṑ";s:3:"Ṑ";s:3:"ṓ";s:3:"Ṓ";s:3:"ṕ";s:3:"Ṕ";s:3:"ṗ";s:3:"Ṗ";s:3:"ṙ";s:3:"Ṙ";s:3:"ṛ";s:3:"Ṛ";s:3:"ṝ";s:3:"Ṝ";s:3:"ṟ";s:3:"Ṟ";s:3:"ṡ";s:3:"Ṡ";s:3:"ṣ";s:3:"Ṣ";s:3:"ṥ";s:3:"Ṥ";s:3:"ṧ";s:3:"Ṧ";s:3:"ṩ";s:3:"Ṩ";s:3:"ṫ";s:3:"Ṫ";s:3:"ṭ";s:3:"Ṭ";s:3:"ṯ";s:3:"Ṯ";s:3:"ṱ";s:3:"Ṱ";s:3:"ṳ";s:3:"Ṳ";s:3:"ṵ";s:3:"Ṵ";s:3:"ṷ";s:3:"Ṷ";s:3:"ṹ";s:3:"Ṹ";s:3:"ṻ";s:3:"Ṻ";s:3:"ṽ";s:3:"Ṽ";s:3:"ṿ";s:3:"Ṿ";s:3:"ẁ";s:3:"Ẁ";s:3:"ẃ";s:3:"Ẃ";s:3:"ẅ";s:3:"Ẅ";s:3:"ẇ";s:3:"Ẇ";s:3:"ẉ";s:3:"Ẉ";s:3:"ẋ";s:3:"Ẋ";s:3:"ẍ";s:3:"Ẍ";s:3:"ẏ";s:3:"Ẏ";s:3:"ẑ";s:3:"Ẑ";s:3:"ẓ";s:3:"Ẓ";s:3:"ẕ";s:3:"Ẕ";s:3:"ẛ";s:3:"Ṡ";s:3:"ạ";s:3:"Ạ";s:3:"ả";s:3:"Ả";s:3:"ấ";s:3:"Ấ";s:3:"ầ";s:3:"Ầ";s:3:"ẩ";s:3:"Ẩ";s:3:"ẫ";s:3:"Ẫ";s:3:"ậ";s:3:"Ậ";s:3:"ắ";s:3:"Ắ";s:3:"ằ";s:3:"Ằ";s:3:"ẳ";s:3:"Ẳ";s:3:"ẵ";s:3:"Ẵ";s:3:"ặ";s:3:"Ặ";s:3:"ẹ";s:3:"Ẹ";s:3:"ẻ";s:3:"Ẻ";s:3:"ẽ";s:3:"Ẽ";s:3:"ế";s:3:"Ế";s:3:"ề";s:3:"Ề";s:3:"ể";s:3:"Ể";s:3:"ễ";s:3:"Ễ";s:3:"ệ";s:3:"Ệ";s:3:"ỉ";s:3:"Ỉ";s:3:"ị";s:3:"Ị";s:3:"ọ";s:3:"Ọ";s:3:"ỏ";s:3:"Ỏ";s:3:"ố";s:3:"Ố";s:3:"ồ";s:3:"Ồ";s:3:"ổ";s:3:"Ổ";s:3:"ỗ";s:3:"Ỗ";s:3:"ộ";s:3:"Ộ";s:3:"ớ";s:3:"Ớ";s:3:"ờ";s:3:"Ờ";s:3:"ở";s:3:"Ở";s:3:"ỡ";s:3:"Ỡ";s:3:"ợ";s:3:"Ợ";s:3:"ụ";s:3:"Ụ";s:3:"ủ";s:3:"Ủ";s:3:"ứ";s:3:"Ứ";s:3:"ừ";s:3:"Ừ";s:3:"ử";s:3:"Ử";s:3:"ữ";s:3:"Ữ";s:3:"ự";s:3:"Ự";s:3:"ỳ";s:3:"Ỳ";s:3:"ỵ";s:3:"Ỵ";s:3:"ỷ";s:3:"Ỷ";s:3:"ỹ";s:3:"Ỹ";s:3:"ỻ";s:3:"Ỻ";s:3:"ỽ";s:3:"Ỽ";s:3:"ỿ";s:3:"Ỿ";s:3:"ἀ";s:3:"Ἀ";s:3:"ἁ";s:3:"Ἁ";s:3:"ἂ";s:3:"Ἂ";s:3:"ἃ";s:3:"Ἃ";s:3:"ἄ";s:3:"Ἄ";s:3:"ἅ";s:3:"Ἅ";s:3:"ἆ";s:3:"Ἆ";s:3:"ἇ";s:3:"Ἇ";s:3:"ἐ";s:3:"Ἐ";s:3:"ἑ";s:3:"Ἑ";s:3:"ἒ";s:3:"Ἒ";s:3:"ἓ";s:3:"Ἓ";s:3:"ἔ";s:3:"Ἔ";s:3:"ἕ";s:3:"Ἕ";s:3:"ἠ";s:3:"Ἠ";s:3:"ἡ";s:3:"Ἡ";s:3:"ἢ";s:3:"Ἢ";s:3:"ἣ";s:3:"Ἣ";s:3:"ἤ";s:3:"Ἤ";s:3:"ἥ";s:3:"Ἥ";s:3:"ἦ";s:3:"Ἦ";s:3:"ἧ";s:3:"Ἧ";s:3:"ἰ";s:3:"Ἰ";s:3:"ἱ";s:3:"Ἱ";s:3:"ἲ";s:3:"Ἲ";s:3:"ἳ";s:3:"Ἳ";s:3:"ἴ";s:3:"Ἴ";s:3:"ἵ";s:3:"Ἵ";s:3:"ἶ";s:3:"Ἶ";s:3:"ἷ";s:3:"Ἷ";s:3:"ὀ";s:3:"Ὀ";s:3:"ὁ";s:3:"Ὁ";s:3:"ὂ";s:3:"Ὂ";s:3:"ὃ";s:3:"Ὃ";s:3:"ὄ";s:3:"Ὄ";s:3:"ὅ";s:3:"Ὅ";s:3:"ὑ";s:3:"Ὑ";s:3:"ὓ";s:3:"Ὓ";s:3:"ὕ";s:3:"Ὕ";s:3:"ὗ";s:3:"Ὗ";s:3:"ὠ";s:3:"Ὠ";s:3:"ὡ";s:3:"Ὡ";s:3:"ὢ";s:3:"Ὢ";s:3:"ὣ";s:3:"Ὣ";s:3:"ὤ";s:3:"Ὤ";s:3:"ὥ";s:3:"Ὥ";s:3:"ὦ";s:3:"Ὦ";s:3:"ὧ";s:3:"Ὧ";s:3:"ὰ";s:3:"Ὰ";s:3:"ά";s:3:"Ά";s:3:"ὲ";s:3:"Ὲ";s:3:"έ";s:3:"Έ";s:3:"ὴ";s:3:"Ὴ";s:3:"ή";s:3:"Ή";s:3:"ὶ";s:3:"Ὶ";s:3:"ί";s:3:"Ί";s:3:"ὸ";s:3:"Ὸ";s:3:"ό";s:3:"Ό";s:3:"ὺ";s:3:"Ὺ";s:3:"ύ";s:3:"Ύ";s:3:"ὼ";s:3:"Ὼ";s:3:"ώ";s:3:"Ώ";s:3:"ᾀ";s:3:"ᾈ";s:3:"ᾁ";s:3:"ᾉ";s:3:"ᾂ";s:3:"ᾊ";s:3:"ᾃ";s:3:"ᾋ";s:3:"ᾄ";s:3:"ᾌ";s:3:"ᾅ";s:3:"ᾍ";s:3:"ᾆ";s:3:"ᾎ";s:3:"ᾇ";s:3:"ᾏ";s:3:"ᾐ";s:3:"ᾘ";s:3:"ᾑ";s:3:"ᾙ";s:3:"ᾒ";s:3:"ᾚ";s:3:"ᾓ";s:3:"ᾛ";s:3:"ᾔ";s:3:"ᾜ";s:3:"ᾕ";s:3:"ᾝ";s:3:"ᾖ";s:3:"ᾞ";s:3:"ᾗ";s:3:"ᾟ";s:3:"ᾠ";s:3:"ᾨ";s:3:"ᾡ";s:3:"ᾩ";s:3:"ᾢ";s:3:"ᾪ";s:3:"ᾣ";s:3:"ᾫ";s:3:"ᾤ";s:3:"ᾬ";s:3:"ᾥ";s:3:"ᾭ";s:3:"ᾦ";s:3:"ᾮ";s:3:"ᾧ";s:3:"ᾯ";s:3:"ᾰ";s:3:"Ᾰ";s:3:"ᾱ";s:3:"Ᾱ";s:3:"ᾳ";s:3:"ᾼ";s:3:"ι";s:2:"Ι";s:3:"ῃ";s:3:"ῌ";s:3:"ῐ";s:3:"Ῐ";s:3:"ῑ";s:3:"Ῑ";s:3:"ῠ";s:3:"Ῠ";s:3:"ῡ";s:3:"Ῡ";s:3:"ῥ";s:3:"Ῥ";s:3:"ῳ";s:3:"ῼ";s:3:"ⅎ";s:3:"Ⅎ";s:3:"ⅰ";s:3:"Ⅰ";s:3:"ⅱ";s:3:"Ⅱ";s:3:"ⅲ";s:3:"Ⅲ";s:3:"ⅳ";s:3:"Ⅳ";s:3:"ⅴ";s:3:"Ⅴ";s:3:"ⅵ";s:3:"Ⅵ";s:3:"ⅶ";s:3:"Ⅶ";s:3:"ⅷ";s:3:"Ⅷ";s:3:"ⅸ";s:3:"Ⅸ";s:3:"ⅹ";s:3:"Ⅹ";s:3:"ⅺ";s:3:"Ⅺ";s:3:"ⅻ";s:3:"Ⅻ";s:3:"ⅼ";s:3:"Ⅼ";s:3:"ⅽ";s:3:"Ⅽ";s:3:"ⅾ";s:3:"Ⅾ";s:3:"ⅿ";s:3:"Ⅿ";s:3:"ↄ";s:3:"Ↄ";s:3:"ⓐ";s:3:"Ⓐ";s:3:"ⓑ";s:3:"Ⓑ";s:3:"ⓒ";s:3:"Ⓒ";s:3:"ⓓ";s:3:"Ⓓ";s:3:"ⓔ";s:3:"Ⓔ";s:3:"ⓕ";s:3:"Ⓕ";s:3:"ⓖ";s:3:"Ⓖ";s:3:"ⓗ";s:3:"Ⓗ";s:3:"ⓘ";s:3:"Ⓘ";s:3:"ⓙ";s:3:"Ⓙ";s:3:"ⓚ";s:3:"Ⓚ";s:3:"ⓛ";s:3:"Ⓛ";s:3:"ⓜ";s:3:"Ⓜ";s:3:"ⓝ";s:3:"Ⓝ";s:3:"ⓞ";s:3:"Ⓞ";s:3:"ⓟ";s:3:"Ⓟ";s:3:"ⓠ";s:3:"Ⓠ";s:3:"ⓡ";s:3:"Ⓡ";s:3:"ⓢ";s:3:"Ⓢ";s:3:"ⓣ";s:3:"Ⓣ";s:3:"ⓤ";s:3:"Ⓤ";s:3:"ⓥ";s:3:"Ⓥ";s:3:"ⓦ";s:3:"Ⓦ";s:3:"ⓧ";s:3:"Ⓧ";s:3:"ⓨ";s:3:"Ⓨ";s:3:"ⓩ";s:3:"Ⓩ";s:3:"ⰰ";s:3:"Ⰰ";s:3:"ⰱ";s:3:"Ⰱ";s:3:"ⰲ";s:3:"Ⰲ";s:3:"ⰳ";s:3:"Ⰳ";s:3:"ⰴ";s:3:"Ⰴ";s:3:"ⰵ";s:3:"Ⰵ";s:3:"ⰶ";s:3:"Ⰶ";s:3:"ⰷ";s:3:"Ⰷ";s:3:"ⰸ";s:3:"Ⰸ";s:3:"ⰹ";s:3:"Ⰹ";s:3:"ⰺ";s:3:"Ⰺ";s:3:"ⰻ";s:3:"Ⰻ";s:3:"ⰼ";s:3:"Ⰼ";s:3:"ⰽ";s:3:"Ⰽ";s:3:"ⰾ";s:3:"Ⰾ";s:3:"ⰿ";s:3:"Ⰿ";s:3:"ⱀ";s:3:"Ⱀ";s:3:"ⱁ";s:3:"Ⱁ";s:3:"ⱂ";s:3:"Ⱂ";s:3:"ⱃ";s:3:"Ⱃ";s:3:"ⱄ";s:3:"Ⱄ";s:3:"ⱅ";s:3:"Ⱅ";s:3:"ⱆ";s:3:"Ⱆ";s:3:"ⱇ";s:3:"Ⱇ";s:3:"ⱈ";s:3:"Ⱈ";s:3:"ⱉ";s:3:"Ⱉ";s:3:"ⱊ";s:3:"Ⱊ";s:3:"ⱋ";s:3:"Ⱋ";s:3:"ⱌ";s:3:"Ⱌ";s:3:"ⱍ";s:3:"Ⱍ";s:3:"ⱎ";s:3:"Ⱎ";s:3:"ⱏ";s:3:"Ⱏ";s:3:"ⱐ";s:3:"Ⱐ";s:3:"ⱑ";s:3:"Ⱑ";s:3:"ⱒ";s:3:"Ⱒ";s:3:"ⱓ";s:3:"Ⱓ";s:3:"ⱔ";s:3:"Ⱔ";s:3:"ⱕ";s:3:"Ⱕ";s:3:"ⱖ";s:3:"Ⱖ";s:3:"ⱗ";s:3:"Ⱗ";s:3:"ⱘ";s:3:"Ⱘ";s:3:"ⱙ";s:3:"Ⱙ";s:3:"ⱚ";s:3:"Ⱚ";s:3:"ⱛ";s:3:"Ⱛ";s:3:"ⱜ";s:3:"Ⱜ";s:3:"ⱝ";s:3:"Ⱝ";s:3:"ⱞ";s:3:"Ⱞ";s:3:"ⱡ";s:3:"Ⱡ";s:3:"ⱥ";s:2:"Ⱥ";s:3:"ⱦ";s:2:"Ⱦ";s:3:"ⱨ";s:3:"Ⱨ";s:3:"ⱪ";s:3:"Ⱪ";s:3:"ⱬ";s:3:"Ⱬ";s:3:"ⱳ";s:3:"Ⱳ";s:3:"ⱶ";s:3:"Ⱶ";s:3:"ⲁ";s:3:"Ⲁ";s:3:"ⲃ";s:3:"Ⲃ";s:3:"ⲅ";s:3:"Ⲅ";s:3:"ⲇ";s:3:"Ⲇ";s:3:"ⲉ";s:3:"Ⲉ";s:3:"ⲋ";s:3:"Ⲋ";s:3:"ⲍ";s:3:"Ⲍ";s:3:"ⲏ";s:3:"Ⲏ";s:3:"ⲑ";s:3:"Ⲑ";s:3:"ⲓ";s:3:"Ⲓ";s:3:"ⲕ";s:3:"Ⲕ";s:3:"ⲗ";s:3:"Ⲗ";s:3:"ⲙ";s:3:"Ⲙ";s:3:"ⲛ";s:3:"Ⲛ";s:3:"ⲝ";s:3:"Ⲝ";s:3:"ⲟ";s:3:"Ⲟ";s:3:"ⲡ";s:3:"Ⲡ";s:3:"ⲣ";s:3:"Ⲣ";s:3:"ⲥ";s:3:"Ⲥ";s:3:"ⲧ";s:3:"Ⲧ";s:3:"ⲩ";s:3:"Ⲩ";s:3:"ⲫ";s:3:"Ⲫ";s:3:"ⲭ";s:3:"Ⲭ";s:3:"ⲯ";s:3:"Ⲯ";s:3:"ⲱ";s:3:"Ⲱ";s:3:"ⲳ";s:3:"Ⲳ";s:3:"ⲵ";s:3:"Ⲵ";s:3:"ⲷ";s:3:"Ⲷ";s:3:"ⲹ";s:3:"Ⲹ";s:3:"ⲻ";s:3:"Ⲻ";s:3:"ⲽ";s:3:"Ⲽ";s:3:"ⲿ";s:3:"Ⲿ";s:3:"ⳁ";s:3:"Ⳁ";s:3:"ⳃ";s:3:"Ⳃ";s:3:"ⳅ";s:3:"Ⳅ";s:3:"ⳇ";s:3:"Ⳇ";s:3:"ⳉ";s:3:"Ⳉ";s:3:"ⳋ";s:3:"Ⳋ";s:3:"ⳍ";s:3:"Ⳍ";s:3:"ⳏ";s:3:"Ⳏ";s:3:"ⳑ";s:3:"Ⳑ";s:3:"ⳓ";s:3:"Ⳓ";s:3:"ⳕ";s:3:"Ⳕ";s:3:"ⳗ";s:3:"Ⳗ";s:3:"ⳙ";s:3:"Ⳙ";s:3:"ⳛ";s:3:"Ⳛ";s:3:"ⳝ";s:3:"Ⳝ";s:3:"ⳟ";s:3:"Ⳟ";s:3:"ⳡ";s:3:"Ⳡ";s:3:"ⳣ";s:3:"Ⳣ";s:3:"ⳬ";s:3:"Ⳬ";s:3:"ⳮ";s:3:"Ⳮ";s:3:"ⳳ";s:3:"Ⳳ";s:3:"ⴀ";s:3:"Ⴀ";s:3:"ⴁ";s:3:"Ⴁ";s:3:"ⴂ";s:3:"Ⴂ";s:3:"ⴃ";s:3:"Ⴃ";s:3:"ⴄ";s:3:"Ⴄ";s:3:"ⴅ";s:3:"Ⴅ";s:3:"ⴆ";s:3:"Ⴆ";s:3:"ⴇ";s:3:"Ⴇ";s:3:"ⴈ";s:3:"Ⴈ";s:3:"ⴉ";s:3:"Ⴉ";s:3:"ⴊ";s:3:"Ⴊ";s:3:"ⴋ";s:3:"Ⴋ";s:3:"ⴌ";s:3:"Ⴌ";s:3:"ⴍ";s:3:"Ⴍ";s:3:"ⴎ";s:3:"Ⴎ";s:3:"ⴏ";s:3:"Ⴏ";s:3:"ⴐ";s:3:"Ⴐ";s:3:"ⴑ";s:3:"Ⴑ";s:3:"ⴒ";s:3:"Ⴒ";s:3:"ⴓ";s:3:"Ⴓ";s:3:"ⴔ";s:3:"Ⴔ";s:3:"ⴕ";s:3:"Ⴕ";s:3:"ⴖ";s:3:"Ⴖ";s:3:"ⴗ";s:3:"Ⴗ";s:3:"ⴘ";s:3:"Ⴘ";s:3:"ⴙ";s:3:"Ⴙ";s:3:"ⴚ";s:3:"Ⴚ";s:3:"ⴛ";s:3:"Ⴛ";s:3:"ⴜ";s:3:"Ⴜ";s:3:"ⴝ";s:3:"Ⴝ";s:3:"ⴞ";s:3:"Ⴞ";s:3:"ⴟ";s:3:"Ⴟ";s:3:"ⴠ";s:3:"Ⴠ";s:3:"ⴡ";s:3:"Ⴡ";s:3:"ⴢ";s:3:"Ⴢ";s:3:"ⴣ";s:3:"Ⴣ";s:3:"ⴤ";s:3:"Ⴤ";s:3:"ⴥ";s:3:"Ⴥ";s:3:"ⴧ";s:3:"Ⴧ";s:3:"ⴭ";s:3:"Ⴭ";s:3:"ꙁ";s:3:"Ꙁ";s:3:"ꙃ";s:3:"Ꙃ";s:3:"ꙅ";s:3:"Ꙅ";s:3:"ꙇ";s:3:"Ꙇ";s:3:"ꙉ";s:3:"Ꙉ";s:3:"ꙋ";s:3:"Ꙋ";s:3:"ꙍ";s:3:"Ꙍ";s:3:"ꙏ";s:3:"Ꙏ";s:3:"ꙑ";s:3:"Ꙑ";s:3:"ꙓ";s:3:"Ꙓ";s:3:"ꙕ";s:3:"Ꙕ";s:3:"ꙗ";s:3:"Ꙗ";s:3:"ꙙ";s:3:"Ꙙ";s:3:"ꙛ";s:3:"Ꙛ";s:3:"ꙝ";s:3:"Ꙝ";s:3:"ꙟ";s:3:"Ꙟ";s:3:"ꙡ";s:3:"Ꙡ";s:3:"ꙣ";s:3:"Ꙣ";s:3:"ꙥ";s:3:"Ꙥ";s:3:"ꙧ";s:3:"Ꙧ";s:3:"ꙩ";s:3:"Ꙩ";s:3:"ꙫ";s:3:"Ꙫ";s:3:"ꙭ";s:3:"Ꙭ";s:3:"ꚁ";s:3:"Ꚁ";s:3:"ꚃ";s:3:"Ꚃ";s:3:"ꚅ";s:3:"Ꚅ";s:3:"ꚇ";s:3:"Ꚇ";s:3:"ꚉ";s:3:"Ꚉ";s:3:"ꚋ";s:3:"Ꚋ";s:3:"ꚍ";s:3:"Ꚍ";s:3:"ꚏ";s:3:"Ꚏ";s:3:"ꚑ";s:3:"Ꚑ";s:3:"ꚓ";s:3:"Ꚓ";s:3:"ꚕ";s:3:"Ꚕ";s:3:"ꚗ";s:3:"Ꚗ";s:3:"ꚙ";s:3:"Ꚙ";s:3:"ꚛ";s:3:"Ꚛ";s:3:"ꜣ";s:3:"Ꜣ";s:3:"ꜥ";s:3:"Ꜥ";s:3:"ꜧ";s:3:"Ꜧ";s:3:"ꜩ";s:3:"Ꜩ";s:3:"ꜫ";s:3:"Ꜫ";s:3:"ꜭ";s:3:"Ꜭ";s:3:"ꜯ";s:3:"Ꜯ";s:3:"ꜳ";s:3:"Ꜳ";s:3:"ꜵ";s:3:"Ꜵ";s:3:"ꜷ";s:3:"Ꜷ";s:3:"ꜹ";s:3:"Ꜹ";s:3:"ꜻ";s:3:"Ꜻ";s:3:"ꜽ";s:3:"Ꜽ";s:3:"ꜿ";s:3:"Ꜿ";s:3:"ꝁ";s:3:"Ꝁ";s:3:"ꝃ";s:3:"Ꝃ";s:3:"ꝅ";s:3:"Ꝅ";s:3:"ꝇ";s:3:"Ꝇ";s:3:"ꝉ";s:3:"Ꝉ";s:3:"ꝋ";s:3:"Ꝋ";s:3:"ꝍ";s:3:"Ꝍ";s:3:"ꝏ";s:3:"Ꝏ";s:3:"ꝑ";s:3:"Ꝑ";s:3:"ꝓ";s:3:"Ꝓ";s:3:"ꝕ";s:3:"Ꝕ";s:3:"ꝗ";s:3:"Ꝗ";s:3:"ꝙ";s:3:"Ꝙ";s:3:"ꝛ";s:3:"Ꝛ";s:3:"ꝝ";s:3:"Ꝝ";s:3:"ꝟ";s:3:"Ꝟ";s:3:"ꝡ";s:3:"Ꝡ";s:3:"ꝣ";s:3:"Ꝣ";s:3:"ꝥ";s:3:"Ꝥ";s:3:"ꝧ";s:3:"Ꝧ";s:3:"ꝩ";s:3:"Ꝩ";s:3:"ꝫ";s:3:"Ꝫ";s:3:"ꝭ";s:3:"Ꝭ";s:3:"ꝯ";s:3:"Ꝯ";s:3:"ꝺ";s:3:"Ꝺ";s:3:"ꝼ";s:3:"Ꝼ";s:3:"ꝿ";s:3:"Ꝿ";s:3:"ꞁ";s:3:"Ꞁ";s:3:"ꞃ";s:3:"Ꞃ";s:3:"ꞅ";s:3:"Ꞅ";s:3:"ꞇ";s:3:"Ꞇ";s:3:"ꞌ";s:3:"Ꞌ";s:3:"ꞑ";s:3:"Ꞑ";s:3:"ꞓ";s:3:"Ꞓ";s:3:"ꞗ";s:3:"Ꞗ";s:3:"ꞙ";s:3:"Ꞙ";s:3:"ꞛ";s:3:"Ꞛ";s:3:"ꞝ";s:3:"Ꞝ";s:3:"ꞟ";s:3:"Ꞟ";s:3:"ꞡ";s:3:"Ꞡ";s:3:"ꞣ";s:3:"Ꞣ";s:3:"ꞥ";s:3:"Ꞥ";s:3:"ꞧ";s:3:"Ꞧ";s:3:"ꞩ";s:3:"Ꞩ";s:3:"a";s:3:"A";s:3:"b";s:3:"B";s:3:"c";s:3:"C";s:3:"d";s:3:"D";s:3:"e";s:3:"E";s:3:"f";s:3:"F";s:3:"g";s:3:"G";s:3:"h";s:3:"H";s:3:"i";s:3:"I";s:3:"j";s:3:"J";s:3:"k";s:3:"K";s:3:"l";s:3:"L";s:3:"m";s:3:"M";s:3:"n";s:3:"N";s:3:"o";s:3:"O";s:3:"p";s:3:"P";s:3:"q";s:3:"Q";s:3:"r";s:3:"R";s:3:"s";s:3:"S";s:3:"t";s:3:"T";s:3:"u";s:3:"U";s:3:"v";s:3:"V";s:3:"w";s:3:"W";s:3:"x";s:3:"X";s:3:"y";s:3:"Y";s:3:"z";s:3:"Z";s:4:"𐐨";s:4:"𐐀";s:4:"𐐩";s:4:"𐐁";s:4:"𐐪";s:4:"𐐂";s:4:"𐐫";s:4:"𐐃";s:4:"𐐬";s:4:"𐐄";s:4:"𐐭";s:4:"𐐅";s:4:"𐐮";s:4:"𐐆";s:4:"𐐯";s:4:"𐐇";s:4:"𐐰";s:4:"𐐈";s:4:"𐐱";s:4:"𐐉";s:4:"𐐲";s:4:"𐐊";s:4:"𐐳";s:4:"𐐋";s:4:"𐐴";s:4:"𐐌";s:4:"𐐵";s:4:"𐐍";s:4:"𐐶";s:4:"𐐎";s:4:"𐐷";s:4:"𐐏";s:4:"𐐸";s:4:"𐐐";s:4:"𐐹";s:4:"𐐑";s:4:"𐐺";s:4:"𐐒";s:4:"𐐻";s:4:"𐐓";s:4:"𐐼";s:4:"𐐔";s:4:"𐐽";s:4:"𐐕";s:4:"𐐾";s:4:"𐐖";s:4:"𐐿";s:4:"𐐗";s:4:"𐑀";s:4:"𐐘";s:4:"𐑁";s:4:"𐐙";s:4:"𐑂";s:4:"𐐚";s:4:"𐑃";s:4:"𐐛";s:4:"𐑄";s:4:"𐐜";s:4:"𐑅";s:4:"𐐝";s:4:"𐑆";s:4:"𐐞";s:4:"𐑇";s:4:"𐐟";s:4:"𐑈";s:4:"𐐠";s:4:"𐑉";s:4:"𐐡";s:4:"𐑊";s:4:"𐐢";s:4:"𐑋";s:4:"𐐣";s:4:"𐑌";s:4:"𐐤";s:4:"𐑍";s:4:"𐐥";s:4:"𐑎";s:4:"𐐦";s:4:"𐑏";s:4:"𐐧";s:4:"𑣀";s:4:"𑢠";s:4:"𑣁";s:4:"𑢡";s:4:"𑣂";s:4:"𑢢";s:4:"𑣃";s:4:"𑢣";s:4:"𑣄";s:4:"𑢤";s:4:"𑣅";s:4:"𑢥";s:4:"𑣆";s:4:"𑢦";s:4:"𑣇";s:4:"𑢧";s:4:"𑣈";s:4:"𑢨";s:4:"𑣉";s:4:"𑢩";s:4:"𑣊";s:4:"𑢪";s:4:"𑣋";s:4:"𑢫";s:4:"𑣌";s:4:"𑢬";s:4:"𑣍";s:4:"𑢭";s:4:"𑣎";s:4:"𑢮";s:4:"𑣏";s:4:"𑢯";s:4:"𑣐";s:4:"𑢰";s:4:"𑣑";s:4:"𑢱";s:4:"𑣒";s:4:"𑢲";s:4:"𑣓";s:4:"𑢳";s:4:"𑣔";s:4:"𑢴";s:4:"𑣕";s:4:"𑢵";s:4:"𑣖";s:4:"𑢶";s:4:"𑣗";s:4:"𑢷";s:4:"𑣘";s:4:"𑢸";s:4:"𑣙";s:4:"𑢹";s:4:"𑣚";s:4:"𑢺";s:4:"𑣛";s:4:"𑢻";s:4:"𑣜";s:4:"𑢼";s:4:"𑣝";s:4:"𑢽";s:4:"𑣞";s:4:"𑢾";s:4:"𑣟";s:4:"𑢿";}
\ No newline at end of file
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php
new file mode 100644
index 0000000..4b01b61
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -0,0 +1,51 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Mbstring as p;
+
+if (!function_exists('mb_strlen')) {
+ define('MB_CASE_UPPER', 0);
+ define('MB_CASE_LOWER', 1);
+ define('MB_CASE_TITLE', 2);
+
+ function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
+ function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
+ function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
+ function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
+ function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
+ function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
+ function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); }
+ function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); }
+ function mb_check_encoding($var = null, $encoding = null) { return p\Mbstring::mb_check_encoding($var, $encoding); }
+ function mb_detect_encoding($str, $encodingList = null, $strict = false) { return p\Mbstring::mb_detect_encoding($str, $encodingList, $strict); }
+ function mb_detect_order($encodingList = null) { return p\Mbstring::mb_detect_order($encodingList); }
+ function mb_parse_str($s, &$result = array()) { parse_str($s, $result); }
+ function mb_strlen($s, $enc = null) { return p\Mbstring::mb_strlen($s, $enc); }
+ function mb_strpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strpos($s, $needle, $offset, $enc); }
+ function mb_strtolower($s, $enc = null) { return p\Mbstring::mb_strtolower($s, $enc); }
+ function mb_strtoupper($s, $enc = null) { return p\Mbstring::mb_strtoupper($s, $enc); }
+ function mb_substitute_character($char = null) { return p\Mbstring::mb_substitute_character($char); }
+ function mb_substr($s, $start, $length = 2147483647, $enc = null) { return p\Mbstring::mb_substr($s, $start, $length, $enc); }
+ function mb_stripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_stripos($s, $needle, $offset, $enc); }
+ function mb_stristr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_stristr($s, $needle, $part, $enc); }
+ function mb_strrchr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrchr($s, $needle, $part, $enc); }
+ function mb_strrichr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strrichr($s, $needle, $part, $enc); }
+ function mb_strripos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strripos($s, $needle, $offset, $enc); }
+ function mb_strrpos($s, $needle, $offset = 0, $enc = null) { return p\Mbstring::mb_strrpos($s, $needle, $offset, $enc); }
+ function mb_strstr($s, $needle, $part = false, $enc = null) { return p\Mbstring::mb_strstr($s, $needle, $part, $enc); }
+ function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); }
+ function mb_http_output($enc = null) { return p\Mbstring::mb_http_output($enc); }
+ function mb_strwidth($s, $enc = null) { return p\Mbstring::mb_strwidth($s, $enc); }
+ function mb_substr_count($haystack, $needle, $enc = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $enc); }
+ function mb_output_handler($contents, $status) { return p\Mbstring::mb_output_handler($contents, $status); }
+ function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); }
+ function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $v0, $a, $b, $c, $d, $e, $f); }
+}
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
new file mode 100644
index 0000000..ef9f323
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "symfony/polyfill-mbstring",
+ "type": "library",
+ "description": "Symfony polyfill for the Mbstring extension",
+ "keywords": ["polyfill", "shim", "compatibility", "portable", "mbstring"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Mbstring\\": "" },
+ "files": [ "bootstrap.php" ]
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ }
+}
diff --git a/vendor/symfony/dependency-injection/LICENSE b/vendor/symfony/polyfill-php54/LICENSE
similarity index 96%
copy from vendor/symfony/dependency-injection/LICENSE
copy to vendor/symfony/polyfill-php54/LICENSE
index 43028bc..39fa189 100644
--- a/vendor/symfony/dependency-injection/LICENSE
+++ b/vendor/symfony/polyfill-php54/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2014-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/polyfill-php54/Php54.php b/vendor/symfony/polyfill-php54/Php54.php
new file mode 100644
index 0000000..3a7eb3a
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Php54.php
@@ -0,0 +1,42 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php54;
+
+/**
+ * @author Nicolas Grekas
+ *
+ * @internal
+ */
+final class Php54
+{
+ public static function hex2bin($data)
+ {
+ $len = strlen($data);
+
+ if (null === $len) {
+ return;
+ }
+ if ($len % 2) {
+ trigger_error('hex2bin(): Hexadecimal input string must have an even length', E_USER_WARNING);
+
+ return false;
+ }
+
+ $data = pack('H*', $data);
+
+ if (false !== strpos($data, "\0")) {
+ return false;
+ }
+
+ return $data;
+ }
+}
diff --git a/vendor/symfony/polyfill-php54/README.md b/vendor/symfony/polyfill-php54/README.md
new file mode 100644
index 0000000..d5dd463
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/README.md
@@ -0,0 +1,17 @@
+Symfony Polyfill / Php54
+========================
+
+This component provides functions unavailable in releases prior to PHP 5.4:
+
+- [`trait_exists`](http://php.net/trait_exists)
+- [`class_uses`](http://php.net/class_uses)
+- [`hex2bin`](http://php.net/hex2bin)
+- [`session_register_shutdown`](http://php.net/session_register_shutdown)
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php b/vendor/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php
new file mode 100644
index 0000000..b69db3d
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Resources/stubs/CallbackFilterIterator.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class CallbackFilterIterator extends FilterIterator
+{
+ private $iterator;
+ private $callback;
+
+ public function __construct(Iterator $iterator, $callback)
+ {
+ $this->iterator = $iterator;
+ $this->callback = $callback;
+ parent::__construct($iterator);
+ }
+
+ public function accept()
+ {
+ return call_user_func($this->callback, $this->current(), $this->key(), $this->iterator);
+ }
+}
diff --git a/vendor/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php b/vendor/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php
new file mode 100644
index 0000000..63afd38
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/Resources/stubs/RecursiveCallbackFilterIterator.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+class RecursiveCallbackFilterIterator extends CallbackFilterIterator implements RecursiveIterator
+{
+ private $iterator;
+ private $callback;
+
+ public function __construct(RecursiveIterator $iterator, $callback)
+ {
+ $this->iterator = $iterator;
+ $this->callback = $callback;
+ parent::__construct($iterator, $callback);
+ }
+
+ public function hasChildren()
+ {
+ return $this->iterator->hasChildren();
+ }
+
+ public function getChildren()
+ {
+ return new static($this->iterator->getChildren(), $this->callback);
+ }
+}
diff --git a/vendor/symfony/http-foundation/Resources/stubs/SessionHandlerInterface.php b/vendor/symfony/polyfill-php54/Resources/stubs/SessionHandlerInterface.php
similarity index 100%
rename from vendor/symfony/http-foundation/Resources/stubs/SessionHandlerInterface.php
rename to vendor/symfony/polyfill-php54/Resources/stubs/SessionHandlerInterface.php
diff --git a/vendor/symfony/polyfill-php54/bootstrap.php b/vendor/symfony/polyfill-php54/bootstrap.php
new file mode 100644
index 0000000..bb0f6b4
--- /dev/null
+++ b/vendor/symfony/polyfill-php54/bootstrap.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php54 as p;
+
+if (PHP_VERSION_ID < 50400) {
+ if (!function_exists('trait_exists')) {
+ function trait_exists($class, $autoload = true) { return $autoload && class_exists($class, $autoload) && false; }
+ }
+ if (!function_exists('class_uses')) {
+ function class_uses($class, $autoload = true) { return $autoload && class_exists($class, $autoload) && false; }
+ }
+ if (!function_exists('hex2bin')) {
+ function hex2bin($data) { return p\Php54::hex2bin($data); }
+ }
+ if (!function_exists('session_register_shutdown')) {
+ function session_register_shutdown() { register_shutdown_function('session_write_close'); }
+ }
+}
diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/polyfill-php54/composer.json
similarity index 50%
copy from vendor/symfony/http-foundation/composer.json
copy to vendor/symfony/polyfill-php54/composer.json
index 09f9679..642481f 100644
--- a/vendor/symfony/http-foundation/composer.json
+++ b/vendor/symfony/polyfill-php54/composer.json
@@ -1,14 +1,14 @@
{
- "name": "symfony/http-foundation",
+ "name": "symfony/polyfill-php54",
"type": "library",
- "description": "Symfony HttpFoundation Component",
- "keywords": [],
+ "description": "Symfony polyfill backporting some PHP 5.4+ features to lower PHP versions",
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
"homepage": "https://symfony.com",
"license": "MIT",
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
@@ -16,19 +16,17 @@
}
],
"require": {
- "php": ">=5.3.9"
- },
- "require-dev": {
- "symfony/expression-language": "~2.4"
+ "php": ">=5.3.3"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" },
+ "psr-4": { "Symfony\\Polyfill\\Php54\\": "" },
+ "files": [ "bootstrap.php" ],
"classmap": [ "Resources/stubs" ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "1.1-dev"
}
}
}
diff --git a/vendor/symfony/event-dispatcher/LICENSE b/vendor/symfony/polyfill-php55/LICENSE
similarity index 96%
copy from vendor/symfony/event-dispatcher/LICENSE
copy to vendor/symfony/polyfill-php55/LICENSE
index 43028bc..39fa189 100644
--- a/vendor/symfony/event-dispatcher/LICENSE
+++ b/vendor/symfony/polyfill-php55/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2014-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/polyfill-php55/Php55.php b/vendor/symfony/polyfill-php55/Php55.php
new file mode 100644
index 0000000..396baf2
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/Php55.php
@@ -0,0 +1,63 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Php55;
+
+/**
+ * @internal
+ */
+final class Php55
+{
+ public static function boolval($val)
+ {
+ return (bool) $val;
+ }
+
+ public static function json_last_error_msg()
+ {
+ switch (json_last_error()) {
+ case JSON_ERROR_NONE: return 'No error';
+ case JSON_ERROR_DEPTH: return 'Maximum stack depth exceeded';
+ case JSON_ERROR_STATE_MISMATCH: return 'State mismatch (invalid or malformed JSON)';
+ case JSON_ERROR_CTRL_CHAR: return 'Control character error, possibly incorrectly encoded';
+ case JSON_ERROR_SYNTAX: return 'Syntax error';
+ case JSON_ERROR_UTF8: return 'Malformed UTF-8 characters, possibly incorrectly encoded';
+ default: return 'Unknown error';
+ }
+ }
+
+ /**
+ * @author Sebastiaan Stok
+ */
+ public static function hash_pbkdf2($algorithm, $password, $salt, $iterations, $length = 0, $rawOutput = false)
+ {
+ // Number of blocks needed to create the derived key
+ $blocks = ceil($length / strlen(hash($algorithm, null, true)));
+ $digest = '';
+
+ for ($i = 1; $i <= $blocks; ++$i) {
+ $ib = $block = hash_hmac($algorithm, $salt.pack('N', $i), $password, true);
+
+ // Iterations
+ for ($j = 1; $j < $iterations; ++$j) {
+ $ib ^= ($block = hash_hmac($algorithm, $block, $password, true));
+ }
+
+ $digest .= $ib;
+ }
+
+ if (!$rawOutput) {
+ $digest = bin2hex($digest);
+ }
+
+ return substr($digest, 0, $length);
+ }
+}
diff --git a/vendor/symfony/polyfill-php55/Php55ArrayColumn.php b/vendor/symfony/polyfill-php55/Php55ArrayColumn.php
new file mode 100644
index 0000000..a3033d8
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/Php55ArrayColumn.php
@@ -0,0 +1,64 @@
+
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+namespace Symfony\Polyfill\Php55;
+
+/**
+ * @internal
+ */
+final class Php55ArrayColumn
+{
+ public static function array_column(array $input, $columnKey, $indexKey = null)
+ {
+ $output = array();
+
+ foreach ($input as $row) {
+ $key = $value = null;
+ $keySet = $valueSet = false;
+
+ if ($indexKey !== null && array_key_exists($indexKey, $row)) {
+ $keySet = true;
+ $key = (string) $row[$indexKey];
+ }
+
+ if ($columnKey === null) {
+ $valueSet = true;
+ $value = $row;
+ } elseif (is_array($row) && array_key_exists($columnKey, $row)) {
+ $valueSet = true;
+ $value = $row[$columnKey];
+ }
+
+ if ($valueSet) {
+ if ($keySet) {
+ $output[$key] = $value;
+ } else {
+ $output[] = $value;
+ }
+ }
+ }
+
+ return $output;
+ }
+}
diff --git a/vendor/symfony/polyfill-php55/README.md b/vendor/symfony/polyfill-php55/README.md
new file mode 100644
index 0000000..3e432e4
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/README.md
@@ -0,0 +1,18 @@
+Symfony Polyfill / Php55
+========================
+
+This component provides functions unavailable in releases prior to PHP 5.5:
+
+- [`boolval`](http://php.net/boolval)
+- [`json_last_error_msg`](http://php.net/json_last_error_msg)
+- [`array_column`](http://php.net/array_column)
+- [`hash_pbkdf2`](http://php.net/hash_pbkdf2)
+- `password_*` functions (from [ircmaxell/password_compat](https://github.com/ircmaxell/password_compat))
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-php55/bootstrap.php b/vendor/symfony/polyfill-php55/bootstrap.php
new file mode 100644
index 0000000..5e634fe
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/bootstrap.php
@@ -0,0 +1,27 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Php55 as p;
+
+if (PHP_VERSION_ID < 50500) {
+ if (!function_exists('boolval')) {
+ function boolval($val) { return p\Php55::boolval($val); }
+ }
+ if (!function_exists('json_last_error_msg')) {
+ function json_last_error_msg() { return p\Php55::json_last_error_msg(); }
+ }
+ if (!function_exists('array_column')) {
+ function array_column($array, $columnKey, $indexKey = null) { return p\Php55ArrayColumn::array_column($array, $columnKey, $indexKey); }
+ }
+ if (!function_exists('hash_pbkdf2')) {
+ function hash_pbkdf2($algorithm, $password, $salt, $iterations, $length = 0, $rawOutput = false) { return p\Php55::hash_pbkdf2($algorithm, $password, $salt, $iterations, $length, $rawOutput); }
+ }
+}
diff --git a/vendor/symfony/polyfill-php55/composer.json b/vendor/symfony/polyfill-php55/composer.json
new file mode 100644
index 0000000..aa2f9c6
--- /dev/null
+++ b/vendor/symfony/polyfill-php55/composer.json
@@ -0,0 +1,32 @@
+{
+ "name": "symfony/polyfill-php55",
+ "type": "library",
+ "description": "Symfony polyfill backporting some PHP 5.5+ features to lower PHP versions",
+ "keywords": ["polyfill", "shim", "compatibility", "portable"],
+ "homepage": "https://symfony.com",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "require": {
+ "php": ">=5.3.3",
+ "ircmaxell/password-compat": "~1.0"
+ },
+ "autoload": {
+ "psr-4": { "Symfony\\Polyfill\\Php55\\": "" },
+ "files": [ "bootstrap.php" ]
+ },
+ "minimum-stability": "dev",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ }
+}
diff --git a/vendor/symfony/process/Exception/ProcessFailedException.php b/vendor/symfony/process/Exception/ProcessFailedException.php
index 7523a5e..328acfd 100644
--- a/vendor/symfony/process/Exception/ProcessFailedException.php
+++ b/vendor/symfony/process/Exception/ProcessFailedException.php
@@ -28,10 +28,11 @@ public function __construct(Process $process)
throw new InvalidArgumentException('Expected a failed process, but the given process was successful.');
}
- $error = sprintf('The command "%s" failed.'."\nExit Code: %s(%s)",
+ $error = sprintf('The command "%s" failed.'."\n\nExit Code: %s(%s)\n\nWorking directory: %s",
$process->getCommandLine(),
$process->getExitCode(),
- $process->getExitCodeText()
+ $process->getExitCodeText(),
+ $process->getWorkingDirectory()
);
if (!$process->isOutputDisabled()) {
diff --git a/vendor/symfony/process/LICENSE b/vendor/symfony/process/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/process/LICENSE
+++ b/vendor/symfony/process/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php
index f8f57cc..fb29782 100644
--- a/vendor/symfony/process/PhpExecutableFinder.php
+++ b/vendor/symfony/process/PhpExecutableFinder.php
@@ -35,14 +35,17 @@ public function __construct()
*/
public function find($includeArgs = true)
{
+ $args = $this->findArguments();
+ $args = $includeArgs && $args ? ' '.implode(' ', $args) : '';
+
// HHVM support
if (defined('HHVM_VERSION')) {
- return (getenv('PHP_BINARY') ?: PHP_BINARY).($includeArgs ? ' '.implode(' ', $this->findArguments()) : '');
+ return (getenv('PHP_BINARY') ?: PHP_BINARY).$args;
}
// PHP_BINARY return the current sapi executable
- if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server')) && is_file(PHP_BINARY)) {
- return PHP_BINARY;
+ if (defined('PHP_BINARY') && PHP_BINARY && in_array(PHP_SAPI, array('cli', 'cli-server', 'phpdbg')) && is_file(PHP_BINARY)) {
+ return PHP_BINARY.$args;
}
if ($php = getenv('PHP_PATH')) {
@@ -76,9 +79,10 @@ public function findArguments()
{
$arguments = array();
- // HHVM support
if (defined('HHVM_VERSION')) {
$arguments[] = '--php';
+ } elseif ('phpdbg' === PHP_SAPI) {
+ $arguments[] = '-qrr';
}
return $arguments;
diff --git a/vendor/symfony/process/PhpProcess.php b/vendor/symfony/process/PhpProcess.php
index 1adbd97..42ecb66 100644
--- a/vendor/symfony/process/PhpProcess.php
+++ b/vendor/symfony/process/PhpProcess.php
@@ -39,6 +39,19 @@ public function __construct($script, $cwd = null, array $env = null, $timeout =
if (false === $php = $executableFinder->find()) {
$php = null;
}
+ if ('phpdbg' === PHP_SAPI) {
+ $file = tempnam(sys_get_temp_dir(), 'dbg');
+ file_put_contents($file, $script);
+ register_shutdown_function('unlink', $file);
+ $php .= ' '.ProcessUtils::escapeArgument($file);
+ $script = null;
+ }
+ if ('\\' !== DIRECTORY_SEPARATOR && null !== $php) {
+ // exec is mandatory to deal with sending a signal to the process
+ // see https://github.com/symfony/symfony/issues/5030 about prepending
+ // command with exec
+ $php = 'exec '.$php;
+ }
parent::__construct($php, $cwd, $env, $script, $timeout, $options);
}
diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php
index 699151f..df36fd5 100644
--- a/vendor/symfony/process/Process.php
+++ b/vendor/symfony/process/Process.php
@@ -54,7 +54,7 @@ class Process
private $idleTimeout;
private $options;
private $exitcode;
- private $fallbackExitcode;
+ private $fallbackStatus = array();
private $processInformation;
private $outputDisabled = false;
private $stdout;
@@ -169,8 +169,7 @@ public function __construct($commandline, $cwd = null, array $env = null, $input
public function __destruct()
{
- // stop() will check if we have a process running.
- $this->stop();
+ $this->stop(0);
}
public function __clone()
@@ -219,7 +218,7 @@ public function run($callback = null)
*/
public function mustRun($callback = null)
{
- if ($this->isSigchildEnabled() && !$this->enhanceSigchildCompatibility) {
+ if (!$this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.');
}
@@ -278,6 +277,17 @@ public function start($callback = null)
if (!isset($this->options['bypass_shell'])) {
$this->options['bypass_shell'] = true;
}
+ } elseif (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
+ // last exit code is output on the fourth pipe and caught to work around --enable-sigchild
+ $descriptors[3] = array('pipe', 'w');
+
+ // See https://unix.stackexchange.com/questions/71205/background-process-pipe-input
+ $commandline = '{ ('.$this->commandline.') <&3 3<&- 3>/dev/null & } 3<&0;';
+ $commandline .= 'pid=$!; echo $pid >&3; wait $pid; code=$?; echo $code >&3; exit $code';
+
+ // Workaround for the bug, when PTS functionality is enabled.
+ // @see : https://bugs.php.net/69442
+ $ptsWorkaround = fopen(__FILE__, 'r');
}
$this->process = proc_open($commandline, $descriptors, $this->processPipes->pipes, $this->cwd, $this->env, $this->options);
@@ -287,6 +297,10 @@ public function start($callback = null)
}
$this->status = self::STATUS_STARTED;
+ if (isset($descriptors[3])) {
+ $this->fallbackStatus['pid'] = (int) fgets($this->processPipes->pipes[3]);
+ }
+
if ($this->tty) {
return;
}
@@ -368,17 +382,9 @@ public function wait($callback = null)
* Returns the Pid (process identifier), if applicable.
*
* @return int|null The process id if running, null otherwise
- *
- * @throws RuntimeException In case --enable-sigchild is activated
*/
public function getPid()
{
- if ($this->isSigchildEnabled()) {
- throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process identifier can not be retrieved.');
- }
-
- $this->updateStatus(false);
-
return $this->isRunning() ? $this->processInformation['pid'] : null;
}
@@ -390,7 +396,7 @@ public function getPid()
* @return Process
*
* @throws LogicException In case the process is not running
- * @throws RuntimeException In case --enable-sigchild is activated
+ * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed
* @throws RuntimeException In case of failure
*/
public function signal($signal)
@@ -584,7 +590,7 @@ public function clearErrorOutput()
*/
public function getExitCode()
{
- if ($this->isSigchildEnabled() && !$this->enhanceSigchildCompatibility) {
+ if (!$this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. You must use setEnhanceSigchildCompatibility() to use this method.');
}
@@ -601,8 +607,6 @@ public function getExitCode()
*
* @return null|string A string representation for the exit status code, null if the Process is not terminated.
*
- * @throws RuntimeException In case --enable-sigchild is activated and the sigchild compatibility mode is disabled
- *
* @see http://tldp.org/LDP/abs/html/exitcodes.html
* @see http://en.wikipedia.org/wiki/Unix_signal
*/
@@ -639,12 +643,10 @@ public function hasBeenSignaled()
{
$this->requireProcessIsTerminated(__FUNCTION__);
- if ($this->isSigchildEnabled()) {
+ if (!$this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.');
}
- $this->updateStatus(false);
-
return $this->processInformation['signaled'];
}
@@ -662,12 +664,10 @@ public function getTermSignal()
{
$this->requireProcessIsTerminated(__FUNCTION__);
- if ($this->isSigchildEnabled()) {
+ if ($this->isSigchildEnabled() && (!$this->enhanceSigchildCompatibility || -1 === $this->processInformation['termsig'])) {
throw new RuntimeException('This PHP has been compiled with --enable-sigchild. Term signal can not be retrieved.');
}
- $this->updateStatus(false);
-
return $this->processInformation['termsig'];
}
@@ -684,8 +684,6 @@ public function hasBeenStopped()
{
$this->requireProcessIsTerminated(__FUNCTION__);
- $this->updateStatus(false);
-
return $this->processInformation['stopped'];
}
@@ -702,8 +700,6 @@ public function getStopSignal()
{
$this->requireProcessIsTerminated(__FUNCTION__);
- $this->updateStatus(false);
-
return $this->processInformation['stopsig'];
}
@@ -763,41 +759,33 @@ public function getStatus()
* Stops the process.
*
* @param int|float $timeout The timeout in seconds
- * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL
+ * @param int $signal A POSIX signal to send in case the process has not stop at timeout, default is SIGKILL (9)
*
* @return int The exit-code of the process
- *
- * @throws RuntimeException if the process got signaled
*/
public function stop($timeout = 10, $signal = null)
{
$timeoutMicro = microtime(true) + $timeout;
if ($this->isRunning()) {
- if ('\\' === DIRECTORY_SEPARATOR && !$this->isSigchildEnabled()) {
- exec(sprintf('taskkill /F /T /PID %d 2>&1', $this->getPid()), $output, $exitCode);
- if ($exitCode > 0) {
- throw new RuntimeException('Unable to kill the process');
- }
- }
// given `SIGTERM` may not be defined and that `proc_terminate` uses the constant value and not the constant itself, we use the same here
$this->doSignal(15, false);
do {
usleep(1000);
} while ($this->isRunning() && microtime(true) < $timeoutMicro);
- if ($this->isRunning() && !$this->isSigchildEnabled()) {
- if (null !== $signal || defined('SIGKILL')) {
- // avoid exception here :
- // process is supposed to be running, but it might have stop
- // just after this line.
- // in any case, let's silently discard the error, we can not do anything
- $this->doSignal($signal ?: SIGKILL, false);
- }
+ if ($this->isRunning()) {
+ // Avoid exception here: process is supposed to be running, but it might have stopped just
+ // after this line. In any case, let's silently discard the error, we cannot do anything.
+ $this->doSignal($signal ?: 9, false);
}
}
- $this->updateStatus(false);
- if ($this->processInformation['running']) {
+ if ($this->isRunning()) {
+ if (isset($this->fallbackStatus['pid'])) {
+ unset($this->fallbackStatus['pid']);
+
+ return $this->stop(0, $signal);
+ }
$this->close();
}
@@ -1228,14 +1216,7 @@ public static function isPtySupported()
return $result = false;
}
- $proc = @proc_open('echo 1', array(array('pty'), array('pty'), array('pty')), $pipes);
- if (is_resource($proc)) {
- proc_close($proc);
-
- return $result = true;
- }
-
- return $result = false;
+ return $result = (bool) @proc_open('echo 1', array(array('pty'), array('pty'), array('pty')), $pipes);
}
/**
@@ -1250,16 +1231,8 @@ private function getDescriptors()
} else {
$this->processPipes = UnixPipes::create($this, $this->input);
}
- $descriptors = $this->processPipes->getDescriptors($this->outputDisabled);
- if (!$this->useFileHandles && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
- // last exit code is output on the fourth pipe and caught to work around --enable-sigchild
- $descriptors = array_merge($descriptors, array(array('pipe', 'w')));
-
- $this->commandline = '('.$this->commandline.') 3>/dev/null; code=$?; echo $code >&3; exit $code';
- }
-
- return $descriptors;
+ return $this->processPipes->getDescriptors($this->outputDisabled);
}
/**
@@ -1303,10 +1276,13 @@ protected function updateStatus($blocking)
}
$this->processInformation = proc_get_status($this->process);
- $this->captureExitCode();
$this->readPipes($blocking, '\\' === DIRECTORY_SEPARATOR ? !$this->processInformation['running'] : true);
+ if ($this->fallbackStatus && $this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
+ $this->processInformation = $this->fallbackStatus + $this->processInformation;
+ }
+
if (!$this->processInformation['running']) {
$this->close();
}
@@ -1323,7 +1299,7 @@ protected function isSigchildEnabled()
return self::$sigchild;
}
- if (!function_exists('phpinfo')) {
+ if (!function_exists('phpinfo') || defined('HHVM_VERSION')) {
return self::$sigchild = false;
}
@@ -1367,25 +1343,15 @@ private function readPipes($blocking, $close)
$callback = $this->callback;
foreach ($result as $type => $data) {
- if (3 == $type) {
- $this->fallbackExitcode = (int) $data;
- } else {
+ if (3 !== $type) {
$callback($type === self::STDOUT ? self::OUT : self::ERR, $data);
+ } elseif (!isset($this->fallbackStatus['signaled'])) {
+ $this->fallbackStatus['exitcode'] = (int) $data;
}
}
}
/**
- * Captures the exitcode if mentioned in the process information.
- */
- private function captureExitCode()
- {
- if (isset($this->processInformation['exitcode']) && -1 != $this->processInformation['exitcode']) {
- $this->exitcode = $this->processInformation['exitcode'];
- }
- }
-
- /**
* Closes process resource, closes file handles, sets the exitcode.
*
* @return int The exitcode
@@ -1394,21 +1360,26 @@ private function close()
{
$this->processPipes->close();
if (is_resource($this->process)) {
- $exitcode = proc_close($this->process);
- } else {
- $exitcode = -1;
+ proc_close($this->process);
}
-
- $this->exitcode = -1 !== $exitcode ? $exitcode : (null !== $this->exitcode ? $this->exitcode : -1);
+ $this->exitcode = $this->processInformation['exitcode'];
$this->status = self::STATUS_TERMINATED;
- if (-1 === $this->exitcode && null !== $this->fallbackExitcode) {
- $this->exitcode = $this->fallbackExitcode;
- } elseif (-1 === $this->exitcode && $this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
- // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
- $this->exitcode = 128 + $this->processInformation['termsig'];
+ if (-1 === $this->exitcode) {
+ if ($this->processInformation['signaled'] && 0 < $this->processInformation['termsig']) {
+ // if process has been signaled, no exitcode but a valid termsig, apply Unix convention
+ $this->exitcode = 128 + $this->processInformation['termsig'];
+ } elseif ($this->enhanceSigchildCompatibility && $this->isSigchildEnabled()) {
+ $this->processInformation['signaled'] = true;
+ $this->processInformation['termsig'] = -1;
+ }
}
+ // Free memory from self-reference callback created by buildCallback
+ // Doing so in other contexts like __destruct or by garbage collector is ineffective
+ // Now pipes are closed, so the callback is no longer necessary
+ $this->callback = null;
+
return $this->exitcode;
}
@@ -1420,7 +1391,7 @@ private function resetProcessData()
$this->starttime = null;
$this->callback = null;
$this->exitcode = null;
- $this->fallbackExitcode = null;
+ $this->fallbackStatus = array();
$this->processInformation = null;
$this->stdout = null;
$this->stderr = null;
@@ -1440,12 +1411,12 @@ private function resetProcessData()
* @return bool True if the signal was sent successfully, false otherwise
*
* @throws LogicException In case the process is not running
- * @throws RuntimeException In case --enable-sigchild is activated
+ * @throws RuntimeException In case --enable-sigchild is activated and the process can't be killed
* @throws RuntimeException In case of failure
*/
private function doSignal($signal, $throwException)
{
- if (!$this->isRunning()) {
+ if (null === $pid = $this->getPid()) {
if ($throwException) {
throw new LogicException('Can not send signal on a non running process.');
}
@@ -1453,23 +1424,36 @@ private function doSignal($signal, $throwException)
return false;
}
- if ($this->isSigchildEnabled()) {
- if ($throwException) {
- throw new RuntimeException('This PHP has been compiled with --enable-sigchild. The process can not be signaled.');
- }
-
- return false;
- }
+ if ('\\' === DIRECTORY_SEPARATOR) {
+ exec(sprintf('taskkill /F /T /PID %d 2>&1', $pid), $output, $exitCode);
+ if ($exitCode && $this->isRunning()) {
+ if ($throwException) {
+ throw new RuntimeException(sprintf('Unable to kill the process (%s).', implode(' ', $output)));
+ }
- if (true !== @proc_terminate($this->process, $signal)) {
- if ($throwException) {
- throw new RuntimeException(sprintf('Error while sending signal `%s`.', $signal));
+ return false;
+ }
+ } else {
+ if (!$this->enhanceSigchildCompatibility || !$this->isSigchildEnabled()) {
+ $ok = @proc_terminate($this->process, $signal);
+ } elseif (function_exists('posix_kill')) {
+ $ok = @posix_kill($pid, $signal);
+ } elseif ($ok = proc_open(sprintf('kill -%d %d', $signal, $pid), array(2 => array('pipe', 'w')), $pipes)) {
+ $ok = false === fgets($pipes[2]);
}
+ if (!$ok) {
+ if ($throwException) {
+ throw new RuntimeException(sprintf('Error while sending signal `%s`.', $signal));
+ }
- return false;
+ return false;
+ }
}
- $this->latestSignal = $signal;
+ $this->latestSignal = (int) $signal;
+ $this->fallbackStatus['signaled'] = true;
+ $this->fallbackStatus['exitcode'] = -1;
+ $this->fallbackStatus['termsig'] = $this->latestSignal;
return true;
}
diff --git a/vendor/symfony/process/composer.json b/vendor/symfony/process/composer.json
index 8d21baf..b3cb518 100644
--- a/vendor/symfony/process/composer.json
+++ b/vendor/symfony/process/composer.json
@@ -19,12 +19,15 @@
"php": ">=5.3.9"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Process\\": "" }
+ "psr-4": { "Symfony\\Component\\Process\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/process/phpunit.xml.dist b/vendor/symfony/process/phpunit.xml.dist
index b5d605c..7885000 100644
--- a/vendor/symfony/process/phpunit.xml.dist
+++ b/vendor/symfony/process/phpunit.xml.dist
@@ -21,6 +21,7 @@
./
./Tests
+ ./vendor
diff --git a/vendor/symfony/routing/CHANGELOG.md b/vendor/symfony/routing/CHANGELOG.md
index b5fd9db..7f5d9f0 100644
--- a/vendor/symfony/routing/CHANGELOG.md
+++ b/vendor/symfony/routing/CHANGELOG.md
@@ -1,6 +1,13 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * allowed specifying a directory to recursively load all routing configuration files it contains
+ * Added ObjectRouteLoader and ServiceRouteLoader that allow routes to be loaded
+ by calling a method on an object/service.
+
2.5.0
-----
diff --git a/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php b/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php
index b53caaf..9fd35ea 100644
--- a/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php
+++ b/vendor/symfony/routing/Generator/Dumper/PhpGeneratorDumper.php
@@ -53,7 +53,7 @@ public function dump(array $options = array())
*/
class {$options['class']} extends {$options['base_class']}
{
- private static \$declaredRoutes = {$this->generateDeclaredRoutes()};
+ private static \$declaredRoutes;
/**
* Constructor.
@@ -62,6 +62,9 @@ public function __construct(RequestContext \$context, LoggerInterface \$logger =
{
\$this->context = \$context;
\$this->logger = \$logger;
+ if (null === self::\$declaredRoutes) {
+ self::\$declaredRoutes = {$this->generateDeclaredRoutes()};
+ }
}
{$this->generateGenerateMethod()}
@@ -104,16 +107,16 @@ private function generateDeclaredRoutes()
*/
private function generateGenerateMethod()
{
- return <<doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$referenceType, \$hostTokens, \$requiredSchemes);
+ return $this->doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes);
}
EOF;
}
diff --git a/vendor/symfony/routing/Generator/UrlGenerator.php b/vendor/symfony/routing/Generator/UrlGenerator.php
index 6798951..6e40a30 100644
--- a/vendor/symfony/routing/Generator/UrlGenerator.php
+++ b/vendor/symfony/routing/Generator/UrlGenerator.php
@@ -143,6 +143,20 @@ public function generate($name, $parameters = array(), $referenceType = self::AB
*/
protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array())
{
+ if (is_bool($referenceType) || is_string($referenceType)) {
+ @trigger_error('The hardcoded value you are using for the $referenceType argument of the '.__CLASS__.'::generate method is deprecated since version 2.8 and will not be supported anymore in 3.0. Use the constants defined in the UrlGeneratorInterface instead.', E_USER_DEPRECATED);
+
+ if (true === $referenceType) {
+ $referenceType = self::ABSOLUTE_URL;
+ } elseif (false === $referenceType) {
+ $referenceType = self::ABSOLUTE_PATH;
+ } elseif ('relative' === $referenceType) {
+ $referenceType = self::RELATIVE_PATH;
+ } elseif ('network' === $referenceType) {
+ $referenceType = self::NETWORK_PATH;
+ }
+ }
+
$variables = array_flip($variables);
$mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);
diff --git a/vendor/symfony/routing/Generator/UrlGeneratorInterface.php b/vendor/symfony/routing/Generator/UrlGeneratorInterface.php
index fc294b7..f501ebd 100644
--- a/vendor/symfony/routing/Generator/UrlGeneratorInterface.php
+++ b/vendor/symfony/routing/Generator/UrlGeneratorInterface.php
@@ -34,25 +34,25 @@
/**
* Generates an absolute URL, e.g. "http://example.com/dir/file".
*/
- const ABSOLUTE_URL = true;
+ const ABSOLUTE_URL = 0;
/**
* Generates an absolute path, e.g. "/dir/file".
*/
- const ABSOLUTE_PATH = false;
+ const ABSOLUTE_PATH = 1;
/**
* Generates a relative path based on the current request path, e.g. "../parent-file".
*
* @see UrlGenerator::getRelativePath()
*/
- const RELATIVE_PATH = 'relative';
+ const RELATIVE_PATH = 2;
/**
* Generates a network path, e.g. "//example.com/dir/file".
* Such reference reuses the current scheme but specifies the host.
*/
- const NETWORK_PATH = 'network';
+ const NETWORK_PATH = 3;
/**
* Generates a URL or path for a specific route based on the given parameters.
@@ -69,9 +69,9 @@
*
* If there is no route with the given name, the generator must throw the RouteNotFoundException.
*
- * @param string $name The name of the route
- * @param mixed $parameters An array of parameters
- * @param bool|string $referenceType The type of reference to be generated (one of the constants)
+ * @param string $name The name of the route
+ * @param mixed $parameters An array of parameters
+ * @param int $referenceType The type of reference to be generated (one of the constants)
*
* @return string The generated URL
*
diff --git a/vendor/symfony/routing/LICENSE b/vendor/symfony/routing/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/routing/LICENSE
+++ b/vendor/symfony/routing/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php b/vendor/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php
new file mode 100644
index 0000000..6938257
--- /dev/null
+++ b/vendor/symfony/routing/Loader/DependencyInjection/ServiceRouterLoader.php
@@ -0,0 +1,40 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Routing\Loader\ObjectRouteLoader;
+
+/**
+ * A route loader that executes a service to load the routes.
+ *
+ * This depends on the DependencyInjection component.
+ *
+ * @author Ryan Weaver
+ */
+class ServiceRouterLoader extends ObjectRouteLoader
+{
+ /**
+ * @var ContainerInterface
+ */
+ private $container;
+
+ public function __construct(ContainerInterface $container)
+ {
+ $this->container = $container;
+ }
+
+ protected function getServiceObject($id)
+ {
+ return $this->container->get($id);
+ }
+}
diff --git a/vendor/symfony/routing/Loader/DirectoryLoader.php b/vendor/symfony/routing/Loader/DirectoryLoader.php
new file mode 100644
index 0000000..4bb5b31
--- /dev/null
+++ b/vendor/symfony/routing/Loader/DirectoryLoader.php
@@ -0,0 +1,58 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\FileLoader;
+use Symfony\Component\Routing\RouteCollection;
+use Symfony\Component\Config\Resource\DirectoryResource;
+
+class DirectoryLoader extends FileLoader
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function load($file, $type = null)
+ {
+ $path = $this->locator->locate($file);
+
+ $collection = new RouteCollection();
+ $collection->addResource(new DirectoryResource($path));
+
+ foreach (scandir($path) as $dir) {
+ if ('.' !== $dir[0]) {
+ $this->setCurrentDir($path);
+ $subPath = $path.'/'.$dir;
+ $subType = null;
+
+ if (is_dir($subPath)) {
+ $subPath .= '/';
+ $subType = 'directory';
+ }
+
+ $subCollection = $this->import($subPath, $subType, false, $path);
+ $collection->addCollection($subCollection);
+ }
+ }
+
+ return $collection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function supports($resource, $type = null)
+ {
+ // only when type is forced to directory, not to conflict with AnnotationLoader
+
+ return 'directory' === $type;
+ }
+}
diff --git a/vendor/symfony/routing/Loader/ObjectRouteLoader.php b/vendor/symfony/routing/Loader/ObjectRouteLoader.php
new file mode 100644
index 0000000..65d0ce3
--- /dev/null
+++ b/vendor/symfony/routing/Loader/ObjectRouteLoader.php
@@ -0,0 +1,93 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing\Loader;
+
+use Symfony\Component\Config\Loader\Loader;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * A route loader that calls a method on an object to load the routes.
+ *
+ * @author Ryan Weaver
+ */
+abstract class ObjectRouteLoader extends Loader
+{
+ /**
+ * Returns the object that the method will be called on to load routes.
+ *
+ * For example, if your application uses a service container,
+ * the $id may be a service id.
+ *
+ * @param string $id
+ *
+ * @return object
+ */
+ abstract protected function getServiceObject($id);
+
+ /**
+ * Calls the service that will load the routes.
+ *
+ * @param mixed $resource Some value that will resolve to a callable
+ * @param string|null $type The resource type
+ *
+ * @return RouteCollection
+ */
+ public function load($resource, $type = null)
+ {
+ $parts = explode(':', $resource);
+ if (count($parts) != 2) {
+ throw new \InvalidArgumentException(sprintf('Invalid resource "%s" passed to the "service" route loader: use the format "service_name:methodName"', $resource));
+ }
+
+ $serviceString = $parts[0];
+ $method = $parts[1];
+
+ $loaderObject = $this->getServiceObject($serviceString);
+
+ if (!is_object($loaderObject)) {
+ throw new \LogicException(sprintf('%s:getServiceObject() must return an object: %s returned', get_class($this), gettype($loaderObject)));
+ }
+
+ if (!method_exists($loaderObject, $method)) {
+ throw new \BadMethodCallException(sprintf('Method "%s" not found on "%s" when importing routing resource "%s"', $method, get_class($loaderObject), $resource));
+ }
+
+ $routeCollection = call_user_func(array($loaderObject, $method), $this);
+
+ if (!$routeCollection instanceof RouteCollection) {
+ $type = is_object($routeCollection) ? get_class($routeCollection) : gettype($routeCollection);
+
+ throw new \LogicException(sprintf('The %s::%s method must return a RouteCollection: %s returned', get_class($loaderObject), $method, $type));
+ }
+
+ // make the service file tracked so that if it changes, the cache rebuilds
+ $this->addClassResource(new \ReflectionClass($loaderObject), $routeCollection);
+
+ return $routeCollection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function supports($resource, $type = null)
+ {
+ return 'service' === $type;
+ }
+
+ private function addClassResource(\ReflectionClass $class, RouteCollection $collection)
+ {
+ do {
+ $collection->addResource(new FileResource($class->getFileName()));
+ } while ($class = $class->getParentClass());
+ }
+}
diff --git a/vendor/symfony/routing/RouteCollectionBuilder.php b/vendor/symfony/routing/RouteCollectionBuilder.php
new file mode 100644
index 0000000..89814b2
--- /dev/null
+++ b/vendor/symfony/routing/RouteCollectionBuilder.php
@@ -0,0 +1,373 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Routing;
+
+use Symfony\Component\Config\Exception\FileLoaderLoadException;
+use Symfony\Component\Config\Loader\LoaderInterface;
+use Symfony\Component\Config\Resource\ResourceInterface;
+
+/**
+ * Helps add and import routes into a RouteCollection.
+ *
+ * @author Ryan Weaver
+ */
+class RouteCollectionBuilder
+{
+ /**
+ * @var Route[]|RouteCollectionBuilder[]
+ */
+ private $routes = array();
+
+ private $loader;
+ private $defaults = array();
+ private $prefix;
+ private $host;
+ private $condition;
+ private $requirements = array();
+ private $options = array();
+ private $schemes;
+ private $methods;
+ private $resources = array();
+
+ /**
+ * @param LoaderInterface $loader
+ */
+ public function __construct(LoaderInterface $loader = null)
+ {
+ $this->loader = $loader;
+ }
+
+ /**
+ * Import an external routing resource and returns the RouteCollectionBuilder.
+ *
+ * $routes->import('blog.yml', '/blog');
+ *
+ * @param mixed $resource
+ * @param string|null $prefix
+ * @param string $type
+ *
+ * @return RouteCollectionBuilder
+ *
+ * @throws FileLoaderLoadException
+ */
+ public function import($resource, $prefix = '/', $type = null)
+ {
+ /** @var RouteCollection $collection */
+ $collection = $this->load($resource, $type);
+
+ // create a builder from the RouteCollection
+ $builder = $this->createBuilder();
+ foreach ($collection->all() as $name => $route) {
+ $builder->addRoute($route, $name);
+ }
+
+ foreach ($collection->getResources() as $resource) {
+ $builder->addResource($resource);
+ }
+
+ // mount into this builder
+ $this->mount($prefix, $builder);
+
+ return $builder;
+ }
+
+ /**
+ * Adds a route and returns it for future modification.
+ *
+ * @param string $path The route path
+ * @param string $controller The route's controller
+ * @param string|null $name The name to give this route
+ *
+ * @return Route
+ */
+ public function add($path, $controller, $name = null)
+ {
+ $route = new Route($path);
+ $route->setDefault('_controller', $controller);
+ $this->addRoute($route, $name);
+
+ return $route;
+ }
+
+ /**
+ * Returns a RouteCollectionBuilder that can be configured and then added with mount().
+ *
+ * @return RouteCollectionBuilder
+ */
+ public function createBuilder()
+ {
+ return new self($this->loader);
+ }
+
+ /**
+ * Add a RouteCollectionBuilder.
+ *
+ * @param string $prefix
+ * @param RouteCollectionBuilder $builder
+ */
+ public function mount($prefix, RouteCollectionBuilder $builder)
+ {
+ $builder->prefix = trim(trim($prefix), '/');
+ $this->routes[] = $builder;
+ }
+
+ /**
+ * Adds a Route object to the builder.
+ *
+ * @param Route $route
+ * @param string|null $name
+ *
+ * @return $this
+ */
+ public function addRoute(Route $route, $name = null)
+ {
+ if (null === $name) {
+ // used as a flag to know which routes will need a name later
+ $name = '_unnamed_route_'.spl_object_hash($route);
+ }
+
+ $this->routes[$name] = $route;
+
+ return $this;
+ }
+
+ /**
+ * Sets the host on all embedded routes (unless already set).
+ *
+ * @param string $pattern
+ *
+ * @return $this
+ */
+ public function setHost($pattern)
+ {
+ $this->host = $pattern;
+
+ return $this;
+ }
+
+ /**
+ * Sets a condition on all embedded routes (unless already set).
+ *
+ * @param string $condition
+ *
+ * @return $this
+ */
+ public function setCondition($condition)
+ {
+ $this->condition = $condition;
+
+ return $this;
+ }
+
+ /**
+ * Sets a default value that will be added to all embedded routes (unless that
+ * default value is already set.
+ *
+ * @param string $key
+ * @param mixed $value
+ *
+ * @return $this
+ */
+ public function setDefault($key, $value)
+ {
+ $this->defaults[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Sets a requirement that will be added to all embedded routes (unless that
+ * requirement is already set.
+ *
+ * @param string $key
+ * @param mixed $regex
+ *
+ * @return $this
+ */
+ public function setRequirement($key, $regex)
+ {
+ $this->requirements[$key] = $regex;
+
+ return $this;
+ }
+
+ /**
+ * Sets an opiton that will be added to all embedded routes (unless that
+ * option is already set.
+ *
+ * @param string $key
+ * @param mixed $value
+ *
+ * @return $this
+ */
+ public function setOption($key, $value)
+ {
+ $this->options[$key] = $value;
+
+ return $this;
+ }
+
+ /**
+ * Sets the schemes on all embedded routes (unless already set).
+ *
+ * @param array|string $schemes
+ *
+ * @return $this
+ */
+ public function setSchemes($schemes)
+ {
+ $this->schemes = $schemes;
+
+ return $this;
+ }
+
+ /**
+ * Sets the methods on all embedded routes (unless already set).
+ *
+ * @param array|string $methods
+ *
+ * @return $this
+ */
+ public function setMethods($methods)
+ {
+ $this->methods = $methods;
+
+ return $this;
+ }
+
+ /**
+ * Adds a resource for this collection.
+ *
+ * @param ResourceInterface $resource
+ *
+ * @return $this
+ */
+ private function addResource(ResourceInterface $resource)
+ {
+ $this->resources[] = $resource;
+
+ return $this;
+ }
+
+ /**
+ * Creates the final RouteCollection and returns it.
+ *
+ * @return RouteCollection
+ */
+ public function build()
+ {
+ $routeCollection = new RouteCollection();
+
+ foreach ($this->routes as $name => $route) {
+ if ($route instanceof Route) {
+ $route->setDefaults(array_merge($this->defaults, $route->getDefaults()));
+ $route->setOptions(array_merge($this->options, $route->getOptions()));
+
+ // we're extra careful here to avoid re-setting deprecated _method and _scheme
+ foreach ($this->requirements as $key => $val) {
+ if (!$route->hasRequirement($key)) {
+ $route->setRequirement($key, $val);
+ }
+ }
+
+ if (null !== $this->prefix) {
+ $route->setPath('/'.$this->prefix.$route->getPath());
+ }
+
+ if (!$route->getHost()) {
+ $route->setHost($this->host);
+ }
+
+ if (!$route->getCondition()) {
+ $route->setCondition($this->condition);
+ }
+
+ if (!$route->getSchemes()) {
+ $route->setSchemes($this->schemes);
+ }
+
+ if (!$route->getMethods()) {
+ $route->setMethods($this->methods);
+ }
+
+ // auto-generate the route name if it's been marked
+ if ('_unnamed_route_' === substr($name, 0, 15)) {
+ $name = $this->generateRouteName($route);
+ }
+
+ $routeCollection->add($name, $route);
+ } else {
+ /* @var self $route */
+ $subCollection = $route->build();
+ $subCollection->addPrefix($this->prefix);
+
+ $routeCollection->addCollection($subCollection);
+ }
+
+ foreach ($this->resources as $resource) {
+ $routeCollection->addResource($resource);
+ }
+ }
+
+ return $routeCollection;
+ }
+
+ /**
+ * Generates a route name based on details of this route.
+ *
+ * @return string
+ */
+ private function generateRouteName(Route $route)
+ {
+ $methods = implode('_', $route->getMethods()).'_';
+
+ $routeName = $methods.$route->getPath();
+ $routeName = str_replace(array('/', ':', '|', '-'), '_', $routeName);
+ $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName);
+
+ // Collapse consecutive underscores down into a single underscore.
+ $routeName = preg_replace('/_+/', '_', $routeName);
+
+ return $routeName;
+ }
+
+ /**
+ * Finds a loader able to load an imported resource and loads it.
+ *
+ * @param mixed $resource A resource
+ * @param string|null $type The resource type or null if unknown
+ *
+ * @return RouteCollection
+ *
+ * @throws FileLoaderLoadException If no loader is found
+ */
+ private function load($resource, $type = null)
+ {
+ if (null === $this->loader) {
+ throw new \BadMethodCallException('Cannot import other routing resources: you must pass a LoaderInterface when constructing RouteCollectionBuilder.');
+ }
+
+ if ($this->loader->supports($resource, $type)) {
+ return $this->loader->load($resource, $type);
+ }
+
+ if (null === $resolver = $this->loader->getResolver()) {
+ throw new FileLoaderLoadException($resource);
+ }
+
+ if (false === $loader = $resolver->resolve($resource, $type)) {
+ throw new FileLoaderLoadException($resource);
+ }
+
+ return $loader->load($resource, $type);
+ }
+}
diff --git a/vendor/symfony/routing/composer.json b/vendor/symfony/routing/composer.json
index 02837f6..9028e79 100644
--- a/vendor/symfony/routing/composer.json
+++ b/vendor/symfony/routing/composer.json
@@ -19,10 +19,10 @@
"php": ">=5.3.9"
},
"require-dev": {
- "symfony/config": "~2.7",
- "symfony/http-foundation": "~2.3",
- "symfony/yaml": "~2.0,>=2.0.5",
- "symfony/expression-language": "~2.4",
+ "symfony/config": "~2.7|~3.0.0",
+ "symfony/http-foundation": "~2.3|~3.0.0",
+ "symfony/yaml": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/expression-language": "~2.4|~3.0.0",
"doctrine/annotations": "~1.0",
"doctrine/common": "~2.2",
"psr/log": "~1.0"
@@ -34,15 +34,19 @@
"symfony/config": "For using the all-in-one router or any loader",
"symfony/yaml": "For using the YAML loader",
"symfony/expression-language": "For using expression matching",
- "doctrine/annotations": "For using the annotation loader"
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/dependency-injection": "For loading routes from a service"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Routing\\": "" }
+ "psr-4": { "Symfony\\Component\\Routing\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/routing/phpunit.xml.dist b/vendor/symfony/routing/phpunit.xml.dist
index a908308..b69f066 100644
--- a/vendor/symfony/routing/phpunit.xml.dist
+++ b/vendor/symfony/routing/phpunit.xml.dist
@@ -20,8 +20,8 @@
./
- ./vendor
./Tests
+ ./vendor
diff --git a/vendor/symfony/serializer/Encoder/JsonDecode.php b/vendor/symfony/serializer/Encoder/JsonDecode.php
index 5f5f289..8925ec3 100644
--- a/vendor/symfony/serializer/Encoder/JsonDecode.php
+++ b/vendor/symfony/serializer/Encoder/JsonDecode.php
@@ -108,7 +108,7 @@ public function decode($data, $format, array $context = array())
}
if (JSON_ERROR_NONE !== $this->lastError = json_last_error()) {
- throw new UnexpectedValueException(JsonEncoder::getLastErrorMessage());
+ throw new UnexpectedValueException(json_last_error_msg());
}
return $decodedData;
diff --git a/vendor/symfony/serializer/Encoder/JsonEncode.php b/vendor/symfony/serializer/Encoder/JsonEncode.php
index 3a6b2fd..454c0d6 100644
--- a/vendor/symfony/serializer/Encoder/JsonEncode.php
+++ b/vendor/symfony/serializer/Encoder/JsonEncode.php
@@ -56,7 +56,7 @@ public function encode($data, $format, array $context = array())
$encodedJson = json_encode($data, $context['json_encode_options']);
if (JSON_ERROR_NONE !== $this->lastError = json_last_error()) {
- throw new UnexpectedValueException(JsonEncoder::getLastErrorMessage());
+ throw new UnexpectedValueException(json_last_error_msg());
}
return $encodedJson;
diff --git a/vendor/symfony/serializer/Encoder/JsonEncoder.php b/vendor/symfony/serializer/Encoder/JsonEncoder.php
index 284f579..159d435 100644
--- a/vendor/symfony/serializer/Encoder/JsonEncoder.php
+++ b/vendor/symfony/serializer/Encoder/JsonEncoder.php
@@ -100,26 +100,13 @@ public function supportsDecoding($format)
* Resolves json_last_error message.
*
* @return string
+ *
+ * @deprecated since 2.8, to be removed in 3.0. Use json_last_error_msg() instead.
*/
public static function getLastErrorMessage()
{
- if (function_exists('json_last_error_msg')) {
- return json_last_error_msg();
- }
-
- switch (json_last_error()) {
- case JSON_ERROR_DEPTH:
- return 'Maximum stack depth exceeded';
- case JSON_ERROR_STATE_MISMATCH:
- return 'Underflow or the modes mismatch';
- case JSON_ERROR_CTRL_CHAR:
- return 'Unexpected control character found';
- case JSON_ERROR_SYNTAX:
- return 'Syntax error, malformed JSON';
- case JSON_ERROR_UTF8:
- return 'Malformed UTF-8 characters, possibly incorrectly encoded';
- default:
- return 'Unknown error';
- }
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use json_last_error_msg() instead.', E_USER_DEPRECATED);
+
+ return json_last_error_msg();
}
}
diff --git a/vendor/symfony/validator/Constraints/GroupSequenceProvider.php b/vendor/symfony/serializer/Exception/BadMethodCallException.php
similarity index 55%
copy from vendor/symfony/validator/Constraints/GroupSequenceProvider.php
copy to vendor/symfony/serializer/Exception/BadMethodCallException.php
index 3904473..b2f3d61 100644
--- a/vendor/symfony/validator/Constraints/GroupSequenceProvider.php
+++ b/vendor/symfony/serializer/Exception/BadMethodCallException.php
@@ -9,14 +9,8 @@
* file that was distributed with this source code.
*/
-namespace Symfony\Component\Validator\Constraints;
+namespace Symfony\Component\Serializer\Exception;
-/**
- * Annotation to define a group sequence provider.
- *
- * @Annotation
- * @Target({"CLASS", "ANNOTATION"})
- */
-class GroupSequenceProvider
+class BadMethodCallException extends \BadMethodCallException implements ExceptionInterface
{
}
diff --git a/vendor/symfony/serializer/LICENSE b/vendor/symfony/serializer/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/serializer/LICENSE
+++ b/vendor/symfony/serializer/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php b/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php
index 0701a58..6bb3027 100644
--- a/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php
+++ b/vendor/symfony/serializer/Mapping/AttributeMetadataInterface.php
@@ -16,6 +16,8 @@
*
* Primarily, the metadata stores serialization groups.
*
+ * @internal
+ *
* @author Kévin Dunglas
*/
interface AttributeMetadataInterface
diff --git a/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php b/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php
index c967666..5889f0d 100644
--- a/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php
+++ b/vendor/symfony/serializer/Mapping/ClassMetadataInterface.php
@@ -14,7 +14,11 @@
/**
* Stores metadata needed for serializing and deserializing objects of specific class.
*
- * Primarily, the metadata stores the list of attributes to serialize or deserialize.
+ * Primarily, the metadata stores the set of attributes to serialize or deserialize.
+ *
+ * There may only exist one metadata for each attribute according to its name.
+ *
+ * @internal
*
* @author Kévin Dunglas
*/
diff --git a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
index 55c60c0..ae184bb 100644
--- a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php
@@ -259,7 +259,7 @@ protected function getAllowedAttributes($classOrObject, array $context, $attribu
}
}
- return array_unique($allowedAttributes);
+ return $allowedAttributes;
}
/**
@@ -279,7 +279,9 @@ protected function prepareForDenormalization($data)
* Instantiates an object using constructor parameters when needed.
*
* This method also allows to denormalize data into an existing object if
- * it is present in the context with the object_to_populate key.
+ * it is present in the context with the object_to_populate. This object
+ * is removed from the context before being returned to avoid side effects
+ * when recursively normalizing an object graph.
*
* @param array $data
* @param string $class
@@ -296,9 +298,12 @@ protected function instantiateObject(array &$data, $class, array &$context, \Ref
if (
isset($context['object_to_populate']) &&
is_object($context['object_to_populate']) &&
- $class === get_class($context['object_to_populate'])
+ $context['object_to_populate'] instanceof $class
) {
- return $context['object_to_populate'];
+ $object = $context['object_to_populate'];
+ unset($context['object_to_populate']);
+
+ return $object;
}
$constructor = $reflectionClass->getConstructor();
diff --git a/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php b/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php
new file mode 100644
index 0000000..921e312
--- /dev/null
+++ b/vendor/symfony/serializer/Normalizer/ArrayDenormalizer.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Serializer\Normalizer;
+
+use Symfony\Component\Serializer\Exception\BadMethodCallException;
+use Symfony\Component\Serializer\Exception\InvalidArgumentException;
+use Symfony\Component\Serializer\SerializerAwareInterface;
+use Symfony\Component\Serializer\SerializerInterface;
+
+/**
+ * Denormalizes arrays of objects.
+ *
+ * @author Alexander M. Turek
+ */
+class ArrayDenormalizer implements DenormalizerInterface, SerializerAwareInterface
+{
+ /**
+ * @var SerializerInterface|DenormalizerInterface
+ */
+ private $serializer;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function denormalize($data, $class, $format = null, array $context = array())
+ {
+ if ($this->serializer === null) {
+ throw new BadMethodCallException('Please set a serializer before calling denormalize()!');
+ }
+ if (!is_array($data)) {
+ throw new InvalidArgumentException('Data expected to be an array, '.gettype($data).' given.');
+ }
+ if (substr($class, -2) !== '[]') {
+ throw new InvalidArgumentException('Unsupported class: '.$class);
+ }
+
+ $serializer = $this->serializer;
+ $class = substr($class, 0, -2);
+
+ return array_map(
+ function ($data) use ($serializer, $class, $format, $context) {
+ return $serializer->denormalize($data, $class, $format, $context);
+ },
+ $data
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function supportsDenormalization($data, $type, $format = null)
+ {
+ return substr($type, -2) === '[]'
+ && $this->serializer->supportsDenormalization($data, substr($type, 0, -2), $format);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setSerializer(SerializerInterface $serializer)
+ {
+ if (!$serializer instanceof DenormalizerInterface) {
+ throw new InvalidArgumentException('Expected a serializer that also implements DenormalizerInterface.');
+ }
+
+ $this->serializer = $serializer;
+ }
+}
diff --git a/vendor/symfony/serializer/Normalizer/CustomNormalizer.php b/vendor/symfony/serializer/Normalizer/CustomNormalizer.php
index 83c3c14..7df266a 100644
--- a/vendor/symfony/serializer/Normalizer/CustomNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/CustomNormalizer.php
@@ -59,6 +59,10 @@ public function supportsNormalization($data, $format = null)
*/
public function supportsDenormalization($data, $type, $format = null)
{
+ if (!class_exists($type)) {
+ return false;
+ }
+
$class = new \ReflectionClass($type);
return $class->isSubclassOf('Symfony\Component\Serializer\Normalizer\DenormalizableInterface');
diff --git a/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php b/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php
index 44a71cf..fc7ac9f 100644
--- a/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/GetSetMethodNormalizer.php
@@ -114,7 +114,7 @@ public function denormalize($data, $class, $format = null, array $context = arra
if ($allowed && !$ignored) {
$setter = 'set'.ucfirst($attribute);
- if (in_array($setter, $classMethods)) {
+ if (in_array($setter, $classMethods) && !$reflectionClass->getMethod($setter)->isStatic()) {
$object->$setter($value);
}
}
@@ -136,7 +136,7 @@ public function supportsNormalization($data, $format = null)
*/
public function supportsDenormalization($data, $type, $format = null)
{
- return $this->supports($type);
+ return class_exists($type) && $this->supports($type);
}
/**
@@ -170,10 +170,13 @@ private function isGetMethod(\ReflectionMethod $method)
{
$methodLength = strlen($method->name);
- return (
- ((0 === strpos($method->name, 'get') && 3 < $methodLength) ||
- (0 === strpos($method->name, 'is') && 2 < $methodLength)) &&
- 0 === $method->getNumberOfRequiredParameters()
- );
+ return
+ !$method->isStatic() &&
+ (
+ ((0 === strpos($method->name, 'get') && 3 < $methodLength) ||
+ (0 === strpos($method->name, 'is') && 2 < $methodLength)) &&
+ 0 === $method->getNumberOfRequiredParameters()
+ )
+ ;
}
}
diff --git a/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php b/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php
index ba84ac7..0fde269 100644
--- a/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/ObjectNormalizer.php
@@ -26,6 +26,8 @@
*/
class ObjectNormalizer extends AbstractNormalizer
{
+ private $attributesCache = array();
+
/**
* @var PropertyAccessorInterface
*/
@@ -53,44 +55,15 @@ public function supportsNormalization($data, $format = null)
*/
public function normalize($object, $format = null, array $context = array())
{
+ if (!isset($context['cache_key'])) {
+ $context['cache_key'] = $this->getCacheKey($context);
+ }
if ($this->isCircularReference($object, $context)) {
return $this->handleCircularReference($object);
}
$data = array();
- $attributes = $this->getAllowedAttributes($object, $context, true);
-
- // If not using groups, detect manually
- if (false === $attributes) {
- $attributes = array();
-
- // methods
- $reflClass = new \ReflectionClass($object);
- foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflMethod) {
- if (
- !$reflMethod->isConstructor() &&
- !$reflMethod->isDestructor() &&
- 0 === $reflMethod->getNumberOfRequiredParameters()
- ) {
- $name = $reflMethod->getName();
-
- if (strpos($name, 'get') === 0 || strpos($name, 'has') === 0) {
- // getters and hassers
- $attributes[lcfirst(substr($name, 3))] = true;
- } elseif (strpos($name, 'is') === 0) {
- // issers
- $attributes[lcfirst(substr($name, 2))] = true;
- }
- }
- }
-
- // properties
- foreach ($reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $reflProperty) {
- $attributes[$reflProperty->getName()] = true;
- }
-
- $attributes = array_keys($attributes);
- }
+ $attributes = $this->getAttributes($object, $context);
foreach ($attributes as $attribute) {
if (in_array($attribute, $this->ignoredAttributes)) {
@@ -134,6 +107,9 @@ public function supportsDenormalization($data, $type, $format = null)
*/
public function denormalize($data, $class, $format = null, array $context = array())
{
+ if (!isset($context['cache_key'])) {
+ $context['cache_key'] = $this->getCacheKey($context);
+ }
$allowedAttributes = $this->getAllowedAttributes($class, $context, true);
$normalizedData = $this->prepareForDenormalization($data);
@@ -159,4 +135,95 @@ public function denormalize($data, $class, $format = null, array $context = arra
return $object;
}
+
+ private function getCacheKey(array $context)
+ {
+ try {
+ return md5(serialize($context));
+ } catch (\Exception $exception) {
+ // The context cannot be serialized, skip the cache
+ return false;
+ }
+ }
+
+ /**
+ * Gets and caches attributes for this class and context.
+ *
+ * @param object $object
+ * @param array $context
+ *
+ * @return string[]
+ */
+ private function getAttributes($object, array $context)
+ {
+ $class = get_class($object);
+ $key = $class.'-'.$context['cache_key'];
+
+ if (isset($this->attributesCache[$key])) {
+ return $this->attributesCache[$key];
+ }
+
+ $allowedAttributes = $this->getAllowedAttributes($object, $context, true);
+
+ if (false !== $allowedAttributes) {
+ if ($context['cache_key']) {
+ $this->attributesCache[$key] = $allowedAttributes;
+ }
+
+ return $allowedAttributes;
+ }
+
+ if (isset($this->attributesCache[$class])) {
+ return $this->attributesCache[$class];
+ }
+
+ return $this->attributesCache[$class] = $this->extractAttributes($object);
+ }
+
+ /**
+ * Extracts attributes for this class and context.
+ *
+ * @param object $object
+ *
+ * @return string[]
+ */
+ private function extractAttributes($object)
+ {
+ // If not using groups, detect manually
+ $attributes = array();
+
+ // methods
+ $reflClass = new \ReflectionClass($object);
+ foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflMethod) {
+ if (
+ $reflMethod->getNumberOfRequiredParameters() !== 0 ||
+ $reflMethod->isStatic() ||
+ $reflMethod->isConstructor() ||
+ $reflMethod->isDestructor()
+ ) {
+ continue;
+ }
+
+ $name = $reflMethod->name;
+
+ if (0 === strpos($name, 'get') || 0 === strpos($name, 'has')) {
+ // getters and hassers
+ $attributes[lcfirst(substr($name, 3))] = true;
+ } elseif (strpos($name, 'is') === 0) {
+ // issers
+ $attributes[lcfirst(substr($name, 2))] = true;
+ }
+ }
+
+ // properties
+ foreach ($reflClass->getProperties(\ReflectionProperty::IS_PUBLIC) as $reflProperty) {
+ if ($reflProperty->isStatic()) {
+ continue;
+ }
+
+ $attributes[$reflProperty->name] = true;
+ }
+
+ return array_keys($attributes);
+ }
}
diff --git a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php
index c8e83d1..993046f 100644
--- a/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php
+++ b/vendor/symfony/serializer/Normalizer/PropertyNormalizer.php
@@ -50,7 +50,7 @@ public function normalize($object, $format = null, array $context = array())
$allowedAttributes = $this->getAllowedAttributes($object, $context, true);
foreach ($reflectionObject->getProperties() as $property) {
- if (in_array($property->name, $this->ignoredAttributes)) {
+ if (in_array($property->name, $this->ignoredAttributes) || $property->isStatic()) {
continue;
}
@@ -110,6 +110,10 @@ public function denormalize($data, $class, $format = null, array $context = arra
if ($allowed && !$ignored && $reflectionClass->hasProperty($propertyName)) {
$property = $reflectionClass->getProperty($propertyName);
+ if ($property->isStatic()) {
+ continue;
+ }
+
// Override visibility
if (!$property->isPublic()) {
$property->setAccessible(true);
@@ -135,7 +139,7 @@ public function supportsNormalization($data, $format = null)
*/
public function supportsDenormalization($data, $type, $format = null)
{
- return $this->supports($type);
+ return class_exists($type) && $this->supports($type);
}
/**
diff --git a/vendor/symfony/serializer/Serializer.php b/vendor/symfony/serializer/Serializer.php
index 4aeddab..eb83544 100644
--- a/vendor/symfony/serializer/Serializer.php
+++ b/vendor/symfony/serializer/Serializer.php
@@ -187,17 +187,10 @@ private function getNormalizer($data, $format)
{
if ($isObject = is_object($data)) {
$class = get_class($data);
- if (isset($this->normalizerCache[$class][$format])) {
- return $this->normalizerCache[$class][$format];
- }
}
foreach ($this->normalizers as $normalizer) {
if ($normalizer instanceof NormalizerInterface && $normalizer->supportsNormalization($data, $format)) {
- if ($isObject) {
- $this->normalizerCache[$class][$format] = $normalizer;
- }
-
return $normalizer;
}
}
@@ -214,14 +207,8 @@ private function getNormalizer($data, $format)
*/
private function getDenormalizer($data, $class, $format)
{
- if (isset($this->denormalizerCache[$class][$format])) {
- return $this->denormalizerCache[$class][$format];
- }
-
foreach ($this->normalizers as $normalizer) {
if ($normalizer instanceof DenormalizerInterface && $normalizer->supportsDenormalization($data, $class, $format)) {
- $this->denormalizerCache[$class][$format] = $normalizer;
-
return $normalizer;
}
}
@@ -264,6 +251,7 @@ private function normalizeObject($object, $format, array $context = array())
if ($normalizer = $this->getNormalizer($object, $format)) {
return $normalizer->normalize($object, $format, $context);
}
+
throw new UnexpectedValueException(sprintf('Could not normalize object of type %s, no supporting normalizer found.', get_class($object)));
}
@@ -289,6 +277,15 @@ private function denormalizeObject($data, $class, $format, array $context = arra
if ($normalizer = $this->getDenormalizer($data, $class, $format)) {
return $normalizer->denormalize($data, $class, $format, $context);
}
+
+ foreach ($this->normalizers as $normalizer) {
+ if ($normalizer instanceof DenormalizerInterface
+ && $normalizer->supportsDenormalization($data, $class, $format)) {
+
+ return $normalizer->denormalize($data, $class, $format, $context);
+ }
+ }
+
throw new UnexpectedValueException(sprintf('Could not denormalize object of type %s, no supporting normalizer found.', $class));
}
diff --git a/vendor/symfony/serializer/composer.json b/vendor/symfony/serializer/composer.json
index 0db008b..88b7832 100644
--- a/vendor/symfony/serializer/composer.json
+++ b/vendor/symfony/serializer/composer.json
@@ -16,12 +16,13 @@
}
],
"require": {
- "php": ">=5.3.9"
+ "php": ">=5.3.9",
+ "symfony/polyfill-php55": "~1.0"
},
"require-dev": {
- "symfony/yaml": "~2.0,>=2.0.5",
- "symfony/config": "~2.2",
- "symfony/property-access": "~2.3",
+ "symfony/yaml": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/config": "~2.2|~3.0.0",
+ "symfony/property-access": "~2.3|~3.0.0",
"doctrine/annotations": "~1.0",
"doctrine/cache": "~1.0"
},
@@ -33,12 +34,15 @@
"symfony/property-access": "For using the ObjectNormalizer."
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Serializer\\": "" }
+ "psr-4": { "Symfony\\Component\\Serializer\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/serializer/phpunit.xml.dist b/vendor/symfony/serializer/phpunit.xml.dist
index 279e1eb..4799e3c 100644
--- a/vendor/symfony/serializer/phpunit.xml.dist
+++ b/vendor/symfony/serializer/phpunit.xml.dist
@@ -20,8 +20,8 @@
./
- ./vendor
./Tests
+ ./vendor
diff --git a/vendor/symfony/translation/CHANGELOG.md b/vendor/symfony/translation/CHANGELOG.md
index 157752c..45f15a0 100644
--- a/vendor/symfony/translation/CHANGELOG.md
+++ b/vendor/symfony/translation/CHANGELOG.md
@@ -1,6 +1,22 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * deprecated FileDumper::format(), overwrite FileDumper::formatCatalogue() instead.
+ * deprecated Translator::getMessages(), rely on TranslatorBagInterface::getCatalogue() instead.
+ * added `FileDumper::formatCatalogue` which allows format the catalogue without dumping it into file.
+ * added option `json_encoding` to JsonFileDumper
+ * added options `as_tree`, `inline` to YamlFileDumper
+ * added support for XLIFF 2.0.
+ * added support for XLIFF target and tool attributes.
+ * added message parameters to DataCollectorTranslator.
+ * [DEPRECATION] The `DiffOperation` class has been deprecated and
+ will be removed in Symfony 3.0, since its operation has nothing to do with 'diff',
+ so the class name is misleading. The `TargetOperation` class should be used for
+ this use-case instead.
+
2.7.0
-----
diff --git a/vendor/symfony/translation/Catalogue/AbstractOperation.php b/vendor/symfony/translation/Catalogue/AbstractOperation.php
index 062056b..9598e17 100644
--- a/vendor/symfony/translation/Catalogue/AbstractOperation.php
+++ b/vendor/symfony/translation/Catalogue/AbstractOperation.php
@@ -17,38 +17,60 @@
/**
* Base catalogues binary operation class.
*
+ * A catalogue binary operation performs operation on
+ * source (the left argument) and target (the right argument) catalogues.
+ *
* @author Jean-François Simon
*/
abstract class AbstractOperation implements OperationInterface
{
/**
- * @var MessageCatalogueInterface
+ * @var MessageCatalogueInterface The source catalogue
*/
protected $source;
/**
- * @var MessageCatalogueInterface
+ * @var MessageCatalogueInterface The target catalogue
*/
protected $target;
/**
- * @var MessageCatalogue
+ * @var MessageCatalogue The result catalogue
*/
protected $result;
/**
- * @var null|array
+ * @var null|array The domains affected by this operation
*/
private $domains;
/**
- * @var array
+ * This array stores 'all', 'new' and 'obsolete' messages for all valid domains.
+ *
+ * The data structure of this array is as follows:
+ * ```php
+ * array(
+ * 'domain 1' => array(
+ * 'all' => array(...),
+ * 'new' => array(...),
+ * 'obsolete' => array(...)
+ * ),
+ * 'domain 2' => array(
+ * 'all' => array(...),
+ * 'new' => array(...),
+ * 'obsolete' => array(...)
+ * ),
+ * ...
+ * )
+ * ```
+ *
+ * @var array The array that stores 'all', 'new' and 'obsolete' messages
*/
protected $messages;
/**
- * @param MessageCatalogueInterface $source
- * @param MessageCatalogueInterface $target
+ * @param MessageCatalogueInterface $source The source catalogue
+ * @param MessageCatalogueInterface $target The target catalogue
*
* @throws \LogicException
*/
@@ -140,7 +162,10 @@ public function getResult()
}
/**
- * @param string $domain
+ * Performs operation on source and target catalogues for the given domain and
+ * stores the results.
+ *
+ * @param string $domain The domain which the operation will be performed for
*/
abstract protected function processDomain($domain);
}
diff --git a/vendor/symfony/translation/Catalogue/DiffOperation.php b/vendor/symfony/translation/Catalogue/DiffOperation.php
index 2d1994e..cb9a6f5 100644
--- a/vendor/symfony/translation/Catalogue/DiffOperation.php
+++ b/vendor/symfony/translation/Catalogue/DiffOperation.php
@@ -11,45 +11,23 @@
namespace Symfony\Component\Translation\Catalogue;
+@trigger_error('The '.__NAMESPACE__.'\DiffOperation class is deprecated since version 2.8 and will be removed in 3.0. Use the TargetOperation class in the same namespace instead.', E_USER_DEPRECATED);
+
/**
* Diff operation between two catalogues.
*
+ * The name of 'Diff' is misleading because the operation
+ * has nothing to do with diff:
+ *
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
+ * all = intersection ∪ (target ∖ intersection) = target
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
+ *
* @author Jean-François Simon
+ *
+ * @deprecated since version 2.8, to be removed in 3.0. Use TargetOperation instead.
*/
-class DiffOperation extends AbstractOperation
+class DiffOperation extends TargetOperation
{
- /**
- * {@inheritdoc}
- */
- protected function processDomain($domain)
- {
- $this->messages[$domain] = array(
- 'all' => array(),
- 'new' => array(),
- 'obsolete' => array(),
- );
-
- foreach ($this->source->all($domain) as $id => $message) {
- if ($this->target->has($id, $domain)) {
- $this->messages[$domain]['all'][$id] = $message;
- $this->result->add(array($id => $message), $domain);
- if (null !== $keyMetadata = $this->source->getMetadata($id, $domain)) {
- $this->result->setMetadata($id, $keyMetadata, $domain);
- }
- } else {
- $this->messages[$domain]['obsolete'][$id] = $message;
- }
- }
-
- foreach ($this->target->all($domain) as $id => $message) {
- if (!$this->source->has($id, $domain)) {
- $this->messages[$domain]['all'][$id] = $message;
- $this->messages[$domain]['new'][$id] = $message;
- $this->result->add(array($id => $message), $domain);
- if (null !== $keyMetadata = $this->target->getMetadata($id, $domain)) {
- $this->result->setMetadata($id, $keyMetadata, $domain);
- }
- }
- }
- }
}
diff --git a/vendor/symfony/translation/Catalogue/MergeOperation.php b/vendor/symfony/translation/Catalogue/MergeOperation.php
index 562ca0e..6db3f80 100644
--- a/vendor/symfony/translation/Catalogue/MergeOperation.php
+++ b/vendor/symfony/translation/Catalogue/MergeOperation.php
@@ -12,7 +12,11 @@
namespace Symfony\Component\Translation\Catalogue;
/**
- * Merge operation between two catalogues.
+ * Merge operation between two catalogues as follows:
+ * all = source ∪ target = {x: x ∈ source ∨ x ∈ target}
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
+ * obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ source ∧ x ∉ target} = ∅
+ * Basically, the result contains messages from both catalogues.
*
* @author Jean-François Simon
*/
diff --git a/vendor/symfony/translation/Catalogue/OperationInterface.php b/vendor/symfony/translation/Catalogue/OperationInterface.php
index d72378a..87d888e 100644
--- a/vendor/symfony/translation/Catalogue/OperationInterface.php
+++ b/vendor/symfony/translation/Catalogue/OperationInterface.php
@@ -16,6 +16,20 @@
/**
* Represents an operation on catalogue(s).
*
+ * An instance of this interface performs an operation on one or more catalogues and
+ * stores intermediate and final results of the operation.
+ *
+ * The first catalogue in its argument(s) is called the 'source catalogue' or 'source' and
+ * the following results are stored:
+ *
+ * Messages: also called 'all', are valid messages for the given domain after the operation is performed.
+ *
+ * New Messages: also called 'new' (new = all ∖ source = {x: x ∈ all ∧ x ∉ source}).
+ *
+ * Obsolete Messages: also called 'obsolete' (obsolete = source ∖ all = {x: x ∈ source ∧ x ∉ all}).
+ *
+ * Result: also called 'result', is the resulting catalogue for the given domain that holds the same messages as 'all'.
+ *
* @author Jean-François Simon
*/
interface OperationInterface
@@ -28,7 +42,7 @@
public function getDomains();
/**
- * Returns all valid messages after operation.
+ * Returns all valid messages ('all') after operation.
*
* @param string $domain
*
@@ -37,7 +51,7 @@ public function getDomains();
public function getMessages($domain);
/**
- * Returns new messages after operation.
+ * Returns new messages ('new') after operation.
*
* @param string $domain
*
@@ -46,7 +60,7 @@ public function getMessages($domain);
public function getNewMessages($domain);
/**
- * Returns obsolete messages after operation.
+ * Returns obsolete messages ('obsolete') after operation.
*
* @param string $domain
*
@@ -55,7 +69,7 @@ public function getNewMessages($domain);
public function getObsoleteMessages($domain);
/**
- * Returns resulting catalogue.
+ * Returns resulting catalogue ('result').
*
* @return MessageCatalogueInterface
*/
diff --git a/vendor/symfony/translation/Catalogue/DiffOperation.php b/vendor/symfony/translation/Catalogue/TargetOperation.php
similarity index 55%
copy from vendor/symfony/translation/Catalogue/DiffOperation.php
copy to vendor/symfony/translation/Catalogue/TargetOperation.php
index 2d1994e..eea1fef 100644
--- a/vendor/symfony/translation/Catalogue/DiffOperation.php
+++ b/vendor/symfony/translation/Catalogue/TargetOperation.php
@@ -12,11 +12,16 @@
namespace Symfony\Component\Translation\Catalogue;
/**
- * Diff operation between two catalogues.
+ * Target operation between two catalogues:
+ * intersection = source ∩ target = {x: x ∈ source ∧ x ∈ target}
+ * all = intersection ∪ (target ∖ intersection) = target
+ * new = all ∖ source = {x: x ∈ target ∧ x ∉ source}
+ * obsolete = source ∖ all = source ∖ target = {x: x ∈ source ∧ x ∉ target}
+ * Basically, the result contains messages from the target catalogue.
*
- * @author Jean-François Simon
+ * @author Michael Lee
*/
-class DiffOperation extends AbstractOperation
+class TargetOperation extends AbstractOperation
{
/**
* {@inheritdoc}
@@ -29,6 +34,15 @@ protected function processDomain($domain)
'obsolete' => array(),
);
+ // For 'all' messages, the code can't be simplified as ``$this->messages[$domain]['all'] = $target->all($domain);``,
+ // because doing so will drop messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
+ //
+ // For 'new' messages, the code can't be simplied as ``array_diff_assoc($this->target->all($domain), $this->source->all($domain));``
+ // because doing so will not exclude messages like {x: x ∈ target ∧ x ∉ source.all ∧ x ∈ source.fallback}
+ //
+ // For 'obsolete' messages, the code can't be simplifed as ``array_diff_assoc($this->source->all($domain), $this->target->all($domain))``
+ // because doing so will not exclude messages like {x: x ∈ source ∧ x ∉ target.all ∧ x ∈ target.fallback}
+
foreach ($this->source->all($domain) as $id => $message) {
if ($this->target->has($id, $domain)) {
$this->messages[$domain]['all'][$id] = $message;
diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php
index c3c140f..cb59d0a 100644
--- a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php
+++ b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php
@@ -101,9 +101,14 @@ private function sanitizeCollectedMessages($messages)
if (!isset($result[$messageId])) {
$message['count'] = 1;
+ $message['parameters'] = !empty($message['parameters']) ? array($message['parameters']) : array();
$messages[$key]['translation'] = $this->sanitizeString($message['translation']);
$result[$messageId] = $message;
} else {
+ if (!empty($message['parameters'])) {
+ $result[$messageId]['parameters'][] = $message['parameters'];
+ }
+
++$result[$messageId]['count'];
}
@@ -132,7 +137,7 @@ private function sanitizeString($string, $length = 80)
{
$string = trim(preg_replace('/\s+/', ' ', $string));
- if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($string)) {
+ if (false !== $encoding = mb_detect_encoding($string, null, true)) {
if (mb_strlen($string, $encoding) > $length) {
return mb_substr($string, 0, $length - 3, $encoding).'...';
}
diff --git a/vendor/symfony/translation/DataCollectorTranslator.php b/vendor/symfony/translation/DataCollectorTranslator.php
index 4c69ff6..d507cde 100644
--- a/vendor/symfony/translation/DataCollectorTranslator.php
+++ b/vendor/symfony/translation/DataCollectorTranslator.php
@@ -48,7 +48,7 @@ public function __construct(TranslatorInterface $translator)
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
{
$trans = $this->translator->trans($id, $parameters, $domain, $locale);
- $this->collectMessage($locale, $domain, $id, $trans);
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters);
return $trans;
}
@@ -59,7 +59,7 @@ public function trans($id, array $parameters = array(), $domain = null, $locale
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
{
$trans = $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
- $this->collectMessage($locale, $domain, $id, $trans);
+ $this->collectMessage($locale, $domain, $id, $trans, $parameters, $number);
return $trans;
}
@@ -108,9 +108,11 @@ public function getCollectedMessages()
* @param string|null $locale
* @param string|null $domain
* @param string $id
- * @param string $trans
+ * @param string $translation
+ * @param array|null $parameters
+ * @param int|null $number
*/
- private function collectMessage($locale, $domain, $id, $translation)
+ private function collectMessage($locale, $domain, $id, $translation, $parameters = array(), $number = null)
{
if (null === $domain) {
$domain = 'messages';
@@ -142,6 +144,8 @@ private function collectMessage($locale, $domain, $id, $translation)
'domain' => $domain,
'id' => $id,
'translation' => $translation,
+ 'parameters' => $parameters,
+ 'transChoiceNumber' => $number,
'state' => $state,
);
}
diff --git a/vendor/symfony/translation/Dumper/CsvFileDumper.php b/vendor/symfony/translation/Dumper/CsvFileDumper.php
index 08005b0..afadcd8 100644
--- a/vendor/symfony/translation/Dumper/CsvFileDumper.php
+++ b/vendor/symfony/translation/Dumper/CsvFileDumper.php
@@ -28,6 +28,16 @@ class CsvFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$handle = fopen('php://memory', 'rb+');
foreach ($messages->all($domain) as $source => $target) {
diff --git a/vendor/symfony/translation/Dumper/FileDumper.php b/vendor/symfony/translation/Dumper/FileDumper.php
index f2f17d6..b217d10 100644
--- a/vendor/symfony/translation/Dumper/FileDumper.php
+++ b/vendor/symfony/translation/Dumper/FileDumper.php
@@ -82,19 +82,42 @@ public function dump(MessageCatalogue $messages, $options = array())
}
}
// save file
- file_put_contents($fullpath, $this->format($messages, $domain));
+ file_put_contents($fullpath, $this->formatCatalogue($messages, $domain, $options));
}
}
/**
* Transforms a domain of a message catalogue to its string representation.
*
+ * Override this function in child class if $options is used for message formatting.
+ *
+ * @param MessageCatalogue $messages
+ * @param string $domain
+ * @param array $options
+ *
+ * @return string representation
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
+ @trigger_error('The '.__METHOD__.' method will replace the format method in 3.0. You should overwrite it instead of overwriting format instead.', E_USER_DEPRECATED);
+
+ return $this->format($messages, $domain);
+ }
+
+ /**
+ * Transforms a domain of a message catalogue to its string representation.
+ *
* @param MessageCatalogue $messages
* @param string $domain
*
* @return string representation
+ *
+ * @deprecated since version 2.8, to be removed in 3.0. Overwrite formatCatalogue() instead.
*/
- abstract protected function format(MessageCatalogue $messages, $domain);
+ protected function format(MessageCatalogue $messages, $domain)
+ {
+ throw new \LogicException('The "FileDumper::format" method needs to be overwritten, you should implement either "format" or "formatCatalogue".');
+ }
/**
* Gets the file extension of the dumper.
diff --git a/vendor/symfony/translation/Dumper/IcuResFileDumper.php b/vendor/symfony/translation/Dumper/IcuResFileDumper.php
index 0a2ed9f..c52f507 100644
--- a/vendor/symfony/translation/Dumper/IcuResFileDumper.php
+++ b/vendor/symfony/translation/Dumper/IcuResFileDumper.php
@@ -30,6 +30,16 @@ class IcuResFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$data = $indexes = $resources = '';
foreach ($messages->all($domain) as $source => $target) {
@@ -79,11 +89,7 @@ public function format(MessageCatalogue $messages, $domain = 'messages')
1, 4, 0, 0 // Unicode version
);
- $output = $header
- .$root
- .$data;
-
- return $output;
+ return $header.$root.$data;
}
private function writePadding($data)
@@ -97,9 +103,7 @@ private function writePadding($data)
private function getPosition($data)
{
- $position = (strlen($data) + 28) / 4;
-
- return $position;
+ return (strlen($data) + 28) / 4;
}
/**
diff --git a/vendor/symfony/translation/Dumper/IniFileDumper.php b/vendor/symfony/translation/Dumper/IniFileDumper.php
index 45df389..36be230 100644
--- a/vendor/symfony/translation/Dumper/IniFileDumper.php
+++ b/vendor/symfony/translation/Dumper/IniFileDumper.php
@@ -25,6 +25,16 @@ class IniFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$output = '';
foreach ($messages->all($domain) as $source => $target) {
diff --git a/vendor/symfony/translation/Dumper/JsonFileDumper.php b/vendor/symfony/translation/Dumper/JsonFileDumper.php
index 7ad3518..022e165 100644
--- a/vendor/symfony/translation/Dumper/JsonFileDumper.php
+++ b/vendor/symfony/translation/Dumper/JsonFileDumper.php
@@ -25,7 +25,23 @@ class JsonFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
- return json_encode($messages->all($domain), defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0);
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
+ if (isset($options['json_encoding'])) {
+ $flags = $options['json_encoding'];
+ } else {
+ $flags = defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : 0;
+ }
+
+ return json_encode($messages->all($domain), $flags);
}
/**
diff --git a/vendor/symfony/translation/Dumper/MoFileDumper.php b/vendor/symfony/translation/Dumper/MoFileDumper.php
index f8dc6ac..a8e123a 100644
--- a/vendor/symfony/translation/Dumper/MoFileDumper.php
+++ b/vendor/symfony/translation/Dumper/MoFileDumper.php
@@ -26,6 +26,16 @@ class MoFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$output = $sources = $targets = $sourceOffsets = $targetOffsets = '';
$offsets = array();
$size = 0;
diff --git a/vendor/symfony/translation/Dumper/PhpFileDumper.php b/vendor/symfony/translation/Dumper/PhpFileDumper.php
index b354c12..ea31dda 100644
--- a/vendor/symfony/translation/Dumper/PhpFileDumper.php
+++ b/vendor/symfony/translation/Dumper/PhpFileDumper.php
@@ -25,6 +25,16 @@ class PhpFileDumper extends FileDumper
*/
protected function format(MessageCatalogue $messages, $domain)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$output = "all($domain), true).";\n";
return $output;
diff --git a/vendor/symfony/translation/Dumper/PoFileDumper.php b/vendor/symfony/translation/Dumper/PoFileDumper.php
index 983064b..9e27bc7 100644
--- a/vendor/symfony/translation/Dumper/PoFileDumper.php
+++ b/vendor/symfony/translation/Dumper/PoFileDumper.php
@@ -25,6 +25,16 @@ class PoFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain = 'messages')
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$output = 'msgid ""'."\n";
$output .= 'msgstr ""'."\n";
$output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n";
diff --git a/vendor/symfony/translation/Dumper/QtFileDumper.php b/vendor/symfony/translation/Dumper/QtFileDumper.php
index 42aa093..5c2a434 100644
--- a/vendor/symfony/translation/Dumper/QtFileDumper.php
+++ b/vendor/symfony/translation/Dumper/QtFileDumper.php
@@ -25,6 +25,16 @@ class QtFileDumper extends FileDumper
*/
public function format(MessageCatalogue $messages, $domain)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
+ {
$dom = new \DOMDocument('1.0', 'utf-8');
$dom->formatOutput = true;
$ts = $dom->appendChild($dom->createElement('TS'));
diff --git a/vendor/symfony/translation/Dumper/XliffFileDumper.php b/vendor/symfony/translation/Dumper/XliffFileDumper.php
index 58d1973..6a7f655 100644
--- a/vendor/symfony/translation/Dumper/XliffFileDumper.php
+++ b/vendor/symfony/translation/Dumper/XliffFileDumper.php
@@ -21,22 +21,29 @@
class XliffFileDumper extends FileDumper
{
/**
- * @var string
- */
- private $defaultLocale;
-
- /**
* {@inheritdoc}
*/
- public function dump(MessageCatalogue $messages, $options = array())
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
{
+ $xliffVersion = '1.2';
+ if (array_key_exists('xliff_version', $options)) {
+ $xliffVersion = $options['xliff_version'];
+ }
+
if (array_key_exists('default_locale', $options)) {
- $this->defaultLocale = $options['default_locale'];
+ $defaultLocale = $options['default_locale'];
} else {
- $this->defaultLocale = \Locale::getDefault();
+ $defaultLocale = \Locale::getDefault();
+ }
+
+ if ('1.2' === $xliffVersion) {
+ return $this->dumpXliff1($defaultLocale, $messages, $domain, $options);
+ }
+ if ('2.0' === $xliffVersion) {
+ return $this->dumpXliff2($defaultLocale, $messages, $domain, $options);
}
- parent::dump($messages, $options);
+ throw new \InvalidArgumentException(sprintf('No support implemented for dumping XLIFF version "%s".', $xliffVersion));
}
/**
@@ -44,6 +51,26 @@ public function dump(MessageCatalogue $messages, $options = array())
*/
protected function format(MessageCatalogue $messages, $domain)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getExtension()
+ {
+ return 'xlf';
+ }
+
+ private function dumpXliff1($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
+ {
+ $toolInfo = array('tool-id' => 'symfony', 'tool-name' => 'Symfony');
+ if (array_key_exists('tool_info', $options)) {
+ $toolInfo = array_merge($toolInfo, $options['tool_info']);
+ }
+
$dom = new \DOMDocument('1.0', 'utf-8');
$dom->formatOutput = true;
@@ -52,11 +79,17 @@ protected function format(MessageCatalogue $messages, $domain)
$xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2');
$xliffFile = $xliff->appendChild($dom->createElement('file'));
- $xliffFile->setAttribute('source-language', str_replace('_', '-', $this->defaultLocale));
+ $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale));
$xliffFile->setAttribute('target-language', str_replace('_', '-', $messages->getLocale()));
$xliffFile->setAttribute('datatype', 'plaintext');
$xliffFile->setAttribute('original', 'file.ext');
+ $xliffHead = $xliffFile->appendChild($dom->createElement('header'));
+ $xliffTool = $xliffHead->appendChild($dom->createElement('tool'));
+ foreach ($toolInfo as $id => $value) {
+ $xliffTool->setAttribute($id, $value);
+ }
+
$xliffBody = $xliffFile->appendChild($dom->createElement('body'));
foreach ($messages->all($domain) as $source => $target) {
$translation = $dom->createElement('trans-unit');
@@ -70,11 +103,17 @@ protected function format(MessageCatalogue $messages, $domain)
// Does the target contain characters requiring a CDATA section?
$text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
- $t = $translation->appendChild($dom->createElement('target'));
+ $targetElement = $dom->createElement('target');
+ $metadata = $messages->getMetadata($source, $domain);
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
+ foreach ($metadata['target-attributes'] as $name => $value) {
+ $targetElement->setAttribute($name, $value);
+ }
+ }
+ $t = $translation->appendChild($targetElement);
$t->appendChild($text);
- $metadata = $messages->getMetadata($source, $domain);
- if (null !== $metadata && array_key_exists('notes', $metadata) && is_array($metadata['notes'])) {
+ if ($this->hasMetadataArrayInfo('notes', $metadata)) {
foreach ($metadata['notes'] as $note) {
if (!isset($note['content'])) {
continue;
@@ -99,11 +138,56 @@ protected function format(MessageCatalogue $messages, $domain)
return $dom->saveXML();
}
+ private function dumpXliff2($defaultLocale, MessageCatalogue $messages, $domain, array $options = array())
+ {
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $dom->formatOutput = true;
+
+ $xliff = $dom->appendChild($dom->createElement('xliff'));
+ $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:2.0');
+ $xliff->setAttribute('version', '2.0');
+ $xliff->setAttribute('srcLang', str_replace('_', '-', $defaultLocale));
+ $xliff->setAttribute('trgLang', str_replace('_', '-', $messages->getLocale()));
+
+ $xliffFile = $xliff->appendChild($dom->createElement('file'));
+ $xliffFile->setAttribute('id', $domain.'.'.$messages->getLocale());
+
+ foreach ($messages->all($domain) as $source => $target) {
+ $translation = $dom->createElement('unit');
+ $translation->setAttribute('id', md5($source));
+
+ $segment = $translation->appendChild($dom->createElement('segment'));
+
+ $s = $segment->appendChild($dom->createElement('source'));
+ $s->appendChild($dom->createTextNode($source));
+
+ // Does the target contain characters requiring a CDATA section?
+ $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target);
+
+ $targetElement = $dom->createElement('target');
+ $metadata = $messages->getMetadata($source, $domain);
+ if ($this->hasMetadataArrayInfo('target-attributes', $metadata)) {
+ foreach ($metadata['target-attributes'] as $name => $value) {
+ $targetElement->setAttribute($name, $value);
+ }
+ }
+ $t = $segment->appendChild($targetElement);
+ $t->appendChild($text);
+
+ $xliffFile->appendChild($translation);
+ }
+
+ return $dom->saveXML();
+ }
+
/**
- * {@inheritdoc}
+ * @param string $key
+ * @param array|null $metadata
+ *
+ * @return bool
*/
- protected function getExtension()
+ private function hasMetadataArrayInfo($key, $metadata = null)
{
- return 'xlf';
+ return null !== $metadata && array_key_exists($key, $metadata) && ($metadata[$key] instanceof \Traversable || is_array($metadata[$key]));
}
}
diff --git a/vendor/symfony/translation/Dumper/YamlFileDumper.php b/vendor/symfony/translation/Dumper/YamlFileDumper.php
index 870fb98..8e49648 100644
--- a/vendor/symfony/translation/Dumper/YamlFileDumper.php
+++ b/vendor/symfony/translation/Dumper/YamlFileDumper.php
@@ -12,6 +12,7 @@
namespace Symfony\Component\Translation\Dumper;
use Symfony\Component\Translation\MessageCatalogue;
+use Symfony\Component\Translation\Util\ArrayConverter;
use Symfony\Component\Yaml\Yaml;
/**
@@ -24,13 +25,33 @@ class YamlFileDumper extends FileDumper
/**
* {@inheritdoc}
*/
- protected function format(MessageCatalogue $messages, $domain)
+ public function formatCatalogue(MessageCatalogue $messages, $domain, array $options = array())
{
if (!class_exists('Symfony\Component\Yaml\Yaml')) {
throw new \LogicException('Dumping translations in the YAML format requires the Symfony Yaml component.');
}
- return Yaml::dump($messages->all($domain));
+ $data = $messages->all($domain);
+
+ if (isset($options['as_tree']) && $options['as_tree']) {
+ $data = ArrayConverter::expandToTree($data);
+ }
+
+ if (isset($options['inline']) && ($inline = (int) $options['inline']) > 0) {
+ return Yaml::dump($data, $inline);
+ }
+
+ return Yaml::dump($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function format(MessageCatalogue $messages, $domain)
+ {
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use the formatCatalogue() method instead.', E_USER_DEPRECATED);
+
+ return $this->formatCatalogue($messages, $domain);
}
/**
diff --git a/vendor/symfony/translation/LICENSE b/vendor/symfony/translation/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/translation/LICENSE
+++ b/vendor/symfony/translation/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/translation/Loader/CsvFileLoader.php b/vendor/symfony/translation/Loader/CsvFileLoader.php
index 2240179..f1d3443 100644
--- a/vendor/symfony/translation/Loader/CsvFileLoader.php
+++ b/vendor/symfony/translation/Loader/CsvFileLoader.php
@@ -11,16 +11,14 @@
namespace Symfony\Component\Translation\Loader;
-use Symfony\Component\Translation\Exception\InvalidResourceException;
use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
/**
* CsvFileLoader loads translations from CSV files.
*
* @author Saša Stamenković
*/
-class CsvFileLoader extends ArrayLoader
+class CsvFileLoader extends FileLoader
{
private $delimiter = ';';
private $enclosure = '"';
@@ -29,16 +27,8 @@ class CsvFileLoader extends ArrayLoader
/**
* {@inheritdoc}
*/
- public function load($resource, $locale, $domain = 'messages')
+ protected function loadResource($resource)
{
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
$messages = array();
try {
@@ -56,13 +46,7 @@ public function load($resource, $locale, $domain = 'messages')
}
}
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
+ return $messages;
}
/**
diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/FileLoader.php
similarity index 64%
copy from vendor/symfony/translation/Loader/IniFileLoader.php
copy to vendor/symfony/translation/Loader/FileLoader.php
index 1b3a7b1..a7f24f4 100644
--- a/vendor/symfony/translation/Loader/IniFileLoader.php
+++ b/vendor/symfony/translation/Loader/FileLoader.php
@@ -16,11 +16,9 @@
use Symfony\Component\Config\Resource\FileResource;
/**
- * IniFileLoader loads translations from an ini file.
- *
- * @author stealth35
+ * @author Abdellatif Ait boudad
*/
-class IniFileLoader extends ArrayLoader
+abstract class FileLoader extends ArrayLoader
{
/**
* {@inheritdoc}
@@ -35,7 +33,17 @@ public function load($resource, $locale, $domain = 'messages')
throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
}
- $messages = parse_ini_file($resource, true);
+ $messages = $this->loadResource($resource);
+
+ // empty resource
+ if (null === $messages) {
+ $messages = array();
+ }
+
+ // not an array
+ if (!is_array($messages)) {
+ throw new InvalidResourceException(sprintf('Unable to load file "%s".', $resource));
+ }
$catalogue = parent::load($messages, $locale, $domain);
@@ -45,4 +53,13 @@ public function load($resource, $locale, $domain = 'messages')
return $catalogue;
}
+
+ /*
+ * @param string $resource
+ *
+ * @return array
+ *
+ * @throws InvalidResourceException If stream content has an invalid format.
+ */
+ abstract protected function loadResource($resource);
}
diff --git a/vendor/symfony/translation/Loader/IniFileLoader.php b/vendor/symfony/translation/Loader/IniFileLoader.php
index 1b3a7b1..11d9b27 100644
--- a/vendor/symfony/translation/Loader/IniFileLoader.php
+++ b/vendor/symfony/translation/Loader/IniFileLoader.php
@@ -11,38 +11,18 @@
namespace Symfony\Component\Translation\Loader;
-use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
-
/**
* IniFileLoader loads translations from an ini file.
*
* @author stealth35
*/
-class IniFileLoader extends ArrayLoader
+class IniFileLoader extends FileLoader
{
/**
* {@inheritdoc}
*/
- public function load($resource, $locale, $domain = 'messages')
+ protected function loadResource($resource)
{
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
- $messages = parse_ini_file($resource, true);
-
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
+ return parse_ini_file($resource, true);
}
}
diff --git a/vendor/symfony/translation/Loader/JsonFileLoader.php b/vendor/symfony/translation/Loader/JsonFileLoader.php
index 81717f3..ce4e91f 100644
--- a/vendor/symfony/translation/Loader/JsonFileLoader.php
+++ b/vendor/symfony/translation/Loader/JsonFileLoader.php
@@ -12,29 +12,19 @@
namespace Symfony\Component\Translation\Loader;
use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
/**
* JsonFileLoader loads translations from an json file.
*
* @author singles
*/
-class JsonFileLoader extends ArrayLoader
+class JsonFileLoader extends FileLoader
{
/**
* {@inheritdoc}
*/
- public function load($resource, $locale, $domain = 'messages')
+ protected function loadResource($resource)
{
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
$messages = array();
if ($data = file_get_contents($resource)) {
$messages = json_decode($data, true);
@@ -44,14 +34,7 @@ public function load($resource, $locale, $domain = 'messages')
}
}
- if (null === $messages) {
- $messages = array();
- }
-
- $catalogue = parent::load($messages, $locale, $domain);
- $catalogue->addResource(new FileResource($resource));
-
- return $catalogue;
+ return $messages;
}
/**
diff --git a/vendor/symfony/translation/Loader/MoFileLoader.php b/vendor/symfony/translation/Loader/MoFileLoader.php
index 746fd52..c27a88e 100644
--- a/vendor/symfony/translation/Loader/MoFileLoader.php
+++ b/vendor/symfony/translation/Loader/MoFileLoader.php
@@ -12,13 +12,11 @@
namespace Symfony\Component\Translation\Loader;
use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
/**
* @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
*/
-class MoFileLoader extends ArrayLoader
+class MoFileLoader extends FileLoader
{
/**
* Magic used for validating the format of a MO file as well as
@@ -43,48 +41,13 @@ class MoFileLoader extends ArrayLoader
*/
const MO_HEADER_SIZE = 28;
- public function load($resource, $locale, $domain = 'messages')
- {
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
- $messages = $this->parse($resource);
-
- // empty file
- if (null === $messages) {
- $messages = array();
- }
-
- // not an array
- if (!is_array($messages)) {
- throw new InvalidResourceException(sprintf('The file "%s" must contain a valid mo file.', $resource));
- }
-
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
- }
-
/**
* Parses machine object (MO) format, independent of the machine's endian it
* was created on. Both 32bit and 64bit systems are supported.
*
- * @param resource $resource
- *
- * @return array
- *
- * @throws InvalidResourceException If stream content has an invalid format.
+ * {@inheritdoc}
*/
- private function parse($resource)
+ protected function loadResource($resource)
{
$stream = fopen($resource, 'r');
diff --git a/vendor/symfony/translation/Loader/PhpFileLoader.php b/vendor/symfony/translation/Loader/PhpFileLoader.php
index a52e0bb..a0050e8 100644
--- a/vendor/symfony/translation/Loader/PhpFileLoader.php
+++ b/vendor/symfony/translation/Loader/PhpFileLoader.php
@@ -11,38 +11,18 @@
namespace Symfony\Component\Translation\Loader;
-use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
-
/**
* PhpFileLoader loads translations from PHP files returning an array of translations.
*
* @author Fabien Potencier
*/
-class PhpFileLoader extends ArrayLoader
+class PhpFileLoader extends FileLoader
{
/**
* {@inheritdoc}
*/
- public function load($resource, $locale, $domain = 'messages')
+ protected function loadResource($resource)
{
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
- $messages = require $resource;
-
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
+ return require $resource;
}
}
diff --git a/vendor/symfony/translation/Loader/PoFileLoader.php b/vendor/symfony/translation/Loader/PoFileLoader.php
index b5d12e9..84664d6 100644
--- a/vendor/symfony/translation/Loader/PoFileLoader.php
+++ b/vendor/symfony/translation/Loader/PoFileLoader.php
@@ -11,47 +11,12 @@
namespace Symfony\Component\Translation\Loader;
-use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
-
/**
* @copyright Copyright (c) 2010, Union of RAD http://union-of-rad.org (http://lithify.me/)
* @copyright Copyright (c) 2012, Clemens Tolboom
*/
-class PoFileLoader extends ArrayLoader
+class PoFileLoader extends FileLoader
{
- public function load($resource, $locale, $domain = 'messages')
- {
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
- $messages = $this->parse($resource);
-
- // empty file
- if (null === $messages) {
- $messages = array();
- }
-
- // not an array
- if (!is_array($messages)) {
- throw new InvalidResourceException(sprintf('The file "%s" must contain a valid po file.', $resource));
- }
-
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
- }
-
/**
* Parses portable object (PO) format.
*
@@ -93,11 +58,9 @@ public function load($resource, $locale, $domain = 'messages')
*
* Items with an empty id are ignored.
*
- * @param resource $resource
- *
- * @return array
+ * {@inheritdoc}
*/
- private function parse($resource)
+ protected function loadResource($resource)
{
$stream = fopen($resource, 'r');
diff --git a/vendor/symfony/translation/Loader/XliffFileLoader.php b/vendor/symfony/translation/Loader/XliffFileLoader.php
index 0e335db..bdca110 100644
--- a/vendor/symfony/translation/Loader/XliffFileLoader.php
+++ b/vendor/symfony/translation/Loader/XliffFileLoader.php
@@ -37,10 +37,49 @@ public function load($resource, $locale, $domain = 'messages')
throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
}
- list($xml, $encoding) = $this->parseFile($resource);
- $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
-
$catalogue = new MessageCatalogue($locale);
+ $this->extract($resource, $catalogue, $domain);
+
+ if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
+ $catalogue->addResource(new FileResource($resource));
+ }
+
+ return $catalogue;
+ }
+
+ private function extract($resource, MessageCatalogue $catalogue, $domain)
+ {
+ try {
+ $dom = XmlUtils::loadFile($resource);
+ } catch (\InvalidArgumentException $e) {
+ throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $resource, $e->getMessage()), $e->getCode(), $e);
+ }
+
+ $xliffVersion = $this->getVersionNumber($dom);
+ $this->validateSchema($xliffVersion, $dom, $this->getSchema($xliffVersion));
+
+ if ('1.2' === $xliffVersion) {
+ $this->extractXliff1($dom, $catalogue, $domain);
+ }
+
+ if ('2.0' === $xliffVersion) {
+ $this->extractXliff2($dom, $catalogue, $domain);
+ }
+ }
+
+ /**
+ * Extract messages and metadata from DOMDocument into a MessageCatalogue.
+ *
+ * @param \DOMDocument $dom Source to extract messages and metadata
+ * @param MessageCatalogue $catalogue Catalogue where we'll collect messages and metadata
+ * @param string $domain The domain
+ */
+ private function extractXliff1(\DOMDocument $dom, MessageCatalogue $catalogue, $domain)
+ {
+ $xml = simplexml_import_dom($dom);
+ $encoding = strtoupper($dom->encoding);
+
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:1.2');
foreach ($xml->xpath('//xliff:trans-unit') as $translation) {
$attributes = $translation->attributes();
@@ -55,31 +94,52 @@ public function load($resource, $locale, $domain = 'messages')
$catalogue->set((string) $source, $target, $domain);
- if (isset($translation->note)) {
- $notes = array();
- foreach ($translation->note as $xmlNote) {
- $noteAttributes = $xmlNote->attributes();
- $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
- if (isset($noteAttributes['priority'])) {
- $note['priority'] = (int) $noteAttributes['priority'];
- }
+ $metadata = array();
+ if ($notes = $this->parseNotesMetadata($translation->note, $encoding)) {
+ $metadata['notes'] = $notes;
+ }
+ if (isset($translation->target) && $translation->target->attributes()) {
+ $metadata['target-attributes'] = array();
+ foreach ($translation->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
+ }
- if (isset($noteAttributes['from'])) {
- $note['from'] = (string) $noteAttributes['from'];
- }
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
+ }
+ }
- $notes[] = $note;
- }
+ /**
+ * @param \DOMDocument $dom
+ * @param MessageCatalogue $catalogue
+ * @param string $domain
+ */
+ private function extractXliff2(\DOMDocument $dom, MessageCatalogue $catalogue, $domain)
+ {
+ $xml = simplexml_import_dom($dom);
+ $encoding = strtoupper($dom->encoding);
+
+ $xml->registerXPathNamespace('xliff', 'urn:oasis:names:tc:xliff:document:2.0');
+
+ foreach ($xml->xpath('//xliff:unit/xliff:segment') as $segment) {
+ $source = $segment->source;
- $catalogue->setMetadata((string) $source, array('notes' => $notes), $domain);
+ // If the xlf file has another encoding specified, try to convert it because
+ // simple_xml will always return utf-8 encoded values
+ $target = $this->utf8ToCharset((string) (isset($segment->target) ? $segment->target : $source), $encoding);
+
+ $catalogue->set((string) $source, $target, $domain);
+
+ $metadata = array();
+ if (isset($segment->target) && $segment->target->attributes()) {
+ $metadata['target-attributes'] = array();
+ foreach ($segment->target->attributes() as $key => $value) {
+ $metadata['target-attributes'][$key] = (string) $value;
+ }
}
- }
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
+ $catalogue->setMetadata((string) $source, $metadata, $domain);
}
-
- return $catalogue;
}
/**
@@ -93,57 +153,24 @@ public function load($resource, $locale, $domain = 'messages')
private function utf8ToCharset($content, $encoding = null)
{
if ('UTF-8' !== $encoding && !empty($encoding)) {
- if (function_exists('mb_convert_encoding')) {
- return mb_convert_encoding($content, $encoding, 'UTF-8');
- }
-
- if (function_exists('iconv')) {
- return iconv('UTF-8', $encoding, $content);
- }
-
- throw new \RuntimeException('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
+ return mb_convert_encoding($content, $encoding, 'UTF-8');
}
return $content;
}
/**
- * Validates and parses the given file into a SimpleXMLElement.
- *
- * @param string $file
- *
- * @throws \RuntimeException
- *
- * @return \SimpleXMLElement
+ * @param string $file
+ * @param \DOMDocument $dom
+ * @param string $schema source of the schema
*
* @throws InvalidResourceException
*/
- private function parseFile($file)
+ private function validateSchema($file, \DOMDocument $dom, $schema)
{
- try {
- $dom = XmlUtils::loadFile($file);
- } catch (\InvalidArgumentException $e) {
- throw new InvalidResourceException(sprintf('Unable to load "%s": %s', $file, $e->getMessage()), $e->getCode(), $e);
- }
-
$internalErrors = libxml_use_internal_errors(true);
- $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
- $parts = explode('/', $location);
- if (0 === stripos($location, 'phar://')) {
- $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
- if ($tmpfile) {
- copy($location, $tmpfile);
- $parts = explode('/', str_replace('\\', '/', $tmpfile));
- }
- }
- $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
- $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
-
- $source = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
- $source = str_replace('http://www.w3.org/2001/xml.xsd', $location, $source);
-
- if (!@$dom->schemaValidateSource($source)) {
+ if (!@$dom->schemaValidateSource($schema)) {
throw new InvalidResourceException(sprintf('Invalid resource provided: "%s"; Errors: %s', $file, implode("\n", $this->getXmlErrors($internalErrors))));
}
@@ -151,8 +178,46 @@ private function parseFile($file)
libxml_clear_errors();
libxml_use_internal_errors($internalErrors);
+ }
- return array(simplexml_import_dom($dom), strtoupper($dom->encoding));
+ private function getSchema($xliffVersion)
+ {
+ if ('1.2' === $xliffVersion) {
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-1.2-strict.xsd');
+ $xmlUri = 'http://www.w3.org/2001/xml.xsd';
+ } elseif ('2.0' === $xliffVersion) {
+ $schemaSource = file_get_contents(__DIR__.'/schema/dic/xliff-core/xliff-core-2.0.xsd');
+ $xmlUri = 'informativeCopiesOf3rdPartySchemas/w3c/xml.xsd';
+ } else {
+ throw new \InvalidArgumentException(sprintf('No support implemented for loading XLIFF version "%s".', $xliffVersion));
+ }
+
+ return $this->fixXmlLocation($schemaSource, $xmlUri);
+ }
+
+ /**
+ * Internally changes the URI of a dependent xsd to be loaded locally.
+ *
+ * @param string $schemaSource Current content of schema file
+ * @param string $xmlUri External URI of XML to convert to local
+ *
+ * @return string
+ */
+ private function fixXmlLocation($schemaSource, $xmlUri)
+ {
+ $newPath = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd';
+ $parts = explode('/', $newPath);
+ if (0 === stripos($newPath, 'phar://')) {
+ $tmpfile = tempnam(sys_get_temp_dir(), 'sf2');
+ if ($tmpfile) {
+ copy($newPath, $tmpfile);
+ $parts = explode('/', str_replace('\\', '/', $tmpfile));
+ }
+ }
+ $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : '';
+ $newPath = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts));
+
+ return str_replace($xmlUri, $newPath, $schemaSource);
}
/**
@@ -181,4 +246,68 @@ private function getXmlErrors($internalErrors)
return $errors;
}
+
+ /**
+ * Gets xliff file version based on the root "version" attribute.
+ * Defaults to 1.2 for backwards compatibility.
+ *
+ * @param \DOMDocument $dom
+ *
+ * @throws \InvalidArgumentException
+ *
+ * @return string
+ */
+ private function getVersionNumber(\DOMDocument $dom)
+ {
+ /** @var \DOMNode $xliff */
+ foreach ($dom->getElementsByTagName('xliff') as $xliff) {
+ $version = $xliff->attributes->getNamedItem('version');
+ if ($version) {
+ return $version->nodeValue;
+ }
+
+ $namespace = $xliff->attributes->getNamedItem('xmlns');
+ if ($namespace) {
+ if (substr_compare('urn:oasis:names:tc:xliff:document:', $namespace->nodeValue, 0, 34) !== 0) {
+ throw new \InvalidArgumentException(sprintf('Not a valid XLIFF namespace "%s"', $namespace));
+ }
+
+ return substr($namespace, 34);
+ }
+ }
+
+ // Falls back to v1.2
+ return '1.2';
+ }
+
+ /*
+ * @param \SimpleXMLElement|null $noteElement
+ * @param string|null $encoding
+ *
+ * @return array
+ */
+ private function parseNotesMetadata(\SimpleXMLElement $noteElement = null, $encoding = null)
+ {
+ $notes = array();
+
+ if (null === $noteElement) {
+ return $notes;
+ }
+
+ foreach ($noteElement as $xmlNote) {
+ $noteAttributes = $xmlNote->attributes();
+ $note = array('content' => $this->utf8ToCharset((string) $xmlNote, $encoding));
+ if (isset($noteAttributes['priority'])) {
+ $note['priority'] = (int) $noteAttributes['priority'];
+ }
+
+ if (isset($noteAttributes['from'])) {
+ $note['from'] = (string) $noteAttributes['from'];
+ }
+
+ $notes[] = $note;
+ }
+
+ return $notes;
+ }
}
diff --git a/vendor/symfony/translation/Loader/YamlFileLoader.php b/vendor/symfony/translation/Loader/YamlFileLoader.php
index a34cf05..5d9a3ad 100644
--- a/vendor/symfony/translation/Loader/YamlFileLoader.php
+++ b/vendor/symfony/translation/Loader/YamlFileLoader.php
@@ -12,8 +12,6 @@
namespace Symfony\Component\Translation\Loader;
use Symfony\Component\Translation\Exception\InvalidResourceException;
-use Symfony\Component\Translation\Exception\NotFoundResourceException;
-use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Yaml\Parser as YamlParser;
use Symfony\Component\Yaml\Exception\ParseException;
@@ -22,28 +20,20 @@
*
* @author Fabien Potencier
*/
-class YamlFileLoader extends ArrayLoader
+class YamlFileLoader extends FileLoader
{
private $yamlParser;
/**
* {@inheritdoc}
*/
- public function load($resource, $locale, $domain = 'messages')
+ protected function loadResource($resource)
{
- if (!stream_is_local($resource)) {
- throw new InvalidResourceException(sprintf('This is not a local file "%s".', $resource));
- }
-
- if (!file_exists($resource)) {
- throw new NotFoundResourceException(sprintf('File "%s" not found.', $resource));
- }
-
- if (!class_exists('Symfony\Component\Yaml\Parser')) {
- throw new \LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
- }
-
if (null === $this->yamlParser) {
+ if (!class_exists('Symfony\Component\Yaml\Parser')) {
+ throw new \LogicException('Loading translations from the YAML format requires the Symfony Yaml component.');
+ }
+
$this->yamlParser = new YamlParser();
}
@@ -53,22 +43,6 @@ public function load($resource, $locale, $domain = 'messages')
throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $resource), 0, $e);
}
- // empty file
- if (null === $messages) {
- $messages = array();
- }
-
- // not an array
- if (!is_array($messages)) {
- throw new InvalidResourceException(sprintf('The file "%s" must contain a YAML array.', $resource));
- }
-
- $catalogue = parent::load($messages, $locale, $domain);
-
- if (class_exists('Symfony\Component\Config\Resource\FileResource')) {
- $catalogue->addResource(new FileResource($resource));
- }
-
- return $catalogue;
+ return $messages;
}
}
diff --git a/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd b/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd
new file mode 100644
index 0000000..963232f
--- /dev/null
+++ b/vendor/symfony/translation/Loader/schema/dic/xliff-core/xliff-core-2.0.xsd
@@ -0,0 +1,411 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/symfony/translation/PluralizationRules.php b/vendor/symfony/translation/PluralizationRules.php
index f250423..0974821 100644
--- a/vendor/symfony/translation/PluralizationRules.php
+++ b/vendor/symfony/translation/PluralizationRules.php
@@ -131,6 +131,7 @@ public static function get($number, $locale)
case 'fr':
case 'gun':
case 'hi':
+ case 'hy':
case 'ln':
case 'mg':
case 'nso':
diff --git a/vendor/symfony/translation/README.md b/vendor/symfony/translation/README.md
index 2b46b51..984f40d 100644
--- a/vendor/symfony/translation/README.md
+++ b/vendor/symfony/translation/README.md
@@ -28,7 +28,7 @@ https://github.com/silexphp/Silex/blob/master/src/Silex/Provider/TranslationServ
Documentation:
-https://symfony.com/doc/2.7/book/translation.html
+https://symfony.com/doc/2.8/book/translation.html
You can run the unit tests with the following command:
diff --git a/vendor/symfony/translation/Translator.php b/vendor/symfony/translation/Translator.php
index c6d8c16..ef8c7be 100644
--- a/vendor/symfony/translation/Translator.php
+++ b/vendor/symfony/translation/Translator.php
@@ -267,9 +267,13 @@ protected function getLoaders()
* @param string|null $locale Locale of translations, by default is current locale
*
* @return array[array] indexed by catalog
+ *
+ * @deprecated since version 2.8, to be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.
*/
public function getMessages($locale = null)
{
+ @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use TranslatorBagInterface::getCatalogue() method instead.', E_USER_DEPRECATED);
+
$catalogue = $this->getCatalogue($locale);
$messages = $catalogue->all();
while ($catalogue = $catalogue->getFallbackCatalogue()) {
diff --git a/vendor/symfony/translation/Util/ArrayConverter.php b/vendor/symfony/translation/Util/ArrayConverter.php
new file mode 100644
index 0000000..60a55e9
--- /dev/null
+++ b/vendor/symfony/translation/Util/ArrayConverter.php
@@ -0,0 +1,99 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Translation\Util;
+
+/**
+ * ArrayConverter generates tree like structure from a message catalogue.
+ * e.g. this
+ * 'foo.bar1' => 'test1',
+ * 'foo.bar2' => 'test2'
+ * converts to follows:
+ * foo:
+ * bar1: test1
+ * bar2: test2.
+ *
+ * @author Gennady Telegin
+ */
+class ArrayConverter
+{
+ /**
+ * Converts linear messages array to tree-like array.
+ * For example this rray('foo.bar' => 'value') will be converted to array('foo' => array('bar' => 'value')).
+ *
+ * @param array $messages Linear messages array
+ *
+ * @return array Tree-like messages array
+ */
+ public static function expandToTree(array $messages)
+ {
+ $tree = array();
+
+ foreach ($messages as $id => $value) {
+ $referenceToElement = &self::getElementByPath($tree, explode('.', $id));
+
+ $referenceToElement = $value;
+
+ unset($referenceToElement);
+ }
+
+ return $tree;
+ }
+
+ private static function &getElementByPath(array &$tree, array $parts)
+ {
+ $elem = &$tree;
+ $parentOfElem = null;
+
+ foreach ($parts as $i => $part) {
+ if (isset($elem[$part]) && is_string($elem[$part])) {
+ /* Process next case:
+ * 'foo': 'test1',
+ * 'foo.bar': 'test2'
+ *
+ * $tree['foo'] was string before we found array {bar: test2}.
+ * Treat new element as string too, e.g. add $tree['foo.bar'] = 'test2';
+ */
+ $elem = &$elem[ implode('.', array_slice($parts, $i)) ];
+ break;
+ }
+ $parentOfElem = &$elem;
+ $elem = &$elem[$part];
+ }
+
+ if (is_array($elem) && count($elem) > 0 && $parentOfElem) {
+ /* Process next case:
+ * 'foo.bar': 'test1'
+ * 'foo': 'test2'
+ *
+ * $tree['foo'] was array = {bar: 'test1'} before we found string constant `foo`.
+ * Cancel treating $tree['foo'] as array and cancel back it expansion,
+ * e.g. make it $tree['foo.bar'] = 'test1' again.
+ */
+ self::cancelExpand($parentOfElem, $part, $elem);
+ }
+
+ return $elem;
+ }
+
+ private static function cancelExpand(array &$tree, $prefix, array $node)
+ {
+ $prefix .= '.';
+
+ foreach ($node as $id => $value) {
+ if (is_string($value)) {
+ $tree[$prefix.$id] = $value;
+ } else {
+ self::cancelExpand($tree, $prefix.$id, $value);
+ }
+ }
+ }
+}
diff --git a/vendor/symfony/translation/Writer/TranslationWriter.php b/vendor/symfony/translation/Writer/TranslationWriter.php
index 44ac182..20d541d 100644
--- a/vendor/symfony/translation/Writer/TranslationWriter.php
+++ b/vendor/symfony/translation/Writer/TranslationWriter.php
@@ -77,8 +77,8 @@ public function writeTranslations(MessageCatalogue $catalogue, $format, $options
// get the right dumper
$dumper = $this->dumpers[$format];
- if (isset($options['path']) && !is_dir($options['path'])) {
- mkdir($options['path'], 0777, true);
+ if (isset($options['path']) && !is_dir($options['path']) && !@mkdir($options['path'], 0777, true) && !is_dir($options['path'])) {
+ throw new \RuntimeException(sprintf('Translation Writer was not able to create directory "%s"', $options['path']));
}
// save
diff --git a/vendor/symfony/translation/composer.json b/vendor/symfony/translation/composer.json
index ac833a4..79ff646 100644
--- a/vendor/symfony/translation/composer.json
+++ b/vendor/symfony/translation/composer.json
@@ -16,12 +16,13 @@
}
],
"require": {
- "php": ">=5.3.9"
+ "php": ">=5.3.9",
+ "symfony/polyfill-mbstring": "~1.0"
},
"require-dev": {
- "symfony/config": "~2.7",
- "symfony/intl": "~2.4",
- "symfony/yaml": "~2.2",
+ "symfony/config": "~2.8",
+ "symfony/intl": "~2.4|~3.0.0",
+ "symfony/yaml": "~2.2|~3.0.0",
"psr/log": "~1.0"
},
"conflict": {
@@ -33,12 +34,15 @@
"psr/log": "To use logging capability in translator"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Translation\\": "" }
+ "psr-4": { "Symfony\\Component\\Translation\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/translation/phpunit.xml.dist b/vendor/symfony/translation/phpunit.xml.dist
index 16cca4a..c25ec5e 100644
--- a/vendor/symfony/translation/phpunit.xml.dist
+++ b/vendor/symfony/translation/phpunit.xml.dist
@@ -20,8 +20,8 @@
./
- ./vendor
./Tests
+ ./vendor
diff --git a/vendor/symfony/validator/CHANGELOG.md b/vendor/symfony/validator/CHANGELOG.md
index 4531286..0ff667b 100644
--- a/vendor/symfony/validator/CHANGELOG.md
+++ b/vendor/symfony/validator/CHANGELOG.md
@@ -1,6 +1,11 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * added the BIC (SWIFT-Code) validator
+
2.7.0
-----
diff --git a/vendor/symfony/validator/ConstraintViolationInterface.php b/vendor/symfony/validator/ConstraintViolationInterface.php
index 1ed09b3..eff79b6 100644
--- a/vendor/symfony/validator/ConstraintViolationInterface.php
+++ b/vendor/symfony/validator/ConstraintViolationInterface.php
@@ -120,7 +120,7 @@ public function getInvalidValue();
/**
* Returns a machine-digestible error code for the violation.
*
- * @return mixed The error code.
+ * @return string|null The error code.
*/
public function getCode();
}
diff --git a/vendor/symfony/validator/Constraints/AbstractComparison.php b/vendor/symfony/validator/Constraints/AbstractComparison.php
index fb1f1f3..78db943 100644
--- a/vendor/symfony/validator/Constraints/AbstractComparison.php
+++ b/vendor/symfony/validator/Constraints/AbstractComparison.php
@@ -18,6 +18,7 @@
* Used for the comparison of values.
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
abstract class AbstractComparison extends Constraint
{
diff --git a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
index 67d73a5..ce04874 100644
--- a/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
+++ b/vendor/symfony/validator/Constraints/AbstractComparisonValidator.php
@@ -60,12 +60,14 @@ public function validate($value, Constraint $constraint)
->setParameter('{{ value }}', $this->formatValue($value, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value }}', $this->formatValue($comparedValue, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value_type }}', $this->formatTypeOf($comparedValue))
+ ->setCode($this->getErrorCode())
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value }}', $this->formatValue($comparedValue, self::OBJECT_TO_STRING | self::PRETTY_DATE))
->setParameter('{{ compared_value_type }}', $this->formatTypeOf($comparedValue))
+ ->setCode($this->getErrorCode())
->addViolation();
}
}
@@ -80,4 +82,13 @@ public function validate($value, Constraint $constraint)
* @return bool true if the relationship is valid, false otherwise
*/
abstract protected function compareValues($value1, $value2);
+
+ /**
+ * Returns the error code used if the comparison fails.
+ *
+ * @return string|null The error code or `null` if no code should be set
+ */
+ protected function getErrorCode()
+ {
+ }
}
diff --git a/vendor/symfony/validator/Constraints/Bic.php b/vendor/symfony/validator/Constraints/Bic.php
new file mode 100644
index 0000000..dee5d52
--- /dev/null
+++ b/vendor/symfony/validator/Constraints/Bic.php
@@ -0,0 +1,39 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Validator\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+
+/**
+ * @Annotation
+ * @Target({"PROPERTY", "METHOD", "ANNOTATION"})
+ *
+ * @author Michael Hirschler
+ */
+class Bic extends Constraint
+{
+ const INVALID_LENGTH_ERROR = '66dad313-af0b-4214-8566-6c799be9789c';
+ const INVALID_CHARACTERS_ERROR = 'f424c529-7add-4417-8f2d-4b656e4833e2';
+ const INVALID_BANK_CODE_ERROR = '00559357-6170-4f29-aebd-d19330aa19cf';
+ const INVALID_COUNTRY_CODE_ERROR = '1ce76f8d-3c1f-451c-9e62-fe9c3ed486ae';
+ const INVALID_CASE_ERROR = '11884038-3312-4ae5-9d04-699f782130c7';
+
+ protected static $errorNames = array(
+ self::INVALID_LENGTH_ERROR => 'INVALID_LENGTH_ERROR',
+ self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
+ self::INVALID_BANK_CODE_ERROR => 'INVALID_BANK_CODE_ERROR',
+ self::INVALID_COUNTRY_CODE_ERROR => 'INVALID_COUNTRY_CODE_ERROR',
+ self::INVALID_CASE_ERROR => 'INVALID_CASE_ERROR',
+ );
+
+ public $message = 'This is not a valid Business Identifier Code (BIC).';
+}
diff --git a/vendor/symfony/validator/Constraints/BicValidator.php b/vendor/symfony/validator/Constraints/BicValidator.php
new file mode 100644
index 0000000..f476713
--- /dev/null
+++ b/vendor/symfony/validator/Constraints/BicValidator.php
@@ -0,0 +1,85 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\Validator\Constraints;
+
+use Symfony\Component\Validator\Constraint;
+use Symfony\Component\Validator\ConstraintValidator;
+
+/**
+ * @author Michael Hirschler
+ *
+ * @link https://en.wikipedia.org/wiki/ISO_9362#Structure
+ */
+class BicValidator extends ConstraintValidator
+{
+ /**
+ * {@inheritdoc}
+ */
+ public function validate($value, Constraint $constraint)
+ {
+ if (null === $value || '' === $value) {
+ return;
+ }
+
+ $canonicalize = str_replace(' ', '', $value);
+
+ // the bic must be either 8 or 11 characters long
+ if (!in_array(strlen($canonicalize), array(8, 11))) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Bic::INVALID_LENGTH_ERROR)
+ ->addViolation();
+
+ return;
+ }
+
+ // must contain alphanumeric values only
+ if (!ctype_alnum($canonicalize)) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Bic::INVALID_CHARACTERS_ERROR)
+ ->addViolation();
+
+ return;
+ }
+
+ // first 4 letters must be alphabetic (bank code)
+ if (!ctype_alpha(substr($canonicalize, 0, 4))) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Bic::INVALID_BANK_CODE_ERROR)
+ ->addViolation();
+
+ return;
+ }
+
+ // next 2 letters must be alphabetic (country code)
+ if (!ctype_alpha(substr($canonicalize, 4, 2))) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Bic::INVALID_COUNTRY_CODE_ERROR)
+ ->addViolation();
+
+ return;
+ }
+
+ // should contain uppercase characters only
+ if (strtoupper($canonicalize) !== $canonicalize) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Bic::INVALID_CASE_ERROR)
+ ->addViolation();
+
+ return;
+ }
+ }
+}
diff --git a/vendor/symfony/validator/Constraints/Blank.php b/vendor/symfony/validator/Constraints/Blank.php
index ad93c74..030b21f 100644
--- a/vendor/symfony/validator/Constraints/Blank.php
+++ b/vendor/symfony/validator/Constraints/Blank.php
@@ -21,5 +21,11 @@
*/
class Blank extends Constraint
{
+ const NOT_BLANK_ERROR = '183ad2de-533d-4796-a439-6d3c3852b549';
+
+ protected static $errorNames = array(
+ self::NOT_BLANK_ERROR => 'NOT_BLANK_ERROR',
+ );
+
public $message = 'This value should be blank.';
}
diff --git a/vendor/symfony/validator/Constraints/BlankValidator.php b/vendor/symfony/validator/Constraints/BlankValidator.php
index de4b49b..4b9fd3d 100644
--- a/vendor/symfony/validator/Constraints/BlankValidator.php
+++ b/vendor/symfony/validator/Constraints/BlankValidator.php
@@ -34,10 +34,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Blank::NOT_BLANK_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Blank::NOT_BLANK_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/CardScheme.php b/vendor/symfony/validator/Constraints/CardScheme.php
index 14f3b5d..40c32e8 100644
--- a/vendor/symfony/validator/Constraints/CardScheme.php
+++ b/vendor/symfony/validator/Constraints/CardScheme.php
@@ -24,8 +24,8 @@
*/
class CardScheme extends Constraint
{
- const NOT_NUMERIC_ERROR = 1;
- const INVALID_FORMAT_ERROR = 2;
+ const NOT_NUMERIC_ERROR = 'a2ad9231-e827-485f-8a1e-ef4d9a6d5c2e';
+ const INVALID_FORMAT_ERROR = 'a8faedbf-1c2f-4695-8d22-55783be8efed';
protected static $errorNames = array(
self::NOT_NUMERIC_ERROR => 'NOT_NUMERIC_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Choice.php b/vendor/symfony/validator/Constraints/Choice.php
index 4e2c8e7..4b93c70 100644
--- a/vendor/symfony/validator/Constraints/Choice.php
+++ b/vendor/symfony/validator/Constraints/Choice.php
@@ -21,9 +21,9 @@
*/
class Choice extends Constraint
{
- const NO_SUCH_CHOICE_ERROR = 1;
- const TOO_FEW_ERROR = 2;
- const TOO_MANY_ERROR = 3;
+ const NO_SUCH_CHOICE_ERROR = '8e179f1b-97aa-4560-a02f-2a8b42e49df7';
+ const TOO_FEW_ERROR = '11edd7eb-5872-4b6e-9f12-89923999fd0e';
+ const TOO_MANY_ERROR = '9bd98e49-211c-433f-8630-fd1c2d0f08c3';
protected static $errorNames = array(
self::NO_SUCH_CHOICE_ERROR => 'NO_SUCH_CHOICE_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Collection.php b/vendor/symfony/validator/Constraints/Collection.php
index ae55366..ac1edd3 100644
--- a/vendor/symfony/validator/Constraints/Collection.php
+++ b/vendor/symfony/validator/Constraints/Collection.php
@@ -21,8 +21,8 @@
*/
class Collection extends Composite
{
- const MISSING_FIELD_ERROR = 1;
- const NO_SUCH_FIELD_ERROR = 2;
+ const MISSING_FIELD_ERROR = '2fa2158c-2a7f-484b-98aa-975522539ff8';
+ const NO_SUCH_FIELD_ERROR = '7703c766-b5d5-4cef-ace7-ae0dd82304e9';
protected static $errorNames = array(
self::MISSING_FIELD_ERROR => 'MISSING_FIELD_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Count.php b/vendor/symfony/validator/Constraints/Count.php
index 3378227..53870fb 100644
--- a/vendor/symfony/validator/Constraints/Count.php
+++ b/vendor/symfony/validator/Constraints/Count.php
@@ -22,8 +22,8 @@
*/
class Count extends Constraint
{
- const TOO_FEW_ERROR = 1;
- const TOO_MANY_ERROR = 2;
+ const TOO_FEW_ERROR = 'bef8e338-6ae5-4caf-b8e2-50e7b0579e69';
+ const TOO_MANY_ERROR = '756b1212-697c-468d-a9ad-50dd783bb169';
protected static $errorNames = array(
self::TOO_FEW_ERROR => 'TOO_FEW_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Country.php b/vendor/symfony/validator/Constraints/Country.php
index d1df3a8..1b76570 100644
--- a/vendor/symfony/validator/Constraints/Country.php
+++ b/vendor/symfony/validator/Constraints/Country.php
@@ -21,5 +21,11 @@
*/
class Country extends Constraint
{
+ const NO_SUCH_COUNTRY_ERROR = '8f900c12-61bd-455d-9398-996cd040f7f0';
+
+ protected static $errorNames = array(
+ self::NO_SUCH_COUNTRY_ERROR => 'NO_SUCH_COUNTRY_ERROR',
+ );
+
public $message = 'This value is not a valid country.';
}
diff --git a/vendor/symfony/validator/Constraints/CountryValidator.php b/vendor/symfony/validator/Constraints/CountryValidator.php
index 22b7909..138d775 100644
--- a/vendor/symfony/validator/Constraints/CountryValidator.php
+++ b/vendor/symfony/validator/Constraints/CountryValidator.php
@@ -48,10 +48,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Country::NO_SUCH_COUNTRY_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Country::NO_SUCH_COUNTRY_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Currency.php b/vendor/symfony/validator/Constraints/Currency.php
index 736af83..d28f94c 100644
--- a/vendor/symfony/validator/Constraints/Currency.php
+++ b/vendor/symfony/validator/Constraints/Currency.php
@@ -18,8 +18,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Miha Vrhovnik
+ * @author Bernhard Schussek
*/
class Currency extends Constraint
{
+ const NO_SUCH_CURRENCY_ERROR = '69945ac1-2db4-405f-bec7-d2772f73df52';
+
+ protected static $errorNames = array(
+ self::NO_SUCH_CURRENCY_ERROR => 'NO_SUCH_CURRENCY_ERROR',
+ );
+
public $message = 'This value is not a valid currency.';
}
diff --git a/vendor/symfony/validator/Constraints/CurrencyValidator.php b/vendor/symfony/validator/Constraints/CurrencyValidator.php
index 4fa91d5..043bafa 100644
--- a/vendor/symfony/validator/Constraints/CurrencyValidator.php
+++ b/vendor/symfony/validator/Constraints/CurrencyValidator.php
@@ -21,6 +21,7 @@
* Validates whether a value is a valid currency.
*
* @author Miha Vrhovnik
+ * @author Bernhard Schussek
*/
class CurrencyValidator extends ConstraintValidator
{
@@ -48,10 +49,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Currency::NO_SUCH_CURRENCY_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Currency::NO_SUCH_CURRENCY_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Date.php b/vendor/symfony/validator/Constraints/Date.php
index 1001d78..2563413 100644
--- a/vendor/symfony/validator/Constraints/Date.php
+++ b/vendor/symfony/validator/Constraints/Date.php
@@ -21,8 +21,8 @@
*/
class Date extends Constraint
{
- const INVALID_FORMAT_ERROR = 1;
- const INVALID_DATE_ERROR = 2;
+ const INVALID_FORMAT_ERROR = '69819696-02ac-4a99-9ff0-14e127c4d1bc';
+ const INVALID_DATE_ERROR = '3c184ce5-b31d-4de7-8b76-326da7b2be93';
protected static $errorNames = array(
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/DateTime.php b/vendor/symfony/validator/Constraints/DateTime.php
index a71bbbd..35e2934 100644
--- a/vendor/symfony/validator/Constraints/DateTime.php
+++ b/vendor/symfony/validator/Constraints/DateTime.php
@@ -21,9 +21,9 @@
*/
class DateTime extends Constraint
{
- const INVALID_FORMAT_ERROR = 1;
- const INVALID_DATE_ERROR = 2;
- const INVALID_TIME_ERROR = 3;
+ const INVALID_FORMAT_ERROR = '1a9da513-2640-4f84-9b6a-4d99dcddc628';
+ const INVALID_DATE_ERROR = 'd52afa47-620d-4d99-9f08-f4d85b36e33c';
+ const INVALID_TIME_ERROR = '5e797c9d-74f7-4098-baa3-94390c447b27';
protected static $errorNames = array(
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Email.php b/vendor/symfony/validator/Constraints/Email.php
index 96abf2c..a9d9ab1 100644
--- a/vendor/symfony/validator/Constraints/Email.php
+++ b/vendor/symfony/validator/Constraints/Email.php
@@ -21,9 +21,9 @@
*/
class Email extends Constraint
{
- const INVALID_FORMAT_ERROR = 1;
- const MX_CHECK_FAILED_ERROR = 2;
- const HOST_CHECK_FAILED_ERROR = 3;
+ const INVALID_FORMAT_ERROR = 'bd79c0ab-ddba-46cc-a703-a7a4b08de310';
+ const MX_CHECK_FAILED_ERROR = 'bf447c1c-0266-4e10-9c6c-573df282e413';
+ const HOST_CHECK_FAILED_ERROR = '7da53a8b-56f3-4288-bb3e-ee9ede4ef9a1';
protected static $errorNames = array(
self::INVALID_FORMAT_ERROR => 'STRICT_CHECK_FAILED_ERROR',
diff --git a/vendor/symfony/validator/Constraints/EqualTo.php b/vendor/symfony/validator/Constraints/EqualTo.php
index 8d3d752..4b22c6d 100644
--- a/vendor/symfony/validator/Constraints/EqualTo.php
+++ b/vendor/symfony/validator/Constraints/EqualTo.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class EqualTo extends AbstractComparison
{
+ const NOT_EQUAL_ERROR = '478618a7-95ba-473d-9101-cabd45e49115';
+
+ protected static $errorNames = array(
+ self::NOT_EQUAL_ERROR => 'NOT_EQUAL_ERROR',
+ );
+
public $message = 'This value should be equal to {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/EqualToValidator.php b/vendor/symfony/validator/Constraints/EqualToValidator.php
index 3739dbe..fe1f362 100644
--- a/vendor/symfony/validator/Constraints/EqualToValidator.php
+++ b/vendor/symfony/validator/Constraints/EqualToValidator.php
@@ -15,6 +15,7 @@
* Validates values are equal (==).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class EqualToValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 == $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return EqualTo::NOT_EQUAL_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/Expression.php b/vendor/symfony/validator/Constraints/Expression.php
index dfa242c..3329bd2 100644
--- a/vendor/symfony/validator/Constraints/Expression.php
+++ b/vendor/symfony/validator/Constraints/Expression.php
@@ -22,6 +22,12 @@
*/
class Expression extends Constraint
{
+ const EXPRESSION_FAILED_ERROR = '6b3befbc-2f01-4ddf-be21-b57898905284';
+
+ protected static $errorNames = array(
+ self::EXPRESSION_FAILED_ERROR => 'EXPRESSION_FAILED_ERROR',
+ );
+
public $message = 'This value is not valid.';
public $expression;
diff --git a/vendor/symfony/validator/Constraints/ExpressionValidator.php b/vendor/symfony/validator/Constraints/ExpressionValidator.php
index 15d51f9..8cc289b 100644
--- a/vendor/symfony/validator/Constraints/ExpressionValidator.php
+++ b/vendor/symfony/validator/Constraints/ExpressionValidator.php
@@ -37,18 +37,10 @@ class ExpressionValidator extends ConstraintValidator
*/
private $expressionLanguage;
- /**
- * @param PropertyAccessorInterface|null $propertyAccessor Optional as of Symfony 2.5
- *
- * @throws UnexpectedTypeException If the property accessor is invalid
- */
- public function __construct($propertyAccessor = null)
+ public function __construct(PropertyAccessorInterface $propertyAccessor = null, ExpressionLanguage $expressionLanguage = null)
{
- if (null !== $propertyAccessor && !$propertyAccessor instanceof PropertyAccessorInterface) {
- throw new UnexpectedTypeException($propertyAccessor, 'null or \Symfony\Component\PropertyAccess\PropertyAccessorInterface');
- }
-
$this->propertyAccessor = $propertyAccessor;
+ $this->expressionLanguage = $expressionLanguage;
}
/**
@@ -88,10 +80,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Expression::EXPRESSION_FAILED_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Expression::EXPRESSION_FAILED_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/File.php b/vendor/symfony/validator/Constraints/File.php
index de9fc00..24c7495 100644
--- a/vendor/symfony/validator/Constraints/File.php
+++ b/vendor/symfony/validator/Constraints/File.php
@@ -24,11 +24,11 @@ class File extends Constraint
{
// Check the Image constraint for clashes if adding new constants here
- const NOT_FOUND_ERROR = 1;
- const NOT_READABLE_ERROR = 2;
- const EMPTY_ERROR = 3;
- const TOO_LARGE_ERROR = 4;
- const INVALID_MIME_TYPE_ERROR = 5;
+ const NOT_FOUND_ERROR = 'd2a3fb6e-7ddc-4210-8fbf-2ab345ce1998';
+ const NOT_READABLE_ERROR = 'c20c92a4-5bfa-4202-9477-28e800e0f6ff';
+ const EMPTY_ERROR = '5d743385-9775-4aa5-8ff5-495fb1e60137';
+ const TOO_LARGE_ERROR = 'df8637af-d466-48c6-a59d-e7126250a654';
+ const INVALID_MIME_TYPE_ERROR = '744f00bc-4389-4c74-92de-9a43cde55534';
protected static $errorNames = array(
self::NOT_FOUND_ERROR => 'NOT_FOUND_ERROR',
diff --git a/vendor/symfony/validator/Constraints/GreaterThan.php b/vendor/symfony/validator/Constraints/GreaterThan.php
index ec7fafb..c2ca2dc 100644
--- a/vendor/symfony/validator/Constraints/GreaterThan.php
+++ b/vendor/symfony/validator/Constraints/GreaterThan.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class GreaterThan extends AbstractComparison
{
+ const TOO_LOW_ERROR = '778b7ae0-84d3-481a-9dec-35fdb64b1d78';
+
+ protected static $errorNames = array(
+ self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
+ );
+
public $message = 'This value should be greater than {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/GreaterThanOrEqual.php b/vendor/symfony/validator/Constraints/GreaterThanOrEqual.php
index 36fdd9c..9b3743d 100644
--- a/vendor/symfony/validator/Constraints/GreaterThanOrEqual.php
+++ b/vendor/symfony/validator/Constraints/GreaterThanOrEqual.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class GreaterThanOrEqual extends AbstractComparison
{
+ const TOO_LOW_ERROR = 'ea4e51d1-3342-48bd-87f1-9e672cd90cad';
+
+ protected static $errorNames = array(
+ self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
+ );
+
public $message = 'This value should be greater than or equal to {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/GreaterThanOrEqualValidator.php b/vendor/symfony/validator/Constraints/GreaterThanOrEqualValidator.php
index 2363204..e196e68 100644
--- a/vendor/symfony/validator/Constraints/GreaterThanOrEqualValidator.php
+++ b/vendor/symfony/validator/Constraints/GreaterThanOrEqualValidator.php
@@ -15,6 +15,7 @@
* Validates values are greater than or equal to the previous (>=).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class GreaterThanOrEqualValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 >= $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return GreaterThanOrEqual::TOO_LOW_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/GreaterThanValidator.php b/vendor/symfony/validator/Constraints/GreaterThanValidator.php
index fdcf0c1..9029e8f 100644
--- a/vendor/symfony/validator/Constraints/GreaterThanValidator.php
+++ b/vendor/symfony/validator/Constraints/GreaterThanValidator.php
@@ -15,6 +15,7 @@
* Validates values are greater than the previous (>).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class GreaterThanValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 > $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return GreaterThan::TOO_LOW_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/GroupSequenceProvider.php b/vendor/symfony/validator/Constraints/GroupSequenceProvider.php
index 3904473..8a3fe63 100644
--- a/vendor/symfony/validator/Constraints/GroupSequenceProvider.php
+++ b/vendor/symfony/validator/Constraints/GroupSequenceProvider.php
@@ -16,6 +16,8 @@
*
* @Annotation
* @Target({"CLASS", "ANNOTATION"})
+ *
+ * @author Bernhard Schussek
*/
class GroupSequenceProvider
{
diff --git a/vendor/symfony/validator/Constraints/Iban.php b/vendor/symfony/validator/Constraints/Iban.php
index c4dc985..9c4d383 100644
--- a/vendor/symfony/validator/Constraints/Iban.php
+++ b/vendor/symfony/validator/Constraints/Iban.php
@@ -24,14 +24,14 @@
class Iban extends Constraint
{
/** @deprecated, to be removed in 3.0. */
- const TOO_SHORT_ERROR = 1;
- const INVALID_COUNTRY_CODE_ERROR = 2;
- const INVALID_CHARACTERS_ERROR = 3;
+ const TOO_SHORT_ERROR = '88e5e319-0aeb-4979-a27e-3d9ce0c16166';
+ const INVALID_COUNTRY_CODE_ERROR = 'de78ee2c-bd50-44e2-aec8-3d8228aeadb9';
+ const INVALID_CHARACTERS_ERROR = '8d3d85e4-784f-4719-a5bc-d9e40d45a3a5';
/** @deprecated, to be removed in 3.0. */
- const INVALID_CASE_ERROR = 4;
- const CHECKSUM_FAILED_ERROR = 5;
- const INVALID_FORMAT_ERROR = 6;
- const NOT_SUPPORTED_COUNTRY_CODE_ERROR = 7;
+ const INVALID_CASE_ERROR = 'f4bf62fe-03ec-42af-a53b-68e21b1e7274';
+ const CHECKSUM_FAILED_ERROR = 'b9401321-f9bf-4dcb-83c1-f31094440795';
+ const INVALID_FORMAT_ERROR = 'c8d318f1-2ecc-41ba-b983-df70d225cf5a';
+ const NOT_SUPPORTED_COUNTRY_CODE_ERROR = 'e2c259f3-4b46-48e6-b72e-891658158ec8';
protected static $errorNames = array(
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/IdenticalTo.php b/vendor/symfony/validator/Constraints/IdenticalTo.php
index 6d00286..a7dadff 100644
--- a/vendor/symfony/validator/Constraints/IdenticalTo.php
+++ b/vendor/symfony/validator/Constraints/IdenticalTo.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class IdenticalTo extends AbstractComparison
{
+ const NOT_IDENTICAL_ERROR = '2a8cc50f-58a2-4536-875e-060a2ce69ed5';
+
+ protected static $errorNames = array(
+ self::NOT_IDENTICAL_ERROR => 'NOT_IDENTICAL_ERROR',
+ );
+
public $message = 'This value should be identical to {{ compared_value_type }} {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/IdenticalToValidator.php b/vendor/symfony/validator/Constraints/IdenticalToValidator.php
index a186726..304f71f 100644
--- a/vendor/symfony/validator/Constraints/IdenticalToValidator.php
+++ b/vendor/symfony/validator/Constraints/IdenticalToValidator.php
@@ -15,6 +15,7 @@
* Validates values are identical (===).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class IdenticalToValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 === $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return IdenticalTo::NOT_IDENTICAL_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/Image.php b/vendor/symfony/validator/Constraints/Image.php
index f75c6a2..28803c4 100644
--- a/vendor/symfony/validator/Constraints/Image.php
+++ b/vendor/symfony/validator/Constraints/Image.php
@@ -20,18 +20,16 @@
*/
class Image extends File
{
- // Don't reuse values used in File
-
- const SIZE_NOT_DETECTED_ERROR = 10;
- const TOO_WIDE_ERROR = 11;
- const TOO_NARROW_ERROR = 12;
- const TOO_HIGH_ERROR = 13;
- const TOO_LOW_ERROR = 14;
- const RATIO_TOO_BIG_ERROR = 15;
- const RATIO_TOO_SMALL_ERROR = 16;
- const SQUARE_NOT_ALLOWED_ERROR = 17;
- const LANDSCAPE_NOT_ALLOWED_ERROR = 18;
- const PORTRAIT_NOT_ALLOWED_ERROR = 19;
+ const SIZE_NOT_DETECTED_ERROR = '6d55c3f4-e58e-4fe3-91ee-74b492199956';
+ const TOO_WIDE_ERROR = '7f87163d-878f-47f5-99ba-a8eb723a1ab2';
+ const TOO_NARROW_ERROR = '9afbd561-4f90-4a27-be62-1780fc43604a';
+ const TOO_HIGH_ERROR = '7efae81c-4877-47ba-aa65-d01ccb0d4645';
+ const TOO_LOW_ERROR = 'aef0cb6a-c07f-4894-bc08-1781420d7b4c';
+ const RATIO_TOO_BIG_ERROR = '70cafca6-168f-41c9-8c8c-4e47a52be643';
+ const RATIO_TOO_SMALL_ERROR = '59b8c6ef-bcf2-4ceb-afff-4642ed92f12e';
+ const SQUARE_NOT_ALLOWED_ERROR = '5d41425b-facb-47f7-a55a-de9fbe45cb46';
+ const LANDSCAPE_NOT_ALLOWED_ERROR = '6f895685-7cf2-4d65-b3da-9029c5581d88';
+ const PORTRAIT_NOT_ALLOWED_ERROR = '65608156-77da-4c79-a88c-02ef6d18c782';
// Include the mapping from the base class
diff --git a/vendor/symfony/validator/Constraints/Ip.php b/vendor/symfony/validator/Constraints/Ip.php
index 8096502..36772c6 100644
--- a/vendor/symfony/validator/Constraints/Ip.php
+++ b/vendor/symfony/validator/Constraints/Ip.php
@@ -44,6 +44,8 @@ class Ip extends Constraint
const V6_ONLY_PUBLIC = '6_public';
const ALL_ONLY_PUBLIC = 'all_public';
+ const INVALID_IP_ERROR = 'b1b427ae-9f6f-41b0-aa9b-84511fbb3c5b';
+
protected static $versions = array(
self::V4,
self::V6,
@@ -62,6 +64,10 @@ class Ip extends Constraint
self::ALL_ONLY_PUBLIC,
);
+ protected static $errorNames = array(
+ self::INVALID_IP_ERROR => 'INVALID_IP_ERROR',
+ );
+
public $version = self::V4;
public $message = 'This is not a valid IP address.';
diff --git a/vendor/symfony/validator/Constraints/IpValidator.php b/vendor/symfony/validator/Constraints/IpValidator.php
index 0b17cf7..eb8642b 100644
--- a/vendor/symfony/validator/Constraints/IpValidator.php
+++ b/vendor/symfony/validator/Constraints/IpValidator.php
@@ -97,10 +97,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Ip::INVALID_IP_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Ip::INVALID_IP_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/IsFalse.php b/vendor/symfony/validator/Constraints/IsFalse.php
index 71a0ed6..8332e18 100644
--- a/vendor/symfony/validator/Constraints/IsFalse.php
+++ b/vendor/symfony/validator/Constraints/IsFalse.php
@@ -21,5 +21,11 @@
*/
class IsFalse extends Constraint
{
+ const NOT_FALSE_ERROR = 'd53a91b0-def3-426a-83d7-269da7ab4200';
+
+ protected static $errorNames = array(
+ self::NOT_FALSE_ERROR => 'NOT_FALSE_ERROR',
+ );
+
public $message = 'This value should be false.';
}
diff --git a/vendor/symfony/validator/Constraints/IsFalseValidator.php b/vendor/symfony/validator/Constraints/IsFalseValidator.php
index b78163b..522a1a2 100644
--- a/vendor/symfony/validator/Constraints/IsFalseValidator.php
+++ b/vendor/symfony/validator/Constraints/IsFalseValidator.php
@@ -37,10 +37,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsFalse::NOT_FALSE_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsFalse::NOT_FALSE_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/IsNull.php b/vendor/symfony/validator/Constraints/IsNull.php
index 64e837a..fdd2930 100644
--- a/vendor/symfony/validator/Constraints/IsNull.php
+++ b/vendor/symfony/validator/Constraints/IsNull.php
@@ -21,5 +21,11 @@
*/
class IsNull extends Constraint
{
+ const NOT_NULL_ERROR = '60d2f30b-8cfa-4372-b155-9656634de120';
+
+ protected static $errorNames = array(
+ self::NOT_NULL_ERROR => 'NOT_NULL_ERROR',
+ );
+
public $message = 'This value should be null.';
}
diff --git a/vendor/symfony/validator/Constraints/IsNullValidator.php b/vendor/symfony/validator/Constraints/IsNullValidator.php
index 5615121..1b7567f 100644
--- a/vendor/symfony/validator/Constraints/IsNullValidator.php
+++ b/vendor/symfony/validator/Constraints/IsNullValidator.php
@@ -34,10 +34,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsNull::NOT_NULL_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsNull::NOT_NULL_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/IsTrue.php b/vendor/symfony/validator/Constraints/IsTrue.php
index 653135b..405a96a 100644
--- a/vendor/symfony/validator/Constraints/IsTrue.php
+++ b/vendor/symfony/validator/Constraints/IsTrue.php
@@ -21,5 +21,11 @@
*/
class IsTrue extends Constraint
{
+ const NOT_TRUE_ERROR = '2beabf1c-54c0-4882-a928-05249b26e23b';
+
+ protected static $errorNames = array(
+ self::NOT_TRUE_ERROR => 'NOT_TRUE_ERROR',
+ );
+
public $message = 'This value should be true.';
}
diff --git a/vendor/symfony/validator/Constraints/IsTrueValidator.php b/vendor/symfony/validator/Constraints/IsTrueValidator.php
index 2882dd6..e1ca56e 100644
--- a/vendor/symfony/validator/Constraints/IsTrueValidator.php
+++ b/vendor/symfony/validator/Constraints/IsTrueValidator.php
@@ -38,10 +38,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsTrue::NOT_TRUE_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(IsTrue::NOT_TRUE_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Isbn.php b/vendor/symfony/validator/Constraints/Isbn.php
index 3878c84..f1e83b9 100644
--- a/vendor/symfony/validator/Constraints/Isbn.php
+++ b/vendor/symfony/validator/Constraints/Isbn.php
@@ -23,11 +23,11 @@
*/
class Isbn extends Constraint
{
- const TOO_SHORT_ERROR = 1;
- const TOO_LONG_ERROR = 2;
- const INVALID_CHARACTERS_ERROR = 3;
- const CHECKSUM_FAILED_ERROR = 4;
- const TYPE_NOT_RECOGNIZED_ERROR = 5;
+ const TOO_SHORT_ERROR = '949acbb0-8ef5-43ed-a0e9-032dfd08ae45';
+ const TOO_LONG_ERROR = '3171387d-f80a-47b3-bd6e-60598545316a';
+ const INVALID_CHARACTERS_ERROR = '23d21cea-da99-453d-98b1-a7d916fbb339';
+ const CHECKSUM_FAILED_ERROR = '2881c032-660f-46b6-8153-d352d9706640';
+ const TYPE_NOT_RECOGNIZED_ERROR = 'fa54a457-f042-441f-89c4-066ee5bdd3e1';
protected static $errorNames = array(
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Issn.php b/vendor/symfony/validator/Constraints/Issn.php
index 39716a2..a2fecdd 100644
--- a/vendor/symfony/validator/Constraints/Issn.php
+++ b/vendor/symfony/validator/Constraints/Issn.php
@@ -22,12 +22,12 @@
*/
class Issn extends Constraint
{
- const TOO_SHORT_ERROR = 1;
- const TOO_LONG_ERROR = 2;
- const MISSING_HYPHEN_ERROR = 3;
- const INVALID_CHARACTERS_ERROR = 4;
- const INVALID_CASE_ERROR = 5;
- const CHECKSUM_FAILED_ERROR = 6;
+ const TOO_SHORT_ERROR = '6a20dd3d-f463-4460-8e7b-18a1b98abbfb';
+ const TOO_LONG_ERROR = '37cef893-5871-464e-8b12-7fb79324833c';
+ const MISSING_HYPHEN_ERROR = '2983286f-8134-4693-957a-1ec4ef887b15';
+ const INVALID_CHARACTERS_ERROR = 'a663d266-37c2-4ece-a914-ae891940c588';
+ const INVALID_CASE_ERROR = '7b6dd393-7523-4a6c-b84d-72b91bba5e1a';
+ const CHECKSUM_FAILED_ERROR = 'b0f92dbc-667c-48de-b526-ad9586d43e85';
protected static $errorNames = array(
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Language.php b/vendor/symfony/validator/Constraints/Language.php
index c6f513c..0e676b7 100644
--- a/vendor/symfony/validator/Constraints/Language.php
+++ b/vendor/symfony/validator/Constraints/Language.php
@@ -21,5 +21,11 @@
*/
class Language extends Constraint
{
+ const NO_SUCH_LANGUAGE_ERROR = 'ee65fec4-9a20-4202-9f39-ca558cd7bdf7';
+
+ protected static $errorNames = array(
+ self::NO_SUCH_LANGUAGE_ERROR => 'NO_SUCH_LANGUAGE_ERROR',
+ );
+
public $message = 'This value is not a valid language.';
}
diff --git a/vendor/symfony/validator/Constraints/LanguageValidator.php b/vendor/symfony/validator/Constraints/LanguageValidator.php
index 1f514ab..19c1ba8 100644
--- a/vendor/symfony/validator/Constraints/LanguageValidator.php
+++ b/vendor/symfony/validator/Constraints/LanguageValidator.php
@@ -48,10 +48,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Language::NO_SUCH_LANGUAGE_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Language::NO_SUCH_LANGUAGE_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Length.php b/vendor/symfony/validator/Constraints/Length.php
index bca4edb..0f96508 100644
--- a/vendor/symfony/validator/Constraints/Length.php
+++ b/vendor/symfony/validator/Constraints/Length.php
@@ -22,12 +22,14 @@
*/
class Length extends Constraint
{
- const TOO_SHORT_ERROR = 1;
- const TOO_LONG_ERROR = 2;
+ const TOO_SHORT_ERROR = '9ff3fdc4-b214-49db-8718-39c315e33d45';
+ const TOO_LONG_ERROR = 'd94b19cc-114f-4f44-9cc4-4138e80a87b9';
+ const INVALID_CHARACTERS_ERROR = '35e6a710-aa2e-4719-b58e-24b35749b767';
protected static $errorNames = array(
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
self::TOO_LONG_ERROR => 'TOO_LONG_ERROR',
+ self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
);
public $maxMessage = 'This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.';
diff --git a/vendor/symfony/validator/Constraints/LengthValidator.php b/vendor/symfony/validator/Constraints/LengthValidator.php
index d340749..9ecfb8c 100644
--- a/vendor/symfony/validator/Constraints/LengthValidator.php
+++ b/vendor/symfony/validator/Constraints/LengthValidator.php
@@ -39,32 +39,13 @@ public function validate($value, Constraint $constraint)
}
$stringValue = (string) $value;
- $invalidCharset = false;
if ('UTF8' === $charset = strtoupper($constraint->charset)) {
- $charset = 'UTF-8';
+ $charset = 'UTF-8'; // iconv on Windows requires "UTF-8" instead of "UTF8"
}
- if ('UTF-8' === $charset) {
- if (!preg_match('//u', $stringValue)) {
- $invalidCharset = true;
- } elseif (function_exists('utf8_decode')) {
- $length = strlen(utf8_decode($stringValue));
- } else {
- preg_replace('/./u', '', $stringValue, -1, $length);
- }
- } elseif (function_exists('mb_strlen')) {
- if (@mb_check_encoding($stringValue, $constraint->charset)) {
- $length = mb_strlen($stringValue, $constraint->charset);
- } else {
- $invalidCharset = true;
- }
- } elseif (function_exists('iconv_strlen')) {
- $length = @iconv_strlen($stringValue, $constraint->charset);
- $invalidCharset = false === $length;
- } else {
- $length = strlen($stringValue);
- }
+ $length = @iconv_strlen($stringValue, $charset);
+ $invalidCharset = false === $length;
if ($invalidCharset) {
if ($this->context instanceof ExecutionContextInterface) {
@@ -72,12 +53,14 @@ public function validate($value, Constraint $constraint)
->setParameter('{{ value }}', $this->formatValue($stringValue))
->setParameter('{{ charset }}', $constraint->charset)
->setInvalidValue($value)
+ ->setCode(Length::INVALID_CHARACTERS_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->charsetMessage)
->setParameter('{{ value }}', $this->formatValue($stringValue))
->setParameter('{{ charset }}', $constraint->charset)
->setInvalidValue($value)
+ ->setCode(Length::INVALID_CHARACTERS_ERROR)
->addViolation();
}
diff --git a/vendor/symfony/validator/Constraints/LessThan.php b/vendor/symfony/validator/Constraints/LessThan.php
index b116320..1bbb508 100644
--- a/vendor/symfony/validator/Constraints/LessThan.php
+++ b/vendor/symfony/validator/Constraints/LessThan.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class LessThan extends AbstractComparison
{
+ const TOO_HIGH_ERROR = '079d7420-2d13-460c-8756-de810eeb37d2';
+
+ protected static $errorNames = array(
+ self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
+ );
+
public $message = 'This value should be less than {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/LessThanOrEqual.php b/vendor/symfony/validator/Constraints/LessThanOrEqual.php
index 7faca84..d118942 100644
--- a/vendor/symfony/validator/Constraints/LessThanOrEqual.php
+++ b/vendor/symfony/validator/Constraints/LessThanOrEqual.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class LessThanOrEqual extends AbstractComparison
{
+ const TOO_HIGH_ERROR = '079d7420-2d13-460c-8756-de810eeb37d2';
+
+ protected static $errorNames = array(
+ self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
+ );
+
public $message = 'This value should be less than or equal to {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/LessThanOrEqualValidator.php b/vendor/symfony/validator/Constraints/LessThanOrEqualValidator.php
index dcc93b2..54281ee 100644
--- a/vendor/symfony/validator/Constraints/LessThanOrEqualValidator.php
+++ b/vendor/symfony/validator/Constraints/LessThanOrEqualValidator.php
@@ -15,6 +15,7 @@
* Validates values are less than or equal to the previous (<=).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class LessThanOrEqualValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 <= $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return LessThanOrEqual::TOO_HIGH_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/LessThanValidator.php b/vendor/symfony/validator/Constraints/LessThanValidator.php
index 081316a..ef7535f 100644
--- a/vendor/symfony/validator/Constraints/LessThanValidator.php
+++ b/vendor/symfony/validator/Constraints/LessThanValidator.php
@@ -15,6 +15,7 @@
* Validates values are less than the previous (<).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class LessThanValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 < $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return LessThan::TOO_HIGH_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/Locale.php b/vendor/symfony/validator/Constraints/Locale.php
index cf30eb2..5aa7070 100644
--- a/vendor/symfony/validator/Constraints/Locale.php
+++ b/vendor/symfony/validator/Constraints/Locale.php
@@ -21,5 +21,11 @@
*/
class Locale extends Constraint
{
+ const NO_SUCH_LOCALE_ERROR = 'a0af4293-1f1a-4a1c-a328-979cba6182a2';
+
+ protected static $errorNames = array(
+ self::NO_SUCH_LOCALE_ERROR => 'NO_SUCH_LOCALE_ERROR',
+ );
+
public $message = 'This value is not a valid locale.';
}
diff --git a/vendor/symfony/validator/Constraints/LocaleValidator.php b/vendor/symfony/validator/Constraints/LocaleValidator.php
index 038a1a4..aa4a99f 100644
--- a/vendor/symfony/validator/Constraints/LocaleValidator.php
+++ b/vendor/symfony/validator/Constraints/LocaleValidator.php
@@ -48,10 +48,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Locale::NO_SUCH_LOCALE_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Locale::NO_SUCH_LOCALE_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Luhn.php b/vendor/symfony/validator/Constraints/Luhn.php
index 24f5bc7..67f152d 100644
--- a/vendor/symfony/validator/Constraints/Luhn.php
+++ b/vendor/symfony/validator/Constraints/Luhn.php
@@ -25,8 +25,8 @@
*/
class Luhn extends Constraint
{
- const INVALID_CHARACTERS_ERROR = 1;
- const CHECKSUM_FAILED_ERROR = 2;
+ const INVALID_CHARACTERS_ERROR = 'dfad6d23-1b74-4374-929b-5cbb56fc0d9e';
+ const CHECKSUM_FAILED_ERROR = '4d760774-3f50-4cd5-a6d5-b10a3299d8d3';
protected static $errorNames = array(
self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
diff --git a/vendor/symfony/validator/Constraints/NotBlank.php b/vendor/symfony/validator/Constraints/NotBlank.php
index 750f412..e059f10 100644
--- a/vendor/symfony/validator/Constraints/NotBlank.php
+++ b/vendor/symfony/validator/Constraints/NotBlank.php
@@ -21,5 +21,11 @@
*/
class NotBlank extends Constraint
{
+ const IS_BLANK_ERROR = 'c1051bb4-d103-4f74-8988-acbcafc7fdc3';
+
+ protected static $errorNames = array(
+ self::IS_BLANK_ERROR => 'IS_BLANK_ERROR',
+ );
+
public $message = 'This value should not be blank.';
}
diff --git a/vendor/symfony/validator/Constraints/NotBlankValidator.php b/vendor/symfony/validator/Constraints/NotBlankValidator.php
index f0d4f21..7ea5f1f 100644
--- a/vendor/symfony/validator/Constraints/NotBlankValidator.php
+++ b/vendor/symfony/validator/Constraints/NotBlankValidator.php
@@ -34,10 +34,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(NotBlank::IS_BLANK_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(NotBlank::IS_BLANK_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/NotEqualTo.php b/vendor/symfony/validator/Constraints/NotEqualTo.php
index abd8092..8c5abdd 100644
--- a/vendor/symfony/validator/Constraints/NotEqualTo.php
+++ b/vendor/symfony/validator/Constraints/NotEqualTo.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class NotEqualTo extends AbstractComparison
{
+ const IS_EQUAL_ERROR = 'aa2e33da-25c8-4d76-8c6c-812f02ea89dd';
+
+ protected static $errorNames = array(
+ self::IS_EQUAL_ERROR => 'IS_EQUAL_ERROR',
+ );
+
public $message = 'This value should not be equal to {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/NotEqualToValidator.php b/vendor/symfony/validator/Constraints/NotEqualToValidator.php
index 5710a85..b80c5ea 100644
--- a/vendor/symfony/validator/Constraints/NotEqualToValidator.php
+++ b/vendor/symfony/validator/Constraints/NotEqualToValidator.php
@@ -15,6 +15,7 @@
* Validates values are all unequal (!=).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class NotEqualToValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 != $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return NotEqualTo::IS_EQUAL_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/NotIdenticalTo.php b/vendor/symfony/validator/Constraints/NotIdenticalTo.php
index fb4ef3f..4c9c63e 100644
--- a/vendor/symfony/validator/Constraints/NotIdenticalTo.php
+++ b/vendor/symfony/validator/Constraints/NotIdenticalTo.php
@@ -16,8 +16,15 @@
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class NotIdenticalTo extends AbstractComparison
{
+ const IS_IDENTICAL_ERROR = '4aaac518-0dda-4129-a6d9-e216b9b454a0';
+
+ protected static $errorNames = array(
+ self::IS_IDENTICAL_ERROR => 'IS_IDENTICAL_ERROR',
+ );
+
public $message = 'This value should not be identical to {{ compared_value_type }} {{ compared_value }}.';
}
diff --git a/vendor/symfony/validator/Constraints/NotIdenticalToValidator.php b/vendor/symfony/validator/Constraints/NotIdenticalToValidator.php
index ed8dc1c..3ea8b5a 100644
--- a/vendor/symfony/validator/Constraints/NotIdenticalToValidator.php
+++ b/vendor/symfony/validator/Constraints/NotIdenticalToValidator.php
@@ -15,6 +15,7 @@
* Validates values aren't identical (!==).
*
* @author Daniel Holmes
+ * @author Bernhard Schussek
*/
class NotIdenticalToValidator extends AbstractComparisonValidator
{
@@ -25,4 +26,12 @@ protected function compareValues($value1, $value2)
{
return $value1 !== $value2;
}
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getErrorCode()
+ {
+ return NotIdenticalTo::IS_IDENTICAL_ERROR;
+ }
}
diff --git a/vendor/symfony/validator/Constraints/NotNull.php b/vendor/symfony/validator/Constraints/NotNull.php
index 57f2492..1cfc1c8 100644
--- a/vendor/symfony/validator/Constraints/NotNull.php
+++ b/vendor/symfony/validator/Constraints/NotNull.php
@@ -21,5 +21,11 @@
*/
class NotNull extends Constraint
{
+ const IS_NULL_ERROR = 'ad32d13f-c3d4-423b-909a-857b961eb720';
+
+ protected static $errorNames = array(
+ self::IS_NULL_ERROR => 'IS_NULL_ERROR',
+ );
+
public $message = 'This value should not be null.';
}
diff --git a/vendor/symfony/validator/Constraints/NotNullValidator.php b/vendor/symfony/validator/Constraints/NotNullValidator.php
index 88ffb98..0402b3d 100644
--- a/vendor/symfony/validator/Constraints/NotNullValidator.php
+++ b/vendor/symfony/validator/Constraints/NotNullValidator.php
@@ -13,6 +13,7 @@
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
+use Symfony\Component\Validator\Context\ExecutionContextInterface;
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
/**
@@ -30,7 +31,17 @@ public function validate($value, Constraint $constraint)
}
if (null === $value) {
- $this->context->addViolation($constraint->message);
+ if ($this->context instanceof ExecutionContextInterface) {
+ $this->context->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(NotNull::IS_NULL_ERROR)
+ ->addViolation();
+ } else {
+ $this->buildViolation($constraint->message)
+ ->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(NotNull::IS_NULL_ERROR)
+ ->addViolation();
+ }
}
}
}
diff --git a/vendor/symfony/validator/Constraints/Range.php b/vendor/symfony/validator/Constraints/Range.php
index c59c50c..bf050ac 100644
--- a/vendor/symfony/validator/Constraints/Range.php
+++ b/vendor/symfony/validator/Constraints/Range.php
@@ -22,14 +22,32 @@
*/
class Range extends Constraint
{
- const INVALID_VALUE_ERROR = 1;
- const BEYOND_RANGE_ERROR = 2;
- const BELOW_RANGE_ERROR = 3;
+ const INVALID_CHARACTERS_ERROR = 'ad9a9798-7a99-4df7-8ce9-46e416a1e60b';
+ const TOO_HIGH_ERROR = '2d28afcb-e32e-45fb-a815-01c431a86a69';
+ const TOO_LOW_ERROR = '76454e69-502c-46c5-9643-f447d837c4d5';
+
+ /**
+ * @deprecated Deprecated since version 2.8, to be removed in 3.0. Use
+ * {@link INVALID_CHARACTERS_ERROR} instead.
+ */
+ const INVALID_VALUE_ERROR = self::INVALID_CHARACTERS_ERROR;
+
+ /**
+ * @deprecated Deprecated since version 2.8, to be removed in 3.0. Use
+ * {@link TOO_HIGH_ERROR} instead.
+ */
+ const BEYOND_RANGE_ERROR = self::TOO_HIGH_ERROR;
+
+ /**
+ * @deprecated Deprecated since version 2.8, to be removed in 3.0. Use
+ * {@link TOO_LOW_ERROR} instead.
+ */
+ const BELOW_RANGE_ERROR = self::TOO_LOW_ERROR;
protected static $errorNames = array(
- self::INVALID_VALUE_ERROR => 'INVALID_VALUE_ERROR',
- self::BEYOND_RANGE_ERROR => 'BEYOND_RANGE_ERROR',
- self::BELOW_RANGE_ERROR => 'BELOW_RANGE_ERROR',
+ self::INVALID_CHARACTERS_ERROR => 'INVALID_CHARACTERS_ERROR',
+ self::TOO_HIGH_ERROR => 'TOO_HIGH_ERROR',
+ self::TOO_LOW_ERROR => 'TOO_LOW_ERROR',
);
public $minMessage = 'This value should be {{ limit }} or more.';
diff --git a/vendor/symfony/validator/Constraints/RangeValidator.php b/vendor/symfony/validator/Constraints/RangeValidator.php
index 8f5fdda..05ef3b4 100644
--- a/vendor/symfony/validator/Constraints/RangeValidator.php
+++ b/vendor/symfony/validator/Constraints/RangeValidator.php
@@ -38,12 +38,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->invalidMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
- ->setCode(Range::INVALID_VALUE_ERROR)
+ ->setCode(Range::INVALID_CHARACTERS_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->invalidMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
- ->setCode(Range::INVALID_VALUE_ERROR)
+ ->setCode(Range::INVALID_CHARACTERS_ERROR)
->addViolation();
}
@@ -72,13 +72,13 @@ public function validate($value, Constraint $constraint)
$this->context->buildViolation($constraint->maxMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($max, self::PRETTY_DATE))
- ->setCode(Range::BEYOND_RANGE_ERROR)
+ ->setCode(Range::TOO_HIGH_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->maxMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($max, self::PRETTY_DATE))
- ->setCode(Range::BEYOND_RANGE_ERROR)
+ ->setCode(Range::TOO_HIGH_ERROR)
->addViolation();
}
@@ -90,13 +90,13 @@ public function validate($value, Constraint $constraint)
$this->context->buildViolation($constraint->minMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($min, self::PRETTY_DATE))
- ->setCode(Range::BELOW_RANGE_ERROR)
+ ->setCode(Range::TOO_LOW_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->minMessage)
->setParameter('{{ value }}', $this->formatValue($value, self::PRETTY_DATE))
->setParameter('{{ limit }}', $this->formatValue($min, self::PRETTY_DATE))
- ->setCode(Range::BELOW_RANGE_ERROR)
+ ->setCode(Range::TOO_LOW_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Regex.php b/vendor/symfony/validator/Constraints/Regex.php
index 724274a..ec2fd7d 100644
--- a/vendor/symfony/validator/Constraints/Regex.php
+++ b/vendor/symfony/validator/Constraints/Regex.php
@@ -21,6 +21,12 @@
*/
class Regex extends Constraint
{
+ const REGEX_FAILED_ERROR = 'de1e3db3-5ed4-4941-aae4-59f3667cc3a3';
+
+ protected static $errorNames = array(
+ self::REGEX_FAILED_ERROR => 'REGEX_FAILED_ERROR',
+ );
+
public $message = 'This value is not valid.';
public $pattern;
public $htmlPattern;
diff --git a/vendor/symfony/validator/Constraints/RegexValidator.php b/vendor/symfony/validator/Constraints/RegexValidator.php
index 850d760..0aa0ed5 100644
--- a/vendor/symfony/validator/Constraints/RegexValidator.php
+++ b/vendor/symfony/validator/Constraints/RegexValidator.php
@@ -47,10 +47,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Regex::REGEX_FAILED_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Regex::REGEX_FAILED_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Time.php b/vendor/symfony/validator/Constraints/Time.php
index 1134c2e..6bd8dbd 100644
--- a/vendor/symfony/validator/Constraints/Time.php
+++ b/vendor/symfony/validator/Constraints/Time.php
@@ -21,8 +21,8 @@
*/
class Time extends Constraint
{
- const INVALID_FORMAT_ERROR = 1;
- const INVALID_TIME_ERROR = 2;
+ const INVALID_FORMAT_ERROR = '9d27b2bb-f755-4fbf-b725-39b1edbdebdf';
+ const INVALID_TIME_ERROR = '8532f9e1-84b2-4d67-8989-0818bc38533b';
protected static $errorNames = array(
self::INVALID_FORMAT_ERROR => 'INVALID_FORMAT_ERROR',
diff --git a/vendor/symfony/validator/Constraints/Type.php b/vendor/symfony/validator/Constraints/Type.php
index afe5903..e40b478 100644
--- a/vendor/symfony/validator/Constraints/Type.php
+++ b/vendor/symfony/validator/Constraints/Type.php
@@ -21,6 +21,12 @@
*/
class Type extends Constraint
{
+ const INVALID_TYPE_ERROR = 'ba785a8c-82cb-4283-967c-3cf342181b40';
+
+ protected static $errorNames = array(
+ self::INVALID_TYPE_ERROR => 'INVALID_TYPE_ERROR',
+ );
+
public $message = 'This value should be of type {{ type }}.';
public $type;
diff --git a/vendor/symfony/validator/Constraints/TypeValidator.php b/vendor/symfony/validator/Constraints/TypeValidator.php
index 592f122..48f7e28 100644
--- a/vendor/symfony/validator/Constraints/TypeValidator.php
+++ b/vendor/symfony/validator/Constraints/TypeValidator.php
@@ -51,11 +51,13 @@ public function validate($value, Constraint $constraint)
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ type }}', $constraint->type)
+ ->setCode(Type::INVALID_TYPE_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
->setParameter('{{ type }}', $constraint->type)
+ ->setCode(Type::INVALID_TYPE_ERROR)
->addViolation();
}
}
diff --git a/vendor/symfony/validator/Constraints/Url.php b/vendor/symfony/validator/Constraints/Url.php
index 3637bc1..8453a90 100644
--- a/vendor/symfony/validator/Constraints/Url.php
+++ b/vendor/symfony/validator/Constraints/Url.php
@@ -21,6 +21,12 @@
*/
class Url extends Constraint
{
+ const INVALID_URL_ERROR = '57c2f299-1154-4870-89bb-ef3b1f5ad229';
+
+ protected static $errorNames = array(
+ self::INVALID_URL_ERROR => 'INVALID_URL_ERROR',
+ );
+
public $message = 'This value is not a valid URL.';
public $dnsMessage = 'The host could not be resolved.';
public $protocols = array('http', 'https');
diff --git a/vendor/symfony/validator/Constraints/UrlValidator.php b/vendor/symfony/validator/Constraints/UrlValidator.php
index 1fd76a8..7497bec 100644
--- a/vendor/symfony/validator/Constraints/UrlValidator.php
+++ b/vendor/symfony/validator/Constraints/UrlValidator.php
@@ -34,7 +34,7 @@ class UrlValidator extends ConstraintValidator
\] # a IPv6 address
)
(:[0-9]+)? # a port (optional)
- (/?|/\S+|\?|\#) # a /, nothing, a / with something, a query or a fragment
+ (/?|/\S+|\?\S*|\#\S*) # a /, nothing, a / with something, a query or a fragment
$~ixu';
/**
@@ -65,10 +65,12 @@ public function validate($value, Constraint $constraint)
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Url::INVALID_URL_ERROR)
->addViolation();
} else {
$this->buildViolation($constraint->message)
->setParameter('{{ value }}', $this->formatValue($value))
+ ->setCode(Url::INVALID_URL_ERROR)
->addViolation();
}
@@ -81,12 +83,14 @@ public function validate($value, Constraint $constraint)
if (!checkdnsrr($host, 'ANY')) {
if ($this->context instanceof ExecutionContextInterface) {
$this->context->buildViolation($constraint->dnsMessage)
- ->setParameter('{{ value }}', $this->formatValue($host))
- ->addViolation();
+ ->setParameter('{{ value }}', $this->formatValue($host))
+ ->setCode(Url::INVALID_URL_ERROR)
+ ->addViolation();
} else {
$this->buildViolation($constraint->dnsMessage)
- ->setParameter('{{ value }}', $this->formatValue($host))
- ->addViolation();
+ ->setParameter('{{ value }}', $this->formatValue($host))
+ ->setCode(Url::INVALID_URL_ERROR)
+ ->addViolation();
}
}
}
diff --git a/vendor/symfony/validator/Constraints/Uuid.php b/vendor/symfony/validator/Constraints/Uuid.php
index 8589b95..2deecba 100644
--- a/vendor/symfony/validator/Constraints/Uuid.php
+++ b/vendor/symfony/validator/Constraints/Uuid.php
@@ -21,12 +21,12 @@
*/
class Uuid extends Constraint
{
- const TOO_SHORT_ERROR = 1;
- const TOO_LONG_ERROR = 2;
- const INVALID_CHARACTERS_ERROR = 3;
- const INVALID_HYPHEN_PLACEMENT_ERROR = 4;
- const INVALID_VERSION_ERROR = 5;
- const INVALID_VARIANT_ERROR = 6;
+ const TOO_SHORT_ERROR = 'aa314679-dac9-4f54-bf97-b2049df8f2a3';
+ const TOO_LONG_ERROR = '494897dd-36f8-4d31-8923-71a8d5f3000d';
+ const INVALID_CHARACTERS_ERROR = '51120b12-a2bc-41bf-aa53-cd73daf330d0';
+ const INVALID_HYPHEN_PLACEMENT_ERROR = '98469c83-0309-4f5d-bf95-a496dcaa869c';
+ const INVALID_VERSION_ERROR = '21ba13b4-b185-4882-ac6f-d147355987eb';
+ const INVALID_VARIANT_ERROR = '164ef693-2b9d-46de-ad7f-836201f0c2db';
protected static $errorNames = array(
self::TOO_SHORT_ERROR => 'TOO_SHORT_ERROR',
diff --git a/vendor/symfony/validator/LICENSE b/vendor/symfony/validator/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/validator/LICENSE
+++ b/vendor/symfony/validator/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/validator/Mapping/Loader/XmlFileLoader.php b/vendor/symfony/validator/Mapping/Loader/XmlFileLoader.php
index 2961b00..3458c71 100644
--- a/vendor/symfony/validator/Mapping/Loader/XmlFileLoader.php
+++ b/vendor/symfony/validator/Mapping/Loader/XmlFileLoader.php
@@ -190,7 +190,7 @@ protected function parseFile($path)
*/
private function loadClassMetadataFromXml(ClassMetadata $metadata, $classDescription)
{
- foreach ($classDescription->{'group-sequence-provider'} as $_) {
+ if (count($classDescription->{'group-sequence-provider'}) > 0) {
$metadata->setGroupSequenceProvider(true);
}
diff --git a/vendor/symfony/validator/README.md b/vendor/symfony/validator/README.md
index 4555b9a..b9d2e7b 100644
--- a/vendor/symfony/validator/README.md
+++ b/vendor/symfony/validator/README.md
@@ -18,7 +18,7 @@ use Symfony\Component\Validator\Constraints\Length;
$validator = Validation::createValidator();
-$violations = $validator->validateValue('Bernhard', new Length(array('min' => 10)));
+$violations = $validator->validate('Bernhard', new Length(array('min' => 10)));
```
This validation will fail because the given string is shorter than ten
@@ -46,7 +46,7 @@ $constraint = new Assert\Collection(array(
'password' => new Assert\Length(array('min' => 60)),
));
-$violations = $validator->validateValue($input, $constraint);
+$violations = $validator->validate($input, $constraint);
```
Again, the validator returns the list of violations.
@@ -113,7 +113,7 @@ https://github.com/silexphp/Silex/blob/master/src/Silex/Provider/ValidatorServic
Documentation:
-https://symfony.com/doc/2.7/book/validation.html
+https://symfony.com/doc/2.8/book/validation.html
JSR-303 Specification:
diff --git a/vendor/symfony/validator/Violation/ConstraintViolationBuilderInterface.php b/vendor/symfony/validator/Violation/ConstraintViolationBuilderInterface.php
index b7cc2ec..e02d61b 100644
--- a/vendor/symfony/validator/Violation/ConstraintViolationBuilderInterface.php
+++ b/vendor/symfony/validator/Violation/ConstraintViolationBuilderInterface.php
@@ -94,7 +94,7 @@ public function setPlural($number);
/**
* Sets the violation code.
*
- * @param int $code The violation code
+ * @param string|null $code The violation code
*
* @return ConstraintViolationBuilderInterface This builder
*/
diff --git a/vendor/symfony/validator/composer.json b/vendor/symfony/validator/composer.json
index c0a898a..179e8cf 100644
--- a/vendor/symfony/validator/composer.json
+++ b/vendor/symfony/validator/composer.json
@@ -17,16 +17,15 @@
],
"require": {
"php": ">=5.3.9",
- "symfony/translation": "~2.4"
+ "symfony/translation": "~2.4|~3.0.0"
},
"require-dev": {
- "doctrine/common": "~2.3",
- "symfony/http-foundation": "~2.1",
- "symfony/intl": "~2.4",
- "symfony/yaml": "~2.0,>=2.0.5",
- "symfony/config": "~2.2",
- "symfony/property-access": "~2.3",
- "symfony/expression-language": "~2.4",
+ "symfony/http-foundation": "~2.1|~3.0.0",
+ "symfony/intl": "~2.4|~3.0.0",
+ "symfony/yaml": "~2.0,>=2.0.5|~3.0.0",
+ "symfony/config": "~2.2|~3.0.0",
+ "symfony/property-access": "~2.3|~3.0.0",
+ "symfony/expression-language": "~2.4|~3.0.0",
"doctrine/annotations": "~1.0",
"doctrine/cache": "~1.0",
"egulias/email-validator": "~1.2,>=1.2.1"
@@ -43,12 +42,15 @@
"symfony/expression-language": "For using the 2.4 Expression validator"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Validator\\": "" }
+ "psr-4": { "Symfony\\Component\\Validator\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/validator/phpunit.xml.dist b/vendor/symfony/validator/phpunit.xml.dist
index 1bf4391..cf8c343 100644
--- a/vendor/symfony/validator/phpunit.xml.dist
+++ b/vendor/symfony/validator/phpunit.xml.dist
@@ -20,8 +20,9 @@
./
- ./vendor
+ ./Resources
./Tests
+ ./vendor
diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md
index 096cf65..f55b570 100644
--- a/vendor/symfony/yaml/CHANGELOG.md
+++ b/vendor/symfony/yaml/CHANGELOG.md
@@ -1,6 +1,26 @@
CHANGELOG
=========
+2.8.0
+-----
+
+ * Deprecated usage of a colon in an unquoted mapping value
+ * Deprecated usage of @, \`, | and > at the beginning of an unquoted string
+ * When surrounding strings with double-quotes, you must now escape `\` characters. Not
+ escaping those characters (when surrounded by double-quotes) is deprecated.
+
+ Before:
+
+ ```yml
+ class: "Foo\Var"
+ ```
+
+ After:
+
+ ```yml
+ class: "Foo\\Var"
+ ```
+
2.1.0
-----
diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php
index ac325a2..3487a6a 100644
--- a/vendor/symfony/yaml/Escaper.php
+++ b/vendor/symfony/yaml/Escaper.php
@@ -16,6 +16,8 @@
* YAML strings.
*
* @author Matthew Lewinski
+ *
+ * @internal
*/
class Escaper
{
diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php
index a5b53bd..0b05fda 100644
--- a/vendor/symfony/yaml/Inline.php
+++ b/vendor/symfony/yaml/Inline.php
@@ -52,7 +52,7 @@ public static function parse($value, $exceptionOnInvalidType = false, $objectSup
return '';
}
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
+ if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
$mbEncoding = mb_internal_encoding();
mb_internal_encoding('ASCII');
}
@@ -204,6 +204,8 @@ private static function dumpArray($value, $exceptionOnInvalidType, $objectSuppor
* @return string A YAML string
*
* @throws ParseException When malformed inline YAML string is parsed
+ *
+ * @internal
*/
public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true, $references = array())
{
@@ -234,6 +236,14 @@ public static function parseScalar($scalar, $delimiters = null, $stringDelimiter
throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar));
}
+ // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
+ if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0])) {
+ @trigger_error(sprintf('Not quoting the scalar "%s" starting with "%s" is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', $output, $output[0]), E_USER_DEPRECATED);
+
+ // to be thrown in 3.0
+ // throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]));
+ }
+
if ($evaluate) {
$output = self::evaluateScalar($output, $references);
}
diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE
index 43028bc..12a7453 100644
--- a/vendor/symfony/yaml/LICENSE
+++ b/vendor/symfony/yaml/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2015 Fabien Potencier
+Copyright (c) 2004-2016 Fabien Potencier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php
index 04f2237..233a51d 100644
--- a/vendor/symfony/yaml/Parser.php
+++ b/vendor/symfony/yaml/Parser.php
@@ -62,7 +62,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport =
$value = $this->cleanup($value);
$this->lines = explode("\n", $value);
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
+ if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
$mbEncoding = mb_internal_encoding();
mb_internal_encoding('UTF-8');
}
@@ -114,7 +114,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport =
$data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport, $objectForMap);
} else {
- $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
+ $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap, $context);
}
}
if ($isRef) {
@@ -230,7 +230,7 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport =
}
}
} else {
- $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap);
+ $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport, $objectForMap, $context);
// Spec: Keys MUST be unique; first one wins.
// But overwriting is allowed when a merge node is used in current block.
if ($allowOverwrite || !isset($data[$key])) {
@@ -303,6 +303,10 @@ public function parse($value, $exceptionOnInvalidType = false, $objectSupport =
mb_internal_encoding($mbEncoding);
}
+ if ($objectForMap && !is_object($data)) {
+ $data = (object) $data;
+ }
+
return empty($data) ? null : $data;
}
@@ -339,6 +343,11 @@ private function getCurrentLineIndentation()
private function getNextEmbedBlock($indentation = null, $inSequence = false)
{
$oldLineIndentation = $this->getCurrentLineIndentation();
+ $blockScalarIndentations = array();
+
+ if ($this->isBlockScalarHeader()) {
+ $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+ }
if (!$this->moveToNextLine()) {
return;
@@ -347,7 +356,7 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false)
if (null === $indentation) {
$newIndent = $this->getCurrentLineIndentation();
- $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine);
+ $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();
if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
@@ -373,20 +382,33 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false)
return;
}
- $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine);
+ $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
- // Comments must not be removed inside a block scalar
- $removeCommentsPattern = '~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~';
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
+ if (empty($blockScalarIndentations) && $this->isBlockScalarHeader()) {
+ $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+ }
+
+ $previousLineIndentation = $this->getCurrentLineIndentation();
while ($this->moveToNextLine()) {
$indent = $this->getCurrentLineIndentation();
- if ($indent === $newIndent) {
- $removeComments = !preg_match($removeCommentsPattern, $this->currentLine);
+ // terminate all block scalars that are more indented than the current line
+ if (!empty($blockScalarIndentations) && $indent < $previousLineIndentation && trim($this->currentLine) !== '') {
+ foreach ($blockScalarIndentations as $key => $blockScalarIndentation) {
+ if ($blockScalarIndentation >= $this->getCurrentLineIndentation()) {
+ unset($blockScalarIndentations[$key]);
+ }
+ }
}
- if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine) && $newIndent === $indent) {
+ if (empty($blockScalarIndentations) && !$this->isCurrentLineComment() && $this->isBlockScalarHeader()) {
+ $blockScalarIndentations[] = $this->getCurrentLineIndentation();
+ }
+
+ $previousLineIndentation = $indent;
+
+ if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
$this->moveToPreviousLine();
break;
}
@@ -396,7 +418,8 @@ private function getNextEmbedBlock($indentation = null, $inSequence = false)
continue;
}
- if ($removeComments && $this->isCurrentLineComment()) {
+ // we ignore "comment" lines only when we are not inside a scalar block
+ if (empty($blockScalarIndentations) && $this->isCurrentLineComment()) {
continue;
}
@@ -445,12 +468,13 @@ private function moveToPreviousLine()
* @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise
* @param bool $objectSupport True if object support is enabled, false otherwise
* @param bool $objectForMap true if maps should return a stdClass instead of array()
+ * @param string $context The parser context (either sequence or mapping)
*
* @return mixed A PHP value
*
* @throws ParseException When reference does not exist
*/
- private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $objectForMap)
+ private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $context)
{
if (0 === strpos($value, '*')) {
if (false !== $pos = strpos($value, '#')) {
@@ -473,7 +497,16 @@ private function parseValue($value, $exceptionOnInvalidType, $objectSupport, $ob
}
try {
- return Inline::parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
+ $parsedValue = Inline::parse($value, $exceptionOnInvalidType, $objectSupport, $objectForMap, $this->refs);
+
+ if ('mapping' === $context && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
+ @trigger_error(sprintf('Using a colon in the unquoted mapping value "%s" in line %d is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', $value, $this->getRealCurrentLineNb() + 1), E_USER_DEPRECATED);
+
+ // to be thrown in 3.0
+ // throw new ParseException('A colon cannot be used in an unquoted mapping value.');
+ }
+
+ return $parsedValue;
} catch (ParseException $e) {
$e->setParsedLine($this->getRealCurrentLineNb() + 1);
$e->setSnippet($this->currentLine);
@@ -499,13 +532,13 @@ private function parseBlockScalar($style, $chomping = '', $indentation = 0)
}
$isCurrentLineBlank = $this->isCurrentLineBlank();
- $text = '';
+ $blockLines = array();
// leading blank lines are consumed before determining indentation
while ($notEOF && $isCurrentLineBlank) {
// newline only if not EOF
if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
+ $blockLines[] = '';
$isCurrentLineBlank = $this->isCurrentLineBlank();
}
}
@@ -526,37 +559,59 @@ private function parseBlockScalar($style, $chomping = '', $indentation = 0)
preg_match($pattern, $this->currentLine, $matches)
)
) {
- if ($isCurrentLineBlank) {
- $text .= substr($this->currentLine, $indentation);
+ if ($isCurrentLineBlank && strlen($this->currentLine) > $indentation) {
+ $blockLines[] = substr($this->currentLine, $indentation);
+ } elseif ($isCurrentLineBlank) {
+ $blockLines[] = '';
} else {
- $text .= $matches[1];
+ $blockLines[] = $matches[1];
}
// newline only if not EOF
if ($notEOF = $this->moveToNextLine()) {
- $text .= "\n";
$isCurrentLineBlank = $this->isCurrentLineBlank();
}
}
} elseif ($notEOF) {
- $text .= "\n";
+ $blockLines[] = '';
}
if ($notEOF) {
+ $blockLines[] = '';
$this->moveToPreviousLine();
}
// folded style
if ('>' === $style) {
- // folded lines
- // replace all non-leading/non-trailing single newlines with spaces
- preg_match('/(\n*)$/', $text, $matches);
- $text = preg_replace('/(?currentLine, ' ');
- return $ltrimmedLine[0] === '#';
+ return '' !== $ltrimmedLine && $ltrimmedLine[0] === '#';
}
/**
@@ -690,7 +745,7 @@ private function isNextLineUnIndentedCollection()
if (
$this->getCurrentLineIndentation() == $currentIndentation
&&
- $this->isStringUnIndentedCollectionItem($this->currentLine)
+ $this->isStringUnIndentedCollectionItem()
) {
$ret = true;
}
@@ -707,6 +762,16 @@ private function isNextLineUnIndentedCollection()
*/
private function isStringUnIndentedCollectionItem()
{
- return (0 === strpos($this->currentLine, '- '));
+ return 0 === strpos($this->currentLine, '- ');
+ }
+
+ /**
+ * Tests whether or not the current line is the header of a block scalar.
+ *
+ * @return bool
+ */
+ private function isBlockScalarHeader()
+ {
+ return (bool) preg_match('~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~', $this->currentLine);
}
}
diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php
index 1b5e5ec..d2f5054 100644
--- a/vendor/symfony/yaml/Unescaper.php
+++ b/vendor/symfony/yaml/Unescaper.php
@@ -16,6 +16,8 @@
* YAML strings.
*
* @author Matthew Lewinski
+ *
+ * @internal
*/
class Unescaper
{
@@ -32,7 +34,7 @@ class Unescaper
/**
* Regex fragment that matches an escaped character in a double quoted string.
*/
- const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})";
+ const REGEX_ESCAPED_CHARACTER = "\\\\(x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8}|.)";
/**
* Unescapes a single quoted string.
@@ -70,10 +72,13 @@ public function unescapeDoubleQuotedString($value)
* @param string $value An escaped character
*
* @return string The unescaped character
+ *
+ * @internal This method is public to be usable as callback. It should not
+ * be used in user code. Should be changed in 3.0.
*/
public function unescapeCharacter($value)
{
- switch ($value{1}) {
+ switch ($value[1]) {
case '0':
return "\x0";
case 'a':
@@ -120,6 +125,10 @@ public function unescapeCharacter($value)
return self::utf8chr(hexdec(substr($value, 2, 4)));
case 'U':
return self::utf8chr(hexdec(substr($value, 2, 8)));
+ default:
+ @trigger_error('Not escaping a backslash in a double-quoted string is deprecated since Symfony 2.8 and will throw a ParseException in 3.0.', E_USER_DEPRECATED);
+
+ return $value;
}
}
diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json
index b798141..af97f80 100644
--- a/vendor/symfony/yaml/composer.json
+++ b/vendor/symfony/yaml/composer.json
@@ -19,12 +19,15 @@
"php": ">=5.3.9"
},
"autoload": {
- "psr-4": { "Symfony\\Component\\Yaml\\": "" }
+ "psr-4": { "Symfony\\Component\\Yaml\\": "" },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"minimum-stability": "dev",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.8-dev"
}
}
}
diff --git a/vendor/symfony/yaml/phpunit.xml.dist b/vendor/symfony/yaml/phpunit.xml.dist
index 418b2c6..6bdbea1 100644
--- a/vendor/symfony/yaml/phpunit.xml.dist
+++ b/vendor/symfony/yaml/phpunit.xml.dist
@@ -20,8 +20,8 @@
./
- ./vendor
./Tests
+ ./vendor