├── .gitignore
├── .php_cs
├── OpenSkyLdapBundle.php
├── Security
├── User
│ ├── LdapUserManagerInterface.php
│ ├── LdapUser.php
│ ├── LdapUserProvider.php
│ └── LdapUserManager.php
└── HttpBasicPreAuthenticatedListener.php
├── composer.json
├── Resources
└── config
│ ├── security_factories.xml
│ └── ldap.xml
├── phpunit.xml.dist
├── Tests
├── DependencyInjection
│ ├── Security
│ │ └── HttpBasicPreAuthenticatedFactoryTest.php
│ └── OpenSkyLdapExtensionTest.php
└── Security
│ ├── User
│ ├── LdapUserTest.php
│ ├── LdapUserProviderTest.php
│ └── LdapUserManagerTest.php
│ └── HttpBasicPreAuthenticatedListenerTest.php
├── DependencyInjection
├── OpenSkyLdapExtension.php
├── Security
│ └── HttpBasicPreAuthenticatedFactory.php
└── Configuration.php
├── README.md
└── composer.lock
/.gitignore:
--------------------------------------------------------------------------------
1 | phpunit.xml
2 | .php_cs.cache
3 | vendor
4 |
--------------------------------------------------------------------------------
/.php_cs:
--------------------------------------------------------------------------------
1 | setRules([
5 | '@Symfony' => true,
6 | 'array_syntax' => ['syntax' => 'short'],
7 | 'ordered_imports' => true,
8 | ])
9 | ->setFinder(
10 | PhpCsFixer\Finder::create()
11 | ->exclude(['bin', 'vendor'])
12 | ->in(__DIR__)
13 | )
14 | ;
15 |
--------------------------------------------------------------------------------
/OpenSkyLdapBundle.php:
--------------------------------------------------------------------------------
1 | extension = new OpenSkyLdapExtension();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Security/User/LdapUserManagerInterface.php:
--------------------------------------------------------------------------------
1 | =7.0",
10 | "symfony/framework-bundle": "~3.0",
11 | "symfony/security-bundle": "~3.0",
12 | "zendframework/zend-ldap": "~2.0"
13 | },
14 | "require-dev": {
15 | "phpunit/phpunit": "~6.0",
16 | "friendsofphp/php-cs-fixer": "~2.0"
17 | },
18 | "autoload": {
19 | "psr-0": { "OpenSky\\Bundle\\LdapBundle": "" }
20 | },
21 | "target-dir": "OpenSky/Bundle/LdapBundle"
22 | }
23 |
--------------------------------------------------------------------------------
/Resources/config/security_factories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
8 | OpenSky\Bundle\LdapBundle\DependencyInjection\Security\HttpBasicPreAuthenticatedFactory
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/phpunit.xml.dist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
14 |
15 | ./Tests/
16 |
17 |
18 |
19 |
20 |
21 | ./
22 |
23 | ./Resources
24 | ./Tests
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/Security/HttpBasicPreAuthenticatedListener.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | class HttpBasicPreAuthenticatedListener extends AbstractPreAuthenticatedListener
16 | {
17 | protected function getPreAuthenticatedData(Request $request)
18 | {
19 | if (!$request->server->has('PHP_AUTH_USER')) {
20 | throw new BadCredentialsException('HTTP-authenticated user was not found');
21 | }
22 |
23 | return [$request->server->get('PHP_AUTH_USER'), $request->server->get('PHP_AUTH_PW', '')];
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Tests/DependencyInjection/Security/HttpBasicPreAuthenticatedFactoryTest.php:
--------------------------------------------------------------------------------
1 | createMock(AuthenticationEntryPointInterface::class);
20 |
21 | // Load "security.authentication.listener.basic_pre_auth.class" parameter from ldap.xml
22 | $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../../../Resources/config'));
23 | $loader->load('ldap.xml');
24 |
25 | list($provider, $listenerId, $returnedDefaultEntryPoint) = $factory->create($container, rand(), [], $userProvider, $defaultEntryPoint);
26 |
27 | $this->assertTrue($container->hasDefinition($provider));
28 | $this->assertTrue($container->hasDefinition($listenerId));
29 | $this->assertEquals($defaultEntryPoint, $returnedDefaultEntryPoint);
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/Tests/Security/User/LdapUserTest.php:
--------------------------------------------------------------------------------
1 | assertEquals('jmikola', (string) $user);
22 | }
23 |
24 | public function testGetRoles()
25 | {
26 | $user = new LdapUser('jmikola');
27 | $this->assertEquals([], $user->getRoles());
28 |
29 | $user = new LdapUser('jmikola', ['ROLE_ADMIN']);
30 | $this->assertEquals(['ROLE_ADMIN'], $user->getRoles());
31 | }
32 |
33 | public function testGetPassword()
34 | {
35 | $user = new LdapUser('jmikola');
36 | $this->assertNull($user->getPassword());
37 | }
38 |
39 | public function testGetUsername()
40 | {
41 | $user = new LdapUser('jmikola');
42 | $this->assertEquals('jmikola', $user->getUsername());
43 | }
44 |
45 | public function testGetSalt()
46 | {
47 | $user = new LdapUser('jmikola');
48 | $this->assertNull($user->getSalt());
49 | }
50 |
51 | public function testEquals()
52 | {
53 | $user = new LdapUser('jmikola');
54 |
55 | $this->assertTrue($user->equals(new LdapUser('jmikola')));
56 | $this->assertFalse($user->equals(new LdapUser('foobar')));
57 | $this->assertFalse($user->equals($this->createMock('Symfony\Component\Security\Core\User\UserInterface')));
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/DependencyInjection/OpenSkyLdapExtension.php:
--------------------------------------------------------------------------------
1 |
15 | */
16 | class OpenSkyLdapExtension extends Extension
17 | {
18 | /**
19 | * @see Symfony\Component\DependencyInjection\Extension\ExtensionInterface::load()
20 | */
21 | public function load(array $configs, ContainerBuilder $container)
22 | {
23 | $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
24 | $loader->load('ldap.xml');
25 |
26 | $processor = new Processor();
27 | $config = $processor->processConfiguration(new Configuration(), $configs);
28 |
29 | $container->setParameter('opensky_ldap.client.options', $config['client']);
30 |
31 | foreach (['user_base_dn', 'user_filter', 'username_attribute', 'role_base_dn', 'role_filter', 'role_name_attribute', 'role_user_attribute'] as $key) {
32 | $container->setParameter('opensky_ldap.user_manager.'.$key, $config[$key]);
33 | }
34 |
35 | foreach (['role_prefix', 'default_roles'] as $key) {
36 | $container->setParameter('opensky_ldap.user_provider.'.$key, $config['security'][$key]);
37 | }
38 | }
39 |
40 | /**
41 | * @see Symfony\Component\DependencyInjection\Extension\ExtensionInterface::getAlias()
42 | * @codeCoverageIgnore
43 | */
44 | public function getAlias()
45 | {
46 | return 'opensky_ldap';
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/Tests/Security/HttpBasicPreAuthenticatedListenerTest.php:
--------------------------------------------------------------------------------
1 | listener = new HttpBasicPreAuthenticatedListener(
20 | $this->createMock(TokenStorageInterface::class),
21 | $this->createMock(AuthenticationManagerInterface::class),
22 | 'ldap.provider'
23 | );
24 |
25 | $this->method = new ReflectionMethod($this->listener, 'getPreAuthenticatedData');
26 | $this->method->setAccessible(true);
27 | }
28 |
29 | /**
30 | * @dataProvider provideTestGetPreAuthenticatedData
31 | */
32 | public function testGetPreAuthenticatedData($serverParams, $expectedData)
33 | {
34 | $request = new Request([], [], [], [], [], $serverParams);
35 |
36 | $this->assertEquals($expectedData, $this->method->invoke($this->listener, $request));
37 | }
38 |
39 | public function provideTestGetPreAuthenticatedData()
40 | {
41 | return [
42 | [
43 | ['PHP_AUTH_USER' => 'username', 'PHP_AUTH_PW' => 'password'],
44 | ['username', 'password'],
45 | ],
46 | [
47 | ['PHP_AUTH_USER' => 'username'],
48 | ['username', ''],
49 | ],
50 | ];
51 | }
52 |
53 | /**
54 | * @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
55 | */
56 | public function testGetPreAuthenticatedDataBadCredentials()
57 | {
58 | $this->method->invoke($this->listener, new Request());
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/Security/User/LdapUser.php:
--------------------------------------------------------------------------------
1 |
11 | */
12 | class LdapUser implements UserInterface
13 | {
14 | protected $username;
15 | protected $roles;
16 |
17 | /**
18 | * Constructor.
19 | *
20 | * @param string $username
21 | * @param array $roles
22 | */
23 | public function __construct($username, array $roles = [])
24 | {
25 | if (empty($username)) {
26 | throw new \InvalidArgumentException('The username cannot be empty.');
27 | }
28 |
29 | $this->username = $username;
30 | $this->roles = $roles;
31 | }
32 |
33 | /**
34 | * @see Symfony\Component\Security\Core\User\UserInterface::__toString()
35 | */
36 | public function __toString()
37 | {
38 | return $this->username;
39 | }
40 |
41 | /**
42 | * @see Symfony\Component\Security\Core\User\UserInterface::getRoles()
43 | */
44 | public function getRoles()
45 | {
46 | return $this->roles;
47 | }
48 |
49 | /**
50 | * @see Symfony\Component\Security\Core\User\UserInterface::getPassword()
51 | */
52 | public function getPassword()
53 | {
54 | return null;
55 | }
56 |
57 | /**
58 | * @see Symfony\Component\Security\Core\User\UserInterface::getSalt()
59 | */
60 | public function getSalt()
61 | {
62 | return null;
63 | }
64 |
65 | /**
66 | * @see Symfony\Component\Security\Core\User\UserInterface::getUsername()
67 | */
68 | public function getUsername()
69 | {
70 | return $this->username;
71 | }
72 |
73 | /**
74 | * @see Symfony\Component\Security\Core\User\UserInterface::eraseCredentials()
75 | * @codeCoverageIgnore
76 | */
77 | public function eraseCredentials()
78 | {
79 | }
80 |
81 | /**
82 | * @see Symfony\Component\Security\Core\User\UserInterface::equals()
83 | */
84 | public function equals(UserInterface $account)
85 | {
86 | if (!$account instanceof self) {
87 | return false;
88 | }
89 |
90 | if ($this->username !== $account->getUsername()) {
91 | return false;
92 | }
93 |
94 | return true;
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/Tests/DependencyInjection/OpenSkyLdapExtensionTest.php:
--------------------------------------------------------------------------------
1 | 'ou=Users,dc=example,dc=com',
15 | 'role_base_dn' => 'ou=Groups,dc=example,dc=com',
16 | ];
17 |
18 | $container = new ContainerBuilder();
19 | $extension = new OpenSkyLdapExtension();
20 |
21 | $extension->load([$config], $container);
22 |
23 | $this->assertTrue($container->hasDefinition('opensky_ldap.user_manager'));
24 | $this->assertTrue($container->hasDefinition('opensky_ldap.user_provider'));
25 |
26 | foreach (['user_base_dn', 'role_base_dn'] as $key) {
27 | $this->assertEquals($config[$key], $container->getParameter('opensky_ldap.user_manager.'.$key));
28 | }
29 | }
30 |
31 | public function testLoadFullConfiguration()
32 | {
33 | $config = [
34 | 'user_base_dn' => 'ou=Users,dc=example,dc=com',
35 | 'user_filter' => '(objectClass=employee)',
36 | 'username_attribute' => 'uid',
37 | 'role_base_dn' => 'ou=Groups,dc=example,dc=com',
38 | 'role_filter' => '(objectClass=role)',
39 | 'role_name_attribute' => 'cn',
40 | 'role_user_attribute' => 'memberuid',
41 | 'client' => [
42 | 'host' => 'example.com',
43 | ],
44 | 'security' => [
45 | 'role_prefix' => 'ROLE_',
46 | 'default_roles' => ['ROLE_ADMIN', 'ROLE_LDAP'],
47 | ],
48 | ];
49 |
50 | $container = new ContainerBuilder();
51 | $extension = new OpenSkyLdapExtension();
52 |
53 | $extension->load([$config], $container);
54 |
55 | $this->assertEquals($config['client'], $container->getParameter('opensky_ldap.client.options'));
56 |
57 | foreach (['user_base_dn', 'user_filter', 'username_attribute', 'role_base_dn', 'role_filter', 'role_name_attribute', 'role_user_attribute'] as $key) {
58 | $this->assertEquals($config[$key], $container->getParameter('opensky_ldap.user_manager.'.$key));
59 | }
60 |
61 | foreach (['role_prefix', 'default_roles'] as $key) {
62 | $this->assertEquals($config['security'][$key], $container->getParameter('opensky_ldap.user_provider.'.$key));
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/Resources/config/ldap.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | Zend\Ldap\Ldap
8 |
9 | OpenSky\Bundle\LdapBundle\Security\User\LdapUserManager
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | OpenSky\Bundle\LdapBundle\Security\User\LdapUserProvider
18 |
19 |
20 | OpenSky\Bundle\LdapBundle\Security\HttpBasicPreAuthenticatedListener
21 |
22 |
23 |
24 |
25 | %opensky_ldap.client.options%
26 |
27 |
28 |
29 | %opensky_ldap.user_manager.user_base_dn%
30 | %opensky_ldap.user_manager.user_filter%
31 | %opensky_ldap.user_manager.username_attribute%
32 | %opensky_ldap.user_manager.role_base_dn%
33 | %opensky_ldap.user_manager.role_filter%
34 | %opensky_ldap.user_manager.role_name_attribute%
35 | %opensky_ldap.user_manager.role_user_attribute%
36 |
37 |
38 |
39 | %opensky_ldap.user_provider.role_prefix%
40 | %opensky_ldap.user_provider.default_roles%
41 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/DependencyInjection/Security/HttpBasicPreAuthenticatedFactory.php:
--------------------------------------------------------------------------------
1 |
17 | */
18 | class HttpBasicPreAuthenticatedFactory implements SecurityFactoryInterface
19 | {
20 | public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
21 | {
22 | $provider = 'security.authentication.provider.pre_authenticated.'.$id;
23 | $container
24 | ->setDefinition($provider, new DefinitionDecorator('security.authentication.provider.pre_authenticated'))
25 | ->replaceArgument(0, new Reference($userProvider))
26 | ->addArgument($id)
27 | ->addTag('security.authentication_provider')
28 | ;
29 |
30 | $listener = new Definition(
31 | '%opensky_ldap.authentication.listener.basic_pre_auth.class%',
32 | [
33 | new Reference('security.context'),
34 | new Reference('security.authentication.manager'),
35 | $id,
36 | new Reference('logger', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE),
37 | ]
38 | );
39 | $listener->addTag('monolog.logger', ['channel' => 'security']);
40 |
41 | $listenerId = 'opensky_ldap.authentication.listener.basic_pre_auth.'.$id;
42 | $container->setDefinition($listenerId, $listener);
43 |
44 | return [$provider, $listenerId, $defaultEntryPoint];
45 | }
46 |
47 | /**
48 | * @see Symfony\Bundle\FrameworkBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::getPosition()
49 | * @codeCoverageIgnore
50 | */
51 | public function getPosition()
52 | {
53 | return 'pre_auth';
54 | }
55 |
56 | /**
57 | * @see Symfony\Bundle\FrameworkBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::getKey()
58 | * @codeCoverageIgnore
59 | */
60 | public function getKey()
61 | {
62 | return 'http-basic-pre-auth';
63 | }
64 |
65 | /**
66 | * @see Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\SecurityFactoryInterface::addConfiguration()
67 | * @codeCoverageIgnore
68 | */
69 | public function addConfiguration(NodeDefinition $builder)
70 | {
71 | $builder->children()->scalarNode('provider')->end()->end();
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/DependencyInjection/Configuration.php:
--------------------------------------------------------------------------------
1 | root('opensky_ldap');
18 |
19 | $rootNode
20 | ->children()
21 | ->scalarNode('user_base_dn')->isRequired()->cannotBeEmpty()->end()
22 | ->scalarNode('user_filter')->defaultValue('(objectClass=*)')->end()
23 | ->scalarNode('username_attribute')->defaultValue('uid')->end()
24 | ->scalarNode('role_base_dn')->isRequired()->cannotBeEmpty()->end()
25 | ->scalarNode('role_filter')->defaultValue('(objectClass=*)')->end()
26 | ->scalarNode('role_name_attribute')->defaultValue('cn')->end()
27 | ->scalarNode('role_user_attribute')->defaultValue('memberuid')->end()
28 | ->end()
29 | ;
30 |
31 | $this->addClientSection($rootNode);
32 | $this->addSecuritySection($rootNode);
33 |
34 | return $treeBuilder;
35 | }
36 |
37 | private function addClientSection(ArrayNodeDefinition $rootNode)
38 | {
39 | $rootNode
40 | ->children()
41 | // TODO: Add Zend\Ldap configuration structure
42 | ->variableNode('client')
43 | ->defaultValue([])
44 | ->beforeNormalization()
45 | ->ifTrue(function ($v) { return !is_array($v); })
46 | ->thenEmptyArray()
47 | ->end()
48 | ->end()
49 | ->end()
50 | ;
51 | }
52 |
53 | private function addSecuritySection(ArrayNodeDefinition $rootNode)
54 | {
55 | $rootNode
56 | ->children()
57 | ->arrayNode('security')
58 | ->addDefaultsIfNotSet()
59 | ->children()
60 | ->scalarNode('role_prefix')->defaultValue('ROLE_LDAP_')->end()
61 | ->arrayNode('default_roles')
62 | ->performNoDeepMerging()
63 | ->beforeNormalization()->ifString()->then(function ($v) { return ['value' => $v]; })->end()
64 | ->beforeNormalization()
65 | ->ifTrue(function ($v) { return is_array($v) && isset($v['value']); })
66 | ->then(function ($v) { return preg_split('/\s*,\s*/', $v['value']); })
67 | ->end()
68 | ->prototype('scalar')->end()
69 | ->end()
70 | ->end()
71 | ->end()
72 | ->end()
73 | ;
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/Tests/Security/User/LdapUserProviderTest.php:
--------------------------------------------------------------------------------
1 | ldapUserManager = $this->createMock('OpenSky\Bundle\LdapBundle\Security\User\LdapUserManagerInterface');
19 | $this->rolePrefix = 'ROLE_LDAP_';
20 | $this->defaultRoles = ['ROLE_LDAP'];
21 |
22 | $this->provider = new LdapUserProvider(
23 | $this->ldapUserManager,
24 | $this->rolePrefix,
25 | $this->defaultRoles
26 | );
27 | }
28 |
29 | /**
30 | * @dataProvider provideTestLoadByUsername
31 | */
32 | public function testLoadByUsername(array $roleNames, array $expectedRoles)
33 | {
34 | $username = 'jmikola';
35 |
36 | $this->ldapUserManager->expects($this->once())
37 | ->method('hasUsername')
38 | ->with($username)
39 | ->will($this->returnValue(true));
40 |
41 | $this->ldapUserManager->expects($this->once())
42 | ->method('getRolesForUsername')
43 | ->with($username)
44 | ->will($this->returnValue($roleNames));
45 |
46 | $user = $this->provider->loadUserByUsername($username);
47 |
48 | $this->assertEquals($username, $user->getUsername());
49 | $this->assertEquals($expectedRoles, $user->getRoles());
50 | }
51 |
52 | public function provideTestLoadByUsername()
53 | {
54 | return [
55 | [
56 | [],
57 | ['ROLE_LDAP'],
58 | ],
59 | [
60 | ['admin', 'moderator'],
61 | ['ROLE_LDAP', 'ROLE_LDAP_ADMIN', 'ROLE_LDAP_MODERATOR'],
62 | ],
63 | [
64 | ['The "Special" Group'],
65 | ['ROLE_LDAP', 'ROLE_LDAP_THE_SPECIAL_GROUP'],
66 | ],
67 | ];
68 | }
69 |
70 | /**
71 | * @expectedException \Symfony\Component\Security\Core\Exception\UsernameNotFoundException
72 | */
73 | public function testLoadUserByUsernameNotFound()
74 | {
75 | $username = 'jmikola';
76 |
77 | $this->ldapUserManager->expects($this->once())
78 | ->method('hasUsername')
79 | ->with($username)
80 | ->will($this->returnValue(false));
81 |
82 | $this->provider->loadUserByUsername($username);
83 | }
84 |
85 | public function testRefreshUser()
86 | {
87 | $username = 'jmikola';
88 | $existingUser = new LdapUser($username);
89 |
90 | $this->ldapUserManager->expects($this->once())
91 | ->method('hasUsername')
92 | ->with($username)
93 | ->will($this->returnValue(true));
94 |
95 | $this->ldapUserManager->expects($this->once())
96 | ->method('getRolesForUsername')
97 | ->with($username)
98 | ->will($this->returnValue([]));
99 |
100 | $user = $this->provider->refreshUser($existingUser);
101 |
102 | $this->assertTrue($user->equals($existingUser));
103 | $this->assertEquals($username, $user->getUsername());
104 | $this->assertEquals(['ROLE_LDAP'], $user->getRoles());
105 | }
106 |
107 | /**
108 | * @expectedException \Symfony\Component\Security\Core\Exception\UnsupportedUserException
109 | */
110 | public function testRefreshUserNotSupported()
111 | {
112 | $this->provider->refreshUser($this->createMock('Symfony\Component\Security\Core\User\UserInterface'));
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/Security/User/LdapUserProvider.php:
--------------------------------------------------------------------------------
1 |
14 | */
15 | class LdapUserProvider implements UserProviderInterface
16 | {
17 | private $ldapUserManager;
18 | private $rolePrefix;
19 | private $defaultRoles;
20 |
21 | /**
22 | * Constructor.
23 | *
24 | * @param LdapUserManagerInterface $ldapUserManager LDAP user manager instance
25 | * @param string $rolePrefix Prefix for transforming group names to roles
26 | * @param array $defaultRoles Default roles given to all users
27 | */
28 | public function __construct(LdapUserManagerInterface $ldapUserManager, $rolePrefix = 'ROLE_', array $defaultRoles = [])
29 | {
30 | $this->ldapUserManager = $ldapUserManager;
31 | $this->rolePrefix = $rolePrefix;
32 | $this->defaultRoles = $defaultRoles;
33 | }
34 |
35 | /**
36 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByUsername()
37 | */
38 | public function loadUserByUsername($username)
39 | {
40 | if (!$this->ldapUserManager->hasUsername($username)) {
41 | throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
42 | }
43 |
44 | return new LdapUser($username, $this->getRolesForUsername($username));
45 | }
46 |
47 | /**
48 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::refreshUser()
49 | */
50 | public function refreshUser(UserInterface $account)
51 | {
52 | if (!$account instanceof LdapUser) {
53 | throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($account)));
54 | }
55 |
56 | return $this->loadUserByUsername($account->getUsername());
57 | }
58 |
59 | /**
60 | * Gets roles for the username.
61 | *
62 | * @param string $username
63 | *
64 | * @return array
65 | */
66 | private function getRolesForUsername($username)
67 | {
68 | $roles = [];
69 |
70 | foreach ($this->ldapUserManager->getRolesForUsername($username) as $roleName) {
71 | if ($role = $this->createRoleFromAttribute($roleName)) {
72 | $roles[] = $role;
73 | }
74 | }
75 |
76 | return array_unique(array_merge($this->defaultRoles, $roles));
77 | }
78 |
79 | /**
80 | * Creates a role name from an LDAP attribute.
81 | *
82 | * If a name cannot be derived from the attribute, null will be returned.
83 | *
84 | * @param string $attribute
85 | *
86 | * @return string
87 | */
88 | private function createRoleFromAttribute($attribute)
89 | {
90 | // Replace sequences of non-alphanumeric characters with an underscore
91 | $role = preg_replace('/[^\\pL\d]+/u', '_', $attribute);
92 |
93 | // Attempt transliteration of non-ASCII characters
94 | if (function_exists('iconv')) {
95 | $role = iconv('utf-8', 'us-ascii//TRANSLIT', $role);
96 | }
97 |
98 | // Strip any remaining non-word characters
99 | $role = preg_replace('/[^\w]+/', '', $role);
100 |
101 | // Trim surrounding underscores and convert to uppercase
102 | $role = strtoupper(trim($role, '_'));
103 |
104 | return '' === $role ? null : $this->rolePrefix.$role;
105 | }
106 |
107 | /**
108 | * @see Symfony\Component\Security\Core\User\UserProviderInterface::supportsClass()
109 | * @codeCoverageIgnore
110 | */
111 | public function supportsClass($class)
112 | {
113 | return 'OpenSky\Bundle\LdapBundle\Security\User\LdapUser' === $class;
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/Tests/Security/User/LdapUserManagerTest.php:
--------------------------------------------------------------------------------
1 | ldap = $this->createMock(Ldap::class);
29 |
30 | $this->userBaseDn = 'ou=Users,dc=example,dc=com';
31 | $this->userFilter = '(objectClass=employee)';
32 | $this->usernameAttribute = self::USERNAME_ATTRIBUTE;
33 | $this->roleBaseDn = 'ou=Groups,dc=example,dc=com';
34 | $this->roleFilter = '(objectClass=*)';
35 | $this->roleNameAttribute = self::ROLE_NAME_ATTRIBUTE;
36 | $this->roleUserAttribute = 'memberuid';
37 |
38 | $this->manager = new LdapUserManager(
39 | $this->ldap,
40 | $this->userBaseDn,
41 | $this->userFilter,
42 | $this->usernameAttribute,
43 | $this->roleBaseDn,
44 | $this->roleFilter,
45 | $this->roleNameAttribute,
46 | $this->roleUserAttribute
47 | );
48 | }
49 |
50 | /**
51 | * @dataProvider provideTestHasUsername
52 | */
53 | public function testHasUsername($expectedCount, $expectedResult)
54 | {
55 | $username = 'jmikola';
56 | $expectedDn = sprintf('%s=%s,%s', $this->usernameAttribute, $username, $this->userBaseDn);
57 |
58 | $this->ldap->expects($this->once())
59 | ->method('count')
60 | ->with($this->userFilter, $expectedDn, Ldap::SEARCH_SCOPE_BASE)
61 | ->will($this->returnValue($expectedCount));
62 |
63 | $this->assertEquals($expectedResult, $this->manager->hasUsername($username));
64 | }
65 |
66 | public function provideTestHasUsername()
67 | {
68 | return [
69 | [0, false],
70 | [1, true],
71 | ];
72 | }
73 |
74 | /**
75 | * @dataProvider provideAttributes
76 | */
77 | public function testGetUsernames($usernames)
78 | {
79 | $this->ldap->expects($this->once())
80 | ->method('searchEntries')
81 | ->with($this->userFilter, $this->userBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->usernameAttribute])
82 | ->will($this->returnValue(call_user_func_array([$this, 'createUserEntries'], $usernames)));
83 |
84 | $this->assertEquals($usernames, $this->manager->getUsernames());
85 | }
86 |
87 | /**
88 | * @dataProvider provideAttributes
89 | */
90 | public function testGetRoles($roles)
91 | {
92 | $this->ldap->expects($this->once())
93 | ->method('searchEntries')
94 | ->with($this->roleFilter, $this->roleBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->roleNameAttribute])
95 | ->will($this->returnValue(call_user_func_array([$this, 'createRoleEntries'], $roles)));
96 |
97 | $this->assertEquals($roles, $this->manager->getRoles());
98 | }
99 |
100 | /**
101 | * @dataProvider provideAttributes
102 | */
103 | public function testGetRolesForUsername($roles)
104 | {
105 | $username = 'jmikola';
106 | $expectedFilter = sprintf('(&%s(%s=%s))', $this->roleFilter, $this->roleUserAttribute, $username);
107 |
108 | $this->ldap->expects($this->once())
109 | ->method('searchEntries')
110 | ->with($expectedFilter, $this->roleBaseDn, Ldap::SEARCH_SCOPE_SUB, [$this->roleNameAttribute])
111 | ->will($this->returnValue(call_user_func_array([$this, 'createRoleEntries'], $roles)));
112 |
113 | $this->assertEquals($roles, $this->manager->getRolesForUsername($username));
114 | }
115 |
116 | public function provideAttributes()
117 | {
118 | return [
119 | [[]],
120 | [['alpha']],
121 | [['alpha', 'beta', 'gamma']],
122 | ];
123 | }
124 |
125 | private function createRoleEntries()
126 | {
127 | $entries = [];
128 |
129 | foreach (func_get_args() as $value) {
130 | $entries[] = [self::ROLE_NAME_ATTRIBUTE => [$value]];
131 | }
132 |
133 | return $entries;
134 | }
135 |
136 | private function createUserEntries()
137 | {
138 | $entries = [];
139 |
140 | foreach (func_get_args() as $value) {
141 | $entries[] = [self::USERNAME_ATTRIBUTE => [$value]];
142 | }
143 |
144 | return $entries;
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LdapBundle
2 |
3 | This bundle implements an LDAP-based UserProvider for Symfony2's Security component.
4 |
5 | When used in conjunction with Symfony2's HTTP basic authentication listener, this
6 | bundle can verify usernames against an LDAP server and populate roles based on
7 | groups to which the LDAP user belongs.
8 |
9 | ## Installation
10 |
11 | ### Dependencies
12 |
13 | This bundle depends on the [Zend Framework 2](https://github.com/zendframework/zf2)
14 | LDAP client.
15 |
16 | If you don't already have the ZF2 codebase available in the vendor path of your
17 | Symfony2 application, you may be interested in using [git-subtree](https://github.com/apenwarr/git-subtree)
18 | to pull in the LDAP client by itself. Instructions for this process are documented
19 | in [this thread](https://groups.google.com/d/msg/symfony-devs/N-uIGhEWgs8/CrFmiLFYQbEJ)
20 | from the symfony-devs mailing list.
21 |
22 | ### Submodule Creation
23 |
24 | Add LdapBundle to your `src/` directory:
25 |
26 | $ git submodule add https://github.com/opensky/LdapBundle.git vendor/bundles/OpenSky/Bundle/LdapBundle
27 |
28 | ### Class Autoloading
29 |
30 | If the `src/` directory is already configured in your project's `autoload.php`
31 | via `registerNamespaceFallback()`, no changes should be necessary. Otherwise,
32 | either define the fallback directory or explicitly add the "OpenSky" namespace:
33 |
34 | # app/autoload.php
35 |
36 | $loader->registerNamespaces(array(
37 | 'OpenSky' => __DIR__.'/../vendor/bundles',
38 | ));
39 |
40 | Additionally, ensure that the "Zend" namespace is also configured for autoloading.
41 |
42 | ### Application Kernel
43 |
44 | Add LdapBundle to the `registerBundles()` method of your application kernel:
45 |
46 | public function registerBundles()
47 | {
48 | return array(
49 | new OpenSky\Bundle\LdapBundle\OpenSkyLdapBundle(),
50 | );
51 | }
52 |
53 | ## Configuration
54 |
55 | ### LdapBundle Extension
56 |
57 | The LDAP UserProvider may be configured with the following:
58 |
59 | # app/config/config.yml
60 |
61 | opensky_ldap:
62 | client:
63 | host: ldap.example.com
64 | user_base_dn: ou=Users,dc=example,dc=com
65 | user_filter: (objectClass=employee)
66 | username_attribute: uid
67 | role_base_dn: ou=Groups,dc=example,dc=com
68 | role_filter: (objectClass=role)
69 | role_name_attribute: cn
70 | role_user_attribute: memberuid
71 | security:
72 | role_prefix: ROLE_LDAP_
73 | default_roles: [ROLE_ADMIN, ROLE_LDAP]
74 |
75 | These settings are explained below:
76 |
77 | * `client`: array of options for the ZF2 LDAP client. Any options may be
78 | specified, although host is likely a minimum requirement.
79 | * `user_base_dn`: base DN when searching for users is LDAP.
80 | * `user_filter`: filter to apply when searching for users in LDAP.
81 | * `username_attribute`: user entry attribute to use as a username.
82 | * `role_base_dn`: base DN when searching for roles in LDAP.
83 | * `role_filter`: filter to apply when searching for roles in LDAP.
84 | * `role_name_attribute`: role entry attribute to use as the role name.
85 | * `role_user_attribute`: role entry attribute to use for inferring user
86 | relationships. Its value should be a set of user identifiers, which
87 | correspond to `usernameAttribute` values of user entries.
88 | * `security.role_prefix`: prefix to apply when transforming role names from LDAP
89 | entries into security roles. See: *Deriving Symfony2 Roles from LDAP Groups*
90 | * `security.default_roles`: array of default roles to be assigned to all LDAP
91 | users, before roles are inferred from user/role entry relationships.
92 |
93 | See also:
94 |
95 | * [Zend_Ldap config documentation](http://framework.zend.com/manual/en/zend.ldap.api.html)
96 |
97 | ### Security Component
98 |
99 | This bundle is currently intended to be used alongside Apache's mod_auth_ldap.
100 | As such, it must be configured to operate with a PreAuthenticatedAuthenticationProvider.
101 | A pre-auth provider for HTTP basic authentication is included, and may be
102 | configured as follows:
103 |
104 | # app/config/security.yml
105 |
106 | security.config:
107 | providers:
108 | ldap:
109 | id: opensky_ldap.user_provider
110 | firewalls:
111 | backend:
112 | provider: ldap
113 | pattern: /admin(/.*)?
114 | http_basic_pre_auth: true
115 | stateless: true
116 | factories:
117 | - %kernel.root_dir%/../vendor/bundles/OpenSky/Bundle/LdapBundle/Resources/config/security_factories.xml
118 |
119 | Note: a future enhancement for this bundle will be a UserAuthenticationProvider
120 | to allow for authentication against an LDAP server, which will remove the need
121 | to use mod_auth_ldap for pre-authentication.
122 |
123 | See also:
124 |
125 | * [mod_auth_ldap documentation](http://httpd.apache.org/docs/2.0/mod/mod_auth_ldap.html)
126 |
127 | ## The LdapUser Object ##
128 |
129 | Users provided by the LDAP UserProvider will be instances of LdapUser, which is
130 | a lightweight implementation of Symfony2's UserInterface. This user object
131 | stores only a username and array of roles.
132 |
133 | ## Deriving Symfony2 Roles from LDAP Groups
134 |
135 | LdapBundle will attempt to create Symfony2 security roles based on an attribute
136 | from the group entry. By default, the group's common name ("cn") will be used.
137 |
138 | In general, a group's name will be slugified (using an underscore), uppercased
139 | and prefixed with a configurable string ("ROLE_LDAP_" by default). For example,
140 | if your user exists within the LDAP group named "Admin", the provided LdapUser
141 | object will have the "ROLE_LDAP_ADMIN" role. The full implementation can be
142 | found within the LdapUserProvider class.
143 |
--------------------------------------------------------------------------------
/Security/User/LdapUserManager.php:
--------------------------------------------------------------------------------
1 |
11 | */
12 | class LdapUserManager implements LdapUserManagerInterface
13 | {
14 | private $ldap;
15 | private $userBaseDn;
16 | private $userFilter;
17 | private $usernameAttribute;
18 | private $roleBaseDn;
19 | private $roleFilter;
20 | private $roleNameAttribute;
21 | private $roleUserAttribute;
22 |
23 | /**
24 | * Constructor.
25 | *
26 | * @param Ldap $ldap LDAP client instance
27 | * @param string $userBaseDn Base DN for user records
28 | * @param string $userFilter Filter for user queries
29 | * @param string $usernameAttribute User entry attribute from which to derive username
30 | * @param string $roleBaseDn Base DN for role records
31 | * @param string $roleFilter Filter for role queries
32 | * @param string $roleNameAttribute Role entry attribute from which to derive name
33 | * @param string $roleUserAttribute Role entry attribute from which to derive user memberships
34 | */
35 | public function __construct(Ldap $ldap, $userBaseDn, $userFilter, $usernameAttribute, $roleBaseDn, $roleFilter, $roleNameAttribute, $roleUserAttribute)
36 | {
37 | $this->ldap = $ldap;
38 | $this->userBaseDn = $userBaseDn;
39 | $this->userFilter = $userFilter;
40 | $this->usernameAttribute = $usernameAttribute;
41 | $this->roleBaseDn = $roleBaseDn;
42 | $this->roleFilter = $roleFilter;
43 | $this->roleNameAttribute = $roleNameAttribute;
44 | $this->roleUserAttribute = $roleUserAttribute;
45 | }
46 |
47 | /**
48 | * Check if the username exists.
49 | *
50 | * @param string $username
51 | *
52 | * @return bool
53 | */
54 | public function hasUsername($username)
55 | {
56 | $dn = sprintf('%s=%s,%s', $this->usernameAttribute, $username, $this->userBaseDn);
57 |
58 | return (bool) $this->ldap->count($this->userFilter, $dn, Ldap::SEARCH_SCOPE_BASE);
59 | }
60 |
61 | /**
62 | * Get a list of usernames.
63 | *
64 | * @return array
65 | */
66 | public function getUsernames()
67 | {
68 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries(
69 | $this->userFilter,
70 | $this->userBaseDn,
71 | Ldap::SEARCH_SCOPE_SUB,
72 | [$this->usernameAttribute]
73 | ), $this->usernameAttribute);
74 | }
75 |
76 | /**
77 | * Get a list of roles.
78 | *
79 | * @return array
80 | */
81 | public function getRoles()
82 | {
83 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries(
84 | $this->roleFilter,
85 | $this->roleBaseDn,
86 | Ldap::SEARCH_SCOPE_SUB,
87 | [$this->roleNameAttribute]
88 | ), $this->roleNameAttribute);
89 | }
90 |
91 | /**
92 | * Get a list of roles for the username.
93 | *
94 | * @param string $username
95 | *
96 | * @return array
97 | */
98 | public function getRolesForUsername($username)
99 | {
100 | return $this->resolveEntriesToAttributes($this->ldap->searchEntries(
101 | sprintf('(&%s(%s=%s))', $this->roleFilter, $this->roleUserAttribute, $username),
102 | $this->roleBaseDn,
103 | Ldap::SEARCH_SCOPE_SUB,
104 | [$this->roleNameAttribute]
105 | ), $this->roleNameAttribute);
106 | }
107 |
108 | /**
109 | * Set roles for a username.
110 | *
111 | * @param string $username
112 | * @param array $roles
113 | */
114 | public function setRolesForUsername($username, array $roles)
115 | {
116 | $existingRoles = $this->getRolesForUsername($username);
117 |
118 | $addRoles = array_diff($roles, $existingRoles);
119 | $removeRoles = array_diff($existingRoles, $roles);
120 |
121 | $updateEntriesByDn = [];
122 |
123 | foreach ($addRoles as $name) {
124 | $dn = sprintf('%s=%s,%s', $this->roleNameAttribute, $name, $this->roleBaseDn);
125 |
126 | if ($entry = $this->ldap->getEntry($dn)) {
127 | if (!isset($entry[$this->roleUserAttribute]) || !in_array($username, $entry[$this->roleUserAttribute])) {
128 | $entry[$this->roleUserAttribute][] = $username;
129 | $updateEntriesByDn[$dn] = $entry;
130 | }
131 | }
132 | }
133 |
134 | foreach ($removeRoles as $name) {
135 | $dn = sprintf('%s=%s,%s', $this->roleNameAttribute, $name, $this->roleBaseDn);
136 |
137 | if ($entry = $this->ldap->getEntry($dn)) {
138 | if (isset($entry[$this->roleUserAttribute]) && ($key = array_search($username, $entry[$this->roleUserAttribute]))) {
139 | unset($entry[$this->roleUserAttribute][$key]);
140 | $updateEntriesByDn[$dn] = $entry;
141 | }
142 | }
143 | }
144 |
145 | foreach ($updateEntriesByDn as $dn => $entry) {
146 | $this->ldap->update($dn, $entry);
147 | }
148 | }
149 |
150 | /**
151 | * Resolves entries resulting from a search query to an array of attribute
152 | * values.
153 | *
154 | * @param array $entries
155 | * @param string $attributeName
156 | *
157 | * @return array
158 | */
159 | private function resolveEntriesToAttributes(array $entries, $attributeName)
160 | {
161 | $attributes = [];
162 |
163 | foreach ($entries as $entry) {
164 | if (isset($entry[$attributeName][0])) {
165 | $attributes[] = $entry[$attributeName][0];
166 | }
167 | }
168 |
169 | return $attributes;
170 | }
171 | }
172 |
--------------------------------------------------------------------------------
/composer.lock:
--------------------------------------------------------------------------------
1 | {
2 | "_readme": [
3 | "This file locks the dependencies of your project to a known state",
4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5 | "This file is @generated automatically"
6 | ],
7 | "content-hash": "a75b8e72838dd335275a78e3bfcb7b83",
8 | "packages": [
9 | {
10 | "name": "doctrine/cache",
11 | "version": "v1.7.1",
12 | "source": {
13 | "type": "git",
14 | "url": "https://github.com/doctrine/cache.git",
15 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a"
16 | },
17 | "dist": {
18 | "type": "zip",
19 | "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a",
20 | "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a",
21 | "shasum": ""
22 | },
23 | "require": {
24 | "php": "~7.1"
25 | },
26 | "conflict": {
27 | "doctrine/common": ">2.2,<2.4"
28 | },
29 | "require-dev": {
30 | "alcaeus/mongo-php-adapter": "^1.1",
31 | "mongodb/mongodb": "^1.1",
32 | "phpunit/phpunit": "^5.7",
33 | "predis/predis": "~1.0"
34 | },
35 | "suggest": {
36 | "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
37 | },
38 | "type": "library",
39 | "extra": {
40 | "branch-alias": {
41 | "dev-master": "1.7.x-dev"
42 | }
43 | },
44 | "autoload": {
45 | "psr-4": {
46 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
47 | }
48 | },
49 | "notification-url": "https://packagist.org/downloads/",
50 | "license": [
51 | "MIT"
52 | ],
53 | "authors": [
54 | {
55 | "name": "Roman Borschel",
56 | "email": "roman@code-factory.org"
57 | },
58 | {
59 | "name": "Benjamin Eberlei",
60 | "email": "kontakt@beberlei.de"
61 | },
62 | {
63 | "name": "Guilherme Blanco",
64 | "email": "guilhermeblanco@gmail.com"
65 | },
66 | {
67 | "name": "Jonathan Wage",
68 | "email": "jonwage@gmail.com"
69 | },
70 | {
71 | "name": "Johannes Schmitt",
72 | "email": "schmittjoh@gmail.com"
73 | }
74 | ],
75 | "description": "Caching library offering an object-oriented API for many cache backends",
76 | "homepage": "http://www.doctrine-project.org",
77 | "keywords": [
78 | "cache",
79 | "caching"
80 | ],
81 | "time": "2017-08-25T07:02:50+00:00"
82 | },
83 | {
84 | "name": "paragonie/random_compat",
85 | "version": "v2.0.11",
86 | "source": {
87 | "type": "git",
88 | "url": "https://github.com/paragonie/random_compat.git",
89 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8"
90 | },
91 | "dist": {
92 | "type": "zip",
93 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8",
94 | "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8",
95 | "shasum": ""
96 | },
97 | "require": {
98 | "php": ">=5.2.0"
99 | },
100 | "require-dev": {
101 | "phpunit/phpunit": "4.*|5.*"
102 | },
103 | "suggest": {
104 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
105 | },
106 | "type": "library",
107 | "autoload": {
108 | "files": [
109 | "lib/random.php"
110 | ]
111 | },
112 | "notification-url": "https://packagist.org/downloads/",
113 | "license": [
114 | "MIT"
115 | ],
116 | "authors": [
117 | {
118 | "name": "Paragon Initiative Enterprises",
119 | "email": "security@paragonie.com",
120 | "homepage": "https://paragonie.com"
121 | }
122 | ],
123 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
124 | "keywords": [
125 | "csprng",
126 | "pseudorandom",
127 | "random"
128 | ],
129 | "time": "2017-09-27T21:40:39+00:00"
130 | },
131 | {
132 | "name": "psr/cache",
133 | "version": "1.0.1",
134 | "source": {
135 | "type": "git",
136 | "url": "https://github.com/php-fig/cache.git",
137 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
138 | },
139 | "dist": {
140 | "type": "zip",
141 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
142 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
143 | "shasum": ""
144 | },
145 | "require": {
146 | "php": ">=5.3.0"
147 | },
148 | "type": "library",
149 | "extra": {
150 | "branch-alias": {
151 | "dev-master": "1.0.x-dev"
152 | }
153 | },
154 | "autoload": {
155 | "psr-4": {
156 | "Psr\\Cache\\": "src/"
157 | }
158 | },
159 | "notification-url": "https://packagist.org/downloads/",
160 | "license": [
161 | "MIT"
162 | ],
163 | "authors": [
164 | {
165 | "name": "PHP-FIG",
166 | "homepage": "http://www.php-fig.org/"
167 | }
168 | ],
169 | "description": "Common interface for caching libraries",
170 | "keywords": [
171 | "cache",
172 | "psr",
173 | "psr-6"
174 | ],
175 | "time": "2016-08-06T20:24:11+00:00"
176 | },
177 | {
178 | "name": "psr/container",
179 | "version": "1.0.0",
180 | "source": {
181 | "type": "git",
182 | "url": "https://github.com/php-fig/container.git",
183 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
184 | },
185 | "dist": {
186 | "type": "zip",
187 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
188 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
189 | "shasum": ""
190 | },
191 | "require": {
192 | "php": ">=5.3.0"
193 | },
194 | "type": "library",
195 | "extra": {
196 | "branch-alias": {
197 | "dev-master": "1.0.x-dev"
198 | }
199 | },
200 | "autoload": {
201 | "psr-4": {
202 | "Psr\\Container\\": "src/"
203 | }
204 | },
205 | "notification-url": "https://packagist.org/downloads/",
206 | "license": [
207 | "MIT"
208 | ],
209 | "authors": [
210 | {
211 | "name": "PHP-FIG",
212 | "homepage": "http://www.php-fig.org/"
213 | }
214 | ],
215 | "description": "Common Container Interface (PHP FIG PSR-11)",
216 | "homepage": "https://github.com/php-fig/container",
217 | "keywords": [
218 | "PSR-11",
219 | "container",
220 | "container-interface",
221 | "container-interop",
222 | "psr"
223 | ],
224 | "time": "2017-02-14T16:28:37+00:00"
225 | },
226 | {
227 | "name": "psr/log",
228 | "version": "1.0.2",
229 | "source": {
230 | "type": "git",
231 | "url": "https://github.com/php-fig/log.git",
232 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
233 | },
234 | "dist": {
235 | "type": "zip",
236 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
237 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
238 | "shasum": ""
239 | },
240 | "require": {
241 | "php": ">=5.3.0"
242 | },
243 | "type": "library",
244 | "extra": {
245 | "branch-alias": {
246 | "dev-master": "1.0.x-dev"
247 | }
248 | },
249 | "autoload": {
250 | "psr-4": {
251 | "Psr\\Log\\": "Psr/Log/"
252 | }
253 | },
254 | "notification-url": "https://packagist.org/downloads/",
255 | "license": [
256 | "MIT"
257 | ],
258 | "authors": [
259 | {
260 | "name": "PHP-FIG",
261 | "homepage": "http://www.php-fig.org/"
262 | }
263 | ],
264 | "description": "Common interface for logging libraries",
265 | "homepage": "https://github.com/php-fig/log",
266 | "keywords": [
267 | "log",
268 | "psr",
269 | "psr-3"
270 | ],
271 | "time": "2016-10-10T12:19:37+00:00"
272 | },
273 | {
274 | "name": "psr/simple-cache",
275 | "version": "1.0.0",
276 | "source": {
277 | "type": "git",
278 | "url": "https://github.com/php-fig/simple-cache.git",
279 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
280 | },
281 | "dist": {
282 | "type": "zip",
283 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
284 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
285 | "shasum": ""
286 | },
287 | "require": {
288 | "php": ">=5.3.0"
289 | },
290 | "type": "library",
291 | "extra": {
292 | "branch-alias": {
293 | "dev-master": "1.0.x-dev"
294 | }
295 | },
296 | "autoload": {
297 | "psr-4": {
298 | "Psr\\SimpleCache\\": "src/"
299 | }
300 | },
301 | "notification-url": "https://packagist.org/downloads/",
302 | "license": [
303 | "MIT"
304 | ],
305 | "authors": [
306 | {
307 | "name": "PHP-FIG",
308 | "homepage": "http://www.php-fig.org/"
309 | }
310 | ],
311 | "description": "Common interfaces for simple caching",
312 | "keywords": [
313 | "cache",
314 | "caching",
315 | "psr",
316 | "psr-16",
317 | "simple-cache"
318 | ],
319 | "time": "2017-01-02T13:31:39+00:00"
320 | },
321 | {
322 | "name": "symfony/cache",
323 | "version": "v3.3.13",
324 | "source": {
325 | "type": "git",
326 | "url": "https://github.com/symfony/cache.git",
327 | "reference": "49aadc35cc8ae6646cdc39ebdeaceb6712769c9f"
328 | },
329 | "dist": {
330 | "type": "zip",
331 | "url": "https://api.github.com/repos/symfony/cache/zipball/49aadc35cc8ae6646cdc39ebdeaceb6712769c9f",
332 | "reference": "49aadc35cc8ae6646cdc39ebdeaceb6712769c9f",
333 | "shasum": ""
334 | },
335 | "require": {
336 | "php": "^5.5.9|>=7.0.8",
337 | "psr/cache": "~1.0",
338 | "psr/log": "~1.0",
339 | "psr/simple-cache": "^1.0",
340 | "symfony/polyfill-apcu": "~1.1"
341 | },
342 | "conflict": {
343 | "symfony/var-dumper": "<3.3"
344 | },
345 | "provide": {
346 | "psr/cache-implementation": "1.0",
347 | "psr/simple-cache-implementation": "1.0"
348 | },
349 | "require-dev": {
350 | "cache/integration-tests": "dev-master",
351 | "doctrine/cache": "~1.6",
352 | "doctrine/dbal": "~2.4",
353 | "predis/predis": "~1.0"
354 | },
355 | "type": "library",
356 | "extra": {
357 | "branch-alias": {
358 | "dev-master": "3.3-dev"
359 | }
360 | },
361 | "autoload": {
362 | "psr-4": {
363 | "Symfony\\Component\\Cache\\": ""
364 | },
365 | "exclude-from-classmap": [
366 | "/Tests/"
367 | ]
368 | },
369 | "notification-url": "https://packagist.org/downloads/",
370 | "license": [
371 | "MIT"
372 | ],
373 | "authors": [
374 | {
375 | "name": "Nicolas Grekas",
376 | "email": "p@tchwork.com"
377 | },
378 | {
379 | "name": "Symfony Community",
380 | "homepage": "https://symfony.com/contributors"
381 | }
382 | ],
383 | "description": "Symfony Cache component with PSR-6, PSR-16, and tags",
384 | "homepage": "https://symfony.com",
385 | "keywords": [
386 | "caching",
387 | "psr6"
388 | ],
389 | "time": "2017-11-07T14:16:22+00:00"
390 | },
391 | {
392 | "name": "symfony/class-loader",
393 | "version": "v3.3.13",
394 | "source": {
395 | "type": "git",
396 | "url": "https://github.com/symfony/class-loader.git",
397 | "reference": "df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1"
398 | },
399 | "dist": {
400 | "type": "zip",
401 | "url": "https://api.github.com/repos/symfony/class-loader/zipball/df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1",
402 | "reference": "df173ac2af96ce202bf8bb5a3fc0bec8a4fdd4d1",
403 | "shasum": ""
404 | },
405 | "require": {
406 | "php": "^5.5.9|>=7.0.8"
407 | },
408 | "require-dev": {
409 | "symfony/finder": "~2.8|~3.0",
410 | "symfony/polyfill-apcu": "~1.1"
411 | },
412 | "suggest": {
413 | "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
414 | },
415 | "type": "library",
416 | "extra": {
417 | "branch-alias": {
418 | "dev-master": "3.3-dev"
419 | }
420 | },
421 | "autoload": {
422 | "psr-4": {
423 | "Symfony\\Component\\ClassLoader\\": ""
424 | },
425 | "exclude-from-classmap": [
426 | "/Tests/"
427 | ]
428 | },
429 | "notification-url": "https://packagist.org/downloads/",
430 | "license": [
431 | "MIT"
432 | ],
433 | "authors": [
434 | {
435 | "name": "Fabien Potencier",
436 | "email": "fabien@symfony.com"
437 | },
438 | {
439 | "name": "Symfony Community",
440 | "homepage": "https://symfony.com/contributors"
441 | }
442 | ],
443 | "description": "Symfony ClassLoader Component",
444 | "homepage": "https://symfony.com",
445 | "time": "2017-11-05T15:47:03+00:00"
446 | },
447 | {
448 | "name": "symfony/config",
449 | "version": "v3.3.13",
450 | "source": {
451 | "type": "git",
452 | "url": "https://github.com/symfony/config.git",
453 | "reference": "8d2649077dc54dfbaf521d31f217383d82303c5f"
454 | },
455 | "dist": {
456 | "type": "zip",
457 | "url": "https://api.github.com/repos/symfony/config/zipball/8d2649077dc54dfbaf521d31f217383d82303c5f",
458 | "reference": "8d2649077dc54dfbaf521d31f217383d82303c5f",
459 | "shasum": ""
460 | },
461 | "require": {
462 | "php": "^5.5.9|>=7.0.8",
463 | "symfony/filesystem": "~2.8|~3.0"
464 | },
465 | "conflict": {
466 | "symfony/dependency-injection": "<3.3",
467 | "symfony/finder": "<3.3"
468 | },
469 | "require-dev": {
470 | "symfony/dependency-injection": "~3.3",
471 | "symfony/finder": "~3.3",
472 | "symfony/yaml": "~3.0"
473 | },
474 | "suggest": {
475 | "symfony/yaml": "To use the yaml reference dumper"
476 | },
477 | "type": "library",
478 | "extra": {
479 | "branch-alias": {
480 | "dev-master": "3.3-dev"
481 | }
482 | },
483 | "autoload": {
484 | "psr-4": {
485 | "Symfony\\Component\\Config\\": ""
486 | },
487 | "exclude-from-classmap": [
488 | "/Tests/"
489 | ]
490 | },
491 | "notification-url": "https://packagist.org/downloads/",
492 | "license": [
493 | "MIT"
494 | ],
495 | "authors": [
496 | {
497 | "name": "Fabien Potencier",
498 | "email": "fabien@symfony.com"
499 | },
500 | {
501 | "name": "Symfony Community",
502 | "homepage": "https://symfony.com/contributors"
503 | }
504 | ],
505 | "description": "Symfony Config Component",
506 | "homepage": "https://symfony.com",
507 | "time": "2017-11-07T14:16:22+00:00"
508 | },
509 | {
510 | "name": "symfony/debug",
511 | "version": "v3.3.13",
512 | "source": {
513 | "type": "git",
514 | "url": "https://github.com/symfony/debug.git",
515 | "reference": "74557880e2846b5c84029faa96b834da37e29810"
516 | },
517 | "dist": {
518 | "type": "zip",
519 | "url": "https://api.github.com/repos/symfony/debug/zipball/74557880e2846b5c84029faa96b834da37e29810",
520 | "reference": "74557880e2846b5c84029faa96b834da37e29810",
521 | "shasum": ""
522 | },
523 | "require": {
524 | "php": "^5.5.9|>=7.0.8",
525 | "psr/log": "~1.0"
526 | },
527 | "conflict": {
528 | "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
529 | },
530 | "require-dev": {
531 | "symfony/http-kernel": "~2.8|~3.0"
532 | },
533 | "type": "library",
534 | "extra": {
535 | "branch-alias": {
536 | "dev-master": "3.3-dev"
537 | }
538 | },
539 | "autoload": {
540 | "psr-4": {
541 | "Symfony\\Component\\Debug\\": ""
542 | },
543 | "exclude-from-classmap": [
544 | "/Tests/"
545 | ]
546 | },
547 | "notification-url": "https://packagist.org/downloads/",
548 | "license": [
549 | "MIT"
550 | ],
551 | "authors": [
552 | {
553 | "name": "Fabien Potencier",
554 | "email": "fabien@symfony.com"
555 | },
556 | {
557 | "name": "Symfony Community",
558 | "homepage": "https://symfony.com/contributors"
559 | }
560 | ],
561 | "description": "Symfony Debug Component",
562 | "homepage": "https://symfony.com",
563 | "time": "2017-11-10T16:38:39+00:00"
564 | },
565 | {
566 | "name": "symfony/dependency-injection",
567 | "version": "v3.3.13",
568 | "source": {
569 | "type": "git",
570 | "url": "https://github.com/symfony/dependency-injection.git",
571 | "reference": "4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8"
572 | },
573 | "dist": {
574 | "type": "zip",
575 | "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8",
576 | "reference": "4e84f5af2c2d51ee3dee72df40b7fc08f49b4ab8",
577 | "shasum": ""
578 | },
579 | "require": {
580 | "php": "^5.5.9|>=7.0.8",
581 | "psr/container": "^1.0"
582 | },
583 | "conflict": {
584 | "symfony/config": "<3.3.1",
585 | "symfony/finder": "<3.3",
586 | "symfony/yaml": "<3.3"
587 | },
588 | "provide": {
589 | "psr/container-implementation": "1.0"
590 | },
591 | "require-dev": {
592 | "symfony/config": "~3.3",
593 | "symfony/expression-language": "~2.8|~3.0",
594 | "symfony/yaml": "~3.3"
595 | },
596 | "suggest": {
597 | "symfony/config": "",
598 | "symfony/expression-language": "For using expressions in service container configuration",
599 | "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required",
600 | "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
601 | "symfony/yaml": ""
602 | },
603 | "type": "library",
604 | "extra": {
605 | "branch-alias": {
606 | "dev-master": "3.3-dev"
607 | }
608 | },
609 | "autoload": {
610 | "psr-4": {
611 | "Symfony\\Component\\DependencyInjection\\": ""
612 | },
613 | "exclude-from-classmap": [
614 | "/Tests/"
615 | ]
616 | },
617 | "notification-url": "https://packagist.org/downloads/",
618 | "license": [
619 | "MIT"
620 | ],
621 | "authors": [
622 | {
623 | "name": "Fabien Potencier",
624 | "email": "fabien@symfony.com"
625 | },
626 | {
627 | "name": "Symfony Community",
628 | "homepage": "https://symfony.com/contributors"
629 | }
630 | ],
631 | "description": "Symfony DependencyInjection Component",
632 | "homepage": "https://symfony.com",
633 | "time": "2017-11-13T18:10:32+00:00"
634 | },
635 | {
636 | "name": "symfony/event-dispatcher",
637 | "version": "v3.3.13",
638 | "source": {
639 | "type": "git",
640 | "url": "https://github.com/symfony/event-dispatcher.git",
641 | "reference": "271d8c27c3ec5ecee6e2ac06016232e249d638d9"
642 | },
643 | "dist": {
644 | "type": "zip",
645 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/271d8c27c3ec5ecee6e2ac06016232e249d638d9",
646 | "reference": "271d8c27c3ec5ecee6e2ac06016232e249d638d9",
647 | "shasum": ""
648 | },
649 | "require": {
650 | "php": "^5.5.9|>=7.0.8"
651 | },
652 | "conflict": {
653 | "symfony/dependency-injection": "<3.3"
654 | },
655 | "require-dev": {
656 | "psr/log": "~1.0",
657 | "symfony/config": "~2.8|~3.0",
658 | "symfony/dependency-injection": "~3.3",
659 | "symfony/expression-language": "~2.8|~3.0",
660 | "symfony/stopwatch": "~2.8|~3.0"
661 | },
662 | "suggest": {
663 | "symfony/dependency-injection": "",
664 | "symfony/http-kernel": ""
665 | },
666 | "type": "library",
667 | "extra": {
668 | "branch-alias": {
669 | "dev-master": "3.3-dev"
670 | }
671 | },
672 | "autoload": {
673 | "psr-4": {
674 | "Symfony\\Component\\EventDispatcher\\": ""
675 | },
676 | "exclude-from-classmap": [
677 | "/Tests/"
678 | ]
679 | },
680 | "notification-url": "https://packagist.org/downloads/",
681 | "license": [
682 | "MIT"
683 | ],
684 | "authors": [
685 | {
686 | "name": "Fabien Potencier",
687 | "email": "fabien@symfony.com"
688 | },
689 | {
690 | "name": "Symfony Community",
691 | "homepage": "https://symfony.com/contributors"
692 | }
693 | ],
694 | "description": "Symfony EventDispatcher Component",
695 | "homepage": "https://symfony.com",
696 | "time": "2017-11-05T15:47:03+00:00"
697 | },
698 | {
699 | "name": "symfony/filesystem",
700 | "version": "v3.3.13",
701 | "source": {
702 | "type": "git",
703 | "url": "https://github.com/symfony/filesystem.git",
704 | "reference": "77db266766b54db3ee982fe51868328b887ce15c"
705 | },
706 | "dist": {
707 | "type": "zip",
708 | "url": "https://api.github.com/repos/symfony/filesystem/zipball/77db266766b54db3ee982fe51868328b887ce15c",
709 | "reference": "77db266766b54db3ee982fe51868328b887ce15c",
710 | "shasum": ""
711 | },
712 | "require": {
713 | "php": "^5.5.9|>=7.0.8"
714 | },
715 | "type": "library",
716 | "extra": {
717 | "branch-alias": {
718 | "dev-master": "3.3-dev"
719 | }
720 | },
721 | "autoload": {
722 | "psr-4": {
723 | "Symfony\\Component\\Filesystem\\": ""
724 | },
725 | "exclude-from-classmap": [
726 | "/Tests/"
727 | ]
728 | },
729 | "notification-url": "https://packagist.org/downloads/",
730 | "license": [
731 | "MIT"
732 | ],
733 | "authors": [
734 | {
735 | "name": "Fabien Potencier",
736 | "email": "fabien@symfony.com"
737 | },
738 | {
739 | "name": "Symfony Community",
740 | "homepage": "https://symfony.com/contributors"
741 | }
742 | ],
743 | "description": "Symfony Filesystem Component",
744 | "homepage": "https://symfony.com",
745 | "time": "2017-11-07T14:12:55+00:00"
746 | },
747 | {
748 | "name": "symfony/finder",
749 | "version": "v3.3.13",
750 | "source": {
751 | "type": "git",
752 | "url": "https://github.com/symfony/finder.git",
753 | "reference": "138af5ec075d4b1d1bd19de08c38a34bb2d7d880"
754 | },
755 | "dist": {
756 | "type": "zip",
757 | "url": "https://api.github.com/repos/symfony/finder/zipball/138af5ec075d4b1d1bd19de08c38a34bb2d7d880",
758 | "reference": "138af5ec075d4b1d1bd19de08c38a34bb2d7d880",
759 | "shasum": ""
760 | },
761 | "require": {
762 | "php": "^5.5.9|>=7.0.8"
763 | },
764 | "type": "library",
765 | "extra": {
766 | "branch-alias": {
767 | "dev-master": "3.3-dev"
768 | }
769 | },
770 | "autoload": {
771 | "psr-4": {
772 | "Symfony\\Component\\Finder\\": ""
773 | },
774 | "exclude-from-classmap": [
775 | "/Tests/"
776 | ]
777 | },
778 | "notification-url": "https://packagist.org/downloads/",
779 | "license": [
780 | "MIT"
781 | ],
782 | "authors": [
783 | {
784 | "name": "Fabien Potencier",
785 | "email": "fabien@symfony.com"
786 | },
787 | {
788 | "name": "Symfony Community",
789 | "homepage": "https://symfony.com/contributors"
790 | }
791 | ],
792 | "description": "Symfony Finder Component",
793 | "homepage": "https://symfony.com",
794 | "time": "2017-11-05T15:47:03+00:00"
795 | },
796 | {
797 | "name": "symfony/framework-bundle",
798 | "version": "v3.3.13",
799 | "source": {
800 | "type": "git",
801 | "url": "https://github.com/symfony/framework-bundle.git",
802 | "reference": "53f95fd6e248e7270cebd347b0e3bf22b2c8e480"
803 | },
804 | "dist": {
805 | "type": "zip",
806 | "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/53f95fd6e248e7270cebd347b0e3bf22b2c8e480",
807 | "reference": "53f95fd6e248e7270cebd347b0e3bf22b2c8e480",
808 | "shasum": ""
809 | },
810 | "require": {
811 | "doctrine/cache": "~1.0",
812 | "ext-xml": "*",
813 | "php": "^5.5.9|>=7.0.8",
814 | "symfony/cache": "~3.3",
815 | "symfony/class-loader": "~3.2",
816 | "symfony/config": "~3.3",
817 | "symfony/dependency-injection": "~3.3",
818 | "symfony/event-dispatcher": "^3.3.1",
819 | "symfony/filesystem": "~2.8|~3.0",
820 | "symfony/finder": "~2.8|~3.0",
821 | "symfony/http-foundation": "^3.3.11",
822 | "symfony/http-kernel": "~3.3",
823 | "symfony/polyfill-mbstring": "~1.0",
824 | "symfony/routing": "~3.3",
825 | "symfony/stopwatch": "~2.8|~3.0"
826 | },
827 | "conflict": {
828 | "phpdocumentor/reflection-docblock": "<3.0",
829 | "phpdocumentor/type-resolver": "<0.2.1",
830 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
831 | "symfony/asset": "<3.3",
832 | "symfony/console": "<3.3",
833 | "symfony/form": "<3.3",
834 | "symfony/property-info": "<3.3",
835 | "symfony/serializer": "<3.3",
836 | "symfony/translation": "<3.2",
837 | "symfony/validator": "<3.3",
838 | "symfony/workflow": "<3.3"
839 | },
840 | "require-dev": {
841 | "doctrine/annotations": "~1.0",
842 | "fig/link-util": "^1.0",
843 | "phpdocumentor/reflection-docblock": "^3.0|^4.0",
844 | "sensio/framework-extra-bundle": "^3.0.2",
845 | "symfony/asset": "~3.3",
846 | "symfony/browser-kit": "~2.8|~3.0",
847 | "symfony/console": "~3.3",
848 | "symfony/css-selector": "~2.8|~3.0",
849 | "symfony/dom-crawler": "~2.8|~3.0",
850 | "symfony/expression-language": "~2.8|~3.0",
851 | "symfony/form": "~3.3",
852 | "symfony/polyfill-intl-icu": "~1.0",
853 | "symfony/process": "~2.8|~3.0",
854 | "symfony/property-info": "~3.3",
855 | "symfony/security": "~2.8|~3.0",
856 | "symfony/security-core": "~3.2",
857 | "symfony/security-csrf": "~2.8|~3.0",
858 | "symfony/serializer": "~3.3",
859 | "symfony/templating": "~2.8|~3.0",
860 | "symfony/translation": "~3.2",
861 | "symfony/validator": "~3.3",
862 | "symfony/web-link": "~3.3",
863 | "symfony/workflow": "~3.3",
864 | "symfony/yaml": "~3.2",
865 | "twig/twig": "~1.34|~2.4"
866 | },
867 | "suggest": {
868 | "ext-apcu": "For best performance of the system caches",
869 | "symfony/console": "For using the console commands",
870 | "symfony/form": "For using forms",
871 | "symfony/property-info": "For using the property_info service",
872 | "symfony/serializer": "For using the serializer service",
873 | "symfony/validator": "For using validation",
874 | "symfony/web-link": "For using web links, features such as preloading, prefetching or prerendering",
875 | "symfony/yaml": "For using the debug:config and lint:yaml commands"
876 | },
877 | "type": "symfony-bundle",
878 | "extra": {
879 | "branch-alias": {
880 | "dev-master": "3.3-dev"
881 | }
882 | },
883 | "autoload": {
884 | "psr-4": {
885 | "Symfony\\Bundle\\FrameworkBundle\\": ""
886 | },
887 | "exclude-from-classmap": [
888 | "/Tests/"
889 | ]
890 | },
891 | "notification-url": "https://packagist.org/downloads/",
892 | "license": [
893 | "MIT"
894 | ],
895 | "authors": [
896 | {
897 | "name": "Fabien Potencier",
898 | "email": "fabien@symfony.com"
899 | },
900 | {
901 | "name": "Symfony Community",
902 | "homepage": "https://symfony.com/contributors"
903 | }
904 | ],
905 | "description": "Symfony FrameworkBundle",
906 | "homepage": "https://symfony.com",
907 | "time": "2017-11-16T15:24:32+00:00"
908 | },
909 | {
910 | "name": "symfony/http-foundation",
911 | "version": "v3.3.13",
912 | "source": {
913 | "type": "git",
914 | "url": "https://github.com/symfony/http-foundation.git",
915 | "reference": "5943f0f19817a7e05992d20a90729b0dc93faf36"
916 | },
917 | "dist": {
918 | "type": "zip",
919 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5943f0f19817a7e05992d20a90729b0dc93faf36",
920 | "reference": "5943f0f19817a7e05992d20a90729b0dc93faf36",
921 | "shasum": ""
922 | },
923 | "require": {
924 | "php": "^5.5.9|>=7.0.8",
925 | "symfony/polyfill-mbstring": "~1.1"
926 | },
927 | "require-dev": {
928 | "symfony/expression-language": "~2.8|~3.0"
929 | },
930 | "type": "library",
931 | "extra": {
932 | "branch-alias": {
933 | "dev-master": "3.3-dev"
934 | }
935 | },
936 | "autoload": {
937 | "psr-4": {
938 | "Symfony\\Component\\HttpFoundation\\": ""
939 | },
940 | "exclude-from-classmap": [
941 | "/Tests/"
942 | ]
943 | },
944 | "notification-url": "https://packagist.org/downloads/",
945 | "license": [
946 | "MIT"
947 | ],
948 | "authors": [
949 | {
950 | "name": "Fabien Potencier",
951 | "email": "fabien@symfony.com"
952 | },
953 | {
954 | "name": "Symfony Community",
955 | "homepage": "https://symfony.com/contributors"
956 | }
957 | ],
958 | "description": "Symfony HttpFoundation Component",
959 | "homepage": "https://symfony.com",
960 | "time": "2017-11-13T18:13:16+00:00"
961 | },
962 | {
963 | "name": "symfony/http-kernel",
964 | "version": "v3.3.13",
965 | "source": {
966 | "type": "git",
967 | "url": "https://github.com/symfony/http-kernel.git",
968 | "reference": "a2a942172b742217ab2ccd9399494af2aa17c766"
969 | },
970 | "dist": {
971 | "type": "zip",
972 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/a2a942172b742217ab2ccd9399494af2aa17c766",
973 | "reference": "a2a942172b742217ab2ccd9399494af2aa17c766",
974 | "shasum": ""
975 | },
976 | "require": {
977 | "php": "^5.5.9|>=7.0.8",
978 | "psr/log": "~1.0",
979 | "symfony/debug": "~2.8|~3.0",
980 | "symfony/event-dispatcher": "~2.8|~3.0",
981 | "symfony/http-foundation": "^3.3.11"
982 | },
983 | "conflict": {
984 | "symfony/config": "<2.8",
985 | "symfony/dependency-injection": "<3.3",
986 | "symfony/var-dumper": "<3.3",
987 | "twig/twig": "<1.34|<2.4,>=2"
988 | },
989 | "require-dev": {
990 | "psr/cache": "~1.0",
991 | "symfony/browser-kit": "~2.8|~3.0",
992 | "symfony/class-loader": "~2.8|~3.0",
993 | "symfony/config": "~2.8|~3.0",
994 | "symfony/console": "~2.8|~3.0",
995 | "symfony/css-selector": "~2.8|~3.0",
996 | "symfony/dependency-injection": "~3.3",
997 | "symfony/dom-crawler": "~2.8|~3.0",
998 | "symfony/expression-language": "~2.8|~3.0",
999 | "symfony/finder": "~2.8|~3.0",
1000 | "symfony/process": "~2.8|~3.0",
1001 | "symfony/routing": "~2.8|~3.0",
1002 | "symfony/stopwatch": "~2.8|~3.0",
1003 | "symfony/templating": "~2.8|~3.0",
1004 | "symfony/translation": "~2.8|~3.0",
1005 | "symfony/var-dumper": "~3.3"
1006 | },
1007 | "suggest": {
1008 | "symfony/browser-kit": "",
1009 | "symfony/class-loader": "",
1010 | "symfony/config": "",
1011 | "symfony/console": "",
1012 | "symfony/dependency-injection": "",
1013 | "symfony/finder": "",
1014 | "symfony/var-dumper": ""
1015 | },
1016 | "type": "library",
1017 | "extra": {
1018 | "branch-alias": {
1019 | "dev-master": "3.3-dev"
1020 | }
1021 | },
1022 | "autoload": {
1023 | "psr-4": {
1024 | "Symfony\\Component\\HttpKernel\\": ""
1025 | },
1026 | "exclude-from-classmap": [
1027 | "/Tests/"
1028 | ]
1029 | },
1030 | "notification-url": "https://packagist.org/downloads/",
1031 | "license": [
1032 | "MIT"
1033 | ],
1034 | "authors": [
1035 | {
1036 | "name": "Fabien Potencier",
1037 | "email": "fabien@symfony.com"
1038 | },
1039 | {
1040 | "name": "Symfony Community",
1041 | "homepage": "https://symfony.com/contributors"
1042 | }
1043 | ],
1044 | "description": "Symfony HttpKernel Component",
1045 | "homepage": "https://symfony.com",
1046 | "time": "2017-11-16T18:14:43+00:00"
1047 | },
1048 | {
1049 | "name": "symfony/inflector",
1050 | "version": "v3.3.13",
1051 | "source": {
1052 | "type": "git",
1053 | "url": "https://github.com/symfony/inflector.git",
1054 | "reference": "0474dc4d867c7efefd44017f7903465a7f368b6b"
1055 | },
1056 | "dist": {
1057 | "type": "zip",
1058 | "url": "https://api.github.com/repos/symfony/inflector/zipball/0474dc4d867c7efefd44017f7903465a7f368b6b",
1059 | "reference": "0474dc4d867c7efefd44017f7903465a7f368b6b",
1060 | "shasum": ""
1061 | },
1062 | "require": {
1063 | "php": "^5.5.9|>=7.0.8"
1064 | },
1065 | "type": "library",
1066 | "extra": {
1067 | "branch-alias": {
1068 | "dev-master": "3.3-dev"
1069 | }
1070 | },
1071 | "autoload": {
1072 | "psr-4": {
1073 | "Symfony\\Component\\Inflector\\": ""
1074 | },
1075 | "exclude-from-classmap": [
1076 | "/Tests/"
1077 | ]
1078 | },
1079 | "notification-url": "https://packagist.org/downloads/",
1080 | "license": [
1081 | "MIT"
1082 | ],
1083 | "authors": [
1084 | {
1085 | "name": "Bernhard Schussek",
1086 | "email": "bschussek@gmail.com"
1087 | },
1088 | {
1089 | "name": "Symfony Community",
1090 | "homepage": "https://symfony.com/contributors"
1091 | }
1092 | ],
1093 | "description": "Symfony Inflector Component",
1094 | "homepage": "https://symfony.com",
1095 | "keywords": [
1096 | "inflection",
1097 | "pluralize",
1098 | "singularize",
1099 | "string",
1100 | "symfony",
1101 | "words"
1102 | ],
1103 | "time": "2017-07-29T21:54:42+00:00"
1104 | },
1105 | {
1106 | "name": "symfony/polyfill-apcu",
1107 | "version": "v1.6.0",
1108 | "source": {
1109 | "type": "git",
1110 | "url": "https://github.com/symfony/polyfill-apcu.git",
1111 | "reference": "04f62674339602def515bff4bc6901fc1d4951e8"
1112 | },
1113 | "dist": {
1114 | "type": "zip",
1115 | "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/04f62674339602def515bff4bc6901fc1d4951e8",
1116 | "reference": "04f62674339602def515bff4bc6901fc1d4951e8",
1117 | "shasum": ""
1118 | },
1119 | "require": {
1120 | "php": ">=5.3.3"
1121 | },
1122 | "type": "library",
1123 | "extra": {
1124 | "branch-alias": {
1125 | "dev-master": "1.6-dev"
1126 | }
1127 | },
1128 | "autoload": {
1129 | "psr-4": {
1130 | "Symfony\\Polyfill\\Apcu\\": ""
1131 | },
1132 | "files": [
1133 | "bootstrap.php"
1134 | ]
1135 | },
1136 | "notification-url": "https://packagist.org/downloads/",
1137 | "license": [
1138 | "MIT"
1139 | ],
1140 | "authors": [
1141 | {
1142 | "name": "Nicolas Grekas",
1143 | "email": "p@tchwork.com"
1144 | },
1145 | {
1146 | "name": "Symfony Community",
1147 | "homepage": "https://symfony.com/contributors"
1148 | }
1149 | ],
1150 | "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions",
1151 | "homepage": "https://symfony.com",
1152 | "keywords": [
1153 | "apcu",
1154 | "compatibility",
1155 | "polyfill",
1156 | "portable",
1157 | "shim"
1158 | ],
1159 | "time": "2017-10-11T12:05:26+00:00"
1160 | },
1161 | {
1162 | "name": "symfony/polyfill-mbstring",
1163 | "version": "v1.6.0",
1164 | "source": {
1165 | "type": "git",
1166 | "url": "https://github.com/symfony/polyfill-mbstring.git",
1167 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296"
1168 | },
1169 | "dist": {
1170 | "type": "zip",
1171 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
1172 | "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
1173 | "shasum": ""
1174 | },
1175 | "require": {
1176 | "php": ">=5.3.3"
1177 | },
1178 | "suggest": {
1179 | "ext-mbstring": "For best performance"
1180 | },
1181 | "type": "library",
1182 | "extra": {
1183 | "branch-alias": {
1184 | "dev-master": "1.6-dev"
1185 | }
1186 | },
1187 | "autoload": {
1188 | "psr-4": {
1189 | "Symfony\\Polyfill\\Mbstring\\": ""
1190 | },
1191 | "files": [
1192 | "bootstrap.php"
1193 | ]
1194 | },
1195 | "notification-url": "https://packagist.org/downloads/",
1196 | "license": [
1197 | "MIT"
1198 | ],
1199 | "authors": [
1200 | {
1201 | "name": "Nicolas Grekas",
1202 | "email": "p@tchwork.com"
1203 | },
1204 | {
1205 | "name": "Symfony Community",
1206 | "homepage": "https://symfony.com/contributors"
1207 | }
1208 | ],
1209 | "description": "Symfony polyfill for the Mbstring extension",
1210 | "homepage": "https://symfony.com",
1211 | "keywords": [
1212 | "compatibility",
1213 | "mbstring",
1214 | "polyfill",
1215 | "portable",
1216 | "shim"
1217 | ],
1218 | "time": "2017-10-11T12:05:26+00:00"
1219 | },
1220 | {
1221 | "name": "symfony/polyfill-php56",
1222 | "version": "v1.6.0",
1223 | "source": {
1224 | "type": "git",
1225 | "url": "https://github.com/symfony/polyfill-php56.git",
1226 | "reference": "265fc96795492430762c29be291a371494ba3a5b"
1227 | },
1228 | "dist": {
1229 | "type": "zip",
1230 | "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/265fc96795492430762c29be291a371494ba3a5b",
1231 | "reference": "265fc96795492430762c29be291a371494ba3a5b",
1232 | "shasum": ""
1233 | },
1234 | "require": {
1235 | "php": ">=5.3.3",
1236 | "symfony/polyfill-util": "~1.0"
1237 | },
1238 | "type": "library",
1239 | "extra": {
1240 | "branch-alias": {
1241 | "dev-master": "1.6-dev"
1242 | }
1243 | },
1244 | "autoload": {
1245 | "psr-4": {
1246 | "Symfony\\Polyfill\\Php56\\": ""
1247 | },
1248 | "files": [
1249 | "bootstrap.php"
1250 | ]
1251 | },
1252 | "notification-url": "https://packagist.org/downloads/",
1253 | "license": [
1254 | "MIT"
1255 | ],
1256 | "authors": [
1257 | {
1258 | "name": "Nicolas Grekas",
1259 | "email": "p@tchwork.com"
1260 | },
1261 | {
1262 | "name": "Symfony Community",
1263 | "homepage": "https://symfony.com/contributors"
1264 | }
1265 | ],
1266 | "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
1267 | "homepage": "https://symfony.com",
1268 | "keywords": [
1269 | "compatibility",
1270 | "polyfill",
1271 | "portable",
1272 | "shim"
1273 | ],
1274 | "time": "2017-10-11T12:05:26+00:00"
1275 | },
1276 | {
1277 | "name": "symfony/polyfill-php70",
1278 | "version": "v1.6.0",
1279 | "source": {
1280 | "type": "git",
1281 | "url": "https://github.com/symfony/polyfill-php70.git",
1282 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff"
1283 | },
1284 | "dist": {
1285 | "type": "zip",
1286 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff",
1287 | "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff",
1288 | "shasum": ""
1289 | },
1290 | "require": {
1291 | "paragonie/random_compat": "~1.0|~2.0",
1292 | "php": ">=5.3.3"
1293 | },
1294 | "type": "library",
1295 | "extra": {
1296 | "branch-alias": {
1297 | "dev-master": "1.6-dev"
1298 | }
1299 | },
1300 | "autoload": {
1301 | "psr-4": {
1302 | "Symfony\\Polyfill\\Php70\\": ""
1303 | },
1304 | "files": [
1305 | "bootstrap.php"
1306 | ],
1307 | "classmap": [
1308 | "Resources/stubs"
1309 | ]
1310 | },
1311 | "notification-url": "https://packagist.org/downloads/",
1312 | "license": [
1313 | "MIT"
1314 | ],
1315 | "authors": [
1316 | {
1317 | "name": "Nicolas Grekas",
1318 | "email": "p@tchwork.com"
1319 | },
1320 | {
1321 | "name": "Symfony Community",
1322 | "homepage": "https://symfony.com/contributors"
1323 | }
1324 | ],
1325 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
1326 | "homepage": "https://symfony.com",
1327 | "keywords": [
1328 | "compatibility",
1329 | "polyfill",
1330 | "portable",
1331 | "shim"
1332 | ],
1333 | "time": "2017-10-11T12:05:26+00:00"
1334 | },
1335 | {
1336 | "name": "symfony/polyfill-util",
1337 | "version": "v1.6.0",
1338 | "source": {
1339 | "type": "git",
1340 | "url": "https://github.com/symfony/polyfill-util.git",
1341 | "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176"
1342 | },
1343 | "dist": {
1344 | "type": "zip",
1345 | "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/6e719200c8e540e0c0effeb31f96bdb344b94176",
1346 | "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176",
1347 | "shasum": ""
1348 | },
1349 | "require": {
1350 | "php": ">=5.3.3"
1351 | },
1352 | "type": "library",
1353 | "extra": {
1354 | "branch-alias": {
1355 | "dev-master": "1.6-dev"
1356 | }
1357 | },
1358 | "autoload": {
1359 | "psr-4": {
1360 | "Symfony\\Polyfill\\Util\\": ""
1361 | }
1362 | },
1363 | "notification-url": "https://packagist.org/downloads/",
1364 | "license": [
1365 | "MIT"
1366 | ],
1367 | "authors": [
1368 | {
1369 | "name": "Nicolas Grekas",
1370 | "email": "p@tchwork.com"
1371 | },
1372 | {
1373 | "name": "Symfony Community",
1374 | "homepage": "https://symfony.com/contributors"
1375 | }
1376 | ],
1377 | "description": "Symfony utilities for portability of PHP codes",
1378 | "homepage": "https://symfony.com",
1379 | "keywords": [
1380 | "compat",
1381 | "compatibility",
1382 | "polyfill",
1383 | "shim"
1384 | ],
1385 | "time": "2017-10-11T12:05:26+00:00"
1386 | },
1387 | {
1388 | "name": "symfony/property-access",
1389 | "version": "v3.3.13",
1390 | "source": {
1391 | "type": "git",
1392 | "url": "https://github.com/symfony/property-access.git",
1393 | "reference": "abfaa3b9785eb4d6e7afb231915ad6c3d17471eb"
1394 | },
1395 | "dist": {
1396 | "type": "zip",
1397 | "url": "https://api.github.com/repos/symfony/property-access/zipball/abfaa3b9785eb4d6e7afb231915ad6c3d17471eb",
1398 | "reference": "abfaa3b9785eb4d6e7afb231915ad6c3d17471eb",
1399 | "shasum": ""
1400 | },
1401 | "require": {
1402 | "php": "^5.5.9|>=7.0.8",
1403 | "symfony/inflector": "~3.1",
1404 | "symfony/polyfill-php70": "~1.0"
1405 | },
1406 | "require-dev": {
1407 | "symfony/cache": "~3.1"
1408 | },
1409 | "suggest": {
1410 | "psr/cache-implementation": "To cache access methods."
1411 | },
1412 | "type": "library",
1413 | "extra": {
1414 | "branch-alias": {
1415 | "dev-master": "3.3-dev"
1416 | }
1417 | },
1418 | "autoload": {
1419 | "psr-4": {
1420 | "Symfony\\Component\\PropertyAccess\\": ""
1421 | },
1422 | "exclude-from-classmap": [
1423 | "/Tests/"
1424 | ]
1425 | },
1426 | "notification-url": "https://packagist.org/downloads/",
1427 | "license": [
1428 | "MIT"
1429 | ],
1430 | "authors": [
1431 | {
1432 | "name": "Fabien Potencier",
1433 | "email": "fabien@symfony.com"
1434 | },
1435 | {
1436 | "name": "Symfony Community",
1437 | "homepage": "https://symfony.com/contributors"
1438 | }
1439 | ],
1440 | "description": "Symfony PropertyAccess Component",
1441 | "homepage": "https://symfony.com",
1442 | "keywords": [
1443 | "access",
1444 | "array",
1445 | "extraction",
1446 | "index",
1447 | "injection",
1448 | "object",
1449 | "property",
1450 | "property path",
1451 | "reflection"
1452 | ],
1453 | "time": "2017-11-05T15:47:03+00:00"
1454 | },
1455 | {
1456 | "name": "symfony/routing",
1457 | "version": "v3.3.13",
1458 | "source": {
1459 | "type": "git",
1460 | "url": "https://github.com/symfony/routing.git",
1461 | "reference": "cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95"
1462 | },
1463 | "dist": {
1464 | "type": "zip",
1465 | "url": "https://api.github.com/repos/symfony/routing/zipball/cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95",
1466 | "reference": "cf7fa1dfcfee2c96969bfa1c0341e5627ecb1e95",
1467 | "shasum": ""
1468 | },
1469 | "require": {
1470 | "php": "^5.5.9|>=7.0.8"
1471 | },
1472 | "conflict": {
1473 | "symfony/config": "<2.8",
1474 | "symfony/dependency-injection": "<3.3",
1475 | "symfony/yaml": "<3.3"
1476 | },
1477 | "require-dev": {
1478 | "doctrine/annotations": "~1.0",
1479 | "doctrine/common": "~2.2",
1480 | "psr/log": "~1.0",
1481 | "symfony/config": "~2.8|~3.0",
1482 | "symfony/dependency-injection": "~3.3",
1483 | "symfony/expression-language": "~2.8|~3.0",
1484 | "symfony/http-foundation": "~2.8|~3.0",
1485 | "symfony/yaml": "~3.3"
1486 | },
1487 | "suggest": {
1488 | "doctrine/annotations": "For using the annotation loader",
1489 | "symfony/config": "For using the all-in-one router or any loader",
1490 | "symfony/dependency-injection": "For loading routes from a service",
1491 | "symfony/expression-language": "For using expression matching",
1492 | "symfony/http-foundation": "For using a Symfony Request object",
1493 | "symfony/yaml": "For using the YAML loader"
1494 | },
1495 | "type": "library",
1496 | "extra": {
1497 | "branch-alias": {
1498 | "dev-master": "3.3-dev"
1499 | }
1500 | },
1501 | "autoload": {
1502 | "psr-4": {
1503 | "Symfony\\Component\\Routing\\": ""
1504 | },
1505 | "exclude-from-classmap": [
1506 | "/Tests/"
1507 | ]
1508 | },
1509 | "notification-url": "https://packagist.org/downloads/",
1510 | "license": [
1511 | "MIT"
1512 | ],
1513 | "authors": [
1514 | {
1515 | "name": "Fabien Potencier",
1516 | "email": "fabien@symfony.com"
1517 | },
1518 | {
1519 | "name": "Symfony Community",
1520 | "homepage": "https://symfony.com/contributors"
1521 | }
1522 | ],
1523 | "description": "Symfony Routing Component",
1524 | "homepage": "https://symfony.com",
1525 | "keywords": [
1526 | "router",
1527 | "routing",
1528 | "uri",
1529 | "url"
1530 | ],
1531 | "time": "2017-11-07T14:16:22+00:00"
1532 | },
1533 | {
1534 | "name": "symfony/security",
1535 | "version": "v3.3.13",
1536 | "source": {
1537 | "type": "git",
1538 | "url": "https://github.com/symfony/security.git",
1539 | "reference": "b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48"
1540 | },
1541 | "dist": {
1542 | "type": "zip",
1543 | "url": "https://api.github.com/repos/symfony/security/zipball/b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48",
1544 | "reference": "b3e577ea48e3e63c46d86dfd8f21f59ee0ff1d48",
1545 | "shasum": ""
1546 | },
1547 | "require": {
1548 | "php": "^5.5.9|>=7.0.8",
1549 | "symfony/event-dispatcher": "~2.8|~3.0",
1550 | "symfony/http-foundation": "^2.8.31|~3.3.13|~3.4-beta5",
1551 | "symfony/http-kernel": "~3.3",
1552 | "symfony/polyfill-php56": "~1.0",
1553 | "symfony/polyfill-php70": "~1.0",
1554 | "symfony/polyfill-util": "~1.0",
1555 | "symfony/property-access": "~2.8|~3.0"
1556 | },
1557 | "replace": {
1558 | "symfony/security-core": "self.version",
1559 | "symfony/security-csrf": "self.version",
1560 | "symfony/security-guard": "self.version",
1561 | "symfony/security-http": "self.version"
1562 | },
1563 | "require-dev": {
1564 | "psr/log": "~1.0",
1565 | "symfony/expression-language": "~2.8|~3.0",
1566 | "symfony/finder": "~2.8|~3.0",
1567 | "symfony/ldap": "~3.1",
1568 | "symfony/polyfill-intl-icu": "~1.0",
1569 | "symfony/routing": "~2.8|~3.0",
1570 | "symfony/validator": "^2.8.18|^3.2.5"
1571 | },
1572 | "suggest": {
1573 | "symfony/expression-language": "For using the expression voter",
1574 | "symfony/form": "",
1575 | "symfony/ldap": "For using the LDAP user and authentication providers",
1576 | "symfony/routing": "For using the HttpUtils class to create sub-requests, redirect the user, and match URLs",
1577 | "symfony/validator": "For using the user password constraint"
1578 | },
1579 | "type": "library",
1580 | "extra": {
1581 | "branch-alias": {
1582 | "dev-master": "3.3-dev"
1583 | }
1584 | },
1585 | "autoload": {
1586 | "psr-4": {
1587 | "Symfony\\Component\\Security\\": ""
1588 | },
1589 | "exclude-from-classmap": [
1590 | "/Tests/"
1591 | ]
1592 | },
1593 | "notification-url": "https://packagist.org/downloads/",
1594 | "license": [
1595 | "MIT"
1596 | ],
1597 | "authors": [
1598 | {
1599 | "name": "Fabien Potencier",
1600 | "email": "fabien@symfony.com"
1601 | },
1602 | {
1603 | "name": "Symfony Community",
1604 | "homepage": "https://symfony.com/contributors"
1605 | }
1606 | ],
1607 | "description": "Symfony Security Component",
1608 | "homepage": "https://symfony.com",
1609 | "time": "2017-11-16T16:14:18+00:00"
1610 | },
1611 | {
1612 | "name": "symfony/security-bundle",
1613 | "version": "v3.3.13",
1614 | "source": {
1615 | "type": "git",
1616 | "url": "https://github.com/symfony/security-bundle.git",
1617 | "reference": "8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38"
1618 | },
1619 | "dist": {
1620 | "type": "zip",
1621 | "url": "https://api.github.com/repos/symfony/security-bundle/zipball/8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38",
1622 | "reference": "8c1e84cc86fd71e74e61a9c3dbb6227fa7fcfb38",
1623 | "shasum": ""
1624 | },
1625 | "require": {
1626 | "ext-xml": "*",
1627 | "php": "^5.5.9|>=7.0.8",
1628 | "symfony/dependency-injection": "~3.3",
1629 | "symfony/http-kernel": "~3.3",
1630 | "symfony/polyfill-php70": "~1.0",
1631 | "symfony/security": "~3.3.13|~3.4-beta5"
1632 | },
1633 | "conflict": {
1634 | "symfony/var-dumper": "<3.3"
1635 | },
1636 | "require-dev": {
1637 | "doctrine/doctrine-bundle": "~1.4",
1638 | "symfony/asset": "~2.8|~3.0",
1639 | "symfony/browser-kit": "~2.8|~3.0",
1640 | "symfony/console": "~3.2",
1641 | "symfony/css-selector": "~2.8|~3.0",
1642 | "symfony/dom-crawler": "~2.8|~3.0",
1643 | "symfony/expression-language": "~2.8|~3.0",
1644 | "symfony/form": "^2.8.18|^3.2.5",
1645 | "symfony/framework-bundle": "^3.2.8",
1646 | "symfony/http-foundation": "~2.8|~3.0",
1647 | "symfony/process": "~2.8|~3.0",
1648 | "symfony/security-acl": "~2.8|~3.0",
1649 | "symfony/translation": "~2.8|~3.0",
1650 | "symfony/twig-bridge": "~2.8|~3.0",
1651 | "symfony/twig-bundle": "~2.8|~3.0",
1652 | "symfony/validator": "^3.2.5",
1653 | "symfony/var-dumper": "~3.3",
1654 | "symfony/yaml": "~2.8|~3.0",
1655 | "twig/twig": "~1.34|~2.4"
1656 | },
1657 | "suggest": {
1658 | "symfony/security-acl": "For using the ACL functionality of this bundle"
1659 | },
1660 | "type": "symfony-bundle",
1661 | "extra": {
1662 | "branch-alias": {
1663 | "dev-master": "3.3-dev"
1664 | }
1665 | },
1666 | "autoload": {
1667 | "psr-4": {
1668 | "Symfony\\Bundle\\SecurityBundle\\": ""
1669 | },
1670 | "exclude-from-classmap": [
1671 | "/Tests/"
1672 | ]
1673 | },
1674 | "notification-url": "https://packagist.org/downloads/",
1675 | "license": [
1676 | "MIT"
1677 | ],
1678 | "authors": [
1679 | {
1680 | "name": "Fabien Potencier",
1681 | "email": "fabien@symfony.com"
1682 | },
1683 | {
1684 | "name": "Symfony Community",
1685 | "homepage": "https://symfony.com/contributors"
1686 | }
1687 | ],
1688 | "description": "Symfony SecurityBundle",
1689 | "homepage": "https://symfony.com",
1690 | "time": "2017-11-16T16:56:40+00:00"
1691 | },
1692 | {
1693 | "name": "symfony/stopwatch",
1694 | "version": "v3.3.13",
1695 | "source": {
1696 | "type": "git",
1697 | "url": "https://github.com/symfony/stopwatch.git",
1698 | "reference": "1e93c3139ef6c799831fe03efd0fb1c7aecb3365"
1699 | },
1700 | "dist": {
1701 | "type": "zip",
1702 | "url": "https://api.github.com/repos/symfony/stopwatch/zipball/1e93c3139ef6c799831fe03efd0fb1c7aecb3365",
1703 | "reference": "1e93c3139ef6c799831fe03efd0fb1c7aecb3365",
1704 | "shasum": ""
1705 | },
1706 | "require": {
1707 | "php": "^5.5.9|>=7.0.8"
1708 | },
1709 | "type": "library",
1710 | "extra": {
1711 | "branch-alias": {
1712 | "dev-master": "3.3-dev"
1713 | }
1714 | },
1715 | "autoload": {
1716 | "psr-4": {
1717 | "Symfony\\Component\\Stopwatch\\": ""
1718 | },
1719 | "exclude-from-classmap": [
1720 | "/Tests/"
1721 | ]
1722 | },
1723 | "notification-url": "https://packagist.org/downloads/",
1724 | "license": [
1725 | "MIT"
1726 | ],
1727 | "authors": [
1728 | {
1729 | "name": "Fabien Potencier",
1730 | "email": "fabien@symfony.com"
1731 | },
1732 | {
1733 | "name": "Symfony Community",
1734 | "homepage": "https://symfony.com/contributors"
1735 | }
1736 | ],
1737 | "description": "Symfony Stopwatch Component",
1738 | "homepage": "https://symfony.com",
1739 | "time": "2017-11-10T19:02:53+00:00"
1740 | },
1741 | {
1742 | "name": "zendframework/zend-ldap",
1743 | "version": "2.8.0",
1744 | "source": {
1745 | "type": "git",
1746 | "url": "https://github.com/zendframework/zend-ldap.git",
1747 | "reference": "a9284a7440e17ce0ba697670bb4db1baf2340acd"
1748 | },
1749 | "dist": {
1750 | "type": "zip",
1751 | "url": "https://api.github.com/repos/zendframework/zend-ldap/zipball/a9284a7440e17ce0ba697670bb4db1baf2340acd",
1752 | "reference": "a9284a7440e17ce0ba697670bb4db1baf2340acd",
1753 | "shasum": ""
1754 | },
1755 | "require": {
1756 | "ext-ldap": "*",
1757 | "php": "^5.5 || ^7.0"
1758 | },
1759 | "require-dev": {
1760 | "php-mock/php-mock-phpunit": "~0.3",
1761 | "phpunit/phpunit": "^4.6",
1762 | "zendframework/zend-coding-standard": "~1.0.0",
1763 | "zendframework/zend-config": "^2.5",
1764 | "zendframework/zend-eventmanager": "^2.6.3 || ^3.0.1",
1765 | "zendframework/zend-stdlib": "^2.7 || ^3.0"
1766 | },
1767 | "suggest": {
1768 | "zendframework/zend-eventmanager": "Zend\\EventManager component"
1769 | },
1770 | "type": "library",
1771 | "extra": {
1772 | "branch-alias": {
1773 | "dev-master": "2.8-dev",
1774 | "dev-develop": "2.9-dev"
1775 | }
1776 | },
1777 | "autoload": {
1778 | "psr-4": {
1779 | "Zend\\Ldap\\": "src/"
1780 | }
1781 | },
1782 | "notification-url": "https://packagist.org/downloads/",
1783 | "license": [
1784 | "BSD-3-Clause"
1785 | ],
1786 | "description": "provides support for LDAP operations including but not limited to binding, searching and modifying entries in an LDAP directory",
1787 | "homepage": "https://github.com/zendframework/zend-ldap",
1788 | "keywords": [
1789 | "ldap",
1790 | "zf2"
1791 | ],
1792 | "time": "2017-03-06T20:39:12+00:00"
1793 | }
1794 | ],
1795 | "packages-dev": [
1796 | {
1797 | "name": "composer/semver",
1798 | "version": "1.4.2",
1799 | "source": {
1800 | "type": "git",
1801 | "url": "https://github.com/composer/semver.git",
1802 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573"
1803 | },
1804 | "dist": {
1805 | "type": "zip",
1806 | "url": "https://api.github.com/repos/composer/semver/zipball/c7cb9a2095a074d131b65a8a0cd294479d785573",
1807 | "reference": "c7cb9a2095a074d131b65a8a0cd294479d785573",
1808 | "shasum": ""
1809 | },
1810 | "require": {
1811 | "php": "^5.3.2 || ^7.0"
1812 | },
1813 | "require-dev": {
1814 | "phpunit/phpunit": "^4.5 || ^5.0.5",
1815 | "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
1816 | },
1817 | "type": "library",
1818 | "extra": {
1819 | "branch-alias": {
1820 | "dev-master": "1.x-dev"
1821 | }
1822 | },
1823 | "autoload": {
1824 | "psr-4": {
1825 | "Composer\\Semver\\": "src"
1826 | }
1827 | },
1828 | "notification-url": "https://packagist.org/downloads/",
1829 | "license": [
1830 | "MIT"
1831 | ],
1832 | "authors": [
1833 | {
1834 | "name": "Nils Adermann",
1835 | "email": "naderman@naderman.de",
1836 | "homepage": "http://www.naderman.de"
1837 | },
1838 | {
1839 | "name": "Jordi Boggiano",
1840 | "email": "j.boggiano@seld.be",
1841 | "homepage": "http://seld.be"
1842 | },
1843 | {
1844 | "name": "Rob Bast",
1845 | "email": "rob.bast@gmail.com",
1846 | "homepage": "http://robbast.nl"
1847 | }
1848 | ],
1849 | "description": "Semver library that offers utilities, version constraint parsing and validation.",
1850 | "keywords": [
1851 | "semantic",
1852 | "semver",
1853 | "validation",
1854 | "versioning"
1855 | ],
1856 | "time": "2016-08-30T16:08:34+00:00"
1857 | },
1858 | {
1859 | "name": "doctrine/annotations",
1860 | "version": "v1.5.0",
1861 | "source": {
1862 | "type": "git",
1863 | "url": "https://github.com/doctrine/annotations.git",
1864 | "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f"
1865 | },
1866 | "dist": {
1867 | "type": "zip",
1868 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/5beebb01b025c94e93686b7a0ed3edae81fe3e7f",
1869 | "reference": "5beebb01b025c94e93686b7a0ed3edae81fe3e7f",
1870 | "shasum": ""
1871 | },
1872 | "require": {
1873 | "doctrine/lexer": "1.*",
1874 | "php": "^7.1"
1875 | },
1876 | "require-dev": {
1877 | "doctrine/cache": "1.*",
1878 | "phpunit/phpunit": "^5.7"
1879 | },
1880 | "type": "library",
1881 | "extra": {
1882 | "branch-alias": {
1883 | "dev-master": "1.5.x-dev"
1884 | }
1885 | },
1886 | "autoload": {
1887 | "psr-4": {
1888 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
1889 | }
1890 | },
1891 | "notification-url": "https://packagist.org/downloads/",
1892 | "license": [
1893 | "MIT"
1894 | ],
1895 | "authors": [
1896 | {
1897 | "name": "Roman Borschel",
1898 | "email": "roman@code-factory.org"
1899 | },
1900 | {
1901 | "name": "Benjamin Eberlei",
1902 | "email": "kontakt@beberlei.de"
1903 | },
1904 | {
1905 | "name": "Guilherme Blanco",
1906 | "email": "guilhermeblanco@gmail.com"
1907 | },
1908 | {
1909 | "name": "Jonathan Wage",
1910 | "email": "jonwage@gmail.com"
1911 | },
1912 | {
1913 | "name": "Johannes Schmitt",
1914 | "email": "schmittjoh@gmail.com"
1915 | }
1916 | ],
1917 | "description": "Docblock Annotations Parser",
1918 | "homepage": "http://www.doctrine-project.org",
1919 | "keywords": [
1920 | "annotations",
1921 | "docblock",
1922 | "parser"
1923 | ],
1924 | "time": "2017-07-22T10:58:02+00:00"
1925 | },
1926 | {
1927 | "name": "doctrine/instantiator",
1928 | "version": "1.1.0",
1929 | "source": {
1930 | "type": "git",
1931 | "url": "https://github.com/doctrine/instantiator.git",
1932 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
1933 | },
1934 | "dist": {
1935 | "type": "zip",
1936 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
1937 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
1938 | "shasum": ""
1939 | },
1940 | "require": {
1941 | "php": "^7.1"
1942 | },
1943 | "require-dev": {
1944 | "athletic/athletic": "~0.1.8",
1945 | "ext-pdo": "*",
1946 | "ext-phar": "*",
1947 | "phpunit/phpunit": "^6.2.3",
1948 | "squizlabs/php_codesniffer": "^3.0.2"
1949 | },
1950 | "type": "library",
1951 | "extra": {
1952 | "branch-alias": {
1953 | "dev-master": "1.2.x-dev"
1954 | }
1955 | },
1956 | "autoload": {
1957 | "psr-4": {
1958 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
1959 | }
1960 | },
1961 | "notification-url": "https://packagist.org/downloads/",
1962 | "license": [
1963 | "MIT"
1964 | ],
1965 | "authors": [
1966 | {
1967 | "name": "Marco Pivetta",
1968 | "email": "ocramius@gmail.com",
1969 | "homepage": "http://ocramius.github.com/"
1970 | }
1971 | ],
1972 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
1973 | "homepage": "https://github.com/doctrine/instantiator",
1974 | "keywords": [
1975 | "constructor",
1976 | "instantiate"
1977 | ],
1978 | "time": "2017-07-22T11:58:36+00:00"
1979 | },
1980 | {
1981 | "name": "doctrine/lexer",
1982 | "version": "v1.0.1",
1983 | "source": {
1984 | "type": "git",
1985 | "url": "https://github.com/doctrine/lexer.git",
1986 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
1987 | },
1988 | "dist": {
1989 | "type": "zip",
1990 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
1991 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
1992 | "shasum": ""
1993 | },
1994 | "require": {
1995 | "php": ">=5.3.2"
1996 | },
1997 | "type": "library",
1998 | "extra": {
1999 | "branch-alias": {
2000 | "dev-master": "1.0.x-dev"
2001 | }
2002 | },
2003 | "autoload": {
2004 | "psr-0": {
2005 | "Doctrine\\Common\\Lexer\\": "lib/"
2006 | }
2007 | },
2008 | "notification-url": "https://packagist.org/downloads/",
2009 | "license": [
2010 | "MIT"
2011 | ],
2012 | "authors": [
2013 | {
2014 | "name": "Roman Borschel",
2015 | "email": "roman@code-factory.org"
2016 | },
2017 | {
2018 | "name": "Guilherme Blanco",
2019 | "email": "guilhermeblanco@gmail.com"
2020 | },
2021 | {
2022 | "name": "Johannes Schmitt",
2023 | "email": "schmittjoh@gmail.com"
2024 | }
2025 | ],
2026 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
2027 | "homepage": "http://www.doctrine-project.org",
2028 | "keywords": [
2029 | "lexer",
2030 | "parser"
2031 | ],
2032 | "time": "2014-09-09T13:34:57+00:00"
2033 | },
2034 | {
2035 | "name": "friendsofphp/php-cs-fixer",
2036 | "version": "v2.8.3",
2037 | "source": {
2038 | "type": "git",
2039 | "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
2040 | "reference": "d9ec9b848cbf930c31dea3693d34dbd8b9c95295"
2041 | },
2042 | "dist": {
2043 | "type": "zip",
2044 | "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/d9ec9b848cbf930c31dea3693d34dbd8b9c95295",
2045 | "reference": "d9ec9b848cbf930c31dea3693d34dbd8b9c95295",
2046 | "shasum": ""
2047 | },
2048 | "require": {
2049 | "composer/semver": "^1.4",
2050 | "doctrine/annotations": "^1.2",
2051 | "ext-json": "*",
2052 | "ext-tokenizer": "*",
2053 | "gecko-packages/gecko-php-unit": "^2.0 || ^3.0",
2054 | "php": "^5.6 || >=7.0 <7.3",
2055 | "php-cs-fixer/diff": "^1.2",
2056 | "symfony/console": "^3.2 || ^4.0",
2057 | "symfony/event-dispatcher": "^3.0 || ^4.0",
2058 | "symfony/filesystem": "^3.0 || ^4.0",
2059 | "symfony/finder": "^3.0 || ^4.0",
2060 | "symfony/options-resolver": "^3.0 || ^4.0",
2061 | "symfony/polyfill-php70": "^1.0",
2062 | "symfony/polyfill-php72": "^1.4",
2063 | "symfony/process": "^3.0 || ^4.0",
2064 | "symfony/stopwatch": "^3.0 || ^4.0"
2065 | },
2066 | "conflict": {
2067 | "hhvm": "*"
2068 | },
2069 | "require-dev": {
2070 | "johnkary/phpunit-speedtrap": "^1.1 || ^2.0@dev",
2071 | "justinrainbow/json-schema": "^5.0",
2072 | "php-coveralls/php-coveralls": "^1.0.2",
2073 | "php-cs-fixer/accessible-object": "^1.0",
2074 | "phpunit/phpunit": "^5.7.23 || ^6.4.3",
2075 | "symfony/phpunit-bridge": "^3.2.2 || ^4.0"
2076 | },
2077 | "suggest": {
2078 | "ext-mbstring": "For handling non-UTF8 characters in cache signature.",
2079 | "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible."
2080 | },
2081 | "bin": [
2082 | "php-cs-fixer"
2083 | ],
2084 | "type": "application",
2085 | "autoload": {
2086 | "psr-4": {
2087 | "PhpCsFixer\\": "src/"
2088 | },
2089 | "classmap": [
2090 | "tests/Test/Assert/AssertTokensTrait.php",
2091 | "tests/Test/AbstractFixerTestCase.php",
2092 | "tests/Test/AbstractIntegrationTestCase.php",
2093 | "tests/Test/IntegrationCase.php",
2094 | "tests/Test/IntegrationCaseFactory.php"
2095 | ]
2096 | },
2097 | "notification-url": "https://packagist.org/downloads/",
2098 | "license": [
2099 | "MIT"
2100 | ],
2101 | "authors": [
2102 | {
2103 | "name": "Dariusz Rumiński",
2104 | "email": "dariusz.ruminski@gmail.com"
2105 | },
2106 | {
2107 | "name": "Fabien Potencier",
2108 | "email": "fabien@symfony.com"
2109 | }
2110 | ],
2111 | "description": "A tool to automatically fix PHP code style",
2112 | "time": "2017-11-26T20:45:16+00:00"
2113 | },
2114 | {
2115 | "name": "gecko-packages/gecko-php-unit",
2116 | "version": "v3.0",
2117 | "source": {
2118 | "type": "git",
2119 | "url": "https://github.com/GeckoPackages/GeckoPHPUnit.git",
2120 | "reference": "6a866551dffc2154c1b091bae3a7877d39c25ca3"
2121 | },
2122 | "dist": {
2123 | "type": "zip",
2124 | "url": "https://api.github.com/repos/GeckoPackages/GeckoPHPUnit/zipball/6a866551dffc2154c1b091bae3a7877d39c25ca3",
2125 | "reference": "6a866551dffc2154c1b091bae3a7877d39c25ca3",
2126 | "shasum": ""
2127 | },
2128 | "require": {
2129 | "php": "^7.0"
2130 | },
2131 | "require-dev": {
2132 | "phpunit/phpunit": "^6.0"
2133 | },
2134 | "suggest": {
2135 | "ext-dom": "When testing with xml.",
2136 | "ext-libxml": "When testing with xml.",
2137 | "phpunit/phpunit": "This is an extension for it so make sure you have it some way."
2138 | },
2139 | "type": "library",
2140 | "extra": {
2141 | "branch-alias": {
2142 | "dev-master": "3.0-dev"
2143 | }
2144 | },
2145 | "autoload": {
2146 | "psr-4": {
2147 | "GeckoPackages\\PHPUnit\\": "src/PHPUnit"
2148 | }
2149 | },
2150 | "notification-url": "https://packagist.org/downloads/",
2151 | "license": [
2152 | "MIT"
2153 | ],
2154 | "description": "Additional PHPUnit asserts and constraints.",
2155 | "homepage": "https://github.com/GeckoPackages",
2156 | "keywords": [
2157 | "extension",
2158 | "filesystem",
2159 | "phpunit"
2160 | ],
2161 | "time": "2017-08-23T07:46:41+00:00"
2162 | },
2163 | {
2164 | "name": "myclabs/deep-copy",
2165 | "version": "1.7.0",
2166 | "source": {
2167 | "type": "git",
2168 | "url": "https://github.com/myclabs/DeepCopy.git",
2169 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
2170 | },
2171 | "dist": {
2172 | "type": "zip",
2173 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
2174 | "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
2175 | "shasum": ""
2176 | },
2177 | "require": {
2178 | "php": "^5.6 || ^7.0"
2179 | },
2180 | "require-dev": {
2181 | "doctrine/collections": "^1.0",
2182 | "doctrine/common": "^2.6",
2183 | "phpunit/phpunit": "^4.1"
2184 | },
2185 | "type": "library",
2186 | "autoload": {
2187 | "psr-4": {
2188 | "DeepCopy\\": "src/DeepCopy/"
2189 | },
2190 | "files": [
2191 | "src/DeepCopy/deep_copy.php"
2192 | ]
2193 | },
2194 | "notification-url": "https://packagist.org/downloads/",
2195 | "license": [
2196 | "MIT"
2197 | ],
2198 | "description": "Create deep copies (clones) of your objects",
2199 | "keywords": [
2200 | "clone",
2201 | "copy",
2202 | "duplicate",
2203 | "object",
2204 | "object graph"
2205 | ],
2206 | "time": "2017-10-19T19:58:43+00:00"
2207 | },
2208 | {
2209 | "name": "phar-io/manifest",
2210 | "version": "1.0.1",
2211 | "source": {
2212 | "type": "git",
2213 | "url": "https://github.com/phar-io/manifest.git",
2214 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
2215 | },
2216 | "dist": {
2217 | "type": "zip",
2218 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
2219 | "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
2220 | "shasum": ""
2221 | },
2222 | "require": {
2223 | "ext-dom": "*",
2224 | "ext-phar": "*",
2225 | "phar-io/version": "^1.0.1",
2226 | "php": "^5.6 || ^7.0"
2227 | },
2228 | "type": "library",
2229 | "extra": {
2230 | "branch-alias": {
2231 | "dev-master": "1.0.x-dev"
2232 | }
2233 | },
2234 | "autoload": {
2235 | "classmap": [
2236 | "src/"
2237 | ]
2238 | },
2239 | "notification-url": "https://packagist.org/downloads/",
2240 | "license": [
2241 | "BSD-3-Clause"
2242 | ],
2243 | "authors": [
2244 | {
2245 | "name": "Arne Blankerts",
2246 | "email": "arne@blankerts.de",
2247 | "role": "Developer"
2248 | },
2249 | {
2250 | "name": "Sebastian Heuer",
2251 | "email": "sebastian@phpeople.de",
2252 | "role": "Developer"
2253 | },
2254 | {
2255 | "name": "Sebastian Bergmann",
2256 | "email": "sebastian@phpunit.de",
2257 | "role": "Developer"
2258 | }
2259 | ],
2260 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
2261 | "time": "2017-03-05T18:14:27+00:00"
2262 | },
2263 | {
2264 | "name": "phar-io/version",
2265 | "version": "1.0.1",
2266 | "source": {
2267 | "type": "git",
2268 | "url": "https://github.com/phar-io/version.git",
2269 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
2270 | },
2271 | "dist": {
2272 | "type": "zip",
2273 | "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
2274 | "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
2275 | "shasum": ""
2276 | },
2277 | "require": {
2278 | "php": "^5.6 || ^7.0"
2279 | },
2280 | "type": "library",
2281 | "autoload": {
2282 | "classmap": [
2283 | "src/"
2284 | ]
2285 | },
2286 | "notification-url": "https://packagist.org/downloads/",
2287 | "license": [
2288 | "BSD-3-Clause"
2289 | ],
2290 | "authors": [
2291 | {
2292 | "name": "Arne Blankerts",
2293 | "email": "arne@blankerts.de",
2294 | "role": "Developer"
2295 | },
2296 | {
2297 | "name": "Sebastian Heuer",
2298 | "email": "sebastian@phpeople.de",
2299 | "role": "Developer"
2300 | },
2301 | {
2302 | "name": "Sebastian Bergmann",
2303 | "email": "sebastian@phpunit.de",
2304 | "role": "Developer"
2305 | }
2306 | ],
2307 | "description": "Library for handling version information and constraints",
2308 | "time": "2017-03-05T17:38:23+00:00"
2309 | },
2310 | {
2311 | "name": "php-cs-fixer/diff",
2312 | "version": "v1.2.0",
2313 | "source": {
2314 | "type": "git",
2315 | "url": "https://github.com/PHP-CS-Fixer/diff.git",
2316 | "reference": "f0ef6133d674137e902fdf8a6f2e8e97e14a087b"
2317 | },
2318 | "dist": {
2319 | "type": "zip",
2320 | "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/f0ef6133d674137e902fdf8a6f2e8e97e14a087b",
2321 | "reference": "f0ef6133d674137e902fdf8a6f2e8e97e14a087b",
2322 | "shasum": ""
2323 | },
2324 | "require": {
2325 | "php": "^5.6 || ^7.0"
2326 | },
2327 | "require-dev": {
2328 | "phpunit/phpunit": "^4.8.35 || ^5.4.3",
2329 | "symfony/process": "^3.3"
2330 | },
2331 | "type": "library",
2332 | "autoload": {
2333 | "classmap": [
2334 | "src/"
2335 | ]
2336 | },
2337 | "notification-url": "https://packagist.org/downloads/",
2338 | "authors": [
2339 | {
2340 | "name": "Kore Nordmann",
2341 | "email": "mail@kore-nordmann.de"
2342 | },
2343 | {
2344 | "name": "Sebastian Bergmann",
2345 | "email": "sebastian@phpunit.de"
2346 | },
2347 | {
2348 | "name": "SpacePossum"
2349 | }
2350 | ],
2351 | "description": "sebastian/diff v2 backport support for PHP5.6",
2352 | "homepage": "https://github.com/PHP-CS-Fixer",
2353 | "keywords": [
2354 | "diff"
2355 | ],
2356 | "time": "2017-10-19T09:58:18+00:00"
2357 | },
2358 | {
2359 | "name": "phpdocumentor/reflection-common",
2360 | "version": "1.0.1",
2361 | "source": {
2362 | "type": "git",
2363 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
2364 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
2365 | },
2366 | "dist": {
2367 | "type": "zip",
2368 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
2369 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
2370 | "shasum": ""
2371 | },
2372 | "require": {
2373 | "php": ">=5.5"
2374 | },
2375 | "require-dev": {
2376 | "phpunit/phpunit": "^4.6"
2377 | },
2378 | "type": "library",
2379 | "extra": {
2380 | "branch-alias": {
2381 | "dev-master": "1.0.x-dev"
2382 | }
2383 | },
2384 | "autoload": {
2385 | "psr-4": {
2386 | "phpDocumentor\\Reflection\\": [
2387 | "src"
2388 | ]
2389 | }
2390 | },
2391 | "notification-url": "https://packagist.org/downloads/",
2392 | "license": [
2393 | "MIT"
2394 | ],
2395 | "authors": [
2396 | {
2397 | "name": "Jaap van Otterdijk",
2398 | "email": "opensource@ijaap.nl"
2399 | }
2400 | ],
2401 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
2402 | "homepage": "http://www.phpdoc.org",
2403 | "keywords": [
2404 | "FQSEN",
2405 | "phpDocumentor",
2406 | "phpdoc",
2407 | "reflection",
2408 | "static analysis"
2409 | ],
2410 | "time": "2017-09-11T18:02:19+00:00"
2411 | },
2412 | {
2413 | "name": "phpdocumentor/reflection-docblock",
2414 | "version": "4.2.0",
2415 | "source": {
2416 | "type": "git",
2417 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
2418 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da"
2419 | },
2420 | "dist": {
2421 | "type": "zip",
2422 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da",
2423 | "reference": "66465776cfc249844bde6d117abff1d22e06c2da",
2424 | "shasum": ""
2425 | },
2426 | "require": {
2427 | "php": "^7.0",
2428 | "phpdocumentor/reflection-common": "^1.0.0",
2429 | "phpdocumentor/type-resolver": "^0.4.0",
2430 | "webmozart/assert": "^1.0"
2431 | },
2432 | "require-dev": {
2433 | "doctrine/instantiator": "~1.0.5",
2434 | "mockery/mockery": "^1.0",
2435 | "phpunit/phpunit": "^6.4"
2436 | },
2437 | "type": "library",
2438 | "extra": {
2439 | "branch-alias": {
2440 | "dev-master": "4.x-dev"
2441 | }
2442 | },
2443 | "autoload": {
2444 | "psr-4": {
2445 | "phpDocumentor\\Reflection\\": [
2446 | "src/"
2447 | ]
2448 | }
2449 | },
2450 | "notification-url": "https://packagist.org/downloads/",
2451 | "license": [
2452 | "MIT"
2453 | ],
2454 | "authors": [
2455 | {
2456 | "name": "Mike van Riel",
2457 | "email": "me@mikevanriel.com"
2458 | }
2459 | ],
2460 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
2461 | "time": "2017-11-27T17:38:31+00:00"
2462 | },
2463 | {
2464 | "name": "phpdocumentor/type-resolver",
2465 | "version": "0.4.0",
2466 | "source": {
2467 | "type": "git",
2468 | "url": "https://github.com/phpDocumentor/TypeResolver.git",
2469 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
2470 | },
2471 | "dist": {
2472 | "type": "zip",
2473 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
2474 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
2475 | "shasum": ""
2476 | },
2477 | "require": {
2478 | "php": "^5.5 || ^7.0",
2479 | "phpdocumentor/reflection-common": "^1.0"
2480 | },
2481 | "require-dev": {
2482 | "mockery/mockery": "^0.9.4",
2483 | "phpunit/phpunit": "^5.2||^4.8.24"
2484 | },
2485 | "type": "library",
2486 | "extra": {
2487 | "branch-alias": {
2488 | "dev-master": "1.0.x-dev"
2489 | }
2490 | },
2491 | "autoload": {
2492 | "psr-4": {
2493 | "phpDocumentor\\Reflection\\": [
2494 | "src/"
2495 | ]
2496 | }
2497 | },
2498 | "notification-url": "https://packagist.org/downloads/",
2499 | "license": [
2500 | "MIT"
2501 | ],
2502 | "authors": [
2503 | {
2504 | "name": "Mike van Riel",
2505 | "email": "me@mikevanriel.com"
2506 | }
2507 | ],
2508 | "time": "2017-07-14T14:27:02+00:00"
2509 | },
2510 | {
2511 | "name": "phpspec/prophecy",
2512 | "version": "1.7.3",
2513 | "source": {
2514 | "type": "git",
2515 | "url": "https://github.com/phpspec/prophecy.git",
2516 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf"
2517 | },
2518 | "dist": {
2519 | "type": "zip",
2520 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf",
2521 | "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf",
2522 | "shasum": ""
2523 | },
2524 | "require": {
2525 | "doctrine/instantiator": "^1.0.2",
2526 | "php": "^5.3|^7.0",
2527 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
2528 | "sebastian/comparator": "^1.1|^2.0",
2529 | "sebastian/recursion-context": "^1.0|^2.0|^3.0"
2530 | },
2531 | "require-dev": {
2532 | "phpspec/phpspec": "^2.5|^3.2",
2533 | "phpunit/phpunit": "^4.8.35 || ^5.7"
2534 | },
2535 | "type": "library",
2536 | "extra": {
2537 | "branch-alias": {
2538 | "dev-master": "1.7.x-dev"
2539 | }
2540 | },
2541 | "autoload": {
2542 | "psr-0": {
2543 | "Prophecy\\": "src/"
2544 | }
2545 | },
2546 | "notification-url": "https://packagist.org/downloads/",
2547 | "license": [
2548 | "MIT"
2549 | ],
2550 | "authors": [
2551 | {
2552 | "name": "Konstantin Kudryashov",
2553 | "email": "ever.zet@gmail.com",
2554 | "homepage": "http://everzet.com"
2555 | },
2556 | {
2557 | "name": "Marcello Duarte",
2558 | "email": "marcello.duarte@gmail.com"
2559 | }
2560 | ],
2561 | "description": "Highly opinionated mocking framework for PHP 5.3+",
2562 | "homepage": "https://github.com/phpspec/prophecy",
2563 | "keywords": [
2564 | "Double",
2565 | "Dummy",
2566 | "fake",
2567 | "mock",
2568 | "spy",
2569 | "stub"
2570 | ],
2571 | "time": "2017-11-24T13:59:53+00:00"
2572 | },
2573 | {
2574 | "name": "phpunit/php-code-coverage",
2575 | "version": "5.2.4",
2576 | "source": {
2577 | "type": "git",
2578 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
2579 | "reference": "033ec97498cf530cc1be4199264cad568b19be26"
2580 | },
2581 | "dist": {
2582 | "type": "zip",
2583 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/033ec97498cf530cc1be4199264cad568b19be26",
2584 | "reference": "033ec97498cf530cc1be4199264cad568b19be26",
2585 | "shasum": ""
2586 | },
2587 | "require": {
2588 | "ext-dom": "*",
2589 | "ext-xmlwriter": "*",
2590 | "php": "^7.0",
2591 | "phpunit/php-file-iterator": "^1.4.2",
2592 | "phpunit/php-text-template": "^1.2.1",
2593 | "phpunit/php-token-stream": "^2.0.1",
2594 | "sebastian/code-unit-reverse-lookup": "^1.0.1",
2595 | "sebastian/environment": "^3.0",
2596 | "sebastian/version": "^2.0.1",
2597 | "theseer/tokenizer": "^1.1"
2598 | },
2599 | "require-dev": {
2600 | "ext-xdebug": "^2.5",
2601 | "phpunit/phpunit": "^6.0"
2602 | },
2603 | "suggest": {
2604 | "ext-xdebug": "^2.5.5"
2605 | },
2606 | "type": "library",
2607 | "extra": {
2608 | "branch-alias": {
2609 | "dev-master": "5.2.x-dev"
2610 | }
2611 | },
2612 | "autoload": {
2613 | "classmap": [
2614 | "src/"
2615 | ]
2616 | },
2617 | "notification-url": "https://packagist.org/downloads/",
2618 | "license": [
2619 | "BSD-3-Clause"
2620 | ],
2621 | "authors": [
2622 | {
2623 | "name": "Sebastian Bergmann",
2624 | "email": "sb@sebastian-bergmann.de",
2625 | "role": "lead"
2626 | }
2627 | ],
2628 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
2629 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
2630 | "keywords": [
2631 | "coverage",
2632 | "testing",
2633 | "xunit"
2634 | ],
2635 | "time": "2017-11-27T09:00:30+00:00"
2636 | },
2637 | {
2638 | "name": "phpunit/php-file-iterator",
2639 | "version": "1.4.5",
2640 | "source": {
2641 | "type": "git",
2642 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
2643 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
2644 | },
2645 | "dist": {
2646 | "type": "zip",
2647 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
2648 | "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
2649 | "shasum": ""
2650 | },
2651 | "require": {
2652 | "php": ">=5.3.3"
2653 | },
2654 | "type": "library",
2655 | "extra": {
2656 | "branch-alias": {
2657 | "dev-master": "1.4.x-dev"
2658 | }
2659 | },
2660 | "autoload": {
2661 | "classmap": [
2662 | "src/"
2663 | ]
2664 | },
2665 | "notification-url": "https://packagist.org/downloads/",
2666 | "license": [
2667 | "BSD-3-Clause"
2668 | ],
2669 | "authors": [
2670 | {
2671 | "name": "Sebastian Bergmann",
2672 | "email": "sb@sebastian-bergmann.de",
2673 | "role": "lead"
2674 | }
2675 | ],
2676 | "description": "FilterIterator implementation that filters files based on a list of suffixes.",
2677 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
2678 | "keywords": [
2679 | "filesystem",
2680 | "iterator"
2681 | ],
2682 | "time": "2017-11-27T13:52:08+00:00"
2683 | },
2684 | {
2685 | "name": "phpunit/php-text-template",
2686 | "version": "1.2.1",
2687 | "source": {
2688 | "type": "git",
2689 | "url": "https://github.com/sebastianbergmann/php-text-template.git",
2690 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
2691 | },
2692 | "dist": {
2693 | "type": "zip",
2694 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2695 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
2696 | "shasum": ""
2697 | },
2698 | "require": {
2699 | "php": ">=5.3.3"
2700 | },
2701 | "type": "library",
2702 | "autoload": {
2703 | "classmap": [
2704 | "src/"
2705 | ]
2706 | },
2707 | "notification-url": "https://packagist.org/downloads/",
2708 | "license": [
2709 | "BSD-3-Clause"
2710 | ],
2711 | "authors": [
2712 | {
2713 | "name": "Sebastian Bergmann",
2714 | "email": "sebastian@phpunit.de",
2715 | "role": "lead"
2716 | }
2717 | ],
2718 | "description": "Simple template engine.",
2719 | "homepage": "https://github.com/sebastianbergmann/php-text-template/",
2720 | "keywords": [
2721 | "template"
2722 | ],
2723 | "time": "2015-06-21T13:50:34+00:00"
2724 | },
2725 | {
2726 | "name": "phpunit/php-timer",
2727 | "version": "1.0.9",
2728 | "source": {
2729 | "type": "git",
2730 | "url": "https://github.com/sebastianbergmann/php-timer.git",
2731 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
2732 | },
2733 | "dist": {
2734 | "type": "zip",
2735 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
2736 | "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
2737 | "shasum": ""
2738 | },
2739 | "require": {
2740 | "php": "^5.3.3 || ^7.0"
2741 | },
2742 | "require-dev": {
2743 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
2744 | },
2745 | "type": "library",
2746 | "extra": {
2747 | "branch-alias": {
2748 | "dev-master": "1.0-dev"
2749 | }
2750 | },
2751 | "autoload": {
2752 | "classmap": [
2753 | "src/"
2754 | ]
2755 | },
2756 | "notification-url": "https://packagist.org/downloads/",
2757 | "license": [
2758 | "BSD-3-Clause"
2759 | ],
2760 | "authors": [
2761 | {
2762 | "name": "Sebastian Bergmann",
2763 | "email": "sb@sebastian-bergmann.de",
2764 | "role": "lead"
2765 | }
2766 | ],
2767 | "description": "Utility class for timing",
2768 | "homepage": "https://github.com/sebastianbergmann/php-timer/",
2769 | "keywords": [
2770 | "timer"
2771 | ],
2772 | "time": "2017-02-26T11:10:40+00:00"
2773 | },
2774 | {
2775 | "name": "phpunit/php-token-stream",
2776 | "version": "2.0.2",
2777 | "source": {
2778 | "type": "git",
2779 | "url": "https://github.com/sebastianbergmann/php-token-stream.git",
2780 | "reference": "791198a2c6254db10131eecfe8c06670700904db"
2781 | },
2782 | "dist": {
2783 | "type": "zip",
2784 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
2785 | "reference": "791198a2c6254db10131eecfe8c06670700904db",
2786 | "shasum": ""
2787 | },
2788 | "require": {
2789 | "ext-tokenizer": "*",
2790 | "php": "^7.0"
2791 | },
2792 | "require-dev": {
2793 | "phpunit/phpunit": "^6.2.4"
2794 | },
2795 | "type": "library",
2796 | "extra": {
2797 | "branch-alias": {
2798 | "dev-master": "2.0-dev"
2799 | }
2800 | },
2801 | "autoload": {
2802 | "classmap": [
2803 | "src/"
2804 | ]
2805 | },
2806 | "notification-url": "https://packagist.org/downloads/",
2807 | "license": [
2808 | "BSD-3-Clause"
2809 | ],
2810 | "authors": [
2811 | {
2812 | "name": "Sebastian Bergmann",
2813 | "email": "sebastian@phpunit.de"
2814 | }
2815 | ],
2816 | "description": "Wrapper around PHP's tokenizer extension.",
2817 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
2818 | "keywords": [
2819 | "tokenizer"
2820 | ],
2821 | "time": "2017-11-27T05:48:46+00:00"
2822 | },
2823 | {
2824 | "name": "phpunit/phpunit",
2825 | "version": "6.4.4",
2826 | "source": {
2827 | "type": "git",
2828 | "url": "https://github.com/sebastianbergmann/phpunit.git",
2829 | "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932"
2830 | },
2831 | "dist": {
2832 | "type": "zip",
2833 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/562f7dc75d46510a4ed5d16189ae57fbe45a9932",
2834 | "reference": "562f7dc75d46510a4ed5d16189ae57fbe45a9932",
2835 | "shasum": ""
2836 | },
2837 | "require": {
2838 | "ext-dom": "*",
2839 | "ext-json": "*",
2840 | "ext-libxml": "*",
2841 | "ext-mbstring": "*",
2842 | "ext-xml": "*",
2843 | "myclabs/deep-copy": "^1.6.1",
2844 | "phar-io/manifest": "^1.0.1",
2845 | "phar-io/version": "^1.0",
2846 | "php": "^7.0",
2847 | "phpspec/prophecy": "^1.7",
2848 | "phpunit/php-code-coverage": "^5.2.2",
2849 | "phpunit/php-file-iterator": "^1.4.2",
2850 | "phpunit/php-text-template": "^1.2.1",
2851 | "phpunit/php-timer": "^1.0.9",
2852 | "phpunit/phpunit-mock-objects": "^4.0.3",
2853 | "sebastian/comparator": "^2.0.2",
2854 | "sebastian/diff": "^2.0",
2855 | "sebastian/environment": "^3.1",
2856 | "sebastian/exporter": "^3.1",
2857 | "sebastian/global-state": "^2.0",
2858 | "sebastian/object-enumerator": "^3.0.3",
2859 | "sebastian/resource-operations": "^1.0",
2860 | "sebastian/version": "^2.0.1"
2861 | },
2862 | "conflict": {
2863 | "phpdocumentor/reflection-docblock": "3.0.2",
2864 | "phpunit/dbunit": "<3.0"
2865 | },
2866 | "require-dev": {
2867 | "ext-pdo": "*"
2868 | },
2869 | "suggest": {
2870 | "ext-xdebug": "*",
2871 | "phpunit/php-invoker": "^1.1"
2872 | },
2873 | "bin": [
2874 | "phpunit"
2875 | ],
2876 | "type": "library",
2877 | "extra": {
2878 | "branch-alias": {
2879 | "dev-master": "6.4.x-dev"
2880 | }
2881 | },
2882 | "autoload": {
2883 | "classmap": [
2884 | "src/"
2885 | ]
2886 | },
2887 | "notification-url": "https://packagist.org/downloads/",
2888 | "license": [
2889 | "BSD-3-Clause"
2890 | ],
2891 | "authors": [
2892 | {
2893 | "name": "Sebastian Bergmann",
2894 | "email": "sebastian@phpunit.de",
2895 | "role": "lead"
2896 | }
2897 | ],
2898 | "description": "The PHP Unit Testing framework.",
2899 | "homepage": "https://phpunit.de/",
2900 | "keywords": [
2901 | "phpunit",
2902 | "testing",
2903 | "xunit"
2904 | ],
2905 | "time": "2017-11-08T11:26:09+00:00"
2906 | },
2907 | {
2908 | "name": "phpunit/phpunit-mock-objects",
2909 | "version": "4.0.4",
2910 | "source": {
2911 | "type": "git",
2912 | "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
2913 | "reference": "2f789b59ab89669015ad984afa350c4ec577ade0"
2914 | },
2915 | "dist": {
2916 | "type": "zip",
2917 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0",
2918 | "reference": "2f789b59ab89669015ad984afa350c4ec577ade0",
2919 | "shasum": ""
2920 | },
2921 | "require": {
2922 | "doctrine/instantiator": "^1.0.5",
2923 | "php": "^7.0",
2924 | "phpunit/php-text-template": "^1.2.1",
2925 | "sebastian/exporter": "^3.0"
2926 | },
2927 | "conflict": {
2928 | "phpunit/phpunit": "<6.0"
2929 | },
2930 | "require-dev": {
2931 | "phpunit/phpunit": "^6.0"
2932 | },
2933 | "suggest": {
2934 | "ext-soap": "*"
2935 | },
2936 | "type": "library",
2937 | "extra": {
2938 | "branch-alias": {
2939 | "dev-master": "4.0.x-dev"
2940 | }
2941 | },
2942 | "autoload": {
2943 | "classmap": [
2944 | "src/"
2945 | ]
2946 | },
2947 | "notification-url": "https://packagist.org/downloads/",
2948 | "license": [
2949 | "BSD-3-Clause"
2950 | ],
2951 | "authors": [
2952 | {
2953 | "name": "Sebastian Bergmann",
2954 | "email": "sb@sebastian-bergmann.de",
2955 | "role": "lead"
2956 | }
2957 | ],
2958 | "description": "Mock Object library for PHPUnit",
2959 | "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
2960 | "keywords": [
2961 | "mock",
2962 | "xunit"
2963 | ],
2964 | "time": "2017-08-03T14:08:16+00:00"
2965 | },
2966 | {
2967 | "name": "sebastian/code-unit-reverse-lookup",
2968 | "version": "1.0.1",
2969 | "source": {
2970 | "type": "git",
2971 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
2972 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
2973 | },
2974 | "dist": {
2975 | "type": "zip",
2976 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
2977 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
2978 | "shasum": ""
2979 | },
2980 | "require": {
2981 | "php": "^5.6 || ^7.0"
2982 | },
2983 | "require-dev": {
2984 | "phpunit/phpunit": "^5.7 || ^6.0"
2985 | },
2986 | "type": "library",
2987 | "extra": {
2988 | "branch-alias": {
2989 | "dev-master": "1.0.x-dev"
2990 | }
2991 | },
2992 | "autoload": {
2993 | "classmap": [
2994 | "src/"
2995 | ]
2996 | },
2997 | "notification-url": "https://packagist.org/downloads/",
2998 | "license": [
2999 | "BSD-3-Clause"
3000 | ],
3001 | "authors": [
3002 | {
3003 | "name": "Sebastian Bergmann",
3004 | "email": "sebastian@phpunit.de"
3005 | }
3006 | ],
3007 | "description": "Looks up which function or method a line of code belongs to",
3008 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
3009 | "time": "2017-03-04T06:30:41+00:00"
3010 | },
3011 | {
3012 | "name": "sebastian/comparator",
3013 | "version": "2.1.0",
3014 | "source": {
3015 | "type": "git",
3016 | "url": "https://github.com/sebastianbergmann/comparator.git",
3017 | "reference": "1174d9018191e93cb9d719edec01257fc05f8158"
3018 | },
3019 | "dist": {
3020 | "type": "zip",
3021 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1174d9018191e93cb9d719edec01257fc05f8158",
3022 | "reference": "1174d9018191e93cb9d719edec01257fc05f8158",
3023 | "shasum": ""
3024 | },
3025 | "require": {
3026 | "php": "^7.0",
3027 | "sebastian/diff": "^2.0",
3028 | "sebastian/exporter": "^3.1"
3029 | },
3030 | "require-dev": {
3031 | "phpunit/phpunit": "^6.4"
3032 | },
3033 | "type": "library",
3034 | "extra": {
3035 | "branch-alias": {
3036 | "dev-master": "2.1.x-dev"
3037 | }
3038 | },
3039 | "autoload": {
3040 | "classmap": [
3041 | "src/"
3042 | ]
3043 | },
3044 | "notification-url": "https://packagist.org/downloads/",
3045 | "license": [
3046 | "BSD-3-Clause"
3047 | ],
3048 | "authors": [
3049 | {
3050 | "name": "Jeff Welch",
3051 | "email": "whatthejeff@gmail.com"
3052 | },
3053 | {
3054 | "name": "Volker Dusch",
3055 | "email": "github@wallbash.com"
3056 | },
3057 | {
3058 | "name": "Bernhard Schussek",
3059 | "email": "bschussek@2bepublished.at"
3060 | },
3061 | {
3062 | "name": "Sebastian Bergmann",
3063 | "email": "sebastian@phpunit.de"
3064 | }
3065 | ],
3066 | "description": "Provides the functionality to compare PHP values for equality",
3067 | "homepage": "https://github.com/sebastianbergmann/comparator",
3068 | "keywords": [
3069 | "comparator",
3070 | "compare",
3071 | "equality"
3072 | ],
3073 | "time": "2017-11-03T07:16:52+00:00"
3074 | },
3075 | {
3076 | "name": "sebastian/diff",
3077 | "version": "2.0.1",
3078 | "source": {
3079 | "type": "git",
3080 | "url": "https://github.com/sebastianbergmann/diff.git",
3081 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd"
3082 | },
3083 | "dist": {
3084 | "type": "zip",
3085 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
3086 | "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
3087 | "shasum": ""
3088 | },
3089 | "require": {
3090 | "php": "^7.0"
3091 | },
3092 | "require-dev": {
3093 | "phpunit/phpunit": "^6.2"
3094 | },
3095 | "type": "library",
3096 | "extra": {
3097 | "branch-alias": {
3098 | "dev-master": "2.0-dev"
3099 | }
3100 | },
3101 | "autoload": {
3102 | "classmap": [
3103 | "src/"
3104 | ]
3105 | },
3106 | "notification-url": "https://packagist.org/downloads/",
3107 | "license": [
3108 | "BSD-3-Clause"
3109 | ],
3110 | "authors": [
3111 | {
3112 | "name": "Kore Nordmann",
3113 | "email": "mail@kore-nordmann.de"
3114 | },
3115 | {
3116 | "name": "Sebastian Bergmann",
3117 | "email": "sebastian@phpunit.de"
3118 | }
3119 | ],
3120 | "description": "Diff implementation",
3121 | "homepage": "https://github.com/sebastianbergmann/diff",
3122 | "keywords": [
3123 | "diff"
3124 | ],
3125 | "time": "2017-08-03T08:09:46+00:00"
3126 | },
3127 | {
3128 | "name": "sebastian/environment",
3129 | "version": "3.1.0",
3130 | "source": {
3131 | "type": "git",
3132 | "url": "https://github.com/sebastianbergmann/environment.git",
3133 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
3134 | },
3135 | "dist": {
3136 | "type": "zip",
3137 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
3138 | "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
3139 | "shasum": ""
3140 | },
3141 | "require": {
3142 | "php": "^7.0"
3143 | },
3144 | "require-dev": {
3145 | "phpunit/phpunit": "^6.1"
3146 | },
3147 | "type": "library",
3148 | "extra": {
3149 | "branch-alias": {
3150 | "dev-master": "3.1.x-dev"
3151 | }
3152 | },
3153 | "autoload": {
3154 | "classmap": [
3155 | "src/"
3156 | ]
3157 | },
3158 | "notification-url": "https://packagist.org/downloads/",
3159 | "license": [
3160 | "BSD-3-Clause"
3161 | ],
3162 | "authors": [
3163 | {
3164 | "name": "Sebastian Bergmann",
3165 | "email": "sebastian@phpunit.de"
3166 | }
3167 | ],
3168 | "description": "Provides functionality to handle HHVM/PHP environments",
3169 | "homepage": "http://www.github.com/sebastianbergmann/environment",
3170 | "keywords": [
3171 | "Xdebug",
3172 | "environment",
3173 | "hhvm"
3174 | ],
3175 | "time": "2017-07-01T08:51:00+00:00"
3176 | },
3177 | {
3178 | "name": "sebastian/exporter",
3179 | "version": "3.1.0",
3180 | "source": {
3181 | "type": "git",
3182 | "url": "https://github.com/sebastianbergmann/exporter.git",
3183 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
3184 | },
3185 | "dist": {
3186 | "type": "zip",
3187 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937",
3188 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
3189 | "shasum": ""
3190 | },
3191 | "require": {
3192 | "php": "^7.0",
3193 | "sebastian/recursion-context": "^3.0"
3194 | },
3195 | "require-dev": {
3196 | "ext-mbstring": "*",
3197 | "phpunit/phpunit": "^6.0"
3198 | },
3199 | "type": "library",
3200 | "extra": {
3201 | "branch-alias": {
3202 | "dev-master": "3.1.x-dev"
3203 | }
3204 | },
3205 | "autoload": {
3206 | "classmap": [
3207 | "src/"
3208 | ]
3209 | },
3210 | "notification-url": "https://packagist.org/downloads/",
3211 | "license": [
3212 | "BSD-3-Clause"
3213 | ],
3214 | "authors": [
3215 | {
3216 | "name": "Jeff Welch",
3217 | "email": "whatthejeff@gmail.com"
3218 | },
3219 | {
3220 | "name": "Volker Dusch",
3221 | "email": "github@wallbash.com"
3222 | },
3223 | {
3224 | "name": "Bernhard Schussek",
3225 | "email": "bschussek@2bepublished.at"
3226 | },
3227 | {
3228 | "name": "Sebastian Bergmann",
3229 | "email": "sebastian@phpunit.de"
3230 | },
3231 | {
3232 | "name": "Adam Harvey",
3233 | "email": "aharvey@php.net"
3234 | }
3235 | ],
3236 | "description": "Provides the functionality to export PHP variables for visualization",
3237 | "homepage": "http://www.github.com/sebastianbergmann/exporter",
3238 | "keywords": [
3239 | "export",
3240 | "exporter"
3241 | ],
3242 | "time": "2017-04-03T13:19:02+00:00"
3243 | },
3244 | {
3245 | "name": "sebastian/global-state",
3246 | "version": "2.0.0",
3247 | "source": {
3248 | "type": "git",
3249 | "url": "https://github.com/sebastianbergmann/global-state.git",
3250 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
3251 | },
3252 | "dist": {
3253 | "type": "zip",
3254 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
3255 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
3256 | "shasum": ""
3257 | },
3258 | "require": {
3259 | "php": "^7.0"
3260 | },
3261 | "require-dev": {
3262 | "phpunit/phpunit": "^6.0"
3263 | },
3264 | "suggest": {
3265 | "ext-uopz": "*"
3266 | },
3267 | "type": "library",
3268 | "extra": {
3269 | "branch-alias": {
3270 | "dev-master": "2.0-dev"
3271 | }
3272 | },
3273 | "autoload": {
3274 | "classmap": [
3275 | "src/"
3276 | ]
3277 | },
3278 | "notification-url": "https://packagist.org/downloads/",
3279 | "license": [
3280 | "BSD-3-Clause"
3281 | ],
3282 | "authors": [
3283 | {
3284 | "name": "Sebastian Bergmann",
3285 | "email": "sebastian@phpunit.de"
3286 | }
3287 | ],
3288 | "description": "Snapshotting of global state",
3289 | "homepage": "http://www.github.com/sebastianbergmann/global-state",
3290 | "keywords": [
3291 | "global state"
3292 | ],
3293 | "time": "2017-04-27T15:39:26+00:00"
3294 | },
3295 | {
3296 | "name": "sebastian/object-enumerator",
3297 | "version": "3.0.3",
3298 | "source": {
3299 | "type": "git",
3300 | "url": "https://github.com/sebastianbergmann/object-enumerator.git",
3301 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
3302 | },
3303 | "dist": {
3304 | "type": "zip",
3305 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
3306 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
3307 | "shasum": ""
3308 | },
3309 | "require": {
3310 | "php": "^7.0",
3311 | "sebastian/object-reflector": "^1.1.1",
3312 | "sebastian/recursion-context": "^3.0"
3313 | },
3314 | "require-dev": {
3315 | "phpunit/phpunit": "^6.0"
3316 | },
3317 | "type": "library",
3318 | "extra": {
3319 | "branch-alias": {
3320 | "dev-master": "3.0.x-dev"
3321 | }
3322 | },
3323 | "autoload": {
3324 | "classmap": [
3325 | "src/"
3326 | ]
3327 | },
3328 | "notification-url": "https://packagist.org/downloads/",
3329 | "license": [
3330 | "BSD-3-Clause"
3331 | ],
3332 | "authors": [
3333 | {
3334 | "name": "Sebastian Bergmann",
3335 | "email": "sebastian@phpunit.de"
3336 | }
3337 | ],
3338 | "description": "Traverses array structures and object graphs to enumerate all referenced objects",
3339 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
3340 | "time": "2017-08-03T12:35:26+00:00"
3341 | },
3342 | {
3343 | "name": "sebastian/object-reflector",
3344 | "version": "1.1.1",
3345 | "source": {
3346 | "type": "git",
3347 | "url": "https://github.com/sebastianbergmann/object-reflector.git",
3348 | "reference": "773f97c67f28de00d397be301821b06708fca0be"
3349 | },
3350 | "dist": {
3351 | "type": "zip",
3352 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
3353 | "reference": "773f97c67f28de00d397be301821b06708fca0be",
3354 | "shasum": ""
3355 | },
3356 | "require": {
3357 | "php": "^7.0"
3358 | },
3359 | "require-dev": {
3360 | "phpunit/phpunit": "^6.0"
3361 | },
3362 | "type": "library",
3363 | "extra": {
3364 | "branch-alias": {
3365 | "dev-master": "1.1-dev"
3366 | }
3367 | },
3368 | "autoload": {
3369 | "classmap": [
3370 | "src/"
3371 | ]
3372 | },
3373 | "notification-url": "https://packagist.org/downloads/",
3374 | "license": [
3375 | "BSD-3-Clause"
3376 | ],
3377 | "authors": [
3378 | {
3379 | "name": "Sebastian Bergmann",
3380 | "email": "sebastian@phpunit.de"
3381 | }
3382 | ],
3383 | "description": "Allows reflection of object attributes, including inherited and non-public ones",
3384 | "homepage": "https://github.com/sebastianbergmann/object-reflector/",
3385 | "time": "2017-03-29T09:07:27+00:00"
3386 | },
3387 | {
3388 | "name": "sebastian/recursion-context",
3389 | "version": "3.0.0",
3390 | "source": {
3391 | "type": "git",
3392 | "url": "https://github.com/sebastianbergmann/recursion-context.git",
3393 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
3394 | },
3395 | "dist": {
3396 | "type": "zip",
3397 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
3398 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
3399 | "shasum": ""
3400 | },
3401 | "require": {
3402 | "php": "^7.0"
3403 | },
3404 | "require-dev": {
3405 | "phpunit/phpunit": "^6.0"
3406 | },
3407 | "type": "library",
3408 | "extra": {
3409 | "branch-alias": {
3410 | "dev-master": "3.0.x-dev"
3411 | }
3412 | },
3413 | "autoload": {
3414 | "classmap": [
3415 | "src/"
3416 | ]
3417 | },
3418 | "notification-url": "https://packagist.org/downloads/",
3419 | "license": [
3420 | "BSD-3-Clause"
3421 | ],
3422 | "authors": [
3423 | {
3424 | "name": "Jeff Welch",
3425 | "email": "whatthejeff@gmail.com"
3426 | },
3427 | {
3428 | "name": "Sebastian Bergmann",
3429 | "email": "sebastian@phpunit.de"
3430 | },
3431 | {
3432 | "name": "Adam Harvey",
3433 | "email": "aharvey@php.net"
3434 | }
3435 | ],
3436 | "description": "Provides functionality to recursively process PHP variables",
3437 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
3438 | "time": "2017-03-03T06:23:57+00:00"
3439 | },
3440 | {
3441 | "name": "sebastian/resource-operations",
3442 | "version": "1.0.0",
3443 | "source": {
3444 | "type": "git",
3445 | "url": "https://github.com/sebastianbergmann/resource-operations.git",
3446 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
3447 | },
3448 | "dist": {
3449 | "type": "zip",
3450 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
3451 | "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
3452 | "shasum": ""
3453 | },
3454 | "require": {
3455 | "php": ">=5.6.0"
3456 | },
3457 | "type": "library",
3458 | "extra": {
3459 | "branch-alias": {
3460 | "dev-master": "1.0.x-dev"
3461 | }
3462 | },
3463 | "autoload": {
3464 | "classmap": [
3465 | "src/"
3466 | ]
3467 | },
3468 | "notification-url": "https://packagist.org/downloads/",
3469 | "license": [
3470 | "BSD-3-Clause"
3471 | ],
3472 | "authors": [
3473 | {
3474 | "name": "Sebastian Bergmann",
3475 | "email": "sebastian@phpunit.de"
3476 | }
3477 | ],
3478 | "description": "Provides a list of PHP built-in functions that operate on resources",
3479 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
3480 | "time": "2015-07-28T20:34:47+00:00"
3481 | },
3482 | {
3483 | "name": "sebastian/version",
3484 | "version": "2.0.1",
3485 | "source": {
3486 | "type": "git",
3487 | "url": "https://github.com/sebastianbergmann/version.git",
3488 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
3489 | },
3490 | "dist": {
3491 | "type": "zip",
3492 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
3493 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
3494 | "shasum": ""
3495 | },
3496 | "require": {
3497 | "php": ">=5.6"
3498 | },
3499 | "type": "library",
3500 | "extra": {
3501 | "branch-alias": {
3502 | "dev-master": "2.0.x-dev"
3503 | }
3504 | },
3505 | "autoload": {
3506 | "classmap": [
3507 | "src/"
3508 | ]
3509 | },
3510 | "notification-url": "https://packagist.org/downloads/",
3511 | "license": [
3512 | "BSD-3-Clause"
3513 | ],
3514 | "authors": [
3515 | {
3516 | "name": "Sebastian Bergmann",
3517 | "email": "sebastian@phpunit.de",
3518 | "role": "lead"
3519 | }
3520 | ],
3521 | "description": "Library that helps with managing the version number of Git-hosted PHP projects",
3522 | "homepage": "https://github.com/sebastianbergmann/version",
3523 | "time": "2016-10-03T07:35:21+00:00"
3524 | },
3525 | {
3526 | "name": "symfony/console",
3527 | "version": "v3.3.13",
3528 | "source": {
3529 | "type": "git",
3530 | "url": "https://github.com/symfony/console.git",
3531 | "reference": "63cd7960a0a522c3537f6326706d7f3b8de65805"
3532 | },
3533 | "dist": {
3534 | "type": "zip",
3535 | "url": "https://api.github.com/repos/symfony/console/zipball/63cd7960a0a522c3537f6326706d7f3b8de65805",
3536 | "reference": "63cd7960a0a522c3537f6326706d7f3b8de65805",
3537 | "shasum": ""
3538 | },
3539 | "require": {
3540 | "php": "^5.5.9|>=7.0.8",
3541 | "symfony/debug": "~2.8|~3.0",
3542 | "symfony/polyfill-mbstring": "~1.0"
3543 | },
3544 | "conflict": {
3545 | "symfony/dependency-injection": "<3.3"
3546 | },
3547 | "require-dev": {
3548 | "psr/log": "~1.0",
3549 | "symfony/config": "~3.3",
3550 | "symfony/dependency-injection": "~3.3",
3551 | "symfony/event-dispatcher": "~2.8|~3.0",
3552 | "symfony/filesystem": "~2.8|~3.0",
3553 | "symfony/process": "~2.8|~3.0"
3554 | },
3555 | "suggest": {
3556 | "psr/log": "For using the console logger",
3557 | "symfony/event-dispatcher": "",
3558 | "symfony/filesystem": "",
3559 | "symfony/process": ""
3560 | },
3561 | "type": "library",
3562 | "extra": {
3563 | "branch-alias": {
3564 | "dev-master": "3.3-dev"
3565 | }
3566 | },
3567 | "autoload": {
3568 | "psr-4": {
3569 | "Symfony\\Component\\Console\\": ""
3570 | },
3571 | "exclude-from-classmap": [
3572 | "/Tests/"
3573 | ]
3574 | },
3575 | "notification-url": "https://packagist.org/downloads/",
3576 | "license": [
3577 | "MIT"
3578 | ],
3579 | "authors": [
3580 | {
3581 | "name": "Fabien Potencier",
3582 | "email": "fabien@symfony.com"
3583 | },
3584 | {
3585 | "name": "Symfony Community",
3586 | "homepage": "https://symfony.com/contributors"
3587 | }
3588 | ],
3589 | "description": "Symfony Console Component",
3590 | "homepage": "https://symfony.com",
3591 | "time": "2017-11-16T15:24:32+00:00"
3592 | },
3593 | {
3594 | "name": "symfony/options-resolver",
3595 | "version": "v3.3.13",
3596 | "source": {
3597 | "type": "git",
3598 | "url": "https://github.com/symfony/options-resolver.git",
3599 | "reference": "623d9c210a137205f7e6e98166105625402cbb2f"
3600 | },
3601 | "dist": {
3602 | "type": "zip",
3603 | "url": "https://api.github.com/repos/symfony/options-resolver/zipball/623d9c210a137205f7e6e98166105625402cbb2f",
3604 | "reference": "623d9c210a137205f7e6e98166105625402cbb2f",
3605 | "shasum": ""
3606 | },
3607 | "require": {
3608 | "php": "^5.5.9|>=7.0.8"
3609 | },
3610 | "type": "library",
3611 | "extra": {
3612 | "branch-alias": {
3613 | "dev-master": "3.3-dev"
3614 | }
3615 | },
3616 | "autoload": {
3617 | "psr-4": {
3618 | "Symfony\\Component\\OptionsResolver\\": ""
3619 | },
3620 | "exclude-from-classmap": [
3621 | "/Tests/"
3622 | ]
3623 | },
3624 | "notification-url": "https://packagist.org/downloads/",
3625 | "license": [
3626 | "MIT"
3627 | ],
3628 | "authors": [
3629 | {
3630 | "name": "Fabien Potencier",
3631 | "email": "fabien@symfony.com"
3632 | },
3633 | {
3634 | "name": "Symfony Community",
3635 | "homepage": "https://symfony.com/contributors"
3636 | }
3637 | ],
3638 | "description": "Symfony OptionsResolver Component",
3639 | "homepage": "https://symfony.com",
3640 | "keywords": [
3641 | "config",
3642 | "configuration",
3643 | "options"
3644 | ],
3645 | "time": "2017-11-05T15:47:03+00:00"
3646 | },
3647 | {
3648 | "name": "symfony/polyfill-php72",
3649 | "version": "v1.6.0",
3650 | "source": {
3651 | "type": "git",
3652 | "url": "https://github.com/symfony/polyfill-php72.git",
3653 | "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254"
3654 | },
3655 | "dist": {
3656 | "type": "zip",
3657 | "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/6de4f4884b97abbbed9f0a84a95ff2ff77254254",
3658 | "reference": "6de4f4884b97abbbed9f0a84a95ff2ff77254254",
3659 | "shasum": ""
3660 | },
3661 | "require": {
3662 | "php": ">=5.3.3"
3663 | },
3664 | "type": "library",
3665 | "extra": {
3666 | "branch-alias": {
3667 | "dev-master": "1.6-dev"
3668 | }
3669 | },
3670 | "autoload": {
3671 | "psr-4": {
3672 | "Symfony\\Polyfill\\Php72\\": ""
3673 | },
3674 | "files": [
3675 | "bootstrap.php"
3676 | ]
3677 | },
3678 | "notification-url": "https://packagist.org/downloads/",
3679 | "license": [
3680 | "MIT"
3681 | ],
3682 | "authors": [
3683 | {
3684 | "name": "Nicolas Grekas",
3685 | "email": "p@tchwork.com"
3686 | },
3687 | {
3688 | "name": "Symfony Community",
3689 | "homepage": "https://symfony.com/contributors"
3690 | }
3691 | ],
3692 | "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
3693 | "homepage": "https://symfony.com",
3694 | "keywords": [
3695 | "compatibility",
3696 | "polyfill",
3697 | "portable",
3698 | "shim"
3699 | ],
3700 | "time": "2017-10-11T12:05:26+00:00"
3701 | },
3702 | {
3703 | "name": "symfony/process",
3704 | "version": "v3.3.13",
3705 | "source": {
3706 | "type": "git",
3707 | "url": "https://github.com/symfony/process.git",
3708 | "reference": "a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d"
3709 | },
3710 | "dist": {
3711 | "type": "zip",
3712 | "url": "https://api.github.com/repos/symfony/process/zipball/a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d",
3713 | "reference": "a56a3989fb762d7b19a0cf8e7693ee99a6ffb78d",
3714 | "shasum": ""
3715 | },
3716 | "require": {
3717 | "php": "^5.5.9|>=7.0.8"
3718 | },
3719 | "type": "library",
3720 | "extra": {
3721 | "branch-alias": {
3722 | "dev-master": "3.3-dev"
3723 | }
3724 | },
3725 | "autoload": {
3726 | "psr-4": {
3727 | "Symfony\\Component\\Process\\": ""
3728 | },
3729 | "exclude-from-classmap": [
3730 | "/Tests/"
3731 | ]
3732 | },
3733 | "notification-url": "https://packagist.org/downloads/",
3734 | "license": [
3735 | "MIT"
3736 | ],
3737 | "authors": [
3738 | {
3739 | "name": "Fabien Potencier",
3740 | "email": "fabien@symfony.com"
3741 | },
3742 | {
3743 | "name": "Symfony Community",
3744 | "homepage": "https://symfony.com/contributors"
3745 | }
3746 | ],
3747 | "description": "Symfony Process Component",
3748 | "homepage": "https://symfony.com",
3749 | "time": "2017-11-13T15:31:11+00:00"
3750 | },
3751 | {
3752 | "name": "theseer/tokenizer",
3753 | "version": "1.1.0",
3754 | "source": {
3755 | "type": "git",
3756 | "url": "https://github.com/theseer/tokenizer.git",
3757 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
3758 | },
3759 | "dist": {
3760 | "type": "zip",
3761 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b",
3762 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
3763 | "shasum": ""
3764 | },
3765 | "require": {
3766 | "ext-dom": "*",
3767 | "ext-tokenizer": "*",
3768 | "ext-xmlwriter": "*",
3769 | "php": "^7.0"
3770 | },
3771 | "type": "library",
3772 | "autoload": {
3773 | "classmap": [
3774 | "src/"
3775 | ]
3776 | },
3777 | "notification-url": "https://packagist.org/downloads/",
3778 | "license": [
3779 | "BSD-3-Clause"
3780 | ],
3781 | "authors": [
3782 | {
3783 | "name": "Arne Blankerts",
3784 | "email": "arne@blankerts.de",
3785 | "role": "Developer"
3786 | }
3787 | ],
3788 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
3789 | "time": "2017-04-07T12:08:54+00:00"
3790 | },
3791 | {
3792 | "name": "webmozart/assert",
3793 | "version": "1.2.0",
3794 | "source": {
3795 | "type": "git",
3796 | "url": "https://github.com/webmozart/assert.git",
3797 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
3798 | },
3799 | "dist": {
3800 | "type": "zip",
3801 | "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
3802 | "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
3803 | "shasum": ""
3804 | },
3805 | "require": {
3806 | "php": "^5.3.3 || ^7.0"
3807 | },
3808 | "require-dev": {
3809 | "phpunit/phpunit": "^4.6",
3810 | "sebastian/version": "^1.0.1"
3811 | },
3812 | "type": "library",
3813 | "extra": {
3814 | "branch-alias": {
3815 | "dev-master": "1.3-dev"
3816 | }
3817 | },
3818 | "autoload": {
3819 | "psr-4": {
3820 | "Webmozart\\Assert\\": "src/"
3821 | }
3822 | },
3823 | "notification-url": "https://packagist.org/downloads/",
3824 | "license": [
3825 | "MIT"
3826 | ],
3827 | "authors": [
3828 | {
3829 | "name": "Bernhard Schussek",
3830 | "email": "bschussek@gmail.com"
3831 | }
3832 | ],
3833 | "description": "Assertions to validate method input/output with nice error messages.",
3834 | "keywords": [
3835 | "assert",
3836 | "check",
3837 | "validate"
3838 | ],
3839 | "time": "2016-11-23T20:04:58+00:00"
3840 | }
3841 | ],
3842 | "aliases": [],
3843 | "minimum-stability": "stable",
3844 | "stability-flags": [],
3845 | "prefer-stable": false,
3846 | "prefer-lowest": false,
3847 | "platform": {
3848 | "php": ">=7.0"
3849 | },
3850 | "platform-dev": []
3851 | }
3852 |
--------------------------------------------------------------------------------