aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--CHANGELOG.md16
-rw-r--r--RELEASE_PROCESS.md34
-rw-r--r--app/AppKernel.php2
-rw-r--r--app/DoctrineMigrations/Version20190510141130.php96
-rw-r--r--app/DoctrineMigrations/Version20190601125843.php54
-rw-r--r--app/Resources/static/themes/material/css/cards.scss52
-rw-r--r--app/Resources/static/themes/material/css/media_queries.scss4
-rw-r--r--app/config/config.yml22
-rw-r--r--app/config/config_prod.yml3
-rw-r--r--app/config/parameters.yml.dist5
-rw-r--r--app/config/wallabag.yml2
-rw-r--r--composer.json14
-rw-r--r--composer.lock10927
-rw-r--r--docker/php/Dockerfile2
-rwxr-xr-xscripts/release.sh4
-rw-r--r--src/Wallabag/ApiBundle/Controller/EntryRestController.php92
-rw-r--r--src/Wallabag/ApiBundle/Controller/UserRestController.php2
-rw-r--r--src/Wallabag/ApiBundle/Controller/WallabagRestController.php4
-rw-r--r--src/Wallabag/ApiBundle/Entity/AccessToken.php1
-rw-r--r--src/Wallabag/ApiBundle/Entity/AuthCode.php1
-rw-r--r--src/Wallabag/ApiBundle/Entity/RefreshToken.php1
-rw-r--r--src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php5
-rw-r--r--src/Wallabag/CoreBundle/Controller/ConfigController.php28
-rw-r--r--src/Wallabag/CoreBundle/DataFixtures/SiteCredentialFixtures.php27
-rw-r--r--src/Wallabag/CoreBundle/Entity/Entry.php73
-rw-r--r--src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php19
-rw-r--r--src/Wallabag/CoreBundle/Helper/ContentProxy.php52
-rw-r--r--src/Wallabag/CoreBundle/Helper/DownloadImages.php75
-rw-r--r--src/Wallabag/CoreBundle/Helper/HttpClientFactory.php51
-rw-r--r--src/Wallabag/CoreBundle/Helper/UrlHasher.php23
-rw-r--r--src/Wallabag/CoreBundle/Repository/EntryRepository.php49
-rw-r--r--src/Wallabag/CoreBundle/Repository/SiteCredentialRepository.php8
-rw-r--r--src/Wallabag/CoreBundle/Resources/config/services.yml11
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.da.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.de.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.en.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.es.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.it.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml4
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.th.yml5
-rw-r--r--src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/base.html.twig1
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig16
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig1
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig3
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig9
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_content.html.twig5
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig2
-rw-r--r--src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig3
-rw-r--r--src/Wallabag/ImportBundle/Import/InstapaperImport.php4
-rw-r--r--src/Wallabag/ImportBundle/Import/PocketImport.php91
-rw-r--r--src/Wallabag/ImportBundle/Import/WallabagV2Import.php4
-rw-r--r--src/Wallabag/ImportBundle/Resources/config/services.yml8
-rw-r--r--tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php21
-rw-r--r--tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php18
-rw-r--r--tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php41
-rw-r--r--tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php155
-rw-r--r--tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php199
-rw-r--r--tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php123
-rw-r--r--tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php2
-rw-r--r--tests/Wallabag/ImportBundle/Import/PocketImportTest.php404
-rw-r--r--web/wallassets/material.css2
69 files changed, 12271 insertions, 669 deletions
diff --git a/.gitignore b/.gitignore
index 472c7ad9..49ff72c6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,9 +43,6 @@ data/db/wallabag*.sqlite
43docker/logs/ 43docker/logs/
44docker/data/ 44docker/data/
45 45
46# To avoid crazy stuff on some PR, we must manually FORCE ADD IT on each new release
47composer.lock
48
49# assets stuff 46# assets stuff
50node_modules/ 47node_modules/
51bin 48bin
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 495bd1d8..e418d3e2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,21 @@
1# Changelog 1# Changelog
2 2
3## [2.3.8](https://github.com/wallabag/wallabag/tree/2.3.8)
4 [Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.7...2.3.8)
5
6### Fixes
7
8- Jump to 2.3.8-dev [#3897](https://github.com/wallabag/wallabag/pull/3897)
9- material: fix left padding on non-entry pages [#3901](https://github.com/wallabag/wallabag/pull/3901)
10- Make dev/install/update script posix compatible [#3860](https://github.com/wallabag/wallabag/pull/3860)
11- epub: fix exception when articles have the same title [#3908](https://github.com/wallabag/wallabag/pull/3908)
12- Fix PHP warning [#3909](https://github.com/wallabag/wallabag/pull/3909)
13- Add ability to match many domains for credentials [#3937](https://github.com/wallabag/wallabag/pull/3937)
14- material: add metadata to list view [#3942](https://github.com/wallabag/wallabag/pull/3942)
15- Enable no-referrer on img tags, enable strict-origin-when-cross-origin by default [#3943](https://github.com/wallabag/wallabag/pull/3943)
16- Remove preview picture from share view page#3922
17- Fix Intl Locale issue [#3964](https://github.com/wallabag/wallabag/pull/3964)
18
3## [2.3.7](https://github.com/wallabag/wallabag/tree/2.3.7) 19## [2.3.7](https://github.com/wallabag/wallabag/tree/2.3.7)
4 [Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.6...2.3.7) 20 [Full Changelog](https://github.com/wallabag/wallabag/compare/2.3.6...2.3.7)
5 21
diff --git a/RELEASE_PROCESS.md b/RELEASE_PROCESS.md
index 829f8390..881f0771 100644
--- a/RELEASE_PROCESS.md
+++ b/RELEASE_PROCESS.md
@@ -22,58 +22,42 @@ During this documentation, we assume the release is `$LAST_WALLABAG_RELEASE` (li
22git checkout master 22git checkout master
23git pull origin master 23git pull origin master
24git checkout -b release-$LAST_WALLABAG_RELEASE 24git checkout -b release-$LAST_WALLABAG_RELEASE
25SYMFONY_ENV=prod composer up --no-dev 25composer up
26```
27
28- Update `.travis.yml` file and replace the composer line with this one:
29
30```diff
31script:
32- - travis_wait bash composer install -o --no-interaction --no-progress --prefer-dist
33+ - travis_wait bash composer update -o --no-interaction --no-progress --prefer-dist
34``` 26```
35 27
36- Then continue with these commands: 28- Then continue with these commands:
37 29
38``` 30```
39git add --force composer.lock .travis.yml 31git add composer.lock
40git commit -m "Release wallabag $LAST_WALLABAG_RELEASE" 32git commit -m "Release wallabag $LAST_WALLABAG_RELEASE"
41git push origin release-$LAST_WALLABAG_RELEASE 33git push origin release-$LAST_WALLABAG_RELEASE
42``` 34```
43 35
44- Create a new pull request with this title `DON'T MERGE Release wallabag $LAST_WALLABAG_RELEASE`. This pull request is used to launch builds on Travis-CI. 36- Create a new pull request with this title `Release wallabag $LAST_WALLABAG_RELEASE`. This pull request is used to launch builds on Travis-CI.
45- Run these command to create the package: 37- Once PR is green, merge it and delete the branch.
38- Run this command to create the package:
46 39
47``` 40```
48make release VERSION=$LAST_WALLABAG_RELEASE 41make release VERSION=$LAST_WALLABAG_RELEASE
49``` 42```
50 43
51- [Create the new release on GitHub](https://github.com/wallabag/wallabag/releases/new) by targetting the `release-$LAST_WALLABAG_RELEASE` branch. You have to upload the package (generated previously). 44- [Create the new release on GitHub](https://github.com/wallabag/wallabag/releases/new) by targetting the `master` branch or any appropriate branch (for instance backports). You have to upload the package (generated previously).
52- Close the previously created pull request (**DO NOT MERGE IT**) and delete the `release-$LAST_WALLABAG_RELEASE` branch. 45- Update the URL shortener (used on `wllbg.org` to update links like `https://wllbg.org/latest-v2-package` or `http://wllbg.org/latest-v2`)
53- Update the URL shortener (used on `wllbg.org` to generate links like `https://wllbg.org/latest-v2-package` or `http://wllbg.org/latest-v2`)
54- Update Dockerfile https://github.com/wallabag/docker (and create a new tag) 46- Update Dockerfile https://github.com/wallabag/docker (and create a new tag)
55- Update wallabag.org website (downloads, MD5 sum, releases and new blog post) 47- Update wallabag.org website (downloads, MD5 sum, releases and new blog post)
56- Put the next patch version suffixed with `-dev` in `app/config/wallabag.yml` (`wallabag_core.version`) 48- Put the next patch version suffixed with `-dev` in `app/config/wallabag.yml` (`wallabag_core.version`)
57- Drink a :beer:! 49- Drink a :beer:!
58 50
59### `composer.lock`
60A release tag must contain a `composer.lock` file. It sets which dependencies were available at the time a release was done,
61making it easier to fix issues after the release. It also speeds up `composer install` on stable versions a LOT, by skipping the
62dependencies resolution part.
63
64Since `composer.lock` is ignored by default, either it must be removed from `.gitignore` _in the release branch_,
65or it must be added using `git add --force composer.lock`.
66
67### Target PHP version 51### Target PHP version
68`composer.lock` is _always_ built for a particular version, by default the one it is generated (with `composer update`). 52`composer.lock` is _always_ built for a particular version, by default the one it is generated (with `composer update`).
69 53
70If the PHP version used to generate the .lock isn't a widely available one (like PHP 7), a more common one should 54If the PHP version used to generate the .lock isn't a widely available one (like PHP 8), a more common one should
71be locally specified in `composer.lock`: 55be locally specified in `composer.lock`:
72 56
73```json 57```json
74 "config": { 58 "config": {
75 "platform": { 59 "platform": {
76 "php": "5.5.9", 60 "php": "7.1.3",
77 "ext-something": "4.0" 61 "ext-something": "4.0"
78 } 62 }
79 } 63 }
diff --git a/app/AppKernel.php b/app/AppKernel.php
index 7d19e9ab..fcf929c6 100644
--- a/app/AppKernel.php
+++ b/app/AppKernel.php
@@ -34,6 +34,8 @@ class AppKernel extends Kernel
34 new FOS\JsRoutingBundle\FOSJsRoutingBundle(), 34 new FOS\JsRoutingBundle\FOSJsRoutingBundle(),
35 new BD\GuzzleSiteAuthenticatorBundle\BDGuzzleSiteAuthenticatorBundle(), 35 new BD\GuzzleSiteAuthenticatorBundle\BDGuzzleSiteAuthenticatorBundle(),
36 new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(), 36 new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),
37 new Http\HttplugBundle\HttplugBundle(),
38 new Sentry\SentryBundle\SentryBundle(),
37 39
38 // wallabag bundles 40 // wallabag bundles
39 new Wallabag\CoreBundle\WallabagCoreBundle(), 41 new Wallabag\CoreBundle\WallabagCoreBundle(),
diff --git a/app/DoctrineMigrations/Version20190510141130.php b/app/DoctrineMigrations/Version20190510141130.php
new file mode 100644
index 00000000..524aa452
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190510141130.php
@@ -0,0 +1,96 @@
1<?php
2
3namespace Application\Migrations;
4
5use Doctrine\DBAL\Migrations\SkipMigrationException;
6use Doctrine\DBAL\Schema\Schema;
7use Wallabag\CoreBundle\Doctrine\WallabagMigration;
8
9/**
10 * Enable cascade delete when deleting a user on:
11 * - oauth2_access_tokens
12 * - oauth2_clients
13 * - oauth2_refresh_tokens
14 * - oauth2_auth_codes.
15 */
16final class Version20190510141130 extends WallabagMigration
17{
18 public function up(Schema $schema): void
19 {
20 switch ($this->connection->getDatabasePlatform()->getName()) {
21 case 'sqlite':
22 $this->addSql('DROP INDEX IDX_368A4209A76ED395');
23 $this->addSql('DROP INDEX IDX_368A420919EB6921');
24 $this->addSql('DROP INDEX UNIQ_368A42095F37A13B');
25 $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('oauth2_access_tokens', true) . ' AS SELECT id, client_id, user_id, token, expires_at, scope FROM ' . $this->getTable('oauth2_access_tokens', true));
26 $this->addSql('DROP TABLE ' . $this->getTable('oauth2_access_tokens', true));
27 $this->addSql('CREATE TABLE ' . $this->getTable('oauth2_access_tokens', true) . ' (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_368A420919EB6921 FOREIGN KEY (client_id) REFERENCES ' . $this->getTable('oauth2_clients', true) . ' (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)');
28 $this->addSql('INSERT INTO ' . $this->getTable('oauth2_access_tokens', true) . ' (id, client_id, user_id, token, expires_at, scope) SELECT id, client_id, user_id, token, expires_at, scope FROM __temp__' . $this->getTable('oauth2_access_tokens', true));
29 $this->addSql('DROP TABLE __temp__' . $this->getTable('oauth2_access_tokens', true));
30 $this->addSql('CREATE INDEX IDX_368A4209A76ED395 ON ' . $this->getTable('oauth2_access_tokens', true) . ' (user_id)');
31 $this->addSql('CREATE INDEX IDX_368A420919EB6921 ON ' . $this->getTable('oauth2_access_tokens', true) . ' (client_id)');
32
33 $this->addSql('DROP INDEX IDX_635D765EA76ED395');
34 $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('oauth2_clients', true) . ' AS SELECT id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name FROM ' . $this->getTable('oauth2_clients', true));
35 $this->addSql('DROP TABLE ' . $this->getTable('oauth2_clients', true));
36 $this->addSql('CREATE TABLE ' . $this->getTable('oauth2_clients', true) . ' (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id INTEGER DEFAULT NULL, random_id VARCHAR(255) NOT NULL COLLATE BINARY, secret VARCHAR(255) NOT NULL COLLATE BINARY, name CLOB NOT NULL COLLATE BINARY, redirect_uris CLOB NOT NULL, allowed_grant_types CLOB NOT NULL, CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE)');
37 $this->addSql('INSERT INTO ' . $this->getTable('oauth2_clients', true) . ' (id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name) SELECT id, user_id, random_id, secret, redirect_uris, allowed_grant_types, name FROM __temp__' . $this->getTable('oauth2_clients', true));
38 $this->addSql('DROP TABLE __temp__' . $this->getTable('oauth2_clients', true));
39 $this->addSql('CREATE INDEX IDX_635D765EA76ED395 ON ' . $this->getTable('oauth2_clients', true) . ' (user_id)');
40
41 $this->addSql('DROP INDEX IDX_20C9FB24A76ED395');
42 $this->addSql('DROP INDEX IDX_20C9FB2419EB6921');
43 $this->addSql('DROP INDEX UNIQ_20C9FB245F37A13B');
44 $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('oauth2_refresh_tokens', true) . ' AS SELECT id, client_id, user_id, token, expires_at, scope FROM ' . $this->getTable('oauth2_refresh_tokens', true));
45 $this->addSql('DROP TABLE ' . $this->getTable('oauth2_refresh_tokens', true));
46 $this->addSql('CREATE TABLE ' . $this->getTable('oauth2_refresh_tokens', true) . ' (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_20C9FB2419EB6921 FOREIGN KEY (client_id) REFERENCES ' . $this->getTable('oauth2_clients', true) . ' (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)');
47 $this->addSql('INSERT INTO ' . $this->getTable('oauth2_refresh_tokens', true) . ' (id, client_id, user_id, token, expires_at, scope) SELECT id, client_id, user_id, token, expires_at, scope FROM __temp__' . $this->getTable('oauth2_refresh_tokens', true));
48 $this->addSql('DROP TABLE __temp__' . $this->getTable('oauth2_refresh_tokens', true));
49 $this->addSql('CREATE INDEX IDX_20C9FB24A76ED395 ON ' . $this->getTable('oauth2_refresh_tokens', true) . ' (user_id)');
50 $this->addSql('CREATE INDEX IDX_20C9FB2419EB6921 ON ' . $this->getTable('oauth2_refresh_tokens', true) . ' (client_id)');
51
52 $this->addSql('DROP INDEX IDX_EE52E3FAA76ED395');
53 $this->addSql('DROP INDEX IDX_EE52E3FA19EB6921');
54 $this->addSql('DROP INDEX UNIQ_EE52E3FA5F37A13B');
55 $this->addSql('CREATE TEMPORARY TABLE __temp__' . $this->getTable('oauth2_auth_codes', true) . ' AS SELECT id, client_id, user_id, token, redirect_uri, expires_at, scope FROM ' . $this->getTable('oauth2_auth_codes', true));
56 $this->addSql('DROP TABLE ' . $this->getTable('oauth2_auth_codes', true));
57 $this->addSql('CREATE TABLE ' . $this->getTable('oauth2_auth_codes', true) . ' (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, client_id INTEGER NOT NULL, user_id INTEGER DEFAULT NULL, redirect_uri CLOB NOT NULL COLLATE BINARY, expires_at INTEGER DEFAULT NULL, token VARCHAR(191) NOT NULL, scope VARCHAR(191) NULL, CONSTRAINT FK_EE52E3FA19EB6921 FOREIGN KEY (client_id) REFERENCES ' . $this->getTable('oauth2_clients', true) . ' (id) NOT DEFERRABLE INITIALLY IMMEDIATE, CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE)');
58 $this->addSql('INSERT INTO ' . $this->getTable('oauth2_auth_codes', true) . ' (id, client_id, user_id, token, redirect_uri, expires_at, scope) SELECT id, client_id, user_id, token, redirect_uri, expires_at, scope FROM __temp__' . $this->getTable('oauth2_auth_codes', true));
59 $this->addSql('DROP TABLE __temp__' . $this->getTable('oauth2_auth_codes', true));
60 $this->addSql('CREATE INDEX IDX_EE52E3FAA76ED395 ON ' . $this->getTable('oauth2_auth_codes', true) . ' (user_id)');
61 $this->addSql('CREATE INDEX IDX_EE52E3FA19EB6921 ON ' . $this->getTable('oauth2_auth_codes', true) . ' (client_id)');
62 break;
63 case 'mysql':
64 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_access_tokens') . ' DROP FOREIGN KEY FK_368A4209A76ED395');
65 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_access_tokens') . ' ADD CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE');
66
67 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_clients') . ' DROP FOREIGN KEY IDX_user_oauth_client');
68 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_clients') . ' ADD CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id)');
69
70 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_refresh_tokens') . ' DROP FOREIGN KEY FK_20C9FB24A76ED395');
71 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_refresh_tokens') . ' ADD CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE');
72
73 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_auth_codes') . ' DROP FOREIGN KEY FK_EE52E3FAA76ED395');
74 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_auth_codes') . ' ADD CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES `wallabag_user` (id) ON DELETE CASCADE');
75 break;
76 case 'postgresql':
77 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_access_tokens') . ' DROP CONSTRAINT FK_368A4209A76ED395');
78 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_access_tokens') . ' ADD CONSTRAINT FK_368A4209A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
79
80 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_clients') . ' DROP CONSTRAINT idx_user_oauth_client');
81 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_clients') . ' ADD CONSTRAINT FK_635D765EA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) NOT DEFERRABLE INITIALLY IMMEDIATE');
82
83 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_refresh_tokens') . ' DROP CONSTRAINT FK_20C9FB24A76ED395');
84 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_refresh_tokens') . ' ADD CONSTRAINT FK_20C9FB24A76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
85
86 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_auth_codes') . ' DROP CONSTRAINT FK_EE52E3FAA76ED395');
87 $this->addSql('ALTER TABLE ' . $this->getTable('oauth2_auth_codes') . ' ADD CONSTRAINT FK_EE52E3FAA76ED395 FOREIGN KEY (user_id) REFERENCES "wallabag_user" (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE');
88 break;
89 }
90 }
91
92 public function down(Schema $schema): void
93 {
94 throw new SkipMigrationException('Too complex ...');
95 }
96}
diff --git a/app/DoctrineMigrations/Version20190601125843.php b/app/DoctrineMigrations/Version20190601125843.php
new file mode 100644
index 00000000..0e97606e
--- /dev/null
+++ b/app/DoctrineMigrations/Version20190601125843.php
@@ -0,0 +1,54 @@
1<?php
2
3namespace Application\Migrations;
4
5use Doctrine\DBAL\Schema\Schema;
6use Wallabag\CoreBundle\Doctrine\WallabagMigration;
7
8/**
9 * Added `given_url` & `hashed_given_url` field in entry table.
10 */
11class Version20190601125843 extends WallabagMigration
12{
13 /**
14 * @param Schema $schema
15 */
16 public function up(Schema $schema)
17 {
18 $entryTable = $schema->getTable($this->getTable('entry'));
19
20 if (!$entryTable->hasColumn('given_url')) {
21 $entryTable->addColumn('given_url', 'text', [
22 'notnull' => false,
23 ]);
24 }
25
26 if (!$entryTable->hasColumn('hashed_given_url')) {
27 $entryTable->addColumn('hashed_given_url', 'text', [
28 'length' => 40,
29 'notnull' => false,
30 ]);
31 }
32
33 // 40 = length of sha1 field hashed_given_url
34 $entryTable->addIndex(['user_id', 'hashed_given_url'], 'hashed_given_url_user_id', [], ['lengths' => [null, 40]]);
35 }
36
37 /**
38 * @param Schema $schema
39 */
40 public function down(Schema $schema)
41 {
42 $entryTable = $schema->getTable($this->getTable('entry'));
43
44 if ($entryTable->hasColumn('given_url')) {
45 $entryTable->dropColumn('given_url');
46 }
47
48 if ($entryTable->hasColumn('hashed_given_url')) {
49 $entryTable->dropColumn('hashed_given_url');
50 }
51
52 $entryTable->dropIndex('hashed_given_url_user_id');
53 }
54}
diff --git a/app/Resources/static/themes/material/css/cards.scss b/app/Resources/static/themes/material/css/cards.scss
index c893b376..9ae1be82 100644
--- a/app/Resources/static/themes/material/css/cards.scss
+++ b/app/Resources/static/themes/material/css/cards.scss
@@ -18,6 +18,24 @@ main {
18 overflow: hidden; 18 overflow: hidden;
19} 19}
20 20
21@mixin mixin-reading-time {
22 .reading-time {
23 display: inline-flex;
24 vertical-align: middle;
25
26 .card-reading-time,
27 .card-created-at {
28 display: inline-flex;
29 }
30
31 span {
32 margin-right: 5px;
33 }
34
35 @content;
36 }
37}
38
21.card { 39.card {
22 .card-content .card-title, 40 .card-content .card-title,
23 .card-reveal .card-title { 41 .card-reveal .card-title {
@@ -98,19 +116,7 @@ main {
98 margin-right: 5px !important; 116 margin-right: 5px !important;
99 } 117 }
100 118
101 .reading-time { 119 @include mixin-reading-time;
102 display: inline-flex;
103 vertical-align: middle;
104
105 .card-reading-time,
106 .card-created-at {
107 display: inline-flex;
108 }
109
110 span {
111 margin-right: 5px;
112 }
113 }
114 } 120 }
115 121
116 .card-image { 122 .card-image {
@@ -235,10 +241,18 @@ a.original:not(.waves-effect) {
235 } 241 }
236 242
237 div.metadata { 243 div.metadata {
244 overflow: hidden;
245 height: 1.5em;
246 display: flex;
247
248 ul.tags {
249 margin-left: 4px;
250 }
251
238 .chip { 252 .chip {
239 background-color: $blueAccentColor; 253 background-color: $blueAccentColor;
240 padding: 0 7px; 254 padding: 0 7px;
241 margin: auto 2px; 255 margin: auto 1px;
242 border-radius: 6px; 256 border-radius: 6px;
243 line-height: 22px; 257 line-height: 22px;
244 height: 22px; 258 height: 22px;
@@ -255,6 +269,16 @@ a.original:not(.waves-effect) {
255 padding-left: 8px; 269 padding-left: 8px;
256 } 270 }
257 } 271 }
272
273 @include mixin-reading-time {
274 padding: 0 5px;
275 flex-wrap: wrap;
276 margin-left: auto;
277
278 i.material-icons {
279 font-size: 20px;
280 }
281 }
258 } 282 }
259 283
260 div.card-content { 284 div.card-content {
diff --git a/app/Resources/static/themes/material/css/media_queries.scss b/app/Resources/static/themes/material/css/media_queries.scss
index 491eedce..6f9d2a95 100644
--- a/app/Resources/static/themes/material/css/media_queries.scss
+++ b/app/Resources/static/themes/material/css/media_queries.scss
@@ -173,6 +173,10 @@
173 .row .col { 173 .row .col {
174 padding: 0; 174 padding: 0;
175 } 175 }
176
177 .card-stacked div.metadata .reading-time {
178 display: none;
179 }
176} 180}
177 181
178@media screen and (max-width: 310px), 182@media screen and (max-width: 310px),
diff --git a/app/config/config.yml b/app/config/config.yml
index 078f277a..bbcc682f 100644
--- a/app/config/config.yml
+++ b/app/config/config.yml
@@ -370,3 +370,25 @@ jms_serializer:
370sensio_framework_extra: 370sensio_framework_extra:
371 router: 371 router:
372 annotations: false 372 annotations: false
373
374httplug:
375 clients:
376 wallabag_core:
377 factory: 'wallabag_core.http_client_factory'
378 config:
379 defaults:
380 timeout: 10
381 plugins: ['httplug.plugin.logger']
382 wallabag_core.entry.download_images:
383 factory: 'httplug.factory.auto'
384 plugins: ['httplug.plugin.logger']
385 wallabag_import.pocket.client:
386 factory: 'httplug.factory.auto'
387 plugins:
388 - 'httplug.plugin.logger'
389 - header_defaults:
390 headers:
391 'content-type': 'application/json'
392 'X-Accept': 'application/json'
393 discovery:
394 client: false
diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml
index 44e29aac..59d2e9e2 100644
--- a/app/config/config_prod.yml
+++ b/app/config/config_prod.yml
@@ -23,3 +23,6 @@ monolog:
23 level: debug 23 level: debug
24 console: 24 console:
25 type: console 25 type: console
26
27sentry:
28 dsn: "%sentry_dsn%"
diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist
index 13e2584f..9948fa46 100644
--- a/app/config/parameters.yml.dist
+++ b/app/config/parameters.yml.dist
@@ -36,7 +36,7 @@ parameters:
36 locale: en 36 locale: en
37 37
38 # A secret key that's used to generate certain security-related tokens 38 # A secret key that's used to generate certain security-related tokens
39 secret: ovmpmAWXRCabNlMgzlzFXDYmCFfzGv 39 secret: CHANGE_ME_TO_SOMETHING_SECRET_AND_RANDOM
40 40
41 # two factor stuff 41 # two factor stuff
42 twofactor_auth: true 42 twofactor_auth: true
@@ -63,3 +63,6 @@ parameters:
63 redis_port: 6379 63 redis_port: 6379
64 redis_path: null 64 redis_path: null
65 redis_password: null 65 redis_password: null
66
67 # sentry logging
68 sentry_dsn: ~
diff --git a/app/config/wallabag.yml b/app/config/wallabag.yml
index 96dfacf9..ea1cce12 100644
--- a/app/config/wallabag.yml
+++ b/app/config/wallabag.yml
@@ -1,5 +1,5 @@
1wallabag_core: 1wallabag_core:
2 version: 2.3.8-dev 2 version: 2.4.0-dev
3 paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb" 3 paypal_url: "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9UBA65LG3FX9Y&lc=gb"
4 languages: 4 languages:
5 en: 'English' 5 en: 'English'
diff --git a/composer.json b/composer.json
index b1c144c7..44ac3474 100644
--- a/composer.json
+++ b/composer.json
@@ -63,11 +63,11 @@
63 "nelmio/api-doc-bundle": "^2.13.2", 63 "nelmio/api-doc-bundle": "^2.13.2",
64 "mgargano/simplehtmldom": "~1.5", 64 "mgargano/simplehtmldom": "~1.5",
65 "wallabag/tcpdf": "^6.2.26", 65 "wallabag/tcpdf": "^6.2.26",
66 "simplepie/simplepie": "~1.5",
67 "willdurand/hateoas-bundle": "~1.3", 66 "willdurand/hateoas-bundle": "~1.3",
68 "liip/theme-bundle": "^1.4.6", 67 "liip/theme-bundle": "^1.4.6",
69 "lexik/form-filter-bundle": "^5.0", 68 "lexik/form-filter-bundle": "^5.0.4",
70 "j0k3r/graby": "^1.0", 69 "j0k3r/graby": "^2.0",
70 "php-http/guzzle5-adapter": "^2.0",
71 "friendsofsymfony/user-bundle": "2.0.*", 71 "friendsofsymfony/user-bundle": "2.0.*",
72 "friendsofsymfony/oauth-server-bundle": "^1.5", 72 "friendsofsymfony/oauth-server-bundle": "^1.5",
73 "stof/doctrine-extensions-bundle": "^1.2", 73 "stof/doctrine-extensions-bundle": "^1.2",
@@ -89,7 +89,9 @@
89 "bdunogier/guzzle-site-authenticator": "^1.0.0", 89 "bdunogier/guzzle-site-authenticator": "^1.0.0",
90 "defuse/php-encryption": "^2.1", 90 "defuse/php-encryption": "^2.1",
91 "html2text/html2text": "^4.1", 91 "html2text/html2text": "^4.1",
92 "pragmarx/recovery": "^0.1.0" 92 "pragmarx/recovery": "^0.1.0",
93 "php-http/httplug-bundle": "^1.14",
94 "sentry/sentry-symfony": "^3.0"
93 }, 95 },
94 "require-dev": { 96 "require-dev": {
95 "doctrine/doctrine-fixtures-bundle": "~3.0", 97 "doctrine/doctrine-fixtures-bundle": "~3.0",
@@ -101,7 +103,9 @@
101 "phpstan/phpstan": "^0.11.0", 103 "phpstan/phpstan": "^0.11.0",
102 "phpstan/phpstan-phpunit": "^0.11.0", 104 "phpstan/phpstan-phpunit": "^0.11.0",
103 "phpstan/phpstan-symfony": "^0.11.0", 105 "phpstan/phpstan-symfony": "^0.11.0",
104 "phpstan/phpstan-doctrine": "^0.11.0" 106 "phpstan/phpstan-doctrine": "^0.11.0",
107 "php-http/mock-client": "^1.0",
108 "guzzlehttp/psr7": "^1.0"
105 }, 109 },
106 "suggest": { 110 "suggest": {
107 "ext-imagick": "To keep GIF animation when downloading image is enabled" 111 "ext-imagick": "To keep GIF animation when downloading image is enabled"
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 00000000..effd6029
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,10927 @@
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#installing-dependencies",
5 "This file is @generated automatically"
6 ],
7 "content-hash": "7e872d70c69629db503d9b8ed18e0f40",
8 "packages": [
9 {
10 "name": "bdunogier/guzzle-site-authenticator",
11 "version": "1.0.0",
12 "source": {
13 "type": "git",
14 "url": "https://github.com/wallabag/guzzle-site-authenticator.git",
15 "reference": "6649aca6f13c27088ef34e4202b31fc0da01d987"
16 },
17 "dist": {
18 "type": "zip",
19 "url": "https://api.github.com/repos/wallabag/guzzle-site-authenticator/zipball/6649aca6f13c27088ef34e4202b31fc0da01d987",
20 "reference": "6649aca6f13c27088ef34e4202b31fc0da01d987",
21 "shasum": ""
22 },
23 "require": {
24 "guzzlehttp/guzzle": "^5.2.0",
25 "psr/log": "^1.0.0",
26 "symfony/expression-language": "^3.2"
27 },
28 "require-dev": {
29 "friendsofphp/php-cs-fixer": "~2.0",
30 "monolog/monolog": "^1.13",
31 "php-coveralls/php-coveralls": "~1.0",
32 "symfony/phpunit-bridge": "^4.2"
33 },
34 "type": "library",
35 "extra": {
36 "branch-alias": {
37 "dev-master": "1.0.x-dev"
38 }
39 },
40 "autoload": {
41 "psr-4": {
42 "BD\\GuzzleSiteAuthenticatorBundle\\": "bundle/",
43 "BD\\GuzzleSiteAuthenticator\\": "lib/"
44 }
45 },
46 "notification-url": "https://packagist.org/downloads/",
47 "license": [
48 "MIT"
49 ],
50 "authors": [
51 {
52 "name": "Bertrand Dunogier",
53 "email": "bertrand.dunogier@gmail.com"
54 }
55 ],
56 "description": "A guzzle plugin that adds, if necessary, authentication data to requests. Uses credentials and cookies, with login requests to the sites.",
57 "time": "2018-12-13T21:06:29+00:00"
58 },
59 {
60 "name": "behat/transliterator",
61 "version": "v1.2.0",
62 "source": {
63 "type": "git",
64 "url": "https://github.com/Behat/Transliterator.git",
65 "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c"
66 },
67 "dist": {
68 "type": "zip",
69 "url": "https://api.github.com/repos/Behat/Transliterator/zipball/826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
70 "reference": "826ce7e9c2a6664c0d1f381cbb38b1fb80a7ee2c",
71 "shasum": ""
72 },
73 "require": {
74 "php": ">=5.3.3"
75 },
76 "require-dev": {
77 "chuyskywalker/rolling-curl": "^3.1",
78 "php-yaoi/php-yaoi": "^1.0"
79 },
80 "type": "library",
81 "extra": {
82 "branch-alias": {
83 "dev-master": "1.2-dev"
84 }
85 },
86 "autoload": {
87 "psr-0": {
88 "Behat\\Transliterator": "src/"
89 }
90 },
91 "notification-url": "https://packagist.org/downloads/",
92 "license": [
93 "Artistic-1.0"
94 ],
95 "description": "String transliterator",
96 "keywords": [
97 "i18n",
98 "slug",
99 "transliterator"
100 ],
101 "time": "2017-04-04T11:38:05+00:00"
102 },
103 {
104 "name": "clue/stream-filter",
105 "version": "v1.4.1",
106 "source": {
107 "type": "git",
108 "url": "https://github.com/clue/php-stream-filter.git",
109 "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71"
110 },
111 "dist": {
112 "type": "zip",
113 "url": "https://api.github.com/repos/clue/php-stream-filter/zipball/5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71",
114 "reference": "5a58cc30a8bd6a4eb8f856adf61dd3e013f53f71",
115 "shasum": ""
116 },
117 "require": {
118 "php": ">=5.3"
119 },
120 "require-dev": {
121 "phpunit/phpunit": "^5.0 || ^4.8"
122 },
123 "type": "library",
124 "autoload": {
125 "psr-4": {
126 "Clue\\StreamFilter\\": "src/"
127 },
128 "files": [
129 "src/functions_include.php"
130 ]
131 },
132 "notification-url": "https://packagist.org/downloads/",
133 "license": [
134 "MIT"
135 ],
136 "authors": [
137 {
138 "name": "Christian Lück",
139 "email": "christian@lueck.tv"
140 }
141 ],
142 "description": "A simple and modern approach to stream filtering in PHP",
143 "homepage": "https://github.com/clue/php-stream-filter",
144 "keywords": [
145 "bucket brigade",
146 "callback",
147 "filter",
148 "php_user_filter",
149 "stream",
150 "stream_filter_append",
151 "stream_filter_register"
152 ],
153 "time": "2019-04-09T12:31:48+00:00"
154 },
155 {
156 "name": "composer/ca-bundle",
157 "version": "1.1.4",
158 "source": {
159 "type": "git",
160 "url": "https://github.com/composer/ca-bundle.git",
161 "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d"
162 },
163 "dist": {
164 "type": "zip",
165 "url": "https://api.github.com/repos/composer/ca-bundle/zipball/558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
166 "reference": "558f321c52faeb4828c03e7dc0cfe39a09e09a2d",
167 "shasum": ""
168 },
169 "require": {
170 "ext-openssl": "*",
171 "ext-pcre": "*",
172 "php": "^5.3.2 || ^7.0"
173 },
174 "require-dev": {
175 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
176 "psr/log": "^1.0",
177 "symfony/process": "^2.5 || ^3.0 || ^4.0"
178 },
179 "type": "library",
180 "extra": {
181 "branch-alias": {
182 "dev-master": "1.x-dev"
183 }
184 },
185 "autoload": {
186 "psr-4": {
187 "Composer\\CaBundle\\": "src"
188 }
189 },
190 "notification-url": "https://packagist.org/downloads/",
191 "license": [
192 "MIT"
193 ],
194 "authors": [
195 {
196 "name": "Jordi Boggiano",
197 "email": "j.boggiano@seld.be",
198 "homepage": "http://seld.be"
199 }
200 ],
201 "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
202 "keywords": [
203 "cabundle",
204 "cacert",
205 "certificate",
206 "ssl",
207 "tls"
208 ],
209 "time": "2019-01-28T09:30:10+00:00"
210 },
211 {
212 "name": "craue/config-bundle",
213 "version": "dev-utf8mb4",
214 "source": {
215 "type": "git",
216 "url": "https://github.com/wallabag/CraueConfigBundle.git",
217 "reference": "46cfd37febc51d62e84e4c64fdb166e7495ca172"
218 },
219 "dist": {
220 "type": "zip",
221 "url": "https://api.github.com/repos/wallabag/CraueConfigBundle/zipball/46cfd37febc51d62e84e4c64fdb166e7495ca172",
222 "reference": "46cfd37febc51d62e84e4c64fdb166e7495ca172",
223 "shasum": ""
224 },
225 "require": {
226 "doctrine/doctrine-bundle": "~1.3",
227 "php": "^5.3.9|~7.0",
228 "symfony/framework-bundle": "~2.7|~3.0|~4.0"
229 },
230 "require-dev": {
231 "doctrine/doctrine-cache-bundle": "~1.3",
232 "doctrine/orm": "^2.3.1",
233 "phpunit/phpunit": "^4.8.35|~5.7|~6.0",
234 "symfony/phpunit-bridge": "~3.2|~4.0",
235 "symfony/symfony": "~2.7|~3.0|~4.0"
236 },
237 "type": "symfony-bundle",
238 "extra": {
239 "branch-alias": {
240 "dev-master": "2.1.x-dev"
241 }
242 },
243 "autoload": {
244 "psr-4": {
245 "Craue\\ConfigBundle\\": ""
246 },
247 "exclude-from-classmap": [
248 "/Tests/"
249 ]
250 },
251 "license": [
252 "MIT"
253 ],
254 "authors": [
255 {
256 "name": "Christian Raue",
257 "email": "christian.raue@gmail.com"
258 },
259 {
260 "name": "Symfony Community",
261 "homepage": "https://github.com/craue/CraueConfigBundle/contributors"
262 }
263 ],
264 "description": "Database-stored settings made available via a service for your Symfony project.",
265 "homepage": "https://github.com/craue/CraueConfigBundle",
266 "keywords": [
267 "config",
268 "symfony2",
269 "symfony3",
270 "symfony4"
271 ],
272 "support": {
273 "source": "https://github.com/wallabag/CraueConfigBundle/tree/utf8mb4"
274 },
275 "time": "2018-11-28T19:15:35+00:00"
276 },
277 {
278 "name": "defuse/php-encryption",
279 "version": "v2.2.1",
280 "source": {
281 "type": "git",
282 "url": "https://github.com/defuse/php-encryption.git",
283 "reference": "0f407c43b953d571421e0020ba92082ed5fb7620"
284 },
285 "dist": {
286 "type": "zip",
287 "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620",
288 "reference": "0f407c43b953d571421e0020ba92082ed5fb7620",
289 "shasum": ""
290 },
291 "require": {
292 "ext-openssl": "*",
293 "paragonie/random_compat": ">= 2",
294 "php": ">=5.4.0"
295 },
296 "require-dev": {
297 "nikic/php-parser": "^2.0|^3.0|^4.0",
298 "phpunit/phpunit": "^4|^5"
299 },
300 "bin": [
301 "bin/generate-defuse-key"
302 ],
303 "type": "library",
304 "autoload": {
305 "psr-4": {
306 "Defuse\\Crypto\\": "src"
307 }
308 },
309 "notification-url": "https://packagist.org/downloads/",
310 "license": [
311 "MIT"
312 ],
313 "authors": [
314 {
315 "name": "Taylor Hornby",
316 "email": "taylor@defuse.ca",
317 "homepage": "https://defuse.ca/"
318 },
319 {
320 "name": "Scott Arciszewski",
321 "email": "info@paragonie.com",
322 "homepage": "https://paragonie.com"
323 }
324 ],
325 "description": "Secure PHP Encryption Library",
326 "keywords": [
327 "aes",
328 "authenticated encryption",
329 "cipher",
330 "crypto",
331 "cryptography",
332 "encrypt",
333 "encryption",
334 "openssl",
335 "security",
336 "symmetric key cryptography"
337 ],
338 "time": "2018-07-24T23:27:56+00:00"
339 },
340 {
341 "name": "doctrine/annotations",
342 "version": "v1.6.1",
343 "source": {
344 "type": "git",
345 "url": "https://github.com/doctrine/annotations.git",
346 "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24"
347 },
348 "dist": {
349 "type": "zip",
350 "url": "https://api.github.com/repos/doctrine/annotations/zipball/53120e0eb10355388d6ccbe462f1fea34ddadb24",
351 "reference": "53120e0eb10355388d6ccbe462f1fea34ddadb24",
352 "shasum": ""
353 },
354 "require": {
355 "doctrine/lexer": "1.*",
356 "php": "^7.1"
357 },
358 "require-dev": {
359 "doctrine/cache": "1.*",
360 "phpunit/phpunit": "^6.4"
361 },
362 "type": "library",
363 "extra": {
364 "branch-alias": {
365 "dev-master": "1.6.x-dev"
366 }
367 },
368 "autoload": {
369 "psr-4": {
370 "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
371 }
372 },
373 "notification-url": "https://packagist.org/downloads/",
374 "license": [
375 "MIT"
376 ],
377 "authors": [
378 {
379 "name": "Roman Borschel",
380 "email": "roman@code-factory.org"
381 },
382 {
383 "name": "Benjamin Eberlei",
384 "email": "kontakt@beberlei.de"
385 },
386 {
387 "name": "Guilherme Blanco",
388 "email": "guilhermeblanco@gmail.com"
389 },
390 {
391 "name": "Jonathan Wage",
392 "email": "jonwage@gmail.com"
393 },
394 {
395 "name": "Johannes Schmitt",
396 "email": "schmittjoh@gmail.com"
397 }
398 ],
399 "description": "Docblock Annotations Parser",
400 "homepage": "http://www.doctrine-project.org",
401 "keywords": [
402 "annotations",
403 "docblock",
404 "parser"
405 ],
406 "time": "2019-03-25T19:12:02+00:00"
407 },
408 {
409 "name": "doctrine/cache",
410 "version": "v1.8.0",
411 "source": {
412 "type": "git",
413 "url": "https://github.com/doctrine/cache.git",
414 "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57"
415 },
416 "dist": {
417 "type": "zip",
418 "url": "https://api.github.com/repos/doctrine/cache/zipball/d768d58baee9a4862ca783840eca1b9add7a7f57",
419 "reference": "d768d58baee9a4862ca783840eca1b9add7a7f57",
420 "shasum": ""
421 },
422 "require": {
423 "php": "~7.1"
424 },
425 "conflict": {
426 "doctrine/common": ">2.2,<2.4"
427 },
428 "require-dev": {
429 "alcaeus/mongo-php-adapter": "^1.1",
430 "doctrine/coding-standard": "^4.0",
431 "mongodb/mongodb": "^1.1",
432 "phpunit/phpunit": "^7.0",
433 "predis/predis": "~1.0"
434 },
435 "suggest": {
436 "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
437 },
438 "type": "library",
439 "extra": {
440 "branch-alias": {
441 "dev-master": "1.8.x-dev"
442 }
443 },
444 "autoload": {
445 "psr-4": {
446 "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
447 }
448 },
449 "notification-url": "https://packagist.org/downloads/",
450 "license": [
451 "MIT"
452 ],
453 "authors": [
454 {
455 "name": "Roman Borschel",
456 "email": "roman@code-factory.org"
457 },
458 {
459 "name": "Benjamin Eberlei",
460 "email": "kontakt@beberlei.de"
461 },
462 {
463 "name": "Guilherme Blanco",
464 "email": "guilhermeblanco@gmail.com"
465 },
466 {
467 "name": "Jonathan Wage",
468 "email": "jonwage@gmail.com"
469 },
470 {
471 "name": "Johannes Schmitt",
472 "email": "schmittjoh@gmail.com"
473 }
474 ],
475 "description": "Caching library offering an object-oriented API for many cache backends",
476 "homepage": "https://www.doctrine-project.org",
477 "keywords": [
478 "cache",
479 "caching"
480 ],
481 "time": "2018-08-21T18:01:43+00:00"
482 },
483 {
484 "name": "doctrine/collections",
485 "version": "v1.6.1",
486 "source": {
487 "type": "git",
488 "url": "https://github.com/doctrine/collections.git",
489 "reference": "d2ae4ef05e25197343b6a39bae1d3c427a2f6956"
490 },
491 "dist": {
492 "type": "zip",
493 "url": "https://api.github.com/repos/doctrine/collections/zipball/d2ae4ef05e25197343b6a39bae1d3c427a2f6956",
494 "reference": "d2ae4ef05e25197343b6a39bae1d3c427a2f6956",
495 "shasum": ""
496 },
497 "require": {
498 "php": "^7.1.3"
499 },
500 "require-dev": {
501 "doctrine/coding-standard": "^6.0",
502 "phpstan/phpstan-shim": "^0.9.2",
503 "phpunit/phpunit": "^7.0",
504 "vimeo/psalm": "^3.2.2"
505 },
506 "type": "library",
507 "extra": {
508 "branch-alias": {
509 "dev-master": "1.6.x-dev"
510 }
511 },
512 "autoload": {
513 "psr-4": {
514 "Doctrine\\Common\\Collections\\": "lib/Doctrine/Common/Collections"
515 }
516 },
517 "notification-url": "https://packagist.org/downloads/",
518 "license": [
519 "MIT"
520 ],
521 "authors": [
522 {
523 "name": "Roman Borschel",
524 "email": "roman@code-factory.org"
525 },
526 {
527 "name": "Benjamin Eberlei",
528 "email": "kontakt@beberlei.de"
529 },
530 {
531 "name": "Guilherme Blanco",
532 "email": "guilhermeblanco@gmail.com"
533 },
534 {
535 "name": "Jonathan Wage",
536 "email": "jonwage@gmail.com"
537 },
538 {
539 "name": "Johannes Schmitt",
540 "email": "schmittjoh@gmail.com"
541 }
542 ],
543 "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
544 "homepage": "https://www.doctrine-project.org/projects/collections.html",
545 "keywords": [
546 "array",
547 "collections",
548 "iterators",
549 "php"
550 ],
551 "time": "2019-03-25T19:03:48+00:00"
552 },
553 {
554 "name": "doctrine/common",
555 "version": "v2.10.0",
556 "source": {
557 "type": "git",
558 "url": "https://github.com/doctrine/common.git",
559 "reference": "30e33f60f64deec87df728c02b107f82cdafad9d"
560 },
561 "dist": {
562 "type": "zip",
563 "url": "https://api.github.com/repos/doctrine/common/zipball/30e33f60f64deec87df728c02b107f82cdafad9d",
564 "reference": "30e33f60f64deec87df728c02b107f82cdafad9d",
565 "shasum": ""
566 },
567 "require": {
568 "doctrine/annotations": "^1.0",
569 "doctrine/cache": "^1.0",
570 "doctrine/collections": "^1.0",
571 "doctrine/event-manager": "^1.0",
572 "doctrine/inflector": "^1.0",
573 "doctrine/lexer": "^1.0",
574 "doctrine/persistence": "^1.1",
575 "doctrine/reflection": "^1.0",
576 "php": "^7.1"
577 },
578 "require-dev": {
579 "doctrine/coding-standard": "^1.0",
580 "phpunit/phpunit": "^6.3",
581 "squizlabs/php_codesniffer": "^3.0",
582 "symfony/phpunit-bridge": "^4.0.5"
583 },
584 "type": "library",
585 "extra": {
586 "branch-alias": {
587 "dev-master": "2.10.x-dev"
588 }
589 },
590 "autoload": {
591 "psr-4": {
592 "Doctrine\\Common\\": "lib/Doctrine/Common"
593 }
594 },
595 "notification-url": "https://packagist.org/downloads/",
596 "license": [
597 "MIT"
598 ],
599 "authors": [
600 {
601 "name": "Roman Borschel",
602 "email": "roman@code-factory.org"
603 },
604 {
605 "name": "Benjamin Eberlei",
606 "email": "kontakt@beberlei.de"
607 },
608 {
609 "name": "Guilherme Blanco",
610 "email": "guilhermeblanco@gmail.com"
611 },
612 {
613 "name": "Jonathan Wage",
614 "email": "jonwage@gmail.com"
615 },
616 {
617 "name": "Johannes Schmitt",
618 "email": "schmittjoh@gmail.com"
619 },
620 {
621 "name": "Marco Pivetta",
622 "email": "ocramius@gmail.com"
623 }
624 ],
625 "description": "PHP Doctrine Common project is a library that provides additional functionality that other Doctrine projects depend on such as better reflection support, persistence interfaces, proxies, event system and much more.",
626 "homepage": "https://www.doctrine-project.org/projects/common.html",
627 "keywords": [
628 "common",
629 "doctrine",
630 "php"
631 ],
632 "time": "2018-11-21T01:24:55+00:00"
633 },
634 {
635 "name": "doctrine/dbal",
636 "version": "v2.9.2",
637 "source": {
638 "type": "git",
639 "url": "https://github.com/doctrine/dbal.git",
640 "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9"
641 },
642 "dist": {
643 "type": "zip",
644 "url": "https://api.github.com/repos/doctrine/dbal/zipball/22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9",
645 "reference": "22800bd651c1d8d2a9719e2a3dc46d5108ebfcc9",
646 "shasum": ""
647 },
648 "require": {
649 "doctrine/cache": "^1.0",
650 "doctrine/event-manager": "^1.0",
651 "ext-pdo": "*",
652 "php": "^7.1"
653 },
654 "require-dev": {
655 "doctrine/coding-standard": "^5.0",
656 "jetbrains/phpstorm-stubs": "^2018.1.2",
657 "phpstan/phpstan": "^0.10.1",
658 "phpunit/phpunit": "^7.4",
659 "symfony/console": "^2.0.5|^3.0|^4.0",
660 "symfony/phpunit-bridge": "^3.4.5|^4.0.5"
661 },
662 "suggest": {
663 "symfony/console": "For helpful console commands such as SQL execution and import of files."
664 },
665 "bin": [
666 "bin/doctrine-dbal"
667 ],
668 "type": "library",
669 "extra": {
670 "branch-alias": {
671 "dev-master": "2.9.x-dev",
672 "dev-develop": "3.0.x-dev"
673 }
674 },
675 "autoload": {
676 "psr-4": {
677 "Doctrine\\DBAL\\": "lib/Doctrine/DBAL"
678 }
679 },
680 "notification-url": "https://packagist.org/downloads/",
681 "license": [
682 "MIT"
683 ],
684 "authors": [
685 {
686 "name": "Roman Borschel",
687 "email": "roman@code-factory.org"
688 },
689 {
690 "name": "Benjamin Eberlei",
691 "email": "kontakt@beberlei.de"
692 },
693 {
694 "name": "Guilherme Blanco",
695 "email": "guilhermeblanco@gmail.com"
696 },
697 {
698 "name": "Jonathan Wage",
699 "email": "jonwage@gmail.com"
700 }
701 ],
702 "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
703 "homepage": "https://www.doctrine-project.org/projects/dbal.html",
704 "keywords": [
705 "abstraction",
706 "database",
707 "dbal",
708 "mysql",
709 "persistence",
710 "pgsql",
711 "php",
712 "queryobject"
713 ],
714 "time": "2018-12-31T03:27:51+00:00"
715 },
716 {
717 "name": "doctrine/doctrine-bundle",
718 "version": "1.11.2",
719 "source": {
720 "type": "git",
721 "url": "https://github.com/doctrine/DoctrineBundle.git",
722 "reference": "28101e20776d8fa20a00b54947fbae2db0d09103"
723 },
724 "dist": {
725 "type": "zip",
726 "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/28101e20776d8fa20a00b54947fbae2db0d09103",
727 "reference": "28101e20776d8fa20a00b54947fbae2db0d09103",
728 "shasum": ""
729 },
730 "require": {
731 "doctrine/dbal": "^2.5.12",
732 "doctrine/doctrine-cache-bundle": "~1.2",
733 "jdorn/sql-formatter": "^1.2.16",
734 "php": "^7.1",
735 "symfony/config": "^3.4|^4.1",
736 "symfony/console": "^3.4|^4.1",
737 "symfony/dependency-injection": "^3.4|^4.1",
738 "symfony/doctrine-bridge": "^3.4|^4.1",
739 "symfony/framework-bundle": "^3.4|^4.1"
740 },
741 "conflict": {
742 "doctrine/orm": "<2.6",
743 "twig/twig": "<1.34|>=2.0,<2.4"
744 },
745 "require-dev": {
746 "doctrine/coding-standard": "^6.0",
747 "doctrine/orm": "^2.6",
748 "php-coveralls/php-coveralls": "^2.1",
749 "phpunit/phpunit": "7.0",
750 "symfony/cache": "^3.4|^4.1",
751 "symfony/phpunit-bridge": "^4.2",
752 "symfony/property-info": "^3.4|^4.1",
753 "symfony/validator": "^3.4|^4.1",
754 "symfony/web-profiler-bundle": "^3.4|^4.1",
755 "symfony/yaml": "^3.4|^4.1",
756 "twig/twig": "^1.34|^2.4"
757 },
758 "suggest": {
759 "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
760 "symfony/web-profiler-bundle": "To use the data collector."
761 },
762 "type": "symfony-bundle",
763 "extra": {
764 "branch-alias": {
765 "dev-master": "1.11.x-dev"
766 }
767 },
768 "autoload": {
769 "psr-4": {
770 "Doctrine\\Bundle\\DoctrineBundle\\": ""
771 }
772 },
773 "notification-url": "https://packagist.org/downloads/",
774 "license": [
775 "MIT"
776 ],
777 "authors": [
778 {
779 "name": "Symfony Community",
780 "homepage": "http://symfony.com/contributors"
781 },
782 {
783 "name": "Benjamin Eberlei",
784 "email": "kontakt@beberlei.de"
785 },
786 {
787 "name": "Doctrine Project",
788 "homepage": "http://www.doctrine-project.org/"
789 },
790 {
791 "name": "Fabien Potencier",
792 "email": "fabien@symfony.com"
793 }
794 ],
795 "description": "Symfony DoctrineBundle",
796 "homepage": "http://www.doctrine-project.org",
797 "keywords": [
798 "database",
799 "dbal",
800 "orm",
801 "persistence"
802 ],
803 "time": "2019-06-04T07:35:05+00:00"
804 },
805 {
806 "name": "doctrine/doctrine-cache-bundle",
807 "version": "1.3.5",
808 "source": {
809 "type": "git",
810 "url": "https://github.com/doctrine/DoctrineCacheBundle.git",
811 "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927"
812 },
813 "dist": {
814 "type": "zip",
815 "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/5514c90d9fb595e1095e6d66ebb98ce9ef049927",
816 "reference": "5514c90d9fb595e1095e6d66ebb98ce9ef049927",
817 "shasum": ""
818 },
819 "require": {
820 "doctrine/cache": "^1.4.2",
821 "doctrine/inflector": "~1.0",
822 "php": ">=5.3.2",
823 "symfony/doctrine-bridge": "~2.7|~3.3|~4.0"
824 },
825 "require-dev": {
826 "instaclick/coding-standard": "~1.1",
827 "instaclick/object-calisthenics-sniffs": "dev-master",
828 "instaclick/symfony2-coding-standard": "dev-remaster",
829 "phpunit/phpunit": "~4.8.36|~5.6|~6.5|~7.0",
830 "predis/predis": "~0.8",
831 "satooshi/php-coveralls": "^1.0",
832 "squizlabs/php_codesniffer": "~1.5",
833 "symfony/console": "~2.7|~3.3|~4.0",
834 "symfony/finder": "~2.7|~3.3|~4.0",
835 "symfony/framework-bundle": "~2.7|~3.3|~4.0",
836 "symfony/phpunit-bridge": "~2.7|~3.3|~4.0",
837 "symfony/security-acl": "~2.7|~3.3",
838 "symfony/validator": "~2.7|~3.3|~4.0",
839 "symfony/yaml": "~2.7|~3.3|~4.0"
840 },
841 "suggest": {
842 "symfony/security-acl": "For using this bundle to cache ACLs"
843 },
844 "type": "symfony-bundle",
845 "extra": {
846 "branch-alias": {
847 "dev-master": "1.3.x-dev"
848 }
849 },
850 "autoload": {
851 "psr-4": {
852 "Doctrine\\Bundle\\DoctrineCacheBundle\\": ""
853 },
854 "exclude-from-classmap": [
855 "/Tests/"
856 ]
857 },
858 "notification-url": "https://packagist.org/downloads/",
859 "license": [
860 "MIT"
861 ],
862 "authors": [
863 {
864 "name": "Symfony Community",
865 "homepage": "http://symfony.com/contributors"
866 },
867 {
868 "name": "Benjamin Eberlei",
869 "email": "kontakt@beberlei.de"
870 },
871 {
872 "name": "Fabio B. Silva",
873 "email": "fabio.bat.silva@gmail.com"
874 },
875 {
876 "name": "Guilherme Blanco",
877 "email": "guilhermeblanco@hotmail.com"
878 },
879 {
880 "name": "Doctrine Project",
881 "homepage": "http://www.doctrine-project.org/"
882 },
883 {
884 "name": "Fabien Potencier",
885 "email": "fabien@symfony.com"
886 }
887 ],
888 "description": "Symfony Bundle for Doctrine Cache",
889 "homepage": "https://www.doctrine-project.org",
890 "keywords": [
891 "cache",
892 "caching"
893 ],
894 "time": "2018-11-09T06:25:35+00:00"
895 },
896 {
897 "name": "doctrine/doctrine-migrations-bundle",
898 "version": "v1.3.2",
899 "source": {
900 "type": "git",
901 "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git",
902 "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce"
903 },
904 "dist": {
905 "type": "zip",
906 "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/49fa399181db4bf4f9f725126bd1cb65c4398dce",
907 "reference": "49fa399181db4bf4f9f725126bd1cb65c4398dce",
908 "shasum": ""
909 },
910 "require": {
911 "doctrine/doctrine-bundle": "~1.0",
912 "doctrine/migrations": "^1.1",
913 "php": ">=5.4.0",
914 "symfony/framework-bundle": "~2.7|~3.3|~4.0"
915 },
916 "require-dev": {
917 "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^7.4"
918 },
919 "type": "symfony-bundle",
920 "extra": {
921 "branch-alias": {
922 "dev-master": "1.3-dev"
923 }
924 },
925 "autoload": {
926 "psr-4": {
927 "Doctrine\\Bundle\\MigrationsBundle\\": ""
928 }
929 },
930 "notification-url": "https://packagist.org/downloads/",
931 "license": [
932 "MIT"
933 ],
934 "authors": [
935 {
936 "name": "Symfony Community",
937 "homepage": "http://symfony.com/contributors"
938 },
939 {
940 "name": "Doctrine Project",
941 "homepage": "http://www.doctrine-project.org"
942 },
943 {
944 "name": "Fabien Potencier",
945 "email": "fabien@symfony.com"
946 }
947 ],
948 "description": "Symfony DoctrineMigrationsBundle",
949 "homepage": "http://www.doctrine-project.org",
950 "keywords": [
951 "dbal",
952 "migrations",
953 "schema"
954 ],
955 "time": "2018-12-03T11:55:33+00:00"
956 },
957 {
958 "name": "doctrine/event-manager",
959 "version": "v1.0.0",
960 "source": {
961 "type": "git",
962 "url": "https://github.com/doctrine/event-manager.git",
963 "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3"
964 },
965 "dist": {
966 "type": "zip",
967 "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3",
968 "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3",
969 "shasum": ""
970 },
971 "require": {
972 "php": "^7.1"
973 },
974 "conflict": {
975 "doctrine/common": "<2.9@dev"
976 },
977 "require-dev": {
978 "doctrine/coding-standard": "^4.0",
979 "phpunit/phpunit": "^7.0"
980 },
981 "type": "library",
982 "extra": {
983 "branch-alias": {
984 "dev-master": "1.0.x-dev"
985 }
986 },
987 "autoload": {
988 "psr-4": {
989 "Doctrine\\Common\\": "lib/Doctrine/Common"
990 }
991 },
992 "notification-url": "https://packagist.org/downloads/",
993 "license": [
994 "MIT"
995 ],
996 "authors": [
997 {
998 "name": "Roman Borschel",
999 "email": "roman@code-factory.org"
1000 },
1001 {
1002 "name": "Benjamin Eberlei",
1003 "email": "kontakt@beberlei.de"
1004 },
1005 {
1006 "name": "Guilherme Blanco",
1007 "email": "guilhermeblanco@gmail.com"
1008 },
1009 {
1010 "name": "Jonathan Wage",
1011 "email": "jonwage@gmail.com"
1012 },
1013 {
1014 "name": "Johannes Schmitt",
1015 "email": "schmittjoh@gmail.com"
1016 },
1017 {
1018 "name": "Marco Pivetta",
1019 "email": "ocramius@gmail.com"
1020 }
1021 ],
1022 "description": "Doctrine Event Manager component",
1023 "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
1024 "keywords": [
1025 "event",
1026 "eventdispatcher",
1027 "eventmanager"
1028 ],
1029 "time": "2018-06-11T11:59:03+00:00"
1030 },
1031 {
1032 "name": "doctrine/inflector",
1033 "version": "v1.3.0",
1034 "source": {
1035 "type": "git",
1036 "url": "https://github.com/doctrine/inflector.git",
1037 "reference": "5527a48b7313d15261292c149e55e26eae771b0a"
1038 },
1039 "dist": {
1040 "type": "zip",
1041 "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a",
1042 "reference": "5527a48b7313d15261292c149e55e26eae771b0a",
1043 "shasum": ""
1044 },
1045 "require": {
1046 "php": "^7.1"
1047 },
1048 "require-dev": {
1049 "phpunit/phpunit": "^6.2"
1050 },
1051 "type": "library",
1052 "extra": {
1053 "branch-alias": {
1054 "dev-master": "1.3.x-dev"
1055 }
1056 },
1057 "autoload": {
1058 "psr-4": {
1059 "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
1060 }
1061 },
1062 "notification-url": "https://packagist.org/downloads/",
1063 "license": [
1064 "MIT"
1065 ],
1066 "authors": [
1067 {
1068 "name": "Roman Borschel",
1069 "email": "roman@code-factory.org"
1070 },
1071 {
1072 "name": "Benjamin Eberlei",
1073 "email": "kontakt@beberlei.de"
1074 },
1075 {
1076 "name": "Guilherme Blanco",
1077 "email": "guilhermeblanco@gmail.com"
1078 },
1079 {
1080 "name": "Jonathan Wage",
1081 "email": "jonwage@gmail.com"
1082 },
1083 {
1084 "name": "Johannes Schmitt",
1085 "email": "schmittjoh@gmail.com"
1086 }
1087 ],
1088 "description": "Common String Manipulations with regard to casing and singular/plural rules.",
1089 "homepage": "http://www.doctrine-project.org",
1090 "keywords": [
1091 "inflection",
1092 "pluralize",
1093 "singularize",
1094 "string"
1095 ],
1096 "time": "2018-01-09T20:05:19+00:00"
1097 },
1098 {
1099 "name": "doctrine/instantiator",
1100 "version": "1.2.0",
1101 "source": {
1102 "type": "git",
1103 "url": "https://github.com/doctrine/instantiator.git",
1104 "reference": "a2c590166b2133a4633738648b6b064edae0814a"
1105 },
1106 "dist": {
1107 "type": "zip",
1108 "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a",
1109 "reference": "a2c590166b2133a4633738648b6b064edae0814a",
1110 "shasum": ""
1111 },
1112 "require": {
1113 "php": "^7.1"
1114 },
1115 "require-dev": {
1116 "doctrine/coding-standard": "^6.0",
1117 "ext-pdo": "*",
1118 "ext-phar": "*",
1119 "phpbench/phpbench": "^0.13",
1120 "phpstan/phpstan-phpunit": "^0.11",
1121 "phpstan/phpstan-shim": "^0.11",
1122 "phpunit/phpunit": "^7.0"
1123 },
1124 "type": "library",
1125 "extra": {
1126 "branch-alias": {
1127 "dev-master": "1.2.x-dev"
1128 }
1129 },
1130 "autoload": {
1131 "psr-4": {
1132 "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
1133 }
1134 },
1135 "notification-url": "https://packagist.org/downloads/",
1136 "license": [
1137 "MIT"
1138 ],
1139 "authors": [
1140 {
1141 "name": "Marco Pivetta",
1142 "email": "ocramius@gmail.com",
1143 "homepage": "http://ocramius.github.com/"
1144 }
1145 ],
1146 "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
1147 "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
1148 "keywords": [
1149 "constructor",
1150 "instantiate"
1151 ],
1152 "time": "2019-03-17T17:37:11+00:00"
1153 },
1154 {
1155 "name": "doctrine/lexer",
1156 "version": "v1.0.1",
1157 "source": {
1158 "type": "git",
1159 "url": "https://github.com/doctrine/lexer.git",
1160 "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
1161 },
1162 "dist": {
1163 "type": "zip",
1164 "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
1165 "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
1166 "shasum": ""
1167 },
1168 "require": {
1169 "php": ">=5.3.2"
1170 },
1171 "type": "library",
1172 "extra": {
1173 "branch-alias": {
1174 "dev-master": "1.0.x-dev"
1175 }
1176 },
1177 "autoload": {
1178 "psr-0": {
1179 "Doctrine\\Common\\Lexer\\": "lib/"
1180 }
1181 },
1182 "notification-url": "https://packagist.org/downloads/",
1183 "license": [
1184 "MIT"
1185 ],
1186 "authors": [
1187 {
1188 "name": "Roman Borschel",
1189 "email": "roman@code-factory.org"
1190 },
1191 {
1192 "name": "Guilherme Blanco",
1193 "email": "guilhermeblanco@gmail.com"
1194 },
1195 {
1196 "name": "Johannes Schmitt",
1197 "email": "schmittjoh@gmail.com"
1198 }
1199 ],
1200 "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
1201 "homepage": "http://www.doctrine-project.org",
1202 "keywords": [
1203 "lexer",
1204 "parser"
1205 ],
1206 "time": "2014-09-09T13:34:57+00:00"
1207 },
1208 {
1209 "name": "doctrine/migrations",
1210 "version": "v1.8.1",
1211 "source": {
1212 "type": "git",
1213 "url": "https://github.com/doctrine/migrations.git",
1214 "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6"
1215 },
1216 "dist": {
1217 "type": "zip",
1218 "url": "https://api.github.com/repos/doctrine/migrations/zipball/215438c0eef3e5f9b7da7d09c6b90756071b43e6",
1219 "reference": "215438c0eef3e5f9b7da7d09c6b90756071b43e6",
1220 "shasum": ""
1221 },
1222 "require": {
1223 "doctrine/dbal": "~2.6",
1224 "ocramius/proxy-manager": "^1.0|^2.0",
1225 "php": "^7.1",
1226 "symfony/console": "~3.3|^4.0"
1227 },
1228 "require-dev": {
1229 "doctrine/coding-standard": "^1.0",
1230 "doctrine/orm": "~2.5",
1231 "jdorn/sql-formatter": "~1.1",
1232 "mikey179/vfsstream": "^1.6",
1233 "phpunit/phpunit": "~7.0",
1234 "squizlabs/php_codesniffer": "^3.0",
1235 "symfony/yaml": "~3.3|^4.0"
1236 },
1237 "suggest": {
1238 "jdorn/sql-formatter": "Allows to generate formatted SQL with the diff command.",
1239 "symfony/yaml": "Allows the use of yaml for migration configuration files."
1240 },
1241 "bin": [
1242 "bin/doctrine-migrations"
1243 ],
1244 "type": "library",
1245 "extra": {
1246 "branch-alias": {
1247 "dev-master": "v1.8.x-dev"
1248 }
1249 },
1250 "autoload": {
1251 "psr-4": {
1252 "Doctrine\\DBAL\\Migrations\\": "lib/Doctrine/DBAL/Migrations",
1253 "Doctrine\\Migrations\\": "lib/Doctrine/Migrations"
1254 }
1255 },
1256 "notification-url": "https://packagist.org/downloads/",
1257 "license": [
1258 "MIT"
1259 ],
1260 "authors": [
1261 {
1262 "name": "Benjamin Eberlei",
1263 "email": "kontakt@beberlei.de"
1264 },
1265 {
1266 "name": "Jonathan Wage",
1267 "email": "jonwage@gmail.com"
1268 },
1269 {
1270 "name": "Michael Simonson",
1271 "email": "contact@mikesimonson.com"
1272 }
1273 ],
1274 "description": "Database Schema migrations using Doctrine DBAL",
1275 "homepage": "https://www.doctrine-project.org/projects/migrations.html",
1276 "keywords": [
1277 "database",
1278 "migrations"
1279 ],
1280 "time": "2018-06-06T21:00:30+00:00"
1281 },
1282 {
1283 "name": "doctrine/orm",
1284 "version": "v2.6.3",
1285 "source": {
1286 "type": "git",
1287 "url": "https://github.com/doctrine/orm.git",
1288 "reference": "434820973cadf2da2d66e7184be370084cc32ca8"
1289 },
1290 "dist": {
1291 "type": "zip",
1292 "url": "https://api.github.com/repos/doctrine/orm/zipball/434820973cadf2da2d66e7184be370084cc32ca8",
1293 "reference": "434820973cadf2da2d66e7184be370084cc32ca8",
1294 "shasum": ""
1295 },
1296 "require": {
1297 "doctrine/annotations": "~1.5",
1298 "doctrine/cache": "~1.6",
1299 "doctrine/collections": "^1.4",
1300 "doctrine/common": "^2.7.1",
1301 "doctrine/dbal": "^2.6",
1302 "doctrine/instantiator": "~1.1",
1303 "ext-pdo": "*",
1304 "php": "^7.1",
1305 "symfony/console": "~3.0|~4.0"
1306 },
1307 "require-dev": {
1308 "doctrine/coding-standard": "^1.0",
1309 "phpunit/phpunit": "^6.5",
1310 "squizlabs/php_codesniffer": "^3.2",
1311 "symfony/yaml": "~3.4|~4.0"
1312 },
1313 "suggest": {
1314 "symfony/yaml": "If you want to use YAML Metadata Mapping Driver"
1315 },
1316 "bin": [
1317 "bin/doctrine"
1318 ],
1319 "type": "library",
1320 "extra": {
1321 "branch-alias": {
1322 "dev-master": "2.6.x-dev"
1323 }
1324 },
1325 "autoload": {
1326 "psr-4": {
1327 "Doctrine\\ORM\\": "lib/Doctrine/ORM"
1328 }
1329 },
1330 "notification-url": "https://packagist.org/downloads/",
1331 "license": [
1332 "MIT"
1333 ],
1334 "authors": [
1335 {
1336 "name": "Roman Borschel",
1337 "email": "roman@code-factory.org"
1338 },
1339 {
1340 "name": "Benjamin Eberlei",
1341 "email": "kontakt@beberlei.de"
1342 },
1343 {
1344 "name": "Guilherme Blanco",
1345 "email": "guilhermeblanco@gmail.com"
1346 },
1347 {
1348 "name": "Jonathan Wage",
1349 "email": "jonwage@gmail.com"
1350 },
1351 {
1352 "name": "Marco Pivetta",
1353 "email": "ocramius@gmail.com"
1354 }
1355 ],
1356 "description": "Object-Relational-Mapper for PHP",
1357 "homepage": "http://www.doctrine-project.org",
1358 "keywords": [
1359 "database",
1360 "orm"
1361 ],
1362 "time": "2018-11-20T23:46:46+00:00"
1363 },
1364 {
1365 "name": "doctrine/persistence",
1366 "version": "1.1.1",
1367 "source": {
1368 "type": "git",
1369 "url": "https://github.com/doctrine/persistence.git",
1370 "reference": "3da7c9d125591ca83944f477e65ed3d7b4617c48"
1371 },
1372 "dist": {
1373 "type": "zip",
1374 "url": "https://api.github.com/repos/doctrine/persistence/zipball/3da7c9d125591ca83944f477e65ed3d7b4617c48",
1375 "reference": "3da7c9d125591ca83944f477e65ed3d7b4617c48",
1376 "shasum": ""
1377 },
1378 "require": {
1379 "doctrine/annotations": "^1.0",
1380 "doctrine/cache": "^1.0",
1381 "doctrine/collections": "^1.0",
1382 "doctrine/event-manager": "^1.0",
1383 "doctrine/reflection": "^1.0",
1384 "php": "^7.1"
1385 },
1386 "conflict": {
1387 "doctrine/common": "<2.10@dev"
1388 },
1389 "require-dev": {
1390 "doctrine/coding-standard": "^5.0",
1391 "phpstan/phpstan": "^0.8",
1392 "phpunit/phpunit": "^7.0"
1393 },
1394 "type": "library",
1395 "extra": {
1396 "branch-alias": {
1397 "dev-master": "1.1.x-dev"
1398 }
1399 },
1400 "autoload": {
1401 "psr-4": {
1402 "Doctrine\\Common\\": "lib/Doctrine/Common"
1403 }
1404 },
1405 "notification-url": "https://packagist.org/downloads/",
1406 "license": [
1407 "MIT"
1408 ],
1409 "authors": [
1410 {
1411 "name": "Roman Borschel",
1412 "email": "roman@code-factory.org"
1413 },
1414 {
1415 "name": "Benjamin Eberlei",
1416 "email": "kontakt@beberlei.de"
1417 },
1418 {
1419 "name": "Guilherme Blanco",
1420 "email": "guilhermeblanco@gmail.com"
1421 },
1422 {
1423 "name": "Jonathan Wage",
1424 "email": "jonwage@gmail.com"
1425 },
1426 {
1427 "name": "Johannes Schmitt",
1428 "email": "schmittjoh@gmail.com"
1429 },
1430 {
1431 "name": "Marco Pivetta",
1432 "email": "ocramius@gmail.com"
1433 }
1434 ],
1435 "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.",
1436 "homepage": "https://doctrine-project.org/projects/persistence.html",
1437 "keywords": [
1438 "mapper",
1439 "object",
1440 "odm",
1441 "orm",
1442 "persistence"
1443 ],
1444 "time": "2019-04-23T08:28:24+00:00"
1445 },
1446 {
1447 "name": "doctrine/reflection",
1448 "version": "v1.0.0",
1449 "source": {
1450 "type": "git",
1451 "url": "https://github.com/doctrine/reflection.git",
1452 "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6"
1453 },
1454 "dist": {
1455 "type": "zip",
1456 "url": "https://api.github.com/repos/doctrine/reflection/zipball/02538d3f95e88eb397a5f86274deb2c6175c2ab6",
1457 "reference": "02538d3f95e88eb397a5f86274deb2c6175c2ab6",
1458 "shasum": ""
1459 },
1460 "require": {
1461 "doctrine/annotations": "^1.0",
1462 "ext-tokenizer": "*",
1463 "php": "^7.1"
1464 },
1465 "require-dev": {
1466 "doctrine/coding-standard": "^4.0",
1467 "doctrine/common": "^2.8",
1468 "phpstan/phpstan": "^0.9.2",
1469 "phpstan/phpstan-phpunit": "^0.9.4",
1470 "phpunit/phpunit": "^7.0",
1471 "squizlabs/php_codesniffer": "^3.0"
1472 },
1473 "type": "library",
1474 "extra": {
1475 "branch-alias": {
1476 "dev-master": "1.0.x-dev"
1477 }
1478 },
1479 "autoload": {
1480 "psr-4": {
1481 "Doctrine\\Common\\": "lib/Doctrine/Common"
1482 }
1483 },
1484 "notification-url": "https://packagist.org/downloads/",
1485 "license": [
1486 "MIT"
1487 ],
1488 "authors": [
1489 {
1490 "name": "Roman Borschel",
1491 "email": "roman@code-factory.org"
1492 },
1493 {
1494 "name": "Benjamin Eberlei",
1495 "email": "kontakt@beberlei.de"
1496 },
1497 {
1498 "name": "Guilherme Blanco",
1499 "email": "guilhermeblanco@gmail.com"
1500 },
1501 {
1502 "name": "Jonathan Wage",
1503 "email": "jonwage@gmail.com"
1504 },
1505 {
1506 "name": "Johannes Schmitt",
1507 "email": "schmittjoh@gmail.com"
1508 },
1509 {
1510 "name": "Marco Pivetta",
1511 "email": "ocramius@gmail.com"
1512 }
1513 ],
1514 "description": "Doctrine Reflection component",
1515 "homepage": "https://www.doctrine-project.org/projects/reflection.html",
1516 "keywords": [
1517 "reflection"
1518 ],
1519 "time": "2018-06-14T14:45:07+00:00"
1520 },
1521 {
1522 "name": "egulias/email-validator",
1523 "version": "2.1.8",
1524 "source": {
1525 "type": "git",
1526 "url": "https://github.com/egulias/EmailValidator.git",
1527 "reference": "c26463ff9241f27907112fbcd0c86fa670cfef98"
1528 },
1529 "dist": {
1530 "type": "zip",
1531 "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/c26463ff9241f27907112fbcd0c86fa670cfef98",
1532 "reference": "c26463ff9241f27907112fbcd0c86fa670cfef98",
1533 "shasum": ""
1534 },
1535 "require": {
1536 "doctrine/lexer": "^1.0.1",
1537 "php": ">= 5.5"
1538 },
1539 "require-dev": {
1540 "dominicsayers/isemail": "dev-master",
1541 "phpunit/phpunit": "^4.8.35||^5.7||^6.0",
1542 "satooshi/php-coveralls": "^1.0.1"
1543 },
1544 "suggest": {
1545 "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
1546 },
1547 "type": "library",
1548 "extra": {
1549 "branch-alias": {
1550 "dev-master": "2.0.x-dev"
1551 }
1552 },
1553 "autoload": {
1554 "psr-4": {
1555 "Egulias\\EmailValidator\\": "EmailValidator"
1556 }
1557 },
1558 "notification-url": "https://packagist.org/downloads/",
1559 "license": [
1560 "MIT"
1561 ],
1562 "authors": [
1563 {
1564 "name": "Eduardo Gulias Davis"
1565 }
1566 ],
1567 "description": "A library for validating emails against several RFCs",
1568 "homepage": "https://github.com/egulias/EmailValidator",
1569 "keywords": [
1570 "email",
1571 "emailvalidation",
1572 "emailvalidator",
1573 "validation",
1574 "validator"
1575 ],
1576 "time": "2019-05-16T22:02:54+00:00"
1577 },
1578 {
1579 "name": "electrolinux/php-html5lib",
1580 "version": "0.1.0",
1581 "source": {
1582 "type": "git",
1583 "url": "https://github.com/electrolinux/php-html5lib.git",
1584 "reference": "9f92154993c7ecb120d9f9c0e558660d32846721"
1585 },
1586 "dist": {
1587 "type": "zip",
1588 "url": "https://api.github.com/repos/electrolinux/php-html5lib/zipball/9f92154993c7ecb120d9f9c0e558660d32846721",
1589 "reference": "9f92154993c7ecb120d9f9c0e558660d32846721",
1590 "shasum": ""
1591 },
1592 "require": {
1593 "php": ">=5.3.2"
1594 },
1595 "type": "library",
1596 "autoload": {
1597 "psr-0": {
1598 "HTML5Lib": "src/",
1599 "HTML5Lib\\Tests": "tests/"
1600 }
1601 },
1602 "notification-url": "https://packagist.org/downloads/",
1603 "license": [
1604 "MIT"
1605 ],
1606 "authors": [
1607 {
1608 "name": "Multiple users",
1609 "homepage": "https://code.google.com/p/html5lib/",
1610 "role": "Original developers"
1611 },
1612 {
1613 "name": "Sébastien Lavoie",
1614 "homepage": "http://blog.lavoie.sl",
1615 "role": "Packager"
1616 },
1617 {
1618 "name": "didier Belot",
1619 "role": "Packager"
1620 }
1621 ],
1622 "description": "A PHP implementations of a HTML parser based on the WHATWG HTML5 specification.",
1623 "homepage": "https://github.com/electrolinux/php-html5lib",
1624 "keywords": [
1625 "HTML5",
1626 "php"
1627 ],
1628 "time": "2013-03-18T18:32:30+00:00"
1629 },
1630 {
1631 "name": "fig/link-util",
1632 "version": "1.0.0",
1633 "source": {
1634 "type": "git",
1635 "url": "https://github.com/php-fig/link-util.git",
1636 "reference": "1a07821801a148be4add11ab0603e4af55a72fac"
1637 },
1638 "dist": {
1639 "type": "zip",
1640 "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac",
1641 "reference": "1a07821801a148be4add11ab0603e4af55a72fac",
1642 "shasum": ""
1643 },
1644 "require": {
1645 "php": ">=5.5.0",
1646 "psr/link": "~1.0@dev"
1647 },
1648 "require-dev": {
1649 "phpunit/phpunit": "^5.1",
1650 "squizlabs/php_codesniffer": "^2.3.1"
1651 },
1652 "type": "library",
1653 "extra": {
1654 "branch-alias": {
1655 "dev-master": "1.0.x-dev"
1656 }
1657 },
1658 "autoload": {
1659 "psr-4": {
1660 "Fig\\Link\\": "src/"
1661 }
1662 },
1663 "notification-url": "https://packagist.org/downloads/",
1664 "license": [
1665 "MIT"
1666 ],
1667 "authors": [
1668 {
1669 "name": "PHP-FIG",
1670 "homepage": "http://www.php-fig.org/"
1671 }
1672 ],
1673 "description": "Common utility implementations for HTTP links",
1674 "keywords": [
1675 "http",
1676 "http-link",
1677 "link",
1678 "psr",
1679 "psr-13",
1680 "rest"
1681 ],
1682 "time": "2016-10-17T18:31:11+00:00"
1683 },
1684 {
1685 "name": "fossar/htmlawed",
1686 "version": "1.2.7",
1687 "source": {
1688 "type": "git",
1689 "url": "https://github.com/fossar/HTMLawed.git",
1690 "reference": "4f7505e9622a96242923895c3008719b2c2283d3"
1691 },
1692 "dist": {
1693 "type": "zip",
1694 "url": "https://api.github.com/repos/fossar/HTMLawed/zipball/4f7505e9622a96242923895c3008719b2c2283d3",
1695 "reference": "4f7505e9622a96242923895c3008719b2c2283d3",
1696 "shasum": ""
1697 },
1698 "require": {
1699 "php": ">4.4.0"
1700 },
1701 "replace": {
1702 "htmlawed/htmlawed": "*"
1703 },
1704 "type": "library",
1705 "autoload": {
1706 "files": [
1707 "htmLawed.php"
1708 ]
1709 },
1710 "notification-url": "https://packagist.org/downloads/",
1711 "license": [
1712 "GPL-2.0+",
1713 "LGPL-3.0"
1714 ],
1715 "authors": [
1716 {
1717 "name": "Santosh Patnaik",
1718 "homepage": "http://www.bioinformatics.org/people/index.php?user_hash=558b661f92d0ff7b",
1719 "role": "Developer"
1720 }
1721 ],
1722 "description": "htmLawed - Process text with HTML markup to make it more compliant with HTML standards and administrative policies",
1723 "homepage": "http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/",
1724 "keywords": [
1725 "HTMLtidy",
1726 "html",
1727 "sanitize",
1728 "strip",
1729 "tags"
1730 ],
1731 "time": "2019-05-09T11:53:40+00:00"
1732 },
1733 {
1734 "name": "friendsofsymfony/jsrouting-bundle",
1735 "version": "2.3.0",
1736 "source": {
1737 "type": "git",
1738 "url": "https://github.com/FriendsOfSymfony/FOSJsRoutingBundle.git",
1739 "reference": "c24d1820da8b6ec55cb2023b456f1d49dd2cbe62"
1740 },
1741 "dist": {
1742 "type": "zip",
1743 "url": "https://api.github.com/repos/FriendsOfSymfony/FOSJsRoutingBundle/zipball/c24d1820da8b6ec55cb2023b456f1d49dd2cbe62",
1744 "reference": "c24d1820da8b6ec55cb2023b456f1d49dd2cbe62",
1745 "shasum": ""
1746 },
1747 "require": {
1748 "php": "^5.3.9|^7.0",
1749 "symfony/console": "~2.7||~3.0|^4.0",
1750 "symfony/framework-bundle": "~2.7||~3.0|^4.0",
1751 "symfony/serializer": "~2.7||~3.0|^4.0",
1752 "willdurand/jsonp-callback-validator": "~1.0"
1753 },
1754 "require-dev": {
1755 "symfony/expression-language": "~2.7||~3.0|^4.0",
1756 "symfony/phpunit-bridge": "^3.3|^4.0"
1757 },
1758 "type": "symfony-bundle",
1759 "extra": {
1760 "branch-alias": {
1761 "dev-master": "2.0-dev"
1762 }
1763 },
1764 "autoload": {
1765 "psr-4": {
1766 "FOS\\JsRoutingBundle\\": ""
1767 },
1768 "exclude-from-classmap": [
1769 "/Tests/"
1770 ]
1771 },
1772 "notification-url": "https://packagist.org/downloads/",
1773 "license": [
1774 "MIT"
1775 ],
1776 "authors": [
1777 {
1778 "name": "FriendsOfSymfony Community",
1779 "homepage": "https://github.com/friendsofsymfony/FOSJsRoutingBundle/contributors"
1780 },
1781 {
1782 "name": "William Durand",
1783 "email": "will+git@drnd.me"
1784 }
1785 ],
1786 "description": "A pretty nice way to expose your Symfony2 routing to client applications.",
1787 "homepage": "http://friendsofsymfony.github.com",
1788 "keywords": [
1789 "Js Routing",
1790 "javascript",
1791 "routing"
1792 ],
1793 "time": "2019-02-03T16:01:06+00:00"
1794 },
1795 {
1796 "name": "friendsofsymfony/oauth-server-bundle",
1797 "version": "1.6.2",
1798 "source": {
1799 "type": "git",
1800 "url": "https://github.com/FriendsOfSymfony/FOSOAuthServerBundle.git",
1801 "reference": "fcaa25cc49474bdb0db7894f880976fe76ffed23"
1802 },
1803 "dist": {
1804 "type": "zip",
1805 "url": "https://api.github.com/repos/FriendsOfSymfony/FOSOAuthServerBundle/zipball/fcaa25cc49474bdb0db7894f880976fe76ffed23",
1806 "reference": "fcaa25cc49474bdb0db7894f880976fe76ffed23",
1807 "shasum": ""
1808 },
1809 "require": {
1810 "friendsofsymfony/oauth2-php": "~1.1",
1811 "paragonie/random_compat": "^1|^2",
1812 "php": "^5.5|^7.0",
1813 "symfony/dependency-injection": "^2.8|~3.0|^4.0",
1814 "symfony/framework-bundle": "~2.8|~3.0|^4.0",
1815 "symfony/security-bundle": "~2.8|~3.0|^4.0"
1816 },
1817 "require-dev": {
1818 "doctrine/doctrine-bundle": "~1.0",
1819 "doctrine/mongodb-odm": "~1.0",
1820 "doctrine/orm": "~2.2",
1821 "phing/phing": "~2.4",
1822 "php-mock/php-mock-phpunit": "^1.1",
1823 "phpunit/phpunit": "~4.8|~5.0",
1824 "propel/propel1": "^1.6.5",
1825 "symfony/class-loader": "~2.8|~3.0|^4.0",
1826 "symfony/console": "~2.8|~3.0|^4.0",
1827 "symfony/form": "~2.8|~3.0|^4.0",
1828 "symfony/phpunit-bridge": "~2.8|~3.0|^4.0",
1829 "symfony/templating": "~2.8|~3.0|^4.0",
1830 "symfony/twig-bundle": "~2.8|~3.0|^4.0",
1831 "symfony/yaml": "~2.8|~3.0|^4.0",
1832 "willdurand/propel-typehintable-behavior": "^1.0.4"
1833 },
1834 "suggest": {
1835 "doctrine/doctrine-bundle": "*",
1836 "doctrine/mongodb-odm-bundle": "*",
1837 "propel/propel-bundle": "If you want to use Propel with Symfony2, then you will have to install the PropelBundle",
1838 "symfony/console": "Needed to be able to use commands",
1839 "symfony/form": "Needed to be able to use the AuthorizeFormType",
1840 "willdurand/propel-typehintable-behavior": "The Typehintable behavior is useful to add type hints on generated methods, to be compliant with interfaces"
1841 },
1842 "type": "symfony-bundle",
1843 "extra": {
1844 "branch-alias": {
1845 "dev-master": "1.5-dev"
1846 }
1847 },
1848 "autoload": {
1849 "psr-4": {
1850 "FOS\\OAuthServerBundle\\": ""
1851 },
1852 "exclude-from-classmap": [
1853 "/Tests/"
1854 ]
1855 },
1856 "notification-url": "https://packagist.org/downloads/",
1857 "license": [
1858 "MIT"
1859 ],
1860 "authors": [
1861 {
1862 "name": "Arnaud Le Blanc",
1863 "email": "arnaud.lb@gmail.com"
1864 },
1865 {
1866 "name": "FriendsOfSymfony Community",
1867 "homepage": "https://github.com/FriendsOfSymfony/FOSOAuthServerBundle/contributors"
1868 }
1869 ],
1870 "description": "Symfony2 OAuth Server Bundle",
1871 "homepage": "http://friendsofsymfony.github.com",
1872 "keywords": [
1873 "oauth",
1874 "oauth2",
1875 "server"
1876 ],
1877 "time": "2019-01-23T15:23:04+00:00"
1878 },
1879 {
1880 "name": "friendsofsymfony/oauth2-php",
1881 "version": "1.2.3",
1882 "source": {
1883 "type": "git",
1884 "url": "https://github.com/FriendsOfSymfony/oauth2-php.git",
1885 "reference": "a41fef63f81ef2ef632350a6c7dc66d15baa9240"
1886 },
1887 "dist": {
1888 "type": "zip",
1889 "url": "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/a41fef63f81ef2ef632350a6c7dc66d15baa9240",
1890 "reference": "a41fef63f81ef2ef632350a6c7dc66d15baa9240",
1891 "shasum": ""
1892 },
1893 "require": {
1894 "php": "^5.5.9|>=7.0.8",
1895 "symfony/http-foundation": "~3.0|~4.0"
1896 },
1897 "require-dev": {
1898 "phpunit/phpunit": "~4.0"
1899 },
1900 "type": "library",
1901 "extra": {
1902 "branch-alias": {
1903 "dev-master": "1.2.x-dev"
1904 }
1905 },
1906 "autoload": {
1907 "psr-4": {
1908 "OAuth2\\": "lib/"
1909 }
1910 },
1911 "notification-url": "https://packagist.org/downloads/",
1912 "license": [
1913 "MIT"
1914 ],
1915 "authors": [
1916 {
1917 "name": "Arnaud Le Blanc",
1918 "email": "arnaud.lb@gmail.com"
1919 },
1920 {
1921 "name": "FriendsOfSymfony Community",
1922 "homepage": "https://github.com/FriendsOfSymfony/oauth2-php/contributors"
1923 }
1924 ],
1925 "description": "OAuth2 library",
1926 "homepage": "https://github.com/FriendsOfSymfony/oauth2-php",
1927 "keywords": [
1928 "oauth",
1929 "oauth2"
1930 ],
1931 "time": "2018-01-30T19:58:25+00:00"
1932 },
1933 {
1934 "name": "friendsofsymfony/rest-bundle",
1935 "version": "2.5.0",
1936 "source": {
1937 "type": "git",
1938 "url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
1939 "reference": "a5fc73b84bdb2f0fdf58a717b322ceb6997f7bf3"
1940 },
1941 "dist": {
1942 "type": "zip",
1943 "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/a5fc73b84bdb2f0fdf58a717b322ceb6997f7bf3",
1944 "reference": "a5fc73b84bdb2f0fdf58a717b322ceb6997f7bf3",
1945 "shasum": ""
1946 },
1947 "require": {
1948 "doctrine/inflector": "^1.0",
1949 "php": "^5.5.9|~7.0",
1950 "psr/log": "^1.0",
1951 "symfony/config": "^3.4|^4.0",
1952 "symfony/debug": "^3.4|^4.0",
1953 "symfony/dependency-injection": "^3.4|^4.0",
1954 "symfony/event-dispatcher": "^3.4|^4.0",
1955 "symfony/finder": "^3.4|^4.0",
1956 "symfony/framework-bundle": "^3.4|^4.0",
1957 "symfony/http-foundation": "^3.4|^4.0",
1958 "symfony/http-kernel": "^3.4|^4.0",
1959 "symfony/routing": "^3.4|^4.0",
1960 "symfony/security-core": "^3.4|^4.0",
1961 "symfony/templating": "^3.4|^4.0",
1962 "willdurand/jsonp-callback-validator": "^1.0",
1963 "willdurand/negotiation": "^2.0"
1964 },
1965 "conflict": {
1966 "jms/serializer": "<1.13.0",
1967 "jms/serializer-bundle": "<2.0.0",
1968 "sensio/framework-extra-bundle": "<3.0.13"
1969 },
1970 "require-dev": {
1971 "jms/serializer": "^1.13|^2.0",
1972 "jms/serializer-bundle": "^2.3.1|^3.0",
1973 "phpoption/phpoption": "^1.1",
1974 "psr/http-message": "^1.0",
1975 "sensio/framework-extra-bundle": "^3.0.13|^4.0|^5.0",
1976 "symfony/asset": "^3.4|^4.0",
1977 "symfony/browser-kit": "^3.4|^4.0",
1978 "symfony/css-selector": "^3.4|^4.0",
1979 "symfony/dependency-injection": "^2.7.20|^3.0|^4.0",
1980 "symfony/expression-language": "~2.7|^3.0|^4.0",
1981 "symfony/form": "^3.4|^4.0",
1982 "symfony/phpunit-bridge": "^4.1.8",
1983 "symfony/security-bundle": "^3.4|^4.0",
1984 "symfony/serializer": "^2.7.11|^3.0.4|^4.0",
1985 "symfony/twig-bundle": "^3.4|^4.0",
1986 "symfony/validator": "^3.4|^4.0",
1987 "symfony/web-profiler-bundle": "^3.4|^4.0",
1988 "symfony/yaml": "^3.4|^4.0"
1989 },
1990 "suggest": {
1991 "jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ^2.0|^3.0",
1992 "sensio/framework-extra-bundle": "Add support for the request body converter and the view response listener, requires ^3.0",
1993 "symfony/expression-language": "Add support for using the expression language in the routing, requires ^2.7|^3.0",
1994 "symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ^2.7|^3.0",
1995 "symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ^2.7|^3.0"
1996 },
1997 "type": "symfony-bundle",
1998 "extra": {
1999 "branch-alias": {
2000 "dev-master": "2.5-dev"
2001 }
2002 },
2003 "autoload": {
2004 "psr-4": {
2005 "FOS\\RestBundle\\": ""
2006 },
2007 "exclude-from-classmap": [
2008 "Tests/"
2009 ]
2010 },
2011 "notification-url": "https://packagist.org/downloads/",
2012 "license": [
2013 "MIT"
2014 ],
2015 "authors": [
2016 {
2017 "name": "Lukas Kahwe Smith",
2018 "email": "smith@pooteeweet.org"
2019 },
2020 {
2021 "name": "FriendsOfSymfony Community",
2022 "homepage": "https://github.com/friendsofsymfony/FOSRestBundle/contributors"
2023 },
2024 {
2025 "name": "Konstantin Kudryashov",
2026 "email": "ever.zet@gmail.com"
2027 }
2028 ],
2029 "description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony",
2030 "homepage": "http://friendsofsymfony.github.com",
2031 "keywords": [
2032 "rest"
2033 ],
2034 "time": "2019-01-03T13:05:12+00:00"
2035 },
2036 {
2037 "name": "friendsofsymfony/user-bundle",
2038 "version": "v2.0.2",
2039 "source": {
2040 "type": "git",
2041 "url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git",
2042 "reference": "2fc8a023d7ab482321cf7ec810ed49eab40eb50f"
2043 },
2044 "dist": {
2045 "type": "zip",
2046 "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/2fc8a023d7ab482321cf7ec810ed49eab40eb50f",
2047 "reference": "2fc8a023d7ab482321cf7ec810ed49eab40eb50f",
2048 "shasum": ""
2049 },
2050 "require": {
2051 "paragonie/random_compat": "^1 || ^2",
2052 "php": "^5.5.9 || ^7.0",
2053 "symfony/form": "^2.7 || ^3.0",
2054 "symfony/framework-bundle": "^2.7 || ^3.0",
2055 "symfony/security-bundle": "^2.7 || ^3.0",
2056 "symfony/templating": "^2.7 || ^3.0",
2057 "symfony/twig-bundle": "^2.7 || ^3.0",
2058 "twig/twig": "^1.28 || ^2.0"
2059 },
2060 "conflict": {
2061 "doctrine/doctrine-bundle": "<1.3",
2062 "symfony/doctrine-bridge": "<2.7"
2063 },
2064 "require-dev": {
2065 "doctrine/doctrine-bundle": "^1.3",
2066 "friendsofphp/php-cs-fixer": "^1.11",
2067 "phpunit/phpunit": "~4.8|~5.0",
2068 "swiftmailer/swiftmailer": "^4.3 || ^5.0 || ^6.0",
2069 "symfony/console": "^2.7 || ^3.0",
2070 "symfony/phpunit-bridge": "^2.7 || ^3.0",
2071 "symfony/validator": "^2.7 || ^3.0",
2072 "symfony/yaml": "^2.7 || ^3.0"
2073 },
2074 "type": "symfony-bundle",
2075 "extra": {
2076 "branch-alias": {
2077 "dev-master": "2.0.x-dev"
2078 }
2079 },
2080 "autoload": {
2081 "psr-4": {
2082 "FOS\\UserBundle\\": ""
2083 },
2084 "exclude-from-classmap": [
2085 "/Tests/"
2086 ]
2087 },
2088 "notification-url": "https://packagist.org/downloads/",
2089 "license": [
2090 "MIT"
2091 ],
2092 "authors": [
2093 {
2094 "name": "Christophe Coevoet",
2095 "email": "stof@notk.org"
2096 },
2097 {
2098 "name": "FriendsOfSymfony Community",
2099 "homepage": "https://github.com/friendsofsymfony/FOSUserBundle/contributors"
2100 },
2101 {
2102 "name": "Thibault Duplessis",
2103 "email": "thibault.duplessis@gmail.com"
2104 }
2105 ],
2106 "description": "Symfony FOSUserBundle",
2107 "homepage": "http://friendsofsymfony.github.com",
2108 "keywords": [
2109 "User management"
2110 ],
2111 "time": "2017-11-29T17:01:21+00:00"
2112 },
2113 {
2114 "name": "gedmo/doctrine-extensions",
2115 "version": "v2.4.37",
2116 "source": {
2117 "type": "git",
2118 "url": "https://github.com/Atlantic18/DoctrineExtensions.git",
2119 "reference": "5dd471f656e46d815f063bf3f12c667649ec7ffb"
2120 },
2121 "dist": {
2122 "type": "zip",
2123 "url": "https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/5dd471f656e46d815f063bf3f12c667649ec7ffb",
2124 "reference": "5dd471f656e46d815f063bf3f12c667649ec7ffb",
2125 "shasum": ""
2126 },
2127 "require": {
2128 "behat/transliterator": "~1.2",
2129 "doctrine/common": "~2.4",
2130 "php": ">=5.3.2"
2131 },
2132 "conflict": {
2133 "doctrine/annotations": "<1.2"
2134 },
2135 "require-dev": {
2136 "doctrine/common": ">=2.5.0",
2137 "doctrine/mongodb-odm": ">=1.0.2",
2138 "doctrine/orm": ">=2.5.0",
2139 "phpunit/phpunit": "^4.8.35|^5.7|^6.5",
2140 "symfony/yaml": "~2.6|~3.0|~4.0"
2141 },
2142 "suggest": {
2143 "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM",
2144 "doctrine/orm": "to use the extensions with the ORM"
2145 },
2146 "type": "library",
2147 "extra": {
2148 "branch-alias": {
2149 "dev-master": "2.4.x-dev"
2150 }
2151 },
2152 "autoload": {
2153 "psr-4": {
2154 "Gedmo\\": "lib/Gedmo"
2155 }
2156 },
2157 "notification-url": "https://packagist.org/downloads/",
2158 "license": [
2159 "MIT"
2160 ],
2161 "authors": [
2162 {
2163 "name": "David Buchmann",
2164 "email": "david@liip.ch"
2165 },
2166 {
2167 "name": "Gediminas Morkevicius",
2168 "email": "gediminas.morkevicius@gmail.com"
2169 },
2170 {
2171 "name": "Gustavo Falco",
2172 "email": "comfortablynumb84@gmail.com"
2173 }
2174 ],
2175 "description": "Doctrine2 behavioral extensions",
2176 "homepage": "http://gediminasm.org/",
2177 "keywords": [
2178 "Blameable",
2179 "behaviors",
2180 "doctrine2",
2181 "extensions",
2182 "gedmo",
2183 "loggable",
2184 "nestedset",
2185 "sluggable",
2186 "sortable",
2187 "timestampable",
2188 "translatable",
2189 "tree",
2190 "uploadable"
2191 ],
2192 "time": "2019-03-17T18:16:12+00:00"
2193 },
2194 {
2195 "name": "grandt/binstring",
2196 "version": "1.0.0",
2197 "source": {
2198 "type": "git",
2199 "url": "https://github.com/Grandt/PHPBinString.git",
2200 "reference": "825fe2ac8a68190f651fc2dbc07b6edde18bc431"
2201 },
2202 "dist": {
2203 "type": "zip",
2204 "url": "https://api.github.com/repos/Grandt/PHPBinString/zipball/825fe2ac8a68190f651fc2dbc07b6edde18bc431",
2205 "reference": "825fe2ac8a68190f651fc2dbc07b6edde18bc431",
2206 "shasum": ""
2207 },
2208 "require": {
2209 "php": ">=5.0"
2210 },
2211 "type": "library",
2212 "autoload": {
2213 "classmap": [
2214 "BinString.php",
2215 "BinStringStatic.php"
2216 ]
2217 },
2218 "notification-url": "https://packagist.org/downloads/",
2219 "license": [
2220 "LGPL-2.1"
2221 ],
2222 "authors": [
2223 {
2224 "name": "A. Grandt",
2225 "email": "php@grandt.com",
2226 "role": "Developer"
2227 }
2228 ],
2229 "description": "A class for working around the use of mbstring.func_override",
2230 "homepage": "https://github.com/Grandt/PHPBinString",
2231 "keywords": [
2232 "binary strings",
2233 "mbstring"
2234 ],
2235 "time": "2015-08-13T06:14:41+00:00"
2236 },
2237 {
2238 "name": "grandt/phpepub",
2239 "version": "dev-master",
2240 "source": {
2241 "type": "git",
2242 "url": "https://github.com/Daniel-KM/PHPePub.git",
2243 "reference": "78546d9a49d59ad9a32b13f3d95cc2f548add1c3"
2244 },
2245 "dist": {
2246 "type": "zip",
2247 "url": "https://api.github.com/repos/Daniel-KM/PHPePub/zipball/78546d9a49d59ad9a32b13f3d95cc2f548add1c3",
2248 "reference": "78546d9a49d59ad9a32b13f3d95cc2f548add1c3",
2249 "shasum": ""
2250 },
2251 "require": {
2252 "grandt/phpresizegif": "~1.0.3",
2253 "grandt/relativepath": "~1.0.1",
2254 "masterminds/html5": "~2.3",
2255 "php": ">=5.3.0",
2256 "phpzip/phpzip": "~2.0.7"
2257 },
2258 "type": "library",
2259 "autoload": {
2260 "psr-4": {
2261 "PHPePub\\": "src/PHPePub"
2262 },
2263 "classmap": [
2264 "src/lib.uuid.php"
2265 ]
2266 },
2267 "license": [
2268 "LGPL-2.1"
2269 ],
2270 "authors": [
2271 {
2272 "name": "A. Grandt",
2273 "email": "php@grandt.com",
2274 "homepage": "http://grandt.com",
2275 "role": "Developer"
2276 },
2277 {
2278 "name": "An, Hyeong-woo",
2279 "email": "mail@mytory.net",
2280 "homepage": "https://mytory.net",
2281 "role": "Contributor"
2282 },
2283 {
2284 "name": "Daniel Berthereau",
2285 "email": "daniel.composer@berthereau.net",
2286 "role": "Contributor"
2287 }
2288 ],
2289 "description": "Package to create and stream e-books in the ePub 2.0 and 3.0 formats.",
2290 "homepage": "https://github.com/Grandt/PHPePub",
2291 "keywords": [
2292 "e-book",
2293 "epub"
2294 ],
2295 "support": {
2296 "source": "https://github.com/Daniel-KM/PHPePub/tree/master"
2297 },
2298 "time": "2018-10-21T22:00:00+00:00"
2299 },
2300 {
2301 "name": "grandt/phpresizegif",
2302 "version": "1.0.3",
2303 "source": {
2304 "type": "git",
2305 "url": "https://github.com/Grandt/PHPResizeGif.git",
2306 "reference": "775f6810fcda2fd1d8ca881d44a80c8d310ae7fe"
2307 },
2308 "dist": {
2309 "type": "zip",
2310 "url": "https://api.github.com/repos/Grandt/PHPResizeGif/zipball/775f6810fcda2fd1d8ca881d44a80c8d310ae7fe",
2311 "reference": "775f6810fcda2fd1d8ca881d44a80c8d310ae7fe",
2312 "shasum": ""
2313 },
2314 "require": {
2315 "grandt/binstring": ">=0.2.0",
2316 "php": ">=5.3.0"
2317 },
2318 "type": "library",
2319 "autoload": {
2320 "psr-4": {
2321 "grandt\\ResizeGif\\": "src/ResizeGif",
2322 "grandt\\ResizeGif\\Files\\": "src/ResizeGif/Files",
2323 "grandt\\ResizeGif\\Structure\\": "src/ResizeGif/Structure",
2324 "grandt\\ResizeGif\\Debug\\": "src/ResizeGif/Debug"
2325 }
2326 },
2327 "notification-url": "https://packagist.org/downloads/",
2328 "license": [
2329 "LGPL-2.1"
2330 ],
2331 "authors": [
2332 {
2333 "name": "A. Grandt",
2334 "email": "php@grandt.com",
2335 "homepage": "http://grandt.com",
2336 "role": "Developer"
2337 }
2338 ],
2339 "description": "GIF89a compliant Gif resizer, including transparency and optimized gifs with sub sized elements.",
2340 "homepage": "https://github.com/Grandt/PHPResizeGif",
2341 "keywords": [
2342 "GIF89a",
2343 "animated gif",
2344 "gif",
2345 "resize"
2346 ],
2347 "time": "2015-05-10T10:52:24+00:00"
2348 },
2349 {
2350 "name": "grandt/phpzipmerge",
2351 "version": "1.0.4",
2352 "source": {
2353 "type": "git",
2354 "url": "https://github.com/Grandt/PHPZipMerge.git",
2355 "reference": "0b1273d3c2dbfe244904158b1dbd65a663264fb9"
2356 },
2357 "dist": {
2358 "type": "zip",
2359 "url": "https://api.github.com/repos/Grandt/PHPZipMerge/zipball/0b1273d3c2dbfe244904158b1dbd65a663264fb9",
2360 "reference": "0b1273d3c2dbfe244904158b1dbd65a663264fb9",
2361 "shasum": ""
2362 },
2363 "require": {
2364 "grandt/binstring": ">=1.0.0",
2365 "grandt/relativepath": ">=1.0.1",
2366 "php": ">=5.3.0"
2367 },
2368 "type": "library",
2369 "autoload": {
2370 "psr-4": {
2371 "ZipMerge\\": "src/ZipMerge"
2372 }
2373 },
2374 "notification-url": "https://packagist.org/downloads/",
2375 "license": [
2376 "LGPL-2.1"
2377 ],
2378 "authors": [
2379 {
2380 "name": "A. Grandt",
2381 "email": "php@grandt.com",
2382 "homepage": "http://grandt.com",
2383 "role": "Developer"
2384 },
2385 {
2386 "name": "Greg Kappatos",
2387 "homepage": "http://websiteconnect.com.au",
2388 "role": "Developer"
2389 }
2390 ],
2391 "description": "Merge and stream multiple Zip files on the fly.",
2392 "homepage": "https://github.com/Grandt/PHPZipMerge",
2393 "keywords": [
2394 "archive",
2395 "compressed",
2396 "compression",
2397 "merge",
2398 "phpzip",
2399 "pkzip",
2400 "stream",
2401 "zip"
2402 ],
2403 "time": "2015-08-18T13:49:33+00:00"
2404 },
2405 {
2406 "name": "grandt/relativepath",
2407 "version": "1.0.2",
2408 "source": {
2409 "type": "git",
2410 "url": "https://github.com/Grandt/PHPRelativePath.git",
2411 "reference": "19541133c24143b6295688472c54dd6ed15a5462"
2412 },
2413 "dist": {
2414 "type": "zip",
2415 "url": "https://api.github.com/repos/Grandt/PHPRelativePath/zipball/19541133c24143b6295688472c54dd6ed15a5462",
2416 "reference": "19541133c24143b6295688472c54dd6ed15a5462",
2417 "shasum": ""
2418 },
2419 "require": {
2420 "php": ">=5.0"
2421 },
2422 "type": "library",
2423 "autoload": {
2424 "classmap": [
2425 "RelativePath.php"
2426 ]
2427 },
2428 "notification-url": "https://packagist.org/downloads/",
2429 "license": [
2430 "LGPL-2.1"
2431 ],
2432 "authors": [
2433 {
2434 "name": "A. Grandt",
2435 "email": "php@grandt.com",
2436 "role": "Developer"
2437 }
2438 ],
2439 "description": "A class for cleaning up/collapsing relative paths. Like real_path, but without the need for the path to exist on the filesystem.",
2440 "homepage": "https://github.com/Grandt/PHPRelativePath",
2441 "keywords": [
2442 "file path"
2443 ],
2444 "time": "2015-05-14T08:18:23+00:00"
2445 },
2446 {
2447 "name": "guzzlehttp/guzzle",
2448 "version": "5.3.3",
2449 "source": {
2450 "type": "git",
2451 "url": "https://github.com/guzzle/guzzle.git",
2452 "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9"
2453 },
2454 "dist": {
2455 "type": "zip",
2456 "url": "https://api.github.com/repos/guzzle/guzzle/zipball/93bbdb30d59be6cd9839495306c65f2907370eb9",
2457 "reference": "93bbdb30d59be6cd9839495306c65f2907370eb9",
2458 "shasum": ""
2459 },
2460 "require": {
2461 "guzzlehttp/ringphp": "^1.1",
2462 "php": ">=5.4.0",
2463 "react/promise": "^2.2"
2464 },
2465 "require-dev": {
2466 "ext-curl": "*",
2467 "phpunit/phpunit": "^4.0"
2468 },
2469 "type": "library",
2470 "autoload": {
2471 "psr-4": {
2472 "GuzzleHttp\\": "src/"
2473 }
2474 },
2475 "notification-url": "https://packagist.org/downloads/",
2476 "license": [
2477 "MIT"
2478 ],
2479 "authors": [
2480 {
2481 "name": "Michael Dowling",
2482 "email": "mtdowling@gmail.com",
2483 "homepage": "https://github.com/mtdowling"
2484 }
2485 ],
2486 "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
2487 "homepage": "http://guzzlephp.org/",
2488 "keywords": [
2489 "client",
2490 "curl",
2491 "framework",
2492 "http",
2493 "http client",
2494 "rest",
2495 "web service"
2496 ],
2497 "time": "2018-07-31T13:33:10+00:00"
2498 },
2499 {
2500 "name": "guzzlehttp/psr7",
2501 "version": "1.5.2",
2502 "source": {
2503 "type": "git",
2504 "url": "https://github.com/guzzle/psr7.git",
2505 "reference": "9f83dded91781a01c63574e387eaa769be769115"
2506 },
2507 "dist": {
2508 "type": "zip",
2509 "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115",
2510 "reference": "9f83dded91781a01c63574e387eaa769be769115",
2511 "shasum": ""
2512 },
2513 "require": {
2514 "php": ">=5.4.0",
2515 "psr/http-message": "~1.0",
2516 "ralouphie/getallheaders": "^2.0.5"
2517 },
2518 "provide": {
2519 "psr/http-message-implementation": "1.0"
2520 },
2521 "require-dev": {
2522 "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
2523 },
2524 "type": "library",
2525 "extra": {
2526 "branch-alias": {
2527 "dev-master": "1.5-dev"
2528 }
2529 },
2530 "autoload": {
2531 "psr-4": {
2532 "GuzzleHttp\\Psr7\\": "src/"
2533 },
2534 "files": [
2535 "src/functions_include.php"
2536 ]
2537 },
2538 "notification-url": "https://packagist.org/downloads/",
2539 "license": [
2540 "MIT"
2541 ],
2542 "authors": [
2543 {
2544 "name": "Michael Dowling",
2545 "email": "mtdowling@gmail.com",
2546 "homepage": "https://github.com/mtdowling"
2547 },
2548 {
2549 "name": "Tobias Schultze",
2550 "homepage": "https://github.com/Tobion"
2551 }
2552 ],
2553 "description": "PSR-7 message implementation that also provides common utility methods",
2554 "keywords": [
2555 "http",
2556 "message",
2557 "psr-7",
2558 "request",
2559 "response",
2560 "stream",
2561 "uri",
2562 "url"
2563 ],
2564 "time": "2018-12-04T20:46:45+00:00"
2565 },
2566 {
2567 "name": "guzzlehttp/ringphp",
2568 "version": "1.1.1",
2569 "source": {
2570 "type": "git",
2571 "url": "https://github.com/guzzle/RingPHP.git",
2572 "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b"
2573 },
2574 "dist": {
2575 "type": "zip",
2576 "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/5e2a174052995663dd68e6b5ad838afd47dd615b",
2577 "reference": "5e2a174052995663dd68e6b5ad838afd47dd615b",
2578 "shasum": ""
2579 },
2580 "require": {
2581 "guzzlehttp/streams": "~3.0",
2582 "php": ">=5.4.0",
2583 "react/promise": "~2.0"
2584 },
2585 "require-dev": {
2586 "ext-curl": "*",
2587 "phpunit/phpunit": "~4.0"
2588 },
2589 "suggest": {
2590 "ext-curl": "Guzzle will use specific adapters if cURL is present"
2591 },
2592 "type": "library",
2593 "extra": {
2594 "branch-alias": {
2595 "dev-master": "1.1-dev"
2596 }
2597 },
2598 "autoload": {
2599 "psr-4": {
2600 "GuzzleHttp\\Ring\\": "src/"
2601 }
2602 },
2603 "notification-url": "https://packagist.org/downloads/",
2604 "license": [
2605 "MIT"
2606 ],
2607 "authors": [
2608 {
2609 "name": "Michael Dowling",
2610 "email": "mtdowling@gmail.com",
2611 "homepage": "https://github.com/mtdowling"
2612 }
2613 ],
2614 "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
2615 "time": "2018-07-31T13:22:33+00:00"
2616 },
2617 {
2618 "name": "guzzlehttp/streams",
2619 "version": "3.0.0",
2620 "source": {
2621 "type": "git",
2622 "url": "https://github.com/guzzle/streams.git",
2623 "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
2624 },
2625 "dist": {
2626 "type": "zip",
2627 "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
2628 "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
2629 "shasum": ""
2630 },
2631 "require": {
2632 "php": ">=5.4.0"
2633 },
2634 "require-dev": {
2635 "phpunit/phpunit": "~4.0"
2636 },
2637 "type": "library",
2638 "extra": {
2639 "branch-alias": {
2640 "dev-master": "3.0-dev"
2641 }
2642 },
2643 "autoload": {
2644 "psr-4": {
2645 "GuzzleHttp\\Stream\\": "src/"
2646 }
2647 },
2648 "notification-url": "https://packagist.org/downloads/",
2649 "license": [
2650 "MIT"
2651 ],
2652 "authors": [
2653 {
2654 "name": "Michael Dowling",
2655 "email": "mtdowling@gmail.com",
2656 "homepage": "https://github.com/mtdowling"
2657 }
2658 ],
2659 "description": "Provides a simple abstraction over streams of data",
2660 "homepage": "http://guzzlephp.org/",
2661 "keywords": [
2662 "Guzzle",
2663 "stream"
2664 ],
2665 "time": "2014-10-12T19:18:40+00:00"
2666 },
2667 {
2668 "name": "hoa/compiler",
2669 "version": "3.17.08.08",
2670 "source": {
2671 "type": "git",
2672 "url": "https://github.com/hoaproject/Compiler.git",
2673 "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de"
2674 },
2675 "dist": {
2676 "type": "zip",
2677 "url": "https://api.github.com/repos/hoaproject/Compiler/zipball/aa09caf0bf28adae6654ca6ee415ee2f522672de",
2678 "reference": "aa09caf0bf28adae6654ca6ee415ee2f522672de",
2679 "shasum": ""
2680 },
2681 "require": {
2682 "hoa/consistency": "~1.0",
2683 "hoa/exception": "~1.0",
2684 "hoa/file": "~1.0",
2685 "hoa/iterator": "~2.0",
2686 "hoa/math": "~1.0",
2687 "hoa/protocol": "~1.0",
2688 "hoa/regex": "~1.0",
2689 "hoa/visitor": "~2.0"
2690 },
2691 "require-dev": {
2692 "hoa/json": "~2.0",
2693 "hoa/test": "~2.0"
2694 },
2695 "type": "library",
2696 "extra": {
2697 "branch-alias": {
2698 "dev-master": "3.x-dev"
2699 }
2700 },
2701 "autoload": {
2702 "psr-4": {
2703 "Hoa\\Compiler\\": "."
2704 }
2705 },
2706 "notification-url": "https://packagist.org/downloads/",
2707 "license": [
2708 "BSD-3-Clause"
2709 ],
2710 "authors": [
2711 {
2712 "name": "Ivan Enderlin",
2713 "email": "ivan.enderlin@hoa-project.net"
2714 },
2715 {
2716 "name": "Hoa community",
2717 "homepage": "https://hoa-project.net/"
2718 }
2719 ],
2720 "description": "The Hoa\\Compiler library.",
2721 "homepage": "https://hoa-project.net/",
2722 "keywords": [
2723 "algebraic",
2724 "ast",
2725 "compiler",
2726 "context-free",
2727 "coverage",
2728 "exhaustive",
2729 "grammar",
2730 "isotropic",
2731 "language",
2732 "lexer",
2733 "library",
2734 "ll1",
2735 "llk",
2736 "parser",
2737 "pp",
2738 "random",
2739 "regular",
2740 "rule",
2741 "sampler",
2742 "syntax",
2743 "token",
2744 "trace",
2745 "uniform"
2746 ],
2747 "time": "2017-08-08T07:44:07+00:00"
2748 },
2749 {
2750 "name": "hoa/consistency",
2751 "version": "1.17.05.02",
2752 "source": {
2753 "type": "git",
2754 "url": "https://github.com/hoaproject/Consistency.git",
2755 "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f"
2756 },
2757 "dist": {
2758 "type": "zip",
2759 "url": "https://api.github.com/repos/hoaproject/Consistency/zipball/fd7d0adc82410507f332516faf655b6ed22e4c2f",
2760 "reference": "fd7d0adc82410507f332516faf655b6ed22e4c2f",
2761 "shasum": ""
2762 },
2763 "require": {
2764 "hoa/exception": "~1.0",
2765 "php": ">=5.5.0"
2766 },
2767 "require-dev": {
2768 "hoa/stream": "~1.0",
2769 "hoa/test": "~2.0"
2770 },
2771 "type": "library",
2772 "extra": {
2773 "branch-alias": {
2774 "dev-master": "1.x-dev"
2775 }
2776 },
2777 "autoload": {
2778 "psr-4": {
2779 "Hoa\\Consistency\\": "."
2780 },
2781 "files": [
2782 "Prelude.php"
2783 ]
2784 },
2785 "notification-url": "https://packagist.org/downloads/",
2786 "license": [
2787 "BSD-3-Clause"
2788 ],
2789 "authors": [
2790 {
2791 "name": "Ivan Enderlin",
2792 "email": "ivan.enderlin@hoa-project.net"
2793 },
2794 {
2795 "name": "Hoa community",
2796 "homepage": "https://hoa-project.net/"
2797 }
2798 ],
2799 "description": "The Hoa\\Consistency library.",
2800 "homepage": "https://hoa-project.net/",
2801 "keywords": [
2802 "autoloader",
2803 "callable",
2804 "consistency",
2805 "entity",
2806 "flex",
2807 "keyword",
2808 "library"
2809 ],
2810 "time": "2017-05-02T12:18:12+00:00"
2811 },
2812 {
2813 "name": "hoa/event",
2814 "version": "1.17.01.13",
2815 "source": {
2816 "type": "git",
2817 "url": "https://github.com/hoaproject/Event.git",
2818 "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54"
2819 },
2820 "dist": {
2821 "type": "zip",
2822 "url": "https://api.github.com/repos/hoaproject/Event/zipball/6c0060dced212ffa3af0e34bb46624f990b29c54",
2823 "reference": "6c0060dced212ffa3af0e34bb46624f990b29c54",
2824 "shasum": ""
2825 },
2826 "require": {
2827 "hoa/consistency": "~1.0",
2828 "hoa/exception": "~1.0"
2829 },
2830 "require-dev": {
2831 "hoa/test": "~2.0"
2832 },
2833 "type": "library",
2834 "extra": {
2835 "branch-alias": {
2836 "dev-master": "1.x-dev"
2837 }
2838 },
2839 "autoload": {
2840 "psr-4": {
2841 "Hoa\\Event\\": "."
2842 }
2843 },
2844 "notification-url": "https://packagist.org/downloads/",
2845 "license": [
2846 "BSD-3-Clause"
2847 ],
2848 "authors": [
2849 {
2850 "name": "Ivan Enderlin",
2851 "email": "ivan.enderlin@hoa-project.net"
2852 },
2853 {
2854 "name": "Hoa community",
2855 "homepage": "https://hoa-project.net/"
2856 }
2857 ],
2858 "description": "The Hoa\\Event library.",
2859 "homepage": "https://hoa-project.net/",
2860 "keywords": [
2861 "event",
2862 "library",
2863 "listener",
2864 "observer"
2865 ],
2866 "time": "2017-01-13T15:30:50+00:00"
2867 },
2868 {
2869 "name": "hoa/exception",
2870 "version": "1.17.01.16",
2871 "source": {
2872 "type": "git",
2873 "url": "https://github.com/hoaproject/Exception.git",
2874 "reference": "091727d46420a3d7468ef0595651488bfc3a458f"
2875 },
2876 "dist": {
2877 "type": "zip",
2878 "url": "https://api.github.com/repos/hoaproject/Exception/zipball/091727d46420a3d7468ef0595651488bfc3a458f",
2879 "reference": "091727d46420a3d7468ef0595651488bfc3a458f",
2880 "shasum": ""
2881 },
2882 "require": {
2883 "hoa/consistency": "~1.0",
2884 "hoa/event": "~1.0"
2885 },
2886 "require-dev": {
2887 "hoa/test": "~2.0"
2888 },
2889 "type": "library",
2890 "extra": {
2891 "branch-alias": {
2892 "dev-master": "1.x-dev"
2893 }
2894 },
2895 "autoload": {
2896 "psr-4": {
2897 "Hoa\\Exception\\": "."
2898 }
2899 },
2900 "notification-url": "https://packagist.org/downloads/",
2901 "license": [
2902 "BSD-3-Clause"
2903 ],
2904 "authors": [
2905 {
2906 "name": "Ivan Enderlin",
2907 "email": "ivan.enderlin@hoa-project.net"
2908 },
2909 {
2910 "name": "Hoa community",
2911 "homepage": "https://hoa-project.net/"
2912 }
2913 ],
2914 "description": "The Hoa\\Exception library.",
2915 "homepage": "https://hoa-project.net/",
2916 "keywords": [
2917 "exception",
2918 "library"
2919 ],
2920 "time": "2017-01-16T07:53:27+00:00"
2921 },
2922 {
2923 "name": "hoa/file",
2924 "version": "1.17.07.11",
2925 "source": {
2926 "type": "git",
2927 "url": "https://github.com/hoaproject/File.git",
2928 "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca"
2929 },
2930 "dist": {
2931 "type": "zip",
2932 "url": "https://api.github.com/repos/hoaproject/File/zipball/35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
2933 "reference": "35cb979b779bc54918d2f9a4e02ed6c7a1fa67ca",
2934 "shasum": ""
2935 },
2936 "require": {
2937 "hoa/consistency": "~1.0",
2938 "hoa/event": "~1.0",
2939 "hoa/exception": "~1.0",
2940 "hoa/iterator": "~2.0",
2941 "hoa/stream": "~1.0"
2942 },
2943 "require-dev": {
2944 "hoa/test": "~2.0"
2945 },
2946 "type": "library",
2947 "extra": {
2948 "branch-alias": {
2949 "dev-master": "1.x-dev"
2950 }
2951 },
2952 "autoload": {
2953 "psr-4": {
2954 "Hoa\\File\\": "."
2955 }
2956 },
2957 "notification-url": "https://packagist.org/downloads/",
2958 "license": [
2959 "BSD-3-Clause"
2960 ],
2961 "authors": [
2962 {
2963 "name": "Ivan Enderlin",
2964 "email": "ivan.enderlin@hoa-project.net"
2965 },
2966 {
2967 "name": "Hoa community",
2968 "homepage": "https://hoa-project.net/"
2969 }
2970 ],
2971 "description": "The Hoa\\File library.",
2972 "homepage": "https://hoa-project.net/",
2973 "keywords": [
2974 "Socket",
2975 "directory",
2976 "file",
2977 "finder",
2978 "library",
2979 "link",
2980 "temporary"
2981 ],
2982 "time": "2017-07-11T07:42:15+00:00"
2983 },
2984 {
2985 "name": "hoa/iterator",
2986 "version": "2.17.01.10",
2987 "source": {
2988 "type": "git",
2989 "url": "https://github.com/hoaproject/Iterator.git",
2990 "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc"
2991 },
2992 "dist": {
2993 "type": "zip",
2994 "url": "https://api.github.com/repos/hoaproject/Iterator/zipball/d1120ba09cb4ccd049c86d10058ab94af245f0cc",
2995 "reference": "d1120ba09cb4ccd049c86d10058ab94af245f0cc",
2996 "shasum": ""
2997 },
2998 "require": {
2999 "hoa/consistency": "~1.0",
3000 "hoa/exception": "~1.0"
3001 },
3002 "require-dev": {
3003 "hoa/test": "~2.0"
3004 },
3005 "type": "library",
3006 "extra": {
3007 "branch-alias": {
3008 "dev-master": "2.x-dev"
3009 }
3010 },
3011 "autoload": {
3012 "psr-4": {
3013 "Hoa\\Iterator\\": "."
3014 }
3015 },
3016 "notification-url": "https://packagist.org/downloads/",
3017 "license": [
3018 "BSD-3-Clause"
3019 ],
3020 "authors": [
3021 {
3022 "name": "Ivan Enderlin",
3023 "email": "ivan.enderlin@hoa-project.net"
3024 },
3025 {
3026 "name": "Hoa community",
3027 "homepage": "https://hoa-project.net/"
3028 }
3029 ],
3030 "description": "The Hoa\\Iterator library.",
3031 "homepage": "https://hoa-project.net/",
3032 "keywords": [
3033 "iterator",
3034 "library"
3035 ],
3036 "time": "2017-01-10T10:34:47+00:00"
3037 },
3038 {
3039 "name": "hoa/math",
3040 "version": "1.17.05.16",
3041 "source": {
3042 "type": "git",
3043 "url": "https://github.com/hoaproject/Math.git",
3044 "reference": "7150785d30f5d565704912116a462e9f5bc83a0c"
3045 },
3046 "dist": {
3047 "type": "zip",
3048 "url": "https://api.github.com/repos/hoaproject/Math/zipball/7150785d30f5d565704912116a462e9f5bc83a0c",
3049 "reference": "7150785d30f5d565704912116a462e9f5bc83a0c",
3050 "shasum": ""
3051 },
3052 "require": {
3053 "hoa/compiler": "~3.0",
3054 "hoa/consistency": "~1.0",
3055 "hoa/exception": "~1.0",
3056 "hoa/iterator": "~2.0",
3057 "hoa/protocol": "~1.0",
3058 "hoa/zformat": "~1.0"
3059 },
3060 "require-dev": {
3061 "hoa/test": "~2.0"
3062 },
3063 "type": "library",
3064 "extra": {
3065 "branch-alias": {
3066 "dev-master": "1.x-dev"
3067 }
3068 },
3069 "autoload": {
3070 "psr-4": {
3071 "Hoa\\Math\\": "."
3072 }
3073 },
3074 "notification-url": "https://packagist.org/downloads/",
3075 "license": [
3076 "BSD-3-Clause"
3077 ],
3078 "authors": [
3079 {
3080 "name": "Ivan Enderlin",
3081 "email": "ivan.enderlin@hoa-project.net"
3082 },
3083 {
3084 "name": "Hoa community",
3085 "homepage": "https://hoa-project.net/"
3086 }
3087 ],
3088 "description": "The Hoa\\Math library.",
3089 "homepage": "https://hoa-project.net/",
3090 "keywords": [
3091 "arrangement",
3092 "combination",
3093 "combinatorics",
3094 "counting",
3095 "library",
3096 "math",
3097 "permutation",
3098 "sampler",
3099 "set"
3100 ],
3101 "time": "2017-05-16T08:02:17+00:00"
3102 },
3103 {
3104 "name": "hoa/protocol",
3105 "version": "1.17.01.14",
3106 "source": {
3107 "type": "git",
3108 "url": "https://github.com/hoaproject/Protocol.git",
3109 "reference": "5c2cf972151c45f373230da170ea015deecf19e2"
3110 },
3111 "dist": {
3112 "type": "zip",
3113 "url": "https://api.github.com/repos/hoaproject/Protocol/zipball/5c2cf972151c45f373230da170ea015deecf19e2",
3114 "reference": "5c2cf972151c45f373230da170ea015deecf19e2",
3115 "shasum": ""
3116 },
3117 "require": {
3118 "hoa/consistency": "~1.0",
3119 "hoa/exception": "~1.0"
3120 },
3121 "require-dev": {
3122 "hoa/test": "~2.0"
3123 },
3124 "type": "library",
3125 "extra": {
3126 "branch-alias": {
3127 "dev-master": "1.x-dev"
3128 }
3129 },
3130 "autoload": {
3131 "psr-4": {
3132 "Hoa\\Protocol\\": "."
3133 },
3134 "files": [
3135 "Wrapper.php"
3136 ]
3137 },
3138 "notification-url": "https://packagist.org/downloads/",
3139 "license": [
3140 "BSD-3-Clause"
3141 ],
3142 "authors": [
3143 {
3144 "name": "Ivan Enderlin",
3145 "email": "ivan.enderlin@hoa-project.net"
3146 },
3147 {
3148 "name": "Hoa community",
3149 "homepage": "https://hoa-project.net/"
3150 }
3151 ],
3152 "description": "The Hoa\\Protocol library.",
3153 "homepage": "https://hoa-project.net/",
3154 "keywords": [
3155 "library",
3156 "protocol",
3157 "resource",
3158 "stream",
3159 "wrapper"
3160 ],
3161 "time": "2017-01-14T12:26:10+00:00"
3162 },
3163 {
3164 "name": "hoa/regex",
3165 "version": "1.17.01.13",
3166 "source": {
3167 "type": "git",
3168 "url": "https://github.com/hoaproject/Regex.git",
3169 "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec"
3170 },
3171 "dist": {
3172 "type": "zip",
3173 "url": "https://api.github.com/repos/hoaproject/Regex/zipball/7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
3174 "reference": "7e263a61b6fb45c1d03d8e5ef77668518abd5bec",
3175 "shasum": ""
3176 },
3177 "require": {
3178 "hoa/consistency": "~1.0",
3179 "hoa/exception": "~1.0",
3180 "hoa/math": "~1.0",
3181 "hoa/protocol": "~1.0",
3182 "hoa/ustring": "~4.0",
3183 "hoa/visitor": "~2.0"
3184 },
3185 "type": "library",
3186 "extra": {
3187 "branch-alias": {
3188 "dev-master": "1.x-dev"
3189 }
3190 },
3191 "autoload": {
3192 "psr-4": {
3193 "Hoa\\Regex\\": "."
3194 }
3195 },
3196 "notification-url": "https://packagist.org/downloads/",
3197 "license": [
3198 "BSD-3-Clause"
3199 ],
3200 "authors": [
3201 {
3202 "name": "Ivan Enderlin",
3203 "email": "ivan.enderlin@hoa-project.net"
3204 },
3205 {
3206 "name": "Hoa community",
3207 "homepage": "https://hoa-project.net/"
3208 }
3209 ],
3210 "description": "The Hoa\\Regex library.",
3211 "homepage": "https://hoa-project.net/",
3212 "keywords": [
3213 "compiler",
3214 "library",
3215 "regex"
3216 ],
3217 "time": "2017-01-13T16:10:24+00:00"
3218 },
3219 {
3220 "name": "hoa/ruler",
3221 "version": "2.17.05.16",
3222 "source": {
3223 "type": "git",
3224 "url": "https://github.com/hoaproject/Ruler.git",
3225 "reference": "696835daf8336dfd490f032da7af444050e52dfc"
3226 },
3227 "dist": {
3228 "type": "zip",
3229 "url": "https://api.github.com/repos/hoaproject/Ruler/zipball/696835daf8336dfd490f032da7af444050e52dfc",
3230 "reference": "696835daf8336dfd490f032da7af444050e52dfc",
3231 "shasum": ""
3232 },
3233 "require": {
3234 "hoa/compiler": "~3.0",
3235 "hoa/consistency": "~1.0",
3236 "hoa/exception": "~1.0",
3237 "hoa/file": "~1.0",
3238 "hoa/protocol": "~1.0",
3239 "hoa/visitor": "~2.0"
3240 },
3241 "require-dev": {
3242 "hoa/test": "~2.0"
3243 },
3244 "type": "library",
3245 "extra": {
3246 "branch-alias": {
3247 "dev-master": "2.x-dev"
3248 }
3249 },
3250 "autoload": {
3251 "psr-4": {
3252 "Hoa\\Ruler\\": "."
3253 }
3254 },
3255 "notification-url": "https://packagist.org/downloads/",
3256 "license": [
3257 "BSD-3-Clause"
3258 ],
3259 "authors": [
3260 {
3261 "name": "Ivan Enderlin",
3262 "email": "ivan.enderlin@hoa-project.net"
3263 },
3264 {
3265 "name": "Hoa community",
3266 "homepage": "https://hoa-project.net/"
3267 }
3268 ],
3269 "description": "The Hoa\\Ruler library.",
3270 "homepage": "https://hoa-project.net/",
3271 "keywords": [
3272 "library",
3273 "ruler"
3274 ],
3275 "time": "2017-05-16T07:52:21+00:00"
3276 },
3277 {
3278 "name": "hoa/stream",
3279 "version": "1.17.02.21",
3280 "source": {
3281 "type": "git",
3282 "url": "https://github.com/hoaproject/Stream.git",
3283 "reference": "3293cfffca2de10525df51436adf88a559151d82"
3284 },
3285 "dist": {
3286 "type": "zip",
3287 "url": "https://api.github.com/repos/hoaproject/Stream/zipball/3293cfffca2de10525df51436adf88a559151d82",
3288 "reference": "3293cfffca2de10525df51436adf88a559151d82",
3289 "shasum": ""
3290 },
3291 "require": {
3292 "hoa/consistency": "~1.0",
3293 "hoa/event": "~1.0",
3294 "hoa/exception": "~1.0",
3295 "hoa/protocol": "~1.0"
3296 },
3297 "require-dev": {
3298 "hoa/test": "~2.0"
3299 },
3300 "type": "library",
3301 "extra": {
3302 "branch-alias": {
3303 "dev-master": "1.x-dev"
3304 }
3305 },
3306 "autoload": {
3307 "psr-4": {
3308 "Hoa\\Stream\\": "."
3309 }
3310 },
3311 "notification-url": "https://packagist.org/downloads/",
3312 "license": [
3313 "BSD-3-Clause"
3314 ],
3315 "authors": [
3316 {
3317 "name": "Ivan Enderlin",
3318 "email": "ivan.enderlin@hoa-project.net"
3319 },
3320 {
3321 "name": "Hoa community",
3322 "homepage": "https://hoa-project.net/"
3323 }
3324 ],
3325 "description": "The Hoa\\Stream library.",
3326 "homepage": "https://hoa-project.net/",
3327 "keywords": [
3328 "Context",
3329 "bucket",
3330 "composite",
3331 "filter",
3332 "in",
3333 "library",
3334 "out",
3335 "protocol",
3336 "stream",
3337 "wrapper"
3338 ],
3339 "time": "2017-02-21T16:01:06+00:00"
3340 },
3341 {
3342 "name": "hoa/ustring",
3343 "version": "4.17.01.16",
3344 "source": {
3345 "type": "git",
3346 "url": "https://github.com/hoaproject/Ustring.git",
3347 "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0"
3348 },
3349 "dist": {
3350 "type": "zip",
3351 "url": "https://api.github.com/repos/hoaproject/Ustring/zipball/e6326e2739178799b1fe3fdd92029f9517fa17a0",
3352 "reference": "e6326e2739178799b1fe3fdd92029f9517fa17a0",
3353 "shasum": ""
3354 },
3355 "require": {
3356 "hoa/consistency": "~1.0",
3357 "hoa/exception": "~1.0"
3358 },
3359 "require-dev": {
3360 "hoa/test": "~2.0"
3361 },
3362 "suggest": {
3363 "ext-iconv": "ext/iconv must be present (or a third implementation) to use Hoa\\Ustring::transcode().",
3364 "ext-intl": "To get a better Hoa\\Ustring::toAscii() and Hoa\\Ustring::compareTo()."
3365 },
3366 "type": "library",
3367 "extra": {
3368 "branch-alias": {
3369 "dev-master": "4.x-dev"
3370 }
3371 },
3372 "autoload": {
3373 "psr-4": {
3374 "Hoa\\Ustring\\": "."
3375 }
3376 },
3377 "notification-url": "https://packagist.org/downloads/",
3378 "license": [
3379 "BSD-3-Clause"
3380 ],
3381 "authors": [
3382 {
3383 "name": "Ivan Enderlin",
3384 "email": "ivan.enderlin@hoa-project.net"
3385 },
3386 {
3387 "name": "Hoa community",
3388 "homepage": "https://hoa-project.net/"
3389 }
3390 ],
3391 "description": "The Hoa\\Ustring library.",
3392 "homepage": "https://hoa-project.net/",
3393 "keywords": [
3394 "library",
3395 "search",
3396 "string",
3397 "unicode"
3398 ],
3399 "time": "2017-01-16T07:08:25+00:00"
3400 },
3401 {
3402 "name": "hoa/visitor",
3403 "version": "2.17.01.16",
3404 "source": {
3405 "type": "git",
3406 "url": "https://github.com/hoaproject/Visitor.git",
3407 "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a"
3408 },
3409 "dist": {
3410 "type": "zip",
3411 "url": "https://api.github.com/repos/hoaproject/Visitor/zipball/c18fe1cbac98ae449e0d56e87469103ba08f224a",
3412 "reference": "c18fe1cbac98ae449e0d56e87469103ba08f224a",
3413 "shasum": ""
3414 },
3415 "require": {
3416 "hoa/consistency": "~1.0"
3417 },
3418 "require-dev": {
3419 "hoa/test": "~2.0"
3420 },
3421 "type": "library",
3422 "extra": {
3423 "branch-alias": {
3424 "dev-master": "2.x-dev"
3425 }
3426 },
3427 "autoload": {
3428 "psr-4": {
3429 "Hoa\\Visitor\\": "."
3430 }
3431 },
3432 "notification-url": "https://packagist.org/downloads/",
3433 "license": [
3434 "BSD-3-Clause"
3435 ],
3436 "authors": [
3437 {
3438 "name": "Ivan Enderlin",
3439 "email": "ivan.enderlin@hoa-project.net"
3440 },
3441 {
3442 "name": "Hoa community",
3443 "homepage": "https://hoa-project.net/"
3444 }
3445 ],
3446 "description": "The Hoa\\Visitor library.",
3447 "homepage": "https://hoa-project.net/",
3448 "keywords": [
3449 "library",
3450 "structure",
3451 "visit",
3452 "visitor"
3453 ],
3454 "time": "2017-01-16T07:02:03+00:00"
3455 },
3456 {
3457 "name": "hoa/zformat",
3458 "version": "1.17.01.10",
3459 "source": {
3460 "type": "git",
3461 "url": "https://github.com/hoaproject/Zformat.git",
3462 "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2"
3463 },
3464 "dist": {
3465 "type": "zip",
3466 "url": "https://api.github.com/repos/hoaproject/Zformat/zipball/522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
3467 "reference": "522c381a2a075d4b9dbb42eb4592dd09520e4ac2",
3468 "shasum": ""
3469 },
3470 "require": {
3471 "hoa/consistency": "~1.0",
3472 "hoa/exception": "~1.0"
3473 },
3474 "type": "library",
3475 "extra": {
3476 "branch-alias": {
3477 "dev-master": "1.x-dev"
3478 }
3479 },
3480 "autoload": {
3481 "psr-4": {
3482 "Hoa\\Zformat\\": "."
3483 }
3484 },
3485 "notification-url": "https://packagist.org/downloads/",
3486 "license": [
3487 "BSD-3-Clause"
3488 ],
3489 "authors": [
3490 {
3491 "name": "Ivan Enderlin",
3492 "email": "ivan.enderlin@hoa-project.net"
3493 },
3494 {
3495 "name": "Hoa community",
3496 "homepage": "https://hoa-project.net/"
3497 }
3498 ],
3499 "description": "The Hoa\\Zformat library.",
3500 "homepage": "https://hoa-project.net/",
3501 "keywords": [
3502 "library",
3503 "parameter",
3504 "zformat"
3505 ],
3506 "time": "2017-01-10T10:39:54+00:00"
3507 },
3508 {
3509 "name": "html2text/html2text",
3510 "version": "4.2.1",
3511 "source": {
3512 "type": "git",
3513 "url": "https://github.com/mtibben/html2text.git",
3514 "reference": "f7555eaf271beea4e1098274d3ff37fbb7b21ea7"
3515 },
3516 "dist": {
3517 "type": "zip",
3518 "url": "https://api.github.com/repos/mtibben/html2text/zipball/f7555eaf271beea4e1098274d3ff37fbb7b21ea7",
3519 "reference": "f7555eaf271beea4e1098274d3ff37fbb7b21ea7",
3520 "shasum": ""
3521 },
3522 "require-dev": {
3523 "phpunit/phpunit": "~4"
3524 },
3525 "suggest": {
3526 "ext-mbstring": "For best performance",
3527 "symfony/polyfill-mbstring": "If you can't install ext-mbstring"
3528 },
3529 "type": "library",
3530 "autoload": {
3531 "psr-4": {
3532 "Html2Text\\": [
3533 "src/",
3534 "test/"
3535 ]
3536 }
3537 },
3538 "notification-url": "https://packagist.org/downloads/",
3539 "license": [
3540 "GPL-2.0-or-later"
3541 ],
3542 "description": "Converts HTML to formatted plain text",
3543 "time": "2018-08-13T12:05:08+00:00"
3544 },
3545 {
3546 "name": "http-interop/http-factory-guzzle",
3547 "version": "1.0.0",
3548 "source": {
3549 "type": "git",
3550 "url": "https://github.com/http-interop/http-factory-guzzle.git",
3551 "reference": "34861658efb9899a6618cef03de46e2a52c80fc0"
3552 },
3553 "dist": {
3554 "type": "zip",
3555 "url": "https://api.github.com/repos/http-interop/http-factory-guzzle/zipball/34861658efb9899a6618cef03de46e2a52c80fc0",
3556 "reference": "34861658efb9899a6618cef03de46e2a52c80fc0",
3557 "shasum": ""
3558 },
3559 "require": {
3560 "guzzlehttp/psr7": "^1.4.2",
3561 "psr/http-factory": "^1.0"
3562 },
3563 "provide": {
3564 "psr/http-factory-implementation": "^1.0"
3565 },
3566 "require-dev": {
3567 "http-interop/http-factory-tests": "^0.5",
3568 "phpunit/phpunit": "^6.5"
3569 },
3570 "type": "library",
3571 "autoload": {
3572 "psr-4": {
3573 "Http\\Factory\\Guzzle\\": "src/"
3574 }
3575 },
3576 "notification-url": "https://packagist.org/downloads/",
3577 "license": [
3578 "MIT"
3579 ],
3580 "authors": [
3581 {
3582 "name": "PHP-FIG",
3583 "homepage": "http://www.php-fig.org/"
3584 }
3585 ],
3586 "description": "An HTTP Factory using Guzzle PSR7",
3587 "keywords": [
3588 "factory",
3589 "http",
3590 "psr-17",
3591 "psr-7"
3592 ],
3593 "time": "2018-07-31T19:32:56+00:00"
3594 },
3595 {
3596 "name": "incenteev/composer-parameter-handler",
3597 "version": "v2.1.3",
3598 "source": {
3599 "type": "git",
3600 "url": "https://github.com/Incenteev/ParameterHandler.git",
3601 "reference": "933c45a34814f27f2345c11c37d46b3ca7303550"
3602 },
3603 "dist": {
3604 "type": "zip",
3605 "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550",
3606 "reference": "933c45a34814f27f2345c11c37d46b3ca7303550",
3607 "shasum": ""
3608 },
3609 "require": {
3610 "php": ">=5.3.3",
3611 "symfony/yaml": "^2.3 || ^3.0 || ^4.0"
3612 },
3613 "require-dev": {
3614 "composer/composer": "^1.0@dev",
3615 "symfony/filesystem": "^2.3 || ^3 || ^4",
3616 "symfony/phpunit-bridge": "^4.0"
3617 },
3618 "type": "library",
3619 "extra": {
3620 "branch-alias": {
3621 "dev-master": "2.1.x-dev"
3622 }
3623 },
3624 "autoload": {
3625 "psr-4": {
3626 "Incenteev\\ParameterHandler\\": ""
3627 }
3628 },
3629 "notification-url": "https://packagist.org/downloads/",
3630 "license": [
3631 "MIT"
3632 ],
3633 "authors": [
3634 {
3635 "name": "Christophe Coevoet",
3636 "email": "stof@notk.org"
3637 }
3638 ],
3639 "description": "Composer script handling your ignored parameter file",
3640 "homepage": "https://github.com/Incenteev/ParameterHandler",
3641 "keywords": [
3642 "parameters management"
3643 ],
3644 "time": "2018-02-13T18:05:56+00:00"
3645 },
3646 {
3647 "name": "j0k3r/graby",
3648 "version": "2.0.0",
3649 "source": {
3650 "type": "git",
3651 "url": "https://github.com/j0k3r/graby.git",
3652 "reference": "e09fa58eb1b0a760869c6e3031db1ae175e362e4"
3653 },
3654 "dist": {
3655 "type": "zip",
3656 "url": "https://api.github.com/repos/j0k3r/graby/zipball/e09fa58eb1b0a760869c6e3031db1ae175e362e4",
3657 "reference": "e09fa58eb1b0a760869c6e3031db1ae175e362e4",
3658 "shasum": ""
3659 },
3660 "require": {
3661 "ext-curl": "*",
3662 "ext-tidy": "*",
3663 "fossar/htmlawed": "^1.2.4",
3664 "guzzlehttp/psr7": "^1.5",
3665 "j0k3r/graby-site-config": "^1.0",
3666 "j0k3r/httplug-ssrf-plugin": "^2.0",
3667 "j0k3r/php-readability": "^1.1",
3668 "monolog/monolog": "^1.13.1",
3669 "php": ">=7.1",
3670 "php-http/client-common": "^2.0",
3671 "php-http/discovery": "^1.0",
3672 "php-http/httplug": "^2.0",
3673 "php-http/message": "^1.7",
3674 "psr/http-message": "^1.0",
3675 "simplepie/simplepie": "^1.3.1",
3676 "smalot/pdfparser": "~0.11",
3677 "symfony/options-resolver": "~2.6|~3.0|~4.0",
3678 "true/punycode": "~2.1",
3679 "wallabag/tcpdf": "^6.2.26"
3680 },
3681 "require-dev": {
3682 "friendsofphp/php-cs-fixer": "~2.14",
3683 "php-coveralls/php-coveralls": "^2.0",
3684 "php-http/guzzle6-adapter": "^2.0",
3685 "php-http/mock-client": "^1.2",
3686 "phpstan/phpstan": "^0.11",
3687 "phpstan/phpstan-phpunit": "^0.11",
3688 "symfony/phpunit-bridge": "~2.6|~3.0|~4.0"
3689 },
3690 "type": "library",
3691 "extra": {
3692 "branch-alias": {
3693 "dev-2.0": "2.0-dev"
3694 }
3695 },
3696 "autoload": {
3697 "psr-4": {
3698 "Graby\\": "src/"
3699 }
3700 },
3701 "notification-url": "https://packagist.org/downloads/",
3702 "license": [
3703 "MIT"
3704 ],
3705 "authors": [
3706 {
3707 "name": "Jeremy Benoist",
3708 "email": "jeremy.benoist@gmail.com",
3709 "role": "Developer"
3710 },
3711 {
3712 "name": "FiveFilters.org",
3713 "email": "fivefilters@fivefilters.org",
3714 "role": "Developer (original version)"
3715 }
3716 ],
3717 "description": "Graby helps you extract article content from web pages",
3718 "time": "2019-05-22T12:45:02+00:00"
3719 },
3720 {
3721 "name": "j0k3r/graby-site-config",
3722 "version": "1.0.84",
3723 "source": {
3724 "type": "git",
3725 "url": "https://github.com/j0k3r/graby-site-config.git",
3726 "reference": "37ae71639d3844d022ea402a1f87af7e28d12cac"
3727 },
3728 "dist": {
3729 "type": "zip",
3730 "url": "https://api.github.com/repos/j0k3r/graby-site-config/zipball/37ae71639d3844d022ea402a1f87af7e28d12cac",
3731 "reference": "37ae71639d3844d022ea402a1f87af7e28d12cac",
3732 "shasum": ""
3733 },
3734 "require": {
3735 "symfony/finder": "~2.6|~3.0|~4.0"
3736 },
3737 "require-dev": {
3738 "liip/rmt": "1.2.*",
3739 "symfony/phpunit-bridge": "^3.2"
3740 },
3741 "type": "library",
3742 "autoload": {
3743 "psr-4": {
3744 "GrabySiteConfig\\SiteConfig\\": "src/"
3745 }
3746 },
3747 "notification-url": "https://packagist.org/downloads/",
3748 "license": [
3749 "CC0-1.0"
3750 ],
3751 "authors": [
3752 {
3753 "name": "Jeremy Benoist",
3754 "email": "jeremy.benoist@gmail.com"
3755 }
3756 ],
3757 "description": "Graby site config files",
3758 "time": "2019-05-23T07:28:03+00:00"
3759 },
3760 {
3761 "name": "j0k3r/httplug-ssrf-plugin",
3762 "version": "v2.0.0",
3763 "source": {
3764 "type": "git",
3765 "url": "https://github.com/j0k3r/httplug-ssrf-plugin.git",
3766 "reference": "ea8599016240d2a49b91e267550ea3eb243ddd74"
3767 },
3768 "dist": {
3769 "type": "zip",
3770 "url": "https://api.github.com/repos/j0k3r/httplug-ssrf-plugin/zipball/ea8599016240d2a49b91e267550ea3eb243ddd74",
3771 "reference": "ea8599016240d2a49b91e267550ea3eb243ddd74",
3772 "shasum": ""
3773 },
3774 "require": {
3775 "php": "^7.1",
3776 "php-http/client-common": "^2.0",
3777 "php-http/discovery": "^1.5",
3778 "php-http/message": "^1.7",
3779 "php-http/message-factory": "^1.0.2"
3780 },
3781 "require-dev": {
3782 "friendsofphp/php-cs-fixer": "^2.14",
3783 "guzzlehttp/psr7": "^1.0",
3784 "php-http/guzzle6-adapter": "^2.0",
3785 "php-http/mock-client": "^1.0",
3786 "phpstan/phpstan": "^0.11",
3787 "phpstan/phpstan-phpunit": "^0.11",
3788 "symfony/phpunit-bridge": "~3.4.19|~4.0"
3789 },
3790 "type": "library",
3791 "extra": {
3792 "branch-alias": {
3793 "dev-master": "2.0-dev"
3794 }
3795 },
3796 "autoload": {
3797 "psr-4": {
3798 "Graby\\HttpClient\\Plugin\\ServerSideRequestForgeryProtection\\": "src/"
3799 }
3800 },
3801 "notification-url": "https://packagist.org/downloads/",
3802 "license": [
3803 "MIT"
3804 ],
3805 "authors": [
3806 {
3807 "name": "Jeremy Benoist",
3808 "email": "jeremy.benoist@gmail.com"
3809 },
3810 {
3811 "name": "aaa2000",
3812 "email": "adev2000@gmail.com"
3813 },
3814 {
3815 "name": "Jack W",
3816 "email": "jack@fin1te.net",
3817 "role": "Developer (SafeCurl original version)"
3818 }
3819 ],
3820 "description": "Server-Side Request Forgery (SSRF) protection plugin for HTTPlug",
3821 "homepage": "https://github.com/j0k3r/httplug-ssrf-plugin",
3822 "keywords": [
3823 "http",
3824 "httplug",
3825 "plugin",
3826 "security",
3827 "ssrf"
3828 ],
3829 "time": "2019-02-06T10:58:53+00:00"
3830 },
3831 {
3832 "name": "j0k3r/php-readability",
3833 "version": "1.2.3",
3834 "source": {
3835 "type": "git",
3836 "url": "https://github.com/j0k3r/php-readability.git",
3837 "reference": "f808c1b0a21ae98ae6fd5bd623671c406efd74d0"
3838 },
3839 "dist": {
3840 "type": "zip",
3841 "url": "https://api.github.com/repos/j0k3r/php-readability/zipball/f808c1b0a21ae98ae6fd5bd623671c406efd74d0",
3842 "reference": "f808c1b0a21ae98ae6fd5bd623671c406efd74d0",
3843 "shasum": ""
3844 },
3845 "require": {
3846 "electrolinux/php-html5lib": "^0.1.0",
3847 "ext-mbstring": "*",
3848 "php": ">=5.6.0",
3849 "psr/log": "^1.0"
3850 },
3851 "require-dev": {
3852 "friendsofphp/php-cs-fixer": "^2.14",
3853 "monolog/monolog": "^1.24",
3854 "php-coveralls/php-coveralls": "^2.1",
3855 "symfony/phpunit-bridge": "^4.2.3"
3856 },
3857 "suggest": {
3858 "ext-tidy": "Used to clean up given HTML and to avoid problems with bad HTML structure."
3859 },
3860 "type": "library",
3861 "autoload": {
3862 "psr-4": {
3863 "Readability\\": "src/"
3864 }
3865 },
3866 "notification-url": "https://packagist.org/downloads/",
3867 "license": [
3868 "Apache-2.0"
3869 ],
3870 "authors": [
3871 {
3872 "name": "Keyvan Minoukadeh",
3873 "email": "keyvan@keyvan.net",
3874 "homepage": "http://keyvan.net",
3875 "role": "Developer (ported original JS code to PHP)"
3876 },
3877 {
3878 "name": "Arc90",
3879 "homepage": "http://arc90.com",
3880 "role": "Developer (original JS version)"
3881 },
3882 {
3883 "name": "Jeremy Benoist",
3884 "email": "jeremy.benoist@gmail.com",
3885 "homepage": "http://www.j0k3r.net",
3886 "role": "Developer"
3887 },
3888 {
3889 "name": "DitherSky",
3890 "homepage": "https://github.com/Dither",
3891 "role": "Developer (https://github.com/Dither/full-text-rss)"
3892 }
3893 ],
3894 "description": "Automatic article extraction from HTML",
3895 "keywords": [
3896 "article",
3897 "article extraction",
3898 "content",
3899 "content extraction",
3900 "extraction",
3901 "html"
3902 ],
3903 "time": "2019-05-11T20:07:19+00:00"
3904 },
3905 {
3906 "name": "javibravo/simpleue",
3907 "version": "2.1.0",
3908 "source": {
3909 "type": "git",
3910 "url": "https://github.com/javibravo/simpleue.git",
3911 "reference": "b12ccea0631cd3f6128ab91178fc5363f6e14ff6"
3912 },
3913 "dist": {
3914 "type": "zip",
3915 "url": "https://api.github.com/repos/javibravo/simpleue/zipball/b12ccea0631cd3f6128ab91178fc5363f6e14ff6",
3916 "reference": "b12ccea0631cd3f6128ab91178fc5363f6e14ff6",
3917 "shasum": ""
3918 },
3919 "require": {
3920 "php": ">=5.5",
3921 "psr/log": "~1.0"
3922 },
3923 "require-dev": {
3924 "aws/aws-sdk-php": "^3.9",
3925 "pda/pheanstalk": "^3.1",
3926 "phpunit/phpunit": "4.0.*",
3927 "predis/predis": "^1.0"
3928 },
3929 "suggest": {
3930 "aws/aws-sdk-php": "Allow work with AWS Simple Queue Service (SQS) queues",
3931 "ext-redis": "Allow work with Redis Locker",
3932 "pda/pheanstalk": "Allow work with Beanstalkd queues",
3933 "predis/predis": "Allow work with Redis queues"
3934 },
3935 "type": "library",
3936 "autoload": {
3937 "psr-4": {
3938 "Simpleue\\": "src/Simpleue"
3939 }
3940 },
3941 "notification-url": "https://packagist.org/downloads/",
3942 "license": [
3943 "MIT"
3944 ],
3945 "authors": [
3946 {
3947 "name": "Javier Bravo",
3948 "email": "javibravo85@gmail.com"
3949 }
3950 ],
3951 "description": "Php package to manage queue tasks in a simple way",
3952 "homepage": "http://github.com/javibravo/simpleue",
3953 "keywords": [
3954 "job",
3955 "queue",
3956 "redis",
3957 "sqs",
3958 "task"
3959 ],
3960 "time": "2017-11-15T13:41:13+00:00"
3961 },
3962 {
3963 "name": "jdorn/sql-formatter",
3964 "version": "v1.2.17",
3965 "source": {
3966 "type": "git",
3967 "url": "https://github.com/jdorn/sql-formatter.git",
3968 "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc"
3969 },
3970 "dist": {
3971 "type": "zip",
3972 "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc",
3973 "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc",
3974 "shasum": ""
3975 },
3976 "require": {
3977 "php": ">=5.2.4"
3978 },
3979 "require-dev": {
3980 "phpunit/phpunit": "3.7.*"
3981 },
3982 "type": "library",
3983 "extra": {
3984 "branch-alias": {
3985 "dev-master": "1.3.x-dev"
3986 }
3987 },
3988 "autoload": {
3989 "classmap": [
3990 "lib"
3991 ]
3992 },
3993 "notification-url": "https://packagist.org/downloads/",
3994 "license": [
3995 "MIT"
3996 ],
3997 "authors": [
3998 {
3999 "name": "Jeremy Dorn",
4000 "email": "jeremy@jeremydorn.com",
4001 "homepage": "http://jeremydorn.com/"
4002 }
4003 ],
4004 "description": "a PHP SQL highlighting library",
4005 "homepage": "https://github.com/jdorn/sql-formatter/",
4006 "keywords": [
4007 "highlight",
4008 "sql"
4009 ],
4010 "time": "2014-01-12T16:20:24+00:00"
4011 },
4012 {
4013 "name": "jean85/pretty-package-versions",
4014 "version": "1.2",
4015 "source": {
4016 "type": "git",
4017 "url": "https://github.com/Jean85/pretty-package-versions.git",
4018 "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48"
4019 },
4020 "dist": {
4021 "type": "zip",
4022 "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/75c7effcf3f77501d0e0caa75111aff4daa0dd48",
4023 "reference": "75c7effcf3f77501d0e0caa75111aff4daa0dd48",
4024 "shasum": ""
4025 },
4026 "require": {
4027 "ocramius/package-versions": "^1.2.0",
4028 "php": "^7.0"
4029 },
4030 "require-dev": {
4031 "phpunit/phpunit": "^6.0"
4032 },
4033 "type": "library",
4034 "extra": {
4035 "branch-alias": {
4036 "dev-master": "1.x-dev"
4037 }
4038 },
4039 "autoload": {
4040 "psr-4": {
4041 "Jean85\\": "src/"
4042 }
4043 },
4044 "notification-url": "https://packagist.org/downloads/",
4045 "license": [
4046 "MIT"
4047 ],
4048 "authors": [
4049 {
4050 "name": "Alessandro Lai",
4051 "email": "alessandro.lai85@gmail.com"
4052 }
4053 ],
4054 "description": "A wrapper for ocramius/package-versions to get pretty versions strings",
4055 "keywords": [
4056 "composer",
4057 "package",
4058 "release",
4059 "versions"
4060 ],
4061 "time": "2018-06-13T13:22:40+00:00"
4062 },
4063 {
4064 "name": "jms/metadata",
4065 "version": "1.7.0",
4066 "source": {
4067 "type": "git",
4068 "url": "https://github.com/schmittjoh/metadata.git",
4069 "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8"
4070 },
4071 "dist": {
4072 "type": "zip",
4073 "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/e5854ab1aa643623dc64adde718a8eec32b957a8",
4074 "reference": "e5854ab1aa643623dc64adde718a8eec32b957a8",
4075 "shasum": ""
4076 },
4077 "require": {
4078 "php": ">=5.3.0"
4079 },
4080 "require-dev": {
4081 "doctrine/cache": "~1.0",
4082 "symfony/cache": "~3.1"
4083 },
4084 "type": "library",
4085 "extra": {
4086 "branch-alias": {
4087 "dev-master": "1.5.x-dev"
4088 }
4089 },
4090 "autoload": {
4091 "psr-0": {
4092 "Metadata\\": "src/"
4093 }
4094 },
4095 "notification-url": "https://packagist.org/downloads/",
4096 "license": [
4097 "MIT"
4098 ],
4099 "authors": [
4100 {
4101 "name": "Asmir Mustafic",
4102 "email": "goetas@gmail.com"
4103 },
4104 {
4105 "name": "Johannes M. Schmitt",
4106 "email": "schmittjoh@gmail.com"
4107 }
4108 ],
4109 "description": "Class/method/property metadata management in PHP",
4110 "keywords": [
4111 "annotations",
4112 "metadata",
4113 "xml",
4114 "yaml"
4115 ],
4116 "time": "2018-10-26T12:40:10+00:00"
4117 },
4118 {
4119 "name": "jms/parser-lib",
4120 "version": "1.0.0",
4121 "source": {
4122 "type": "git",
4123 "url": "https://github.com/schmittjoh/parser-lib.git",
4124 "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d"
4125 },
4126 "dist": {
4127 "type": "zip",
4128 "url": "https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d",
4129 "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d",
4130 "shasum": ""
4131 },
4132 "require": {
4133 "phpoption/phpoption": ">=0.9,<2.0-dev"
4134 },
4135 "type": "library",
4136 "extra": {
4137 "branch-alias": {
4138 "dev-master": "1.0-dev"
4139 }
4140 },
4141 "autoload": {
4142 "psr-0": {
4143 "JMS\\": "src/"
4144 }
4145 },
4146 "notification-url": "https://packagist.org/downloads/",
4147 "license": [
4148 "Apache2"
4149 ],
4150 "description": "A library for easily creating recursive-descent parsers.",
4151 "time": "2012-11-18T18:08:43+00:00"
4152 },
4153 {
4154 "name": "jms/serializer",
4155 "version": "1.14.0",
4156 "source": {
4157 "type": "git",
4158 "url": "https://github.com/schmittjoh/serializer.git",
4159 "reference": "ee96d57024af9a7716d56fcbe3aa94b3d030f3ca"
4160 },
4161 "dist": {
4162 "type": "zip",
4163 "url": "https://api.github.com/repos/schmittjoh/serializer/zipball/ee96d57024af9a7716d56fcbe3aa94b3d030f3ca",
4164 "reference": "ee96d57024af9a7716d56fcbe3aa94b3d030f3ca",
4165 "shasum": ""
4166 },
4167 "require": {
4168 "doctrine/annotations": "^1.0",
4169 "doctrine/instantiator": "^1.0.3",
4170 "jms/metadata": "^1.3",
4171 "jms/parser-lib": "1.*",
4172 "php": "^5.5|^7.0",
4173 "phpcollection/phpcollection": "~0.1",
4174 "phpoption/phpoption": "^1.1"
4175 },
4176 "conflict": {
4177 "twig/twig": "<1.12"
4178 },
4179 "require-dev": {
4180 "doctrine/orm": "~2.1",
4181 "doctrine/phpcr-odm": "^1.3|^2.0",
4182 "ext-pdo_sqlite": "*",
4183 "jackalope/jackalope-doctrine-dbal": "^1.1.5",
4184 "phpunit/phpunit": "^4.8|^5.0",
4185 "propel/propel1": "~1.7",
4186 "psr/container": "^1.0",
4187 "symfony/dependency-injection": "^2.7|^3.3|^4.0",
4188 "symfony/expression-language": "^2.6|^3.0",
4189 "symfony/filesystem": "^2.1",
4190 "symfony/form": "~2.1|^3.0",
4191 "symfony/translation": "^2.1|^3.0",
4192 "symfony/validator": "^2.2|^3.0",
4193 "symfony/yaml": "^2.1|^3.0",
4194 "twig/twig": "~1.12|~2.0"
4195 },
4196 "suggest": {
4197 "doctrine/cache": "Required if you like to use cache functionality.",
4198 "doctrine/collections": "Required if you like to use doctrine collection types as ArrayCollection.",
4199 "symfony/yaml": "Required if you'd like to serialize data to YAML format."
4200 },
4201 "type": "library",
4202 "extra": {
4203 "branch-alias": {
4204 "dev-1.x": "1.14-dev"
4205 }
4206 },
4207 "autoload": {
4208 "psr-0": {
4209 "JMS\\Serializer": "src/"
4210 }
4211 },
4212 "notification-url": "https://packagist.org/downloads/",
4213 "license": [
4214 "MIT"
4215 ],
4216 "authors": [
4217 {
4218 "name": "Asmir Mustafic",
4219 "email": "goetas@gmail.com"
4220 },
4221 {
4222 "name": "Johannes M. Schmitt",
4223 "email": "schmittjoh@gmail.com"
4224 }
4225 ],
4226 "description": "Library for (de-)serializing data of any complexity; supports XML, JSON, and YAML.",
4227 "homepage": "http://jmsyst.com/libs/serializer",
4228 "keywords": [
4229 "deserialization",
4230 "jaxb",
4231 "json",
4232 "serialization",
4233 "xml"
4234 ],
4235 "time": "2019-04-17T08:12:16+00:00"
4236 },
4237 {
4238 "name": "jms/serializer-bundle",
4239 "version": "2.4.4",
4240 "source": {
4241 "type": "git",
4242 "url": "https://github.com/schmittjoh/JMSSerializerBundle.git",
4243 "reference": "92ee808c64c1c180775a0e57d00e3be0674668fb"
4244 },
4245 "dist": {
4246 "type": "zip",
4247 "url": "https://api.github.com/repos/schmittjoh/JMSSerializerBundle/zipball/92ee808c64c1c180775a0e57d00e3be0674668fb",
4248 "reference": "92ee808c64c1c180775a0e57d00e3be0674668fb",
4249 "shasum": ""
4250 },
4251 "require": {
4252 "jms/serializer": "^1.10",
4253 "php": "^5.4|^7.0",
4254 "phpoption/phpoption": "^1.1.0",
4255 "symfony/framework-bundle": "~2.3|~3.0|~4.0"
4256 },
4257 "require-dev": {
4258 "doctrine/orm": "*",
4259 "phpunit/phpunit": "^4.8.35|^5.4.3|^6.0",
4260 "symfony/expression-language": "~2.6|~3.0|~4.0",
4261 "symfony/finder": "^2.3|^3.0|^4.0",
4262 "symfony/form": "*",
4263 "symfony/stopwatch": "*",
4264 "symfony/twig-bundle": "*",
4265 "symfony/validator": "*",
4266 "symfony/yaml": "*"
4267 },
4268 "suggest": {
4269 "jms/di-extra-bundle": "Required to get lazy loading (de)serialization visitors, ~1.3",
4270 "symfony/finder": "Required for cache warmup, supported versions ^2.3|^3.0|^4.0"
4271 },
4272 "type": "symfony-bundle",
4273 "extra": {
4274 "branch-alias": {
4275 "dev-master": "2.4-dev"
4276 }
4277 },
4278 "autoload": {
4279 "psr-4": {
4280 "JMS\\SerializerBundle\\": ""
4281 },
4282 "exclude-from-classmap": [
4283 "/Tests/"
4284 ]
4285 },
4286 "notification-url": "https://packagist.org/downloads/",
4287 "license": [
4288 "MIT"
4289 ],
4290 "authors": [
4291 {
4292 "name": "Asmir Mustafic",
4293 "email": "goetas@gmail.com"
4294 },
4295 {
4296 "name": "Johannes M. Schmitt",
4297 "email": "schmittjoh@gmail.com"
4298 }
4299 ],
4300 "description": "Allows you to easily serialize, and deserialize data of any complexity",
4301 "homepage": "http://jmsyst.com/bundles/JMSSerializerBundle",
4302 "keywords": [
4303 "deserialization",
4304 "jaxb",
4305 "json",
4306 "serialization",
4307 "xml"
4308 ],
4309 "time": "2019-03-30T10:26:09+00:00"
4310 },
4311 {
4312 "name": "kphoen/rulerz",
4313 "version": "0.21.1",
4314 "source": {
4315 "type": "git",
4316 "url": "https://github.com/K-Phoen/rulerz.git",
4317 "reference": "d28a1bd59b4e66cc9fcdeee965f13f685eb9ce41"
4318 },
4319 "dist": {
4320 "type": "zip",
4321 "url": "https://api.github.com/repos/K-Phoen/rulerz/zipball/d28a1bd59b4e66cc9fcdeee965f13f685eb9ce41",
4322 "reference": "d28a1bd59b4e66cc9fcdeee965f13f685eb9ce41",
4323 "shasum": ""
4324 },
4325 "require": {
4326 "hoa/ruler": "~2.0",
4327 "php": ">=7.1",
4328 "symfony/property-access": "~3.0|~4.0"
4329 },
4330 "require-dev": {
4331 "behat/behat": "~3.0",
4332 "coduo/phpspec-data-provider-extension": "~1.0,!=1.0.2",
4333 "doctrine/orm": "~2.4",
4334 "elasticsearch/elasticsearch": "~1.0",
4335 "illuminate/database": "~5.0",
4336 "kphoen/rusty": "dev-master",
4337 "liip/rmt": "^1.2",
4338 "mikey179/vfsstream": "~1.4",
4339 "phpspec/phpspec": "~2.0,>=2.4-dev",
4340 "pomm-project/cli": "~2.0@dev",
4341 "pomm-project/foundation": "~2.0@dev",
4342 "pomm-project/model-manager": "~2.0.@dev",
4343 "ruflin/elastica": "~1.0",
4344 "solarium/solarium": "~3.0",
4345 "vlucas/phpdotenv": "~2.1"
4346 },
4347 "suggest": {
4348 "doctrine/orm": "To execute rules as Doctrine queries",
4349 "elasticsearch/elasticsearch": "To execute rules as Elasticsearch queries",
4350 "kphoen/rulerz-spec-builder": "If you want a specification builder",
4351 "pomm-project/model-manager": "To execute rules as Pomm queries",
4352 "solarium/solarium": "To execute rules as Solr queries"
4353 },
4354 "type": "library",
4355 "extra": {
4356 "branch-alias": {
4357 "dev-master": "1.0.x-dev"
4358 }
4359 },
4360 "autoload": {
4361 "psr-4": {
4362 "RulerZ\\": "src/"
4363 }
4364 },
4365 "notification-url": "https://packagist.org/downloads/",
4366 "license": [
4367 "MIT"
4368 ],
4369 "authors": [
4370 {
4371 "name": "Kévin Gomez",
4372 "email": "contact@kevingomez.fr"
4373 }
4374 ],
4375 "description": "Powerful implementation of the Specification pattern",
4376 "homepage": "https://github.com/K-Phoen/RulerZ",
4377 "keywords": [
4378 "doctrine",
4379 "specification"
4380 ],
4381 "time": "2018-09-18T15:15:42+00:00"
4382 },
4383 {
4384 "name": "kphoen/rulerz-bridge",
4385 "version": "1.1.1",
4386 "source": {
4387 "type": "git",
4388 "url": "https://github.com/K-Phoen/rulerz-bridge.git",
4389 "reference": "fdad5856b669d59b5e4bda47c4e927a0485bf7a0"
4390 },
4391 "dist": {
4392 "type": "zip",
4393 "url": "https://api.github.com/repos/K-Phoen/rulerz-bridge/zipball/fdad5856b669d59b5e4bda47c4e927a0485bf7a0",
4394 "reference": "fdad5856b669d59b5e4bda47c4e927a0485bf7a0",
4395 "shasum": ""
4396 },
4397 "require": {
4398 "kphoen/rulerz": "~0.19,>=0.19.3|^1.0",
4399 "php": ">=7.1",
4400 "symfony/form": "^3.0|^4.0",
4401 "symfony/validator": "^3.0|^4.0"
4402 },
4403 "require-dev": {
4404 "liip/rmt": "^1.2",
4405 "phpunit/phpunit": "~7.1",
4406 "symfony/phpunit-bridge": "^3.0|^4.0"
4407 },
4408 "type": "symfony-bridge",
4409 "autoload": {
4410 "psr-4": {
4411 "Symfony\\Bridge\\RulerZ\\": ""
4412 },
4413 "exclude-from-classmap": [
4414 "/Tests/"
4415 ]
4416 },
4417 "notification-url": "https://packagist.org/downloads/",
4418 "license": [
4419 "MIT"
4420 ],
4421 "authors": [
4422 {
4423 "name": "Kévin Gomez",
4424 "email": "contact@kevingomez.fr"
4425 }
4426 ],
4427 "description": "Symfony RulerZ Bridge",
4428 "homepage": "https://github.com/K-Phoen/rulerz-bridge",
4429 "keywords": [
4430 "Bridge",
4431 "doctrine",
4432 "ruler",
4433 "rulerz",
4434 "specification",
4435 "symfony"
4436 ],
4437 "time": "2018-10-01T14:17:27+00:00"
4438 },
4439 {
4440 "name": "kphoen/rulerz-bundle",
4441 "version": "0.15.0",
4442 "source": {
4443 "type": "git",
4444 "url": "https://github.com/K-Phoen/RulerZBundle.git",
4445 "reference": "f25f2eddfd311047f0f0ece2684b1f6463cc41ad"
4446 },
4447 "dist": {
4448 "type": "zip",
4449 "url": "https://api.github.com/repos/K-Phoen/RulerZBundle/zipball/f25f2eddfd311047f0f0ece2684b1f6463cc41ad",
4450 "reference": "f25f2eddfd311047f0f0ece2684b1f6463cc41ad",
4451 "shasum": ""
4452 },
4453 "require": {
4454 "kphoen/rulerz": "~0.17,>=0.19.3",
4455 "kphoen/rulerz-bridge": "^1.0",
4456 "php": ">=7.1",
4457 "symfony/framework-bundle": "^3.0|^4.0"
4458 },
4459 "require-dev": {
4460 "liip/rmt": "^1.2",
4461 "matthiasnoback/symfony-dependency-injection-test": "^3.0",
4462 "mikey179/vfsstream": "^1.6",
4463 "phpunit/phpunit": "^7.1",
4464 "symfony/phpunit-bridge": "^3.0|^4.0"
4465 },
4466 "type": "symfony-bundle",
4467 "autoload": {
4468 "psr-4": {
4469 "KPhoen\\RulerZBundle\\": ""
4470 },
4471 "exclude-from-classmap": [
4472 "/Tests/"
4473 ]
4474 },
4475 "notification-url": "https://packagist.org/downloads/",
4476 "license": [
4477 "MIT"
4478 ],
4479 "authors": [
4480 {
4481 "name": "Kévin Gomez",
4482 "email": "contact@kevingomez.fr"
4483 }
4484 ],
4485 "description": "Symfony2 Bundle for RulerZ",
4486 "homepage": "https://github.com/K-Phoen/RulerZBundle",
4487 "keywords": [
4488 "doctrine",
4489 "ruler",
4490 "rulerz",
4491 "specification"
4492 ],
4493 "time": "2018-09-17T09:02:32+00:00"
4494 },
4495 {
4496 "name": "lcobucci/jwt",
4497 "version": "3.3.1",
4498 "source": {
4499 "type": "git",
4500 "url": "https://github.com/lcobucci/jwt.git",
4501 "reference": "a11ec5f4b4d75d1fcd04e133dede4c317aac9e18"
4502 },
4503 "dist": {
4504 "type": "zip",
4505 "url": "https://api.github.com/repos/lcobucci/jwt/zipball/a11ec5f4b4d75d1fcd04e133dede4c317aac9e18",
4506 "reference": "a11ec5f4b4d75d1fcd04e133dede4c317aac9e18",
4507 "shasum": ""
4508 },
4509 "require": {
4510 "ext-mbstring": "*",
4511 "ext-openssl": "*",
4512 "php": "^5.6 || ^7.0"
4513 },
4514 "require-dev": {
4515 "mikey179/vfsstream": "~1.5",
4516 "phpmd/phpmd": "~2.2",
4517 "phpunit/php-invoker": "~1.1",
4518 "phpunit/phpunit": "^5.7 || ^7.3",
4519 "squizlabs/php_codesniffer": "~2.3"
4520 },
4521 "type": "library",
4522 "extra": {
4523 "branch-alias": {
4524 "dev-master": "3.1-dev"
4525 }
4526 },
4527 "autoload": {
4528 "psr-4": {
4529 "Lcobucci\\JWT\\": "src"
4530 }
4531 },
4532 "notification-url": "https://packagist.org/downloads/",
4533 "license": [
4534 "BSD-3-Clause"
4535 ],
4536 "authors": [
4537 {
4538 "name": "Luís Otávio Cobucci Oblonczyk",
4539 "email": "lcobucci@gmail.com",
4540 "role": "Developer"
4541 }
4542 ],
4543 "description": "A simple library to work with JSON Web Token and JSON Web Signature",
4544 "keywords": [
4545 "JWS",
4546 "jwt"
4547 ],
4548 "time": "2019-05-24T18:30:49+00:00"
4549 },
4550 {
4551 "name": "lexik/form-filter-bundle",
4552 "version": "v5.0.10",
4553 "source": {
4554 "type": "git",
4555 "url": "https://github.com/lexik/LexikFormFilterBundle.git",
4556 "reference": "92df0638173979dc906bda7a33a10b98429d2057"
4557 },
4558 "dist": {
4559 "type": "zip",
4560 "url": "https://api.github.com/repos/lexik/LexikFormFilterBundle/zipball/92df0638173979dc906bda7a33a10b98429d2057",
4561 "reference": "92df0638173979dc906bda7a33a10b98429d2057",
4562 "shasum": ""
4563 },
4564 "require": {
4565 "doctrine/orm": "^2.4.8",
4566 "php": ">=5.5.9",
4567 "symfony/form": "~2.8|~3.0|^4.0",
4568 "symfony/framework-bundle": "~2.8|~3.0|^4.0"
4569 },
4570 "require-dev": {
4571 "doctrine/mongodb-odm-bundle": "^3.0",
4572 "phpunit/phpunit": "~5.0|^7.5"
4573 },
4574 "suggest": {
4575 "alcaeus/mongo-php-adapter": "Install this package if using the PHP 7 MongoDB Driver"
4576 },
4577 "type": "symfony-bundle",
4578 "extra": {
4579 "branch-alias": {
4580 "dev-master": "5.x.x-dev"
4581 }
4582 },
4583 "autoload": {
4584 "psr-4": {
4585 "Lexik\\Bundle\\FormFilterBundle\\": ""
4586 }
4587 },
4588 "notification-url": "https://packagist.org/downloads/",
4589 "license": [
4590 "MIT"
4591 ],
4592 "authors": [
4593 {
4594 "name": "Dev Lexik",
4595 "email": "dev@lexik.fr"
4596 },
4597 {
4598 "name": "Cedric Girard",
4599 "email": "c.girard@lexik.fr"
4600 }
4601 ],
4602 "description": "This bundle aim to provide classes to build some form filters and then build a doctrine query from this form filter.",
4603 "homepage": "https://github.com/lexik/LexikFormFilterBundle",
4604 "keywords": [
4605 "bundle",
4606 "doctrine",
4607 "filter",
4608 "form",
4609 "symfony"
4610 ],
4611 "time": "2019-04-17T17:58:44+00:00"
4612 },
4613 {
4614 "name": "liip/theme-bundle",
4615 "version": "1.6.1",
4616 "source": {
4617 "type": "git",
4618 "url": "https://github.com/liip/LiipThemeBundle.git",
4619 "reference": "f40637ce0523a4e0968e203c09a46acfa4b95d4d"
4620 },
4621 "dist": {
4622 "type": "zip",
4623 "url": "https://api.github.com/repos/liip/LiipThemeBundle/zipball/f40637ce0523a4e0968e203c09a46acfa4b95d4d",
4624 "reference": "f40637ce0523a4e0968e203c09a46acfa4b95d4d",
4625 "shasum": ""
4626 },
4627 "require": {
4628 "php": "^5.3.9|^7.0",
4629 "psr/log": "~1.0",
4630 "symfony/finder": "^2.7|^3.0|^4.0",
4631 "symfony/framework-bundle": "^2.7|^3.0|^4.0",
4632 "symfony/templating": "^2.7|^3.0|^4.0",
4633 "symfony/twig-bundle": "^2.7|^3.0|^4.0",
4634 "twig/twig": "^1.27|^2.0"
4635 },
4636 "conflict": {
4637 "sebastian/comparator": "1.2.3"
4638 },
4639 "require-dev": {
4640 "phpunit/phpunit": "^4.8.35|^6.0",
4641 "symfony/console": "^2.7|^3.0|^4.0",
4642 "symfony/expression-language": "^2.7|^3.0|^4.0"
4643 },
4644 "type": "symfony-bundle",
4645 "extra": {
4646 "branch-alias": {
4647 "dev-master": "1.4-dev"
4648 }
4649 },
4650 "autoload": {
4651 "psr-4": {
4652 "Liip\\ThemeBundle\\": ""
4653 }
4654 },
4655 "notification-url": "https://packagist.org/downloads/",
4656 "license": [
4657 "MIT"
4658 ],
4659 "authors": [
4660 {
4661 "name": "Community contributions",
4662 "homepage": "https://github.com/liip/LiipThemeBundle/contributors"
4663 },
4664 {
4665 "name": "Liip AG",
4666 "homepage": "http://www.liip.ch/"
4667 }
4668 ],
4669 "description": "Provides theming support for #Symfony2 Bundles",
4670 "keywords": [
4671 "themes",
4672 "theming"
4673 ],
4674 "time": "2018-10-08T07:20:20+00:00"
4675 },
4676 {
4677 "name": "masterminds/html5",
4678 "version": "2.6.0",
4679 "source": {
4680 "type": "git",
4681 "url": "https://github.com/Masterminds/html5-php.git",
4682 "reference": "c961ca6a0a81dc6b55b6859b3f9ea7f402edf9ad"
4683 },
4684 "dist": {
4685 "type": "zip",
4686 "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/c961ca6a0a81dc6b55b6859b3f9ea7f402edf9ad",
4687 "reference": "c961ca6a0a81dc6b55b6859b3f9ea7f402edf9ad",
4688 "shasum": ""
4689 },
4690 "require": {
4691 "ext-ctype": "*",
4692 "ext-dom": "*",
4693 "ext-libxml": "*",
4694 "php": ">=5.3.0"
4695 },
4696 "require-dev": {
4697 "phpunit/phpunit": "^4.8.35",
4698 "sami/sami": "~2.0",
4699 "satooshi/php-coveralls": "1.0.*"
4700 },
4701 "type": "library",
4702 "extra": {
4703 "branch-alias": {
4704 "dev-master": "2.6-dev"
4705 }
4706 },
4707 "autoload": {
4708 "psr-4": {
4709 "Masterminds\\": "src"
4710 }
4711 },
4712 "notification-url": "https://packagist.org/downloads/",
4713 "license": [
4714 "MIT"
4715 ],
4716 "authors": [
4717 {
4718 "name": "Matt Butcher",
4719 "email": "technosophos@gmail.com"
4720 },
4721 {
4722 "name": "Asmir Mustafic",
4723 "email": "goetas@gmail.com"
4724 },
4725 {
4726 "name": "Matt Farina",
4727 "email": "matt@mattfarina.com"
4728 }
4729 ],
4730 "description": "An HTML5 parser and serializer.",
4731 "homepage": "http://masterminds.github.io/html5-php",
4732 "keywords": [
4733 "HTML5",
4734 "dom",
4735 "html",
4736 "parser",
4737 "querypath",
4738 "serializer",
4739 "xml"
4740 ],
4741 "time": "2019-03-10T11:41:28+00:00"
4742 },
4743 {
4744 "name": "mgargano/simplehtmldom",
4745 "version": "1.5",
4746 "source": {
4747 "type": "git",
4748 "url": "https://github.com/matgargano/simplehtmldom.git",
4749 "reference": "37fb0d7c1bda45c5a4cf14fdef56c1edf6aa42be"
4750 },
4751 "dist": {
4752 "type": "zip",
4753 "url": "https://api.github.com/repos/matgargano/simplehtmldom/zipball/37fb0d7c1bda45c5a4cf14fdef56c1edf6aa42be",
4754 "reference": "37fb0d7c1bda45c5a4cf14fdef56c1edf6aa42be",
4755 "shasum": ""
4756 },
4757 "require": {
4758 "php": ">=5.3.0"
4759 },
4760 "type": "library",
4761 "autoload": {
4762 "psr-0": {
4763 "SimpleHtmlDom": "src/"
4764 },
4765 "files": [
4766 "src/simple_html_dom.php"
4767 ]
4768 },
4769 "notification-url": "https://packagist.org/downloads/",
4770 "license": [
4771 "The MIT License"
4772 ],
4773 "authors": [
4774 {
4775 "name": "S.C. Chen",
4776 "email": "me578022@gmail.com"
4777 }
4778 ],
4779 "description": "Composer package that gives you access to and (unlike all the others at this time) autoloads S.C. Chen's PHP Simple HTML DOM Parser Library",
4780 "homepage": "http://simplehtmldom.sourceforge.net/",
4781 "keywords": [
4782 "Simple",
4783 "dom",
4784 "html"
4785 ],
4786 "time": "2014-01-05T18:17:34+00:00"
4787 },
4788 {
4789 "name": "michelf/php-markdown",
4790 "version": "1.8.0",
4791 "source": {
4792 "type": "git",
4793 "url": "https://github.com/michelf/php-markdown.git",
4794 "reference": "01ab082b355bf188d907b9929cd99b2923053495"
4795 },
4796 "dist": {
4797 "type": "zip",
4798 "url": "https://api.github.com/repos/michelf/php-markdown/zipball/01ab082b355bf188d907b9929cd99b2923053495",
4799 "reference": "01ab082b355bf188d907b9929cd99b2923053495",
4800 "shasum": ""
4801 },
4802 "require": {
4803 "php": ">=5.3.0"
4804 },
4805 "type": "library",
4806 "autoload": {
4807 "psr-4": {
4808 "Michelf\\": "Michelf/"
4809 }
4810 },
4811 "notification-url": "https://packagist.org/downloads/",
4812 "license": [
4813 "BSD-3-Clause"
4814 ],
4815 "authors": [
4816 {
4817 "name": "Michel Fortin",
4818 "email": "michel.fortin@michelf.ca",
4819 "homepage": "https://michelf.ca/",
4820 "role": "Developer"
4821 },
4822 {
4823 "name": "John Gruber",
4824 "homepage": "https://daringfireball.net/"
4825 }
4826 ],
4827 "description": "PHP Markdown",
4828 "homepage": "https://michelf.ca/projects/php-markdown/",
4829 "keywords": [
4830 "markdown"
4831 ],
4832 "time": "2018-01-15T00:49:33+00:00"
4833 },
4834 {
4835 "name": "mnapoli/piwik-twig-extension",
4836 "version": "1.0.0",
4837 "source": {
4838 "type": "git",
4839 "url": "https://github.com/mnapoli/PiwikTwigExtension.git",
4840 "reference": "5171ab7221830a9d377add03dd60dbe6bd7b331f"
4841 },
4842 "dist": {
4843 "type": "zip",
4844 "url": "https://api.github.com/repos/mnapoli/PiwikTwigExtension/zipball/5171ab7221830a9d377add03dd60dbe6bd7b331f",
4845 "reference": "5171ab7221830a9d377add03dd60dbe6bd7b331f",
4846 "shasum": ""
4847 },
4848 "require": {
4849 "php": ">=5.4",
4850 "twig/twig": "~1.10"
4851 },
4852 "require-dev": {
4853 "phpunit/phpunit": "~4.0"
4854 },
4855 "type": "library",
4856 "autoload": {
4857 "psr-4": {
4858 "PiwikTwigExtension\\": "src/"
4859 }
4860 },
4861 "notification-url": "https://packagist.org/downloads/",
4862 "license": [
4863 "MIT"
4864 ],
4865 "time": "2014-09-16T06:51:19+00:00"
4866 },
4867 {
4868 "name": "monolog/monolog",
4869 "version": "1.24.0",
4870 "source": {
4871 "type": "git",
4872 "url": "https://github.com/Seldaek/monolog.git",
4873 "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
4874 },
4875 "dist": {
4876 "type": "zip",
4877 "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
4878 "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
4879 "shasum": ""
4880 },
4881 "require": {
4882 "php": ">=5.3.0",
4883 "psr/log": "~1.0"
4884 },
4885 "provide": {
4886 "psr/log-implementation": "1.0.0"
4887 },
4888 "require-dev": {
4889 "aws/aws-sdk-php": "^2.4.9 || ^3.0",
4890 "doctrine/couchdb": "~1.0@dev",
4891 "graylog2/gelf-php": "~1.0",
4892 "jakub-onderka/php-parallel-lint": "0.9",
4893 "php-amqplib/php-amqplib": "~2.4",
4894 "php-console/php-console": "^3.1.3",
4895 "phpunit/phpunit": "~4.5",
4896 "phpunit/phpunit-mock-objects": "2.3.0",
4897 "ruflin/elastica": ">=0.90 <3.0",
4898 "sentry/sentry": "^0.13",
4899 "swiftmailer/swiftmailer": "^5.3|^6.0"
4900 },
4901 "suggest": {
4902 "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
4903 "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
4904 "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
4905 "ext-mongo": "Allow sending log messages to a MongoDB server",
4906 "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
4907 "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
4908 "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
4909 "php-console/php-console": "Allow sending log messages to Google Chrome",
4910 "rollbar/rollbar": "Allow sending log messages to Rollbar",
4911 "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
4912 "sentry/sentry": "Allow sending log messages to a Sentry server"
4913 },
4914 "type": "library",
4915 "extra": {
4916 "branch-alias": {
4917 "dev-master": "2.0.x-dev"
4918 }
4919 },
4920 "autoload": {
4921 "psr-4": {
4922 "Monolog\\": "src/Monolog"
4923 }
4924 },
4925 "notification-url": "https://packagist.org/downloads/",
4926 "license": [
4927 "MIT"
4928 ],
4929 "authors": [
4930 {
4931 "name": "Jordi Boggiano",
4932 "email": "j.boggiano@seld.be",
4933 "homepage": "http://seld.be"
4934 }
4935 ],
4936 "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
4937 "homepage": "http://github.com/Seldaek/monolog",
4938 "keywords": [
4939 "log",
4940 "logging",
4941 "psr-3"
4942 ],
4943 "time": "2018-11-05T09:00:11+00:00"
4944 },
4945 {
4946 "name": "nelmio/api-doc-bundle",
4947 "version": "2.13.4",
4948 "target-dir": "Nelmio/ApiDocBundle",
4949 "source": {
4950 "type": "git",
4951 "url": "https://github.com/nelmio/NelmioApiDocBundle.git",
4952 "reference": "28802f2c44dbbf29aa7f5dc80a10f44d3558f580"
4953 },
4954 "dist": {
4955 "type": "zip",
4956 "url": "https://api.github.com/repos/nelmio/NelmioApiDocBundle/zipball/28802f2c44dbbf29aa7f5dc80a10f44d3558f580",
4957 "reference": "28802f2c44dbbf29aa7f5dc80a10f44d3558f580",
4958 "shasum": ""
4959 },
4960 "require": {
4961 "michelf/php-markdown": "~1.4",
4962 "php": ">=5.4",
4963 "symfony/console": "~2.3|~3.0|~4.0",
4964 "symfony/framework-bundle": "~2.3|~3.0|~4.0",
4965 "symfony/twig-bundle": "~2.3|~3.0|~4.0"
4966 },
4967 "conflict": {
4968 "jms/serializer": "<0.12",
4969 "jms/serializer-bundle": "<0.11",
4970 "symfony/symfony": "~2.7.8",
4971 "twig/twig": "<1.12"
4972 },
4973 "require-dev": {
4974 "doctrine/doctrine-bundle": "~1.5",
4975 "doctrine/orm": "~2.3",
4976 "dunglas/api-bundle": "~1.0",
4977 "friendsofsymfony/rest-bundle": "~1.0|~2.0",
4978 "jms/serializer-bundle": ">=0.11",
4979 "sensio/framework-extra-bundle": "~3.0",
4980 "symfony/browser-kit": "~2.3|~3.0|~4.0",
4981 "symfony/css-selector": "~2.3|~3.0|~4.0",
4982 "symfony/finder": "~2.3|~3.0|~4.0",
4983 "symfony/form": "~2.3|~3.0|~4.0",
4984 "symfony/phpunit-bridge": "~2.7|~3.0|~4.0",
4985 "symfony/serializer": "~2.7|~3.0|~4.0",
4986 "symfony/validator": "~2.3|~3.0|~4.0",
4987 "symfony/yaml": "~2.3|~3.0|~4.0"
4988 },
4989 "suggest": {
4990 "dunglas/api-bundle": "For making use of resources definitions of DunglasApiBundle.",
4991 "friendsofsymfony/rest-bundle": "For making use of REST information in the doc.",
4992 "jms/serializer": "For making use of serializer information in the doc.",
4993 "symfony/form": "For using form definitions as input.",
4994 "symfony/validator": "For making use of validator information in the doc."
4995 },
4996 "type": "symfony-bundle",
4997 "extra": {
4998 "branch-alias": {
4999 "dev-2.x": "2.13-dev"
5000 }
5001 },
5002 "autoload": {
5003 "psr-0": {
5004 "Nelmio\\ApiDocBundle": ""
5005 }
5006 },
5007 "notification-url": "https://packagist.org/downloads/",
5008 "license": [
5009 "MIT"
5010 ],
5011 "authors": [
5012 {
5013 "name": "Nelmio",
5014 "homepage": "http://nelm.io"
5015 },
5016 {
5017 "name": "Symfony Community",
5018 "homepage": "https://github.com/nelmio/NelmioApiDocBundle/contributors"
5019 }
5020 ],
5021 "description": "Generates documentation for your REST API from annotations",
5022 "keywords": [
5023 "api",
5024 "doc",
5025 "documentation",
5026 "rest"
5027 ],
5028 "time": "2019-06-01T13:34:59+00:00"
5029 },
5030 {
5031 "name": "nelmio/cors-bundle",
5032 "version": "1.5.5",
5033 "source": {
5034 "type": "git",
5035 "url": "https://github.com/nelmio/NelmioCorsBundle.git",
5036 "reference": "adabee944e6fe52ee566caf1770a29355b1e8d83"
5037 },
5038 "dist": {
5039 "type": "zip",
5040 "url": "https://api.github.com/repos/nelmio/NelmioCorsBundle/zipball/adabee944e6fe52ee566caf1770a29355b1e8d83",
5041 "reference": "adabee944e6fe52ee566caf1770a29355b1e8d83",
5042 "shasum": ""
5043 },
5044 "require": {
5045 "symfony/framework-bundle": "^2.7 || ^3.0 || ^4.0"
5046 },
5047 "require-dev": {
5048 "matthiasnoback/symfony-dependency-injection-test": "^1.0 || ^2.0",
5049 "mockery/mockery": "^0.9 || ^1.0",
5050 "symfony/phpunit-bridge": "^2.7 || ^3.0 || ^4.0"
5051 },
5052 "type": "symfony-bundle",
5053 "extra": {
5054 "branch-alias": {
5055 "dev-master": "1.5.x-dev"
5056 }
5057 },
5058 "autoload": {
5059 "psr-4": {
5060 "Nelmio\\CorsBundle\\": ""
5061 },
5062 "exclude-from-classmap": [
5063 "/Tests/"
5064 ]
5065 },
5066 "notification-url": "https://packagist.org/downloads/",
5067 "license": [
5068 "MIT"
5069 ],
5070 "authors": [
5071 {
5072 "name": "Nelmio",
5073 "homepage": "http://nelm.io"
5074 },
5075 {
5076 "name": "Symfony Community",
5077 "homepage": "https://github.com/nelmio/NelmioCorsBundle/contributors"
5078 }
5079 ],
5080 "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Symfony2 application",
5081 "keywords": [
5082 "api",
5083 "cors",
5084 "crossdomain"
5085 ],
5086 "time": "2019-02-27T13:13:15+00:00"
5087 },
5088 {
5089 "name": "ocramius/package-versions",
5090 "version": "1.4.0",
5091 "source": {
5092 "type": "git",
5093 "url": "https://github.com/Ocramius/PackageVersions.git",
5094 "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb"
5095 },
5096 "dist": {
5097 "type": "zip",
5098 "url": "https://api.github.com/repos/Ocramius/PackageVersions/zipball/a4d4b60d0e60da2487bd21a2c6ac089f85570dbb",
5099 "reference": "a4d4b60d0e60da2487bd21a2c6ac089f85570dbb",
5100 "shasum": ""
5101 },
5102 "require": {
5103 "composer-plugin-api": "^1.0.0",
5104 "php": "^7.1.0"
5105 },
5106 "require-dev": {
5107 "composer/composer": "^1.6.3",
5108 "doctrine/coding-standard": "^5.0.1",
5109 "ext-zip": "*",
5110 "infection/infection": "^0.7.1",
5111 "phpunit/phpunit": "^7.0.0"
5112 },
5113 "type": "composer-plugin",
5114 "extra": {
5115 "class": "PackageVersions\\Installer",
5116 "branch-alias": {
5117 "dev-master": "2.0.x-dev"
5118 }
5119 },
5120 "autoload": {
5121 "psr-4": {
5122 "PackageVersions\\": "src/PackageVersions"
5123 }
5124 },
5125 "notification-url": "https://packagist.org/downloads/",
5126 "license": [
5127 "MIT"
5128 ],
5129 "authors": [
5130 {
5131 "name": "Marco Pivetta",
5132 "email": "ocramius@gmail.com"
5133 }
5134 ],
5135 "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
5136 "time": "2019-02-21T12:16:21+00:00"
5137 },
5138 {
5139 "name": "ocramius/proxy-manager",
5140 "version": "2.1.1",
5141 "source": {
5142 "type": "git",
5143 "url": "https://github.com/Ocramius/ProxyManager.git",
5144 "reference": "e18ac876b2e4819c76349de8f78ccc8ef1554cd7"
5145 },
5146 "dist": {
5147 "type": "zip",
5148 "url": "https://api.github.com/repos/Ocramius/ProxyManager/zipball/e18ac876b2e4819c76349de8f78ccc8ef1554cd7",
5149 "reference": "e18ac876b2e4819c76349de8f78ccc8ef1554cd7",
5150 "shasum": ""
5151 },
5152 "require": {
5153 "ocramius/package-versions": "^1.1.1",
5154 "php": "^7.1.0",
5155 "zendframework/zend-code": "^3.1.0"
5156 },
5157 "require-dev": {
5158 "couscous/couscous": "^1.5.2",
5159 "ext-phar": "*",
5160 "humbug/humbug": "dev-master@DEV",
5161 "nikic/php-parser": "^3.0.4",
5162 "phpbench/phpbench": "^0.12.2",
5163 "phpstan/phpstan": "^0.6.4",
5164 "phpunit/phpunit": "^5.6.4",
5165 "phpunit/phpunit-mock-objects": "^3.4.1",
5166 "squizlabs/php_codesniffer": "^2.7.0"
5167 },
5168 "suggest": {
5169 "ocramius/generated-hydrator": "To have very fast object to array to object conversion for ghost objects",
5170 "zendframework/zend-json": "To have the JsonRpc adapter (Remote Object feature)",
5171 "zendframework/zend-soap": "To have the Soap adapter (Remote Object feature)",
5172 "zendframework/zend-xmlrpc": "To have the XmlRpc adapter (Remote Object feature)"
5173 },
5174 "type": "library",
5175 "extra": {
5176 "branch-alias": {
5177 "dev-master": "3.0.x-dev"
5178 }
5179 },
5180 "autoload": {
5181 "psr-0": {
5182 "ProxyManager\\": "src"
5183 }
5184 },
5185 "notification-url": "https://packagist.org/downloads/",
5186 "license": [
5187 "MIT"
5188 ],
5189 "authors": [
5190 {
5191 "name": "Marco Pivetta",
5192 "email": "ocramius@gmail.com",
5193 "homepage": "http://ocramius.github.io/"
5194 }
5195 ],
5196 "description": "A library providing utilities to generate, instantiate and generally operate with Object Proxies",
5197 "homepage": "https://github.com/Ocramius/ProxyManager",
5198 "keywords": [
5199 "aop",
5200 "lazy loading",
5201 "proxy",
5202 "proxy pattern",
5203 "service proxies"
5204 ],
5205 "time": "2017-05-04T11:12:50+00:00"
5206 },
5207 {
5208 "name": "pagerfanta/pagerfanta",
5209 "version": "v2.1.2",
5210 "source": {
5211 "type": "git",
5212 "url": "https://github.com/whiteoctober/Pagerfanta.git",
5213 "reference": "45a85ad426316ae37f2d007022e5b4c95bc3aef4"
5214 },
5215 "dist": {
5216 "type": "zip",
5217 "url": "https://api.github.com/repos/whiteoctober/Pagerfanta/zipball/45a85ad426316ae37f2d007022e5b4c95bc3aef4",
5218 "reference": "45a85ad426316ae37f2d007022e5b4c95bc3aef4",
5219 "shasum": ""
5220 },
5221 "require": {
5222 "php": "^7.0"
5223 },
5224 "require-dev": {
5225 "doctrine/orm": "~2.3",
5226 "doctrine/phpcr-odm": "1.*",
5227 "jackalope/jackalope-doctrine-dbal": "1.*",
5228 "jmikola/geojson": "~1.0",
5229 "mandango/mandango": "~1.0@dev",
5230 "mandango/mondator": "~1.0@dev",
5231 "phpunit/phpunit": "^6.5",
5232 "propel/propel": "~2.0@dev",
5233 "propel/propel1": "~1.6",
5234 "ruflin/elastica": "~1.3",
5235 "solarium/solarium": "~3.1"
5236 },
5237 "suggest": {
5238 "doctrine/mongodb-odm": "To use the DoctrineODMMongoDBAdapter.",
5239 "doctrine/orm": "To use the DoctrineORMAdapter.",
5240 "doctrine/phpcr-odm": "To use the DoctrineODMPhpcrAdapter. >= 1.1.0",
5241 "mandango/mandango": "To use the MandangoAdapter.",
5242 "propel/propel": "To use the Propel2Adapter",
5243 "propel/propel1": "To use the PropelAdapter",
5244 "solarium/solarium": "To use the SolariumAdapter."
5245 },
5246 "type": "library",
5247 "extra": {
5248 "branch-alias": {
5249 "dev-master": "1.0.x-dev"
5250 }
5251 },
5252 "autoload": {
5253 "psr-4": {
5254 "Pagerfanta\\": "src/Pagerfanta/"
5255 }
5256 },
5257 "notification-url": "https://packagist.org/downloads/",
5258 "license": [
5259 "MIT"
5260 ],
5261 "authors": [
5262 {
5263 "name": "Pablo Díez",
5264 "email": "pablodip@gmail.com"
5265 }
5266 ],
5267 "description": "Pagination for PHP",
5268 "keywords": [
5269 "page",
5270 "pagination",
5271 "paginator",
5272 "paging"
5273 ],
5274 "time": "2019-04-02T08:50:39+00:00"
5275 },
5276 {
5277 "name": "paragonie/random_compat",
5278 "version": "v2.0.18",
5279 "source": {
5280 "type": "git",
5281 "url": "https://github.com/paragonie/random_compat.git",
5282 "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
5283 },
5284 "dist": {
5285 "type": "zip",
5286 "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
5287 "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
5288 "shasum": ""
5289 },
5290 "require": {
5291 "php": ">=5.2.0"
5292 },
5293 "require-dev": {
5294 "phpunit/phpunit": "4.*|5.*"
5295 },
5296 "suggest": {
5297 "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
5298 },
5299 "type": "library",
5300 "autoload": {
5301 "files": [
5302 "lib/random.php"
5303 ]
5304 },
5305 "notification-url": "https://packagist.org/downloads/",
5306 "license": [
5307 "MIT"
5308 ],
5309 "authors": [
5310 {
5311 "name": "Paragon Initiative Enterprises",
5312 "email": "security@paragonie.com",
5313 "homepage": "https://paragonie.com"
5314 }
5315 ],
5316 "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
5317 "keywords": [
5318 "csprng",
5319 "polyfill",
5320 "pseudorandom",
5321 "random"
5322 ],
5323 "time": "2019-01-03T20:59:08+00:00"
5324 },
5325 {
5326 "name": "php-amqplib/php-amqplib",
5327 "version": "v2.9.2",
5328 "source": {
5329 "type": "git",
5330 "url": "https://github.com/php-amqplib/php-amqplib.git",
5331 "reference": "76faddcd668dabb8d4f7c00e86b8a9decd781a59"
5332 },
5333 "dist": {
5334 "type": "zip",
5335 "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/76faddcd668dabb8d4f7c00e86b8a9decd781a59",
5336 "reference": "76faddcd668dabb8d4f7c00e86b8a9decd781a59",
5337 "shasum": ""
5338 },
5339 "require": {
5340 "ext-bcmath": "*",
5341 "ext-sockets": "*",
5342 "php": ">=5.4.0"
5343 },
5344 "replace": {
5345 "videlalvaro/php-amqplib": "self.version"
5346 },
5347 "require-dev": {
5348 "ext-curl": "*",
5349 "nategood/httpful": "^0.2.20",
5350 "phpdocumentor/phpdocumentor": "^2.9",
5351 "phpunit/phpunit": "^4.8",
5352 "squizlabs/php_codesniffer": "^2.5"
5353 },
5354 "type": "library",
5355 "extra": {
5356 "branch-alias": {
5357 "dev-master": "2.8-dev"
5358 }
5359 },
5360 "autoload": {
5361 "psr-4": {
5362 "PhpAmqpLib\\": "PhpAmqpLib/"
5363 }
5364 },
5365 "notification-url": "https://packagist.org/downloads/",
5366 "license": [
5367 "LGPL-2.1-or-later"
5368 ],
5369 "authors": [
5370 {
5371 "name": "Alvaro Videla",
5372 "role": "Original Maintainer"
5373 },
5374 {
5375 "name": "John Kelly",
5376 "email": "johnmkelly86@gmail.com",
5377 "role": "Maintainer"
5378 },
5379 {
5380 "name": "Raúl Araya",
5381 "email": "nubeiro@gmail.com",
5382 "role": "Maintainer"
5383 },
5384 {
5385 "name": "Luke Bakken",
5386 "email": "luke@bakken.io",
5387 "role": "Maintainer"
5388 }
5389 ],
5390 "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.",
5391 "homepage": "https://github.com/php-amqplib/php-amqplib/",
5392 "keywords": [
5393 "message",
5394 "queue",
5395 "rabbitmq"
5396 ],
5397 "time": "2019-04-24T15:36:21+00:00"
5398 },
5399 {
5400 "name": "php-amqplib/rabbitmq-bundle",
5401 "version": "v1.14.4",
5402 "source": {
5403 "type": "git",
5404 "url": "https://github.com/php-amqplib/RabbitMqBundle.git",
5405 "reference": "cf67adaa4e306d8e9cb6855a72d79263b425ded8"
5406 },
5407 "dist": {
5408 "type": "zip",
5409 "url": "https://api.github.com/repos/php-amqplib/RabbitMqBundle/zipball/cf67adaa4e306d8e9cb6855a72d79263b425ded8",
5410 "reference": "cf67adaa4e306d8e9cb6855a72d79263b425ded8",
5411 "shasum": ""
5412 },
5413 "require": {
5414 "php": "^5.3.9|^7.0",
5415 "php-amqplib/php-amqplib": "^2.6",
5416 "psr/log": "^1.0",
5417 "symfony/config": "^2.7|^3.0|^4.0",
5418 "symfony/console": "^2.7|^3.0|^4.0",
5419 "symfony/dependency-injection": "^2.7|^3.0|^4.0",
5420 "symfony/event-dispatcher": "^2.7|^3.0|^4.0",
5421 "symfony/yaml": "^2.7|^3.0|^4.0"
5422 },
5423 "replace": {
5424 "oldsound/rabbitmq-bundle": "self.version"
5425 },
5426 "require-dev": {
5427 "phpunit/phpunit": "^4.8.35|^5.4.3",
5428 "symfony/debug": "^2.7|^3.0|^4.0",
5429 "symfony/serializer": "^2.7|^3.0|^4.0"
5430 },
5431 "suggest": {
5432 "symfony/framework-bundle": "To use this lib as a full Symfony Bundle and to use the profiler data collector"
5433 },
5434 "type": "symfony-bundle",
5435 "extra": {
5436 "branch-alias": {
5437 "dev-master": "1.10.x-dev"
5438 }
5439 },
5440 "autoload": {
5441 "psr-4": {
5442 "OldSound\\RabbitMqBundle\\": ""
5443 },
5444 "exclude-from-classmap": [
5445 "/Tests/"
5446 ]
5447 },
5448 "notification-url": "https://packagist.org/downloads/",
5449 "license": [
5450 "MIT"
5451 ],
5452 "authors": [
5453 {
5454 "name": "Alvaro Videla"
5455 }
5456 ],
5457 "description": "Integrates php-amqplib with Symfony & RabbitMq. Formerly oldsound/rabbitmq-bundle.",
5458 "keywords": [
5459 "AMQP",
5460 "Symfony2",
5461 "message",
5462 "queue",
5463 "rabbitmq",
5464 "symfony",
5465 "symfony3",
5466 "symfony4"
5467 ],
5468 "time": "2018-05-02T13:12:32+00:00"
5469 },
5470 {
5471 "name": "php-http/client-common",
5472 "version": "2.0.0",
5473 "source": {
5474 "type": "git",
5475 "url": "https://github.com/php-http/client-common.git",
5476 "reference": "2b8aa3c4910afc21146a9c8f96adb266e869517a"
5477 },
5478 "dist": {
5479 "type": "zip",
5480 "url": "https://api.github.com/repos/php-http/client-common/zipball/2b8aa3c4910afc21146a9c8f96adb266e869517a",
5481 "reference": "2b8aa3c4910afc21146a9c8f96adb266e869517a",
5482 "shasum": ""
5483 },
5484 "require": {
5485 "php": "^7.1",
5486 "php-http/httplug": "^2.0",
5487 "php-http/message": "^1.6",
5488 "php-http/message-factory": "^1.0",
5489 "symfony/options-resolver": " ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1"
5490 },
5491 "require-dev": {
5492 "doctrine/instantiator": "^1.1",
5493 "guzzlehttp/psr7": "^1.4",
5494 "phpspec/phpspec": "^5.1",
5495 "phpspec/prophecy": "^1.8",
5496 "sebastian/comparator": "^3.0"
5497 },
5498 "suggest": {
5499 "ext-json": "To detect JSON responses with the ContentTypePlugin",
5500 "ext-libxml": "To detect XML responses with the ContentTypePlugin",
5501 "php-http/cache-plugin": "PSR-6 Cache plugin",
5502 "php-http/logger-plugin": "PSR-3 Logger plugin",
5503 "php-http/stopwatch-plugin": "Symfony Stopwatch plugin"
5504 },
5505 "type": "library",
5506 "extra": {
5507 "branch-alias": {
5508 "dev-master": "2.0.x-dev"
5509 }
5510 },
5511 "autoload": {
5512 "psr-4": {
5513 "Http\\Client\\Common\\": "src/"
5514 }
5515 },
5516 "notification-url": "https://packagist.org/downloads/",
5517 "license": [
5518 "MIT"
5519 ],
5520 "authors": [
5521 {
5522 "name": "Márk Sági-Kazár",
5523 "email": "mark.sagikazar@gmail.com"
5524 }
5525 ],
5526 "description": "Common HTTP Client implementations and tools for HTTPlug",
5527 "homepage": "http://httplug.io",
5528 "keywords": [
5529 "client",
5530 "common",
5531 "http",
5532 "httplug"
5533 ],
5534 "time": "2019-02-03T16:49:09+00:00"
5535 },
5536 {
5537 "name": "php-http/curl-client",
5538 "version": "2.0.0",
5539 "source": {
5540 "type": "git",
5541 "url": "https://github.com/php-http/curl-client.git",
5542 "reference": "e7a2a5ebcce1ff7d75eaf02b7c85634a6fac00da"
5543 },
5544 "dist": {
5545 "type": "zip",
5546 "url": "https://api.github.com/repos/php-http/curl-client/zipball/e7a2a5ebcce1ff7d75eaf02b7c85634a6fac00da",
5547 "reference": "e7a2a5ebcce1ff7d75eaf02b7c85634a6fac00da",
5548 "shasum": ""
5549 },
5550 "require": {
5551 "ext-curl": "*",
5552 "php": "^7.1",
5553 "php-http/discovery": "^1.6",
5554 "php-http/httplug": "^2.0",
5555 "php-http/message": "^1.2",
5556 "psr/http-client": "^1.0",
5557 "psr/http-factory": "^1.0",
5558 "symfony/options-resolver": "^3.4 || ^4.0"
5559 },
5560 "provide": {
5561 "php-http/async-client-implementation": "1.0",
5562 "php-http/client-implementation": "1.0"
5563 },
5564 "require-dev": {
5565 "guzzlehttp/psr7": "^1.0",
5566 "php-http/client-integration-tests": "^2.0",
5567 "phpunit/phpunit": "^7.5",
5568 "zendframework/zend-diactoros": "^2.0"
5569 },
5570 "type": "library",
5571 "extra": {
5572 "branch-alias": {
5573 "dev-master": "2.x-dev"
5574 }
5575 },
5576 "autoload": {
5577 "psr-4": {
5578 "Http\\Client\\Curl\\": "src/"
5579 }
5580 },
5581 "notification-url": "https://packagist.org/downloads/",
5582 "license": [
5583 "MIT"
5584 ],
5585 "authors": [
5586 {
5587 "name": "Михаил Красильников",
5588 "email": "m.krasilnikov@yandex.ru"
5589 }
5590 ],
5591 "description": "PSR-18 and HTTPlug Async client with cURL",
5592 "homepage": "http://php-http.org",
5593 "keywords": [
5594 "curl",
5595 "http",
5596 "psr-18"
5597 ],
5598 "time": "2019-03-05T19:59:23+00:00"
5599 },
5600 {
5601 "name": "php-http/discovery",
5602 "version": "1.6.1",
5603 "source": {
5604 "type": "git",
5605 "url": "https://github.com/php-http/discovery.git",
5606 "reference": "684855f2c2e9d0a61868b8f8d6bd0295c8a4b651"
5607 },
5608 "dist": {
5609 "type": "zip",
5610 "url": "https://api.github.com/repos/php-http/discovery/zipball/684855f2c2e9d0a61868b8f8d6bd0295c8a4b651",
5611 "reference": "684855f2c2e9d0a61868b8f8d6bd0295c8a4b651",
5612 "shasum": ""
5613 },
5614 "require": {
5615 "php": "^5.5 || ^7.0"
5616 },
5617 "conflict": {
5618 "nyholm/psr7": "<1.0"
5619 },
5620 "require-dev": {
5621 "php-http/httplug": "^1.0 || ^2.0",
5622 "php-http/message-factory": "^1.0",
5623 "phpspec/phpspec": "^2.4",
5624 "puli/composer-plugin": "1.0.0-beta10"
5625 },
5626 "suggest": {
5627 "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories",
5628 "puli/composer-plugin": "Sets up Puli which is recommended for Discovery to work. Check http://docs.php-http.org/en/latest/discovery.html for more details."
5629 },
5630 "type": "library",
5631 "extra": {
5632 "branch-alias": {
5633 "dev-master": "1.5-dev"
5634 }
5635 },
5636 "autoload": {
5637 "psr-4": {
5638 "Http\\Discovery\\": "src/"
5639 }
5640 },
5641 "notification-url": "https://packagist.org/downloads/",
5642 "license": [
5643 "MIT"
5644 ],
5645 "authors": [
5646 {
5647 "name": "Márk Sági-Kazár",
5648 "email": "mark.sagikazar@gmail.com"
5649 }
5650 ],
5651 "description": "Finds installed HTTPlug implementations and PSR-7 message factories",
5652 "homepage": "http://php-http.org",
5653 "keywords": [
5654 "adapter",
5655 "client",
5656 "discovery",
5657 "factory",
5658 "http",
5659 "message",
5660 "psr7"
5661 ],
5662 "time": "2019-02-23T07:42:53+00:00"
5663 },
5664 {
5665 "name": "php-http/guzzle5-adapter",
5666 "version": "2.0.0",
5667 "source": {
5668 "type": "git",
5669 "url": "https://github.com/php-http/guzzle5-adapter.git",
5670 "reference": "cce48360b1f8a3467bd94e853e6107aa4532008e"
5671 },
5672 "dist": {
5673 "type": "zip",
5674 "url": "https://api.github.com/repos/php-http/guzzle5-adapter/zipball/cce48360b1f8a3467bd94e853e6107aa4532008e",
5675 "reference": "cce48360b1f8a3467bd94e853e6107aa4532008e",
5676 "shasum": ""
5677 },
5678 "require": {
5679 "guzzlehttp/guzzle": "^5.1",
5680 "php": "^7.0",
5681 "php-http/discovery": "^1.0",
5682 "php-http/httplug": "^2.0"
5683 },
5684 "provide": {
5685 "php-http/client-implementation": "1.0",
5686 "psr/http-client-implementation": "1.0"
5687 },
5688 "require-dev": {
5689 "ext-curl": "*",
5690 "guzzlehttp/ringphp": "^1.1",
5691 "php-http/client-integration-tests": "^2.0",
5692 "phpunit/phpunit": "^6.0 || ^7.0"
5693 },
5694 "type": "library",
5695 "extra": {
5696 "branch-alias": {
5697 "dev-master": "2.0-dev"
5698 }
5699 },
5700 "autoload": {
5701 "psr-4": {
5702 "Http\\Adapter\\Guzzle5\\": "src/"
5703 }
5704 },
5705 "notification-url": "https://packagist.org/downloads/",
5706 "license": [
5707 "MIT"
5708 ],
5709 "authors": [
5710 {
5711 "name": "Eric GELOEN",
5712 "email": "geloen.eric@gmail.com"
5713 },
5714 {
5715 "name": "Márk Sági-Kazár",
5716 "email": "mark.sagikazar@gmail.com"
5717 }
5718 ],
5719 "description": "Guzzle 5 HTTP Adapter",
5720 "homepage": "http://httplug.io",
5721 "keywords": [
5722 "Guzzle",
5723 "http"
5724 ],
5725 "time": "2019-02-05T12:28:45+00:00"
5726 },
5727 {
5728 "name": "php-http/httplug",
5729 "version": "v2.0.0",
5730 "source": {
5731 "type": "git",
5732 "url": "https://github.com/php-http/httplug.git",
5733 "reference": "b3842537338c949f2469557ef4ad4bdc47b58603"
5734 },
5735 "dist": {
5736 "type": "zip",
5737 "url": "https://api.github.com/repos/php-http/httplug/zipball/b3842537338c949f2469557ef4ad4bdc47b58603",
5738 "reference": "b3842537338c949f2469557ef4ad4bdc47b58603",
5739 "shasum": ""
5740 },
5741 "require": {
5742 "php": "^7.0",
5743 "php-http/promise": "^1.0",
5744 "psr/http-client": "^1.0",
5745 "psr/http-message": "^1.0"
5746 },
5747 "require-dev": {
5748 "henrikbjorn/phpspec-code-coverage": "^1.0",
5749 "phpspec/phpspec": "^2.4"
5750 },
5751 "type": "library",
5752 "extra": {
5753 "branch-alias": {
5754 "dev-master": "2.0.x-dev"
5755 }
5756 },
5757 "autoload": {
5758 "psr-4": {
5759 "Http\\Client\\": "src/"
5760 }
5761 },
5762 "notification-url": "https://packagist.org/downloads/",
5763 "license": [
5764 "MIT"
5765 ],
5766 "authors": [
5767 {
5768 "name": "Eric GELOEN",
5769 "email": "geloen.eric@gmail.com"
5770 },
5771 {
5772 "name": "Márk Sági-Kazár",
5773 "email": "mark.sagikazar@gmail.com"
5774 }
5775 ],
5776 "description": "HTTPlug, the HTTP client abstraction for PHP",
5777 "homepage": "http://httplug.io",
5778 "keywords": [
5779 "client",
5780 "http"
5781 ],
5782 "time": "2018-10-31T09:14:44+00:00"
5783 },
5784 {
5785 "name": "php-http/httplug-bundle",
5786 "version": "1.15.2",
5787 "source": {
5788 "type": "git",
5789 "url": "https://github.com/php-http/HttplugBundle.git",
5790 "reference": "35d281804a90f0359aa9da5b5b1f55c18aeafaf8"
5791 },
5792 "dist": {
5793 "type": "zip",
5794 "url": "https://api.github.com/repos/php-http/HttplugBundle/zipball/35d281804a90f0359aa9da5b5b1f55c18aeafaf8",
5795 "reference": "35d281804a90f0359aa9da5b5b1f55c18aeafaf8",
5796 "shasum": ""
5797 },
5798 "require": {
5799 "php": "^5.5 || ^7.0",
5800 "php-http/client-common": "^1.9 || ^2.0",
5801 "php-http/client-implementation": "^1.0",
5802 "php-http/discovery": "^1.0",
5803 "php-http/httplug": "^1.0 || ^2.0",
5804 "php-http/logger-plugin": "^1.1",
5805 "php-http/message": "^1.4",
5806 "php-http/message-factory": "^1.0.2",
5807 "php-http/stopwatch-plugin": "^1.2",
5808 "psr/http-message": "^1.0",
5809 "symfony/config": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5810 "symfony/dependency-injection": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5811 "symfony/event-dispatcher": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5812 "symfony/http-kernel": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5813 "symfony/options-resolver": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1"
5814 },
5815 "conflict": {
5816 "php-http/guzzle6-adapter": "<1.1"
5817 },
5818 "require-dev": {
5819 "guzzlehttp/psr7": "^1.0",
5820 "matthiasnoback/symfony-dependency-injection-test": "^1.1 || ^2.3",
5821 "nyholm/nsa": "^1.1",
5822 "php-http/cache-plugin": "^1.6",
5823 "php-http/guzzle6-adapter": "^1.1.1 || ^2.0.1",
5824 "php-http/mock-client": "^1.2",
5825 "php-http/promise": "^1.0",
5826 "polishsymfonycommunity/symfony-mocker-container": "^1.0",
5827 "symfony/browser-kit": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5828 "symfony/cache": "^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5829 "symfony/dom-crawler": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5830 "symfony/framework-bundle": "^2.8.1 || ^3.0.1 || ^4.0",
5831 "symfony/http-foundation": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5832 "symfony/phpunit-bridge": "^3.4 || ^4.2",
5833 "symfony/stopwatch": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5834 "symfony/twig-bundle": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5835 "symfony/web-profiler-bundle": "^2.8.49 || ^3.0.9 || ^3.1.10 || ^3.2.14 || ^3.3.18 || ^3.4.20 || ^4.0.15 || ^4.1.9 || ^4.2.1",
5836 "twig/twig": "^1.36 || ^2.6"
5837 },
5838 "suggest": {
5839 "php-http/cache-plugin": "To configure clients that cache responses",
5840 "php-http/mock-client": "Add this to your require-dev section to mock HTTP responses easily",
5841 "twig/twig": "Add this to your require-dev section when using the WebProfilerBundle"
5842 },
5843 "type": "symfony-bundle",
5844 "extra": {
5845 "branch-alias": {
5846 "dev-master": "1.x-dev"
5847 }
5848 },
5849 "autoload": {
5850 "psr-4": {
5851 "Http\\HttplugBundle\\": "src/"
5852 },
5853 "exclude-from-classmap": [
5854 "/Tests/Resources/MyPsr18TestClient.php"
5855 ]
5856 },
5857 "notification-url": "https://packagist.org/downloads/",
5858 "license": [
5859 "MIT"
5860 ],
5861 "authors": [
5862 {
5863 "name": "David Buchmann",
5864 "email": "mail@davidbu.ch"
5865 },
5866 {
5867 "name": "Tobias Nyholm",
5868 "email": "tobias.nyholm@gmail.com"
5869 }
5870 ],
5871 "description": "Symfony integration for HTTPlug",
5872 "homepage": "http://httplug.io",
5873 "keywords": [
5874 "adapter",
5875 "bundle",
5876 "discovery",
5877 "factory",
5878 "http",
5879 "httplug",
5880 "message",
5881 "php-http"
5882 ],
5883 "time": "2019-04-18T14:01:25+00:00"
5884 },
5885 {
5886 "name": "php-http/logger-plugin",
5887 "version": "1.1.0",
5888 "source": {
5889 "type": "git",
5890 "url": "https://github.com/php-http/logger-plugin.git",
5891 "reference": "c1c6e90717ce350319b7b8bc489f1db35bb523fd"
5892 },
5893 "dist": {
5894 "type": "zip",
5895 "url": "https://api.github.com/repos/php-http/logger-plugin/zipball/c1c6e90717ce350319b7b8bc489f1db35bb523fd",
5896 "reference": "c1c6e90717ce350319b7b8bc489f1db35bb523fd",
5897 "shasum": ""
5898 },
5899 "require": {
5900 "php": "^5.4 || ^7.0",
5901 "php-http/client-common": "^1.9 || ^2.0",
5902 "php-http/message": "^1.0",
5903 "psr/log": "^1.0"
5904 },
5905 "require-dev": {
5906 "henrikbjorn/phpspec-code-coverage": "^1.0",
5907 "phpspec/phpspec": "^2.5"
5908 },
5909 "type": "library",
5910 "extra": {
5911 "branch-alias": {
5912 "dev-master": "1.1-dev"
5913 }
5914 },
5915 "autoload": {
5916 "psr-4": {
5917 "Http\\Client\\Common\\Plugin\\": "src/"
5918 }
5919 },
5920 "notification-url": "https://packagist.org/downloads/",
5921 "license": [
5922 "MIT"
5923 ],
5924 "authors": [
5925 {
5926 "name": "Márk Sági-Kazár",
5927 "email": "mark.sagikazar@gmail.com"
5928 }
5929 ],
5930 "description": "PSR-3 Logger plugin for HTTPlug",
5931 "homepage": "http://httplug.io",
5932 "keywords": [
5933 "http",
5934 "httplug",
5935 "logger",
5936 "plugin"
5937 ],
5938 "time": "2019-01-30T11:48:21+00:00"
5939 },
5940 {
5941 "name": "php-http/message",
5942 "version": "1.7.2",
5943 "source": {
5944 "type": "git",
5945 "url": "https://github.com/php-http/message.git",
5946 "reference": "b159ffe570dffd335e22ef0b91a946eacb182fa1"
5947 },
5948 "dist": {
5949 "type": "zip",
5950 "url": "https://api.github.com/repos/php-http/message/zipball/b159ffe570dffd335e22ef0b91a946eacb182fa1",
5951 "reference": "b159ffe570dffd335e22ef0b91a946eacb182fa1",
5952 "shasum": ""
5953 },
5954 "require": {
5955 "clue/stream-filter": "^1.4",
5956 "php": "^5.4 || ^7.0",
5957 "php-http/message-factory": "^1.0.2",
5958 "psr/http-message": "^1.0"
5959 },
5960 "provide": {
5961 "php-http/message-factory-implementation": "1.0"
5962 },
5963 "require-dev": {
5964 "akeneo/phpspec-skip-example-extension": "^1.0",
5965 "coduo/phpspec-data-provider-extension": "^1.0",
5966 "ext-zlib": "*",
5967 "guzzlehttp/psr7": "^1.0",
5968 "henrikbjorn/phpspec-code-coverage": "^1.0",
5969 "phpspec/phpspec": "^2.4",
5970 "slim/slim": "^3.0",
5971 "zendframework/zend-diactoros": "^1.0"
5972 },
5973 "suggest": {
5974 "ext-zlib": "Used with compressor/decompressor streams",
5975 "guzzlehttp/psr7": "Used with Guzzle PSR-7 Factories",
5976 "slim/slim": "Used with Slim Framework PSR-7 implementation",
5977 "zendframework/zend-diactoros": "Used with Diactoros Factories"
5978 },
5979 "type": "library",
5980 "extra": {
5981 "branch-alias": {
5982 "dev-master": "1.6-dev"
5983 }
5984 },
5985 "autoload": {
5986 "psr-4": {
5987 "Http\\Message\\": "src/"
5988 },
5989 "files": [
5990 "src/filters.php"
5991 ]
5992 },
5993 "notification-url": "https://packagist.org/downloads/",
5994 "license": [
5995 "MIT"
5996 ],
5997 "authors": [
5998 {
5999 "name": "Márk Sági-Kazár",
6000 "email": "mark.sagikazar@gmail.com"
6001 }
6002 ],
6003 "description": "HTTP Message related tools",
6004 "homepage": "http://php-http.org",
6005 "keywords": [
6006 "http",
6007 "message",
6008 "psr-7"
6009 ],
6010 "time": "2018-11-01T09:32:41+00:00"
6011 },
6012 {
6013 "name": "php-http/message-factory",
6014 "version": "v1.0.2",
6015 "source": {
6016 "type": "git",
6017 "url": "https://github.com/php-http/message-factory.git",
6018 "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
6019 },
6020 "dist": {
6021 "type": "zip",
6022 "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
6023 "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
6024 "shasum": ""
6025 },
6026 "require": {
6027 "php": ">=5.4",
6028 "psr/http-message": "^1.0"
6029 },
6030 "type": "library",
6031 "extra": {
6032 "branch-alias": {
6033 "dev-master": "1.0-dev"
6034 }
6035 },
6036 "autoload": {
6037 "psr-4": {
6038 "Http\\Message\\": "src/"
6039 }
6040 },
6041 "notification-url": "https://packagist.org/downloads/",
6042 "license": [
6043 "MIT"
6044 ],
6045 "authors": [
6046 {
6047 "name": "Márk Sági-Kazár",
6048 "email": "mark.sagikazar@gmail.com"
6049 }
6050 ],
6051 "description": "Factory interfaces for PSR-7 HTTP Message",
6052 "homepage": "http://php-http.org",
6053 "keywords": [
6054 "factory",
6055 "http",
6056 "message",
6057 "stream",
6058 "uri"
6059 ],
6060 "time": "2015-12-19T14:08:53+00:00"
6061 },
6062 {
6063 "name": "php-http/promise",
6064 "version": "v1.0.0",
6065 "source": {
6066 "type": "git",
6067 "url": "https://github.com/php-http/promise.git",
6068 "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980"
6069 },
6070 "dist": {
6071 "type": "zip",
6072 "url": "https://api.github.com/repos/php-http/promise/zipball/dc494cdc9d7160b9a09bd5573272195242ce7980",
6073 "reference": "dc494cdc9d7160b9a09bd5573272195242ce7980",
6074 "shasum": ""
6075 },
6076 "require-dev": {
6077 "henrikbjorn/phpspec-code-coverage": "^1.0",
6078 "phpspec/phpspec": "^2.4"
6079 },
6080 "type": "library",
6081 "extra": {
6082 "branch-alias": {
6083 "dev-master": "1.1-dev"
6084 }
6085 },
6086 "autoload": {
6087 "psr-4": {
6088 "Http\\Promise\\": "src/"
6089 }
6090 },
6091 "notification-url": "https://packagist.org/downloads/",
6092 "license": [
6093 "MIT"
6094 ],
6095 "authors": [
6096 {
6097 "name": "Márk Sági-Kazár",
6098 "email": "mark.sagikazar@gmail.com"
6099 },
6100 {
6101 "name": "Joel Wurtz",
6102 "email": "joel.wurtz@gmail.com"
6103 }
6104 ],
6105 "description": "Promise used for asynchronous HTTP requests",
6106 "homepage": "http://httplug.io",
6107 "keywords": [
6108 "promise"
6109 ],
6110 "time": "2016-01-26T13:27:02+00:00"
6111 },
6112 {
6113 "name": "php-http/stopwatch-plugin",
6114 "version": "1.2.0",
6115 "source": {
6116 "type": "git",
6117 "url": "https://github.com/php-http/stopwatch-plugin.git",
6118 "reference": "520419dd18755a1e7b29077e677fbeb16b6629e7"
6119 },
6120 "dist": {
6121 "type": "zip",
6122 "url": "https://api.github.com/repos/php-http/stopwatch-plugin/zipball/520419dd18755a1e7b29077e677fbeb16b6629e7",
6123 "reference": "520419dd18755a1e7b29077e677fbeb16b6629e7",
6124 "shasum": ""
6125 },
6126 "require": {
6127 "php": "^5.4 || ^7.0",
6128 "php-http/client-common": "^1.9 || ^2.0",
6129 "symfony/stopwatch": "^2.7 || ^3.0 || ^4.0"
6130 },
6131 "require-dev": {
6132 "phpspec/phpspec": "^2.5 || ^3.0 || ^4.0"
6133 },
6134 "type": "library",
6135 "extra": {
6136 "branch-alias": {
6137 "dev-master": "1.2-dev"
6138 }
6139 },
6140 "autoload": {
6141 "psr-4": {
6142 "Http\\Client\\Common\\Plugin\\": "src/"
6143 }
6144 },
6145 "notification-url": "https://packagist.org/downloads/",
6146 "license": [
6147 "MIT"
6148 ],
6149 "authors": [
6150 {
6151 "name": "Márk Sági-Kazár",
6152 "email": "mark.sagikazar@gmail.com"
6153 }
6154 ],
6155 "description": "Symfony Stopwatch plugin for HTTPlug",
6156 "homepage": "http://httplug.io",
6157 "keywords": [
6158 "http",
6159 "httplug",
6160 "plugin",
6161 "stopwatch"
6162 ],
6163 "time": "2019-01-30T12:01:37+00:00"
6164 },
6165 {
6166 "name": "phpcollection/phpcollection",
6167 "version": "0.5.0",
6168 "source": {
6169 "type": "git",
6170 "url": "https://github.com/schmittjoh/php-collection.git",
6171 "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6"
6172 },
6173 "dist": {
6174 "type": "zip",
6175 "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
6176 "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
6177 "shasum": ""
6178 },
6179 "require": {
6180 "phpoption/phpoption": "1.*"
6181 },
6182 "type": "library",
6183 "extra": {
6184 "branch-alias": {
6185 "dev-master": "0.4-dev"
6186 }
6187 },
6188 "autoload": {
6189 "psr-0": {
6190 "PhpCollection": "src/"
6191 }
6192 },
6193 "notification-url": "https://packagist.org/downloads/",
6194 "license": [
6195 "Apache2"
6196 ],
6197 "authors": [
6198 {
6199 "name": "Johannes M. Schmitt",
6200 "email": "schmittjoh@gmail.com"
6201 }
6202 ],
6203 "description": "General-Purpose Collection Library for PHP",
6204 "keywords": [
6205 "collection",
6206 "list",
6207 "map",
6208 "sequence",
6209 "set"
6210 ],
6211 "time": "2015-05-17T12:39:23+00:00"
6212 },
6213 {
6214 "name": "phpoption/phpoption",
6215 "version": "1.5.0",
6216 "source": {
6217 "type": "git",
6218 "url": "https://github.com/schmittjoh/php-option.git",
6219 "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed"
6220 },
6221 "dist": {
6222 "type": "zip",
6223 "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed",
6224 "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed",
6225 "shasum": ""
6226 },
6227 "require": {
6228 "php": ">=5.3.0"
6229 },
6230 "require-dev": {
6231 "phpunit/phpunit": "4.7.*"
6232 },
6233 "type": "library",
6234 "extra": {
6235 "branch-alias": {
6236 "dev-master": "1.3-dev"
6237 }
6238 },
6239 "autoload": {
6240 "psr-0": {
6241 "PhpOption\\": "src/"
6242 }
6243 },
6244 "notification-url": "https://packagist.org/downloads/",
6245 "license": [
6246 "Apache2"
6247 ],
6248 "authors": [
6249 {
6250 "name": "Johannes M. Schmitt",
6251 "email": "schmittjoh@gmail.com"
6252 }
6253 ],
6254 "description": "Option Type for PHP",
6255 "keywords": [
6256 "language",
6257 "option",
6258 "php",
6259 "type"
6260 ],
6261 "time": "2015-07-25T16:39:46+00:00"
6262 },
6263 {
6264 "name": "phpzip/phpzip",
6265 "version": "2.0.8",
6266 "source": {
6267 "type": "git",
6268 "url": "https://github.com/Grandt/PHPZip.git",
6269 "reference": "936f93d656f68e29c231a39e19fd59a636fe7e47"
6270 },
6271 "dist": {
6272 "type": "zip",
6273 "url": "https://api.github.com/repos/Grandt/PHPZip/zipball/936f93d656f68e29c231a39e19fd59a636fe7e47",
6274 "reference": "936f93d656f68e29c231a39e19fd59a636fe7e47",
6275 "shasum": ""
6276 },
6277 "require": {
6278 "grandt/binstring": ">=1.0.0",
6279 "grandt/phpzipmerge": ">=1.0.4",
6280 "grandt/relativepath": ">=1.0.2",
6281 "php": ">=5.3.0"
6282 },
6283 "type": "library",
6284 "autoload": {
6285 "psr-4": {
6286 "PHPZip\\Zip\\": "src/Zip"
6287 }
6288 },
6289 "notification-url": "https://packagist.org/downloads/",
6290 "license": [
6291 "LGPL-2.1"
6292 ],
6293 "authors": [
6294 {
6295 "name": "Adam Schmalhofer",
6296 "email": "Adam.Schmalhofer@gmx.de",
6297 "role": "Developer"
6298 },
6299 {
6300 "name": "A. Grandt",
6301 "email": "php@grandt.com",
6302 "homepage": "http://grandt.com",
6303 "role": "Developer"
6304 },
6305 {
6306 "name": "Greg Kappatos",
6307 "homepage": "http://websiteconnect.com.au",
6308 "role": "Developer"
6309 }
6310 ],
6311 "description": "Package to create and stream archives of compressed files in ZIP format with PHP 5.3+",
6312 "homepage": "https://github.com/Grandt/PHPZip",
6313 "keywords": [
6314 "archive",
6315 "compressed",
6316 "compression",
6317 "phpzip",
6318 "pkzip",
6319 "stream",
6320 "zip"
6321 ],
6322 "time": "2015-11-16T16:30:51+00:00"
6323 },
6324 {
6325 "name": "pragmarx/random",
6326 "version": "v0.2.2",
6327 "source": {
6328 "type": "git",
6329 "url": "https://github.com/antonioribeiro/random.git",
6330 "reference": "daf08a189c5d2d40d1a827db46364d3a741a51b7"
6331 },
6332 "dist": {
6333 "type": "zip",
6334 "url": "https://api.github.com/repos/antonioribeiro/random/zipball/daf08a189c5d2d40d1a827db46364d3a741a51b7",
6335 "reference": "daf08a189c5d2d40d1a827db46364d3a741a51b7",
6336 "shasum": ""
6337 },
6338 "require": {
6339 "php": ">=7.0"
6340 },
6341 "require-dev": {
6342 "fzaninotto/faker": "~1.7",
6343 "phpunit/phpunit": "~6.4",
6344 "pragmarx/trivia": "~0.1",
6345 "squizlabs/php_codesniffer": "^2.3"
6346 },
6347 "suggest": {
6348 "fzaninotto/faker": "Allows you to get dozens of randomized types",
6349 "pragmarx/trivia": "For the trivia database"
6350 },
6351 "type": "library",
6352 "extra": {
6353 "branch-alias": {
6354 "dev-master": "1.0-dev"
6355 }
6356 },
6357 "autoload": {
6358 "psr-4": {
6359 "PragmaRX\\Random\\": "src"
6360 }
6361 },
6362 "notification-url": "https://packagist.org/downloads/",
6363 "license": [
6364 "MIT"
6365 ],
6366 "authors": [
6367 {
6368 "name": "Antonio Carlos Ribeiro",
6369 "email": "acr@antoniocarlosribeiro.com",
6370 "homepage": "https://antoniocarlosribeiro.com",
6371 "role": "Developer"
6372 }
6373 ],
6374 "description": "Create random chars, numbers, strings",
6375 "homepage": "https://github.com/antonioribeiro/random",
6376 "keywords": [
6377 "Randomize",
6378 "faker",
6379 "pragmarx",
6380 "random",
6381 "random number",
6382 "random pattern",
6383 "random string"
6384 ],
6385 "time": "2017-11-21T05:26:22+00:00"
6386 },
6387 {
6388 "name": "pragmarx/recovery",
6389 "version": "v0.1.0",
6390 "source": {
6391 "type": "git",
6392 "url": "https://github.com/antonioribeiro/recovery.git",
6393 "reference": "e16573a1ae5345cc3b100eec6d0296a1a15a90fe"
6394 },
6395 "dist": {
6396 "type": "zip",
6397 "url": "https://api.github.com/repos/antonioribeiro/recovery/zipball/e16573a1ae5345cc3b100eec6d0296a1a15a90fe",
6398 "reference": "e16573a1ae5345cc3b100eec6d0296a1a15a90fe",
6399 "shasum": ""
6400 },
6401 "require": {
6402 "php": "~7.0",
6403 "pragmarx/random": "~0.1"
6404 },
6405 "require-dev": {
6406 "phpunit/phpunit": ">=5.4.3",
6407 "squizlabs/php_codesniffer": "^2.3",
6408 "tightenco/collect": "^5"
6409 },
6410 "suggest": {
6411 "tightenco/collect": "Allows to generate recovery codes as collections"
6412 },
6413 "type": "library",
6414 "extra": {
6415 "branch-alias": {
6416 "dev-master": "1.0-dev"
6417 }
6418 },
6419 "autoload": {
6420 "psr-4": {
6421 "PragmaRX\\Recovery\\": "src"
6422 }
6423 },
6424 "notification-url": "https://packagist.org/downloads/",
6425 "license": [
6426 "MIT"
6427 ],
6428 "authors": [
6429 {
6430 "name": "Antonio Carlos Ribeiro",
6431 "email": "acr@antoniocarlosribeiro.com",
6432 "homepage": "https://antoniocarlosribeiro.com",
6433 "role": "Developer"
6434 }
6435 ],
6436 "description": "Create recovery codes for two factor auth",
6437 "homepage": "https://github.com/antonioribeiro/recovery",
6438 "keywords": [
6439 "2fa",
6440 "account recovery",
6441 "auth",
6442 "backup codes",
6443 "google2fa",
6444 "pragmarx",
6445 "recovery",
6446 "recovery codes",
6447 "two factor auth"
6448 ],
6449 "time": "2017-09-19T16:58:00+00:00"
6450 },
6451 {
6452 "name": "predis/predis",
6453 "version": "v1.1.x-dev",
6454 "source": {
6455 "type": "git",
6456 "url": "https://github.com/nrk/predis.git",
6457 "reference": "111d100ee389d624036b46b35ed0c9ac59c71313"
6458 },
6459 "dist": {
6460 "type": "zip",
6461 "url": "https://api.github.com/repos/nrk/predis/zipball/111d100ee389d624036b46b35ed0c9ac59c71313",
6462 "reference": "111d100ee389d624036b46b35ed0c9ac59c71313",
6463 "shasum": ""
6464 },
6465 "require": {
6466 "php": ">=5.3.9"
6467 },
6468 "require-dev": {
6469 "phpunit/phpunit": "~4.8"
6470 },
6471 "suggest": {
6472 "ext-curl": "Allows access to Webdis when paired with phpiredis",
6473 "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
6474 },
6475 "type": "library",
6476 "autoload": {
6477 "psr-4": {
6478 "Predis\\": "src/"
6479 }
6480 },
6481 "notification-url": "https://packagist.org/downloads/",
6482 "license": [
6483 "MIT"
6484 ],
6485 "authors": [
6486 {
6487 "name": "Daniele Alessandri",
6488 "email": "suppakilla@gmail.com",
6489 "homepage": "http://clorophilla.net"
6490 }
6491 ],
6492 "description": "Flexible and feature-complete Redis client for PHP and HHVM",
6493 "homepage": "http://github.com/nrk/predis",
6494 "keywords": [
6495 "nosql",
6496 "predis",
6497 "redis"
6498 ],
6499 "time": "2017-07-12T14:39:17+00:00"
6500 },
6501 {
6502 "name": "psr/cache",
6503 "version": "1.0.1",
6504 "source": {
6505 "type": "git",
6506 "url": "https://github.com/php-fig/cache.git",
6507 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
6508 },
6509 "dist": {
6510 "type": "zip",
6511 "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
6512 "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
6513 "shasum": ""
6514 },
6515 "require": {
6516 "php": ">=5.3.0"
6517 },
6518 "type": "library",
6519 "extra": {
6520 "branch-alias": {
6521 "dev-master": "1.0.x-dev"
6522 }
6523 },
6524 "autoload": {
6525 "psr-4": {
6526 "Psr\\Cache\\": "src/"
6527 }
6528 },
6529 "notification-url": "https://packagist.org/downloads/",
6530 "license": [
6531 "MIT"
6532 ],
6533 "authors": [
6534 {
6535 "name": "PHP-FIG",
6536 "homepage": "http://www.php-fig.org/"
6537 }
6538 ],
6539 "description": "Common interface for caching libraries",
6540 "keywords": [
6541 "cache",
6542 "psr",
6543 "psr-6"
6544 ],
6545 "time": "2016-08-06T20:24:11+00:00"
6546 },
6547 {
6548 "name": "psr/container",
6549 "version": "1.0.0",
6550 "source": {
6551 "type": "git",
6552 "url": "https://github.com/php-fig/container.git",
6553 "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
6554 },
6555 "dist": {
6556 "type": "zip",
6557 "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
6558 "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
6559 "shasum": ""
6560 },
6561 "require": {
6562 "php": ">=5.3.0"
6563 },
6564 "type": "library",
6565 "extra": {
6566 "branch-alias": {
6567 "dev-master": "1.0.x-dev"
6568 }
6569 },
6570 "autoload": {
6571 "psr-4": {
6572 "Psr\\Container\\": "src/"
6573 }
6574 },
6575 "notification-url": "https://packagist.org/downloads/",
6576 "license": [
6577 "MIT"
6578 ],
6579 "authors": [
6580 {
6581 "name": "PHP-FIG",
6582 "homepage": "http://www.php-fig.org/"
6583 }
6584 ],
6585 "description": "Common Container Interface (PHP FIG PSR-11)",
6586 "homepage": "https://github.com/php-fig/container",
6587 "keywords": [
6588 "PSR-11",
6589 "container",
6590 "container-interface",
6591 "container-interop",
6592 "psr"
6593 ],
6594 "time": "2017-02-14T16:28:37+00:00"
6595 },
6596 {
6597 "name": "psr/http-client",
6598 "version": "1.0.0",
6599 "source": {
6600 "type": "git",
6601 "url": "https://github.com/php-fig/http-client.git",
6602 "reference": "496a823ef742b632934724bf769560c2a5c7c44e"
6603 },
6604 "dist": {
6605 "type": "zip",
6606 "url": "https://api.github.com/repos/php-fig/http-client/zipball/496a823ef742b632934724bf769560c2a5c7c44e",
6607 "reference": "496a823ef742b632934724bf769560c2a5c7c44e",
6608 "shasum": ""
6609 },
6610 "require": {
6611 "php": "^7.0",
6612 "psr/http-message": "^1.0"
6613 },
6614 "type": "library",
6615 "extra": {
6616 "branch-alias": {
6617 "dev-master": "1.0.x-dev"
6618 }
6619 },
6620 "autoload": {
6621 "psr-4": {
6622 "Psr\\Http\\Client\\": "src/"
6623 }
6624 },
6625 "notification-url": "https://packagist.org/downloads/",
6626 "license": [
6627 "MIT"
6628 ],
6629 "authors": [
6630 {
6631 "name": "PHP-FIG",
6632 "homepage": "http://www.php-fig.org/"
6633 }
6634 ],
6635 "description": "Common interface for HTTP clients",
6636 "homepage": "https://github.com/php-fig/http-client",
6637 "keywords": [
6638 "http",
6639 "http-client",
6640 "psr",
6641 "psr-18"
6642 ],
6643 "time": "2018-10-30T23:29:13+00:00"
6644 },
6645 {
6646 "name": "psr/http-factory",
6647 "version": "1.0.1",
6648 "source": {
6649 "type": "git",
6650 "url": "https://github.com/php-fig/http-factory.git",
6651 "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
6652 },
6653 "dist": {
6654 "type": "zip",
6655 "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
6656 "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
6657 "shasum": ""
6658 },
6659 "require": {
6660 "php": ">=7.0.0",
6661 "psr/http-message": "^1.0"
6662 },
6663 "type": "library",
6664 "extra": {
6665 "branch-alias": {
6666 "dev-master": "1.0.x-dev"
6667 }
6668 },
6669 "autoload": {
6670 "psr-4": {
6671 "Psr\\Http\\Message\\": "src/"
6672 }
6673 },
6674 "notification-url": "https://packagist.org/downloads/",
6675 "license": [
6676 "MIT"
6677 ],
6678 "authors": [
6679 {
6680 "name": "PHP-FIG",
6681 "homepage": "http://www.php-fig.org/"
6682 }
6683 ],
6684 "description": "Common interfaces for PSR-7 HTTP message factories",
6685 "keywords": [
6686 "factory",
6687 "http",
6688 "message",
6689 "psr",
6690 "psr-17",
6691 "psr-7",
6692 "request",
6693 "response"
6694 ],
6695 "time": "2019-04-30T12:38:16+00:00"
6696 },
6697 {
6698 "name": "psr/http-message",
6699 "version": "1.0.1",
6700 "source": {
6701 "type": "git",
6702 "url": "https://github.com/php-fig/http-message.git",
6703 "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
6704 },
6705 "dist": {
6706 "type": "zip",
6707 "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
6708 "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
6709 "shasum": ""
6710 },
6711 "require": {
6712 "php": ">=5.3.0"
6713 },
6714 "type": "library",
6715 "extra": {
6716 "branch-alias": {
6717 "dev-master": "1.0.x-dev"
6718 }
6719 },
6720 "autoload": {
6721 "psr-4": {
6722 "Psr\\Http\\Message\\": "src/"
6723 }
6724 },
6725 "notification-url": "https://packagist.org/downloads/",
6726 "license": [
6727 "MIT"
6728 ],
6729 "authors": [
6730 {
6731 "name": "PHP-FIG",
6732 "homepage": "http://www.php-fig.org/"
6733 }
6734 ],
6735 "description": "Common interface for HTTP messages",
6736 "homepage": "https://github.com/php-fig/http-message",
6737 "keywords": [
6738 "http",
6739 "http-message",
6740 "psr",
6741 "psr-7",
6742 "request",
6743 "response"
6744 ],
6745 "time": "2016-08-06T14:39:51+00:00"
6746 },
6747 {
6748 "name": "psr/link",
6749 "version": "1.0.0",
6750 "source": {
6751 "type": "git",
6752 "url": "https://github.com/php-fig/link.git",
6753 "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562"
6754 },
6755 "dist": {
6756 "type": "zip",
6757 "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562",
6758 "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562",
6759 "shasum": ""
6760 },
6761 "require": {
6762 "php": ">=5.3.0"
6763 },
6764 "type": "library",
6765 "extra": {
6766 "branch-alias": {
6767 "dev-master": "1.0.x-dev"
6768 }
6769 },
6770 "autoload": {
6771 "psr-4": {
6772 "Psr\\Link\\": "src/"
6773 }
6774 },
6775 "notification-url": "https://packagist.org/downloads/",
6776 "license": [
6777 "MIT"
6778 ],
6779 "authors": [
6780 {
6781 "name": "PHP-FIG",
6782 "homepage": "http://www.php-fig.org/"
6783 }
6784 ],
6785 "description": "Common interfaces for HTTP links",
6786 "keywords": [
6787 "http",
6788 "http-link",
6789 "link",
6790 "psr",
6791 "psr-13",
6792 "rest"
6793 ],
6794 "time": "2016-10-28T16:06:13+00:00"
6795 },
6796 {
6797 "name": "psr/log",
6798 "version": "1.1.0",
6799 "source": {
6800 "type": "git",
6801 "url": "https://github.com/php-fig/log.git",
6802 "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
6803 },
6804 "dist": {
6805 "type": "zip",
6806 "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
6807 "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
6808 "shasum": ""
6809 },
6810 "require": {
6811 "php": ">=5.3.0"
6812 },
6813 "type": "library",
6814 "extra": {
6815 "branch-alias": {
6816 "dev-master": "1.0.x-dev"
6817 }
6818 },
6819 "autoload": {
6820 "psr-4": {
6821 "Psr\\Log\\": "Psr/Log/"
6822 }
6823 },
6824 "notification-url": "https://packagist.org/downloads/",
6825 "license": [
6826 "MIT"
6827 ],
6828 "authors": [
6829 {
6830 "name": "PHP-FIG",
6831 "homepage": "http://www.php-fig.org/"
6832 }
6833 ],
6834 "description": "Common interface for logging libraries",
6835 "homepage": "https://github.com/php-fig/log",
6836 "keywords": [
6837 "log",
6838 "psr",
6839 "psr-3"
6840 ],
6841 "time": "2018-11-20T15:27:04+00:00"
6842 },
6843 {
6844 "name": "psr/simple-cache",
6845 "version": "1.0.1",
6846 "source": {
6847 "type": "git",
6848 "url": "https://github.com/php-fig/simple-cache.git",
6849 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
6850 },
6851 "dist": {
6852 "type": "zip",
6853 "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
6854 "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
6855 "shasum": ""
6856 },
6857 "require": {
6858 "php": ">=5.3.0"
6859 },
6860 "type": "library",
6861 "extra": {
6862 "branch-alias": {
6863 "dev-master": "1.0.x-dev"
6864 }
6865 },
6866 "autoload": {
6867 "psr-4": {
6868 "Psr\\SimpleCache\\": "src/"
6869 }
6870 },
6871 "notification-url": "https://packagist.org/downloads/",
6872 "license": [
6873 "MIT"
6874 ],
6875 "authors": [
6876 {
6877 "name": "PHP-FIG",
6878 "homepage": "http://www.php-fig.org/"
6879 }
6880 ],
6881 "description": "Common interfaces for simple caching",
6882 "keywords": [
6883 "cache",
6884 "caching",
6885 "psr",
6886 "psr-16",
6887 "simple-cache"
6888 ],
6889 "time": "2017-10-23T01:57:42+00:00"
6890 },
6891 {
6892 "name": "ralouphie/getallheaders",
6893 "version": "2.0.5",
6894 "source": {
6895 "type": "git",
6896 "url": "https://github.com/ralouphie/getallheaders.git",
6897 "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
6898 },
6899 "dist": {
6900 "type": "zip",
6901 "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
6902 "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
6903 "shasum": ""
6904 },
6905 "require": {
6906 "php": ">=5.3"
6907 },
6908 "require-dev": {
6909 "phpunit/phpunit": "~3.7.0",
6910 "satooshi/php-coveralls": ">=1.0"
6911 },
6912 "type": "library",
6913 "autoload": {
6914 "files": [
6915 "src/getallheaders.php"
6916 ]
6917 },
6918 "notification-url": "https://packagist.org/downloads/",
6919 "license": [
6920 "MIT"
6921 ],
6922 "authors": [
6923 {
6924 "name": "Ralph Khattar",
6925 "email": "ralph.khattar@gmail.com"
6926 }
6927 ],
6928 "description": "A polyfill for getallheaders.",
6929 "time": "2016-02-11T07:05:27+00:00"
6930 },
6931 {
6932 "name": "ramsey/uuid",
6933 "version": "3.8.0",
6934 "source": {
6935 "type": "git",
6936 "url": "https://github.com/ramsey/uuid.git",
6937 "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3"
6938 },
6939 "dist": {
6940 "type": "zip",
6941 "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
6942 "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
6943 "shasum": ""
6944 },
6945 "require": {
6946 "paragonie/random_compat": "^1.0|^2.0|9.99.99",
6947 "php": "^5.4 || ^7.0",
6948 "symfony/polyfill-ctype": "^1.8"
6949 },
6950 "replace": {
6951 "rhumsaa/uuid": "self.version"
6952 },
6953 "require-dev": {
6954 "codeception/aspect-mock": "^1.0 | ~2.0.0",
6955 "doctrine/annotations": "~1.2.0",
6956 "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0",
6957 "ircmaxell/random-lib": "^1.1",
6958 "jakub-onderka/php-parallel-lint": "^0.9.0",
6959 "mockery/mockery": "^0.9.9",
6960 "moontoast/math": "^1.1",
6961 "php-mock/php-mock-phpunit": "^0.3|^1.1",
6962 "phpunit/phpunit": "^4.7|^5.0|^6.5",
6963 "squizlabs/php_codesniffer": "^2.3"
6964 },
6965 "suggest": {
6966 "ext-ctype": "Provides support for PHP Ctype functions",
6967 "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
6968 "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
6969 "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
6970 "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
6971 "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid",
6972 "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
6973 },
6974 "type": "library",
6975 "extra": {
6976 "branch-alias": {
6977 "dev-master": "3.x-dev"
6978 }
6979 },
6980 "autoload": {
6981 "psr-4": {
6982 "Ramsey\\Uuid\\": "src/"
6983 }
6984 },
6985 "notification-url": "https://packagist.org/downloads/",
6986 "license": [
6987 "MIT"
6988 ],
6989 "authors": [
6990 {
6991 "name": "Marijn Huizendveld",
6992 "email": "marijn.huizendveld@gmail.com"
6993 },
6994 {
6995 "name": "Thibaud Fabre",
6996 "email": "thibaud@aztech.io"
6997 },
6998 {
6999 "name": "Ben Ramsey",
7000 "email": "ben@benramsey.com",
7001 "homepage": "https://benramsey.com"
7002 }
7003 ],
7004 "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).",
7005 "homepage": "https://github.com/ramsey/uuid",
7006 "keywords": [
7007 "guid",
7008 "identifier",
7009 "uuid"
7010 ],
7011 "time": "2018-07-19T23:38:55+00:00"
7012 },
7013 {
7014 "name": "react/promise",
7015 "version": "v2.7.1",
7016 "source": {
7017 "type": "git",
7018 "url": "https://github.com/reactphp/promise.git",
7019 "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d"
7020 },
7021 "dist": {
7022 "type": "zip",
7023 "url": "https://api.github.com/repos/reactphp/promise/zipball/31ffa96f8d2ed0341a57848cbb84d88b89dd664d",
7024 "reference": "31ffa96f8d2ed0341a57848cbb84d88b89dd664d",
7025 "shasum": ""
7026 },
7027 "require": {
7028 "php": ">=5.4.0"
7029 },
7030 "require-dev": {
7031 "phpunit/phpunit": "~4.8"
7032 },
7033 "type": "library",
7034 "autoload": {
7035 "psr-4": {
7036 "React\\Promise\\": "src/"
7037 },
7038 "files": [
7039 "src/functions_include.php"
7040 ]
7041 },
7042 "notification-url": "https://packagist.org/downloads/",
7043 "license": [
7044 "MIT"
7045 ],
7046 "authors": [
7047 {
7048 "name": "Jan Sorgalla",
7049 "email": "jsorgalla@gmail.com"
7050 }
7051 ],
7052 "description": "A lightweight implementation of CommonJS Promises/A for PHP",
7053 "keywords": [
7054 "promise",
7055 "promises"
7056 ],
7057 "time": "2019-01-07T21:25:54+00:00"
7058 },
7059 {
7060 "name": "scheb/two-factor-bundle",
7061 "version": "v3.19.0",
7062 "source": {
7063 "type": "git",
7064 "url": "https://github.com/scheb/two-factor-bundle.git",
7065 "reference": "4bc6023401a4c7e50dbd9c66f55cc8df9f77e69c"
7066 },
7067 "dist": {
7068 "type": "zip",
7069 "url": "https://api.github.com/repos/scheb/two-factor-bundle/zipball/4bc6023401a4c7e50dbd9c66f55cc8df9f77e69c",
7070 "reference": "4bc6023401a4c7e50dbd9c66f55cc8df9f77e69c",
7071 "shasum": ""
7072 },
7073 "require": {
7074 "lcobucci/jwt": "^3.2",
7075 "php": "^7.1.3",
7076 "sonata-project/google-authenticator": "^2.2",
7077 "symfony/config": "^3.4|^4.0",
7078 "symfony/dependency-injection": "^3.4|^4.0",
7079 "symfony/event-dispatcher": "^3.4|^4.0",
7080 "symfony/framework-bundle": "^3.4|^4.0",
7081 "symfony/http-foundation": "^3.4|^4.0",
7082 "symfony/http-kernel": "^3.4|^4.0",
7083 "symfony/property-access": "^3.4|^4.0",
7084 "symfony/security-bundle": "^3.4|^4.0",
7085 "symfony/twig-bundle": "^3.4|^4.0"
7086 },
7087 "require-dev": {
7088 "doctrine/lexer": "^1.0.1",
7089 "doctrine/orm": "^2.6",
7090 "phpunit/phpunit": "^7.0|^8.0",
7091 "swiftmailer/swiftmailer": "^6.0",
7092 "symfony/yaml": "^3.4|^4.0"
7093 },
7094 "type": "symfony-bundle",
7095 "autoload": {
7096 "psr-4": {
7097 "Scheb\\TwoFactorBundle\\": ""
7098 }
7099 },
7100 "notification-url": "https://packagist.org/downloads/",
7101 "license": [
7102 "MIT"
7103 ],
7104 "authors": [
7105 {
7106 "name": "Christian Scheb",
7107 "email": "me@christianscheb.de"
7108 }
7109 ],
7110 "description": "Provides two-factor authentication for Symfony applications",
7111 "homepage": "https://github.com/scheb/two-factor-bundle",
7112 "keywords": [
7113 "Authentication",
7114 "security",
7115 "symfony",
7116 "two-factor",
7117 "two-step"
7118 ],
7119 "time": "2019-05-03T12:46:19+00:00"
7120 },
7121 {
7122 "name": "sensio/distribution-bundle",
7123 "version": "v5.0.24",
7124 "source": {
7125 "type": "git",
7126 "url": "https://github.com/sensiolabs/SensioDistributionBundle.git",
7127 "reference": "59eac70f15f97ee945924948a6f5e2f6f86b7a4b"
7128 },
7129 "dist": {
7130 "type": "zip",
7131 "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/59eac70f15f97ee945924948a6f5e2f6f86b7a4b",
7132 "reference": "59eac70f15f97ee945924948a6f5e2f6f86b7a4b",
7133 "shasum": ""
7134 },
7135 "require": {
7136 "php": ">=5.3.9",
7137 "sensiolabs/security-checker": "~5.0",
7138 "symfony/class-loader": "~2.3|~3.0",
7139 "symfony/config": "~2.3|~3.0",
7140 "symfony/dependency-injection": "~2.3|~3.0",
7141 "symfony/filesystem": "~2.3|~3.0",
7142 "symfony/http-kernel": "~2.3|~3.0",
7143 "symfony/process": "~2.3|~3.0"
7144 },
7145 "type": "symfony-bundle",
7146 "extra": {
7147 "branch-alias": {
7148 "dev-master": "5.0.x-dev"
7149 }
7150 },
7151 "autoload": {
7152 "psr-4": {
7153 "Sensio\\Bundle\\DistributionBundle\\": ""
7154 }
7155 },
7156 "notification-url": "https://packagist.org/downloads/",
7157 "license": [
7158 "MIT"
7159 ],
7160 "authors": [
7161 {
7162 "name": "Fabien Potencier",
7163 "email": "fabien@symfony.com"
7164 }
7165 ],
7166 "description": "Base bundle for Symfony Distributions",
7167 "keywords": [
7168 "configuration",
7169 "distribution"
7170 ],
7171 "time": "2018-12-14T17:36:15+00:00"
7172 },
7173 {
7174 "name": "sensio/framework-extra-bundle",
7175 "version": "v5.3.1",
7176 "source": {
7177 "type": "git",
7178 "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git",
7179 "reference": "5f75c4658b03301cba17baa15a840b57b72b4262"
7180 },
7181 "dist": {
7182 "type": "zip",
7183 "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/5f75c4658b03301cba17baa15a840b57b72b4262",
7184 "reference": "5f75c4658b03301cba17baa15a840b57b72b4262",
7185 "shasum": ""
7186 },
7187 "require": {
7188 "doctrine/annotations": "^1.0",
7189 "doctrine/persistence": "^1.0",
7190 "php": ">=7.1.3",
7191 "symfony/config": "^3.4|^4.2",
7192 "symfony/dependency-injection": "^3.4|^4.2",
7193 "symfony/framework-bundle": "^3.4|^4.2",
7194 "symfony/http-kernel": "^3.4|^4.2"
7195 },
7196 "require-dev": {
7197 "doctrine/doctrine-bundle": "^1.6",
7198 "doctrine/orm": "^2.5",
7199 "nyholm/psr7": "^1.1",
7200 "symfony/browser-kit": "^3.4|^4.2",
7201 "symfony/dom-crawler": "^3.4|^4.2",
7202 "symfony/expression-language": "^3.4|^4.2",
7203 "symfony/finder": "^3.4|^4.2",
7204 "symfony/monolog-bridge": "^3.0|^4.0",
7205 "symfony/monolog-bundle": "^3.2",
7206 "symfony/phpunit-bridge": "^3.4.19|^4.1.8",
7207 "symfony/psr-http-message-bridge": "^1.1",
7208 "symfony/security-bundle": "^3.4|^4.2",
7209 "symfony/twig-bundle": "^3.4|^4.2",
7210 "symfony/yaml": "^3.4|^4.2",
7211 "twig/twig": "~1.12|~2.0"
7212 },
7213 "suggest": {
7214 "symfony/expression-language": "",
7215 "symfony/psr-http-message-bridge": "To use the PSR-7 converters",
7216 "symfony/security-bundle": ""
7217 },
7218 "type": "symfony-bundle",
7219 "extra": {
7220 "branch-alias": {
7221 "dev-master": "5.3.x-dev"
7222 }
7223 },
7224 "autoload": {
7225 "psr-4": {
7226 "Sensio\\Bundle\\FrameworkExtraBundle\\": ""
7227 }
7228 },
7229 "notification-url": "https://packagist.org/downloads/",
7230 "license": [
7231 "MIT"
7232 ],
7233 "authors": [
7234 {
7235 "name": "Fabien Potencier",
7236 "email": "fabien@symfony.com"
7237 }
7238 ],
7239 "description": "This bundle provides a way to configure your controllers with annotations",
7240 "keywords": [
7241 "annotations",
7242 "controllers"
7243 ],
7244 "time": "2019-04-10T06:00:20+00:00"
7245 },
7246 {
7247 "name": "sensiolabs/security-checker",
7248 "version": "v5.0.3",
7249 "source": {
7250 "type": "git",
7251 "url": "https://github.com/sensiolabs/security-checker.git",
7252 "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1"
7253 },
7254 "dist": {
7255 "type": "zip",
7256 "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/46be3f58adac13084497961e10eed9a7fb4d44d1",
7257 "reference": "46be3f58adac13084497961e10eed9a7fb4d44d1",
7258 "shasum": ""
7259 },
7260 "require": {
7261 "composer/ca-bundle": "^1.0",
7262 "php": ">=5.5.9",
7263 "symfony/console": "~2.7|~3.0|~4.0"
7264 },
7265 "bin": [
7266 "security-checker"
7267 ],
7268 "type": "library",
7269 "extra": {
7270 "branch-alias": {
7271 "dev-master": "5.0-dev"
7272 }
7273 },
7274 "autoload": {
7275 "psr-4": {
7276 "SensioLabs\\Security\\": "SensioLabs/Security"
7277 }
7278 },
7279 "notification-url": "https://packagist.org/downloads/",
7280 "license": [
7281 "MIT"
7282 ],
7283 "authors": [
7284 {
7285 "name": "Fabien Potencier",
7286 "email": "fabien.potencier@gmail.com"
7287 }
7288 ],
7289 "description": "A security checker for your composer.lock",
7290 "time": "2018-12-19T17:14:59+00:00"
7291 },
7292 {
7293 "name": "sentry/sdk",
7294 "version": "2.0.3",
7295 "source": {
7296 "type": "git",
7297 "url": "https://github.com/getsentry/sentry-php-sdk.git",
7298 "reference": "91c36aec83e4c1c5801b64ef4927b78a5aa8ce7f"
7299 },
7300 "dist": {
7301 "type": "zip",
7302 "url": "https://api.github.com/repos/getsentry/sentry-php-sdk/zipball/91c36aec83e4c1c5801b64ef4927b78a5aa8ce7f",
7303 "reference": "91c36aec83e4c1c5801b64ef4927b78a5aa8ce7f",
7304 "shasum": ""
7305 },
7306 "require": {
7307 "http-interop/http-factory-guzzle": "^1.0",
7308 "php-http/curl-client": "^1.0|^2.0",
7309 "sentry/sentry": "^2.0.1"
7310 },
7311 "type": "metapackage",
7312 "notification-url": "https://packagist.org/downloads/",
7313 "license": [
7314 "MIT"
7315 ],
7316 "authors": [
7317 {
7318 "name": "Sentry",
7319 "email": "accounts@sentry.io"
7320 }
7321 ],
7322 "description": "This is a metapackage shipping sentry/sentry with a recommended http client.",
7323 "time": "2019-04-08T07:21:45+00:00"
7324 },
7325 {
7326 "name": "sentry/sentry",
7327 "version": "2.1.0",
7328 "source": {
7329 "type": "git",
7330 "url": "https://github.com/getsentry/sentry-php.git",
7331 "reference": "1f1704806820c16dcefcbf2e80b920024fda2234"
7332 },
7333 "dist": {
7334 "type": "zip",
7335 "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/1f1704806820c16dcefcbf2e80b920024fda2234",
7336 "reference": "1f1704806820c16dcefcbf2e80b920024fda2234",
7337 "shasum": ""
7338 },
7339 "require": {
7340 "ext-json": "*",
7341 "ext-mbstring": "*",
7342 "jean85/pretty-package-versions": "^1.2",
7343 "php": "^7.1",
7344 "php-http/async-client-implementation": "^1.0",
7345 "php-http/client-common": "^1.5|^2.0",
7346 "php-http/discovery": "^1.6.1",
7347 "php-http/httplug": "^1.1|^2.0",
7348 "php-http/message": "^1.5",
7349 "psr/http-message-implementation": "^1.0",
7350 "ramsey/uuid": "^3.3",
7351 "symfony/options-resolver": "^2.7|^3.0|^4.0",
7352 "zendframework/zend-diactoros": "^1.4|^2.0"
7353 },
7354 "conflict": {
7355 "php-http/client-common": "1.8.0",
7356 "raven/raven": "*"
7357 },
7358 "require-dev": {
7359 "friendsofphp/php-cs-fixer": "^2.13",
7360 "monolog/monolog": "^1.3|^2.0",
7361 "php-http/mock-client": "^1.0",
7362 "phpstan/phpstan": "^0.10.3",
7363 "phpstan/phpstan-phpunit": "^0.10",
7364 "phpunit/phpunit": "^7.0",
7365 "symfony/phpunit-bridge": "^4.1.6"
7366 },
7367 "type": "library",
7368 "extra": {
7369 "branch-alias": {
7370 "dev-master": "2.0.x-dev"
7371 }
7372 },
7373 "autoload": {
7374 "files": [
7375 "src/Sdk.php"
7376 ],
7377 "psr-4": {
7378 "Sentry\\": "src/"
7379 }
7380 },
7381 "notification-url": "https://packagist.org/downloads/",
7382 "license": [
7383 "BSD-3-Clause"
7384 ],
7385 "authors": [
7386 {
7387 "name": "Sentry",
7388 "email": "accounts@sentry.io"
7389 }
7390 ],
7391 "description": "A PHP SDK for Sentry (http://sentry.io)",
7392 "homepage": "http://sentry.io",
7393 "keywords": [
7394 "crash-reporting",
7395 "crash-reports",
7396 "error-handler",
7397 "error-monitoring",
7398 "log",
7399 "logging",
7400 "sentry"
7401 ],
7402 "time": "2019-05-22T07:44:47+00:00"
7403 },
7404 {
7405 "name": "sentry/sentry-symfony",
7406 "version": "3.0.0",
7407 "source": {
7408 "type": "git",
7409 "url": "https://github.com/getsentry/sentry-symfony.git",
7410 "reference": "3fd045a5ce9279db5687a560bc9ebabd6b0468a7"
7411 },
7412 "dist": {
7413 "type": "zip",
7414 "url": "https://api.github.com/repos/getsentry/sentry-symfony/zipball/3fd045a5ce9279db5687a560bc9ebabd6b0468a7",
7415 "reference": "3fd045a5ce9279db5687a560bc9ebabd6b0468a7",
7416 "shasum": ""
7417 },
7418 "require": {
7419 "jean85/pretty-package-versions": "^1.0",
7420 "php": "^7.1",
7421 "sentry/sdk": "^2.0",
7422 "symfony/config": "^3.0||^4.0",
7423 "symfony/console": "^3.0||^4.0",
7424 "symfony/dependency-injection": "^3.0||^4.0",
7425 "symfony/event-dispatcher": "^3.0||^4.0",
7426 "symfony/http-kernel": "^3.0||^4.0",
7427 "symfony/security-core": "^3.0||^4.0"
7428 },
7429 "require-dev": {
7430 "friendsofphp/php-cs-fixer": "^2.8",
7431 "jangregor/phpstan-prophecy": "^0.3.0",
7432 "php-http/mock-client": "^1.0",
7433 "phpstan/phpstan": "^0.11",
7434 "phpstan/phpstan-phpunit": "^0.11",
7435 "phpunit/phpunit": "^7.5",
7436 "scrutinizer/ocular": "^1.4",
7437 "symfony/expression-language": "^3.0||^4.0"
7438 },
7439 "type": "symfony-bundle",
7440 "extra": {
7441 "branch-alias": {
7442 "master": "3.x-dev",
7443 "releases/2.x": "2.x-dev",
7444 "releases/1.x": "1.x-dev"
7445 }
7446 },
7447 "autoload": {
7448 "psr-4": {
7449 "Sentry\\SentryBundle\\": "src/"
7450 }
7451 },
7452 "notification-url": "https://packagist.org/downloads/",
7453 "license": [
7454 "Apache-2.0"
7455 ],
7456 "authors": [
7457 {
7458 "name": "David Cramer",
7459 "email": "dcramer@gmail.com"
7460 },
7461 {
7462 "name": "Alessandro Lai",
7463 "email": "alessandro.lai85@gmail.com"
7464 }
7465 ],
7466 "description": "Symfony integration for Sentry (http://getsentry.com)",
7467 "homepage": "http://getsentry.com",
7468 "keywords": [
7469 "errors",
7470 "logging",
7471 "sentry",
7472 "symfony"
7473 ],
7474 "time": "2019-05-10T11:37:47+00:00"
7475 },
7476 {
7477 "name": "simplepie/simplepie",
7478 "version": "1.5.2",
7479 "source": {
7480 "type": "git",
7481 "url": "https://github.com/simplepie/simplepie.git",
7482 "reference": "0e8fe72132dad765d25db4cabc69a91139af1263"
7483 },
7484 "dist": {
7485 "type": "zip",
7486 "url": "https://api.github.com/repos/simplepie/simplepie/zipball/0e8fe72132dad765d25db4cabc69a91139af1263",
7487 "reference": "0e8fe72132dad765d25db4cabc69a91139af1263",
7488 "shasum": ""
7489 },
7490 "require": {
7491 "ext-pcre": "*",
7492 "ext-xml": "*",
7493 "ext-xmlreader": "*",
7494 "php": ">=5.6.0"
7495 },
7496 "require-dev": {
7497 "phpunit/phpunit": "~5.4.3 || ~6.5"
7498 },
7499 "suggest": {
7500 "ext-curl": "",
7501 "ext-iconv": "",
7502 "ext-intl": "",
7503 "ext-mbstring": "",
7504 "mf2/mf2": "Microformat module that allows for parsing HTML for microformats"
7505 },
7506 "type": "library",
7507 "autoload": {
7508 "psr-0": {
7509 "SimplePie": "library"
7510 }
7511 },
7512 "notification-url": "https://packagist.org/downloads/",
7513 "license": [
7514 "BSD-3-Clause"
7515 ],
7516 "authors": [
7517 {
7518 "name": "Ryan Parman",
7519 "homepage": "http://ryanparman.com/",
7520 "role": "Creator, alumnus developer"
7521 },
7522 {
7523 "name": "Geoffrey Sneddon",
7524 "homepage": "http://gsnedders.com/",
7525 "role": "Alumnus developer"
7526 },
7527 {
7528 "name": "Ryan McCue",
7529 "email": "me@ryanmccue.info",
7530 "homepage": "http://ryanmccue.info/",
7531 "role": "Developer"
7532 }
7533 ],
7534 "description": "A simple Atom/RSS parsing library for PHP",
7535 "homepage": "http://simplepie.org/",
7536 "keywords": [
7537 "atom",
7538 "feeds",
7539 "rss"
7540 ],
7541 "time": "2018-08-02T05:43:58+00:00"
7542 },
7543 {
7544 "name": "smalot/pdfparser",
7545 "version": "v0.14.0",
7546 "source": {
7547 "type": "git",
7548 "url": "https://github.com/smalot/pdfparser.git",
7549 "reference": "ec72a99028ba5e21a0acad92047b85e128cbf81f"
7550 },
7551 "dist": {
7552 "type": "zip",
7553 "url": "https://api.github.com/repos/smalot/pdfparser/zipball/ec72a99028ba5e21a0acad92047b85e128cbf81f",
7554 "reference": "ec72a99028ba5e21a0acad92047b85e128cbf81f",
7555 "shasum": ""
7556 },
7557 "require": {
7558 "ext-mbstring": "*",
7559 "ext-zlib": "*",
7560 "php": ">=5.3.0",
7561 "tecnickcom/tcpdf": "~6.0"
7562 },
7563 "require-dev": {
7564 "atoum/atoum": "^2.8 | ^3.0"
7565 },
7566 "type": "library",
7567 "autoload": {
7568 "psr-0": {
7569 "Smalot\\PdfParser\\": "src/"
7570 }
7571 },
7572 "notification-url": "https://packagist.org/downloads/",
7573 "license": [
7574 "LGPL-3.0"
7575 ],
7576 "authors": [
7577 {
7578 "name": "Sebastien MALOT",
7579 "email": "sebastien@malot.fr"
7580 }
7581 ],
7582 "description": "Pdf parser library. Can read and extract information from pdf file.",
7583 "homepage": "http://www.pdfparser.org",
7584 "keywords": [
7585 "extract",
7586 "parse",
7587 "parser",
7588 "pdf",
7589 "text"
7590 ],
7591 "time": "2019-01-23T09:14:37+00:00"
7592 },
7593 {
7594 "name": "sonata-project/google-authenticator",
7595 "version": "2.2.0",
7596 "source": {
7597 "type": "git",
7598 "url": "https://github.com/sonata-project/GoogleAuthenticator.git",
7599 "reference": "feda53899b26af24e3db2fe7a3e5f053ca483762"
7600 },
7601 "dist": {
7602 "type": "zip",
7603 "url": "https://api.github.com/repos/sonata-project/GoogleAuthenticator/zipball/feda53899b26af24e3db2fe7a3e5f053ca483762",
7604 "reference": "feda53899b26af24e3db2fe7a3e5f053ca483762",
7605 "shasum": ""
7606 },
7607 "require": {
7608 "php": "^7.1"
7609 },
7610 "require-dev": {
7611 "symfony/phpunit-bridge": "^4.0"
7612 },
7613 "type": "library",
7614 "extra": {
7615 "branch-alias": {
7616 "dev-master": "2.x-dev"
7617 }
7618 },
7619 "autoload": {
7620 "psr-4": {
7621 "Google\\Authenticator\\": "src/",
7622 "Sonata\\GoogleAuthenticator\\": "src/"
7623 }
7624 },
7625 "notification-url": "https://packagist.org/downloads/",
7626 "license": [
7627 "MIT"
7628 ],
7629 "authors": [
7630 {
7631 "name": "Christian Stocker",
7632 "email": "me@chregu.tv"
7633 },
7634 {
7635 "name": "Andre DeMarre",
7636 "homepage": "http://www.devnetwork.net/viewtopic.php?f=50&t=94989"
7637 },
7638 {
7639 "name": "Thomas Rabaix",
7640 "email": "thomas.rabaix@gmail.com"
7641 }
7642 ],
7643 "description": "Library to integrate Google Authenticator into a PHP project",
7644 "homepage": "https://github.com/sonata-project/GoogleAuthenticator",
7645 "keywords": [
7646 "google authenticator"
7647 ],
7648 "time": "2018-07-18T22:08:02+00:00"
7649 },
7650 {
7651 "name": "stof/doctrine-extensions-bundle",
7652 "version": "v1.3.0",
7653 "source": {
7654 "type": "git",
7655 "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git",
7656 "reference": "46db71ec7ffee9122eca3cdddd4ef8d84bae269c"
7657 },
7658 "dist": {
7659 "type": "zip",
7660 "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/46db71ec7ffee9122eca3cdddd4ef8d84bae269c",
7661 "reference": "46db71ec7ffee9122eca3cdddd4ef8d84bae269c",
7662 "shasum": ""
7663 },
7664 "require": {
7665 "gedmo/doctrine-extensions": "^2.3.4",
7666 "php": ">=5.3.2",
7667 "symfony/framework-bundle": "~2.7|~3.2|~4.0"
7668 },
7669 "require-dev": {
7670 "symfony/phpunit-bridge": "^4.0",
7671 "symfony/security-bundle": "^2.7 || ^3.2 || ^4.0"
7672 },
7673 "suggest": {
7674 "doctrine/doctrine-bundle": "to use the ORM extensions",
7675 "doctrine/mongodb-odm-bundle": "to use the MongoDB ODM extensions"
7676 },
7677 "type": "symfony-bundle",
7678 "extra": {
7679 "branch-alias": {
7680 "dev-master": "1.3.x-dev"
7681 }
7682 },
7683 "autoload": {
7684 "psr-4": {
7685 "Stof\\DoctrineExtensionsBundle\\": ""
7686 }
7687 },
7688 "notification-url": "https://packagist.org/downloads/",
7689 "license": [
7690 "MIT"
7691 ],
7692 "authors": [
7693 {
7694 "name": "Christophe Coevoet",
7695 "email": "stof@notk.org"
7696 }
7697 ],
7698 "description": "Integration of the gedmo/doctrine-extensions with Symfony2",
7699 "homepage": "https://github.com/stof/StofDoctrineExtensionsBundle",
7700 "keywords": [
7701 "behaviors",
7702 "doctrine2",
7703 "extensions",
7704 "gedmo",
7705 "loggable",
7706 "nestedset",
7707 "sluggable",
7708 "sortable",
7709 "timestampable",
7710 "translatable",
7711 "tree"
7712 ],
7713 "time": "2017-12-24T16:06:50+00:00"
7714 },
7715 {
7716 "name": "swiftmailer/swiftmailer",
7717 "version": "v6.2.1",
7718 "source": {
7719 "type": "git",
7720 "url": "https://github.com/swiftmailer/swiftmailer.git",
7721 "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a"
7722 },
7723 "dist": {
7724 "type": "zip",
7725 "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a",
7726 "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a",
7727 "shasum": ""
7728 },
7729 "require": {
7730 "egulias/email-validator": "~2.0",
7731 "php": ">=7.0.0",
7732 "symfony/polyfill-iconv": "^1.0",
7733 "symfony/polyfill-intl-idn": "^1.10",
7734 "symfony/polyfill-mbstring": "^1.0"
7735 },
7736 "require-dev": {
7737 "mockery/mockery": "~0.9.1",
7738 "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
7739 },
7740 "suggest": {
7741 "ext-intl": "Needed to support internationalized email addresses",
7742 "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed"
7743 },
7744 "type": "library",
7745 "extra": {
7746 "branch-alias": {
7747 "dev-master": "6.2-dev"
7748 }
7749 },
7750 "autoload": {
7751 "files": [
7752 "lib/swift_required.php"
7753 ]
7754 },
7755 "notification-url": "https://packagist.org/downloads/",
7756 "license": [
7757 "MIT"
7758 ],
7759 "authors": [
7760 {
7761 "name": "Chris Corbyn"
7762 },
7763 {
7764 "name": "Fabien Potencier",
7765 "email": "fabien@symfony.com"
7766 }
7767 ],
7768 "description": "Swiftmailer, free feature-rich PHP mailer",
7769 "homepage": "https://swiftmailer.symfony.com",
7770 "keywords": [
7771 "email",
7772 "mail",
7773 "mailer"
7774 ],
7775 "time": "2019-04-21T09:21:45+00:00"
7776 },
7777 {
7778 "name": "symfony/monolog-bundle",
7779 "version": "v3.3.1",
7780 "source": {
7781 "type": "git",
7782 "url": "https://github.com/symfony/monolog-bundle.git",
7783 "reference": "572e143afc03419a75ab002c80a2fd99299195ff"
7784 },
7785 "dist": {
7786 "type": "zip",
7787 "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/572e143afc03419a75ab002c80a2fd99299195ff",
7788 "reference": "572e143afc03419a75ab002c80a2fd99299195ff",
7789 "shasum": ""
7790 },
7791 "require": {
7792 "monolog/monolog": "~1.22",
7793 "php": ">=5.6",
7794 "symfony/config": "~2.7|~3.3|~4.0",
7795 "symfony/dependency-injection": "~2.7|~3.4.10|^4.0.10",
7796 "symfony/http-kernel": "~2.7|~3.3|~4.0",
7797 "symfony/monolog-bridge": "~2.7|~3.3|~4.0"
7798 },
7799 "require-dev": {
7800 "symfony/console": "~2.7|~3.3|~4.0",
7801 "symfony/phpunit-bridge": "^3.3|^4.0",
7802 "symfony/yaml": "~2.7|~3.3|~4.0"
7803 },
7804 "type": "symfony-bundle",
7805 "extra": {
7806 "branch-alias": {
7807 "dev-master": "3.x-dev"
7808 }
7809 },
7810 "autoload": {
7811 "psr-4": {
7812 "Symfony\\Bundle\\MonologBundle\\": ""
7813 },
7814 "exclude-from-classmap": [
7815 "/Tests/"
7816 ]
7817 },
7818 "notification-url": "https://packagist.org/downloads/",
7819 "license": [
7820 "MIT"
7821 ],
7822 "authors": [
7823 {
7824 "name": "Symfony Community",
7825 "homepage": "http://symfony.com/contributors"
7826 },
7827 {
7828 "name": "Fabien Potencier",
7829 "email": "fabien@symfony.com"
7830 }
7831 ],
7832 "description": "Symfony MonologBundle",
7833 "homepage": "http://symfony.com",
7834 "keywords": [
7835 "log",
7836 "logging"
7837 ],
7838 "time": "2018-11-04T09:58:13+00:00"
7839 },
7840 {
7841 "name": "symfony/polyfill-apcu",
7842 "version": "v1.11.0",
7843 "source": {
7844 "type": "git",
7845 "url": "https://github.com/symfony/polyfill-apcu.git",
7846 "reference": "a502face1da6a53289480166f24de2c3c68e5c3c"
7847 },
7848 "dist": {
7849 "type": "zip",
7850 "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/a502face1da6a53289480166f24de2c3c68e5c3c",
7851 "reference": "a502face1da6a53289480166f24de2c3c68e5c3c",
7852 "shasum": ""
7853 },
7854 "require": {
7855 "php": ">=5.3.3"
7856 },
7857 "type": "library",
7858 "extra": {
7859 "branch-alias": {
7860 "dev-master": "1.11-dev"
7861 }
7862 },
7863 "autoload": {
7864 "psr-4": {
7865 "Symfony\\Polyfill\\Apcu\\": ""
7866 },
7867 "files": [
7868 "bootstrap.php"
7869 ]
7870 },
7871 "notification-url": "https://packagist.org/downloads/",
7872 "license": [
7873 "MIT"
7874 ],
7875 "authors": [
7876 {
7877 "name": "Nicolas Grekas",
7878 "email": "p@tchwork.com"
7879 },
7880 {
7881 "name": "Symfony Community",
7882 "homepage": "https://symfony.com/contributors"
7883 }
7884 ],
7885 "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions",
7886 "homepage": "https://symfony.com",
7887 "keywords": [
7888 "apcu",
7889 "compatibility",
7890 "polyfill",
7891 "portable",
7892 "shim"
7893 ],
7894 "time": "2019-02-06T07:57:58+00:00"
7895 },
7896 {
7897 "name": "symfony/polyfill-ctype",
7898 "version": "v1.11.0",
7899 "source": {
7900 "type": "git",
7901 "url": "https://github.com/symfony/polyfill-ctype.git",
7902 "reference": "82ebae02209c21113908c229e9883c419720738a"
7903 },
7904 "dist": {
7905 "type": "zip",
7906 "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a",
7907 "reference": "82ebae02209c21113908c229e9883c419720738a",
7908 "shasum": ""
7909 },
7910 "require": {
7911 "php": ">=5.3.3"
7912 },
7913 "suggest": {
7914 "ext-ctype": "For best performance"
7915 },
7916 "type": "library",
7917 "extra": {
7918 "branch-alias": {
7919 "dev-master": "1.11-dev"
7920 }
7921 },
7922 "autoload": {
7923 "psr-4": {
7924 "Symfony\\Polyfill\\Ctype\\": ""
7925 },
7926 "files": [
7927 "bootstrap.php"
7928 ]
7929 },
7930 "notification-url": "https://packagist.org/downloads/",
7931 "license": [
7932 "MIT"
7933 ],
7934 "authors": [
7935 {
7936 "name": "Symfony Community",
7937 "homepage": "https://symfony.com/contributors"
7938 },
7939 {
7940 "name": "Gert de Pagter",
7941 "email": "backendtea@gmail.com"
7942 }
7943 ],
7944 "description": "Symfony polyfill for ctype functions",
7945 "homepage": "https://symfony.com",
7946 "keywords": [
7947 "compatibility",
7948 "ctype",
7949 "polyfill",
7950 "portable"
7951 ],
7952 "time": "2019-02-06T07:57:58+00:00"
7953 },
7954 {
7955 "name": "symfony/polyfill-iconv",
7956 "version": "v1.11.0",
7957 "source": {
7958 "type": "git",
7959 "url": "https://github.com/symfony/polyfill-iconv.git",
7960 "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7"
7961 },
7962 "dist": {
7963 "type": "zip",
7964 "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f037ea22acfaee983e271dd9c3b8bb4150bd8ad7",
7965 "reference": "f037ea22acfaee983e271dd9c3b8bb4150bd8ad7",
7966 "shasum": ""
7967 },
7968 "require": {
7969 "php": ">=5.3.3"
7970 },
7971 "suggest": {
7972 "ext-iconv": "For best performance"
7973 },
7974 "type": "library",
7975 "extra": {
7976 "branch-alias": {
7977 "dev-master": "1.11-dev"
7978 }
7979 },
7980 "autoload": {
7981 "psr-4": {
7982 "Symfony\\Polyfill\\Iconv\\": ""
7983 },
7984 "files": [
7985 "bootstrap.php"
7986 ]
7987 },
7988 "notification-url": "https://packagist.org/downloads/",
7989 "license": [
7990 "MIT"
7991 ],
7992 "authors": [
7993 {
7994 "name": "Nicolas Grekas",
7995 "email": "p@tchwork.com"
7996 },
7997 {
7998 "name": "Symfony Community",
7999 "homepage": "https://symfony.com/contributors"
8000 }
8001 ],
8002 "description": "Symfony polyfill for the Iconv extension",
8003 "homepage": "https://symfony.com",
8004 "keywords": [
8005 "compatibility",
8006 "iconv",
8007 "polyfill",
8008 "portable",
8009 "shim"
8010 ],
8011 "time": "2019-02-06T07:57:58+00:00"
8012 },
8013 {
8014 "name": "symfony/polyfill-intl-icu",
8015 "version": "v1.11.0",
8016 "source": {
8017 "type": "git",
8018 "url": "https://github.com/symfony/polyfill-intl-icu.git",
8019 "reference": "999878a3a09d73cae157b0cf89bb6fb2cc073057"
8020 },
8021 "dist": {
8022 "type": "zip",
8023 "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/999878a3a09d73cae157b0cf89bb6fb2cc073057",
8024 "reference": "999878a3a09d73cae157b0cf89bb6fb2cc073057",
8025 "shasum": ""
8026 },
8027 "require": {
8028 "php": ">=5.3.3",
8029 "symfony/intl": "~2.3|~3.0|~4.0"
8030 },
8031 "suggest": {
8032 "ext-intl": "For best performance"
8033 },
8034 "type": "library",
8035 "extra": {
8036 "branch-alias": {
8037 "dev-master": "1.9-dev"
8038 }
8039 },
8040 "autoload": {
8041 "files": [
8042 "bootstrap.php"
8043 ]
8044 },
8045 "notification-url": "https://packagist.org/downloads/",
8046 "license": [
8047 "MIT"
8048 ],
8049 "authors": [
8050 {
8051 "name": "Nicolas Grekas",
8052 "email": "p@tchwork.com"
8053 },
8054 {
8055 "name": "Symfony Community",
8056 "homepage": "https://symfony.com/contributors"
8057 }
8058 ],
8059 "description": "Symfony polyfill for intl's ICU-related data and classes",
8060 "homepage": "https://symfony.com",
8061 "keywords": [
8062 "compatibility",
8063 "icu",
8064 "intl",
8065 "polyfill",
8066 "portable",
8067 "shim"
8068 ],
8069 "time": "2019-01-07T19:39:47+00:00"
8070 },
8071 {
8072 "name": "symfony/polyfill-intl-idn",
8073 "version": "v1.11.0",
8074 "source": {
8075 "type": "git",
8076 "url": "https://github.com/symfony/polyfill-intl-idn.git",
8077 "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af"
8078 },
8079 "dist": {
8080 "type": "zip",
8081 "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af",
8082 "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af",
8083 "shasum": ""
8084 },
8085 "require": {
8086 "php": ">=5.3.3",
8087 "symfony/polyfill-mbstring": "^1.3",
8088 "symfony/polyfill-php72": "^1.9"
8089 },
8090 "suggest": {
8091 "ext-intl": "For best performance"
8092 },
8093 "type": "library",
8094 "extra": {
8095 "branch-alias": {
8096 "dev-master": "1.9-dev"
8097 }
8098 },
8099 "autoload": {
8100 "psr-4": {
8101 "Symfony\\Polyfill\\Intl\\Idn\\": ""
8102 },
8103 "files": [
8104 "bootstrap.php"
8105 ]
8106 },
8107 "notification-url": "https://packagist.org/downloads/",
8108 "license": [
8109 "MIT"
8110 ],
8111 "authors": [
8112 {
8113 "name": "Symfony Community",
8114 "homepage": "https://symfony.com/contributors"
8115 },
8116 {
8117 "name": "Laurent Bassin",
8118 "email": "laurent@bassin.info"
8119 }
8120 ],
8121 "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
8122 "homepage": "https://symfony.com",
8123 "keywords": [
8124 "compatibility",
8125 "idn",
8126 "intl",
8127 "polyfill",
8128 "portable",
8129 "shim"
8130 ],
8131 "time": "2019-03-04T13:44:35+00:00"
8132 },
8133 {
8134 "name": "symfony/polyfill-mbstring",
8135 "version": "v1.11.0",
8136 "source": {
8137 "type": "git",
8138 "url": "https://github.com/symfony/polyfill-mbstring.git",
8139 "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
8140 },
8141 "dist": {
8142 "type": "zip",
8143 "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609",
8144 "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
8145 "shasum": ""
8146 },
8147 "require": {
8148 "php": ">=5.3.3"
8149 },
8150 "suggest": {
8151 "ext-mbstring": "For best performance"
8152 },
8153 "type": "library",
8154 "extra": {
8155 "branch-alias": {
8156 "dev-master": "1.11-dev"
8157 }
8158 },
8159 "autoload": {
8160 "psr-4": {
8161 "Symfony\\Polyfill\\Mbstring\\": ""
8162 },
8163 "files": [
8164 "bootstrap.php"
8165 ]
8166 },
8167 "notification-url": "https://packagist.org/downloads/",
8168 "license": [
8169 "MIT"
8170 ],
8171 "authors": [
8172 {
8173 "name": "Nicolas Grekas",
8174 "email": "p@tchwork.com"
8175 },
8176 {
8177 "name": "Symfony Community",
8178 "homepage": "https://symfony.com/contributors"
8179 }
8180 ],
8181 "description": "Symfony polyfill for the Mbstring extension",
8182 "homepage": "https://symfony.com",
8183 "keywords": [
8184 "compatibility",
8185 "mbstring",
8186 "polyfill",
8187 "portable",
8188 "shim"
8189 ],
8190 "time": "2019-02-06T07:57:58+00:00"
8191 },
8192 {
8193 "name": "symfony/polyfill-php56",
8194 "version": "v1.11.0",
8195 "source": {
8196 "type": "git",
8197 "url": "https://github.com/symfony/polyfill-php56.git",
8198 "reference": "f4dddbc5c3471e1b700a147a20ae17cdb72dbe42"
8199 },
8200 "dist": {
8201 "type": "zip",
8202 "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/f4dddbc5c3471e1b700a147a20ae17cdb72dbe42",
8203 "reference": "f4dddbc5c3471e1b700a147a20ae17cdb72dbe42",
8204 "shasum": ""
8205 },
8206 "require": {
8207 "php": ">=5.3.3",
8208 "symfony/polyfill-util": "~1.0"
8209 },
8210 "type": "library",
8211 "extra": {
8212 "branch-alias": {
8213 "dev-master": "1.11-dev"
8214 }
8215 },
8216 "autoload": {
8217 "psr-4": {
8218 "Symfony\\Polyfill\\Php56\\": ""
8219 },
8220 "files": [
8221 "bootstrap.php"
8222 ]
8223 },
8224 "notification-url": "https://packagist.org/downloads/",
8225 "license": [
8226 "MIT"
8227 ],
8228 "authors": [
8229 {
8230 "name": "Nicolas Grekas",
8231 "email": "p@tchwork.com"
8232 },
8233 {
8234 "name": "Symfony Community",
8235 "homepage": "https://symfony.com/contributors"
8236 }
8237 ],
8238 "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
8239 "homepage": "https://symfony.com",
8240 "keywords": [
8241 "compatibility",
8242 "polyfill",
8243 "portable",
8244 "shim"
8245 ],
8246 "time": "2019-02-06T07:57:58+00:00"
8247 },
8248 {
8249 "name": "symfony/polyfill-php70",
8250 "version": "v1.11.0",
8251 "source": {
8252 "type": "git",
8253 "url": "https://github.com/symfony/polyfill-php70.git",
8254 "reference": "bc4858fb611bda58719124ca079baff854149c89"
8255 },
8256 "dist": {
8257 "type": "zip",
8258 "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89",
8259 "reference": "bc4858fb611bda58719124ca079baff854149c89",
8260 "shasum": ""
8261 },
8262 "require": {
8263 "paragonie/random_compat": "~1.0|~2.0|~9.99",
8264 "php": ">=5.3.3"
8265 },
8266 "type": "library",
8267 "extra": {
8268 "branch-alias": {
8269 "dev-master": "1.11-dev"
8270 }
8271 },
8272 "autoload": {
8273 "psr-4": {
8274 "Symfony\\Polyfill\\Php70\\": ""
8275 },
8276 "files": [
8277 "bootstrap.php"
8278 ],
8279 "classmap": [
8280 "Resources/stubs"
8281 ]
8282 },
8283 "notification-url": "https://packagist.org/downloads/",
8284 "license": [
8285 "MIT"
8286 ],
8287 "authors": [
8288 {
8289 "name": "Nicolas Grekas",
8290 "email": "p@tchwork.com"
8291 },
8292 {
8293 "name": "Symfony Community",
8294 "homepage": "https://symfony.com/contributors"
8295 }
8296 ],
8297 "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
8298 "homepage": "https://symfony.com",
8299 "keywords": [
8300 "compatibility",
8301 "polyfill",
8302 "portable",
8303 "shim"
8304 ],
8305 "time": "2019-02-06T07:57:58+00:00"
8306 },
8307 {
8308 "name": "symfony/polyfill-php72",
8309 "version": "v1.11.0",
8310 "source": {
8311 "type": "git",
8312 "url": "https://github.com/symfony/polyfill-php72.git",
8313 "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c"
8314 },
8315 "dist": {
8316 "type": "zip",
8317 "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c",
8318 "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c",
8319 "shasum": ""
8320 },
8321 "require": {
8322 "php": ">=5.3.3"
8323 },
8324 "type": "library",
8325 "extra": {
8326 "branch-alias": {
8327 "dev-master": "1.11-dev"
8328 }
8329 },
8330 "autoload": {
8331 "psr-4": {
8332 "Symfony\\Polyfill\\Php72\\": ""
8333 },
8334 "files": [
8335 "bootstrap.php"
8336 ]
8337 },
8338 "notification-url": "https://packagist.org/downloads/",
8339 "license": [
8340 "MIT"
8341 ],
8342 "authors": [
8343 {
8344 "name": "Nicolas Grekas",
8345 "email": "p@tchwork.com"
8346 },
8347 {
8348 "name": "Symfony Community",
8349 "homepage": "https://symfony.com/contributors"
8350 }
8351 ],
8352 "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
8353 "homepage": "https://symfony.com",
8354 "keywords": [
8355 "compatibility",
8356 "polyfill",
8357 "portable",
8358 "shim"
8359 ],
8360 "time": "2019-02-06T07:57:58+00:00"
8361 },
8362 {
8363 "name": "symfony/polyfill-util",
8364 "version": "v1.11.0",
8365 "source": {
8366 "type": "git",
8367 "url": "https://github.com/symfony/polyfill-util.git",
8368 "reference": "b46c6cae28a3106735323f00a0c38eccf2328897"
8369 },
8370 "dist": {
8371 "type": "zip",
8372 "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/b46c6cae28a3106735323f00a0c38eccf2328897",
8373 "reference": "b46c6cae28a3106735323f00a0c38eccf2328897",
8374 "shasum": ""
8375 },
8376 "require": {
8377 "php": ">=5.3.3"
8378 },
8379 "type": "library",
8380 "extra": {
8381 "branch-alias": {
8382 "dev-master": "1.11-dev"
8383 }
8384 },
8385 "autoload": {
8386 "psr-4": {
8387 "Symfony\\Polyfill\\Util\\": ""
8388 }
8389 },
8390 "notification-url": "https://packagist.org/downloads/",
8391 "license": [
8392 "MIT"
8393 ],
8394 "authors": [
8395 {
8396 "name": "Nicolas Grekas",
8397 "email": "p@tchwork.com"
8398 },
8399 {
8400 "name": "Symfony Community",
8401 "homepage": "https://symfony.com/contributors"
8402 }
8403 ],
8404 "description": "Symfony utilities for portability of PHP codes",
8405 "homepage": "https://symfony.com",
8406 "keywords": [
8407 "compat",
8408 "compatibility",
8409 "polyfill",
8410 "shim"
8411 ],
8412 "time": "2019-02-08T14:16:39+00:00"
8413 },
8414 {
8415 "name": "symfony/swiftmailer-bundle",
8416 "version": "v3.2.6",
8417 "source": {
8418 "type": "git",
8419 "url": "https://github.com/symfony/swiftmailer-bundle.git",
8420 "reference": "7a83160b50a2479d37eb74ba71577380b9afe4f5"
8421 },
8422 "dist": {
8423 "type": "zip",
8424 "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/7a83160b50a2479d37eb74ba71577380b9afe4f5",
8425 "reference": "7a83160b50a2479d37eb74ba71577380b9afe4f5",
8426 "shasum": ""
8427 },
8428 "require": {
8429 "php": ">=7.0.0",
8430 "swiftmailer/swiftmailer": "^6.1.3",
8431 "symfony/config": "~2.8|~3.3|~4.0",
8432 "symfony/dependency-injection": "~2.7|~3.3|~4.0",
8433 "symfony/http-kernel": "~2.7|~3.3|~4.0"
8434 },
8435 "require-dev": {
8436 "symfony/console": "~2.7|~3.3|~4.0",
8437 "symfony/framework-bundle": "~2.7|~3.3|~4.0",
8438 "symfony/phpunit-bridge": "~3.3|~4.0",
8439 "symfony/yaml": "~2.7|~3.3|~4.0"
8440 },
8441 "suggest": {
8442 "psr/log": "Allows logging"
8443 },
8444 "type": "symfony-bundle",
8445 "extra": {
8446 "branch-alias": {
8447 "dev-master": "3.2-dev"
8448 }
8449 },
8450 "autoload": {
8451 "psr-4": {
8452 "Symfony\\Bundle\\SwiftmailerBundle\\": ""
8453 },
8454 "exclude-from-classmap": [
8455 "/Tests/"
8456 ]
8457 },
8458 "notification-url": "https://packagist.org/downloads/",
8459 "license": [
8460 "MIT"
8461 ],
8462 "authors": [
8463 {
8464 "name": "Symfony Community",
8465 "homepage": "http://symfony.com/contributors"
8466 },
8467 {
8468 "name": "Fabien Potencier",
8469 "email": "fabien@symfony.com"
8470 }
8471 ],
8472 "description": "Symfony SwiftmailerBundle",
8473 "homepage": "http://symfony.com",
8474 "time": "2019-04-18T15:52:54+00:00"
8475 },
8476 {
8477 "name": "symfony/symfony",
8478 "version": "v3.4.28",
8479 "source": {
8480 "type": "git",
8481 "url": "https://github.com/symfony/symfony.git",
8482 "reference": "5e05ffeb1c2e538127e5a33b419edb8b2904b99e"
8483 },
8484 "dist": {
8485 "type": "zip",
8486 "url": "https://api.github.com/repos/symfony/symfony/zipball/5e05ffeb1c2e538127e5a33b419edb8b2904b99e",
8487 "reference": "5e05ffeb1c2e538127e5a33b419edb8b2904b99e",
8488 "shasum": ""
8489 },
8490 "require": {
8491 "doctrine/common": "~2.4",
8492 "ext-xml": "*",
8493 "fig/link-util": "^1.0",
8494 "php": "^5.5.9|>=7.0.8",
8495 "psr/cache": "~1.0",
8496 "psr/container": "^1.0",
8497 "psr/link": "^1.0",
8498 "psr/log": "~1.0",
8499 "psr/simple-cache": "^1.0",
8500 "symfony/polyfill-apcu": "~1.1",
8501 "symfony/polyfill-ctype": "~1.8",
8502 "symfony/polyfill-intl-icu": "~1.0",
8503 "symfony/polyfill-mbstring": "~1.0",
8504 "symfony/polyfill-php56": "~1.0",
8505 "symfony/polyfill-php70": "~1.6",
8506 "twig/twig": "^1.40|^2.9"
8507 },
8508 "conflict": {
8509 "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2",
8510 "phpdocumentor/type-resolver": "<0.3.0",
8511 "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
8512 },
8513 "provide": {
8514 "psr/cache-implementation": "1.0",
8515 "psr/container-implementation": "1.0",
8516 "psr/log-implementation": "1.0",
8517 "psr/simple-cache-implementation": "1.0"
8518 },
8519 "replace": {
8520 "symfony/asset": "self.version",
8521 "symfony/browser-kit": "self.version",
8522 "symfony/cache": "self.version",
8523 "symfony/class-loader": "self.version",
8524 "symfony/config": "self.version",
8525 "symfony/console": "self.version",
8526 "symfony/css-selector": "self.version",
8527 "symfony/debug": "self.version",
8528 "symfony/debug-bundle": "self.version",
8529 "symfony/dependency-injection": "self.version",
8530 "symfony/doctrine-bridge": "self.version",
8531 "symfony/dom-crawler": "self.version",
8532 "symfony/dotenv": "self.version",
8533 "symfony/event-dispatcher": "self.version",
8534 "symfony/expression-language": "self.version",
8535 "symfony/filesystem": "self.version",
8536 "symfony/finder": "self.version",
8537 "symfony/form": "self.version",
8538 "symfony/framework-bundle": "self.version",
8539 "symfony/http-foundation": "self.version",
8540 "symfony/http-kernel": "self.version",
8541 "symfony/inflector": "self.version",
8542 "symfony/intl": "self.version",
8543 "symfony/ldap": "self.version",
8544 "symfony/lock": "self.version",
8545 "symfony/monolog-bridge": "self.version",
8546 "symfony/options-resolver": "self.version",
8547 "symfony/process": "self.version",
8548 "symfony/property-access": "self.version",
8549 "symfony/property-info": "self.version",
8550 "symfony/proxy-manager-bridge": "self.version",
8551 "symfony/routing": "self.version",
8552 "symfony/security": "self.version",
8553 "symfony/security-bundle": "self.version",
8554 "symfony/security-core": "self.version",
8555 "symfony/security-csrf": "self.version",
8556 "symfony/security-guard": "self.version",
8557 "symfony/security-http": "self.version",
8558 "symfony/serializer": "self.version",
8559 "symfony/stopwatch": "self.version",
8560 "symfony/templating": "self.version",
8561 "symfony/translation": "self.version",
8562 "symfony/twig-bridge": "self.version",
8563 "symfony/twig-bundle": "self.version",
8564 "symfony/validator": "self.version",
8565 "symfony/var-dumper": "self.version",
8566 "symfony/web-link": "self.version",
8567 "symfony/web-profiler-bundle": "self.version",
8568 "symfony/web-server-bundle": "self.version",
8569 "symfony/workflow": "self.version",
8570 "symfony/yaml": "self.version"
8571 },
8572 "require-dev": {
8573 "cache/integration-tests": "dev-master",
8574 "doctrine/annotations": "~1.0",
8575 "doctrine/cache": "~1.6",
8576 "doctrine/data-fixtures": "1.0.*",
8577 "doctrine/dbal": "~2.4",
8578 "doctrine/doctrine-bundle": "~1.4",
8579 "doctrine/orm": "~2.4,>=2.4.5",
8580 "egulias/email-validator": "~1.2,>=1.2.8|~2.0",
8581 "monolog/monolog": "~1.11",
8582 "ocramius/proxy-manager": "~0.4|~1.0|~2.0",
8583 "phpdocumentor/reflection-docblock": "^3.0|^4.0",
8584 "predis/predis": "~1.0",
8585 "symfony/phpunit-bridge": "~3.4|~4.0",
8586 "symfony/security-acl": "~2.8|~3.0"
8587 },
8588 "type": "library",
8589 "extra": {
8590 "branch-alias": {
8591 "dev-master": "3.4-dev"
8592 }
8593 },
8594 "autoload": {
8595 "psr-4": {
8596 "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/",
8597 "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/",
8598 "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/",
8599 "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/",
8600 "Symfony\\Bundle\\": "src/Symfony/Bundle/",
8601 "Symfony\\Component\\": "src/Symfony/Component/"
8602 },
8603 "classmap": [
8604 "src/Symfony/Component/Intl/Resources/stubs"
8605 ],
8606 "exclude-from-classmap": [
8607 "**/Tests/"
8608 ]
8609 },
8610 "notification-url": "https://packagist.org/downloads/",
8611 "license": [
8612 "MIT"
8613 ],
8614 "authors": [
8615 {
8616 "name": "Fabien Potencier",
8617 "email": "fabien@symfony.com"
8618 },
8619 {
8620 "name": "Symfony Community",
8621 "homepage": "https://symfony.com/contributors"
8622 }
8623 ],
8624 "description": "The Symfony PHP framework",
8625 "homepage": "https://symfony.com",
8626 "keywords": [
8627 "framework"
8628 ],
8629 "time": "2019-05-28T09:24:58+00:00"
8630 },
8631 {
8632 "name": "true/punycode",
8633 "version": "v2.1.1",
8634 "source": {
8635 "type": "git",
8636 "url": "https://github.com/true/php-punycode.git",
8637 "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e"
8638 },
8639 "dist": {
8640 "type": "zip",
8641 "url": "https://api.github.com/repos/true/php-punycode/zipball/a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
8642 "reference": "a4d0c11a36dd7f4e7cd7096076cab6d3378a071e",
8643 "shasum": ""
8644 },
8645 "require": {
8646 "php": ">=5.3.0",
8647 "symfony/polyfill-mbstring": "^1.3"
8648 },
8649 "require-dev": {
8650 "phpunit/phpunit": "~4.7",
8651 "squizlabs/php_codesniffer": "~2.0"
8652 },
8653 "type": "library",
8654 "autoload": {
8655 "psr-4": {
8656 "TrueBV\\": "src/"
8657 }
8658 },
8659 "notification-url": "https://packagist.org/downloads/",
8660 "license": [
8661 "MIT"
8662 ],
8663 "authors": [
8664 {
8665 "name": "Renan Gonçalves",
8666 "email": "renan.saddam@gmail.com"
8667 }
8668 ],
8669 "description": "A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)",
8670 "homepage": "https://github.com/true/php-punycode",
8671 "keywords": [
8672 "idna",
8673 "punycode"
8674 ],
8675 "time": "2016-11-16T10:37:54+00:00"
8676 },
8677 {
8678 "name": "twig/extensions",
8679 "version": "v1.5.4",
8680 "source": {
8681 "type": "git",
8682 "url": "https://github.com/twigphp/Twig-extensions.git",
8683 "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
8684 },
8685 "dist": {
8686 "type": "zip",
8687 "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
8688 "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
8689 "shasum": ""
8690 },
8691 "require": {
8692 "twig/twig": "^1.27|^2.0"
8693 },
8694 "require-dev": {
8695 "symfony/phpunit-bridge": "^3.4",
8696 "symfony/translation": "^2.7|^3.4"
8697 },
8698 "suggest": {
8699 "symfony/translation": "Allow the time_diff output to be translated"
8700 },
8701 "type": "library",
8702 "extra": {
8703 "branch-alias": {
8704 "dev-master": "1.5-dev"
8705 }
8706 },
8707 "autoload": {
8708 "psr-0": {
8709 "Twig_Extensions_": "lib/"
8710 },
8711 "psr-4": {
8712 "Twig\\Extensions\\": "src/"
8713 }
8714 },
8715 "notification-url": "https://packagist.org/downloads/",
8716 "license": [
8717 "MIT"
8718 ],
8719 "authors": [
8720 {
8721 "name": "Fabien Potencier",
8722 "email": "fabien@symfony.com"
8723 }
8724 ],
8725 "description": "Common additional features for Twig that do not directly belong in core",
8726 "keywords": [
8727 "i18n",
8728 "text"
8729 ],
8730 "time": "2018-12-05T18:34:18+00:00"
8731 },
8732 {
8733 "name": "twig/twig",
8734 "version": "v1.42.1",
8735 "source": {
8736 "type": "git",
8737 "url": "https://github.com/twigphp/Twig.git",
8738 "reference": "671347603760a88b1e7288aaa9378f33687d7edf"
8739 },
8740 "dist": {
8741 "type": "zip",
8742 "url": "https://api.github.com/repos/twigphp/Twig/zipball/671347603760a88b1e7288aaa9378f33687d7edf",
8743 "reference": "671347603760a88b1e7288aaa9378f33687d7edf",
8744 "shasum": ""
8745 },
8746 "require": {
8747 "php": ">=5.4.0",
8748 "symfony/polyfill-ctype": "^1.8"
8749 },
8750 "require-dev": {
8751 "psr/container": "^1.0",
8752 "symfony/debug": "^2.7",
8753 "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0"
8754 },
8755 "type": "library",
8756 "extra": {
8757 "branch-alias": {
8758 "dev-master": "1.42-dev"
8759 }
8760 },
8761 "autoload": {
8762 "psr-0": {
8763 "Twig_": "lib/"
8764 },
8765 "psr-4": {
8766 "Twig\\": "src/"
8767 }
8768 },
8769 "notification-url": "https://packagist.org/downloads/",
8770 "license": [
8771 "BSD-3-Clause"
8772 ],
8773 "authors": [
8774 {
8775 "name": "Fabien Potencier",
8776 "email": "fabien@symfony.com",
8777 "homepage": "http://fabien.potencier.org",
8778 "role": "Lead Developer"
8779 },
8780 {
8781 "name": "Armin Ronacher",
8782 "email": "armin.ronacher@active-4.com",
8783 "role": "Project Founder"
8784 },
8785 {
8786 "name": "Twig Team",
8787 "homepage": "https://twig.symfony.com/contributors",
8788 "role": "Contributors"
8789 }
8790 ],
8791 "description": "Twig, the flexible, fast, and secure template language for PHP",
8792 "homepage": "https://twig.symfony.com",
8793 "keywords": [
8794 "templating"
8795 ],
8796 "time": "2019-06-04T11:31:08+00:00"
8797 },
8798 {
8799 "name": "wallabag/php-mobi",
8800 "version": "1.0.1",
8801 "source": {
8802 "type": "git",
8803 "url": "https://github.com/wallabag/php-mobi.git",
8804 "reference": "1cd7d022fe6be838535d6bba917d19cc48dcf487"
8805 },
8806 "dist": {
8807 "type": "zip",
8808 "url": "https://api.github.com/repos/wallabag/php-mobi/zipball/1cd7d022fe6be838535d6bba917d19cc48dcf487",
8809 "reference": "1cd7d022fe6be838535d6bba917d19cc48dcf487",
8810 "shasum": ""
8811 },
8812 "require": {
8813 "php": ">=5.3.0"
8814 },
8815 "replace": {
8816 "wallabag/phpmobi": "*"
8817 },
8818 "type": "library",
8819 "autoload": {
8820 "files": [
8821 "MOBIClass/MOBI.php"
8822 ]
8823 },
8824 "notification-url": "https://packagist.org/downloads/",
8825 "license": [
8826 "Apache-2.0"
8827 ],
8828 "authors": [
8829 {
8830 "name": "Nicolas Lœuillet",
8831 "email": "nicolas@loeuillet.org",
8832 "homepage": "http://www.cdetc.fr"
8833 },
8834 {
8835 "name": "Sander Kromwijk",
8836 "email": "s.kromwijk@gmail.co",
8837 "role": "Original developer"
8838 }
8839 ],
8840 "description": "A Mobipocket file (.mobi) creator in PHP.",
8841 "homepage": "https://github.com/wallabag/phpMobi",
8842 "time": "2015-10-16T08:42:42+00:00"
8843 },
8844 {
8845 "name": "wallabag/tcpdf",
8846 "version": "6.2.26",
8847 "source": {
8848 "type": "git",
8849 "url": "https://github.com/wallabag/TCPDF.git",
8850 "reference": "bf590f0604bcef1ae6fa3145649cf997f3564477"
8851 },
8852 "dist": {
8853 "type": "zip",
8854 "url": "https://api.github.com/repos/wallabag/TCPDF/zipball/bf590f0604bcef1ae6fa3145649cf997f3564477",
8855 "reference": "bf590f0604bcef1ae6fa3145649cf997f3564477",
8856 "shasum": ""
8857 },
8858 "require": {
8859 "php": ">=5.3.0"
8860 },
8861 "replace": {
8862 "tecnickcom/tcpdf": "6.2.*"
8863 },
8864 "type": "library",
8865 "autoload": {
8866 "classmap": [
8867 "fonts",
8868 "config",
8869 "include",
8870 "tcpdf.php",
8871 "tcpdf_parser.php",
8872 "tcpdf_import.php",
8873 "tcpdf_barcodes_1d.php",
8874 "tcpdf_barcodes_2d.php",
8875 "include/tcpdf_colors.php",
8876 "include/tcpdf_filters.php",
8877 "include/tcpdf_font_data.php",
8878 "include/tcpdf_fonts.php",
8879 "include/tcpdf_images.php",
8880 "include/tcpdf_static.php",
8881 "include/barcodes/datamatrix.php",
8882 "include/barcodes/pdf417.php",
8883 "include/barcodes/qrcode.php"
8884 ]
8885 },
8886 "notification-url": "https://packagist.org/downloads/",
8887 "license": [
8888 "LGPL-3.0"
8889 ],
8890 "authors": [
8891 {
8892 "name": "Nicola Asuni",
8893 "email": "info@tecnick.com",
8894 "homepage": "http://nicolaasuni.tecnick.com",
8895 "role": "Main developer"
8896 },
8897 {
8898 "name": "wallabag/core",
8899 "homepage": "https://www.wallabag.org",
8900 "role": "Developers"
8901 }
8902 ],
8903 "description": "Keeping a working 6.2.x TCPDF version.",
8904 "homepage": "https://www.wallabag.org/",
8905 "keywords": [
8906 "PDFD32000-2008",
8907 "TCPDF",
8908 "barcodes",
8909 "datamatrix",
8910 "pdf",
8911 "pdf417",
8912 "qrcode"
8913 ],
8914 "time": "2018-10-25T06:56:14+00:00"
8915 },
8916 {
8917 "name": "white-october/pagerfanta-bundle",
8918 "version": "v1.2.4",
8919 "source": {
8920 "type": "git",
8921 "url": "https://github.com/whiteoctober/WhiteOctoberPagerfantaBundle.git",
8922 "reference": "19bf14bf8c72e4205c9ca97028436701fe3991a6"
8923 },
8924 "dist": {
8925 "type": "zip",
8926 "url": "https://api.github.com/repos/whiteoctober/WhiteOctoberPagerfantaBundle/zipball/19bf14bf8c72e4205c9ca97028436701fe3991a6",
8927 "reference": "19bf14bf8c72e4205c9ca97028436701fe3991a6",
8928 "shasum": ""
8929 },
8930 "require": {
8931 "pagerfanta/pagerfanta": "^1.1.0|^2.0.0",
8932 "php": ">=5.3",
8933 "symfony/framework-bundle": "~2.3|~3.0|~4.0",
8934 "symfony/property-access": "~2.3|~3.0|~4.0",
8935 "symfony/translation": "~2.3|~3.0|~4.0",
8936 "symfony/twig-bundle": "~2.3|~3.0|~4.0"
8937 },
8938 "require-dev": {
8939 "phpunit/phpunit": "~3.7|~4.0|^5.0",
8940 "symfony/symfony": "~2.3|~3.0|~4.0"
8941 },
8942 "type": "symfony-bundle",
8943 "extra": {
8944 "branch-alias": {
8945 "dev-master": "1.0.x-dev"
8946 }
8947 },
8948 "autoload": {
8949 "psr-4": {
8950 "WhiteOctober\\PagerfantaBundle\\": ""
8951 },
8952 "exclude-from-classmap": [
8953 "Tests/",
8954 "TestsProject/"
8955 ]
8956 },
8957 "notification-url": "https://packagist.org/downloads/",
8958 "license": [
8959 "MIT"
8960 ],
8961 "authors": [
8962 {
8963 "name": "Pablo Díez",
8964 "email": "pablodip@gmail.com"
8965 }
8966 ],
8967 "description": "Bundle to use Pagerfanta with Symfony2",
8968 "keywords": [
8969 "page",
8970 "paging"
8971 ],
8972 "time": "2019-02-14T08:42:52+00:00"
8973 },
8974 {
8975 "name": "willdurand/hateoas",
8976 "version": "2.12.0",
8977 "source": {
8978 "type": "git",
8979 "url": "https://github.com/willdurand/Hateoas.git",
8980 "reference": "71b1af62b398dc9a870ac0b16c84bdc23a76a5c5"
8981 },
8982 "dist": {
8983 "type": "zip",
8984 "url": "https://api.github.com/repos/willdurand/Hateoas/zipball/71b1af62b398dc9a870ac0b16c84bdc23a76a5c5",
8985 "reference": "71b1af62b398dc9a870ac0b16c84bdc23a76a5c5",
8986 "shasum": ""
8987 },
8988 "require": {
8989 "doctrine/annotations": "~1.0",
8990 "doctrine/common": "~2.0",
8991 "jms/metadata": "~1.1",
8992 "jms/serializer": "^1.7",
8993 "php": "^5.5|^7.0",
8994 "phpoption/phpoption": ">=1.1.0,<2.0-dev",
8995 "symfony/expression-language": "~2.4 || ~3.0 || ~4.0"
8996 },
8997 "require-dev": {
8998 "pagerfanta/pagerfanta": "~1.0",
8999 "phpunit/phpunit": "~5",
9000 "symfony/dependency-injection": "~2.4 || ~3.0 || ~4.0",
9001 "symfony/routing": "~2.4 || ~3.0 || ~4.0",
9002 "symfony/yaml": "~2.4 || ~3.0 || ~4.0",
9003 "twig/twig": "~1.12"
9004 },
9005 "suggest": {
9006 "symfony/routing": "To use the SymfonyRouteFactory.",
9007 "symfony/yaml": "To use yaml based configuration.",
9008 "twig/twig": "To use the Twig extensions."
9009 },
9010 "type": "library",
9011 "extra": {
9012 "branch-alias": {
9013 "dev-master": "2.12-dev"
9014 }
9015 },
9016 "autoload": {
9017 "psr-0": {
9018 "Hateoas": "src/"
9019 }
9020 },
9021 "notification-url": "https://packagist.org/downloads/",
9022 "license": [
9023 "MIT"
9024 ],
9025 "authors": [
9026 {
9027 "name": "Adrien Brault",
9028 "email": "adrien.brault@gmail.com"
9029 },
9030 {
9031 "name": "William Durand",
9032 "email": "william.durand1@gmail.com"
9033 }
9034 ],
9035 "description": "A PHP library to support implementing representations for HATEOAS REST web services",
9036 "time": "2018-02-23T17:05:31+00:00"
9037 },
9038 {
9039 "name": "willdurand/hateoas-bundle",
9040 "version": "1.4.0",
9041 "source": {
9042 "type": "git",
9043 "url": "https://github.com/willdurand/BazingaHateoasBundle.git",
9044 "reference": "d1f915fd4f8a7cd43a88a0ce97ffb28abe3a94fa"
9045 },
9046 "dist": {
9047 "type": "zip",
9048 "url": "https://api.github.com/repos/willdurand/BazingaHateoasBundle/zipball/d1f915fd4f8a7cd43a88a0ce97ffb28abe3a94fa",
9049 "reference": "d1f915fd4f8a7cd43a88a0ce97ffb28abe3a94fa",
9050 "shasum": ""
9051 },
9052 "require": {
9053 "jms/serializer-bundle": "~1.0 || ^2.0",
9054 "php": ">5.4 |^7.0",
9055 "symfony/framework-bundle": "~2.3 || ~3.0 || ~4.0",
9056 "willdurand/hateoas": "^2.10.0"
9057 },
9058 "require-dev": {
9059 "phpunit/phpunit": "~4.5 || ~5.0",
9060 "symfony/expression-language": "~2.4 || ~3.0 || ~4.0",
9061 "symfony/stopwatch": "~2.4 || ~3.0 || ~4.0",
9062 "twig/twig": "~1.12"
9063 },
9064 "type": "symfony-bundle",
9065 "extra": {
9066 "branch-alias": {
9067 "dev-master": "1.4-dev"
9068 }
9069 },
9070 "autoload": {
9071 "psr-4": {
9072 "Bazinga\\Bundle\\HateoasBundle\\": ""
9073 }
9074 },
9075 "notification-url": "https://packagist.org/downloads/",
9076 "license": [
9077 "MIT"
9078 ],
9079 "authors": [
9080 {
9081 "name": "William Durand",
9082 "email": "william.durand1@gmail.com"
9083 }
9084 ],
9085 "description": "Integration of Hateoas into Symfony2.",
9086 "keywords": [
9087 "HATEOAS",
9088 "rest"
9089 ],
9090 "time": "2018-01-27T13:03:07+00:00"
9091 },
9092 {
9093 "name": "willdurand/jsonp-callback-validator",
9094 "version": "v1.1.0",
9095 "source": {
9096 "type": "git",
9097 "url": "https://github.com/willdurand/JsonpCallbackValidator.git",
9098 "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909"
9099 },
9100 "dist": {
9101 "type": "zip",
9102 "url": "https://api.github.com/repos/willdurand/JsonpCallbackValidator/zipball/1a7d388bb521959e612ef50c5c7b1691b097e909",
9103 "reference": "1a7d388bb521959e612ef50c5c7b1691b097e909",
9104 "shasum": ""
9105 },
9106 "require": {
9107 "php": ">=5.3.0"
9108 },
9109 "require-dev": {
9110 "phpunit/phpunit": "~3.7"
9111 },
9112 "type": "library",
9113 "autoload": {
9114 "psr-0": {
9115 "JsonpCallbackValidator": "src/"
9116 }
9117 },
9118 "notification-url": "https://packagist.org/downloads/",
9119 "license": [
9120 "MIT"
9121 ],
9122 "authors": [
9123 {
9124 "name": "William Durand",
9125 "email": "william.durand1@gmail.com",
9126 "homepage": "http://www.willdurand.fr"
9127 }
9128 ],
9129 "description": "JSONP callback validator.",
9130 "time": "2014-01-20T22:35:06+00:00"
9131 },
9132 {
9133 "name": "willdurand/negotiation",
9134 "version": "v2.3.1",
9135 "source": {
9136 "type": "git",
9137 "url": "https://github.com/willdurand/Negotiation.git",
9138 "reference": "03436ededa67c6e83b9b12defac15384cb399dc9"
9139 },
9140 "dist": {
9141 "type": "zip",
9142 "url": "https://api.github.com/repos/willdurand/Negotiation/zipball/03436ededa67c6e83b9b12defac15384cb399dc9",
9143 "reference": "03436ededa67c6e83b9b12defac15384cb399dc9",
9144 "shasum": ""
9145 },
9146 "require": {
9147 "php": ">=5.4.0"
9148 },
9149 "require-dev": {
9150 "phpunit/phpunit": "~4.5"
9151 },
9152 "type": "library",
9153 "extra": {
9154 "branch-alias": {
9155 "dev-master": "2.3-dev"
9156 }
9157 },
9158 "autoload": {
9159 "psr-4": {
9160 "Negotiation\\": "src/Negotiation"
9161 }
9162 },
9163 "notification-url": "https://packagist.org/downloads/",
9164 "license": [
9165 "MIT"
9166 ],
9167 "authors": [
9168 {
9169 "name": "William Durand",
9170 "email": "will+git@drnd.me"
9171 }
9172 ],
9173 "description": "Content Negotiation tools for PHP provided as a standalone library.",
9174 "homepage": "http://williamdurand.fr/Negotiation/",
9175 "keywords": [
9176 "accept",
9177 "content",
9178 "format",
9179 "header",
9180 "negotiation"
9181 ],
9182 "time": "2017-05-14T17:21:12+00:00"
9183 },
9184 {
9185 "name": "zendframework/zend-code",
9186 "version": "3.3.1",
9187 "source": {
9188 "type": "git",
9189 "url": "https://github.com/zendframework/zend-code.git",
9190 "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb"
9191 },
9192 "dist": {
9193 "type": "zip",
9194 "url": "https://api.github.com/repos/zendframework/zend-code/zipball/c21db169075c6ec4b342149f446e7b7b724f95eb",
9195 "reference": "c21db169075c6ec4b342149f446e7b7b724f95eb",
9196 "shasum": ""
9197 },
9198 "require": {
9199 "php": "^7.1",
9200 "zendframework/zend-eventmanager": "^2.6 || ^3.0"
9201 },
9202 "require-dev": {
9203 "doctrine/annotations": "~1.0",
9204 "ext-phar": "*",
9205 "phpunit/phpunit": "^6.2.3",
9206 "zendframework/zend-coding-standard": "^1.0.0",
9207 "zendframework/zend-stdlib": "^2.7 || ^3.0"
9208 },
9209 "suggest": {
9210 "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
9211 "zendframework/zend-stdlib": "Zend\\Stdlib component"
9212 },
9213 "type": "library",
9214 "extra": {
9215 "branch-alias": {
9216 "dev-master": "3.3.x-dev",
9217 "dev-develop": "3.4.x-dev"
9218 }
9219 },
9220 "autoload": {
9221 "psr-4": {
9222 "Zend\\Code\\": "src/"
9223 }
9224 },
9225 "notification-url": "https://packagist.org/downloads/",
9226 "license": [
9227 "BSD-3-Clause"
9228 ],
9229 "description": "provides facilities to generate arbitrary code using an object oriented interface",
9230 "homepage": "https://github.com/zendframework/zend-code",
9231 "keywords": [
9232 "code",
9233 "zf2"
9234 ],
9235 "time": "2018-08-13T20:36:59+00:00"
9236 },
9237 {
9238 "name": "zendframework/zend-diactoros",
9239 "version": "2.1.2",
9240 "source": {
9241 "type": "git",
9242 "url": "https://github.com/zendframework/zend-diactoros.git",
9243 "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1"
9244 },
9245 "dist": {
9246 "type": "zip",
9247 "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/37bf68b428850ee26ed7c3be6c26236dd95a95f1",
9248 "reference": "37bf68b428850ee26ed7c3be6c26236dd95a95f1",
9249 "shasum": ""
9250 },
9251 "require": {
9252 "php": "^7.1",
9253 "psr/http-factory": "^1.0",
9254 "psr/http-message": "^1.0"
9255 },
9256 "provide": {
9257 "psr/http-factory-implementation": "1.0",
9258 "psr/http-message-implementation": "1.0"
9259 },
9260 "require-dev": {
9261 "ext-dom": "*",
9262 "ext-libxml": "*",
9263 "http-interop/http-factory-tests": "^0.5.0",
9264 "php-http/psr7-integration-tests": "dev-master",
9265 "phpunit/phpunit": "^7.0.2",
9266 "zendframework/zend-coding-standard": "~1.0.0"
9267 },
9268 "type": "library",
9269 "extra": {
9270 "branch-alias": {
9271 "dev-master": "2.1.x-dev",
9272 "dev-develop": "2.2.x-dev",
9273 "dev-release-1.8": "1.8.x-dev"
9274 }
9275 },
9276 "autoload": {
9277 "files": [
9278 "src/functions/create_uploaded_file.php",
9279 "src/functions/marshal_headers_from_sapi.php",
9280 "src/functions/marshal_method_from_sapi.php",
9281 "src/functions/marshal_protocol_version_from_sapi.php",
9282 "src/functions/marshal_uri_from_sapi.php",
9283 "src/functions/normalize_server.php",
9284 "src/functions/normalize_uploaded_files.php",
9285 "src/functions/parse_cookie_header.php"
9286 ],
9287 "psr-4": {
9288 "Zend\\Diactoros\\": "src/"
9289 }
9290 },
9291 "notification-url": "https://packagist.org/downloads/",
9292 "license": [
9293 "BSD-3-Clause"
9294 ],
9295 "description": "PSR HTTP Message implementations",
9296 "keywords": [
9297 "http",
9298 "psr",
9299 "psr-7"
9300 ],
9301 "time": "2019-04-29T21:11:00+00:00"
9302 },
9303 {
9304 "name": "zendframework/zend-eventmanager",
9305 "version": "3.2.1",
9306 "source": {
9307 "type": "git",
9308 "url": "https://github.com/zendframework/zend-eventmanager.git",
9309 "reference": "a5e2583a211f73604691586b8406ff7296a946dd"
9310 },
9311 "dist": {
9312 "type": "zip",
9313 "url": "https://api.github.com/repos/zendframework/zend-eventmanager/zipball/a5e2583a211f73604691586b8406ff7296a946dd",
9314 "reference": "a5e2583a211f73604691586b8406ff7296a946dd",
9315 "shasum": ""
9316 },
9317 "require": {
9318 "php": "^5.6 || ^7.0"
9319 },
9320 "require-dev": {
9321 "athletic/athletic": "^0.1",
9322 "container-interop/container-interop": "^1.1.0",
9323 "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1.2",
9324 "zendframework/zend-coding-standard": "~1.0.0",
9325 "zendframework/zend-stdlib": "^2.7.3 || ^3.0"
9326 },
9327 "suggest": {
9328 "container-interop/container-interop": "^1.1.0, to use the lazy listeners feature",
9329 "zendframework/zend-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature"
9330 },
9331 "type": "library",
9332 "extra": {
9333 "branch-alias": {
9334 "dev-master": "3.2-dev",
9335 "dev-develop": "3.3-dev"
9336 }
9337 },
9338 "autoload": {
9339 "psr-4": {
9340 "Zend\\EventManager\\": "src/"
9341 }
9342 },
9343 "notification-url": "https://packagist.org/downloads/",
9344 "license": [
9345 "BSD-3-Clause"
9346 ],
9347 "description": "Trigger and listen to events within a PHP application",
9348 "homepage": "https://github.com/zendframework/zend-eventmanager",
9349 "keywords": [
9350 "event",
9351 "eventmanager",
9352 "events",
9353 "zf2"
9354 ],
9355 "time": "2018-04-25T15:33:34+00:00"
9356 }
9357 ],
9358 "packages-dev": [
9359 {
9360 "name": "composer/semver",
9361 "version": "1.5.0",
9362 "source": {
9363 "type": "git",
9364 "url": "https://github.com/composer/semver.git",
9365 "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e"
9366 },
9367 "dist": {
9368 "type": "zip",
9369 "url": "https://api.github.com/repos/composer/semver/zipball/46d9139568ccb8d9e7cdd4539cab7347568a5e2e",
9370 "reference": "46d9139568ccb8d9e7cdd4539cab7347568a5e2e",
9371 "shasum": ""
9372 },
9373 "require": {
9374 "php": "^5.3.2 || ^7.0"
9375 },
9376 "require-dev": {
9377 "phpunit/phpunit": "^4.5 || ^5.0.5",
9378 "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
9379 },
9380 "type": "library",
9381 "extra": {
9382 "branch-alias": {
9383 "dev-master": "1.x-dev"
9384 }
9385 },
9386 "autoload": {
9387 "psr-4": {
9388 "Composer\\Semver\\": "src"
9389 }
9390 },
9391 "notification-url": "https://packagist.org/downloads/",
9392 "license": [
9393 "MIT"
9394 ],
9395 "authors": [
9396 {
9397 "name": "Nils Adermann",
9398 "email": "naderman@naderman.de",
9399 "homepage": "http://www.naderman.de"
9400 },
9401 {
9402 "name": "Jordi Boggiano",
9403 "email": "j.boggiano@seld.be",
9404 "homepage": "http://seld.be"
9405 },
9406 {
9407 "name": "Rob Bast",
9408 "email": "rob.bast@gmail.com",
9409 "homepage": "http://robbast.nl"
9410 }
9411 ],
9412 "description": "Semver library that offers utilities, version constraint parsing and validation.",
9413 "keywords": [
9414 "semantic",
9415 "semver",
9416 "validation",
9417 "versioning"
9418 ],
9419 "time": "2019-03-19T17:25:45+00:00"
9420 },
9421 {
9422 "name": "composer/xdebug-handler",
9423 "version": "1.3.3",
9424 "source": {
9425 "type": "git",
9426 "url": "https://github.com/composer/xdebug-handler.git",
9427 "reference": "46867cbf8ca9fb8d60c506895449eb799db1184f"
9428 },
9429 "dist": {
9430 "type": "zip",
9431 "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/46867cbf8ca9fb8d60c506895449eb799db1184f",
9432 "reference": "46867cbf8ca9fb8d60c506895449eb799db1184f",
9433 "shasum": ""
9434 },
9435 "require": {
9436 "php": "^5.3.2 || ^7.0",
9437 "psr/log": "^1.0"
9438 },
9439 "require-dev": {
9440 "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
9441 },
9442 "type": "library",
9443 "autoload": {
9444 "psr-4": {
9445 "Composer\\XdebugHandler\\": "src"
9446 }
9447 },
9448 "notification-url": "https://packagist.org/downloads/",
9449 "license": [
9450 "MIT"
9451 ],
9452 "authors": [
9453 {
9454 "name": "John Stevenson",
9455 "email": "john-stevenson@blueyonder.co.uk"
9456 }
9457 ],
9458 "description": "Restarts a process without xdebug.",
9459 "keywords": [
9460 "Xdebug",
9461 "performance"
9462 ],
9463 "time": "2019-05-27T17:52:04+00:00"
9464 },
9465 {
9466 "name": "dama/doctrine-test-bundle",
9467 "version": "v5.0.3",
9468 "source": {
9469 "type": "git",
9470 "url": "https://github.com/dmaicher/doctrine-test-bundle.git",
9471 "reference": "29882b0d1a815f4819126ef714931bb24a31cbaa"
9472 },
9473 "dist": {
9474 "type": "zip",
9475 "url": "https://api.github.com/repos/dmaicher/doctrine-test-bundle/zipball/29882b0d1a815f4819126ef714931bb24a31cbaa",
9476 "reference": "29882b0d1a815f4819126ef714931bb24a31cbaa",
9477 "shasum": ""
9478 },
9479 "require": {
9480 "doctrine/dbal": "~2.5",
9481 "doctrine/doctrine-bundle": "~1.4",
9482 "php": "^7.1",
9483 "symfony/framework-bundle": "~2.7|~3.0|~4.0"
9484 },
9485 "require-dev": {
9486 "phpunit/phpunit": "~6.0|~7.0|~8.0",
9487 "symfony/phpunit-bridge": "~2.8|~3.0|~4.0",
9488 "symfony/yaml": "~2.8|~3.0|~4.0"
9489 },
9490 "type": "symfony-bundle",
9491 "extra": {
9492 "branch-alias": {
9493 "dev-master": "5.1.x-dev"
9494 }
9495 },
9496 "autoload": {
9497 "psr-4": {
9498 "DAMA\\DoctrineTestBundle\\": "src/DAMA/DoctrineTestBundle"
9499 }
9500 },
9501 "notification-url": "https://packagist.org/downloads/",
9502 "license": [
9503 "MIT"
9504 ],
9505 "authors": [
9506 {
9507 "name": "David Maicher",
9508 "email": "mail@dmaicher.de"
9509 }
9510 ],
9511 "description": "Symfony bundle to isolate doctrine database tests and improve test performance",
9512 "keywords": [
9513 "Symfony 3",
9514 "Symfony 4",
9515 "doctrine",
9516 "isolation",
9517 "performance",
9518 "symfony",
9519 "symfony 2",
9520 "tests"
9521 ],
9522 "time": "2019-03-22T10:34:17+00:00"
9523 },
9524 {
9525 "name": "doctrine/data-fixtures",
9526 "version": "v1.3.1",
9527 "source": {
9528 "type": "git",
9529 "url": "https://github.com/doctrine/data-fixtures.git",
9530 "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a"
9531 },
9532 "dist": {
9533 "type": "zip",
9534 "url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a",
9535 "reference": "3a1e2c3c600e615a2dffe56d4ca0875cc5233e0a",
9536 "shasum": ""
9537 },
9538 "require": {
9539 "doctrine/common": "~2.2",
9540 "php": "^7.1"
9541 },
9542 "conflict": {
9543 "doctrine/phpcr-odm": "<1.3.0"
9544 },
9545 "require-dev": {
9546 "doctrine/dbal": "^2.5.4",
9547 "doctrine/orm": "^2.5.4",
9548 "phpunit/phpunit": "^7.0"
9549 },
9550 "suggest": {
9551 "alcaeus/mongo-php-adapter": "For using MongoDB ODM with PHP 7",
9552 "doctrine/mongodb-odm": "For loading MongoDB ODM fixtures",
9553 "doctrine/orm": "For loading ORM fixtures",
9554 "doctrine/phpcr-odm": "For loading PHPCR ODM fixtures"
9555 },
9556 "type": "library",
9557 "extra": {
9558 "branch-alias": {
9559 "dev-master": "1.3.x-dev"
9560 }
9561 },
9562 "autoload": {
9563 "psr-4": {
9564 "Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures"
9565 }
9566 },
9567 "notification-url": "https://packagist.org/downloads/",
9568 "license": [
9569 "MIT"
9570 ],
9571 "authors": [
9572 {
9573 "name": "Jonathan Wage",
9574 "email": "jonwage@gmail.com"
9575 }
9576 ],
9577 "description": "Data Fixtures for all Doctrine Object Managers",
9578 "homepage": "http://www.doctrine-project.org",
9579 "keywords": [
9580 "database"
9581 ],
9582 "time": "2018-03-20T09:06:36+00:00"
9583 },
9584 {
9585 "name": "doctrine/doctrine-fixtures-bundle",
9586 "version": "3.1.0",
9587 "source": {
9588 "type": "git",
9589 "url": "https://github.com/doctrine/DoctrineFixturesBundle.git",
9590 "reference": "f016565b251c2dfa32a8d6da44d1650dc9ec1498"
9591 },
9592 "dist": {
9593 "type": "zip",
9594 "url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/f016565b251c2dfa32a8d6da44d1650dc9ec1498",
9595 "reference": "f016565b251c2dfa32a8d6da44d1650dc9ec1498",
9596 "shasum": ""
9597 },
9598 "require": {
9599 "doctrine/data-fixtures": "^1.3",
9600 "doctrine/doctrine-bundle": "^1.6",
9601 "php": "^7.1",
9602 "symfony/doctrine-bridge": "~3.4|^4.1",
9603 "symfony/framework-bundle": "^3.4|^4.1"
9604 },
9605 "require-dev": {
9606 "doctrine/coding-standard": "^5.0",
9607 "phpunit/phpunit": "^7.4",
9608 "symfony/phpunit-bridge": "^4.1"
9609 },
9610 "type": "symfony-bundle",
9611 "extra": {
9612 "branch-alias": {
9613 "dev-master": "3.1.x-dev"
9614 }
9615 },
9616 "autoload": {
9617 "psr-4": {
9618 "Doctrine\\Bundle\\FixturesBundle\\": ""
9619 }
9620 },
9621 "notification-url": "https://packagist.org/downloads/",
9622 "license": [
9623 "MIT"
9624 ],
9625 "authors": [
9626 {
9627 "name": "Symfony Community",
9628 "homepage": "http://symfony.com/contributors"
9629 },
9630 {
9631 "name": "Doctrine Project",
9632 "homepage": "http://www.doctrine-project.org"
9633 },
9634 {
9635 "name": "Fabien Potencier",
9636 "email": "fabien@symfony.com"
9637 }
9638 ],
9639 "description": "Symfony DoctrineFixturesBundle",
9640 "homepage": "http://www.doctrine-project.org",
9641 "keywords": [
9642 "Fixture",
9643 "persistence"
9644 ],
9645 "time": "2018-12-21T10:10:51+00:00"
9646 },
9647 {
9648 "name": "friendsofphp/php-cs-fixer",
9649 "version": "v2.15.1",
9650 "source": {
9651 "type": "git",
9652 "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git",
9653 "reference": "20064511ab796593a3990669eff5f5b535001f7c"
9654 },
9655 "dist": {
9656 "type": "zip",
9657 "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/20064511ab796593a3990669eff5f5b535001f7c",
9658 "reference": "20064511ab796593a3990669eff5f5b535001f7c",
9659 "shasum": ""
9660 },
9661 "require": {
9662 "composer/semver": "^1.4",
9663 "composer/xdebug-handler": "^1.2",
9664 "doctrine/annotations": "^1.2",
9665 "ext-json": "*",
9666 "ext-tokenizer": "*",
9667 "php": "^5.6 || ^7.0",
9668 "php-cs-fixer/diff": "^1.3",
9669 "symfony/console": "^3.4.17 || ^4.1.6",
9670 "symfony/event-dispatcher": "^3.0 || ^4.0",
9671 "symfony/filesystem": "^3.0 || ^4.0",
9672 "symfony/finder": "^3.0 || ^4.0",
9673 "symfony/options-resolver": "^3.0 || ^4.0",
9674 "symfony/polyfill-php70": "^1.0",
9675 "symfony/polyfill-php72": "^1.4",
9676 "symfony/process": "^3.0 || ^4.0",
9677 "symfony/stopwatch": "^3.0 || ^4.0"
9678 },
9679 "require-dev": {
9680 "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0",
9681 "justinrainbow/json-schema": "^5.0",
9682 "keradus/cli-executor": "^1.2",
9683 "mikey179/vfsstream": "^1.6",
9684 "php-coveralls/php-coveralls": "^2.1",
9685 "php-cs-fixer/accessible-object": "^1.0",
9686 "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.1",
9687 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.1",
9688 "phpunit/phpunit": "^5.7.27 || ^6.5.8 || ^7.1",
9689 "phpunitgoodpractices/traits": "^1.8",
9690 "symfony/phpunit-bridge": "^4.3"
9691 },
9692 "suggest": {
9693 "ext-mbstring": "For handling non-UTF8 characters in cache signature.",
9694 "php-cs-fixer/phpunit-constraint-isidenticalstring": "For IsIdenticalString constraint.",
9695 "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "For XmlMatchesXsd constraint.",
9696 "symfony/polyfill-mbstring": "When enabling `ext-mbstring` is not possible."
9697 },
9698 "bin": [
9699 "php-cs-fixer"
9700 ],
9701 "type": "application",
9702 "autoload": {
9703 "psr-4": {
9704 "PhpCsFixer\\": "src/"
9705 },
9706 "classmap": [
9707 "tests/Test/AbstractFixerTestCase.php",
9708 "tests/Test/AbstractIntegrationCaseFactory.php",
9709 "tests/Test/AbstractIntegrationTestCase.php",
9710 "tests/Test/Assert/AssertTokensTrait.php",
9711 "tests/Test/IntegrationCase.php",
9712 "tests/Test/IntegrationCaseFactory.php",
9713 "tests/Test/IntegrationCaseFactoryInterface.php",
9714 "tests/Test/InternalIntegrationCaseFactory.php",
9715 "tests/TestCase.php"
9716 ]
9717 },
9718 "notification-url": "https://packagist.org/downloads/",
9719 "license": [
9720 "MIT"
9721 ],
9722 "authors": [
9723 {
9724 "name": "Dariusz Rumiński",
9725 "email": "dariusz.ruminski@gmail.com"
9726 },
9727 {
9728 "name": "Fabien Potencier",
9729 "email": "fabien@symfony.com"
9730 }
9731 ],
9732 "description": "A tool to automatically fix PHP code style",
9733 "time": "2019-06-01T10:32:12+00:00"
9734 },
9735 {
9736 "name": "m6web/redis-mock",
9737 "version": "v4.3.0",
9738 "source": {
9739 "type": "git",
9740 "url": "https://github.com/M6Web/RedisMock.git",
9741 "reference": "6d9351a4cde39c5f2e5589caea729b8bd2b12808"
9742 },
9743 "dist": {
9744 "type": "zip",
9745 "url": "https://api.github.com/repos/M6Web/RedisMock/zipball/6d9351a4cde39c5f2e5589caea729b8bd2b12808",
9746 "reference": "6d9351a4cde39c5f2e5589caea729b8bd2b12808",
9747 "shasum": ""
9748 },
9749 "require": {
9750 "php": ">=7.1.0"
9751 },
9752 "require-dev": {
9753 "atoum/atoum": "master-dev",
9754 "predis/predis": "~1.1"
9755 },
9756 "type": "library",
9757 "autoload": {
9758 "psr-0": {
9759 "M6Web\\Component\\RedisMock": "src/"
9760 }
9761 },
9762 "notification-url": "https://packagist.org/downloads/",
9763 "license": [
9764 "MIT"
9765 ],
9766 "authors": [
9767 {
9768 "name": "M6Web",
9769 "email": "opensource@m6web.fr",
9770 "homepage": "http://tech.m6web.fr/"
9771 }
9772 ],
9773 "description": "Library providing a PHP mock for Redis",
9774 "keywords": [
9775 "mock",
9776 "redis"
9777 ],
9778 "time": "2019-05-22T08:35:44+00:00"
9779 },
9780 {
9781 "name": "nette/bootstrap",
9782 "version": "v3.0.0",
9783 "source": {
9784 "type": "git",
9785 "url": "https://github.com/nette/bootstrap.git",
9786 "reference": "e1075af05c211915e03e0c86542f3ba5433df4a3"
9787 },
9788 "dist": {
9789 "type": "zip",
9790 "url": "https://api.github.com/repos/nette/bootstrap/zipball/e1075af05c211915e03e0c86542f3ba5433df4a3",
9791 "reference": "e1075af05c211915e03e0c86542f3ba5433df4a3",
9792 "shasum": ""
9793 },
9794 "require": {
9795 "nette/di": "^3.0",
9796 "nette/utils": "^3.0",
9797 "php": ">=7.1"
9798 },
9799 "require-dev": {
9800 "latte/latte": "^2.2",
9801 "nette/application": "^3.0",
9802 "nette/caching": "^3.0",
9803 "nette/database": "^3.0",
9804 "nette/forms": "^3.0",
9805 "nette/http": "^3.0",
9806 "nette/mail": "^3.0",
9807 "nette/robot-loader": "^3.0",
9808 "nette/safe-stream": "^2.2",
9809 "nette/security": "^3.0",
9810 "nette/tester": "^2.0",
9811 "tracy/tracy": "^2.6"
9812 },
9813 "suggest": {
9814 "nette/robot-loader": "to use Configurator::createRobotLoader()",
9815 "tracy/tracy": "to use Configurator::enableTracy()"
9816 },
9817 "type": "library",
9818 "extra": {
9819 "branch-alias": {
9820 "dev-master": "3.0-dev"
9821 }
9822 },
9823 "autoload": {
9824 "classmap": [
9825 "src/"
9826 ]
9827 },
9828 "notification-url": "https://packagist.org/downloads/",
9829 "license": [
9830 "BSD-3-Clause",
9831 "GPL-2.0",
9832 "GPL-3.0"
9833 ],
9834 "authors": [
9835 {
9836 "name": "David Grudl",
9837 "homepage": "https://davidgrudl.com"
9838 },
9839 {
9840 "name": "Nette Community",
9841 "homepage": "https://nette.org/contributors"
9842 }
9843 ],
9844 "description": "🅱 Nette Bootstrap: the simple way to configure and bootstrap your Nette application.",
9845 "homepage": "https://nette.org",
9846 "keywords": [
9847 "bootstrapping",
9848 "configurator",
9849 "nette"
9850 ],
9851 "time": "2019-03-26T12:59:07+00:00"
9852 },
9853 {
9854 "name": "nette/di",
9855 "version": "v3.0.0",
9856 "source": {
9857 "type": "git",
9858 "url": "https://github.com/nette/di.git",
9859 "reference": "19d83539245aaacb59470828919182411061841f"
9860 },
9861 "dist": {
9862 "type": "zip",
9863 "url": "https://api.github.com/repos/nette/di/zipball/19d83539245aaacb59470828919182411061841f",
9864 "reference": "19d83539245aaacb59470828919182411061841f",
9865 "shasum": ""
9866 },
9867 "require": {
9868 "ext-tokenizer": "*",
9869 "nette/neon": "^3.0",
9870 "nette/php-generator": "^3.2.2",
9871 "nette/robot-loader": "^3.2",
9872 "nette/schema": "^1.0",
9873 "nette/utils": "^3.0",
9874 "php": ">=7.1"
9875 },
9876 "conflict": {
9877 "nette/bootstrap": "<3.0"
9878 },
9879 "require-dev": {
9880 "nette/tester": "^2.2",
9881 "tracy/tracy": "^2.3"
9882 },
9883 "type": "library",
9884 "extra": {
9885 "branch-alias": {
9886 "dev-master": "3.0-dev"
9887 }
9888 },
9889 "autoload": {
9890 "classmap": [
9891 "src/"
9892 ],
9893 "files": [
9894 "src/compatibility.php"
9895 ]
9896 },
9897 "notification-url": "https://packagist.org/downloads/",
9898 "license": [
9899 "BSD-3-Clause",
9900 "GPL-2.0",
9901 "GPL-3.0"
9902 ],
9903 "authors": [
9904 {
9905 "name": "David Grudl",
9906 "homepage": "https://davidgrudl.com"
9907 },
9908 {
9909 "name": "Nette Community",
9910 "homepage": "https://nette.org/contributors"
9911 }
9912 ],
9913 "description": "💎 Nette Dependency Injection Container: Flexible, compiled and full-featured DIC with perfectly usable autowiring and support for all new PHP 7.1 features.",
9914 "homepage": "https://nette.org",
9915 "keywords": [
9916 "compiled",
9917 "di",
9918 "dic",
9919 "factory",
9920 "ioc",
9921 "nette",
9922 "static"
9923 ],
9924 "time": "2019-04-03T19:35:46+00:00"
9925 },
9926 {
9927 "name": "nette/finder",
9928 "version": "v2.5.0",
9929 "source": {
9930 "type": "git",
9931 "url": "https://github.com/nette/finder.git",
9932 "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2"
9933 },
9934 "dist": {
9935 "type": "zip",
9936 "url": "https://api.github.com/repos/nette/finder/zipball/6be1b83ea68ac558aff189d640abe242e0306fe2",
9937 "reference": "6be1b83ea68ac558aff189d640abe242e0306fe2",
9938 "shasum": ""
9939 },
9940 "require": {
9941 "nette/utils": "^2.4 || ~3.0.0",
9942 "php": ">=7.1"
9943 },
9944 "conflict": {
9945 "nette/nette": "<2.2"
9946 },
9947 "require-dev": {
9948 "nette/tester": "^2.0",
9949 "tracy/tracy": "^2.3"
9950 },
9951 "type": "library",
9952 "extra": {
9953 "branch-alias": {
9954 "dev-master": "2.5-dev"
9955 }
9956 },
9957 "autoload": {
9958 "classmap": [
9959 "src/"
9960 ]
9961 },
9962 "notification-url": "https://packagist.org/downloads/",
9963 "license": [
9964 "BSD-3-Clause",
9965 "GPL-2.0",
9966 "GPL-3.0"
9967 ],
9968 "authors": [
9969 {
9970 "name": "David Grudl",
9971 "homepage": "https://davidgrudl.com"
9972 },
9973 {
9974 "name": "Nette Community",
9975 "homepage": "https://nette.org/contributors"
9976 }
9977 ],
9978 "description": "? Nette Finder: find files and directories with an intuitive API.",
9979 "homepage": "https://nette.org",
9980 "keywords": [
9981 "filesystem",
9982 "glob",
9983 "iterator",
9984 "nette"
9985 ],
9986 "time": "2019-02-28T18:13:25+00:00"
9987 },
9988 {
9989 "name": "nette/neon",
9990 "version": "v3.0.0",
9991 "source": {
9992 "type": "git",
9993 "url": "https://github.com/nette/neon.git",
9994 "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb"
9995 },
9996 "dist": {
9997 "type": "zip",
9998 "url": "https://api.github.com/repos/nette/neon/zipball/cbff32059cbdd8720deccf9e9eace6ee516f02eb",
9999 "reference": "cbff32059cbdd8720deccf9e9eace6ee516f02eb",
10000 "shasum": ""
10001 },
10002 "require": {
10003 "ext-iconv": "*",
10004 "ext-json": "*",
10005 "php": ">=7.0"
10006 },
10007 "require-dev": {
10008 "nette/tester": "^2.0",
10009 "tracy/tracy": "^2.3"
10010 },
10011 "type": "library",
10012 "extra": {
10013 "branch-alias": {
10014 "dev-master": "3.0-dev"
10015 }
10016 },
10017 "autoload": {
10018 "classmap": [
10019 "src/"
10020 ]
10021 },
10022 "notification-url": "https://packagist.org/downloads/",
10023 "license": [
10024 "BSD-3-Clause",
10025 "GPL-2.0",
10026 "GPL-3.0"
10027 ],
10028 "authors": [
10029 {
10030 "name": "David Grudl",
10031 "homepage": "https://davidgrudl.com"
10032 },
10033 {
10034 "name": "Nette Community",
10035 "homepage": "https://nette.org/contributors"
10036 }
10037 ],
10038 "description": "? Nette NEON: encodes and decodes NEON file format.",
10039 "homepage": "http://ne-on.org",
10040 "keywords": [
10041 "export",
10042 "import",
10043 "neon",
10044 "nette",
10045 "yaml"
10046 ],
10047 "time": "2019-02-05T21:30:40+00:00"
10048 },
10049 {
10050 "name": "nette/php-generator",
10051 "version": "v3.2.2",
10052 "source": {
10053 "type": "git",
10054 "url": "https://github.com/nette/php-generator.git",
10055 "reference": "acff8b136fad84b860a626d133e791f95781f9f5"
10056 },
10057 "dist": {
10058 "type": "zip",
10059 "url": "https://api.github.com/repos/nette/php-generator/zipball/acff8b136fad84b860a626d133e791f95781f9f5",
10060 "reference": "acff8b136fad84b860a626d133e791f95781f9f5",
10061 "shasum": ""
10062 },
10063 "require": {
10064 "nette/utils": "^2.4.2 || ~3.0.0",
10065 "php": ">=7.1"
10066 },
10067 "require-dev": {
10068 "nette/tester": "^2.0",
10069 "tracy/tracy": "^2.3"
10070 },
10071 "type": "library",
10072 "extra": {
10073 "branch-alias": {
10074 "dev-master": "3.2-dev"
10075 }
10076 },
10077 "autoload": {
10078 "classmap": [
10079 "src/"
10080 ]
10081 },
10082 "notification-url": "https://packagist.org/downloads/",
10083 "license": [
10084 "BSD-3-Clause",
10085 "GPL-2.0",
10086 "GPL-3.0"
10087 ],
10088 "authors": [
10089 {
10090 "name": "David Grudl",
10091 "homepage": "https://davidgrudl.com"
10092 },
10093 {
10094 "name": "Nette Community",
10095 "homepage": "https://nette.org/contributors"
10096 }
10097 ],
10098 "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 7.3 features.",
10099 "homepage": "https://nette.org",
10100 "keywords": [
10101 "code",
10102 "nette",
10103 "php",
10104 "scaffolding"
10105 ],
10106 "time": "2019-03-15T03:41:13+00:00"
10107 },
10108 {
10109 "name": "nette/robot-loader",
10110 "version": "v3.2.0",
10111 "source": {
10112 "type": "git",
10113 "url": "https://github.com/nette/robot-loader.git",
10114 "reference": "0712a0e39ae7956d6a94c0ab6ad41aa842544b5c"
10115 },
10116 "dist": {
10117 "type": "zip",
10118 "url": "https://api.github.com/repos/nette/robot-loader/zipball/0712a0e39ae7956d6a94c0ab6ad41aa842544b5c",
10119 "reference": "0712a0e39ae7956d6a94c0ab6ad41aa842544b5c",
10120 "shasum": ""
10121 },
10122 "require": {
10123 "ext-tokenizer": "*",
10124 "nette/finder": "^2.5",
10125 "nette/utils": "^3.0",
10126 "php": ">=7.1"
10127 },
10128 "require-dev": {
10129 "nette/tester": "^2.0",
10130 "tracy/tracy": "^2.3"
10131 },
10132 "type": "library",
10133 "extra": {
10134 "branch-alias": {
10135 "dev-master": "3.2-dev"
10136 }
10137 },
10138 "autoload": {
10139 "classmap": [
10140 "src/"
10141 ]
10142 },
10143 "notification-url": "https://packagist.org/downloads/",
10144 "license": [
10145 "BSD-3-Clause",
10146 "GPL-2.0",
10147 "GPL-3.0"
10148 ],
10149 "authors": [
10150 {
10151 "name": "David Grudl",
10152 "homepage": "https://davidgrudl.com"
10153 },
10154 {
10155 "name": "Nette Community",
10156 "homepage": "https://nette.org/contributors"
10157 }
10158 ],
10159 "description": "? Nette RobotLoader: high performance and comfortable autoloader that will search and autoload classes within your application.",
10160 "homepage": "https://nette.org",
10161 "keywords": [
10162 "autoload",
10163 "class",
10164 "interface",
10165 "nette",
10166 "trait"
10167 ],
10168 "time": "2019-03-08T21:57:24+00:00"
10169 },
10170 {
10171 "name": "nette/schema",
10172 "version": "v1.0.0",
10173 "source": {
10174 "type": "git",
10175 "url": "https://github.com/nette/schema.git",
10176 "reference": "6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d"
10177 },
10178 "dist": {
10179 "type": "zip",
10180 "url": "https://api.github.com/repos/nette/schema/zipball/6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d",
10181 "reference": "6241d8d4da39e825dd6cb5bfbe4242912f4d7e4d",
10182 "shasum": ""
10183 },
10184 "require": {
10185 "nette/utils": "^3.0.1",
10186 "php": ">=7.1"
10187 },
10188 "require-dev": {
10189 "nette/tester": "^2.2",
10190 "tracy/tracy": "^2.3"
10191 },
10192 "type": "library",
10193 "extra": {
10194 "branch-alias": {
10195 "dev-master": "1.0-dev"
10196 }
10197 },
10198 "autoload": {
10199 "classmap": [
10200 "src/"
10201 ]
10202 },
10203 "notification-url": "https://packagist.org/downloads/",
10204 "license": [
10205 "BSD-3-Clause",
10206 "GPL-2.0",
10207 "GPL-3.0"
10208 ],
10209 "authors": [
10210 {
10211 "name": "David Grudl",
10212 "homepage": "https://davidgrudl.com"
10213 },
10214 {
10215 "name": "Nette Community",
10216 "homepage": "https://nette.org/contributors"
10217 }
10218 ],
10219 "description": "📐 Nette Schema: validating data structures against a given Schema.",
10220 "homepage": "https://nette.org",
10221 "keywords": [
10222 "config",
10223 "nette"
10224 ],
10225 "time": "2019-04-03T15:53:25+00:00"
10226 },
10227 {
10228 "name": "nette/utils",
10229 "version": "v3.0.1",
10230 "source": {
10231 "type": "git",
10232 "url": "https://github.com/nette/utils.git",
10233 "reference": "bd961f49b211997202bda1d0fbc410905be370d4"
10234 },
10235 "dist": {
10236 "type": "zip",
10237 "url": "https://api.github.com/repos/nette/utils/zipball/bd961f49b211997202bda1d0fbc410905be370d4",
10238 "reference": "bd961f49b211997202bda1d0fbc410905be370d4",
10239 "shasum": ""
10240 },
10241 "require": {
10242 "php": ">=7.1"
10243 },
10244 "require-dev": {
10245 "nette/tester": "~2.0",
10246 "tracy/tracy": "^2.3"
10247 },
10248 "suggest": {
10249 "ext-gd": "to use Image",
10250 "ext-iconv": "to use Strings::webalize() and toAscii()",
10251 "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
10252 "ext-json": "to use Nette\\Utils\\Json",
10253 "ext-mbstring": "to use Strings::lower() etc...",
10254 "ext-xml": "to use Strings::length() etc. when mbstring is not available"
10255 },
10256 "type": "library",
10257 "extra": {
10258 "branch-alias": {
10259 "dev-master": "3.0-dev"
10260 }
10261 },
10262 "autoload": {
10263 "classmap": [
10264 "src/"
10265 ]
10266 },
10267 "notification-url": "https://packagist.org/downloads/",
10268 "license": [
10269 "BSD-3-Clause",
10270 "GPL-2.0",
10271 "GPL-3.0"
10272 ],
10273 "authors": [
10274 {
10275 "name": "David Grudl",
10276 "homepage": "https://davidgrudl.com"
10277 },
10278 {
10279 "name": "Nette Community",
10280 "homepage": "https://nette.org/contributors"
10281 }
10282 ],
10283 "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
10284 "homepage": "https://nette.org",
10285 "keywords": [
10286 "array",
10287 "core",
10288 "datetime",
10289 "images",
10290 "json",
10291 "nette",
10292 "paginator",
10293 "password",
10294 "slugify",
10295 "string",
10296 "unicode",
10297 "utf-8",
10298 "utility",
10299 "validation"
10300 ],
10301 "time": "2019-03-22T01:00:30+00:00"
10302 },
10303 {
10304 "name": "nikic/php-parser",
10305 "version": "v4.2.2",
10306 "source": {
10307 "type": "git",
10308 "url": "https://github.com/nikic/PHP-Parser.git",
10309 "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420"
10310 },
10311 "dist": {
10312 "type": "zip",
10313 "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bd73cc04c3843ad8d6b0bfc0956026a151fc420",
10314 "reference": "1bd73cc04c3843ad8d6b0bfc0956026a151fc420",
10315 "shasum": ""
10316 },
10317 "require": {
10318 "ext-tokenizer": "*",
10319 "php": ">=7.0"
10320 },
10321 "require-dev": {
10322 "phpunit/phpunit": "^6.5 || ^7.0"
10323 },
10324 "bin": [
10325 "bin/php-parse"
10326 ],
10327 "type": "library",
10328 "extra": {
10329 "branch-alias": {
10330 "dev-master": "4.2-dev"
10331 }
10332 },
10333 "autoload": {
10334 "psr-4": {
10335 "PhpParser\\": "lib/PhpParser"
10336 }
10337 },
10338 "notification-url": "https://packagist.org/downloads/",
10339 "license": [
10340 "BSD-3-Clause"
10341 ],
10342 "authors": [
10343 {
10344 "name": "Nikita Popov"
10345 }
10346 ],
10347 "description": "A PHP parser written in PHP",
10348 "keywords": [
10349 "parser",
10350 "php"
10351 ],
10352 "time": "2019-05-25T20:07:01+00:00"
10353 },
10354 {
10355 "name": "php-cs-fixer/diff",
10356 "version": "v1.3.0",
10357 "source": {
10358 "type": "git",
10359 "url": "https://github.com/PHP-CS-Fixer/diff.git",
10360 "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756"
10361 },
10362 "dist": {
10363 "type": "zip",
10364 "url": "https://api.github.com/repos/PHP-CS-Fixer/diff/zipball/78bb099e9c16361126c86ce82ec4405ebab8e756",
10365 "reference": "78bb099e9c16361126c86ce82ec4405ebab8e756",
10366 "shasum": ""
10367 },
10368 "require": {
10369 "php": "^5.6 || ^7.0"
10370 },
10371 "require-dev": {
10372 "phpunit/phpunit": "^5.7.23 || ^6.4.3",
10373 "symfony/process": "^3.3"
10374 },
10375 "type": "library",
10376 "autoload": {
10377 "classmap": [
10378 "src/"
10379 ]
10380 },
10381 "notification-url": "https://packagist.org/downloads/",
10382 "license": [
10383 "BSD-3-Clause"
10384 ],
10385 "authors": [
10386 {
10387 "name": "Kore Nordmann",
10388 "email": "mail@kore-nordmann.de"
10389 },
10390 {
10391 "name": "Sebastian Bergmann",
10392 "email": "sebastian@phpunit.de"
10393 },
10394 {
10395 "name": "SpacePossum"
10396 }
10397 ],
10398 "description": "sebastian/diff v2 backport support for PHP5.6",
10399 "homepage": "https://github.com/PHP-CS-Fixer",
10400 "keywords": [
10401 "diff"
10402 ],
10403 "time": "2018-02-15T16:58:55+00:00"
10404 },
10405 {
10406 "name": "php-http/mock-client",
10407 "version": "1.3.0",
10408 "source": {
10409 "type": "git",
10410 "url": "https://github.com/php-http/mock-client.git",
10411 "reference": "d364c4a2847229dd37237d0083887889d3bd8564"
10412 },
10413 "dist": {
10414 "type": "zip",
10415 "url": "https://api.github.com/repos/php-http/mock-client/zipball/d364c4a2847229dd37237d0083887889d3bd8564",
10416 "reference": "d364c4a2847229dd37237d0083887889d3bd8564",
10417 "shasum": ""
10418 },
10419 "require": {
10420 "php": "^5.5 || ^7.0",
10421 "php-http/client-common": "^1.9 || ^2.0",
10422 "php-http/discovery": "^1.0",
10423 "php-http/httplug": "^1.0 || ^2.0",
10424 "php-http/message-factory": "^1.0"
10425 },
10426 "provide": {
10427 "php-http/async-client-implementation": "1.0",
10428 "php-http/client-implementation": "1.0"
10429 },
10430 "require-dev": {
10431 "henrikbjorn/phpspec-code-coverage": "^1.0",
10432 "phpspec/phpspec": "^2.4"
10433 },
10434 "type": "library",
10435 "extra": {
10436 "branch-alias": {
10437 "dev-master": "1.3-dev"
10438 }
10439 },
10440 "autoload": {
10441 "psr-4": {
10442 "Http\\Mock\\": "src/"
10443 }
10444 },
10445 "notification-url": "https://packagist.org/downloads/",
10446 "license": [
10447 "MIT"
10448 ],
10449 "authors": [
10450 {
10451 "name": "David de Boer",
10452 "email": "david@ddeboer.nl"
10453 }
10454 ],
10455 "description": "Mock HTTP client",
10456 "homepage": "http://httplug.io",
10457 "keywords": [
10458 "client",
10459 "http",
10460 "mock",
10461 "psr7"
10462 ],
10463 "time": "2019-02-21T08:51:08+00:00"
10464 },
10465 {
10466 "name": "phpstan/phpdoc-parser",
10467 "version": "0.3.4",
10468 "source": {
10469 "type": "git",
10470 "url": "https://github.com/phpstan/phpdoc-parser.git",
10471 "reference": "ab518a5fc8f1d90f58bd2c5552ba915e2c477b66"
10472 },
10473 "dist": {
10474 "type": "zip",
10475 "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/ab518a5fc8f1d90f58bd2c5552ba915e2c477b66",
10476 "reference": "ab518a5fc8f1d90f58bd2c5552ba915e2c477b66",
10477 "shasum": ""
10478 },
10479 "require": {
10480 "php": "~7.1"
10481 },
10482 "require-dev": {
10483 "consistence/coding-standard": "^3.5",
10484 "jakub-onderka/php-parallel-lint": "^0.9.2",
10485 "phing/phing": "^2.16.0",
10486 "phpstan/phpstan": "^0.10",
10487 "phpunit/phpunit": "^6.3",
10488 "slevomat/coding-standard": "^4.7.2",
10489 "squizlabs/php_codesniffer": "^3.3.2",
10490 "symfony/process": "^3.4 || ^4.0"
10491 },
10492 "type": "library",
10493 "extra": {
10494 "branch-alias": {
10495 "dev-master": "0.3-dev"
10496 }
10497 },
10498 "autoload": {
10499 "psr-4": {
10500 "PHPStan\\PhpDocParser\\": [
10501 "src/"
10502 ]
10503 }
10504 },
10505 "notification-url": "https://packagist.org/downloads/",
10506 "license": [
10507 "MIT"
10508 ],
10509 "description": "PHPDoc parser with support for nullable, intersection and generic types",
10510 "time": "2019-05-28T11:40:00+00:00"
10511 },
10512 {
10513 "name": "phpstan/phpstan",
10514 "version": "0.11.8",
10515 "source": {
10516 "type": "git",
10517 "url": "https://github.com/phpstan/phpstan.git",
10518 "reference": "fcf0081bf3a254ddacffa03e78be87842d0c09c9"
10519 },
10520 "dist": {
10521 "type": "zip",
10522 "url": "https://api.github.com/repos/phpstan/phpstan/zipball/fcf0081bf3a254ddacffa03e78be87842d0c09c9",
10523 "reference": "fcf0081bf3a254ddacffa03e78be87842d0c09c9",
10524 "shasum": ""
10525 },
10526 "require": {
10527 "composer/xdebug-handler": "^1.3.0",
10528 "jean85/pretty-package-versions": "^1.0.3",
10529 "nette/bootstrap": "^2.4 || ^3.0",
10530 "nette/di": "^2.4.7 || ^3.0",
10531 "nette/robot-loader": "^3.0.1",
10532 "nette/schema": "^1.0",
10533 "nette/utils": "^2.4.5 || ^3.0",
10534 "nikic/php-parser": "^4.0.2",
10535 "php": "~7.1",
10536 "phpstan/phpdoc-parser": "^0.3.4",
10537 "symfony/console": "~3.2 || ~4.0",
10538 "symfony/finder": "~3.2 || ~4.0"
10539 },
10540 "conflict": {
10541 "symfony/console": "3.4.16 || 4.1.5"
10542 },
10543 "require-dev": {
10544 "brianium/paratest": "^2.0",
10545 "consistence/coding-standard": "^3.5",
10546 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
10547 "ext-intl": "*",
10548 "ext-mysqli": "*",
10549 "ext-soap": "*",
10550 "ext-zip": "*",
10551 "jakub-onderka/php-parallel-lint": "^1.0",
10552 "localheinz/composer-normalize": "^1.1.0",
10553 "phing/phing": "^2.16.0",
10554 "phpstan/phpstan-deprecation-rules": "^0.11",
10555 "phpstan/phpstan-php-parser": "^0.11",
10556 "phpstan/phpstan-phpunit": "^0.11",
10557 "phpstan/phpstan-strict-rules": "^0.11",
10558 "phpunit/phpunit": "^7.0",
10559 "slevomat/coding-standard": "^4.7.2",
10560 "squizlabs/php_codesniffer": "^3.3.2"
10561 },
10562 "bin": [
10563 "bin/phpstan"
10564 ],
10565 "type": "library",
10566 "extra": {
10567 "branch-alias": {
10568 "dev-master": "0.11-dev"
10569 }
10570 },
10571 "autoload": {
10572 "psr-4": {
10573 "PHPStan\\": [
10574 "src/",
10575 "build/PHPStan"
10576 ]
10577 }
10578 },
10579 "notification-url": "https://packagist.org/downloads/",
10580 "license": [
10581 "MIT"
10582 ],
10583 "description": "PHPStan - PHP Static Analysis Tool",
10584 "time": "2019-05-28T19:58:33+00:00"
10585 },
10586 {
10587 "name": "phpstan/phpstan-doctrine",
10588 "version": "0.11.5",
10589 "source": {
10590 "type": "git",
10591 "url": "https://github.com/phpstan/phpstan-doctrine.git",
10592 "reference": "3c68697365f0b71e357d773d91a6c77f3f9e143a"
10593 },
10594 "dist": {
10595 "type": "zip",
10596 "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/3c68697365f0b71e357d773d91a6c77f3f9e143a",
10597 "reference": "3c68697365f0b71e357d773d91a6c77f3f9e143a",
10598 "shasum": ""
10599 },
10600 "require": {
10601 "nikic/php-parser": "^4.0",
10602 "php": "~7.1",
10603 "phpstan/phpdoc-parser": "^0.3",
10604 "phpstan/phpstan": "^0.11.7"
10605 },
10606 "conflict": {
10607 "doctrine/collections": "<1.0",
10608 "doctrine/common": "<2.7",
10609 "doctrine/mongodb-odm": "<1.2",
10610 "doctrine/orm": "<2.5"
10611 },
10612 "require-dev": {
10613 "consistence/coding-standard": "^3.8",
10614 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
10615 "doctrine/collections": "^1.0",
10616 "doctrine/common": "^2.7",
10617 "doctrine/mongodb-odm": "^1.2",
10618 "doctrine/orm": "^2.5",
10619 "jakub-onderka/php-parallel-lint": "^1.0",
10620 "phing/phing": "^2.16.0",
10621 "phpstan/phpstan-phpunit": "^0.11",
10622 "phpstan/phpstan-strict-rules": "^0.11",
10623 "phpunit/phpunit": "^7.0",
10624 "slevomat/coding-standard": "^5.0.4"
10625 },
10626 "type": "phpstan-extension",
10627 "extra": {
10628 "branch-alias": {
10629 "dev-master": "0.11-dev"
10630 },
10631 "phpstan": {
10632 "includes": [
10633 "extension.neon",
10634 "rules.neon"
10635 ]
10636 }
10637 },
10638 "autoload": {
10639 "psr-4": {
10640 "PHPStan\\": "src/"
10641 }
10642 },
10643 "notification-url": "https://packagist.org/downloads/",
10644 "license": [
10645 "MIT"
10646 ],
10647 "description": "Doctrine extensions for PHPStan",
10648 "time": "2019-05-29T06:01:20+00:00"
10649 },
10650 {
10651 "name": "phpstan/phpstan-phpunit",
10652 "version": "0.11.2",
10653 "source": {
10654 "type": "git",
10655 "url": "https://github.com/phpstan/phpstan-phpunit.git",
10656 "reference": "fbf2ad56c3b13189d29655e226c9b1da47c2fad9"
10657 },
10658 "dist": {
10659 "type": "zip",
10660 "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/fbf2ad56c3b13189d29655e226c9b1da47c2fad9",
10661 "reference": "fbf2ad56c3b13189d29655e226c9b1da47c2fad9",
10662 "shasum": ""
10663 },
10664 "require": {
10665 "nikic/php-parser": "^4.0",
10666 "php": "~7.1",
10667 "phpstan/phpdoc-parser": "^0.3",
10668 "phpstan/phpstan": "^0.11.4"
10669 },
10670 "conflict": {
10671 "phpunit/phpunit": "<7.0"
10672 },
10673 "require-dev": {
10674 "consistence/coding-standard": "^3.0.1",
10675 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
10676 "jakub-onderka/php-parallel-lint": "^1.0",
10677 "phing/phing": "^2.16.0",
10678 "phpstan/phpstan-strict-rules": "^0.11",
10679 "phpunit/phpunit": "^7.0",
10680 "satooshi/php-coveralls": "^1.0",
10681 "slevomat/coding-standard": "^4.5.2"
10682 },
10683 "type": "phpstan-extension",
10684 "extra": {
10685 "branch-alias": {
10686 "dev-master": "0.11-dev"
10687 },
10688 "phpstan": {
10689 "includes": [
10690 "extension.neon",
10691 "rules.neon"
10692 ]
10693 }
10694 },
10695 "autoload": {
10696 "psr-4": {
10697 "PHPStan\\": "src/"
10698 }
10699 },
10700 "notification-url": "https://packagist.org/downloads/",
10701 "license": [
10702 "MIT"
10703 ],
10704 "description": "PHPUnit extensions and rules for PHPStan",
10705 "time": "2019-05-17T17:50:16+00:00"
10706 },
10707 {
10708 "name": "phpstan/phpstan-symfony",
10709 "version": "0.11.6",
10710 "source": {
10711 "type": "git",
10712 "url": "https://github.com/phpstan/phpstan-symfony.git",
10713 "reference": "c7be3054c21fd472a52b1c38eb129c3f93776084"
10714 },
10715 "dist": {
10716 "type": "zip",
10717 "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/c7be3054c21fd472a52b1c38eb129c3f93776084",
10718 "reference": "c7be3054c21fd472a52b1c38eb129c3f93776084",
10719 "shasum": ""
10720 },
10721 "require": {
10722 "ext-simplexml": "*",
10723 "nikic/php-parser": "^4.0",
10724 "php": "^7.1",
10725 "phpstan/phpstan": "^0.11.7"
10726 },
10727 "conflict": {
10728 "symfony/framework-bundle": "<3.0"
10729 },
10730 "require-dev": {
10731 "consistence/coding-standard": "^3.0.1",
10732 "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4",
10733 "jakub-onderka/php-parallel-lint": "^1.0",
10734 "nette/di": "^3.0-stable",
10735 "phing/phing": "^2.16.0",
10736 "phpstan/phpstan-phpunit": "^0.11",
10737 "phpstan/phpstan-strict-rules": "^0.11",
10738 "phpunit/phpunit": "^7.0",
10739 "slevomat/coding-standard": "^4.5.2",
10740 "squizlabs/php_codesniffer": "^3.3.2",
10741 "symfony/console": "^3.0 || ^4.0",
10742 "symfony/framework-bundle": "^3.0 || ^4.0",
10743 "symfony/messenger": "^4.2",
10744 "symfony/serializer": "^3.0 || ^4.0"
10745 },
10746 "type": "phpstan-extension",
10747 "extra": {
10748 "branch-alias": {
10749 "dev-master": "0.11-dev"
10750 },
10751 "phpstan": {
10752 "includes": [
10753 "extension.neon"
10754 ]
10755 }
10756 },
10757 "autoload": {
10758 "psr-4": {
10759 "PHPStan\\": "src/"
10760 }
10761 },
10762 "notification-url": "https://packagist.org/downloads/",
10763 "license": [
10764 "MIT"
10765 ],
10766 "authors": [
10767 {
10768 "name": "Lukáš Unger",
10769 "email": "looky.msc@gmail.com",
10770 "homepage": "https://lookyman.net"
10771 }
10772 ],
10773 "description": "Symfony Framework extensions and rules for PHPStan",
10774 "time": "2019-05-19T17:40:25+00:00"
10775 },
10776 {
10777 "name": "sensio/generator-bundle",
10778 "version": "v3.1.7",
10779 "source": {
10780 "type": "git",
10781 "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git",
10782 "reference": "28cbaa244bd0816fd8908b93f90380bcd7b67a65"
10783 },
10784 "dist": {
10785 "type": "zip",
10786 "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/28cbaa244bd0816fd8908b93f90380bcd7b67a65",
10787 "reference": "28cbaa244bd0816fd8908b93f90380bcd7b67a65",
10788 "shasum": ""
10789 },
10790 "require": {
10791 "symfony/console": "~2.7|~3.0",
10792 "symfony/framework-bundle": "~2.7|~3.0",
10793 "symfony/process": "~2.7|~3.0",
10794 "symfony/yaml": "~2.7|~3.0",
10795 "twig/twig": "^1.28.2|^2.0"
10796 },
10797 "require-dev": {
10798 "doctrine/orm": "~2.4",
10799 "symfony/doctrine-bridge": "~2.7|~3.0",
10800 "symfony/filesystem": "~2.7|~3.0",
10801 "symfony/phpunit-bridge": "^3.3"
10802 },
10803 "type": "symfony-bundle",
10804 "extra": {
10805 "branch-alias": {
10806 "dev-master": "3.1.x-dev"
10807 }
10808 },
10809 "autoload": {
10810 "psr-4": {
10811 "Sensio\\Bundle\\GeneratorBundle\\": ""
10812 },
10813 "exclude-from-classmap": [
10814 "/Tests/"
10815 ]
10816 },
10817 "notification-url": "https://packagist.org/downloads/",
10818 "license": [
10819 "MIT"
10820 ],
10821 "authors": [
10822 {
10823 "name": "Fabien Potencier",
10824 "email": "fabien@symfony.com"
10825 }
10826 ],
10827 "description": "This bundle generates code for you",
10828 "time": "2017-12-07T15:36:41+00:00"
10829 },
10830 {
10831 "name": "symfony/phpunit-bridge",
10832 "version": "v4.3.0",
10833 "source": {
10834 "type": "git",
10835 "url": "https://github.com/symfony/phpunit-bridge.git",
10836 "reference": "7bfc1b57d1ac9513703391498aa8da4764388bc6"
10837 },
10838 "dist": {
10839 "type": "zip",
10840 "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/7bfc1b57d1ac9513703391498aa8da4764388bc6",
10841 "reference": "7bfc1b57d1ac9513703391498aa8da4764388bc6",
10842 "shasum": ""
10843 },
10844 "require": {
10845 "php": ">=5.5.9"
10846 },
10847 "conflict": {
10848 "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
10849 },
10850 "suggest": {
10851 "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader"
10852 },
10853 "bin": [
10854 "bin/simple-phpunit"
10855 ],
10856 "type": "symfony-bridge",
10857 "extra": {
10858 "branch-alias": {
10859 "dev-master": "4.3-dev"
10860 },
10861 "thanks": {
10862 "name": "phpunit/phpunit",
10863 "url": "https://github.com/sebastianbergmann/phpunit"
10864 }
10865 },
10866 "autoload": {
10867 "files": [
10868 "bootstrap.php"
10869 ],
10870 "psr-4": {
10871 "Symfony\\Bridge\\PhpUnit\\": ""
10872 },
10873 "exclude-from-classmap": [
10874 "/Tests/"
10875 ]
10876 },
10877 "notification-url": "https://packagist.org/downloads/",
10878 "license": [
10879 "MIT"
10880 ],
10881 "authors": [
10882 {
10883 "name": "Nicolas Grekas",
10884 "email": "p@tchwork.com"
10885 },
10886 {
10887 "name": "Symfony Community",
10888 "homepage": "https://symfony.com/contributors"
10889 }
10890 ],
10891 "description": "Symfony PHPUnit Bridge",
10892 "homepage": "https://symfony.com",
10893 "time": "2019-05-08T13:47:25+00:00"
10894 }
10895 ],
10896 "aliases": [],
10897 "minimum-stability": "dev",
10898 "stability-flags": {
10899 "grandt/phpepub": 20,
10900 "craue/config-bundle": 20,
10901 "predis/predis": 20
10902 },
10903 "prefer-stable": true,
10904 "prefer-lowest": false,
10905 "platform": {
10906 "php": ">=7.1.3",
10907 "ext-pcre": "*",
10908 "ext-dom": "*",
10909 "ext-curl": "*",
10910 "ext-gd": "*",
10911 "ext-session": "*",
10912 "ext-ctype": "*",
10913 "ext-hash": "*",
10914 "ext-simplexml": "*",
10915 "ext-json": "*",
10916 "ext-mbstring": "*",
10917 "ext-xml": "*",
10918 "ext-iconv": "*",
10919 "ext-tokenizer": "*",
10920 "ext-pdo": "*",
10921 "ext-tidy": "*"
10922 },
10923 "platform-dev": [],
10924 "platform-overrides": {
10925 "php": "7.1.3"
10926 }
10927}
diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile
index d0266ec7..b632cb8a 100644
--- a/docker/php/Dockerfile
+++ b/docker/php/Dockerfile
@@ -1,4 +1,4 @@
1FROM php:fpm 1FROM php:7.2-fpm
2 2
3# Default timezone. To change it, use the argument in the docker-compose.yml file 3# Default timezone. To change it, use the argument in the docker-compose.yml file
4ARG timezone='Europe/Paris' 4ARG timezone='Europe/Paris'
diff --git a/scripts/release.sh b/scripts/release.sh
index ee08a688..e697e220 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -9,8 +9,8 @@ ENV=$4
9 9
10rm -rf $TMP_FOLDER/$RELEASE_FOLDER 10rm -rf $TMP_FOLDER/$RELEASE_FOLDER
11mkdir $TMP_FOLDER/$RELEASE_FOLDER 11mkdir $TMP_FOLDER/$RELEASE_FOLDER
12git clone git@github.com:wallabag/wallabag.git -b release-$VERSION $TMP_FOLDER/$RELEASE_FOLDER/$VERSION 12git clone git@github.com:wallabag/wallabag.git $TMP_FOLDER/$RELEASE_FOLDER/$VERSION
13cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && SYMFONY_ENV=$ENV COMPOSER_MEMORY_LIMIT=-1 composer up -n --no-dev 13cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && SYMFONY_ENV=$ENV COMPOSER_MEMORY_LIMIT=-1 composer install -n --no-dev
14cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && php bin/console wallabag:install --env=$ENV -n 14cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && php bin/console wallabag:install --env=$ENV -n
15cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && php bin/console assets:install --env=$ENV --symlink --relative 15cd $TMP_FOLDER/$RELEASE_FOLDER/$VERSION && php bin/console assets:install --env=$ENV --symlink --relative
16cd $TMP_FOLDER/$RELEASE_FOLDER && tar czf wallabag-$VERSION.tar.gz --exclude="var/cache/*" --exclude="var/logs/*" --exclude="var/sessions/*" --exclude=".git" $VERSION 16cd $TMP_FOLDER/$RELEASE_FOLDER && tar czf wallabag-$VERSION.tar.gz --exclude="var/cache/*" --exclude="var/logs/*" --exclude="var/sessions/*" --exclude=".git" $VERSION
diff --git a/src/Wallabag/ApiBundle/Controller/EntryRestController.php b/src/Wallabag/ApiBundle/Controller/EntryRestController.php
index 06520af9..9f933adb 100644
--- a/src/Wallabag/ApiBundle/Controller/EntryRestController.php
+++ b/src/Wallabag/ApiBundle/Controller/EntryRestController.php
@@ -14,6 +14,7 @@ use Wallabag\CoreBundle\Entity\Entry;
14use Wallabag\CoreBundle\Entity\Tag; 14use Wallabag\CoreBundle\Entity\Tag;
15use Wallabag\CoreBundle\Event\EntryDeletedEvent; 15use Wallabag\CoreBundle\Event\EntryDeletedEvent;
16use Wallabag\CoreBundle\Event\EntrySavedEvent; 16use Wallabag\CoreBundle\Event\EntrySavedEvent;
17use Wallabag\CoreBundle\Helper\UrlHasher;
17 18
18class EntryRestController extends WallabagRestController 19class EntryRestController extends WallabagRestController
19{ 20{
@@ -43,50 +44,45 @@ class EntryRestController extends WallabagRestController
43 44
44 $returnId = (null === $request->query->get('return_id')) ? false : (bool) $request->query->get('return_id'); 45 $returnId = (null === $request->query->get('return_id')) ? false : (bool) $request->query->get('return_id');
45 46
46 $urls = $request->query->get('urls', []);
47 $hashedUrls = $request->query->get('hashed_urls', []); 47 $hashedUrls = $request->query->get('hashed_urls', []);
48 $hashedUrl = $request->query->get('hashed_url', '');
49 if (!empty($hashedUrl)) {
50 $hashedUrls[] = $hashedUrl;
51 }
48 52
49 // handle multiple urls first 53 $urls = $request->query->get('urls', []);
50 if (!empty($hashedUrls)) { 54 $url = $request->query->get('url', '');
51 $results = []; 55 if (!empty($url)) {
52 foreach ($hashedUrls as $hashedUrl) { 56 $urls[] = $url;
53 $res = $repo->findByHashedUrlAndUserId($hashedUrl, $this->getUser()->getId()); 57 }
54
55 $results[$hashedUrl] = $this->returnExistInformation($res, $returnId);
56 }
57 58
58 return $this->sendResponse($results); 59 $urlHashMap = [];
60 foreach ($urls as $urlToHash) {
61 $urlHash = UrlHasher::hashUrl($urlToHash);
62 $hashedUrls[] = $urlHash;
63 $urlHashMap[$urlHash] = $urlToHash;
59 } 64 }
60 65
61 // @deprecated, to be remove in 3.0 66 if (empty($hashedUrls)) {
62 if (!empty($urls)) { 67 throw $this->createAccessDeniedException('URL is empty?, logged user id: ' . $this->getUser()->getId());
63 $results = []; 68 }
64 foreach ($urls as $url) {
65 $res = $repo->findByUrlAndUserId($url, $this->getUser()->getId());
66 69
67 $results[$url] = $this->returnExistInformation($res, $returnId); 70 $results = [];
68 } 71 foreach ($hashedUrls as $hashedUrlToSearch) {
72 $res = $repo->findByHashedUrlAndUserId($hashedUrlToSearch, $this->getUser()->getId());
69 73
70 return $this->sendResponse($results); 74 $results[$hashedUrlToSearch] = $this->returnExistInformation($res, $returnId);
71 } 75 }
72 76
73 // let's see if it is a simple url? 77 $results = $this->replaceUrlHashes($results, $urlHashMap);
74 $url = $request->query->get('url', '');
75 $hashedUrl = $request->query->get('hashed_url', '');
76 78
77 if (empty($url) && empty($hashedUrl)) { 79 if (!empty($url) || !empty($hashedUrl)) {
78 throw $this->createAccessDeniedException('URL is empty?, logged user id: ' . $this->getUser()->getId()); 80 $hu = array_keys($results)[0];
79 }
80 81
81 $method = 'findByUrlAndUserId'; 82 return $this->sendResponse(['exists' => $results[$hu]]);
82 if (!empty($hashedUrl)) {
83 $method = 'findByHashedUrlAndUserId';
84 $url = $hashedUrl;
85 } 83 }
86 84
87 $res = $repo->$method($url, $this->getUser()->getId()); 85 return $this->sendResponse($results);
88
89 return $this->sendResponse(['exists' => $this->returnExistInformation($res, $returnId)]);
90 } 86 }
91 87
92 /** 88 /**
@@ -103,6 +99,7 @@ class EntryRestController extends WallabagRestController
103 * {"name"="tags", "dataType"="string", "required"=false, "format"="api,rest", "description"="a list of tags url encoded. Will returns entries that matches ALL tags."}, 99 * {"name"="tags", "dataType"="string", "required"=false, "format"="api,rest", "description"="a list of tags url encoded. Will returns entries that matches ALL tags."},
104 * {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."}, 100 * {"name"="since", "dataType"="integer", "required"=false, "format"="default '0'", "description"="The timestamp since when you want entries updated."},
105 * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"}, 101 * {"name"="public", "dataType"="integer", "required"=false, "format"="1 or 0, all entries by default", "description"="filter by entries with a public link"},
102 * {"name"="detail", "dataType"="string", "required"=false, "format"="metadata or full, metadata by default", "description"="include content field if 'full'. 'full' by default for backward compatibility."},
106 * } 103 * }
107 * ) 104 * )
108 * 105 *
@@ -121,6 +118,7 @@ class EntryRestController extends WallabagRestController
121 $perPage = (int) $request->query->get('perPage', 30); 118 $perPage = (int) $request->query->get('perPage', 30);
122 $tags = \is_array($request->query->get('tags')) ? '' : (string) $request->query->get('tags', ''); 119 $tags = \is_array($request->query->get('tags')) ? '' : (string) $request->query->get('tags', '');
123 $since = $request->query->get('since', 0); 120 $since = $request->query->get('since', 0);
121 $detail = strtolower($request->query->get('detail', 'full'));
124 122
125 try { 123 try {
126 /** @var \Pagerfanta\Pagerfanta $pager */ 124 /** @var \Pagerfanta\Pagerfanta $pager */
@@ -132,7 +130,8 @@ class EntryRestController extends WallabagRestController
132 $sort, 130 $sort,
133 $order, 131 $order,
134 $since, 132 $since,
135 $tags 133 $tags,
134 $detail
136 ); 135 );
137 } catch (\Exception $e) { 136 } catch (\Exception $e) {
138 throw new BadRequestHttpException($e->getMessage()); 137 throw new BadRequestHttpException($e->getMessage());
@@ -156,6 +155,7 @@ class EntryRestController extends WallabagRestController
156 'perPage' => $perPage, 155 'perPage' => $perPage,
157 'tags' => $tags, 156 'tags' => $tags,
158 'since' => $since, 157 'since' => $since,
158 'detail' => $detail,
159 ], 159 ],
160 true 160 true
161 ) 161 )
@@ -365,9 +365,7 @@ class EntryRestController extends WallabagRestController
365 'language' => !empty($data['language']) ? $data['language'] : $entry->getLanguage(), 365 'language' => !empty($data['language']) ? $data['language'] : $entry->getLanguage(),
366 'date' => !empty($data['publishedAt']) ? $data['publishedAt'] : $entry->getPublishedAt(), 366 'date' => !empty($data['publishedAt']) ? $data['publishedAt'] : $entry->getPublishedAt(),
367 // faking the open graph preview picture 367 // faking the open graph preview picture
368 'open_graph' => [ 368 'image' => !empty($data['picture']) ? $data['picture'] : $entry->getPreviewPicture(),
369 'og_image' => !empty($data['picture']) ? $data['picture'] : $entry->getPreviewPicture(),
370 ],
371 'authors' => \is_string($data['authors']) ? explode(',', $data['authors']) : $entry->getPublishedBy(), 369 'authors' => \is_string($data['authors']) ? explode(',', $data['authors']) : $entry->getPublishedBy(),
372 ] 370 ]
373 ); 371 );
@@ -566,7 +564,7 @@ class EntryRestController extends WallabagRestController
566 } 564 }
567 565
568 // if refreshing entry failed, don't save it 566 // if refreshing entry failed, don't save it
569 if ($this->getParameter('wallabag_core.fetching_error_message') === $entry->getContent()) { 567 if ($this->container->getParameter('wallabag_core.fetching_error_message') === $entry->getContent()) {
570 return new JsonResponse([], 304); 568 return new JsonResponse([], 304);
571 } 569 }
572 570
@@ -803,6 +801,24 @@ class EntryRestController extends WallabagRestController
803 } 801 }
804 802
805 /** 803 /**
804 * Replace the hashedUrl keys in $results with the unhashed URL from the
805 * request, as recorded in $urlHashMap.
806 */
807 private function replaceUrlHashes(array $results, array $urlHashMap)
808 {
809 $newResults = [];
810 foreach ($results as $hash => $res) {
811 if (isset($urlHashMap[$hash])) {
812 $newResults[$urlHashMap[$hash]] = $res;
813 } else {
814 $newResults[$hash] = $res;
815 }
816 }
817
818 return $newResults;
819 }
820
821 /**
806 * Retrieve value from the request. 822 * Retrieve value from the request.
807 * Used for POST & PATCH on a an entry. 823 * Used for POST & PATCH on a an entry.
808 * 824 *
@@ -830,8 +846,8 @@ class EntryRestController extends WallabagRestController
830 /** 846 /**
831 * Return information about the entry if it exist and depending on the id or not. 847 * Return information about the entry if it exist and depending on the id or not.
832 * 848 *
833 * @param Entry|null $entry 849 * @param Entry|bool|null $entry
834 * @param bool $returnId 850 * @param bool $returnId
835 * 851 *
836 * @return bool|int 852 * @return bool|int
837 */ 853 */
diff --git a/src/Wallabag/ApiBundle/Controller/UserRestController.php b/src/Wallabag/ApiBundle/Controller/UserRestController.php
index 3a4dafcd..1b10a076 100644
--- a/src/Wallabag/ApiBundle/Controller/UserRestController.php
+++ b/src/Wallabag/ApiBundle/Controller/UserRestController.php
@@ -45,7 +45,7 @@ class UserRestController extends WallabagRestController
45 */ 45 */
46 public function putUserAction(Request $request) 46 public function putUserAction(Request $request)
47 { 47 {
48 if (!$this->getParameter('fosuser_registration') || !$this->get('craue_config')->get('api_user_registration')) { 48 if (!$this->container->getParameter('fosuser_registration') || !$this->get('craue_config')->get('api_user_registration')) {
49 $json = $this->get('jms_serializer')->serialize(['error' => "Server doesn't allow registrations"], 'json'); 49 $json = $this->get('jms_serializer')->serialize(['error' => "Server doesn't allow registrations"], 'json');
50 50
51 return (new JsonResponse()) 51 return (new JsonResponse())
diff --git a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
index f18b0910..44fd9683 100644
--- a/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
+++ b/src/Wallabag/ApiBundle/Controller/WallabagRestController.php
@@ -2,13 +2,13 @@
2 2
3namespace Wallabag\ApiBundle\Controller; 3namespace Wallabag\ApiBundle\Controller;
4 4
5use FOS\RestBundle\Controller\FOSRestController; 5use FOS\RestBundle\Controller\AbstractFOSRestController;
6use JMS\Serializer\SerializationContext; 6use JMS\Serializer\SerializationContext;
7use Nelmio\ApiDocBundle\Annotation\ApiDoc; 7use Nelmio\ApiDocBundle\Annotation\ApiDoc;
8use Symfony\Component\HttpFoundation\JsonResponse; 8use Symfony\Component\HttpFoundation\JsonResponse;
9use Symfony\Component\Security\Core\Exception\AccessDeniedException; 9use Symfony\Component\Security\Core\Exception\AccessDeniedException;
10 10
11class WallabagRestController extends FOSRestController 11class WallabagRestController extends AbstractFOSRestController
12{ 12{
13 /** 13 /**
14 * Retrieve version number. 14 * Retrieve version number.
diff --git a/src/Wallabag/ApiBundle/Entity/AccessToken.php b/src/Wallabag/ApiBundle/Entity/AccessToken.php
index 5e4099dd..98e0af3e 100644
--- a/src/Wallabag/ApiBundle/Entity/AccessToken.php
+++ b/src/Wallabag/ApiBundle/Entity/AccessToken.php
@@ -42,6 +42,7 @@ class AccessToken extends BaseAccessToken
42 42
43 /** 43 /**
44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User") 44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User")
45 * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
45 */ 46 */
46 protected $user; 47 protected $user;
47} 48}
diff --git a/src/Wallabag/ApiBundle/Entity/AuthCode.php b/src/Wallabag/ApiBundle/Entity/AuthCode.php
index 5fa205ac..7c9c8539 100644
--- a/src/Wallabag/ApiBundle/Entity/AuthCode.php
+++ b/src/Wallabag/ApiBundle/Entity/AuthCode.php
@@ -42,6 +42,7 @@ class AuthCode extends BaseAuthCode
42 42
43 /** 43 /**
44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User") 44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User")
45 * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
45 */ 46 */
46 protected $user; 47 protected $user;
47} 48}
diff --git a/src/Wallabag/ApiBundle/Entity/RefreshToken.php b/src/Wallabag/ApiBundle/Entity/RefreshToken.php
index dd8e9c63..55a507e1 100644
--- a/src/Wallabag/ApiBundle/Entity/RefreshToken.php
+++ b/src/Wallabag/ApiBundle/Entity/RefreshToken.php
@@ -42,6 +42,7 @@ class RefreshToken extends BaseRefreshToken
42 42
43 /** 43 /**
44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User") 44 * @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User")
45 * @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
45 */ 46 */
46 protected $user; 47 protected $user;
47} 48}
diff --git a/src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php b/src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php
index 45bd8c5f..8f2bff11 100644
--- a/src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php
+++ b/src/Wallabag/CoreBundle/Command/GenerateUrlHashesCommand.php
@@ -7,6 +7,7 @@ use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
7use Symfony\Component\Console\Input\InputArgument; 7use Symfony\Component\Console\Input\InputArgument;
8use Symfony\Component\Console\Input\InputInterface; 8use Symfony\Component\Console\Input\InputInterface;
9use Symfony\Component\Console\Output\OutputInterface; 9use Symfony\Component\Console\Output\OutputInterface;
10use Wallabag\CoreBundle\Helper\UrlHasher;
10use Wallabag\UserBundle\Entity\User; 11use Wallabag\UserBundle\Entity\User;
11 12
12class GenerateUrlHashesCommand extends ContainerAwareCommand 13class GenerateUrlHashesCommand extends ContainerAwareCommand
@@ -65,7 +66,7 @@ class GenerateUrlHashesCommand extends ContainerAwareCommand
65 66
66 $i = 1; 67 $i = 1;
67 foreach ($entries as $entry) { 68 foreach ($entries as $entry) {
68 $entry->setHashedUrl(hash('sha1', $entry->getUrl())); 69 $entry->setHashedUrl(UrlHasher::hashUrl($entry->getUrl()));
69 $em->persist($entry); 70 $em->persist($entry);
70 71
71 if (0 === ($i % 20)) { 72 if (0 === ($i % 20)) {
@@ -84,7 +85,7 @@ class GenerateUrlHashesCommand extends ContainerAwareCommand
84 * 85 *
85 * @param string $username 86 * @param string $username
86 * 87 *
87 * @return \Wallabag\UserBundle\Entity\User 88 * @return User
88 */ 89 */
89 private function getUser($username) 90 private function getUser($username)
90 { 91 {
diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php
index 3b281d48..cea41303 100644
--- a/src/Wallabag/CoreBundle/Controller/ConfigController.php
+++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php
@@ -300,6 +300,34 @@ class ConfigController extends Controller
300 } 300 }
301 301
302 /** 302 /**
303 * @param Request $request
304 *
305 * @Route("/revoke-token", name="revoke_token")
306 *
307 * @return RedirectResponse|JsonResponse
308 */
309 public function revokeTokenAction(Request $request)
310 {
311 $config = $this->getConfig();
312 $config->setFeedToken(null);
313
314 $em = $this->getDoctrine()->getManager();
315 $em->persist($config);
316 $em->flush();
317
318 if ($request->isXmlHttpRequest()) {
319 return new JsonResponse();
320 }
321
322 $this->addFlash(
323 'notice',
324 'flashes.config.notice.feed_token_revoked'
325 );
326
327 return $this->redirect($this->generateUrl('config') . '#set2');
328 }
329
330 /**
303 * Deletes a tagging rule and redirect to the config homepage. 331 * Deletes a tagging rule and redirect to the config homepage.
304 * 332 *
305 * @param TaggingRule $rule 333 * @param TaggingRule $rule
diff --git a/src/Wallabag/CoreBundle/DataFixtures/SiteCredentialFixtures.php b/src/Wallabag/CoreBundle/DataFixtures/SiteCredentialFixtures.php
index c73173e8..9a7d116f 100644
--- a/src/Wallabag/CoreBundle/DataFixtures/SiteCredentialFixtures.php
+++ b/src/Wallabag/CoreBundle/DataFixtures/SiteCredentialFixtures.php
@@ -5,20 +5,39 @@ namespace Wallabag\CoreBundle\DataFixtures;
5use Doctrine\Bundle\FixturesBundle\Fixture; 5use Doctrine\Bundle\FixturesBundle\Fixture;
6use Doctrine\Common\DataFixtures\DependentFixtureInterface; 6use Doctrine\Common\DataFixtures\DependentFixtureInterface;
7use Doctrine\Common\Persistence\ObjectManager; 7use Doctrine\Common\Persistence\ObjectManager;
8use Symfony\Component\DependencyInjection\ContainerAwareInterface;
9use Symfony\Component\DependencyInjection\ContainerInterface;
8use Wallabag\CoreBundle\Entity\SiteCredential; 10use Wallabag\CoreBundle\Entity\SiteCredential;
9use Wallabag\UserBundle\DataFixtures\UserFixtures; 11use Wallabag\UserBundle\DataFixtures\UserFixtures;
10 12
11class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface 13class SiteCredentialFixtures extends Fixture implements DependentFixtureInterface, ContainerAwareInterface
12{ 14{
13 /** 15 /**
16 * @var ContainerInterface
17 */
18 private $container;
19
20 public function setContainer(ContainerInterface $container = null)
21 {
22 $this->container = $container;
23 }
24
25 /**
14 * {@inheritdoc} 26 * {@inheritdoc}
15 */ 27 */
16 public function load(ObjectManager $manager) 28 public function load(ObjectManager $manager)
17 { 29 {
18 $credential = new SiteCredential($this->getReference('admin-user')); 30 $credential = new SiteCredential($this->getReference('admin-user'));
19 $credential->setHost('example.com'); 31 $credential->setHost('.super.com');
20 $credential->setUsername('foo'); 32 $credential->setUsername($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('.super'));
21 $credential->setPassword('bar'); 33 $credential->setPassword($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('bar'));
34
35 $manager->persist($credential);
36
37 $credential = new SiteCredential($this->getReference('admin-user'));
38 $credential->setHost('paywall.example.com');
39 $credential->setUsername($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('paywall.example'));
40 $credential->setPassword($this->container->get('wallabag_core.helper.crypto_proxy')->crypt('bar'));
22 41
23 $manager->persist($credential); 42 $manager->persist($credential);
24 43
diff --git a/src/Wallabag/CoreBundle/Entity/Entry.php b/src/Wallabag/CoreBundle/Entity/Entry.php
index c3fb87d2..4d5e6fc9 100644
--- a/src/Wallabag/CoreBundle/Entity/Entry.php
+++ b/src/Wallabag/CoreBundle/Entity/Entry.php
@@ -13,6 +13,7 @@ use JMS\Serializer\Annotation\XmlRoot;
13use Symfony\Component\Validator\Constraints as Assert; 13use Symfony\Component\Validator\Constraints as Assert;
14use Wallabag\AnnotationBundle\Entity\Annotation; 14use Wallabag\AnnotationBundle\Entity\Annotation;
15use Wallabag\CoreBundle\Helper\EntityTimestampsTrait; 15use Wallabag\CoreBundle\Helper\EntityTimestampsTrait;
16use Wallabag\CoreBundle\Helper\UrlHasher;
16use Wallabag\UserBundle\Entity\User; 17use Wallabag\UserBundle\Entity\User;
17 18
18/** 19/**
@@ -26,7 +27,8 @@ use Wallabag\UserBundle\Entity\User;
26 * indexes={ 27 * indexes={
27 * @ORM\Index(name="created_at", columns={"created_at"}), 28 * @ORM\Index(name="created_at", columns={"created_at"}),
28 * @ORM\Index(name="uid", columns={"uid"}), 29 * @ORM\Index(name="uid", columns={"uid"}),
29 * @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}}) 30 * @ORM\Index(name="hashed_url_user_id", columns={"user_id", "hashed_url"}, options={"lengths"={null, 40}}),
31 * @ORM\Index(name="hashed_given_url_user_id", columns={"user_id", "hashed_given_url"}, options={"lengths"={null, 40}})
30 * } 32 * }
31 * ) 33 * )
32 * @ORM\HasLifecycleCallbacks() 34 * @ORM\HasLifecycleCallbacks()
@@ -67,6 +69,8 @@ class Entry
67 private $title; 69 private $title;
68 70
69 /** 71 /**
72 * Define the url fetched by wallabag (the final url after potential redirections).
73 *
70 * @var string 74 * @var string
71 * 75 *
72 * @Assert\NotBlank() 76 * @Assert\NotBlank()
@@ -84,6 +88,35 @@ class Entry
84 private $hashedUrl; 88 private $hashedUrl;
85 89
86 /** 90 /**
91 * From where user retrieved/found the url (an other article, a twitter, or the given_url if non are provided).
92 *
93 * @var string
94 *
95 * @ORM\Column(name="origin_url", type="text", nullable=true)
96 *
97 * @Groups({"entries_for_user", "export_all"})
98 */
99 private $originUrl;
100
101 /**
102 * Define the url entered by the user (without redirections).
103 *
104 * @var string
105 *
106 * @ORM\Column(name="given_url", type="text", nullable=true)
107 *
108 * @Groups({"entries_for_user", "export_all"})
109 */
110 private $givenUrl;
111
112 /**
113 * @var string
114 *
115 * @ORM\Column(name="hashed_given_url", type="string", length=40, nullable=true)
116 */
117 private $hashedGivenUrl;
118
119 /**
87 * @var bool 120 * @var bool
88 * 121 *
89 * @Exclude 122 * @Exclude
@@ -262,15 +295,6 @@ class Entry
262 */ 295 */
263 private $tags; 296 private $tags;
264 297
265 /**
266 * @var string
267 *
268 * @ORM\Column(name="origin_url", type="text", nullable=true)
269 *
270 * @Groups({"entries_for_user", "export_all"})
271 */
272 private $originUrl;
273
274 /* 298 /*
275 * @param User $user 299 * @param User $user
276 */ 300 */
@@ -324,7 +348,7 @@ class Entry
324 public function setUrl($url) 348 public function setUrl($url)
325 { 349 {
326 $this->url = $url; 350 $this->url = $url;
327 $this->hashedUrl = hash('sha1', $url); 351 $this->hashedUrl = UrlHasher::hashUrl($url);
328 352
329 return $this; 353 return $this;
330 } 354 }
@@ -770,7 +794,7 @@ class Entry
770 } 794 }
771 795
772 /** 796 /**
773 * @return string 797 * @return string|null
774 */ 798 */
775 public function getUid() 799 public function getUid()
776 { 800 {
@@ -922,6 +946,31 @@ class Entry
922 } 946 }
923 947
924 /** 948 /**
949 * Set given url.
950 *
951 * @param string $givenUrl
952 *
953 * @return Entry
954 */
955 public function setGivenUrl($givenUrl)
956 {
957 $this->givenUrl = $givenUrl;
958 $this->hashedGivenUrl = UrlHasher::hashUrl($givenUrl);
959
960 return $this;
961 }
962
963 /**
964 * Get given url.
965 *
966 * @return string
967 */
968 public function getGivenUrl()
969 {
970 return $this->givenUrl;
971 }
972
973 /**
925 * @return string 974 * @return string
926 */ 975 */
927 public function getHashedUrl() 976 public function getHashedUrl()
diff --git a/src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php b/src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php
index 90e00c62..c7502bac 100644
--- a/src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php
+++ b/src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php
@@ -62,11 +62,24 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
62 $host = substr($host, 4); 62 $host = substr($host, 4);
63 } 63 }
64 64
65 $credentials = null; 65 if (!$this->currentUser) {
66 if ($this->currentUser) { 66 $this->logger->debug('Auth: no current user defined.');
67 $credentials = $this->credentialRepository->findOneByHostAndUser($host, $this->currentUser->getId()); 67
68 return false;
69 }
70
71 $hosts = [$host];
72 // will try to see for a host without the first subdomain (fr.example.org & .example.org)
73 $split = explode('.', $host);
74
75 if (\count($split) > 1) {
76 // remove first subdomain
77 array_shift($split);
78 $hosts[] = '.' . implode('.', $split);
68 } 79 }
69 80
81 $credentials = $this->credentialRepository->findOneByHostsAndUser($hosts, $this->currentUser->getId());
82
70 if (null === $credentials) { 83 if (null === $credentials) {
71 $this->logger->debug('Auth: no credentials available for host.', ['host' => $host]); 84 $this->logger->debug('Auth: no credentials available for host.', ['host' => $host]);
72 85
diff --git a/src/Wallabag/CoreBundle/Helper/ContentProxy.php b/src/Wallabag/CoreBundle/Helper/ContentProxy.php
index 31953f12..5901df8b 100644
--- a/src/Wallabag/CoreBundle/Helper/ContentProxy.php
+++ b/src/Wallabag/CoreBundle/Helper/ContentProxy.php
@@ -12,8 +12,8 @@ use Wallabag\CoreBundle\Entity\Entry;
12use Wallabag\CoreBundle\Tools\Utils; 12use Wallabag\CoreBundle\Tools\Utils;
13 13
14/** 14/**
15 * This kind of proxy class take care of getting the content from an url 15 * This kind of proxy class takes care of getting the content from an url
16 * and update the entry with what it found. 16 * and updates the entry with what it found.
17 */ 17 */
18class ContentProxy 18class ContentProxy
19{ 19{
@@ -47,13 +47,18 @@ class ContentProxy
47 */ 47 */
48 public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false) 48 public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false)
49 { 49 {
50 $this->graby->toggleImgNoReferrer(true);
50 if (!empty($content['html'])) { 51 if (!empty($content['html'])) {
51 $content['html'] = $this->graby->cleanupHtml($content['html'], $url); 52 $content['html'] = $this->graby->cleanupHtml($content['html'], $url);
52 } 53 }
53 54
54 if ((empty($content) || false === $this->validateContent($content)) && false === $disableContentUpdate) { 55 if ((empty($content) || false === $this->validateContent($content)) && false === $disableContentUpdate) {
55 $fetchedContent = $this->graby->fetchContent($url); 56 $fetchedContent = $this->graby->fetchContent($url);
56 $fetchedContent['title'] = $this->sanitizeContentTitle($fetchedContent['title'], $fetchedContent['content_type']); 57
58 $fetchedContent['title'] = $this->sanitizeContentTitle(
59 $fetchedContent['title'],
60 isset($fetchedContent['headers']['content-type']) ? $fetchedContent['headers']['content-type'] : ''
61 );
57 62
58 // when content is imported, we have information in $content 63 // when content is imported, we have information in $content
59 // in case fetching content goes bad, we'll keep the imported information instead of overriding them 64 // in case fetching content goes bad, we'll keep the imported information instead of overriding them
@@ -73,6 +78,8 @@ class ContentProxy
73 $entry->setUrl($url); 78 $entry->setUrl($url);
74 } 79 }
75 80
81 $entry->setGivenUrl($url);
82
76 $this->stockEntry($entry, $content); 83 $this->stockEntry($entry, $content);
77 } 84 }
78 85
@@ -187,8 +194,8 @@ class ContentProxy
187 /** 194 /**
188 * Try to sanitize the title of the fetched content from wrong character encodings and invalid UTF-8 character. 195 * Try to sanitize the title of the fetched content from wrong character encodings and invalid UTF-8 character.
189 * 196 *
190 * @param $title 197 * @param string $title
191 * @param $contentType 198 * @param string $contentType
192 * 199 *
193 * @return string 200 * @return string
194 */ 201 */
@@ -252,16 +259,14 @@ class ContentProxy
252 259
253 if (!empty($content['title'])) { 260 if (!empty($content['title'])) {
254 $entry->setTitle($content['title']); 261 $entry->setTitle($content['title']);
255 } elseif (!empty($content['open_graph']['og_title'])) {
256 $entry->setTitle($content['open_graph']['og_title']);
257 } 262 }
258 263
259 if (empty($content['html'])) { 264 if (empty($content['html'])) {
260 $content['html'] = $this->fetchingErrorMessage; 265 $content['html'] = $this->fetchingErrorMessage;
261 266
262 if (!empty($content['open_graph']['og_description'])) { 267 if (!empty($content['description'])) {
263 $content['html'] .= '<p><i>But we found a short description: </i></p>'; 268 $content['html'] .= '<p><i>But we found a short description: </i></p>';
264 $content['html'] .= $content['open_graph']['og_description']; 269 $content['html'] .= $content['description'];
265 } 270 }
266 } 271 }
267 272
@@ -276,8 +281,8 @@ class ContentProxy
276 $entry->setPublishedBy($content['authors']); 281 $entry->setPublishedBy($content['authors']);
277 } 282 }
278 283
279 if (!empty($content['all_headers']) && $this->storeArticleHeaders) { 284 if (!empty($content['headers'])) {
280 $entry->setHeaders($content['all_headers']); 285 $entry->setHeaders($content['headers']);
281 } 286 }
282 287
283 if (!empty($content['date'])) { 288 if (!empty($content['date'])) {
@@ -288,17 +293,30 @@ class ContentProxy
288 $this->updateLanguage($entry, $content['language']); 293 $this->updateLanguage($entry, $content['language']);
289 } 294 }
290 295
291 if (!empty($content['open_graph']['og_image'])) { 296 $previewPictureUrl = '';
292 $this->updatePreviewPicture($entry, $content['open_graph']['og_image']); 297 if (!empty($content['image'])) {
298 $previewPictureUrl = $content['image'];
293 } 299 }
294 300
295 // if content is an image, define it as a preview too 301 // if content is an image, define it as a preview too
296 if (!empty($content['content_type']) && \in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) { 302 if (!empty($content['headers']['content-type']) && \in_array($this->mimeGuesser->guess($content['headers']['content-type']), ['jpeg', 'jpg', 'gif', 'png'], true)) {
297 $this->updatePreviewPicture($entry, $content['url']); 303 $previewPictureUrl = $content['url'];
304 } elseif (empty($previewPictureUrl)) {
305 $this->logger->debug('Extracting images from content to provide a default preview picture');
306 $imagesUrls = DownloadImages::extractImagesUrlsFromHtml($content['html']);
307 $this->logger->debug(\count($imagesUrls) . ' pictures found');
308
309 if (!empty($imagesUrls)) {
310 $previewPictureUrl = $imagesUrls[0];
311 }
312 }
313
314 if (!empty($content['headers']['content-type'])) {
315 $entry->setMimetype($content['headers']['content-type']);
298 } 316 }
299 317
300 if (!empty($content['content_type'])) { 318 if (!empty($previewPictureUrl)) {
301 $entry->setMimetype($content['content_type']); 319 $this->updatePreviewPicture($entry, $previewPictureUrl);
302 } 320 }
303 321
304 try { 322 try {
diff --git a/src/Wallabag/CoreBundle/Helper/DownloadImages.php b/src/Wallabag/CoreBundle/Helper/DownloadImages.php
index 9a7e9828..1d361d6d 100644
--- a/src/Wallabag/CoreBundle/Helper/DownloadImages.php
+++ b/src/Wallabag/CoreBundle/Helper/DownloadImages.php
@@ -2,8 +2,15 @@
2 2
3namespace Wallabag\CoreBundle\Helper; 3namespace Wallabag\CoreBundle\Helper;
4 4
5use GuzzleHttp\Client; 5use GuzzleHttp\Psr7\Uri;
6use GuzzleHttp\Message\Response; 6use GuzzleHttp\Psr7\UriResolver;
7use Http\Client\Common\HttpMethodsClient;
8use Http\Client\Common\Plugin\ErrorPlugin;
9use Http\Client\Common\PluginClient;
10use Http\Client\HttpClient;
11use Http\Discovery\MessageFactoryDiscovery;
12use Http\Message\MessageFactory;
13use Psr\Http\Message\ResponseInterface;
7use Psr\Log\LoggerInterface; 14use Psr\Log\LoggerInterface;
8use Symfony\Component\DomCrawler\Crawler; 15use Symfony\Component\DomCrawler\Crawler;
9use Symfony\Component\Finder\Finder; 16use Symfony\Component\Finder\Finder;
@@ -19,9 +26,9 @@ class DownloadImages
19 private $mimeGuesser; 26 private $mimeGuesser;
20 private $wallabagUrl; 27 private $wallabagUrl;
21 28
22 public function __construct(Client $client, $baseFolder, $wallabagUrl, LoggerInterface $logger) 29 public function __construct(HttpClient $client, $baseFolder, $wallabagUrl, LoggerInterface $logger, MessageFactory $messageFactory = null)
23 { 30 {
24 $this->client = $client; 31 $this->client = new HttpMethodsClient(new PluginClient($client, [new ErrorPlugin()]), $messageFactory ?: MessageFactoryDiscovery::find());
25 $this->baseFolder = $baseFolder; 32 $this->baseFolder = $baseFolder;
26 $this->wallabagUrl = rtrim($wallabagUrl, '/'); 33 $this->wallabagUrl = rtrim($wallabagUrl, '/');
27 $this->logger = $logger; 34 $this->logger = $logger;
@@ -31,6 +38,23 @@ class DownloadImages
31 } 38 }
32 39
33 /** 40 /**
41 * Process the html and extract images URLs from it.
42 *
43 * @param string $html
44 *
45 * @return string[]
46 */
47 public static function extractImagesUrlsFromHtml($html)
48 {
49 $crawler = new Crawler($html);
50 $imagesCrawler = $crawler->filterXpath('//img');
51 $imagesUrls = $imagesCrawler->extract(['src']);
52 $imagesSrcsetUrls = self::getSrcsetUrls($imagesCrawler);
53
54 return array_unique(array_merge($imagesUrls, $imagesSrcsetUrls));
55 }
56
57 /**
34 * Process the html and extract image from it, save them to local and return the updated html. 58 * Process the html and extract image from it, save them to local and return the updated html.
35 * 59 *
36 * @param int $entryId ID of the entry 60 * @param int $entryId ID of the entry
@@ -41,13 +65,7 @@ class DownloadImages
41 */ 65 */
42 public function processHtml($entryId, $html, $url) 66 public function processHtml($entryId, $html, $url)
43 { 67 {
44 $crawler = new Crawler($html); 68 $imagesUrls = self::extractImagesUrlsFromHtml($html);
45 $imagesCrawler = $crawler
46 ->filterXpath('//img');
47 $imagesUrls = $imagesCrawler
48 ->extract(['src']);
49 $imagesSrcsetUrls = $this->getSrcsetUrls($imagesCrawler);
50 $imagesUrls = array_unique(array_merge($imagesUrls, $imagesSrcsetUrls));
51 69
52 $relativePath = $this->getRelativePath($entryId); 70 $relativePath = $this->getRelativePath($entryId);
53 71
@@ -122,7 +140,7 @@ class DownloadImages
122 $localPath = $folderPath . '/' . $hashImage . '.' . $ext; 140 $localPath = $folderPath . '/' . $hashImage . '.' . $ext;
123 141
124 try { 142 try {
125 $im = imagecreatefromstring($res->getBody()); 143 $im = imagecreatefromstring((string) $res->getBody());
126 } catch (\Exception $e) { 144 } catch (\Exception $e) {
127 $im = false; 145 $im = false;
128 } 146 }
@@ -199,25 +217,28 @@ class DownloadImages
199 * 217 *
200 * @return array An array of urls 218 * @return array An array of urls
201 */ 219 */
202 private function getSrcsetUrls(Crawler $imagesCrawler) 220 private static function getSrcsetUrls(Crawler $imagesCrawler)
203 { 221 {
204 $urls = []; 222 $urls = [];
205 $iterator = $imagesCrawler 223 $iterator = $imagesCrawler->getIterator();
206 ->getIterator(); 224
207 while ($iterator->valid()) { 225 while ($iterator->valid()) {
208 $srcsetAttribute = $iterator->current()->getAttribute('srcset'); 226 $srcsetAttribute = $iterator->current()->getAttribute('srcset');
227
209 if ('' !== $srcsetAttribute) { 228 if ('' !== $srcsetAttribute) {
210 // Couldn't start with " OR ' OR a white space 229 // Couldn't start with " OR ' OR a white space
211 // Could be one or more white space 230 // Could be one or more white space
212 // Must be one or more digits followed by w OR x 231 // Must be one or more digits followed by w OR x
213 $pattern = "/(?:[^\"'\s]+\s*(?:\d+[wx])+)/"; 232 $pattern = "/(?:[^\"'\s]+\s*(?:\d+[wx])+)/";
214 preg_match_all($pattern, $srcsetAttribute, $matches); 233 preg_match_all($pattern, $srcsetAttribute, $matches);
234
215 $srcset = \call_user_func_array('array_merge', $matches); 235 $srcset = \call_user_func_array('array_merge', $matches);
216 $srcsetUrls = array_map(function ($src) { 236 $srcsetUrls = array_map(function ($src) {
217 return trim(explode(' ', $src, 2)[0]); 237 return trim(explode(' ', $src, 2)[0]);
218 }, $srcset); 238 }, $srcset);
219 $urls = array_merge($srcsetUrls, $urls); 239 $urls = array_merge($srcsetUrls, $urls);
220 } 240 }
241
221 $iterator->next(); 242 $iterator->next();
222 } 243 }
223 244
@@ -274,33 +295,29 @@ class DownloadImages
274 return $url; 295 return $url;
275 } 296 }
276 297
277 $base = new \SimplePie_IRI($base); 298 $base = new Uri($base);
278 299
279 // remove '//' in URL path (causes URLs not to resolve properly) 300 // in case the url has no scheme & host
280 if (isset($base->ipath)) { 301 if ('' === $base->getAuthority() || '' === $base->getScheme()) {
281 $base->ipath = preg_replace('!//+!', '/', $base->ipath); 302 $this->logger->error('DownloadImages: Can not make an absolute link', ['base' => $base, 'url' => $url]);
282 }
283 303
284 if ($absolute = \SimplePie_IRI::absolutize($base, $url)) { 304 return false;
285 return $absolute->get_uri();
286 } 305 }
287 306
288 $this->logger->error('DownloadImages: Can not make an absolute link', ['base' => $base, 'url' => $url]); 307 return (string) UriResolver::resolve($base, new Uri($url));
289
290 return false;
291 } 308 }
292 309
293 /** 310 /**
294 * Retrieve and validate the extension from the response of the url of the image. 311 * Retrieve and validate the extension from the response of the url of the image.
295 * 312 *
296 * @param Response $res Guzzle Response 313 * @param ResponseInterface $res Http Response
297 * @param string $imagePath Path from the src image from the content (used for log only) 314 * @param string $imagePath Path from the src image from the content (used for log only)
298 * 315 *
299 * @return string|false Extension name or false if validation failed 316 * @return string|false Extension name or false if validation failed
300 */ 317 */
301 private function getExtensionFromResponse(Response $res, $imagePath) 318 private function getExtensionFromResponse(ResponseInterface $res, $imagePath)
302 { 319 {
303 $ext = $this->mimeGuesser->guess($res->getHeader('content-type')); 320 $ext = $this->mimeGuesser->guess(current($res->getHeader('content-type')));
304 $this->logger->debug('DownloadImages: Checking extension', ['ext' => $ext, 'header' => $res->getHeader('content-type')]); 321 $this->logger->debug('DownloadImages: Checking extension', ['ext' => $ext, 'header' => $res->getHeader('content-type')]);
305 322
306 // ok header doesn't have the extension, try a different way 323 // ok header doesn't have the extension, try a different way
diff --git a/src/Wallabag/CoreBundle/Helper/HttpClientFactory.php b/src/Wallabag/CoreBundle/Helper/HttpClientFactory.php
index 4602a684..b8e95381 100644
--- a/src/Wallabag/CoreBundle/Helper/HttpClientFactory.php
+++ b/src/Wallabag/CoreBundle/Helper/HttpClientFactory.php
@@ -2,16 +2,18 @@
2 2
3namespace Wallabag\CoreBundle\Helper; 3namespace Wallabag\CoreBundle\Helper;
4 4
5use Graby\Ring\Client\SafeCurlHandler; 5use GuzzleHttp\Client as GuzzleClient;
6use GuzzleHttp\Client;
7use GuzzleHttp\Cookie\CookieJar; 6use GuzzleHttp\Cookie\CookieJar;
8use GuzzleHttp\Event\SubscriberInterface; 7use GuzzleHttp\Event\SubscriberInterface;
8use Http\Adapter\Guzzle5\Client as GuzzleAdapter;
9use Http\Client\HttpClient;
10use Http\HttplugBundle\ClientFactory\ClientFactory;
9use Psr\Log\LoggerInterface; 11use Psr\Log\LoggerInterface;
10 12
11/** 13/**
12 * Builds and configures the Guzzle HTTP client. 14 * Builds and configures the HTTP client.
13 */ 15 */
14class HttpClientFactory 16class HttpClientFactory implements ClientFactory
15{ 17{
16 /** @var [\GuzzleHttp\Event\SubscriberInterface] */ 18 /** @var [\GuzzleHttp\Event\SubscriberInterface] */
17 private $subscribers = []; 19 private $subscribers = [];
@@ -37,35 +39,42 @@ class HttpClientFactory
37 } 39 }
38 40
39 /** 41 /**
40 * @return \GuzzleHttp\Client|null 42 * Adds a subscriber to the HTTP client.
43 *
44 * @param SubscriberInterface $subscriber
45 */
46 public function addSubscriber(SubscriberInterface $subscriber)
47 {
48 $this->subscribers[] = $subscriber;
49 }
50
51 /**
52 * Input an array of configuration to be able to create a HttpClient.
53 *
54 * @param array $config
55 *
56 * @return HttpClient
41 */ 57 */
42 public function buildHttpClient() 58 public function createClient(array $config = [])
43 { 59 {
44 $this->logger->log('debug', 'Restricted access config enabled?', ['enabled' => (int) $this->restrictedAccess]); 60 $this->logger->log('debug', 'Restricted access config enabled?', ['enabled' => (int) $this->restrictedAccess]);
45 61
46 if (0 === (int) $this->restrictedAccess) { 62 if (0 === (int) $this->restrictedAccess) {
47 return; 63 return new GuzzleAdapter(new GuzzleClient($config));
48 } 64 }
49 65
50 // we clear the cookie to avoid websites who use cookies for analytics 66 // we clear the cookie to avoid websites who use cookies for analytics
51 $this->cookieJar->clear(); 67 $this->cookieJar->clear();
52 // need to set the (shared) cookie jar 68 if (!isset($config['defaults']['cookies'])) {
53 $client = new Client(['handler' => new SafeCurlHandler(), 'defaults' => ['cookies' => $this->cookieJar]]); 69 // need to set the (shared) cookie jar
70 $config['defaults']['cookies'] = $this->cookieJar;
71 }
54 72
73 $guzzle = new GuzzleClient($config);
55 foreach ($this->subscribers as $subscriber) { 74 foreach ($this->subscribers as $subscriber) {
56 $client->getEmitter()->attach($subscriber); 75 $guzzle->getEmitter()->attach($subscriber);
57 } 76 }
58 77
59 return $client; 78 return new GuzzleAdapter($guzzle);
60 }
61
62 /**
63 * Adds a subscriber to the HTTP client.
64 *
65 * @param SubscriberInterface $subscriber
66 */
67 public function addSubscriber(SubscriberInterface $subscriber)
68 {
69 $this->subscribers[] = $subscriber;
70 } 79 }
71} 80}
diff --git a/src/Wallabag/CoreBundle/Helper/UrlHasher.php b/src/Wallabag/CoreBundle/Helper/UrlHasher.php
new file mode 100644
index 00000000..d123eaba
--- /dev/null
+++ b/src/Wallabag/CoreBundle/Helper/UrlHasher.php
@@ -0,0 +1,23 @@
1<?php
2
3namespace Wallabag\CoreBundle\Helper;
4
5/**
6 * Hash URLs for privacy and performance.
7 */
8class UrlHasher
9{
10 /**
11 * Hash the given url using the given algorithm.
12 * Hashed url are faster to be retrieved in the database than the real url.
13 *
14 * @param string $url
15 * @param string $algorithm
16 *
17 * @return string
18 */
19 public static function hashUrl(string $url, $algorithm = 'sha1')
20 {
21 return hash($algorithm, urldecode($url));
22 }
23}
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
index f5089729..16c44885 100644
--- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
@@ -9,6 +9,7 @@ use Pagerfanta\Adapter\DoctrineORMAdapter;
9use Pagerfanta\Pagerfanta; 9use Pagerfanta\Pagerfanta;
10use Wallabag\CoreBundle\Entity\Entry; 10use Wallabag\CoreBundle\Entity\Entry;
11use Wallabag\CoreBundle\Entity\Tag; 11use Wallabag\CoreBundle\Entity\Tag;
12use Wallabag\CoreBundle\Helper\UrlHasher;
12 13
13class EntryRepository extends EntityRepository 14class EntryRepository extends EntityRepository
14{ 15{
@@ -139,15 +140,30 @@ class EntryRepository extends EntityRepository
139 * @param string $order 140 * @param string $order
140 * @param int $since 141 * @param int $since
141 * @param string $tags 142 * @param string $tags
143 * @param string $detail 'metadata' or 'full'. Include content field if 'full'
144 *
145 * @todo Breaking change: replace default detail=full by detail=metadata in a future version
142 * 146 *
143 * @return Pagerfanta 147 * @return Pagerfanta
144 */ 148 */
145 public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '') 149 public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '', $detail = 'full')
146 { 150 {
151 if (!\in_array(strtolower($detail), ['full', 'metadata'], true)) {
152 throw new \Exception('Detail "' . $detail . '" parameter is wrong, allowed: full or metadata');
153 }
154
147 $qb = $this->createQueryBuilder('e') 155 $qb = $this->createQueryBuilder('e')
148 ->leftJoin('e.tags', 't') 156 ->leftJoin('e.tags', 't')
149 ->where('e.user = :userId')->setParameter('userId', $userId); 157 ->where('e.user = :userId')->setParameter('userId', $userId);
150 158
159 if ('metadata' === $detail) {
160 $fieldNames = $this->getClassMetadata()->getFieldNames();
161 $fields = array_filter($fieldNames, function ($k) {
162 return 'content' !== $k;
163 });
164 $qb->select(sprintf('partial e.{%s}', implode(',', $fields)));
165 }
166
151 if (null !== $isArchived) { 167 if (null !== $isArchived) {
152 $qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived); 168 $qb->andWhere('e.isArchived = :isArchived')->setParameter('isArchived', (bool) $isArchived);
153 } 169 }
@@ -329,21 +345,14 @@ class EntryRepository extends EntityRepository
329 * @param string $url 345 * @param string $url
330 * @param int $userId 346 * @param int $userId
331 * 347 *
332 * @return Entry|bool 348 * @return Entry|false
333 */ 349 */
334 public function findByUrlAndUserId($url, $userId) 350 public function findByUrlAndUserId($url, $userId)
335 { 351 {
336 $res = $this->createQueryBuilder('e') 352 return $this->findByHashedUrlAndUserId(
337 ->where('e.url = :url')->setParameter('url', urldecode($url)) 353 UrlHasher::hashUrl($url),
338 ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) 354 $userId
339 ->getQuery() 355 );
340 ->getResult();
341
342 if (\count($res)) {
343 return current($res);
344 }
345
346 return false;
347 } 356 }
348 357
349 /** 358 /**
@@ -353,10 +362,11 @@ class EntryRepository extends EntityRepository
353 * @param string $hashedUrl Url hashed using sha1 362 * @param string $hashedUrl Url hashed using sha1
354 * @param int $userId 363 * @param int $userId
355 * 364 *
356 * @return Entry|bool 365 * @return Entry|false
357 */ 366 */
358 public function findByHashedUrlAndUserId($hashedUrl, $userId) 367 public function findByHashedUrlAndUserId($hashedUrl, $userId)
359 { 368 {
369 // try first using hashed_url (to use the database index)
360 $res = $this->createQueryBuilder('e') 370 $res = $this->createQueryBuilder('e')
361 ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl) 371 ->where('e.hashedUrl = :hashed_url')->setParameter('hashed_url', $hashedUrl)
362 ->andWhere('e.user = :user_id')->setParameter('user_id', $userId) 372 ->andWhere('e.user = :user_id')->setParameter('user_id', $userId)
@@ -367,6 +377,17 @@ class EntryRepository extends EntityRepository
367 return current($res); 377 return current($res);
368 } 378 }
369 379
380 // then try using hashed_given_url (to use the database index)
381 $res = $this->createQueryBuilder('e')
382 ->where('e.hashedGivenUrl = :hashed_given_url')->setParameter('hashed_given_url', $hashedUrl)
383 ->andWhere('e.user = :user_id')->setParameter('user_id', $userId)
384 ->getQuery()
385 ->getResult();
386
387 if (\count($res)) {
388 return current($res);
389 }
390
370 return false; 391 return false;
371 } 392 }
372 393
diff --git a/src/Wallabag/CoreBundle/Repository/SiteCredentialRepository.php b/src/Wallabag/CoreBundle/Repository/SiteCredentialRepository.php
index b2e212a4..aeadd770 100644
--- a/src/Wallabag/CoreBundle/Repository/SiteCredentialRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/SiteCredentialRepository.php
@@ -19,16 +19,16 @@ class SiteCredentialRepository extends \Doctrine\ORM\EntityRepository
19 /** 19 /**
20 * Retrieve one username/password for the given host and userId. 20 * Retrieve one username/password for the given host and userId.
21 * 21 *
22 * @param string $host 22 * @param array $hosts An array of host to look for
23 * @param int $userId 23 * @param int $userId
24 * 24 *
25 * @return array|null 25 * @return array|null
26 */ 26 */
27 public function findOneByHostAndUser($host, $userId) 27 public function findOneByHostsAndUser($hosts, $userId)
28 { 28 {
29 $res = $this->createQueryBuilder('s') 29 $res = $this->createQueryBuilder('s')
30 ->select('s.username', 's.password') 30 ->select('s.username', 's.password')
31 ->where('s.host = :hostname')->setParameter('hostname', $host) 31 ->where('s.host IN (:hosts)')->setParameter('hosts', $hosts)
32 ->andWhere('s.user = :userId')->setParameter('userId', $userId) 32 ->andWhere('s.user = :userId')->setParameter('userId', $userId)
33 ->setMaxResults(1) 33 ->setMaxResults(1)
34 ->getQuery() 34 ->getQuery()
diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml
index 280d779d..31986951 100644
--- a/src/Wallabag/CoreBundle/Resources/config/services.yml
+++ b/src/Wallabag/CoreBundle/Resources/config/services.yml
@@ -42,7 +42,7 @@ services:
42 - 42 -
43 error_message: '%wallabag_core.fetching_error_message%' 43 error_message: '%wallabag_core.fetching_error_message%'
44 error_message_title: '%wallabag_core.fetching_error_message_title%' 44 error_message_title: '%wallabag_core.fetching_error_message_title%'
45 - "@wallabag_core.guzzle.http_client" 45 - "@wallabag_core.http_client"
46 - "@wallabag_core.graby.config_builder" 46 - "@wallabag_core.graby.config_builder"
47 calls: 47 calls:
48 - [ setLogger, [ "@logger" ] ] 48 - [ setLogger, [ "@logger" ] ]
@@ -55,9 +55,8 @@ services:
55 - {} 55 - {}
56 - "@logger" 56 - "@logger"
57 57
58 wallabag_core.guzzle.http_client: 58 wallabag_core.http_client:
59 class: GuzzleHttp\ClientInterface 59 alias: 'httplug.client.wallabag_core'
60 factory: ["@wallabag_core.guzzle.http_client_factory", buildHttpClient]
61 60
62 wallabag_core.guzzle_authenticator.config_builder: 61 wallabag_core.guzzle_authenticator.config_builder:
63 class: Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder 62 class: Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder
@@ -73,7 +72,7 @@ services:
73 bd_guzzle_site_authenticator.site_config_builder: 72 bd_guzzle_site_authenticator.site_config_builder:
74 alias: wallabag_core.guzzle_authenticator.config_builder 73 alias: wallabag_core.guzzle_authenticator.config_builder
75 74
76 wallabag_core.guzzle.http_client_factory: 75 wallabag_core.http_client_factory:
77 class: Wallabag\CoreBundle\Helper\HttpClientFactory 76 class: Wallabag\CoreBundle\Helper\HttpClientFactory
78 arguments: 77 arguments:
79 - "@wallabag_core.guzzle.cookie_jar" 78 - "@wallabag_core.guzzle.cookie_jar"
@@ -212,7 +211,7 @@ services:
212 - "@logger" 211 - "@logger"
213 212
214 wallabag_core.entry.download_images.client: 213 wallabag_core.entry.download_images.client:
215 class: GuzzleHttp\Client 214 alias: 'httplug.client.wallabag_core.entry.download_images'
216 215
217 wallabag_core.helper.crypto_proxy: 216 wallabag_core.helper.crypto_proxy:
218 class: Wallabag\CoreBundle\Helper\CryptoProxy 217 class: Wallabag\CoreBundle\Helper\CryptoProxy
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
index 61ef3b8f..c6a91cd1 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.da.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Tilbage til de ulæste artikler' 33 back_to_unread: 'Tilbage til de ulæste artikler'
34 # users_management: 'Users management' 34 # users_management: 'Users management'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 # quickstart: "Quickstart"
36 top: 37 top:
37 add_new_entry: 'Tilføj ny artikel' 38 add_new_entry: 'Tilføj ny artikel'
38 search: 'Søg' 39 search: 'Søg'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Intet token' 92 no_token: 'Intet token'
92 token_create: 'Opret token' 93 token_create: 'Opret token'
93 token_reset: 'Nulstil token' 94 token_reset: 'Nulstil token'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'RSS-Links' 96 feed_links: 'RSS-Links'
95 feed_link: 97 feed_link:
96 unread: 'Ulæst' 98 unread: 'Ulæst'
@@ -572,7 +574,7 @@ site_credential:
572 # create_new_one: Create a new credential 574 # create_new_one: Create a new credential
573 # form: 575 # form:
574 # username_label: 'Username' 576 # username_label: 'Username'
575 # host_label: 'Host' 577 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
576 # password_label: 'Password' 578 # password_label: 'Password'
577 # save: Save 579 # save: Save
578 # delete: Delete 580 # delete: Delete
@@ -593,6 +595,7 @@ flashes:
593 # tagging_rules_updated: 'Tagging rules updated' 595 # tagging_rules_updated: 'Tagging rules updated'
594 # tagging_rules_deleted: 'Tagging rule deleted' 596 # tagging_rules_deleted: 'Tagging rule deleted'
595 # feed_token_updated: 'RSS token updated' 597 # feed_token_updated: 'RSS token updated'
598 # feed_token_revoked: 'RSS token revoked'
596 # annotations_reset: Annotations reset 599 # annotations_reset: Annotations reset
597 # tags_reset: Tags reset 600 # tags_reset: Tags reset
598 # entries_reset: Entries reset 601 # entries_reset: Entries reset
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
index 991e00f1..4b785306 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.de.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Zurück zu ungelesenen Artikeln' 33 back_to_unread: 'Zurück zu ungelesenen Artikeln'
34 users_management: 'Benutzerverwaltung' 34 users_management: 'Benutzerverwaltung'
35 site_credentials: 'Zugangsdaten' 35 site_credentials: 'Zugangsdaten'
36 quickstart: "Schnelleinstieg"
36 top: 37 top:
37 add_new_entry: 'Neuen Artikel hinzufügen' 38 add_new_entry: 'Neuen Artikel hinzufügen'
38 search: 'Suche' 39 search: 'Suche'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Kein Token' 92 no_token: 'Kein Token'
92 token_create: 'Token erstellen' 93 token_create: 'Token erstellen'
93 token_reset: 'Token zurücksetzen' 94 token_reset: 'Token zurücksetzen'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'RSS-Links' 96 feed_links: 'RSS-Links'
95 feed_link: 97 feed_link:
96 unread: 'Ungelesene' 98 unread: 'Ungelesene'
@@ -563,7 +565,7 @@ site_credential:
563 create_new_one: 'Einen neuen Seitenzugang anlegen' 565 create_new_one: 'Einen neuen Seitenzugang anlegen'
564 form: 566 form:
565 username_label: 'Benutzername' 567 username_label: 'Benutzername'
566 host_label: 'Host' 568 host_label: 'Host (subdomain.example.org, .example.org, etc.)'
567 password_label: 'Passwort' 569 password_label: 'Passwort'
568 save: 'Speichern' 570 save: 'Speichern'
569 delete: 'Löschen' 571 delete: 'Löschen'
@@ -584,6 +586,7 @@ flashes:
584 tagging_rules_updated: 'Tagging-Regeln aktualisiert' 586 tagging_rules_updated: 'Tagging-Regeln aktualisiert'
585 tagging_rules_deleted: 'Tagging-Regel gelöscht' 587 tagging_rules_deleted: 'Tagging-Regel gelöscht'
586 feed_token_updated: 'RSS-Token aktualisiert' 588 feed_token_updated: 'RSS-Token aktualisiert'
589 # feed_token_revoked: 'RSS token revoked'
587 annotations_reset: Anmerkungen zurücksetzen 590 annotations_reset: Anmerkungen zurücksetzen
588 tags_reset: Tags zurücksetzen 591 tags_reset: Tags zurücksetzen
589 entries_reset: Einträge zurücksetzen 592 entries_reset: Einträge zurücksetzen
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
index 5b875652..1f8c47aa 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.en.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Back to unread articles' 33 back_to_unread: 'Back to unread articles'
34 users_management: 'Users management' 34 users_management: 'Users management'
35 site_credentials: 'Site credentials' 35 site_credentials: 'Site credentials'
36 quickstart: "Quickstart"
36 top: 37 top:
37 add_new_entry: 'Add a new entry' 38 add_new_entry: 'Add a new entry'
38 search: 'Search' 39 search: 'Search'
@@ -91,6 +92,7 @@ config:
91 no_token: 'No token' 92 no_token: 'No token'
92 token_create: 'Create your token' 93 token_create: 'Create your token'
93 token_reset: 'Regenerate your token' 94 token_reset: 'Regenerate your token'
95 token_revoke: 'Revoke the token'
94 feed_links: 'Feed links' 96 feed_links: 'Feed links'
95 feed_link: 97 feed_link:
96 unread: 'Unread' 98 unread: 'Unread'
@@ -572,7 +574,7 @@ site_credential:
572 create_new_one: Create a new credential 574 create_new_one: Create a new credential
573 form: 575 form:
574 username_label: 'Username' 576 username_label: 'Username'
575 host_label: 'Host' 577 host_label: 'Host (subdomain.example.org, .example.org, etc.)'
576 password_label: 'Password' 578 password_label: 'Password'
577 save: Save 579 save: Save
578 delete: Delete 580 delete: Delete
@@ -593,6 +595,7 @@ flashes:
593 tagging_rules_updated: 'Tagging rules updated' 595 tagging_rules_updated: 'Tagging rules updated'
594 tagging_rules_deleted: 'Tagging rule deleted' 596 tagging_rules_deleted: 'Tagging rule deleted'
595 feed_token_updated: 'Feed token updated' 597 feed_token_updated: 'Feed token updated'
598 feed_token_revoked: 'RSS token revoked'
596 annotations_reset: Annotations reset 599 annotations_reset: Annotations reset
597 tags_reset: Tags reset 600 tags_reset: Tags reset
598 entries_reset: Entries reset 601 entries_reset: Entries reset
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
index 562b4191..06fa1e48 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.es.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Volver a los artículos sin leer' 33 back_to_unread: 'Volver a los artículos sin leer'
34 users_management: 'Configuración de usuarios' 34 users_management: 'Configuración de usuarios'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 quickstart: "Inicio rápido"
36 top: 37 top:
37 add_new_entry: 'Añadir un nuevo artículo' 38 add_new_entry: 'Añadir un nuevo artículo'
38 search: 'Buscar' 39 search: 'Buscar'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Sin token' 92 no_token: 'Sin token'
92 token_create: 'Crear token' 93 token_create: 'Crear token'
93 token_reset: 'Reiniciar token' 94 token_reset: 'Reiniciar token'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'URLs de feeds RSS' 96 feed_links: 'URLs de feeds RSS'
95 feed_link: 97 feed_link:
96 unread: 'sin leer' 98 unread: 'sin leer'
@@ -572,7 +574,7 @@ site_credential:
572 # create_new_one: Create a new credential 574 # create_new_one: Create a new credential
573 # form: 575 # form:
574 # username_label: 'Username' 576 # username_label: 'Username'
575 # host_label: 'Host' 577 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
576 # password_label: 'Password' 578 # password_label: 'Password'
577 # save: Save 579 # save: Save
578 # delete: Delete 580 # delete: Delete
@@ -593,6 +595,7 @@ flashes:
593 tagging_rules_updated: 'Regla de etiquetado actualizada' 595 tagging_rules_updated: 'Regla de etiquetado actualizada'
594 tagging_rules_deleted: 'Regla de etiquetado eliminada' 596 tagging_rules_deleted: 'Regla de etiquetado eliminada'
595 feed_token_updated: 'Token RSS actualizado' 597 feed_token_updated: 'Token RSS actualizado'
598 # feed_token_revoked: 'RSS token revoked'
596 annotations_reset: Anotaciones reiniciadas 599 annotations_reset: Anotaciones reiniciadas
597 tags_reset: Etiquetas reiniciadas 600 tags_reset: Etiquetas reiniciadas
598 entries_reset: Artículos reiniciados 601 entries_reset: Artículos reiniciados
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
index f360e0d6..5c1eaccc 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fa.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'بازگشت به خوانده‌نشده‌ها' 33 back_to_unread: 'بازگشت به خوانده‌نشده‌ها'
34 # users_management: 'Users management' 34 # users_management: 'Users management'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 quickstart: "Quickstart"
36 top: 37 top:
37 add_new_entry: 'افزودن مقالهٔ تازه' 38 add_new_entry: 'افزودن مقالهٔ تازه'
38 search: 'جستجو' 39 search: 'جستجو'
@@ -91,6 +92,7 @@ config:
91 no_token: 'بدون کد' 92 no_token: 'بدون کد'
92 token_create: 'کد خود را بسازید' 93 token_create: 'کد خود را بسازید'
93 token_reset: 'بازنشانی کد' 94 token_reset: 'بازنشانی کد'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'پیوند آر-اس-اس' 96 feed_links: 'پیوند آر-اس-اس'
95 feed_link: 97 feed_link:
96 unread: 'خوانده‌نشده' 98 unread: 'خوانده‌نشده'
@@ -572,7 +574,7 @@ site_credential:
572 # create_new_one: Create a new credential 574 # create_new_one: Create a new credential
573 # form: 575 # form:
574 # username_label: 'Username' 576 # username_label: 'Username'
575 # host_label: 'Host' 577 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
576 # password_label: 'Password' 578 # password_label: 'Password'
577 # save: Save 579 # save: Save
578 # delete: Delete 580 # delete: Delete
@@ -593,6 +595,7 @@ flashes:
593 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد' 595 tagging_rules_updated: 'برچسب‌گذاری خودکار به‌روز شد'
594 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد' 596 tagging_rules_deleted: 'قانون برچسب‌گذاری پاک شد'
595 feed_token_updated: 'کد آر-اس-اس به‌روز شد' 597 feed_token_updated: 'کد آر-اس-اس به‌روز شد'
598 # feed_token_revoked: 'RSS token revoked'
596 # annotations_reset: Annotations reset 599 # annotations_reset: Annotations reset
597 # tags_reset: Tags reset 600 # tags_reset: Tags reset
598 # entries_reset: Entries reset 601 # entries_reset: Entries reset
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
index 79f15154..09c1cc8f 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: "Retour aux articles non lus" 33 back_to_unread: "Retour aux articles non lus"
34 users_management: "Gestion des utilisateurs" 34 users_management: "Gestion des utilisateurs"
35 site_credentials: 'Accès aux sites' 35 site_credentials: 'Accès aux sites'
36 quickstart: "Pour bien débuter"
36 top: 37 top:
37 add_new_entry: "Sauvegarder un nouvel article" 38 add_new_entry: "Sauvegarder un nouvel article"
38 search: "Rechercher" 39 search: "Rechercher"
@@ -91,6 +92,7 @@ config:
91 no_token: "Aucun jeton généré" 92 no_token: "Aucun jeton généré"
92 token_create: "Créez votre jeton" 93 token_create: "Créez votre jeton"
93 token_reset: "Réinitialisez votre jeton" 94 token_reset: "Réinitialisez votre jeton"
95 token_revoke: 'Supprimer le jeton'
94 feed_links: "Adresses de vos flux" 96 feed_links: "Adresses de vos flux"
95 feed_link: 97 feed_link:
96 unread: "Non lus" 98 unread: "Non lus"
@@ -573,7 +575,7 @@ site_credential:
573 create_new_one: Créer un nouvel accès à un site 575 create_new_one: Créer un nouvel accès à un site
574 form: 576 form:
575 username_label: 'Identifiant' 577 username_label: 'Identifiant'
576 host_label: 'Domaine' 578 host_label: 'Domaine (subdomain.example.org, .example.org, etc.)'
577 password_label: 'Mot de passe' 579 password_label: 'Mot de passe'
578 save: "Sauvegarder" 580 save: "Sauvegarder"
579 delete: "Supprimer" 581 delete: "Supprimer"
@@ -594,6 +596,7 @@ flashes:
594 tagging_rules_updated: "Règles mises à jour" 596 tagging_rules_updated: "Règles mises à jour"
595 tagging_rules_deleted: "Règle supprimée" 597 tagging_rules_deleted: "Règle supprimée"
596 feed_token_updated: "Jeton des flux mis à jour" 598 feed_token_updated: "Jeton des flux mis à jour"
599 feed_token_revoked: 'Jeton des flux supprimé'
597 annotations_reset: "Annotations supprimées" 600 annotations_reset: "Annotations supprimées"
598 tags_reset: "Tags supprimés" 601 tags_reset: "Tags supprimés"
599 entries_reset: "Articles supprimés" 602 entries_reset: "Articles supprimés"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
index daef359f..92f2415b 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.it.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Torna ai contenuti non letti' 33 back_to_unread: 'Torna ai contenuti non letti'
34 users_management: 'Gestione utenti' 34 users_management: 'Gestione utenti'
35 site_credentials: 'Credenziali sito' 35 site_credentials: 'Credenziali sito'
36 quickstart: "Introduzione"
36 top: 37 top:
37 add_new_entry: 'Aggiungi un nuovo contenuto' 38 add_new_entry: 'Aggiungi un nuovo contenuto'
38 search: 'Cerca' 39 search: 'Cerca'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Nessun token' 92 no_token: 'Nessun token'
92 token_create: 'Crea il tuo token' 93 token_create: 'Crea il tuo token'
93 token_reset: 'Rigenera il tuo token' 94 token_reset: 'Rigenera il tuo token'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'Collegamenti RSS' 96 feed_links: 'Collegamenti RSS'
95 feed_link: 97 feed_link:
96 unread: 'Non letti' 98 unread: 'Non letti'
@@ -571,7 +573,7 @@ site_credential:
571 # create_new_one: Create a new credential 573 # create_new_one: Create a new credential
572 # form: 574 # form:
573 # username_label: 'Username' 575 # username_label: 'Username'
574 # host_label: 'Host' 576 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
575 # password_label: 'Password' 577 # password_label: 'Password'
576 # save: Save 578 # save: Save
577 # delete: Delete 579 # delete: Delete
@@ -592,6 +594,7 @@ flashes:
592 tagging_rules_updated: 'Regole di etichettatura aggiornate' 594 tagging_rules_updated: 'Regole di etichettatura aggiornate'
593 tagging_rules_deleted: 'Regola di etichettatura eliminate' 595 tagging_rules_deleted: 'Regola di etichettatura eliminate'
594 feed_token_updated: 'RSS token aggiornato' 596 feed_token_updated: 'RSS token aggiornato'
597 # feed_token_revoked: 'RSS token revoked'
595 annotations_reset: Reset annotazioni 598 annotations_reset: Reset annotazioni
596 tags_reset: Reset etichette 599 tags_reset: Reset etichette
597 entries_reset: Reset articoli 600 entries_reset: Reset articoli
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
index 980ddeb4..4439cbcd 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.oc.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Tornar als articles pas legits' 33 back_to_unread: 'Tornar als articles pas legits'
34 users_management: 'Gestion dels utilizaires' 34 users_management: 'Gestion dels utilizaires'
35 site_credentials: 'Identificants del site' 35 site_credentials: 'Identificants del site'
36 quickstart: "Per ben començar"
36 top: 37 top:
37 add_new_entry: 'Enregistrar un novèl article' 38 add_new_entry: 'Enregistrar un novèl article'
38 search: 'Cercar' 39 search: 'Cercar'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Pas cap de geton generat' 92 no_token: 'Pas cap de geton generat'
92 token_create: 'Creatz vòstre geton' 93 token_create: 'Creatz vòstre geton'
93 token_reset: 'Reïnicializatz vòstre geton' 94 token_reset: 'Reïnicializatz vòstre geton'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'URLs de vòstres fluxes RSS' 96 feed_links: 'URLs de vòstres fluxes RSS'
95 feed_link: 97 feed_link:
96 unread: 'Pas legits' 98 unread: 'Pas legits'
@@ -571,7 +573,7 @@ site_credential:
571 create_new_one: Crear un novèl identificant 573 create_new_one: Crear un novèl identificant
572 form: 574 form:
573 username_label: "Nom d'utilizaire" 575 username_label: "Nom d'utilizaire"
574 host_label: 'Òste' 576 host_label: 'Òste (subdomain.example.org, .example.org, etc.)'
575 password_label: 'Senhal' 577 password_label: 'Senhal'
576 save: 'Enregistrar' 578 save: 'Enregistrar'
577 delete: 'Suprimir' 579 delete: 'Suprimir'
@@ -592,6 +594,7 @@ flashes:
592 tagging_rules_updated: 'Règlas misa a jorn' 594 tagging_rules_updated: 'Règlas misa a jorn'
593 tagging_rules_deleted: 'Règla suprimida' 595 tagging_rules_deleted: 'Règla suprimida'
594 feed_token_updated: 'Geton RSS mes a jorn' 596 feed_token_updated: 'Geton RSS mes a jorn'
597 # feed_token_revoked: 'RSS token revoked'
595 annotations_reset: Anotacions levadas 598 annotations_reset: Anotacions levadas
596 tags_reset: Etiquetas levadas 599 tags_reset: Etiquetas levadas
597 entries_reset: Articles levats 600 entries_reset: Articles levats
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
index 3813ac37..8311770f 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pl.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Powrót do nieprzeczytanych artykułów' 33 back_to_unread: 'Powrót do nieprzeczytanych artykułów'
34 users_management: 'Zarządzanie użytkownikami' 34 users_management: 'Zarządzanie użytkownikami'
35 site_credentials: 'Poświadczenia strony' 35 site_credentials: 'Poświadczenia strony'
36 quickstart: "Szybki start"
36 top: 37 top:
37 add_new_entry: 'Dodaj nowy wpis' 38 add_new_entry: 'Dodaj nowy wpis'
38 search: 'Szukaj' 39 search: 'Szukaj'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Brak tokena' 92 no_token: 'Brak tokena'
92 token_create: 'Stwórz tokena' 93 token_create: 'Stwórz tokena'
93 token_reset: 'Zresetuj swojego tokena' 94 token_reset: 'Zresetuj swojego tokena'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'RSS links' 96 feed_links: 'RSS links'
95 feed_link: 97 feed_link:
96 unread: 'Nieprzeczytane' 98 unread: 'Nieprzeczytane'
@@ -571,7 +573,7 @@ site_credential:
571 create_new_one: Stwórz nowe poświadczenie 573 create_new_one: Stwórz nowe poświadczenie
572 form: 574 form:
573 username_label: 'Nazwa użytkownika' 575 username_label: 'Nazwa użytkownika'
574 host_label: 'Host' 576 host_label: 'Host (subdomain.example.org, .example.org, etc.)'
575 password_label: 'Hasło' 577 password_label: 'Hasło'
576 save: Zapisz 578 save: Zapisz
577 delete: Usuń 579 delete: Usuń
@@ -592,6 +594,7 @@ flashes:
592 tagging_rules_updated: 'Reguły tagowania zaktualizowane' 594 tagging_rules_updated: 'Reguły tagowania zaktualizowane'
593 tagging_rules_deleted: 'Reguła tagowania usunięta' 595 tagging_rules_deleted: 'Reguła tagowania usunięta'
594 feed_token_updated: 'Token kanału RSS zaktualizowany' 596 feed_token_updated: 'Token kanału RSS zaktualizowany'
597 # feed_token_revoked: 'RSS token revoked'
595 annotations_reset: Zresetuj adnotacje 598 annotations_reset: Zresetuj adnotacje
596 tags_reset: Zresetuj tagi 599 tags_reset: Zresetuj tagi
597 entries_reset: Zresetuj wpisy 600 entries_reset: Zresetuj wpisy
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
index 96943c05..c83bf6c1 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.pt.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Voltar para os artigos não lidos' 33 back_to_unread: 'Voltar para os artigos não lidos'
34 users_management: 'Gestão de Usuários' 34 users_management: 'Gestão de Usuários'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 quickstart: "Começo Rápido"
36 top: 37 top:
37 add_new_entry: 'Adicionar uma nova entrada' 38 add_new_entry: 'Adicionar uma nova entrada'
38 search: 'Pesquisa' 39 search: 'Pesquisa'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Nenhum Token' 92 no_token: 'Nenhum Token'
92 token_create: 'Criar seu token' 93 token_create: 'Criar seu token'
93 token_reset: 'Gerar novamente seu token' 94 token_reset: 'Gerar novamente seu token'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'Links RSS' 96 feed_links: 'Links RSS'
95 feed_link: 97 feed_link:
96 unread: 'Não lido' 98 unread: 'Não lido'
@@ -571,7 +573,7 @@ site_credential:
571 # create_new_one: Create a new credential 573 # create_new_one: Create a new credential
572 form: 574 form:
573 # username_label: 'Username' 575 # username_label: 'Username'
574 # host_label: 'Host' 576 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
575 # password_label: 'Password' 577 # password_label: 'Password'
576 save: 'Salvar' 578 save: 'Salvar'
577 delete: 'Apagar' 579 delete: 'Apagar'
@@ -592,6 +594,7 @@ flashes:
592 tagging_rules_updated: 'Regras de tags atualizadas' 594 tagging_rules_updated: 'Regras de tags atualizadas'
593 tagging_rules_deleted: 'Regra de tag apagada' 595 tagging_rules_deleted: 'Regra de tag apagada'
594 feed_token_updated: 'Token RSS atualizado' 596 feed_token_updated: 'Token RSS atualizado'
597 # feed_token_revoked: 'RSS token revoked'
595 # annotations_reset: Annotations reset 598 # annotations_reset: Annotations reset
596 # tags_reset: Tags reset 599 # tags_reset: Tags reset
597 # entries_reset: Entries reset 600 # entries_reset: Entries reset
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
index 0ce11e74..c8bf8083 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ro.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Înapoi la articolele necitite' 33 back_to_unread: 'Înapoi la articolele necitite'
34 # users_management: 'Users management' 34 # users_management: 'Users management'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 # quickstart: "Quickstart"
36 top: 37 top:
37 add_new_entry: 'Introdu un nou articol' 38 add_new_entry: 'Introdu un nou articol'
38 search: 'Căutare' 39 search: 'Căutare'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Fără token' 92 no_token: 'Fără token'
92 token_create: 'Crează-ți token' 93 token_create: 'Crează-ți token'
93 token_reset: 'Resetează-ți token-ul' 94 token_reset: 'Resetează-ți token-ul'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'Link-uri RSS' 96 feed_links: 'Link-uri RSS'
95 feed_link: 97 feed_link:
96 unread: 'Unread' 98 unread: 'Unread'
@@ -571,7 +573,7 @@ site_credential:
571 # create_new_one: Create a new credential 573 # create_new_one: Create a new credential
572 # form: 574 # form:
573 # username_label: 'Username' 575 # username_label: 'Username'
574 # host_label: 'Host' 576 # host_label: 'Host (subdomain.example.org, .example.org, etc.)'
575 # password_label: 'Password' 577 # password_label: 'Password'
576 # save: Save 578 # save: Save
577 # delete: Delete 579 # delete: Delete
@@ -592,6 +594,7 @@ flashes:
592 # tagging_rules_updated: 'Tagging rules updated' 594 # tagging_rules_updated: 'Tagging rules updated'
593 # tagging_rules_deleted: 'Tagging rule deleted' 595 # tagging_rules_deleted: 'Tagging rule deleted'
594 # feed_token_updated: 'RSS token updated' 596 # feed_token_updated: 'RSS token updated'
597 # feed_token_revoked: 'RSS token revoked'
595 # annotations_reset: Annotations reset 598 # annotations_reset: Annotations reset
596 # tags_reset: Tags reset 599 # tags_reset: Tags reset
597 # entries_reset: Entries reset 600 # entries_reset: Entries reset
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
index 2ee2d83a..5d0e70c9 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.ru.yml
@@ -32,6 +32,8 @@ menu:
32 save_link: 'Сохранить ссылку' 32 save_link: 'Сохранить ссылку'
33 back_to_unread: 'Назад к непрочитанным записям' 33 back_to_unread: 'Назад к непрочитанным записям'
34 users_management: 'Управление пользователями' 34 users_management: 'Управление пользователями'
35 site_credentials: 'Site credentials'
36 quickstart: "Быстрый старт"
35 top: 37 top:
36 add_new_entry: 'Добавить новую запись' 38 add_new_entry: 'Добавить новую запись'
37 search: 'Поиск' 39 search: 'Поиск'
@@ -89,6 +91,7 @@ config:
89 no_token: 'Ключ не задан' 91 no_token: 'Ключ не задан'
90 token_create: 'Создать ключ' 92 token_create: 'Создать ключ'
91 token_reset: 'Пересоздать ключ' 93 token_reset: 'Пересоздать ключ'
94 # token_revoke: 'Revoke the token'
92 feed_links: 'ссылка на RSS' 95 feed_links: 'ссылка на RSS'
93 feed_link: 96 feed_link:
94 unread: 'непрочитанные' 97 unread: 'непрочитанные'
@@ -558,6 +561,7 @@ flashes:
558 tagging_rules_updated: 'Правила тегировния обновлены' 561 tagging_rules_updated: 'Правила тегировния обновлены'
559 tagging_rules_deleted: 'Правила тегировния удалены' 562 tagging_rules_deleted: 'Правила тегировния удалены'
560 feed_token_updated: 'RSS ключ обновлен' 563 feed_token_updated: 'RSS ключ обновлен'
564 # feed_token_revoked: 'RSS token revoked'
561 annotations_reset: "Аннотации сброшены" 565 annotations_reset: "Аннотации сброшены"
562 tags_reset: "Теги сброшены" 566 tags_reset: "Теги сброшены"
563 entries_reset: "Записи сброшены" 567 entries_reset: "Записи сброшены"
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
index e04eee68..66426d53 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.th.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'กลับไปยังรายการที่ไม่ได้อ่าน' 33 back_to_unread: 'กลับไปยังรายการที่ไม่ได้อ่าน'
34 users_management: 'การจัดการผู้ใช้' 34 users_management: 'การจัดการผู้ใช้'
35 site_credentials: 'การรับรองไซต์' 35 site_credentials: 'การรับรองไซต์'
36 quickstart: "เริ่มแบบด่วน"
36 top: 37 top:
37 add_new_entry: 'เพิ่มรายการใหม่' 38 add_new_entry: 'เพิ่มรายการใหม่'
38 search: 'ค้นหา' 39 search: 'ค้นหา'
@@ -91,6 +92,7 @@ config:
91 no_token: 'ไม่มีเครื่องหมาย' 92 no_token: 'ไม่มีเครื่องหมาย'
92 token_create: 'สร้างเครื่องหมาย' 93 token_create: 'สร้างเครื่องหมาย'
93 token_reset: 'ทำเครื่องหมาย' 94 token_reset: 'ทำเครื่องหมาย'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'ลิงค์ RSS' 96 feed_links: 'ลิงค์ RSS'
95 feed_link: 97 feed_link:
96 unread: 'ยังไมได้่อ่าน' 98 unread: 'ยังไมได้่อ่าน'
@@ -569,7 +571,7 @@ site_credential:
569 create_new_one: สร้างข้อมูลส่วนตัวใหม่ 571 create_new_one: สร้างข้อมูลส่วนตัวใหม่
570 form: 572 form:
571 username_label: 'ชื่อผู้ใช้' 573 username_label: 'ชื่อผู้ใช้'
572 host_label: 'โฮส' 574 host_label: 'โฮส (subdomain.example.org, .example.org, etc.)'
573 password_label: 'รหัสผ่าน' 575 password_label: 'รหัสผ่าน'
574 save: บันทึก 576 save: บันทึก
575 delete: ลบ 577 delete: ลบ
@@ -590,6 +592,7 @@ flashes:
590 tagging_rules_updated: 'อัปเดตการแท็กข้อบังคับ' 592 tagging_rules_updated: 'อัปเดตการแท็กข้อบังคับ'
591 tagging_rules_deleted: 'การลบข้อบังคับของแท็ก' 593 tagging_rules_deleted: 'การลบข้อบังคับของแท็ก'
592 feed_token_updated: 'อัปเดตเครื่องหมาย RSS ' 594 feed_token_updated: 'อัปเดตเครื่องหมาย RSS '
595 # feed_token_revoked: 'RSS token revoked'
593 annotations_reset: รีเซ็ตหมายเหตุ 596 annotations_reset: รีเซ็ตหมายเหตุ
594 tags_reset: รีเซ็ตแท็ก 597 tags_reset: รีเซ็ตแท็ก
595 entries_reset: รีเซ็ตรายการ 598 entries_reset: รีเซ็ตรายการ
diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
index 2f86f25d..50bd38e3 100644
--- a/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
+++ b/src/Wallabag/CoreBundle/Resources/translations/messages.tr.yml
@@ -33,6 +33,7 @@ menu:
33 back_to_unread: 'Okunmayan makalelere geri dön' 33 back_to_unread: 'Okunmayan makalelere geri dön'
34 # users_management: 'Users management' 34 # users_management: 'Users management'
35 # site_credentials: 'Site credentials' 35 # site_credentials: 'Site credentials'
36 quickstart: "Hızlı başlangıç"
36 top: 37 top:
37 add_new_entry: 'Yeni bir makale ekle' 38 add_new_entry: 'Yeni bir makale ekle'
38 search: 'Ara' 39 search: 'Ara'
@@ -91,6 +92,7 @@ config:
91 no_token: 'Belirteç (token) yok' 92 no_token: 'Belirteç (token) yok'
92 token_create: 'Yeni belirteç (token) oluştur' 93 token_create: 'Yeni belirteç (token) oluştur'
93 token_reset: 'Belirteci (token) sıfırla' 94 token_reset: 'Belirteci (token) sıfırla'
95 # token_revoke: 'Revoke the token'
94 feed_links: 'RSS akış bağlantıları' 96 feed_links: 'RSS akış bağlantıları'
95 feed_link: 97 feed_link:
96 unread: 'Okunmayan' 98 unread: 'Okunmayan'
diff --git a/src/Wallabag/CoreBundle/Resources/views/base.html.twig b/src/Wallabag/CoreBundle/Resources/views/base.html.twig
index aa388bcb..c0eecd57 100644
--- a/src/Wallabag/CoreBundle/Resources/views/base.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/base.html.twig
@@ -8,6 +8,7 @@
8 {% block head %} 8 {% block head %}
9 <meta name="viewport" content="initial-scale=1.0"> 9 <meta name="viewport" content="initial-scale=1.0">
10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
11 <meta name="referrer" content="strict-origin-when-cross-origin">
11 <!--[if IE]> 12 <!--[if IE]>
12 <meta http-equiv="X-UA-Compatible" content="IE=10"> 13 <meta http-equiv="X-UA-Compatible" content="IE=10">
13 <![endif]--> 14 <![endif]-->
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
index 4ef6ab3c..a1caf242 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/Config/index.html.twig
@@ -111,14 +111,14 @@
111 {% else %} 111 {% else %}
112 <em>{{ 'config.form_feed.no_token'|trans }}</em> 112 <em>{{ 'config.form_feed.no_token'|trans }}</em>
113 {% endif %} 113 {% endif %}
114 114
115 <a href="{{ path('generate_token') }}"> 115 {% if feed.token %}
116 {% if feed.token %} 116 – <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_reset'|trans }}</a>
117 {{ 'config.form_feed.token_reset'|trans }} 117 <a href="{{ path('revoke_token') }}">{{ 'config.form_feed.token_revoke'|trans }}</a>
118 {% else %} 118 {% else %}
119 {{ 'config.form_feed.token_create'|trans }} 119 <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_create'|trans }}</a>
120 {% endif %} 120 {% endif %}
121 </a> 121
122 </div> 122 </div>
123 </fieldset> 123 </fieldset>
124 124
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
index 35a54daf..6b1e2bd7 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/baggy/layout.html.twig
@@ -50,6 +50,7 @@
50 <li class="menu howto"><a href="{{ path('howto') }}">{{ 'menu.left.howto'|trans }}</a></li> 50 <li class="menu howto"><a href="{{ path('howto') }}">{{ 'menu.left.howto'|trans }}</a></li>
51 <li class="menu developer"><a href="{{ path('developer') }}">{{ 'menu.left.developer'|trans }}</a></li> 51 <li class="menu developer"><a href="{{ path('developer') }}">{{ 'menu.left.developer'|trans }}</a></li>
52 <li class="menu about"><a href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a></li> 52 <li class="menu about"><a href="{{ path('about') }}">{{ 'footer.wallabag.about'|trans }}</a></li>
53 <li class="menu quickstart"><a href="{{ path('quickstart') }}">{{ 'menu.left.quickstart'|trans }}</a></li>
53 <li class="menu logout"><a class="icon icon-power" href="{{ path('fos_user_security_logout') }}">{{ 'menu.left.logout'|trans }}</a></li> 54 <li class="menu logout"><a class="icon icon-power" href="{{ path('fos_user_security_logout') }}">{{ 'menu.left.logout'|trans }}</a></li>
54 </ul> 55 </ul>
55{% endblock %} 56{% endblock %}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig
index e1c7aad9..4294a60d 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/common/Entry/share.html.twig
@@ -29,9 +29,6 @@
29 <h1>{{ entry.title|e|raw }}</h1> 29 <h1>{{ entry.title|e|raw }}</h1>
30 <a href="{{ entry.url|e }}" target="_blank" rel="noopener" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e|raw }}" class="tool">{{ entry.domainName|removeWww }}</a> 30 <a href="{{ entry.url|e }}" target="_blank" rel="noopener" title="{{ 'entry.view.original_article'|trans }} : {{ entry.title|e|raw }}" class="tool">{{ entry.domainName|removeWww }}</a>
31 <p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username})|raw }}.</p> 31 <p class="shared-by">{{ "entry.public.shared_by_wallabag"|trans({'%wallabag_instance%': url('homepage'), '%username%': entry.user.username})|raw }}.</p>
32 {% if entry.previewPicture is not null %}
33 <img class="preview" src="{{ entry.previewPicture }}" alt="{{ entry.title|striptags|e('html_attr') }}" />
34 {% endif %}
35 </header> 32 </header>
36 <article class="block"> 33 <article class="block">
37 {{ entry.content | raw }} 34 {{ entry.content | raw }}
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
index 818fc4e7..a48c9e28 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Config/index.html.twig
@@ -140,12 +140,13 @@
140 {% else %} 140 {% else %}
141 <em>{{ 'config.form_feed.no_token'|trans }}</em> 141 <em>{{ 'config.form_feed.no_token'|trans }}</em>
142 {% endif %} 142 {% endif %}
143 – <a href="{{ path('generate_token') }}"> 143
144 {% if feed.token %} 144 {% if feed.token %}
145 {{ 'config.form_feed.token_reset'|trans }} 145 – <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_reset'|trans }}</a>
146 – <a href="{{ path('revoke_token') }}">{{ 'config.form_feed.token_revoke'|trans }}</a>
146 {% else %} 147 {% else %}
147 {{ 'config.form_feed.token_create'|trans }} 148 – <a href="{{ path('generate_token') }}">{{ 'config.form_feed.token_create'|trans }}</a>
148 {% endif %}</a> 149 {% endif %}
149 </div> 150 </div>
150 </div> 151 </div>
151 </div> 152 </div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_content.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_content.html.twig
index 1f3cd1a7..1102a0bd 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_content.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/Card/_content.html.twig
@@ -8,8 +8,11 @@
8 8
9 <div class="{{ subClass|default('original grey-text') }}"> 9 <div class="{{ subClass|default('original grey-text') }}">
10 <a href="{{ entry.url|e }}" target="_blank" title="{{ entry.domainName|removeWww }}" class="tool grey-text">{{ entry.domainName|removeWww }}</a> 10 <a href="{{ entry.url|e }}" target="_blank" title="{{ entry.domainName|removeWww }}" class="tool grey-text">{{ entry.domainName|removeWww }}</a>
11 {% if withTags is defined %} 11 {% if withMetadata is defined %}
12 {% include "@WallabagCore/themes/material/Entry/_tags.html.twig" with {'tags': entry.tags | slice(0, 3), 'entryId': entry.id, 'listClass': ' hide-on-med-and-down'} only %} 12 {% include "@WallabagCore/themes/material/Entry/_tags.html.twig" with {'tags': entry.tags | slice(0, 3), 'entryId': entry.id, 'listClass': ' hide-on-med-and-down'} only %}
13 <div class="reading-time grey-text">
14 <div class="card-reading-time">{% include "@WallabagCore/themes/material/Entry/_reading_time.html.twig" with {'entry': entry} only %}</div>
15 </div>
13 {% endif %} 16 {% endif %}
14 </div> 17 </div>
15</div> 18</div>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig
index 1c00f2fa..6a095035 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig
@@ -5,7 +5,7 @@
5 <span class="preview{{ previewClassModifier }}" style="background-image: url({{ entry.previewPicture | default(asset('wallassets/themes/_global/img/logo-square.svg')) }})"></span> 5 <span class="preview{{ previewClassModifier }}" style="background-image: url({{ entry.previewPicture | default(asset('wallassets/themes/_global/img/logo-square.svg')) }})"></span>
6 </a> 6 </a>
7 </div> 7 </div>
8 {% include "@WallabagCore/themes/material/Entry/Card/_content.html.twig" with {'entry': entry, 'withTags': true, 'subClass': 'metadata'} only %} 8 {% include "@WallabagCore/themes/material/Entry/Card/_content.html.twig" with {'entry': entry, 'withMetadata': true, 'subClass': 'metadata'} only %}
9 <ul class="tools-list hide-on-small-only"> 9 <ul class="tools-list hide-on-small-only">
10 <li> 10 <li>
11 <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a> 11 <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}unarchive{% endif %}</i></a>
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
index b9c45567..c51d07fc 100644
--- a/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
+++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/layout.html.twig
@@ -91,6 +91,9 @@
91 <li class="bold {% if currentRoute == 'howto' %}active{% endif %}"> 91 <li class="bold {% if currentRoute == 'howto' %}active{% endif %}">
92 <a class="waves-effect" href="{{ path('howto') }}">{{ 'menu.left.howto'|trans }}</a> 92 <a class="waves-effect" href="{{ path('howto') }}">{{ 'menu.left.howto'|trans }}</a>
93 </li> 93 </li>
94 <li class="bold {% if currentRoute == 'quickstart' %}active{% endif %}">
95 <a class="waves-effect" href="{{ path('quickstart') }}">{{ 'menu.left.quickstart'|trans }}</a>
96 </li>
94 <li class="bold"> 97 <li class="bold">
95 <a class="waves-effect icon icon-power" href="{{ path('fos_user_security_logout') }}">{{ 'menu.left.logout'|trans }}</a> 98 <a class="waves-effect icon icon-power" href="{{ path('fos_user_security_logout') }}">{{ 'menu.left.logout'|trans }}</a>
96 </li> 99 </li>
diff --git a/src/Wallabag/ImportBundle/Import/InstapaperImport.php b/src/Wallabag/ImportBundle/Import/InstapaperImport.php
index 439c978c..f7bee9ef 100644
--- a/src/Wallabag/ImportBundle/Import/InstapaperImport.php
+++ b/src/Wallabag/ImportBundle/Import/InstapaperImport.php
@@ -93,6 +93,10 @@ class InstapaperImport extends AbstractImport
93 return false; 93 return false;
94 } 94 }
95 95
96 // most recent articles are first, which means we should create them at the end so they will show up first
97 // as Instapaper doesn't export the creation date of the article
98 $entries = array_reverse($entries);
99
96 if ($this->producer) { 100 if ($this->producer) {
97 $this->parseEntriesForProducer($entries); 101 $this->parseEntriesForProducer($entries);
98 102
diff --git a/src/Wallabag/ImportBundle/Import/PocketImport.php b/src/Wallabag/ImportBundle/Import/PocketImport.php
index a39d8156..746120af 100644
--- a/src/Wallabag/ImportBundle/Import/PocketImport.php
+++ b/src/Wallabag/ImportBundle/Import/PocketImport.php
@@ -2,13 +2,22 @@
2 2
3namespace Wallabag\ImportBundle\Import; 3namespace Wallabag\ImportBundle\Import;
4 4
5use GuzzleHttp\Client; 5use Http\Client\Common\HttpMethodsClient;
6use GuzzleHttp\Exception\RequestException; 6use Http\Client\Common\Plugin\ErrorPlugin;
7use Http\Client\Common\PluginClient;
8use Http\Client\Exception\RequestException;
9use Http\Client\HttpClient;
10use Http\Discovery\MessageFactoryDiscovery;
11use Http\Message\MessageFactory;
12use Psr\Http\Message\ResponseInterface;
7use Wallabag\CoreBundle\Entity\Entry; 13use Wallabag\CoreBundle\Entity\Entry;
8 14
9class PocketImport extends AbstractImport 15class PocketImport extends AbstractImport
10{ 16{
11 const NB_ELEMENTS = 5000; 17 const NB_ELEMENTS = 5000;
18 /**
19 * @var HttpMethodsClient
20 */
12 private $client; 21 private $client;
13 private $accessToken; 22 private $accessToken;
14 23
@@ -55,24 +64,18 @@ class PocketImport extends AbstractImport
55 */ 64 */
56 public function getRequestToken($redirectUri) 65 public function getRequestToken($redirectUri)
57 { 66 {
58 $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/oauth/request',
59 [
60 'body' => json_encode([
61 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
62 'redirect_uri' => $redirectUri,
63 ]),
64 ]
65 );
66
67 try { 67 try {
68 $response = $this->client->send($request); 68 $response = $this->client->post('https://getpocket.com/v3/oauth/request', [], json_encode([
69 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
70 'redirect_uri' => $redirectUri,
71 ]));
69 } catch (RequestException $e) { 72 } catch (RequestException $e) {
70 $this->logger->error(sprintf('PocketImport: Failed to request token: %s', $e->getMessage()), ['exception' => $e]); 73 $this->logger->error(sprintf('PocketImport: Failed to request token: %s', $e->getMessage()), ['exception' => $e]);
71 74
72 return false; 75 return false;
73 } 76 }
74 77
75 return $response->json()['code']; 78 return $this->jsonDecode($response)['code'];
76 } 79 }
77 80
78 /** 81 /**
@@ -85,24 +88,18 @@ class PocketImport extends AbstractImport
85 */ 88 */
86 public function authorize($code) 89 public function authorize($code)
87 { 90 {
88 $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/oauth/authorize',
89 [
90 'body' => json_encode([
91 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
92 'code' => $code,
93 ]),
94 ]
95 );
96
97 try { 91 try {
98 $response = $this->client->send($request); 92 $response = $this->client->post('https://getpocket.com/v3/oauth/authorize', [], json_encode([
93 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
94 'code' => $code,
95 ]));
99 } catch (RequestException $e) { 96 } catch (RequestException $e) {
100 $this->logger->error(sprintf('PocketImport: Failed to authorize client: %s', $e->getMessage()), ['exception' => $e]); 97 $this->logger->error(sprintf('PocketImport: Failed to authorize client: %s', $e->getMessage()), ['exception' => $e]);
101 98
102 return false; 99 return false;
103 } 100 }
104 101
105 $this->accessToken = $response->json()['access_token']; 102 $this->accessToken = $this->jsonDecode($response)['access_token'];
106 103
107 return true; 104 return true;
108 } 105 }
@@ -114,29 +111,23 @@ class PocketImport extends AbstractImport
114 { 111 {
115 static $run = 0; 112 static $run = 0;
116 113
117 $request = $this->client->createRequest('POST', 'https://getpocket.com/v3/get',
118 [
119 'body' => json_encode([
120 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
121 'access_token' => $this->accessToken,
122 'detailType' => 'complete',
123 'state' => 'all',
124 'sort' => 'newest',
125 'count' => self::NB_ELEMENTS,
126 'offset' => $offset,
127 ]),
128 ]
129 );
130
131 try { 114 try {
132 $response = $this->client->send($request); 115 $response = $this->client->post('https://getpocket.com/v3/get', [], json_encode([
116 'consumer_key' => $this->user->getConfig()->getPocketConsumerKey(),
117 'access_token' => $this->accessToken,
118 'detailType' => 'complete',
119 'state' => 'all',
120 'sort' => 'newest',
121 'count' => self::NB_ELEMENTS,
122 'offset' => $offset,
123 ]));
133 } catch (RequestException $e) { 124 } catch (RequestException $e) {
134 $this->logger->error(sprintf('PocketImport: Failed to import: %s', $e->getMessage()), ['exception' => $e]); 125 $this->logger->error(sprintf('PocketImport: Failed to import: %s', $e->getMessage()), ['exception' => $e]);
135 126
136 return false; 127 return false;
137 } 128 }
138 129
139 $entries = $response->json(); 130 $entries = $this->jsonDecode($response);
140 131
141 if ($this->producer) { 132 if ($this->producer) {
142 $this->parseEntriesForProducer($entries['list']); 133 $this->parseEntriesForProducer($entries['list']);
@@ -159,13 +150,14 @@ class PocketImport extends AbstractImport
159 } 150 }
160 151
161 /** 152 /**
162 * Set the Guzzle client. 153 * Set the Http client.
163 * 154 *
164 * @param Client $client 155 * @param HttpClient $client
156 * @param MessageFactory|null $messageFactory
165 */ 157 */
166 public function setClient(Client $client) 158 public function setClient(HttpClient $client, MessageFactory $messageFactory = null)
167 { 159 {
168 $this->client = $client; 160 $this->client = new HttpMethodsClient(new PluginClient($client, [new ErrorPlugin()]), $messageFactory ?: MessageFactoryDiscovery::find());
169 } 161 }
170 162
171 /** 163 /**
@@ -252,4 +244,15 @@ class PocketImport extends AbstractImport
252 244
253 return $importedEntry; 245 return $importedEntry;
254 } 246 }
247
248 protected function jsonDecode(ResponseInterface $response)
249 {
250 $data = json_decode((string) $response->getBody(), true);
251
252 if (JSON_ERROR_NONE !== json_last_error()) {
253 throw new \InvalidArgumentException('Unable to parse JSON data: ' . json_last_error_msg());
254 }
255
256 return $data;
257 }
255} 258}
diff --git a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
index 3e085ecf..2ba26003 100644
--- a/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
+++ b/src/Wallabag/ImportBundle/Import/WallabagV2Import.php
@@ -35,7 +35,9 @@ class WallabagV2Import extends WallabagImport
35 { 35 {
36 return [ 36 return [
37 'html' => $entry['content'], 37 'html' => $entry['content'],
38 'content_type' => $entry['mimetype'], 38 'headers' => [
39 'content-type' => $entry['mimetype'],
40 ],
39 'is_archived' => (bool) ($entry['is_archived'] || $this->markAsRead), 41 'is_archived' => (bool) ($entry['is_archived'] || $this->markAsRead),
40 'is_starred' => (bool) $entry['is_starred'], 42 'is_starred' => (bool) $entry['is_starred'],
41 ] + $entry; 43 ] + $entry;
diff --git a/src/Wallabag/ImportBundle/Resources/config/services.yml b/src/Wallabag/ImportBundle/Resources/config/services.yml
index 2dd7dff8..973c0d03 100644
--- a/src/Wallabag/ImportBundle/Resources/config/services.yml
+++ b/src/Wallabag/ImportBundle/Resources/config/services.yml
@@ -7,13 +7,7 @@ services:
7 class: Wallabag\ImportBundle\Import\ImportChain 7 class: Wallabag\ImportBundle\Import\ImportChain
8 8
9 wallabag_import.pocket.client: 9 wallabag_import.pocket.client:
10 class: GuzzleHttp\Client 10 alias: 'httplug.client.wallabag_import.pocket.client'
11 arguments:
12 -
13 defaults:
14 headers:
15 content-type: "application/json"
16 X-Accept: "application/json"
17 11
18 wallabag_import.pocket.import: 12 wallabag_import.pocket.import:
19 class: Wallabag\ImportBundle\Import\PocketImport 13 class: Wallabag\ImportBundle\Import\PocketImport
diff --git a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
index 8cc12ed3..8b7898ee 100644
--- a/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
+++ b/tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
@@ -133,6 +133,27 @@ class EntryRestControllerTest extends WallabagApiTestCase
133 $this->assertSame(1, $content['page']); 133 $this->assertSame(1, $content['page']);
134 $this->assertGreaterThanOrEqual(1, $content['pages']); 134 $this->assertGreaterThanOrEqual(1, $content['pages']);
135 135
136 $this->assertNotNull($content['_embedded']['items'][0]['content']);
137
138 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
139 }
140
141 public function testGetEntriesDetailMetadata()
142 {
143 $this->client->request('GET', '/api/entries?detail=metadata');
144
145 $this->assertSame(200, $this->client->getResponse()->getStatusCode());
146
147 $content = json_decode($this->client->getResponse()->getContent(), true);
148
149 $this->assertGreaterThanOrEqual(1, \count($content));
150 $this->assertNotEmpty($content['_embedded']['items']);
151 $this->assertGreaterThanOrEqual(1, $content['total']);
152 $this->assertSame(1, $content['page']);
153 $this->assertGreaterThanOrEqual(1, $content['pages']);
154
155 $this->assertNull($content['_embedded']['items'][0]['content']);
156
136 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type')); 157 $this->assertSame('application/json', $this->client->getResponse()->headers->get('Content-Type'));
137 } 158 }
138 159
diff --git a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
index d8478ce3..b9e0bed2 100644
--- a/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
@@ -330,7 +330,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
330 $crawler = $client->followRedirect(); 330 $crawler = $client->followRedirect();
331 331
332 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text'])); 332 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
333 $this->assertNotContains('config.form_feed.no_token', $body[0]); 333 $this->assertContains('config.form_feed.token_reset', $body[0]);
334 } 334 }
335 335
336 public function testGenerateTokenAjax() 336 public function testGenerateTokenAjax()
@@ -351,6 +351,22 @@ class ConfigControllerTest extends WallabagCoreTestCase
351 $this->assertArrayHasKey('token', $content); 351 $this->assertArrayHasKey('token', $content);
352 } 352 }
353 353
354 public function testRevokeTokenAjax()
355 {
356 $this->logInAs('admin');
357 $client = $this->getClient();
358
359 $client->request(
360 'GET',
361 '/revoke-token',
362 [],
363 [],
364 ['HTTP_X-Requested-With' => 'XMLHttpRequest']
365 );
366
367 $this->assertSame(200, $client->getResponse()->getStatusCode());
368 }
369
354 public function testFeedUpdate() 370 public function testFeedUpdate()
355 { 371 {
356 $this->logInAs('admin'); 372 $this->logInAs('admin');
diff --git a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
index caa8929d..e9c12c49 100644
--- a/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
+++ b/tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
@@ -166,7 +166,6 @@ class EntryControllerTest extends WallabagCoreTestCase
166 $this->assertSame($this->url, $content->getUrl()); 166 $this->assertSame($this->url, $content->getUrl());
167 $this->assertContains('Google', $content->getTitle()); 167 $this->assertContains('Google', $content->getTitle());
168 $this->assertSame('fr', $content->getLanguage()); 168 $this->assertSame('fr', $content->getLanguage());
169 $this->assertSame('2015-03-28 11:43:19', $content->getPublishedAt()->format('Y-m-d H:i:s'));
170 $this->assertArrayHasKey('x-frame-options', $content->getHeaders()); 169 $this->assertArrayHasKey('x-frame-options', $content->getHeaders());
171 $client->getContainer()->get('craue_config')->set('store_article_headers', 0); 170 $client->getContainer()->get('craue_config')->set('store_article_headers', 0);
172 } 171 }
@@ -236,7 +235,45 @@ class EntryControllerTest extends WallabagCoreTestCase
236 $this->logInAs('admin'); 235 $this->logInAs('admin');
237 $client = $this->getClient(); 236 $client = $this->getClient();
238 237
239 $url = 'http://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing'; 238 $url = 'https://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing';
239
240 $crawler = $client->request('GET', '/new');
241
242 $this->assertSame(200, $client->getResponse()->getStatusCode());
243
244 $form = $crawler->filter('form[name=entry]')->form();
245
246 $data = [
247 'entry[url]' => $url,
248 ];
249
250 $client->submit($form, $data);
251
252 $crawler = $client->request('GET', '/new');
253
254 $this->assertSame(200, $client->getResponse()->getStatusCode());
255
256 $form = $crawler->filter('form[name=entry]')->form();
257
258 $data = [
259 'entry[url]' => $url,
260 ];
261
262 $client->submit($form, $data);
263
264 $this->assertSame(302, $client->getResponse()->getStatusCode());
265 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
266 }
267
268 /**
269 * This test will require an internet connection.
270 */
271 public function testPostNewOkUrlExistWithRedirection()
272 {
273 $this->logInAs('admin');
274 $client = $this->getClient();
275
276 $url = 'https://wllbg.org/test-redirect/c51c';
240 277
241 $crawler = $client->request('GET', '/new'); 278 $crawler = $client->request('GET', '/new');
242 279
diff --git a/tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php b/tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php
index 277d8012..9e0a9136 100644
--- a/tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php
+++ b/tests/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilderTest.php
@@ -5,26 +5,24 @@ namespace Tests\Wallabag\CoreBundle\GuzzleSiteAuthenticator;
5use Graby\SiteConfig\SiteConfig as GrabySiteConfig; 5use Graby\SiteConfig\SiteConfig as GrabySiteConfig;
6use Monolog\Handler\TestHandler; 6use Monolog\Handler\TestHandler;
7use Monolog\Logger; 7use Monolog\Logger;
8use PHPUnit\Framework\TestCase;
9use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; 8use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
10use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 9use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
10use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
11use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder; 11use Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder;
12 12
13class GrabySiteConfigBuilderTest extends TestCase 13class GrabySiteConfigBuilderTest extends WallabagCoreTestCase
14{ 14{
15 /** @var \Wallabag\CoreBundle\GuzzleSiteAuthenticator\GrabySiteConfigBuilder */ 15 private $builder;
16 protected $builder;
17 16
18 public function testBuildConfigExists() 17 public function testBuildConfigExists()
19 { 18 {
20 /* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
21 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder') 19 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
22 ->disableOriginalConstructor() 20 ->disableOriginalConstructor()
23 ->getMock(); 21 ->getMock();
24 22
25 $grabySiteConfig = new GrabySiteConfig(); 23 $grabySiteConfig = new GrabySiteConfig();
26 $grabySiteConfig->requires_login = true; 24 $grabySiteConfig->requires_login = true;
27 $grabySiteConfig->login_uri = 'http://www.example.com/login'; 25 $grabySiteConfig->login_uri = 'http://api.example.com/login';
28 $grabySiteConfig->login_username_field = 'login'; 26 $grabySiteConfig->login_username_field = 'login';
29 $grabySiteConfig->login_password_field = 'password'; 27 $grabySiteConfig->login_password_field = 'password';
30 $grabySiteConfig->login_extra_fields = ['field=value']; 28 $grabySiteConfig->login_extra_fields = ['field=value'];
@@ -32,7 +30,7 @@ class GrabySiteConfigBuilderTest extends TestCase
32 30
33 $grabyConfigBuilderMock 31 $grabyConfigBuilderMock
34 ->method('buildForHost') 32 ->method('buildForHost')
35 ->with('example.com') 33 ->with('api.example.com')
36 ->willReturn($grabySiteConfig); 34 ->willReturn($grabySiteConfig);
37 35
38 $logger = new Logger('foo'); 36 $logger = new Logger('foo');
@@ -43,8 +41,8 @@ class GrabySiteConfigBuilderTest extends TestCase
43 ->disableOriginalConstructor() 41 ->disableOriginalConstructor()
44 ->getMock(); 42 ->getMock();
45 $siteCrentialRepo->expects($this->once()) 43 $siteCrentialRepo->expects($this->once())
46 ->method('findOneByHostAndUser') 44 ->method('findOneByHostsAndUser')
47 ->with('example.com', 1) 45 ->with(['api.example.com', '.example.com'], 1)
48 ->willReturn(['username' => 'foo', 'password' => 'bar']); 46 ->willReturn(['username' => 'foo', 'password' => 'bar']);
49 47
50 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User') 48 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
@@ -59,18 +57,18 @@ class GrabySiteConfigBuilderTest extends TestCase
59 $tokenStorage = new TokenStorage(); 57 $tokenStorage = new TokenStorage();
60 $tokenStorage->setToken($token); 58 $tokenStorage->setToken($token);
61 59
62 $this->builder = new GrabySiteConfigBuilder( 60 $builder = new GrabySiteConfigBuilder(
63 $grabyConfigBuilderMock, 61 $grabyConfigBuilderMock,
64 $tokenStorage, 62 $tokenStorage,
65 $siteCrentialRepo, 63 $siteCrentialRepo,
66 $logger 64 $logger
67 ); 65 );
68 66
69 $config = $this->builder->buildForHost('www.example.com'); 67 $config = $builder->buildForHost('api.example.com');
70 68
71 $this->assertSame('example.com', $config->getHost()); 69 $this->assertSame('api.example.com', $config->getHost());
72 $this->assertTrue($config->requiresLogin()); 70 $this->assertTrue($config->requiresLogin());
73 $this->assertSame('http://www.example.com/login', $config->getLoginUri()); 71 $this->assertSame('http://api.example.com/login', $config->getLoginUri());
74 $this->assertSame('login', $config->getUsernameField()); 72 $this->assertSame('login', $config->getUsernameField());
75 $this->assertSame('password', $config->getPasswordField()); 73 $this->assertSame('password', $config->getPasswordField());
76 $this->assertSame(['field' => 'value'], $config->getExtraFields()); 74 $this->assertSame(['field' => 'value'], $config->getExtraFields());
@@ -85,7 +83,6 @@ class GrabySiteConfigBuilderTest extends TestCase
85 83
86 public function testBuildConfigDoesntExist() 84 public function testBuildConfigDoesntExist()
87 { 85 {
88 /* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
89 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder') 86 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
90 ->disableOriginalConstructor() 87 ->disableOriginalConstructor()
91 ->getMock(); 88 ->getMock();
@@ -103,8 +100,8 @@ class GrabySiteConfigBuilderTest extends TestCase
103 ->disableOriginalConstructor() 100 ->disableOriginalConstructor()
104 ->getMock(); 101 ->getMock();
105 $siteCrentialRepo->expects($this->once()) 102 $siteCrentialRepo->expects($this->once())
106 ->method('findOneByHostAndUser') 103 ->method('findOneByHostsAndUser')
107 ->with('unknown.com', 1) 104 ->with(['unknown.com', '.com'], 1)
108 ->willReturn(null); 105 ->willReturn(null);
109 106
110 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User') 107 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
@@ -119,14 +116,14 @@ class GrabySiteConfigBuilderTest extends TestCase
119 $tokenStorage = new TokenStorage(); 116 $tokenStorage = new TokenStorage();
120 $tokenStorage->setToken($token); 117 $tokenStorage->setToken($token);
121 118
122 $this->builder = new GrabySiteConfigBuilder( 119 $builder = new GrabySiteConfigBuilder(
123 $grabyConfigBuilderMock, 120 $grabyConfigBuilderMock,
124 $tokenStorage, 121 $tokenStorage,
125 $siteCrentialRepo, 122 $siteCrentialRepo,
126 $logger 123 $logger
127 ); 124 );
128 125
129 $config = $this->builder->buildForHost('unknown.com'); 126 $config = $builder->buildForHost('unknown.com');
130 127
131 $this->assertFalse($config); 128 $this->assertFalse($config);
132 129
@@ -137,7 +134,6 @@ class GrabySiteConfigBuilderTest extends TestCase
137 134
138 public function testBuildConfigWithBadExtraFields() 135 public function testBuildConfigWithBadExtraFields()
139 { 136 {
140 /* @var \Graby\SiteConfig\ConfigBuilder|\PHPUnit_Framework_MockObject_MockObject */
141 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder') 137 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
142 ->disableOriginalConstructor() 138 ->disableOriginalConstructor()
143 ->getMock(); 139 ->getMock();
@@ -163,8 +159,8 @@ class GrabySiteConfigBuilderTest extends TestCase
163 ->disableOriginalConstructor() 159 ->disableOriginalConstructor()
164 ->getMock(); 160 ->getMock();
165 $siteCrentialRepo->expects($this->once()) 161 $siteCrentialRepo->expects($this->once())
166 ->method('findOneByHostAndUser') 162 ->method('findOneByHostsAndUser')
167 ->with('example.com', 1) 163 ->with(['example.com', '.com'], 1)
168 ->willReturn(['username' => 'foo', 'password' => 'bar']); 164 ->willReturn(['username' => 'foo', 'password' => 'bar']);
169 165
170 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User') 166 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
@@ -202,4 +198,121 @@ class GrabySiteConfigBuilderTest extends TestCase
202 198
203 $this->assertCount(1, $records, 'One log was recorded'); 199 $this->assertCount(1, $records, 'One log was recorded');
204 } 200 }
201
202 public function testBuildConfigUserNotDefined()
203 {
204 $grabyConfigBuilderMock = $this->getMockBuilder('\Graby\SiteConfig\ConfigBuilder')
205 ->disableOriginalConstructor()
206 ->getMock();
207
208 $grabyConfigBuilderMock
209 ->method('buildForHost')
210 ->with('unknown.com')
211 ->willReturn(new GrabySiteConfig());
212
213 $logger = new Logger('foo');
214 $handler = new TestHandler();
215 $logger->pushHandler($handler);
216
217 $siteCrentialRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\SiteCredentialRepository')
218 ->disableOriginalConstructor()
219 ->getMock();
220
221 $tokenStorage = new TokenStorage();
222
223 $builder = new GrabySiteConfigBuilder(
224 $grabyConfigBuilderMock,
225 $tokenStorage,
226 $siteCrentialRepo,
227 $logger
228 );
229
230 $config = $builder->buildForHost('unknown.com');
231
232 $this->assertFalse($config);
233 }
234
235 public function dataProviderCredentials()
236 {
237 return [
238 [
239 'host' => 'example.com',
240 ],
241 [
242 'host' => 'other.example.com',
243 ],
244 [
245 'host' => 'paywall.example.com',
246 'expectedUsername' => 'paywall.example',
247 'expectedPassword' => 'bar',
248 ],
249 [
250 'host' => 'api.super.com',
251 'expectedUsername' => '.super',
252 'expectedPassword' => 'bar',
253 ],
254 [
255 'host' => '.super.com',
256 'expectedUsername' => '.super',
257 'expectedPassword' => 'bar',
258 ],
259 ];
260 }
261
262 /**
263 * @dataProvider dataProviderCredentials
264 */
265 public function testBuildConfigWithDbAccess($host, $expectedUsername = null, $expectedPassword = null)
266 {
267 $grabyConfigBuilderMock = $this->getMockBuilder('Graby\SiteConfig\ConfigBuilder')
268 ->disableOriginalConstructor()
269 ->getMock();
270
271 $grabySiteConfig = new GrabySiteConfig();
272 $grabySiteConfig->requires_login = true;
273 $grabySiteConfig->login_uri = 'http://api.example.com/login';
274 $grabySiteConfig->login_username_field = 'login';
275 $grabySiteConfig->login_password_field = 'password';
276 $grabySiteConfig->login_extra_fields = ['field=value'];
277 $grabySiteConfig->not_logged_in_xpath = '//div[@class="need-login"]';
278
279 $grabyConfigBuilderMock
280 ->method('buildForHost')
281 ->with($host)
282 ->willReturn($grabySiteConfig);
283
284 $user = $this->getMockBuilder('Wallabag\UserBundle\Entity\User')
285 ->disableOriginalConstructor()
286 ->getMock();
287 $user->expects($this->once())
288 ->method('getId')
289 ->willReturn(1);
290
291 $token = new UsernamePasswordToken($user, 'pass', 'provider');
292
293 $tokenStorage = new TokenStorage();
294 $tokenStorage->setToken($token);
295
296 $logger = new Logger('foo');
297 $handler = new TestHandler();
298 $logger->pushHandler($handler);
299
300 $builder = new GrabySiteConfigBuilder(
301 $grabyConfigBuilderMock,
302 $tokenStorage,
303 $this->getClient()->getContainer()->get('wallabag_core.site_credential_repository'),
304 $logger
305 );
306
307 $config = $builder->buildForHost($host);
308
309 if (null === $expectedUsername && null === $expectedPassword) {
310 $this->assertFalse($config);
311
312 return;
313 }
314
315 $this->assertSame($expectedUsername, $config->getUsername());
316 $this->assertSame($expectedPassword, $config->getPassword());
317 }
205} 318}
diff --git a/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
index 508adb1b..9ce72c79 100644
--- a/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
@@ -36,7 +36,9 @@ class ContentProxyTest extends TestCase
36 'html' => false, 36 'html' => false,
37 'title' => '', 37 'title' => '',
38 'url' => '', 38 'url' => '',
39 'content_type' => '', 39 'headers' => [
40 'content-type' => '',
41 ],
40 'language' => '', 42 'language' => '',
41 ]); 43 ]);
42 44
@@ -71,7 +73,9 @@ class ContentProxyTest extends TestCase
71 'html' => false, 73 'html' => false,
72 'title' => '', 74 'title' => '',
73 'url' => '', 75 'url' => '',
74 'content_type' => '', 76 'headers' => [
77 'content-type' => '',
78 ],
75 'language' => '', 79 'language' => '',
76 ]); 80 ]);
77 81
@@ -104,15 +108,14 @@ class ContentProxyTest extends TestCase
104 ->method('fetchContent') 108 ->method('fetchContent')
105 ->willReturn([ 109 ->willReturn([
106 'html' => false, 110 'html' => false,
107 'title' => '', 111 'title' => 'my title',
108 'url' => '', 112 'url' => '',
109 'content_type' => '', 113 'headers' => [
114 'content-type' => '',
115 ],
110 'language' => '', 116 'language' => '',
111 'status' => '', 117 'status' => '',
112 'open_graph' => [ 118 'description' => 'desc',
113 'og_title' => 'my title',
114 'og_description' => 'desc',
115 ],
116 ]); 119 ]);
117 120
118 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); 121 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage);
@@ -147,13 +150,12 @@ class ContentProxyTest extends TestCase
147 'html' => str_repeat('this is my content', 325), 150 'html' => str_repeat('this is my content', 325),
148 'title' => 'this is my title', 151 'title' => 'this is my title',
149 'url' => 'http://1.1.1.1', 152 'url' => 'http://1.1.1.1',
150 'content_type' => 'text/html',
151 'language' => 'fr', 153 'language' => 'fr',
152 'status' => '200', 154 'status' => '200',
153 'open_graph' => [ 155 'description' => 'OG desc',
154 'og_title' => 'my OG title', 156 'image' => 'http://3.3.3.3/cover.jpg',
155 'og_description' => 'OG desc', 157 'headers' => [
156 'og_image' => 'http://3.3.3.3/cover.jpg', 158 'content-type' => 'text/html',
157 ], 159 ],
158 ]); 160 ]);
159 161
@@ -189,13 +191,12 @@ class ContentProxyTest extends TestCase
189 'html' => str_repeat('this is my content', 325), 191 'html' => str_repeat('this is my content', 325),
190 'title' => 'this is my title', 192 'title' => 'this is my title',
191 'url' => 'http://1.1.1.1', 193 'url' => 'http://1.1.1.1',
192 'content_type' => 'text/html',
193 'language' => 'fr', 194 'language' => 'fr',
194 'status' => '200', 195 'status' => '200',
195 'open_graph' => [ 196 'description' => 'OG desc',
196 'og_title' => 'my OG title', 197 'image' => null,
197 'og_description' => 'OG desc', 198 'headers' => [
198 'og_image' => null, 199 'content-type' => 'text/html',
199 ], 200 ],
200 ]); 201 ]);
201 202
@@ -214,6 +215,86 @@ class ContentProxyTest extends TestCase
214 $this->assertSame('1.1.1.1', $entry->getDomainName()); 215 $this->assertSame('1.1.1.1', $entry->getDomainName());
215 } 216 }
216 217
218 public function testWithContentAndContentImage()
219 {
220 $tagger = $this->getTaggerMock();
221 $tagger->expects($this->once())
222 ->method('tag');
223
224 $graby = $this->getMockBuilder('Graby\Graby')
225 ->setMethods(['fetchContent'])
226 ->disableOriginalConstructor()
227 ->getMock();
228
229 $graby->expects($this->any())
230 ->method('fetchContent')
231 ->willReturn([
232 'html' => "<h1>Test</h1><p><img src='http://3.3.3.3/cover.jpg'/></p>",
233 'title' => 'this is my title',
234 'url' => 'http://1.1.1.1',
235 'headers' => [
236 'content-type' => 'text/html',
237 ],
238 'language' => 'fr',
239 'status' => '200',
240 'image' => null,
241 ]);
242
243 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage);
244 $entry = new Entry(new User());
245 $proxy->updateEntry($entry, 'http://0.0.0.0');
246
247 $this->assertSame('http://1.1.1.1', $entry->getUrl());
248 $this->assertSame('this is my title', $entry->getTitle());
249 $this->assertSame("<h1>Test</h1><p><img src='http://3.3.3.3/cover.jpg'/></p>", $entry->getContent());
250 $this->assertSame('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
251 $this->assertSame('text/html', $entry->getMimetype());
252 $this->assertSame('fr', $entry->getLanguage());
253 $this->assertSame('200', $entry->getHttpStatus());
254 $this->assertSame(0.0, $entry->getReadingTime());
255 $this->assertSame('1.1.1.1', $entry->getDomainName());
256 }
257
258 public function testWithContentImageAndOgImage()
259 {
260 $tagger = $this->getTaggerMock();
261 $tagger->expects($this->once())
262 ->method('tag');
263
264 $graby = $this->getMockBuilder('Graby\Graby')
265 ->setMethods(['fetchContent'])
266 ->disableOriginalConstructor()
267 ->getMock();
268
269 $graby->expects($this->any())
270 ->method('fetchContent')
271 ->willReturn([
272 'html' => "<h1>Test</h1><p><img src='http://3.3.3.3/nevermind.jpg'/></p>",
273 'title' => 'this is my title',
274 'url' => 'http://1.1.1.1',
275 'headers' => [
276 'content-type' => 'text/html',
277 ],
278 'language' => 'fr',
279 'status' => '200',
280 'image' => 'http://3.3.3.3/cover.jpg',
281 ]);
282
283 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage);
284 $entry = new Entry(new User());
285 $proxy->updateEntry($entry, 'http://0.0.0.0');
286
287 $this->assertSame('http://1.1.1.1', $entry->getUrl());
288 $this->assertSame('this is my title', $entry->getTitle());
289 $this->assertSame("<h1>Test</h1><p><img src='http://3.3.3.3/nevermind.jpg'/></p>", $entry->getContent());
290 $this->assertSame('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
291 $this->assertSame('text/html', $entry->getMimetype());
292 $this->assertSame('fr', $entry->getLanguage());
293 $this->assertSame('200', $entry->getHttpStatus());
294 $this->assertSame(0.0, $entry->getReadingTime());
295 $this->assertSame('1.1.1.1', $entry->getDomainName());
296 }
297
217 public function testWithContentAndBadLanguage() 298 public function testWithContentAndBadLanguage()
218 { 299 {
219 $tagger = $this->getTaggerMock(); 300 $tagger = $this->getTaggerMock();
@@ -236,9 +317,11 @@ class ContentProxyTest extends TestCase
236 'html' => str_repeat('this is my content', 325), 317 'html' => str_repeat('this is my content', 325),
237 'title' => 'this is my title', 318 'title' => 'this is my title',
238 'url' => 'http://1.1.1.1', 319 'url' => 'http://1.1.1.1',
239 'content_type' => 'text/html',
240 'language' => 'dontexist', 320 'language' => 'dontexist',
241 'status' => '200', 321 'status' => '200',
322 'headers' => [
323 'content-type' => 'text/html',
324 ],
242 ]); 325 ]);
243 326
244 $proxy = new ContentProxy($graby, $tagger, $validator, $this->getLogger(), $this->fetchingErrorMessage); 327 $proxy = new ContentProxy($graby, $tagger, $validator, $this->getLogger(), $this->fetchingErrorMessage);
@@ -280,14 +363,13 @@ class ContentProxyTest extends TestCase
280 'html' => str_repeat('this is my content', 325), 363 'html' => str_repeat('this is my content', 325),
281 'title' => 'this is my title', 364 'title' => 'this is my title',
282 'url' => 'http://1.1.1.1', 365 'url' => 'http://1.1.1.1',
283 'content_type' => 'text/html', 366 'headers' => [
367 'content-type' => 'text/html',
368 ],
284 'language' => 'fr', 369 'language' => 'fr',
285 'status' => '200', 370 'status' => '200',
286 'open_graph' => [ 371 'description' => 'OG desc',
287 'og_title' => 'my OG title', 372 'image' => 'https://',
288 'og_description' => 'OG desc',
289 'og_image' => 'https://',
290 ],
291 ]); 373 ]);
292 374
293 $proxy = new ContentProxy($graby, $tagger, $validator, $this->getLogger(), $this->fetchingErrorMessage); 375 $proxy = new ContentProxy($graby, $tagger, $validator, $this->getLogger(), $this->fetchingErrorMessage);
@@ -320,12 +402,12 @@ class ContentProxyTest extends TestCase
320 'html' => str_repeat('this is my content', 325), 402 'html' => str_repeat('this is my content', 325),
321 'title' => 'this is my title', 403 'title' => 'this is my title',
322 'url' => 'http://1.1.1.1', 404 'url' => 'http://1.1.1.1',
323 'content_type' => 'text/html',
324 'language' => 'fr', 405 'language' => 'fr',
325 'date' => '1395635872', 406 'date' => '1395635872',
326 'authors' => ['Jeremy', 'Nico', 'Thomas'], 407 'authors' => ['Jeremy', 'Nico', 'Thomas'],
327 'all_headers' => [ 408 'headers' => [
328 'Cache-Control' => 'no-cache', 409 'cache-control' => 'no-cache',
410 'content-type' => 'text/html',
329 ], 411 ],
330 ] 412 ]
331 ); 413 );
@@ -363,9 +445,11 @@ class ContentProxyTest extends TestCase
363 'html' => str_repeat('this is my content', 325), 445 'html' => str_repeat('this is my content', 325),
364 'title' => 'this is my title', 446 'title' => 'this is my title',
365 'url' => 'http://1.1.1.1', 447 'url' => 'http://1.1.1.1',
366 'content_type' => 'text/html',
367 'language' => 'fr', 448 'language' => 'fr',
368 'date' => '2016-09-08T11:55:58+0200', 449 'date' => '2016-09-08T11:55:58+0200',
450 'headers' => [
451 'content-type' => 'text/html',
452 ],
369 ] 453 ]
370 ); 454 );
371 455
@@ -398,9 +482,11 @@ class ContentProxyTest extends TestCase
398 'html' => str_repeat('this is my content', 325), 482 'html' => str_repeat('this is my content', 325),
399 'title' => 'this is my title', 483 'title' => 'this is my title',
400 'url' => 'http://1.1.1.1', 484 'url' => 'http://1.1.1.1',
401 'content_type' => 'text/html',
402 'language' => 'fr', 485 'language' => 'fr',
403 'date' => '01 02 2012', 486 'date' => '01 02 2012',
487 'headers' => [
488 'content-type' => 'text/html',
489 ],
404 ] 490 ]
405 ); 491 );
406 492
@@ -415,7 +501,7 @@ class ContentProxyTest extends TestCase
415 501
416 $records = $handler->getRecords(); 502 $records = $handler->getRecords();
417 503
418 $this->assertCount(1, $records); 504 $this->assertCount(3, $records);
419 $this->assertContains('Error while defining date', $records[0]['message']); 505 $this->assertContains('Error while defining date', $records[0]['message']);
420 } 506 }
421 507
@@ -435,8 +521,10 @@ class ContentProxyTest extends TestCase
435 'html' => str_repeat('this is my content', 325), 521 'html' => str_repeat('this is my content', 325),
436 'title' => 'this is my title', 522 'title' => 'this is my title',
437 'url' => 'http://1.1.1.1', 523 'url' => 'http://1.1.1.1',
438 'content_type' => 'text/html',
439 'language' => 'fr', 524 'language' => 'fr',
525 'headers' => [
526 'content-type' => 'text/html',
527 ],
440 ] 528 ]
441 ); 529 );
442 530
@@ -475,13 +563,13 @@ class ContentProxyTest extends TestCase
475 'html' => $html, 563 'html' => $html,
476 'title' => 'this is my title', 564 'title' => 'this is my title',
477 'url' => 'http://1.1.1.1', 565 'url' => 'http://1.1.1.1',
478 'content_type' => 'text/html',
479 'language' => 'fr', 566 'language' => 'fr',
480 'status' => '200', 567 'status' => '200',
481 'open_graph' => [ 568 //'og_title' => 'my OG title',
482 'og_title' => 'my OG title', 569 'description' => 'OG desc',
483 'og_description' => 'OG desc', 570 'image' => 'http://3.3.3.3/cover.jpg',
484 'og_image' => 'http://3.3.3.3/cover.jpg', 571 'headers' => [
572 'content-type' => 'text/html',
485 ], 573 ],
486 ] 574 ]
487 ); 575 );
@@ -513,9 +601,10 @@ class ContentProxyTest extends TestCase
513 'html' => '<p><img src="http://1.1.1.1/image.jpg" /></p>', 601 'html' => '<p><img src="http://1.1.1.1/image.jpg" /></p>',
514 'title' => 'this is my title', 602 'title' => 'this is my title',
515 'url' => 'http://1.1.1.1/image.jpg', 603 'url' => 'http://1.1.1.1/image.jpg',
516 'content_type' => 'image/jpeg',
517 'status' => '200', 604 'status' => '200',
518 'open_graph' => [], 605 'headers' => [
606 'content-type' => 'image/jpeg',
607 ],
519 ]); 608 ]);
520 609
521 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage); 610 $proxy = new ContentProxy($graby, $tagger, $this->getValidator(), $this->getLogger(), $this->fetchingErrorMessage);
@@ -553,7 +642,9 @@ class ContentProxyTest extends TestCase
553 'html' => false, 642 'html' => false,
554 'title' => $actualTitle, 643 'title' => $actualTitle,
555 'url' => '', 644 'url' => '',
556 'content_type' => 'text/html', 645 'headers' => [
646 'content-type' => 'text/html',
647 ],
557 'language' => '', 648 'language' => '',
558 ]); 649 ]);
559 650
@@ -588,7 +679,9 @@ class ContentProxyTest extends TestCase
588 'html' => false, 679 'html' => false,
589 'title' => $actualTitle, 680 'title' => $actualTitle,
590 'url' => '', 681 'url' => '',
591 'content_type' => 'text/html', 682 'headers' => [
683 'content-type' => 'text/html',
684 ],
592 'language' => '', 685 'language' => '',
593 ]); 686 ]);
594 687
@@ -622,7 +715,9 @@ class ContentProxyTest extends TestCase
622 'html' => false, 715 'html' => false,
623 'title' => $actualTitle, 716 'title' => $actualTitle,
624 'url' => '', 717 'url' => '',
625 'content_type' => 'application/pdf', 718 'headers' => [
719 'content-type' => 'application/pdf',
720 ],
626 'language' => '', 721 'language' => '',
627 ]); 722 ]);
628 723
@@ -656,7 +751,9 @@ class ContentProxyTest extends TestCase
656 'html' => false, 751 'html' => false,
657 'title' => $actualTitle, 752 'title' => $actualTitle,
658 'url' => '', 753 'url' => '',
659 'content_type' => 'application/pdf', 754 'headers' => [
755 'content-type' => 'application/pdf',
756 ],
660 'language' => '', 757 'language' => '',
661 ]); 758 ]);
662 759
@@ -690,7 +787,9 @@ class ContentProxyTest extends TestCase
690 'html' => false, 787 'html' => false,
691 'title' => $actualTitle, 788 'title' => $actualTitle,
692 'url' => '', 789 'url' => '',
693 'content_type' => 'application/pdf', 790 'headers' => [
791 'content-type' => 'application/pdf',
792 ],
694 'language' => '', 793 'language' => '',
695 ]); 794 ]);
696 795
@@ -725,7 +824,9 @@ class ContentProxyTest extends TestCase
725 'html' => false, 824 'html' => false,
726 'title' => $actualTitle, 825 'title' => $actualTitle,
727 'url' => '', 826 'url' => '',
728 'content_type' => 'application/pdf', 827 'headers' => [
828 'content-type' => 'application/pdf',
829 ],
729 'language' => '', 830 'language' => '',
730 ]); 831 ]);
731 832
@@ -855,7 +956,9 @@ class ContentProxyTest extends TestCase
855 'html' => false, 956 'html' => false,
856 'title' => '', 957 'title' => '',
857 'url' => $content_url, 958 'url' => $content_url,
858 'content_type' => '', 959 'headers' => [
960 'content-type' => '',
961 ],
859 'language' => '', 962 'language' => '',
860 ], 963 ],
861 true 964 true
@@ -886,7 +989,9 @@ class ContentProxyTest extends TestCase
886 } 989 }
887 990
888 /** 991 /**
889 * https://stackoverflow.com/a/18506801. 992 * Convert hex to string.
993 *
994 * @see https://stackoverflow.com/a/18506801
890 * 995 *
891 * @param $hex 996 * @param $hex
892 * 997 *
diff --git a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
index cda5f843..3c720425 100644
--- a/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
+++ b/tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
@@ -2,10 +2,8 @@
2 2
3namespace Tests\Wallabag\CoreBundle\Helper; 3namespace Tests\Wallabag\CoreBundle\Helper;
4 4
5use GuzzleHttp\Client; 5use GuzzleHttp\Psr7\Response;
6use GuzzleHttp\Message\Response; 6use Http\Mock\Client as HttpMockClient;
7use GuzzleHttp\Stream\Stream;
8use GuzzleHttp\Subscriber\Mock;
9use Monolog\Handler\TestHandler; 7use Monolog\Handler\TestHandler;
10use Monolog\Logger; 8use Monolog\Logger;
11use PHPUnit\Framework\TestCase; 9use PHPUnit\Framework\TestCase;
@@ -32,18 +30,14 @@ class DownloadImagesTest extends TestCase
32 */ 30 */
33 public function testProcessHtml($html, $url) 31 public function testProcessHtml($html, $url)
34 { 32 {
35 $client = new Client(); 33 $httpMockClient = new HttpMockClient();
36 34
37 $mock = new Mock([ 35 $httpMockClient->addResponse(new Response(200, ['content-type' => 'image/png'], file_get_contents(__DIR__ . '/../fixtures/unnamed.png')));
38 new Response(200, ['content-type' => 'image/png'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))),
39 ]);
40
41 $client->getEmitter()->attach($mock);
42 36
43 $logHandler = new TestHandler(); 37 $logHandler = new TestHandler();
44 $logger = new Logger('test', [$logHandler]); 38 $logger = new Logger('test', [$logHandler]);
45 39
46 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 40 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
47 41
48 $res = $download->processHtml(123, $html, $url); 42 $res = $download->processHtml(123, $html, $url);
49 43
@@ -53,18 +47,13 @@ class DownloadImagesTest extends TestCase
53 47
54 public function testProcessHtmlWithBadImage() 48 public function testProcessHtmlWithBadImage()
55 { 49 {
56 $client = new Client(); 50 $httpMockClient = new HttpMockClient();
57 51 $httpMockClient->addResponse(new Response(200, ['content-type' => 'application/json'], ''));
58 $mock = new Mock([
59 new Response(200, ['content-type' => 'application/json'], Stream::factory('')),
60 ]);
61
62 $client->getEmitter()->attach($mock);
63 52
64 $logHandler = new TestHandler(); 53 $logHandler = new TestHandler();
65 $logger = new Logger('test', [$logHandler]); 54 $logger = new Logger('test', [$logHandler]);
66 55
67 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 56 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
68 $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY'); 57 $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY');
69 58
70 $this->assertContains('http://i.imgur.com/T9qgcHc.jpg', $res, 'Image were not replace because of content-type'); 59 $this->assertContains('http://i.imgur.com/T9qgcHc.jpg', $res, 'Image were not replace because of content-type');
@@ -85,18 +74,13 @@ class DownloadImagesTest extends TestCase
85 */ 74 */
86 public function testProcessSingleImage($header, $extension) 75 public function testProcessSingleImage($header, $extension)
87 { 76 {
88 $client = new Client(); 77 $httpMockClient = new HttpMockClient();
89 78 $httpMockClient->addResponse(new Response(200, ['content-type' => $header], file_get_contents(__DIR__ . '/../fixtures/unnamed.png')));
90 $mock = new Mock([
91 new Response(200, ['content-type' => $header], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))),
92 ]);
93
94 $client->getEmitter()->attach($mock);
95 79
96 $logHandler = new TestHandler(); 80 $logHandler = new TestHandler();
97 $logger = new Logger('test', [$logHandler]); 81 $logger = new Logger('test', [$logHandler]);
98 82
99 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 83 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
100 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 84 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
101 85
102 $this->assertContains('/assets/images/9/b/9b0ead26/ebe60399.' . $extension, $res); 86 $this->assertContains('/assets/images/9/b/9b0ead26/ebe60399.' . $extension, $res);
@@ -104,18 +88,13 @@ class DownloadImagesTest extends TestCase
104 88
105 public function testProcessSingleImageWithBadUrl() 89 public function testProcessSingleImageWithBadUrl()
106 { 90 {
107 $client = new Client(); 91 $httpMockClient = new HttpMockClient();
108 92 $httpMockClient->addResponse(new Response(404, []));
109 $mock = new Mock([
110 new Response(404, []),
111 ]);
112
113 $client->getEmitter()->attach($mock);
114 93
115 $logHandler = new TestHandler(); 94 $logHandler = new TestHandler();
116 $logger = new Logger('test', [$logHandler]); 95 $logger = new Logger('test', [$logHandler]);
117 96
118 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 97 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
119 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 98 $res = $download->processSingleImage(123, 'T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
120 99
121 $this->assertFalse($res, 'Image can not be found, so it will not be replaced'); 100 $this->assertFalse($res, 'Image can not be found, so it will not be replaced');
@@ -123,18 +102,13 @@ class DownloadImagesTest extends TestCase
123 102
124 public function testProcessSingleImageWithBadImage() 103 public function testProcessSingleImageWithBadImage()
125 { 104 {
126 $client = new Client(); 105 $httpMockClient = new HttpMockClient();
127 106 $httpMockClient->addResponse(new Response(200, ['content-type' => 'image/png'], ''));
128 $mock = new Mock([
129 new Response(200, ['content-type' => 'image/png'], Stream::factory('')),
130 ]);
131
132 $client->getEmitter()->attach($mock);
133 107
134 $logHandler = new TestHandler(); 108 $logHandler = new TestHandler();
135 $logger = new Logger('test', [$logHandler]); 109 $logger = new Logger('test', [$logHandler]);
136 110
137 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 111 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
138 $res = $download->processSingleImage(123, 'http://i.imgur.com/T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY'); 112 $res = $download->processSingleImage(123, 'http://i.imgur.com/T9qgcHc.jpg', 'http://imgur.com/gallery/WxtWY');
139 113
140 $this->assertFalse($res, 'Image can not be loaded, so it will not be replaced'); 114 $this->assertFalse($res, 'Image can not be loaded, so it will not be replaced');
@@ -142,18 +116,13 @@ class DownloadImagesTest extends TestCase
142 116
143 public function testProcessSingleImageFailAbsolute() 117 public function testProcessSingleImageFailAbsolute()
144 { 118 {
145 $client = new Client(); 119 $httpMockClient = new HttpMockClient();
146 120 $httpMockClient->addResponse(new Response(200, ['content-type' => 'image/png'], file_get_contents(__DIR__ . '/../fixtures/unnamed.png')));
147 $mock = new Mock([
148 new Response(200, ['content-type' => 'image/png'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/unnamed.png'))),
149 ]);
150
151 $client->getEmitter()->attach($mock);
152 121
153 $logHandler = new TestHandler(); 122 $logHandler = new TestHandler();
154 $logger = new Logger('test', [$logHandler]); 123 $logger = new Logger('test', [$logHandler]);
155 124
156 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 125 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
157 $res = $download->processSingleImage(123, '/i.imgur.com/T9qgcHc.jpg', 'imgur.com/gallery/WxtWY'); 126 $res = $download->processSingleImage(123, '/i.imgur.com/T9qgcHc.jpg', 'imgur.com/gallery/WxtWY');
158 127
159 $this->assertFalse($res, 'Absolute image can not be determined, so it will not be replaced'); 128 $this->assertFalse($res, 'Absolute image can not be determined, so it will not be replaced');
@@ -161,18 +130,13 @@ class DownloadImagesTest extends TestCase
161 130
162 public function testProcessRealImage() 131 public function testProcessRealImage()
163 { 132 {
164 $client = new Client(); 133 $httpMockClient = new HttpMockClient();
165 134 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
166 $mock = new Mock([
167 new Response(200, ['content-type' => null], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
168 ]);
169
170 $client->getEmitter()->attach($mock);
171 135
172 $logHandler = new TestHandler(); 136 $logHandler = new TestHandler();
173 $logger = new Logger('test', [$logHandler]); 137 $logger = new Logger('test', [$logHandler]);
174 138
175 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 139 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
176 140
177 $res = $download->processSingleImage( 141 $res = $download->processSingleImage(
178 123, 142 123,
@@ -186,20 +150,15 @@ class DownloadImagesTest extends TestCase
186 150
187 public function testProcessImageWithSrcset() 151 public function testProcessImageWithSrcset()
188 { 152 {
189 $client = new Client(); 153 $httpMockClient = new HttpMockClient();
190 154 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
191 $mock = new Mock([ 155 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
192 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), 156 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
193 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
194 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
195 ]);
196
197 $client->getEmitter()->attach($mock);
198 157
199 $logHandler = new TestHandler(); 158 $logHandler = new TestHandler();
200 $logger = new Logger('test', [$logHandler]); 159 $logger = new Logger('test', [$logHandler]);
201 160
202 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 161 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
203 $res = $download->processHtml(123, '<p><img class="alignnone wp-image-1153" src="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg" alt="" width="628" height="444" srcset="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg 530w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-768x543.jpg 768w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-900x636.jpg 900w" sizes="(max-width: 628px) 100vw, 628px" /></p>', 'http://piketty.blog.lemonde.fr/2017/10/12/budget-2018-la-jeunesse-sacrifiee/'); 162 $res = $download->processHtml(123, '<p><img class="alignnone wp-image-1153" src="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg" alt="" width="628" height="444" srcset="http://piketty.blog.lemonde.fr/files/2017/10/F1FR-530x375.jpg 530w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-768x543.jpg 768w, http://piketty.blog.lemonde.fr/files/2017/10/F1FR-900x636.jpg 900w" sizes="(max-width: 628px) 100vw, 628px" /></p>', 'http://piketty.blog.lemonde.fr/2017/10/12/budget-2018-la-jeunesse-sacrifiee/');
204 163
205 $this->assertNotContains('http://piketty.blog.lemonde.fr/', $res, 'Image srcset attribute were not replaced'); 164 $this->assertNotContains('http://piketty.blog.lemonde.fr/', $res, 'Image srcset attribute were not replaced');
@@ -207,20 +166,15 @@ class DownloadImagesTest extends TestCase
207 166
208 public function testProcessImageWithTrickySrcset() 167 public function testProcessImageWithTrickySrcset()
209 { 168 {
210 $client = new Client(); 169 $httpMockClient = new HttpMockClient();
211 170 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
212 $mock = new Mock([ 171 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
213 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))), 172 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
214 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
215 new Response(200, ['content-type' => 'image/jpeg'], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
216 ]);
217
218 $client->getEmitter()->attach($mock);
219 173
220 $logHandler = new TestHandler(); 174 $logHandler = new TestHandler();
221 $logger = new Logger('test', [$logHandler]); 175 $logger = new Logger('test', [$logHandler]);
222 176
223 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 177 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
224 $res = $download->processHtml(123, '<figure id="post-257260" class="align-none media-257260"><img src="https://cdn.css-tricks.com/wp-content/uploads/2017/08/the-critical-request.png" srcset="https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_1000,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 1000w, https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_200,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 200w" sizes="(min-width: 1850px) calc( (100vw - 555px) / 3 ) 178 $res = $download->processHtml(123, '<figure id="post-257260" class="align-none media-257260"><img src="https://cdn.css-tricks.com/wp-content/uploads/2017/08/the-critical-request.png" srcset="https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_1000,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 1000w, https://res.cloudinary.com/css-tricks/image/upload/c_scale,w_200,f_auto,q_auto/v1501594717/the-critical-request_bqdfaa.png 200w" sizes="(min-width: 1850px) calc( (100vw - 555px) / 3 )
225 (min-width: 1251px) calc( (100vw - 530px) / 2 ) 179 (min-width: 1251px) calc( (100vw - 530px) / 2 )
226 (min-width: 1086px) calc(100vw - 480px) 180 (min-width: 1086px) calc(100vw - 480px)
@@ -232,18 +186,13 @@ class DownloadImagesTest extends TestCase
232 186
233 public function testProcessImageWithNullPath() 187 public function testProcessImageWithNullPath()
234 { 188 {
235 $client = new Client(); 189 $httpMockClient = new HttpMockClient();
236 190 $httpMockClient->addResponse(new Response(200, ['content-type' => null], file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg')));
237 $mock = new Mock([
238 new Response(200, ['content-type' => null], Stream::factory(file_get_contents(__DIR__ . '/../fixtures/image-no-content-type.jpg'))),
239 ]);
240
241 $client->getEmitter()->attach($mock);
242 191
243 $logHandler = new TestHandler(); 192 $logHandler = new TestHandler();
244 $logger = new Logger('test', [$logHandler]); 193 $logger = new Logger('test', [$logHandler]);
245 194
246 $download = new DownloadImages($client, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger); 195 $download = new DownloadImages($httpMockClient, sys_get_temp_dir() . '/wallabag_test', 'http://wallabag.io/', $logger);
247 196
248 $res = $download->processSingleImage( 197 $res = $download->processSingleImage(
249 123, 198 123,
diff --git a/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php b/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
index 1f57939d..2a8e7c89 100644
--- a/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
+++ b/tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
@@ -121,7 +121,7 @@ class WallabagV1ControllerTest extends WallabagCoreTestCase
121 121
122 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content); 122 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
123 $this->assertEmpty($content->getMimetype(), 'Mimetype for http://www.framablog.org is empty'); 123 $this->assertEmpty($content->getMimetype(), 'Mimetype for http://www.framablog.org is empty');
124 $this->assertEmpty($content->getPreviewPicture(), 'Preview picture for http://www.framablog.org is empty'); 124 $this->assertSame($content->getPreviewPicture(), 'http://www.framablog.org/public/_img/framablog/wallaby_baby.jpg');
125 $this->assertEmpty($content->getLanguage(), 'Language for http://www.framablog.org is empty'); 125 $this->assertEmpty($content->getLanguage(), 'Language for http://www.framablog.org is empty');
126 126
127 $tags = $content->getTags(); 127 $tags = $content->getTags();
diff --git a/tests/Wallabag/ImportBundle/Import/PocketImportTest.php b/tests/Wallabag/ImportBundle/Import/PocketImportTest.php
index 8083f1a8..40e1626b 100644
--- a/tests/Wallabag/ImportBundle/Import/PocketImportTest.php
+++ b/tests/Wallabag/ImportBundle/Import/PocketImportTest.php
@@ -2,10 +2,8 @@
2 2
3namespace Tests\Wallabag\ImportBundle\Import; 3namespace Tests\Wallabag\ImportBundle\Import;
4 4
5use GuzzleHttp\Client; 5use GuzzleHttp\Psr7\Response;
6use GuzzleHttp\Message\Response; 6use Http\Mock\Client as HttpMockClient;
7use GuzzleHttp\Stream\Stream;
8use GuzzleHttp\Subscriber\Mock;
9use M6Web\Component\RedisMock\RedisMockFactory; 7use M6Web\Component\RedisMock\RedisMockFactory;
10use Monolog\Handler\TestHandler; 8use Monolog\Handler\TestHandler;
11use Monolog\Logger; 9use Monolog\Logger;
@@ -38,16 +36,11 @@ class PocketImportTest extends TestCase
38 36
39 public function testOAuthRequest() 37 public function testOAuthRequest()
40 { 38 {
41 $client = new Client(); 39 $httpMockClient = new HttpMockClient();
42 40 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['code' => 'wunderbar_code'])));
43 $mock = new Mock([
44 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['code' => 'wunderbar_code']))),
45 ]);
46
47 $client->getEmitter()->attach($mock);
48 41
49 $pocketImport = $this->getPocketImport(); 42 $pocketImport = $this->getPocketImport();
50 $pocketImport->setClient($client); 43 $pocketImport->setClient($httpMockClient);
51 44
52 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect'); 45 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
53 46
@@ -56,16 +49,11 @@ class PocketImportTest extends TestCase
56 49
57 public function testOAuthRequestBadResponse() 50 public function testOAuthRequestBadResponse()
58 { 51 {
59 $client = new Client(); 52 $httpMockClient = new HttpMockClient();
60 53 $httpMockClient->addResponse(new Response(403));
61 $mock = new Mock([
62 new Response(403),
63 ]);
64
65 $client->getEmitter()->attach($mock);
66 54
67 $pocketImport = $this->getPocketImport(); 55 $pocketImport = $this->getPocketImport();
68 $pocketImport->setClient($client); 56 $pocketImport->setClient($httpMockClient);
69 57
70 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect'); 58 $code = $pocketImport->getRequestToken('http://0.0.0.0/redirect');
71 59
@@ -78,16 +66,11 @@ class PocketImportTest extends TestCase
78 66
79 public function testOAuthAuthorize() 67 public function testOAuthAuthorize()
80 { 68 {
81 $client = new Client(); 69 $httpMockClient = new HttpMockClient();
82 70 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
83 $mock = new Mock([
84 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))),
85 ]);
86
87 $client->getEmitter()->attach($mock);
88 71
89 $pocketImport = $this->getPocketImport(); 72 $pocketImport = $this->getPocketImport();
90 $pocketImport->setClient($client); 73 $pocketImport->setClient($httpMockClient);
91 74
92 $res = $pocketImport->authorize('wunderbar_code'); 75 $res = $pocketImport->authorize('wunderbar_code');
93 76
@@ -97,16 +80,11 @@ class PocketImportTest extends TestCase
97 80
98 public function testOAuthAuthorizeBadResponse() 81 public function testOAuthAuthorizeBadResponse()
99 { 82 {
100 $client = new Client(); 83 $httpMockClient = new HttpMockClient();
101 84 $httpMockClient->addResponse(new Response(403));
102 $mock = new Mock([
103 new Response(403),
104 ]);
105
106 $client->getEmitter()->attach($mock);
107 85
108 $pocketImport = $this->getPocketImport(); 86 $pocketImport = $this->getPocketImport();
109 $pocketImport->setClient($client); 87 $pocketImport->setClient($httpMockClient);
110 88
111 $res = $pocketImport->authorize('wunderbar_code'); 89 $res = $pocketImport->authorize('wunderbar_code');
112 90
@@ -122,94 +100,90 @@ class PocketImportTest extends TestCase
122 */ 100 */
123 public function testImport() 101 public function testImport()
124 { 102 {
125 $client = new Client(); 103 $httpMockClient = new HttpMockClient();
126 104 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
127 $mock = new Mock([ 105 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], <<<'JSON'
128 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 106 {
129 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' 107 "status": 1,
130 { 108 "list": {
131 "status": 1, 109 "229279689": {
132 "list": { 110 "item_id": "229279689",
133 "229279689": { 111 "resolved_id": "229279689",
134 "item_id": "229279689", 112 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
135 "resolved_id": "229279689", 113 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
136 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", 114 "favorite": "1",
137 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", 115 "status": "1",
138 "favorite": "1", 116 "time_added": "1473020899",
139 "status": "1", 117 "time_updated": "1473020899",
140 "time_added": "1473020899", 118 "time_read": "0",
141 "time_updated": "1473020899", 119 "time_favorited": "0",
142 "time_read": "0", 120 "sort_id": 0,
143 "time_favorited": "0", 121 "resolved_title": "The Massive Ryder Cup Preview",
144 "sort_id": 0, 122 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
145 "resolved_title": "The Massive Ryder Cup Preview", 123 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
146 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", 124 "is_article": "1",
147 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.", 125 "is_index": "0",
148 "is_article": "1", 126 "has_video": "1",
149 "is_index": "0", 127 "has_image": "1",
150 "has_video": "1", 128 "word_count": "3197",
151 "has_image": "1", 129 "images": {
152 "word_count": "3197", 130 "1": {
153 "images": { 131 "item_id": "229279689",
154 "1": { 132 "image_id": "1",
155 "item_id": "229279689", 133 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360",
156 "image_id": "1", 134 "width": "0",
157 "src": "http://a.espncdn.com/combiner/i?img=/photo/2012/0927/grant_g_ryder_cr_640.jpg&w=640&h=360", 135 "height": "0",
158 "width": "0", 136 "credit": "Jamie Squire/Getty Images",
159 "height": "0", 137 "caption": ""
160 "credit": "Jamie Squire/Getty Images",
161 "caption": ""
162 }
163 },
164 "videos": {
165 "1": {
166 "item_id": "229279689",
167 "video_id": "1",
168 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
169 "width": "420",
170 "height": "315",
171 "type": "1",
172 "vid": "Er34PbFkVGk"
173 }
174 },
175 "tags": {
176 "grantland": {
177 "item_id": "1147652870",
178 "tag": "grantland"
179 },
180 "Ryder Cup": {
181 "item_id": "1147652870",
182 "tag": "Ryder Cup"
183 }
184 } 138 }
185 }, 139 },
186 "229279690": { 140 "videos": {
187 "item_id": "229279689", 141 "1": {
188 "resolved_id": "229279689", 142 "item_id": "229279689",
189 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", 143 "video_id": "1",
190 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", 144 "src": "http://www.youtube.com/v/Er34PbFkVGk?version=3&hl=en_US&rel=0",
191 "favorite": "1", 145 "width": "420",
192 "status": "1", 146 "height": "315",
193 "time_added": "1473020899", 147 "type": "1",
194 "time_updated": "1473020899", 148 "vid": "Er34PbFkVGk"
195 "time_read": "0", 149 }
196 "time_favorited": "0", 150 },
197 "sort_id": 1, 151 "tags": {
198 "resolved_title": "The Massive Ryder Cup Preview", 152 "grantland": {
199 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", 153 "item_id": "1147652870",
200 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.", 154 "tag": "grantland"
201 "is_article": "1", 155 },
202 "is_index": "0", 156 "Ryder Cup": {
203 "has_video": "0", 157 "item_id": "1147652870",
204 "has_image": "0", 158 "tag": "Ryder Cup"
205 "word_count": "3197" 159 }
206 } 160 }
161 },
162 "229279690": {
163 "item_id": "229279689",
164 "resolved_id": "229279689",
165 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
166 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
167 "favorite": "1",
168 "status": "1",
169 "time_added": "1473020899",
170 "time_updated": "1473020899",
171 "time_read": "0",
172 "time_favorited": "0",
173 "sort_id": 1,
174 "resolved_title": "The Massive Ryder Cup Preview",
175 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
176 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
177 "is_article": "1",
178 "is_index": "0",
179 "has_video": "0",
180 "has_image": "0",
181 "word_count": "3197"
207 } 182 }
208 } 183 }
209 ')), 184 }
210 ]); 185JSON
211 186));
212 $client->getEmitter()->attach($mock);
213 187
214 $pocketImport = $this->getPocketImport('ConsumerKey', 1); 188 $pocketImport = $this->getPocketImport('ConsumerKey', 1);
215 189
@@ -240,7 +214,7 @@ class PocketImportTest extends TestCase
240 ->method('updateEntry') 214 ->method('updateEntry')
241 ->willReturn($entry); 215 ->willReturn($entry);
242 216
243 $pocketImport->setClient($client); 217 $pocketImport->setClient($httpMockClient);
244 $pocketImport->authorize('wunderbar_code'); 218 $pocketImport->authorize('wunderbar_code');
245 219
246 $res = $pocketImport->import(); 220 $res = $pocketImport->import();
@@ -254,56 +228,52 @@ class PocketImportTest extends TestCase
254 */ 228 */
255 public function testImportAndMarkAllAsRead() 229 public function testImportAndMarkAllAsRead()
256 { 230 {
257 $client = new Client(); 231 $httpMockClient = new HttpMockClient();
258 232 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
259 $mock = new Mock([ 233 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], <<<'JSON'
260 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 234 {
261 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' 235 "status": 1,
262 { 236 "list": {
263 "status": 1, 237 "229279689": {
264 "list": { 238 "item_id": "229279689",
265 "229279689": { 239 "resolved_id": "229279689",
266 "item_id": "229279689", 240 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview",
267 "resolved_id": "229279689", 241 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
268 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview", 242 "favorite": "1",
269 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", 243 "status": "1",
270 "favorite": "1", 244 "time_added": "1473020899",
271 "status": "1", 245 "time_updated": "1473020899",
272 "time_added": "1473020899", 246 "time_read": "0",
273 "time_updated": "1473020899", 247 "time_favorited": "0",
274 "time_read": "0", 248 "sort_id": 0,
275 "time_favorited": "0", 249 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
276 "sort_id": 0, 250 "is_article": "1",
277 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.", 251 "has_video": "1",
278 "is_article": "1", 252 "has_image": "1",
279 "has_video": "1", 253 "word_count": "3197"
280 "has_image": "1", 254 },
281 "word_count": "3197" 255 "229279690": {
282 }, 256 "item_id": "229279689",
283 "229279690": { 257 "resolved_id": "229279689",
284 "item_id": "229279689", 258 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview/2",
285 "resolved_id": "229279689", 259 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland",
286 "given_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview/2", 260 "favorite": "1",
287 "given_title": "The Massive Ryder Cup Preview - The Triangle Blog - Grantland", 261 "status": "0",
288 "favorite": "1", 262 "time_added": "1473020899",
289 "status": "0", 263 "time_updated": "1473020899",
290 "time_added": "1473020899", 264 "time_read": "0",
291 "time_updated": "1473020899", 265 "time_favorited": "0",
292 "time_read": "0", 266 "sort_id": 1,
293 "time_favorited": "0", 267 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.",
294 "sort_id": 1, 268 "is_article": "1",
295 "excerpt": "The list of things I love about the Ryder Cup is so long that it could fill a (tedious) novel, and golf fans can probably guess most of them.", 269 "has_video": "0",
296 "is_article": "1", 270 "has_image": "0",
297 "has_video": "0", 271 "word_count": "3197"
298 "has_image": "0",
299 "word_count": "3197"
300 }
301 } 272 }
302 } 273 }
303 ')), 274 }
304 ]); 275JSON
305 276));
306 $client->getEmitter()->attach($mock);
307 277
308 $pocketImport = $this->getPocketImport('ConsumerKey', 2); 278 $pocketImport = $this->getPocketImport('ConsumerKey', 2);
309 279
@@ -335,7 +305,7 @@ class PocketImportTest extends TestCase
335 ->method('updateEntry') 305 ->method('updateEntry')
336 ->willReturn($entry); 306 ->willReturn($entry);
337 307
338 $pocketImport->setClient($client); 308 $pocketImport->setClient($httpMockClient);
339 $pocketImport->authorize('wunderbar_code'); 309 $pocketImport->authorize('wunderbar_code');
340 310
341 $res = $pocketImport->setMarkAsRead(true)->import(); 311 $res = $pocketImport->setMarkAsRead(true)->import();
@@ -349,7 +319,7 @@ class PocketImportTest extends TestCase
349 */ 319 */
350 public function testImportWithRabbit() 320 public function testImportWithRabbit()
351 { 321 {
352 $client = new Client(); 322 $httpMockClient = new HttpMockClient();
353 323
354 $body = <<<'JSON' 324 $body = <<<'JSON'
355{ 325{
@@ -374,19 +344,16 @@ class PocketImportTest extends TestCase
374} 344}
375JSON; 345JSON;
376 346
377 $mock = new Mock([ 347 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
378 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 348 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], <<<JSON
379 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' 349 {
380 { 350 "status": 1,
381 "status": 1, 351 "list": {
382 "list": { 352 "229279690": $body
383 "229279690": ' . $body . '
384 }
385 } 353 }
386 ')), 354 }
387 ]); 355JSON
388 356 ));
389 $client->getEmitter()->attach($mock);
390 357
391 $pocketImport = $this->getPocketImport(); 358 $pocketImport = $this->getPocketImport();
392 359
@@ -420,7 +387,7 @@ JSON;
420 ->method('publish') 387 ->method('publish')
421 ->with(json_encode($bodyAsArray)); 388 ->with(json_encode($bodyAsArray));
422 389
423 $pocketImport->setClient($client); 390 $pocketImport->setClient($httpMockClient);
424 $pocketImport->setProducer($producer); 391 $pocketImport->setProducer($producer);
425 $pocketImport->authorize('wunderbar_code'); 392 $pocketImport->authorize('wunderbar_code');
426 393
@@ -435,7 +402,7 @@ JSON;
435 */ 402 */
436 public function testImportWithRedis() 403 public function testImportWithRedis()
437 { 404 {
438 $client = new Client(); 405 $httpMockClient = new HttpMockClient();
439 406
440 $body = <<<'JSON' 407 $body = <<<'JSON'
441{ 408{
@@ -460,19 +427,16 @@ JSON;
460} 427}
461JSON; 428JSON;
462 429
463 $mock = new Mock([ 430 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
464 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 431 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], <<<JSON
465 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' 432 {
466 { 433 "status": 1,
467 "status": 1, 434 "list": {
468 "list": { 435 "229279690": $body
469 "229279690": ' . $body . '
470 }
471 } 436 }
472 ')), 437 }
473 ]); 438JSON
474 439 ));
475 $client->getEmitter()->attach($mock);
476 440
477 $pocketImport = $this->getPocketImport(); 441 $pocketImport = $this->getPocketImport();
478 442
@@ -499,7 +463,7 @@ JSON;
499 $queue = new RedisQueue($redisMock, 'pocket'); 463 $queue = new RedisQueue($redisMock, 'pocket');
500 $producer = new Producer($queue); 464 $producer = new Producer($queue);
501 465
502 $pocketImport->setClient($client); 466 $pocketImport->setClient($httpMockClient);
503 $pocketImport->setProducer($producer); 467 $pocketImport->setProducer($producer);
504 $pocketImport->authorize('wunderbar_code'); 468 $pocketImport->authorize('wunderbar_code');
505 469
@@ -513,17 +477,13 @@ JSON;
513 477
514 public function testImportBadResponse() 478 public function testImportBadResponse()
515 { 479 {
516 $client = new Client(); 480 $httpMockClient = new HttpMockClient();
517 481
518 $mock = new Mock([ 482 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
519 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 483 $httpMockClient->addResponse(new Response(403));
520 new Response(403),
521 ]);
522
523 $client->getEmitter()->attach($mock);
524 484
525 $pocketImport = $this->getPocketImport(); 485 $pocketImport = $this->getPocketImport();
526 $pocketImport->setClient($client); 486 $pocketImport->setClient($httpMockClient);
527 $pocketImport->authorize('wunderbar_code'); 487 $pocketImport->authorize('wunderbar_code');
528 488
529 $res = $pocketImport->import(); 489 $res = $pocketImport->import();
@@ -537,25 +497,23 @@ JSON;
537 497
538 public function testImportWithExceptionFromGraby() 498 public function testImportWithExceptionFromGraby()
539 { 499 {
540 $client = new Client(); 500 $httpMockClient = new HttpMockClient();
541 501
542 $mock = new Mock([ 502 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], json_encode(['access_token' => 'wunderbar_token'])));
543 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(json_encode(['access_token' => 'wunderbar_token']))), 503 $httpMockClient->addResponse(new Response(200, ['Content-Type' => 'application/json'], <<<'JSON'
544 new Response(200, ['Content-Type' => 'application/json'], Stream::factory(' 504 {
545 { 505 "status": 1,
546 "status": 1, 506 "list": {
547 "list": { 507 "229279689": {
548 "229279689": { 508 "status": "1",
549 "status": "1", 509 "favorite": "1",
550 "favorite": "1", 510 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
551 "resolved_url": "http://www.grantland.com/blog/the-triangle/post/_/id/38347/ryder-cup-preview"
552 }
553 } 511 }
554 } 512 }
555 ')), 513 }
556 ]); 514
557 515JSON
558 $client->getEmitter()->attach($mock); 516 ));
559 517
560 $pocketImport = $this->getPocketImport('ConsumerKey', 1); 518 $pocketImport = $this->getPocketImport('ConsumerKey', 1);
561 519
@@ -579,7 +537,7 @@ JSON;
579 ->method('updateEntry') 537 ->method('updateEntry')
580 ->will($this->throwException(new \Exception())); 538 ->will($this->throwException(new \Exception()));
581 539
582 $pocketImport->setClient($client); 540 $pocketImport->setClient($httpMockClient);
583 $pocketImport->authorize('wunderbar_code'); 541 $pocketImport->authorize('wunderbar_code');
584 542
585 $res = $pocketImport->import(); 543 $res = $pocketImport->import();
diff --git a/web/wallassets/material.css b/web/wallassets/material.css
index 31f2cfeb..2baf1b1e 100644
--- a/web/wallassets/material.css
+++ b/web/wallassets/material.css
@@ -1,2 +1,2 @@
1.materialize-red{background-color:#e51c23!important}.materialize-red-text{color:#e51c23!important}.materialize-red.lighten-5{background-color:#fdeaeb!important}.materialize-red-text.text-lighten-5{color:#fdeaeb!important}.materialize-red.lighten-4{background-color:#f8c1c3!important}.materialize-red-text.text-lighten-4{color:#f8c1c3!important}.materialize-red.lighten-3{background-color:#f3989b!important}.materialize-red-text.text-lighten-3{color:#f3989b!important}.materialize-red.lighten-2{background-color:#ee6e73!important}.materialize-red-text.text-lighten-2{color:#ee6e73!important}.materialize-red.lighten-1{background-color:#ea454b!important}.materialize-red-text.text-lighten-1{color:#ea454b!important}.materialize-red.darken-1{background-color:#d0181e!important}.materialize-red-text.text-darken-1{color:#d0181e!important}.materialize-red.darken-2{background-color:#b9151b!important}.materialize-red-text.text-darken-2{color:#b9151b!important}.materialize-red.darken-3{background-color:#a21318!important}.materialize-red-text.text-darken-3{color:#a21318!important}.materialize-red.darken-4{background-color:#8b1014!important}.materialize-red-text.text-darken-4{color:#8b1014!important}.red{background-color:#f44336!important}.red-text{color:#f44336!important}.red.lighten-5{background-color:#ffebee!important}.red-text.text-lighten-5{color:#ffebee!important}.red.lighten-4{background-color:#ffcdd2!important}.red-text.text-lighten-4{color:#ffcdd2!important}.red.lighten-3{background-color:#ef9a9a!important}.red-text.text-lighten-3{color:#ef9a9a!important}.red.lighten-2{background-color:#e57373!important}.red-text.text-lighten-2{color:#e57373!important}.red.lighten-1{background-color:#ef5350!important}.red-text.text-lighten-1{color:#ef5350!important}.red.darken-1{background-color:#e53935!important}.red-text.text-darken-1{color:#e53935!important}.red.darken-2{background-color:#d32f2f!important}.red-text.text-darken-2{color:#d32f2f!important}.red.darken-3{background-color:#c62828!important}.red-text.text-darken-3{color:#c62828!important}.red.darken-4{background-color:#b71c1c!important}.red-text.text-darken-4{color:#b71c1c!important}.red.accent-1{background-color:#ff8a80!important}.red-text.text-accent-1{color:#ff8a80!important}.red.accent-2{background-color:#ff5252!important}.red-text.text-accent-2{color:#ff5252!important}.red.accent-3{background-color:#ff1744!important}.red-text.text-accent-3{color:#ff1744!important}.red.accent-4{background-color:#d50000!important}.red-text.text-accent-4{color:#d50000!important}.pink{background-color:#e91e63!important}.pink-text{color:#e91e63!important}.pink.lighten-5{background-color:#fce4ec!important}.pink-text.text-lighten-5{color:#fce4ec!important}.pink.lighten-4{background-color:#f8bbd0!important}.pink-text.text-lighten-4{color:#f8bbd0!important}.pink.lighten-3{background-color:#f48fb1!important}.pink-text.text-lighten-3{color:#f48fb1!important}.pink.lighten-2{background-color:#f06292!important}.pink-text.text-lighten-2{color:#f06292!important}.pink.lighten-1{background-color:#ec407a!important}.pink-text.text-lighten-1{color:#ec407a!important}.pink.darken-1{background-color:#d81b60!important}.pink-text.text-darken-1{color:#d81b60!important}.pink.darken-2{background-color:#c2185b!important}.pink-text.text-darken-2{color:#c2185b!important}.pink.darken-3{background-color:#ad1457!important}.pink-text.text-darken-3{color:#ad1457!important}.pink.darken-4{background-color:#880e4f!important}.pink-text.text-darken-4{color:#880e4f!important}.pink.accent-1{background-color:#ff80ab!important}.pink-text.text-accent-1{color:#ff80ab!important}.pink.accent-2{background-color:#ff4081!important}.pink-text.text-accent-2{color:#ff4081!important}.pink.accent-3{background-color:#f50057!important}.pink-text.text-accent-3{color:#f50057!important}.pink.accent-4{background-color:#c51162!important}.pink-text.text-accent-4{color:#c51162!important}.purple{background-color:#9c27b0!important}.purple-text{color:#9c27b0!important}.purple.lighten-5{background-color:#f3e5f5!important}.purple-text.text-lighten-5{color:#f3e5f5!important}.purple.lighten-4{background-color:#e1bee7!important}.purple-text.text-lighten-4{color:#e1bee7!important}.purple.lighten-3{background-color:#ce93d8!important}.purple-text.text-lighten-3{color:#ce93d8!important}.purple.lighten-2{background-color:#ba68c8!important}.purple-text.text-lighten-2{color:#ba68c8!important}.purple.lighten-1{background-color:#ab47bc!important}.purple-text.text-lighten-1{color:#ab47bc!important}.purple.darken-1{background-color:#8e24aa!important}.purple-text.text-darken-1{color:#8e24aa!important}.purple.darken-2{background-color:#7b1fa2!important}.purple-text.text-darken-2{color:#7b1fa2!important}.purple.darken-3{background-color:#6a1b9a!important}.purple-text.text-darken-3{color:#6a1b9a!important}.purple.darken-4{background-color:#4a148c!important}.purple-text.text-darken-4{color:#4a148c!important}.purple.accent-1{background-color:#ea80fc!important}.purple-text.text-accent-1{color:#ea80fc!important}.purple.accent-2{background-color:#e040fb!important}.purple-text.text-accent-2{color:#e040fb!important}.purple.accent-3{background-color:#d500f9!important}.purple-text.text-accent-3{color:#d500f9!important}.purple.accent-4{background-color:#a0f!important}.purple-text.text-accent-4{color:#a0f!important}.deep-purple{background-color:#673ab7!important}.deep-purple-text{color:#673ab7!important}.deep-purple.lighten-5{background-color:#ede7f6!important}.deep-purple-text.text-lighten-5{color:#ede7f6!important}.deep-purple.lighten-4{background-color:#d1c4e9!important}.deep-purple-text.text-lighten-4{color:#d1c4e9!important}.deep-purple.lighten-3{background-color:#b39ddb!important}.deep-purple-text.text-lighten-3{color:#b39ddb!important}.deep-purple.lighten-2{background-color:#9575cd!important}.deep-purple-text.text-lighten-2{color:#9575cd!important}.deep-purple.lighten-1{background-color:#7e57c2!important}.deep-purple-text.text-lighten-1{color:#7e57c2!important}.deep-purple.darken-1{background-color:#5e35b1!important}.deep-purple-text.text-darken-1{color:#5e35b1!important}.deep-purple.darken-2{background-color:#512da8!important}.deep-purple-text.text-darken-2{color:#512da8!important}.deep-purple.darken-3{background-color:#4527a0!important}.deep-purple-text.text-darken-3{color:#4527a0!important}.deep-purple.darken-4{background-color:#311b92!important}.deep-purple-text.text-darken-4{color:#311b92!important}.deep-purple.accent-1{background-color:#b388ff!important}.deep-purple-text.text-accent-1{color:#b388ff!important}.deep-purple.accent-2{background-color:#7c4dff!important}.deep-purple-text.text-accent-2{color:#7c4dff!important}.deep-purple.accent-3{background-color:#651fff!important}.deep-purple-text.text-accent-3{color:#651fff!important}.deep-purple.accent-4{background-color:#6200ea!important}.deep-purple-text.text-accent-4{color:#6200ea!important}.indigo{background-color:#3f51b5!important}.indigo-text{color:#3f51b5!important}.indigo.lighten-5{background-color:#e8eaf6!important}.indigo-text.text-lighten-5{color:#e8eaf6!important}.indigo.lighten-4{background-color:#c5cae9!important}.indigo-text.text-lighten-4{color:#c5cae9!important}.indigo.lighten-3{background-color:#9fa8da!important}.indigo-text.text-lighten-3{color:#9fa8da!important}.indigo.lighten-2{background-color:#7986cb!important}.indigo-text.text-lighten-2{color:#7986cb!important}.indigo.lighten-1{background-color:#5c6bc0!important}.indigo-text.text-lighten-1{color:#5c6bc0!important}.indigo.darken-1{background-color:#3949ab!important}.indigo-text.text-darken-1{color:#3949ab!important}.indigo.darken-2{background-color:#303f9f!important}.indigo-text.text-darken-2{color:#303f9f!important}.indigo.darken-3{background-color:#283593!important}.indigo-text.text-darken-3{color:#283593!important}.indigo.darken-4{background-color:#1a237e!important}.indigo-text.text-darken-4{color:#1a237e!important}.indigo.accent-1{background-color:#8c9eff!important}.indigo-text.text-accent-1{color:#8c9eff!important}.indigo.accent-2{background-color:#536dfe!important}.indigo-text.text-accent-2{color:#536dfe!important}.indigo.accent-3{background-color:#3d5afe!important}.indigo-text.text-accent-3{color:#3d5afe!important}.indigo.accent-4{background-color:#304ffe!important}.indigo-text.text-accent-4{color:#304ffe!important}.blue{background-color:#2196f3!important}.blue-text{color:#2196f3!important}.blue.lighten-5{background-color:#e3f2fd!important}.blue-text.text-lighten-5{color:#e3f2fd!important}.blue.lighten-4{background-color:#bbdefb!important}.blue-text.text-lighten-4{color:#bbdefb!important}.blue.lighten-3{background-color:#90caf9!important}.blue-text.text-lighten-3{color:#90caf9!important}.blue.lighten-2{background-color:#64b5f6!important}.blue-text.text-lighten-2{color:#64b5f6!important}.blue.lighten-1{background-color:#42a5f5!important}.blue-text.text-lighten-1{color:#42a5f5!important}.blue.darken-1{background-color:#1e88e5!important}.blue-text.text-darken-1{color:#1e88e5!important}.blue.darken-2{background-color:#1976d2!important}.blue-text.text-darken-2{color:#1976d2!important}.blue.darken-3{background-color:#1565c0!important}.blue-text.text-darken-3{color:#1565c0!important}.blue.darken-4{background-color:#0d47a1!important}.blue-text.text-darken-4{color:#0d47a1!important}.blue.accent-1{background-color:#82b1ff!important}.blue-text.text-accent-1{color:#82b1ff!important}.blue.accent-2{background-color:#448aff!important}.blue-text.text-accent-2{color:#448aff!important}.blue.accent-3{background-color:#2979ff!important}.blue-text.text-accent-3{color:#2979ff!important}.blue.accent-4{background-color:#2962ff!important}.blue-text.text-accent-4{color:#2962ff!important}.light-blue{background-color:#03a9f4!important}.light-blue-text{color:#03a9f4!important}.light-blue.lighten-5{background-color:#e1f5fe!important}.light-blue-text.text-lighten-5{color:#e1f5fe!important}.light-blue.lighten-4{background-color:#b3e5fc!important}.light-blue-text.text-lighten-4{color:#b3e5fc!important}.light-blue.lighten-3{background-color:#81d4fa!important}.light-blue-text.text-lighten-3{color:#81d4fa!important}.light-blue.lighten-2{background-color:#4fc3f7!important}.light-blue-text.text-lighten-2{color:#4fc3f7!important}.light-blue.lighten-1{background-color:#29b6f6!important}.light-blue-text.text-lighten-1{color:#29b6f6!important}.light-blue.darken-1{background-color:#039be5!important}.light-blue-text.text-darken-1{color:#039be5!important}.light-blue.darken-2{background-color:#0288d1!important}.light-blue-text.text-darken-2{color:#0288d1!important}.light-blue.darken-3{background-color:#0277bd!important}.light-blue-text.text-darken-3{color:#0277bd!important}.light-blue.darken-4{background-color:#01579b!important}.light-blue-text.text-darken-4{color:#01579b!important}.light-blue.accent-1{background-color:#80d8ff!important}.light-blue-text.text-accent-1{color:#80d8ff!important}.light-blue.accent-2{background-color:#40c4ff!important}.light-blue-text.text-accent-2{color:#40c4ff!important}.light-blue.accent-3{background-color:#00b0ff!important}.light-blue-text.text-accent-3{color:#00b0ff!important}.light-blue.accent-4{background-color:#0091ea!important}.light-blue-text.text-accent-4{color:#0091ea!important}.cyan{background-color:#00bcd4!important}.cyan-text{color:#00bcd4!important}.cyan.lighten-5{background-color:#e0f7fa!important}.cyan-text.text-lighten-5{color:#e0f7fa!important}.cyan.lighten-4{background-color:#b2ebf2!important}.cyan-text.text-lighten-4{color:#b2ebf2!important}.cyan.lighten-3{background-color:#80deea!important}.cyan-text.text-lighten-3{color:#80deea!important}.cyan.lighten-2{background-color:#4dd0e1!important}.cyan-text.text-lighten-2{color:#4dd0e1!important}.cyan.lighten-1{background-color:#26c6da!important}.cyan-text.text-lighten-1{color:#26c6da!important}.cyan.darken-1{background-color:#00acc1!important}.cyan-text.text-darken-1{color:#00acc1!important}.cyan.darken-2{background-color:#0097a7!important}.cyan-text.text-darken-2{color:#0097a7!important}.cyan.darken-3{background-color:#00838f!important}.cyan-text.text-darken-3{color:#00838f!important}.cyan.darken-4{background-color:#006064!important}.cyan-text.text-darken-4{color:#006064!important}.cyan.accent-1{background-color:#84ffff!important}.cyan-text.text-accent-1{color:#84ffff!important}.cyan.accent-2{background-color:#18ffff!important}.cyan-text.text-accent-2{color:#18ffff!important}.cyan.accent-3{background-color:#00e5ff!important}.cyan-text.text-accent-3{color:#00e5ff!important}.cyan.accent-4{background-color:#00b8d4!important}.cyan-text.text-accent-4{color:#00b8d4!important}.teal{background-color:#009688!important}.teal-text{color:#009688!important}.teal.lighten-5{background-color:#e0f2f1!important}.teal-text.text-lighten-5{color:#e0f2f1!important}.teal.lighten-4{background-color:#b2dfdb!important}.teal-text.text-lighten-4{color:#b2dfdb!important}.teal.lighten-3{background-color:#80cbc4!important}.teal-text.text-lighten-3{color:#80cbc4!important}.teal.lighten-2{background-color:#4db6ac!important}.teal-text.text-lighten-2{color:#4db6ac!important}.teal.lighten-1{background-color:#26a69a!important}.teal-text.text-lighten-1{color:#26a69a!important}.teal.darken-1{background-color:#00897b!important}.teal-text.text-darken-1{color:#00897b!important}.teal.darken-2{background-color:#00796b!important}.teal-text.text-darken-2{color:#00796b!important}.teal.darken-3{background-color:#00695c!important}.teal-text.text-darken-3{color:#00695c!important}.teal.darken-4{background-color:#004d40!important}.teal-text.text-darken-4{color:#004d40!important}.teal.accent-1{background-color:#a7ffeb!important}.teal-text.text-accent-1{color:#a7ffeb!important}.teal.accent-2{background-color:#64ffda!important}.teal-text.text-accent-2{color:#64ffda!important}.teal.accent-3{background-color:#1de9b6!important}.teal-text.text-accent-3{color:#1de9b6!important}.teal.accent-4{background-color:#00bfa5!important}.teal-text.text-accent-4{color:#00bfa5!important}.green{background-color:#4caf50!important}.green-text{color:#4caf50!important}.green.lighten-5{background-color:#e8f5e9!important}.green-text.text-lighten-5{color:#e8f5e9!important}.green.lighten-4{background-color:#c8e6c9!important}.green-text.text-lighten-4{color:#c8e6c9!important}.green.lighten-3{background-color:#a5d6a7!important}.green-text.text-lighten-3{color:#a5d6a7!important}.green.lighten-2{background-color:#81c784!important}.green-text.text-lighten-2{color:#81c784!important}.green.lighten-1{background-color:#66bb6a!important}.green-text.text-lighten-1{color:#66bb6a!important}.green.darken-1{background-color:#43a047!important}.green-text.text-darken-1{color:#43a047!important}.green.darken-2{background-color:#388e3c!important}.green-text.text-darken-2{color:#388e3c!important}.green.darken-3{background-color:#2e7d32!important}.green-text.text-darken-3{color:#2e7d32!important}.green.darken-4{background-color:#1b5e20!important}.green-text.text-darken-4{color:#1b5e20!important}.green.accent-1{background-color:#b9f6ca!important}.green-text.text-accent-1{color:#b9f6ca!important}.green.accent-2{background-color:#69f0ae!important}.green-text.text-accent-2{color:#69f0ae!important}.green.accent-3{background-color:#00e676!important}.green-text.text-accent-3{color:#00e676!important}.green.accent-4{background-color:#00c853!important}.green-text.text-accent-4{color:#00c853!important}.light-green{background-color:#8bc34a!important}.light-green-text{color:#8bc34a!important}.light-green.lighten-5{background-color:#f1f8e9!important}.light-green-text.text-lighten-5{color:#f1f8e9!important}.light-green.lighten-4{background-color:#dcedc8!important}.light-green-text.text-lighten-4{color:#dcedc8!important}.light-green.lighten-3{background-color:#c5e1a5!important}.light-green-text.text-lighten-3{color:#c5e1a5!important}.light-green.lighten-2{background-color:#aed581!important}.light-green-text.text-lighten-2{color:#aed581!important}.light-green.lighten-1{background-color:#9ccc65!important}.light-green-text.text-lighten-1{color:#9ccc65!important}.light-green.darken-1{background-color:#7cb342!important}.light-green-text.text-darken-1{color:#7cb342!important}.light-green.darken-2{background-color:#689f38!important}.light-green-text.text-darken-2{color:#689f38!important}.light-green.darken-3{background-color:#558b2f!important}.light-green-text.text-darken-3{color:#558b2f!important}.light-green.darken-4{background-color:#33691e!important}.light-green-text.text-darken-4{color:#33691e!important}.light-green.accent-1{background-color:#ccff90!important}.light-green-text.text-accent-1{color:#ccff90!important}.light-green.accent-2{background-color:#b2ff59!important}.light-green-text.text-accent-2{color:#b2ff59!important}.light-green.accent-3{background-color:#76ff03!important}.light-green-text.text-accent-3{color:#76ff03!important}.light-green.accent-4{background-color:#64dd17!important}.light-green-text.text-accent-4{color:#64dd17!important}.lime{background-color:#cddc39!important}.lime-text{color:#cddc39!important}.lime.lighten-5{background-color:#f9fbe7!important}.lime-text.text-lighten-5{color:#f9fbe7!important}.lime.lighten-4{background-color:#f0f4c3!important}.lime-text.text-lighten-4{color:#f0f4c3!important}.lime.lighten-3{background-color:#e6ee9c!important}.lime-text.text-lighten-3{color:#e6ee9c!important}.lime.lighten-2{background-color:#dce775!important}.lime-text.text-lighten-2{color:#dce775!important}.lime.lighten-1{background-color:#d4e157!important}.lime-text.text-lighten-1{color:#d4e157!important}.lime.darken-1{background-color:#c0ca33!important}.lime-text.text-darken-1{color:#c0ca33!important}.lime.darken-2{background-color:#afb42b!important}.lime-text.text-darken-2{color:#afb42b!important}.lime.darken-3{background-color:#9e9d24!important}.lime-text.text-darken-3{color:#9e9d24!important}.lime.darken-4{background-color:#827717!important}.lime-text.text-darken-4{color:#827717!important}.lime.accent-1{background-color:#f4ff81!important}.lime-text.text-accent-1{color:#f4ff81!important}.lime.accent-2{background-color:#eeff41!important}.lime-text.text-accent-2{color:#eeff41!important}.lime.accent-3{background-color:#c6ff00!important}.lime-text.text-accent-3{color:#c6ff00!important}.lime.accent-4{background-color:#aeea00!important}.lime-text.text-accent-4{color:#aeea00!important}.yellow{background-color:#ffeb3b!important}.yellow-text{color:#ffeb3b!important}.yellow.lighten-5{background-color:#fffde7!important}.yellow-text.text-lighten-5{color:#fffde7!important}.yellow.lighten-4{background-color:#fff9c4!important}.yellow-text.text-lighten-4{color:#fff9c4!important}.yellow.lighten-3{background-color:#fff59d!important}.yellow-text.text-lighten-3{color:#fff59d!important}.yellow.lighten-2{background-color:#fff176!important}.yellow-text.text-lighten-2{color:#fff176!important}.yellow.lighten-1{background-color:#ffee58!important}.yellow-text.text-lighten-1{color:#ffee58!important}.yellow.darken-1{background-color:#fdd835!important}.yellow-text.text-darken-1{color:#fdd835!important}.yellow.darken-2{background-color:#fbc02d!important}.yellow-text.text-darken-2{color:#fbc02d!important}.yellow.darken-3{background-color:#f9a825!important}.yellow-text.text-darken-3{color:#f9a825!important}.yellow.darken-4{background-color:#f57f17!important}.yellow-text.text-darken-4{color:#f57f17!important}.yellow.accent-1{background-color:#ffff8d!important}.yellow-text.text-accent-1{color:#ffff8d!important}.yellow.accent-2{background-color:#ff0!important}.yellow-text.text-accent-2{color:#ff0!important}.yellow.accent-3{background-color:#ffea00!important}.yellow-text.text-accent-3{color:#ffea00!important}.yellow.accent-4{background-color:#ffd600!important}.yellow-text.text-accent-4{color:#ffd600!important}.amber{background-color:#ffc107!important}.amber-text{color:#ffc107!important}.amber.lighten-5{background-color:#fff8e1!important}.amber-text.text-lighten-5{color:#fff8e1!important}.amber.lighten-4{background-color:#ffecb3!important}.amber-text.text-lighten-4{color:#ffecb3!important}.amber.lighten-3{background-color:#ffe082!important}.amber-text.text-lighten-3{color:#ffe082!important}.amber.lighten-2{background-color:#ffd54f!important}.amber-text.text-lighten-2{color:#ffd54f!important}.amber.lighten-1{background-color:#ffca28!important}.amber-text.text-lighten-1{color:#ffca28!important}.amber.darken-1{background-color:#ffb300!important}.amber-text.text-darken-1{color:#ffb300!important}.amber.darken-2{background-color:#ffa000!important}.amber-text.text-darken-2{color:#ffa000!important}.amber.darken-3{background-color:#ff8f00!important}.amber-text.text-darken-3{color:#ff8f00!important}.amber.darken-4{background-color:#ff6f00!important}.amber-text.text-darken-4{color:#ff6f00!important}.amber.accent-1{background-color:#ffe57f!important}.amber-text.text-accent-1{color:#ffe57f!important}.amber.accent-2{background-color:#ffd740!important}.amber-text.text-accent-2{color:#ffd740!important}.amber.accent-3{background-color:#ffc400!important}.amber-text.text-accent-3{color:#ffc400!important}.amber.accent-4{background-color:#ffab00!important}.amber-text.text-accent-4{color:#ffab00!important}.orange{background-color:#ff9800!important}.orange-text{color:#ff9800!important}.orange.lighten-5{background-color:#fff3e0!important}.orange-text.text-lighten-5{color:#fff3e0!important}.orange.lighten-4{background-color:#ffe0b2!important}.orange-text.text-lighten-4{color:#ffe0b2!important}.orange.lighten-3{background-color:#ffcc80!important}.orange-text.text-lighten-3{color:#ffcc80!important}.orange.lighten-2{background-color:#ffb74d!important}.orange-text.text-lighten-2{color:#ffb74d!important}.orange.lighten-1{background-color:#ffa726!important}.orange-text.text-lighten-1{color:#ffa726!important}.orange.darken-1{background-color:#fb8c00!important}.orange-text.text-darken-1{color:#fb8c00!important}.orange.darken-2{background-color:#f57c00!important}.orange-text.text-darken-2{color:#f57c00!important}.orange.darken-3{background-color:#ef6c00!important}.orange-text.text-darken-3{color:#ef6c00!important}.orange.darken-4{background-color:#e65100!important}.orange-text.text-darken-4{color:#e65100!important}.orange.accent-1{background-color:#ffd180!important}.orange-text.text-accent-1{color:#ffd180!important}.orange.accent-2{background-color:#ffab40!important}.orange-text.text-accent-2{color:#ffab40!important}.orange.accent-3{background-color:#ff9100!important}.orange-text.text-accent-3{color:#ff9100!important}.orange.accent-4{background-color:#ff6d00!important}.orange-text.text-accent-4{color:#ff6d00!important}.deep-orange{background-color:#ff5722!important}.deep-orange-text{color:#ff5722!important}.deep-orange.lighten-5{background-color:#fbe9e7!important}.deep-orange-text.text-lighten-5{color:#fbe9e7!important}.deep-orange.lighten-4{background-color:#ffccbc!important}.deep-orange-text.text-lighten-4{color:#ffccbc!important}.deep-orange.lighten-3{background-color:#ffab91!important}.deep-orange-text.text-lighten-3{color:#ffab91!important}.deep-orange.lighten-2{background-color:#ff8a65!important}.deep-orange-text.text-lighten-2{color:#ff8a65!important}.deep-orange.lighten-1{background-color:#ff7043!important}.deep-orange-text.text-lighten-1{color:#ff7043!important}.deep-orange.darken-1{background-color:#f4511e!important}.deep-orange-text.text-darken-1{color:#f4511e!important}.deep-orange.darken-2{background-color:#e64a19!important}.deep-orange-text.text-darken-2{color:#e64a19!important}.deep-orange.darken-3{background-color:#d84315!important}.deep-orange-text.text-darken-3{color:#d84315!important}.deep-orange.darken-4{background-color:#bf360c!important}.deep-orange-text.text-darken-4{color:#bf360c!important}.deep-orange.accent-1{background-color:#ff9e80!important}.deep-orange-text.text-accent-1{color:#ff9e80!important}.deep-orange.accent-2{background-color:#ff6e40!important}.deep-orange-text.text-accent-2{color:#ff6e40!important}.deep-orange.accent-3{background-color:#ff3d00!important}.deep-orange-text.text-accent-3{color:#ff3d00!important}.deep-orange.accent-4{background-color:#dd2c00!important}.deep-orange-text.text-accent-4{color:#dd2c00!important}.brown{background-color:#795548!important}.brown-text{color:#795548!important}.brown.lighten-5{background-color:#efebe9!important}.brown-text.text-lighten-5{color:#efebe9!important}.brown.lighten-4{background-color:#d7ccc8!important}.brown-text.text-lighten-4{color:#d7ccc8!important}.brown.lighten-3{background-color:#bcaaa4!important}.brown-text.text-lighten-3{color:#bcaaa4!important}.brown.lighten-2{background-color:#a1887f!important}.brown-text.text-lighten-2{color:#a1887f!important}.brown.lighten-1{background-color:#8d6e63!important}.brown-text.text-lighten-1{color:#8d6e63!important}.brown.darken-1{background-color:#6d4c41!important}.brown-text.text-darken-1{color:#6d4c41!important}.brown.darken-2{background-color:#5d4037!important}.brown-text.text-darken-2{color:#5d4037!important}.brown.darken-3{background-color:#4e342e!important}.brown-text.text-darken-3{color:#4e342e!important}.brown.darken-4{background-color:#3e2723!important}.brown-text.text-darken-4{color:#3e2723!important}.blue-grey{background-color:#607d8b!important}.blue-grey-text{color:#607d8b!important}.blue-grey.lighten-5{background-color:#eceff1!important}.blue-grey-text.text-lighten-5{color:#eceff1!important}.blue-grey.lighten-4{background-color:#cfd8dc!important}.blue-grey-text.text-lighten-4{color:#cfd8dc!important}.blue-grey.lighten-3{background-color:#b0bec5!important}.blue-grey-text.text-lighten-3{color:#b0bec5!important}.blue-grey.lighten-2{background-color:#90a4ae!important}.blue-grey-text.text-lighten-2{color:#90a4ae!important}.blue-grey.lighten-1{background-color:#78909c!important}.blue-grey-text.text-lighten-1{color:#78909c!important}.blue-grey.darken-1{background-color:#546e7a!important}.blue-grey-text.text-darken-1{color:#546e7a!important}.blue-grey.darken-2{background-color:#455a64!important}.blue-grey-text.text-darken-2{color:#455a64!important}.blue-grey.darken-3{background-color:#37474f!important}.blue-grey-text.text-darken-3{color:#37474f!important}.blue-grey.darken-4{background-color:#263238!important}.blue-grey-text.text-darken-4{color:#263238!important}.grey{background-color:#9e9e9e!important}.grey-text{color:#9e9e9e!important}.grey.lighten-5{background-color:#fafafa!important}.grey-text.text-lighten-5{color:#fafafa!important}.grey.lighten-4{background-color:#f5f5f5!important}.grey-text.text-lighten-4{color:#f5f5f5!important}.grey.lighten-3{background-color:#eee!important}.grey-text.text-lighten-3{color:#eee!important}.grey.lighten-2{background-color:#e0e0e0!important}.grey-text.text-lighten-2{color:#e0e0e0!important}.grey.lighten-1{background-color:#bdbdbd!important}.grey-text.text-lighten-1{color:#bdbdbd!important}.grey.darken-1{background-color:#757575!important}.grey-text.text-darken-1{color:#757575!important}.grey.darken-2{background-color:#616161!important}.grey-text.text-darken-2{color:#616161!important}.grey.darken-3{background-color:#424242!important}.grey-text.text-darken-3{color:#424242!important}.grey.darken-4{background-color:#212121!important}.grey-text.text-darken-4{color:#212121!important}.black{background-color:#000!important}.black-text{color:#000!important}.white{background-color:#fff!important}.white-text{color:#fff!important}.transparent{background-color:transparent!important}.transparent-text{color:transparent!important}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default) li{list-style-type:none}a{color:#039be5;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.btn,.btn-floating,.btn-large,.card,.card-panel,.collapsible,.dropdown-content,.side-nav,.toast,.z-depth-1,nav{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.btn-floating:hover,.btn-large:hover,.btn:hover,.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.3)}.modal,.z-depth-4{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.3)}.z-depth-5{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.3)}.hoverable{transition:box-shadow .25s;box-shadow:0}.hoverable:hover{transition:box-shadow .25s;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width:992px){.pagination{width:100%}.pagination li.next,.pagination li.prev{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:hsla(0,0%,100%,.7)}.breadcrumb [class*=mdi-],.breadcrumb [class^=mdi-],.breadcrumb i,.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:"\E5CC";color:hsla(0,0%,100%,.7);vertical-align:top;display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{top:0;left:0;right:0;z-index:-1}.parallax,.parallax img{position:absolute;bottom:0}.parallax img{display:none;left:50%;min-width:100%;min-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-bottom,.pin-top{position:relative}.pinned{position:fixed!important}.fade-in,ul.staggered-list li{opacity:0}.fade-in{-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width:600px){.hide-on-small-and-down,.hide-on-small-only{display:none!important}}@media only screen and (max-width:992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width:601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width:600px) and (max-width:992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width:993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width:993px){.show-on-large{display:block!important}}@media only screen and (min-width:600px) and (max-width:992px){.show-on-medium{display:block!important}}@media only screen and (max-width:600px){.show-on-small{display:block!important}}@media only screen and (min-width:601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width:992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width:600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:10px 0;color:hsla(0,0%,100%,.8);background-color:rgba(51,51,51,.08)}table,td,th{border:none}table{width:100%;display:table}table.bordered>tbody>tr,table.bordered>thead>tr{border-bottom:1px solid #d0d0d0}table.striped>tbody>tr:nth-child(odd){background-color:#f2f2f2}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:#f2f2f2}table.centered tbody tr td,table.centered thead tr th{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width:992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:"\A0"}table.responsive-table td,table.responsive-table th{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th:before{content:"\A0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container embed,.video-container iframe,.video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;transition:width .3s linear}.progress .determinate,.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{-webkit-animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress .indeterminate:after,.progress .indeterminate:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right}.progress .indeterminate:after{-webkit-animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]:after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-top:calc(1.5rem - 11px)}.side-nav span.badge{margin-top:13px}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:"liga";-moz-font-feature-settings:"liga";font-feature-settings:"liga"}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width:601px){.container{width:85%}}@media only screen and (min-width:993px){.container{width:70%}}.container .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=pull-],.row .col[class*=push-]{position:relative}.row .col.s1{width:8.3333333333%}.row .col.s1,.row .col.s2{margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%}.row .col.s3{width:25%}.row .col.s3,.row .col.s4{margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%}.row .col.s5{width:41.6666666667%}.row .col.s5,.row .col.s6{margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%}.row .col.s7{width:58.3333333333%}.row .col.s7,.row .col.s8{margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%}.row .col.s9{width:75%}.row .col.s9,.row .col.s10{margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%}.row .col.s11{width:91.6666666667%}.row .col.s11,.row .col.s12{margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width:601px){.row .col.m1{width:8.3333333333%}.row .col.m1,.row .col.m2{margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%}.row .col.m3{width:25%}.row .col.m3,.row .col.m4{margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%}.row .col.m5{width:41.6666666667%}.row .col.m5,.row .col.m6{margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%}.row .col.m7{width:58.3333333333%}.row .col.m7,.row .col.m8{margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%}.row .col.m9{width:75%}.row .col.m9,.row .col.m10{margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%}.row .col.m11{width:91.6666666667%}.row .col.m11,.row .col.m12{margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width:993px){.row .col.l1{width:8.3333333333%}.row .col.l1,.row .col.l2{margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%}.row .col.l3{width:25%}.row .col.l3,.row .col.l4{margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%}.row .col.l5{width:41.6666666667%}.row .col.l5,.row .col.l6{margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%}.row .col.l7{width:58.3333333333%}.row .col.l7,.row .col.l8{margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%}.row .col.l9{width:75%}.row .col.l9,.row .col.l10{margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%}.row .col.l11{width:91.6666666667%}.row .col.l11,.row .col.l12{margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width:1201px){.row .col.xl1{width:8.3333333333%}.row .col.xl1,.row .col.xl2{margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%}.row .col.xl3{width:25%}.row .col.xl3,.row .col.xl4{margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%}.row .col.xl5{width:41.6666666667%}.row .col.xl5,.row .col.xl6{margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%}.row .col.xl7{width:58.3333333333%}.row .col.xl7,.row .col.xl8{margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%}.row .col.xl9{width:75%}.row .col.xl9,.row .col.xl10{margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%}.row .col.xl11{width:91.6666666667%}.row .col.xl11,.row .col.xl12{margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav [class*=mdi-],nav [class^=mdi-],nav i,nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width:993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .button-collapse i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0;white-space:nowrap}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width:992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo [class*=mdi-],nav .brand-logo [class^=mdi-],nav .brand-logo i,nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-flat,nav ul a.btn-floating,nav ul a.btn-large{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=date]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=text]:valid,nav .input-field input[type=url]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:hsla(0,0%,100%,.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width:601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:Roboto;src:local(Roboto Thin),url(fonts/Roboto-Thin.woff2) format("woff2"),url(fonts/Roboto-Thin.woff) format("woff");font-weight:100}@font-face{font-family:Roboto;src:local(Roboto Light),url(fonts/Roboto-Light.woff2) format("woff2"),url(fonts/Roboto-Light.woff) format("woff");font-weight:300}@font-face{font-family:Roboto;src:local(Roboto Regular),url(fonts/Roboto-Regular.woff2) format("woff2"),url(fonts/Roboto-Regular.woff) format("woff");font-weight:400}@font-face{font-family:Roboto;src:local(Roboto Medium),url(fonts/Roboto-Medium.woff2) format("woff2"),url(fonts/Roboto-Medium.woff) format("woff");font-weight:500}@font-face{font-family:Roboto;src:local(Roboto Bold),url(fonts/Roboto-Bold.woff2) format("woff2"),url(fonts/Roboto-Bold.woff) format("woff");font-weight:700}a{text-decoration:none}html{line-height:1.5;font-family:Roboto,sans-serif;font-weight:400;color:rgba(0,0,0,.87)}@media only screen and (min-width:0){html{font-size:14px}}@media only screen and (min-width:992px){html{font-size:14.5px}}@media only screen and (min-width:1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.1}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;margin:2.1rem 0 1.68rem}h1,h2{line-height:110%}h2{font-size:3.56rem;margin:1.78rem 0 1.424rem}h3{font-size:2.92rem;margin:1.46rem 0 1.168rem}h3,h4{line-height:110%}h4{font-size:2.28rem;margin:1.14rem 0 .912rem}h5{font-size:1.64rem;margin:.82rem 0 .656rem}h5,h6{line-height:110%}h6{font-size:1rem;margin:.5rem 0 .4rem}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width:360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width:390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width:420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width:450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width:480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width:510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width:540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width:570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width:600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width:630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width:660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width:690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width:720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width:750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width:780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width:810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width:840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width:870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width:900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width:930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width:960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width:360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63),-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s!important;transition:transform .2s!important;transition:transform .2s,-webkit-transform .2s!important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{padding:24px}.card,.card-panel{transition:box-shadow .25s;margin:.5rem 0 1rem;border-radius:2px;background-color:#fff}.card{position:relative}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.large,.card.medium,.card.small{position:relative}.card.large .card-image,.card.medium .card-image,.card.small .card-image{max-height:60%;overflow:hidden}.card.large .card-image+.card-content,.card.medium .card-image+.card-content,.card.small .card-image+.card-content{max-height:40%}.card.large .card-content,.card.medium .card-content,.card.small .card-content{max-height:100%;overflow:hidden}.card.large .card-action,.card.medium .card-action,.card.small .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.large .card-image,.card.horizontal.medium .card-image,.card.horizontal.small .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.large .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.small .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{position:relative;background-color:inherit;border-top:1px solid hsla(0,0%,63%,.2);padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width:600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width:601px) and (max-width:992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width:993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;word-break:break-all;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.toast .btn,.toast .btn-flat,.toast .btn-large{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width:600px){.toast{width:100%;border-radius:0}}@media only screen and (min-width:601px) and (max-width:992px){.toast{float:left}}@media only screen and (min-width:993px){.toast{float:right}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover,.tabs.tabs-transparent .tab a{color:hsla(0,0%,100%,.7)}.tabs.tabs-transparent .tab a.active,.tabs.tabs-transparent .tab a:hover{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease}.tabs .tab a.active,.tabs .tab a:hover{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,.7);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left,right}@media only screen and (max-width:992px){.tabs{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none}.backdrop,.material-tooltip{opacity:0;position:absolute;visibility:hidden}.backdrop{height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0;transform-origin:50% 0}.btn,.btn-flat,.btn-large{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn-flat.disabled,.btn-flat:disabled,.btn-flat[disabled],.btn-floating.disabled,.btn-floating:disabled,.btn-floating[disabled],.btn-large.disabled,.btn-large:disabled,.btn-large[disabled],.btn.disabled,.btn:disabled,.btn[disabled],.disabled.btn-large,[disabled].btn-large{pointer-events:none;background-color:#dfdfdf!important;box-shadow:none;color:#9f9f9f!important;cursor:default}.btn-flat.disabled:hover,.btn-flat:disabled:hover,.btn-flat[disabled]:hover,.btn-floating.disabled:hover,.btn-floating:disabled:hover,.btn-floating[disabled]:hover,.btn-large.disabled:hover,.btn-large:disabled:hover,.btn-large[disabled]:hover,.btn.disabled:hover,.btn:disabled:hover,.btn[disabled]:hover,.disabled.btn-large:hover,[disabled].btn-large:hover{background-color:#dfdfdf!important;color:#9f9f9f!important}.btn,.btn-flat,.btn-floating,.btn-large{font-size:1rem;outline:0}.btn-flat i,.btn-floating i,.btn-large i,.btn i{font-size:1.3rem;line-height:inherit}.btn-floating:focus,.btn-large:focus,.btn:focus{background-color:#1d7d74}.btn,.btn-large{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.btn-large:hover,.btn:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating,.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.horizontal{padding:0 0 0 15px}.fixed-action-btn.horizontal ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.horizontal ul li{display:inline-block;margin:15px 15px 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0}.fixed-action-btn.toolbar ul li{-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{box-shadow:none;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat,.btn-flat:active,.btn-flat:focus{background-color:transparent}.btn-flat:focus,.btn-flat:hover{background-color:rgba(0,0,0,.1);box-shadow:none}.btn-flat:active{background-color:rgba(0,0,0,.2)}.btn-flat.disabled{background-color:transparent!important;color:#b3b3b3!important;cursor:default}.btn-large{height:54px;line-height:54px}.btn-large i{font-size:1.6rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;z-index:999;will-change:width,height}.dropdown-content li{clear:both;color:rgba(0,0,0,.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li.active,.dropdown-content li.selected,.dropdown-content li:hover{background-color:#eee}.dropdown-content li.active.selected{background-color:#e1e1e1}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}.input-field.col .dropdown-content [type=checkbox]+label{top:1px;left:0;height:18px}.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,.2);transition:all .7s ease-out;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:hsla(0,0%,100%,.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,.7)}.waves-effect input[type=button],.waves-effect input[type=reset],.waves-effect input[type=submit]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}@media only screen and (max-width:992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-flat,.modal .modal-footer .btn-large{float:right;margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-100px;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem}.collapsible-header{display:block;cursor:pointer;min-height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box;padding:2rem}.side-nav .collapsible,.side-nav.fixed .collapsible{border:none;box-shadow:none}.side-nav .collapsible li,.side-nav.fixed .collapsible li{padding:0}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.side-nav .collapsible-header:hover,.side-nav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,.05)}.side-nav .collapsible-header i,.side-nav.fixed .collapsible-header i{line-height:inherit}.side-nav .collapsible-body,.side-nav.fixed .collapsible-body{border:0;background-color:#fff}.side-nav .collapsible-body li a,.side-nav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 24px;transition:margin .35s cubic-bezier(.25,.46,.45,.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;box-shadow:none;margin:0 0 20px;min-height:45px;outline:none;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .chip.selected{background-color:#26a69a;color:#fff}.chips .input{background:none;border:0;color:rgba(0,0,0,.6);display:inline-block;font-size:1rem;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0}.prefix~.chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty~label{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{top:0;right:0;background-color:#292929;will-change:opacity}#materialbox-overlay,.materialbox-caption{position:fixed;bottom:0;left:0;z-index:1000}.materialbox-caption{display:none;color:#fff;line-height:50px;width:100%;text-align:center;padding:0 15%;height:50px;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder,::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input:not([type]),input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}input:not([type]):disabled,input:not([type])[readonly=readonly],input[type=date]:disabled,input[type=date][readonly=readonly],input[type=datetime-local]:disabled,input[type=datetime-local][readonly=readonly],input[type=datetime]:disabled,input[type=datetime][readonly=readonly],input[type=email]:disabled,input[type=email][readonly=readonly],input[type=number]:disabled,input[type=number][readonly=readonly],input[type=password]:disabled,input[type=password][readonly=readonly],input[type=search]:disabled,input[type=search][readonly=readonly],input[type=tel]:disabled,input[type=tel][readonly=readonly],input[type=text]:disabled,input[type=text][readonly=readonly],input[type=time]:disabled,input[type=time][readonly=readonly],input[type=url]:disabled,input[type=url][readonly=readonly],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly=readonly]{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26)}input:not([type]):disabled+label,input:not([type])[readonly=readonly]+label,input[type=date]:disabled+label,input[type=date][readonly=readonly]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly=readonly]+label,input[type=datetime]:disabled+label,input[type=datetime][readonly=readonly]+label,input[type=email]:disabled+label,input[type=email][readonly=readonly]+label,input[type=number]:disabled+label,input[type=number][readonly=readonly]+label,input[type=password]:disabled+label,input[type=password][readonly=readonly]+label,input[type=search]:disabled+label,input[type=search][readonly=readonly]+label,input[type=tel]:disabled+label,input[type=tel][readonly=readonly]+label,input[type=text]:disabled+label,input[type=text][readonly=readonly]+label,input[type=time]:disabled+label,input[type=time][readonly=readonly]+label,input[type=url]:disabled+label,input[type=url][readonly=readonly]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly=readonly]+label{color:rgba(0,0,0,.26)}input:not([type]):focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=datetime]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=search]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=text]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=url]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=datetime]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=text]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]).valid,input:not([type]):focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=datetime].valid,input[type=datetime]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=text].valid,input[type=text]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type]).valid+label:after,input:not([type]):focus.valid+label:after,input[type=date].valid+label:after,input[type=date]:focus.valid+label:after,input[type=datetime-local].valid+label:after,input[type=datetime-local]:focus.valid+label:after,input[type=datetime].valid+label:after,input[type=datetime]:focus.valid+label:after,input[type=email].valid+label:after,input[type=email]:focus.valid+label:after,input[type=number].valid+label:after,input[type=number]:focus.valid+label:after,input[type=password].valid+label:after,input[type=password]:focus.valid+label:after,input[type=search].valid+label:after,input[type=search]:focus.valid+label:after,input[type=tel].valid+label:after,input[type=tel]:focus.valid+label:after,input[type=text].valid+label:after,input[type=text]:focus.valid+label:after,input[type=time].valid+label:after,input[type=time]:focus.valid+label:after,input[type=url].valid+label:after,input[type=url]:focus.valid+label:after,textarea.materialize-textarea.valid+label:after,textarea.materialize-textarea:focus.valid+label:after{content:attr(data-success);color:#4caf50;opacity:1}input:not([type]).invalid,input:not([type]):focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=datetime].invalid,input[type=datetime]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=text].invalid,input[type=text]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}input:not([type]).invalid+label:after,input:not([type]):focus.invalid+label:after,input[type=date].invalid+label:after,input[type=date]:focus.invalid+label:after,input[type=datetime-local].invalid+label:after,input[type=datetime-local]:focus.invalid+label:after,input[type=datetime].invalid+label:after,input[type=datetime]:focus.invalid+label:after,input[type=email].invalid+label:after,input[type=email]:focus.invalid+label:after,input[type=number].invalid+label:after,input[type=number]:focus.invalid+label:after,input[type=password].invalid+label:after,input[type=password]:focus.invalid+label:after,input[type=search].invalid+label:after,input[type=search]:focus.invalid+label:after,input[type=tel].invalid+label:after,input[type=tel]:focus.invalid+label:after,input[type=text].invalid+label:after,input[type=text]:focus.invalid+label:after,input[type=time].invalid+label:after,input[type=time]:focus.invalid+label:after,input[type=url].invalid+label:after,input[type=url]:focus.invalid+label:after,textarea.materialize-textarea.invalid+label:after,textarea.materialize-textarea:focus.invalid+label:after{content:attr(data-error);color:#f44336;opacity:1}input:not([type]).validate+label,input[type=date].validate+label,input[type=datetime-local].validate+label,input[type=datetime].validate+label,input[type=email].validate+label,input[type=number].validate+label,input[type=password].validate+label,input[type=search].validate+label,input[type=tel].validate+label,input[type=text].validate+label,input[type=time].validate+label,input[type=url].validate+label,textarea.materialize-textarea.validate+label{width:100%;pointer-events:none}input:not([type])+label:after,input[type=date]+label:after,input[type=datetime-local]+label:after,input[type=datetime]+label:after,input[type=email]+label:after,input[type=number]+label:after,input[type=password]+label:after,input[type=search]+label:after,input[type=tel]+label:after,input[type=text]+label:after,input[type=time]+label:after,input[type=url]+label:after,textarea.materialize-textarea+label:after{display:block;content:"";position:absolute;top:60px;opacity:0;transition:opacity .2s ease-out,color .2s ease-out}.input-field{position:relative;margin-top:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline .select-dropdown,.input-field.inline input{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix~.validate~label,.input-field.col .prefix~label{width:calc(100% - 3rem - 1.5rem)}.input-field label{color:#9e9e9e;position:absolute;top:.8rem;left:0;font-size:1rem;cursor:text;transition:.2s ease-out;text-align:initial}.input-field label:not(.label-icon).active{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix~.autocomplete-content,.input-field .prefix~.validate~label,.input-field .prefix~input,.input-field .prefix~label,.input-field .prefix~textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix~label{margin-left:3rem}@media only screen and (max-width:992px){.input-field .prefix~input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width:600px){.input-field .prefix~input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus~.material-icons,.input-field input[type=search]:focus~.mdi-navigation-close{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search]~.material-icons,.input-field input[type=search]~.mdi-navigation-close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:.8rem 0 1.6rem;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0}.autocomplete-content{margin-top:-20px;display:block;opacity:1;position:static}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}[type=radio]:checked,[type=radio]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=radio]:checked+label,[type=radio]:not(:checked)+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=radio]+label:after,[type=radio]+label:before{content:"";position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after,[type=radio]:checked+label:before,[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border-radius:50%}[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border:2px solid #5a5a5a}[type=radio]:not(:checked)+label:after{-webkit-transform:scale(0);transform:scale(0)}[type=radio]:checked+label:before{border:2px solid transparent}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after{border:2px solid #26a69a}[type=radio].with-gap:checked+label:after,[type=radio]:checked+label:after{background-color:#26a69a}[type=radio]:checked+label:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type=radio].with-gap:checked+label:after{-webkit-transform:scale(.5);transform:scale(.5)}[type=radio].tabbed:focus+label:before{box-shadow:0 0 0 10px rgba(0,0,0,.1)}[type=radio].with-gap:disabled:checked+label:before{border:2px solid rgba(0,0,0,.26)}[type=radio].with-gap:disabled:checked+label:after{border:none;background-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:before,[type=radio]:disabled:not(:checked)+label:before{background-color:transparent;border-color:rgba(0,0,0,.26)}[type=radio]:disabled+label{color:rgba(0,0,0,.26)}[type=radio]:disabled:not(:checked)+label:before{border-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:after{background-color:rgba(0,0,0,.26);border-color:#bdbdbd}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type=checkbox]:checked,[type=checkbox]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=checkbox]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type=checkbox]+label:before,[type=checkbox]:not(.filled-in)+label:after{content:"";position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;transition:.2s}[type=checkbox]:not(.filled-in)+label:after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type=checkbox]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,.26)}[type=checkbox].tabbed:focus+label:after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}[type=checkbox]:checked+label:before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);border-bottom:2px solid rgba(0,0,0,.26)}[type=checkbox]:indeterminate+label:before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);background-color:transparent}[type=checkbox].filled-in+label:after{border-radius:2px}[type=checkbox].filled-in+label:after,[type=checkbox].filled-in+label:before{content:"";left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type=checkbox].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type=checkbox].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type=checkbox].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox].filled-in:checked+label:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type=checkbox].filled-in.tabbed:focus+label:after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,.1)}[type=checkbox].filled-in.tabbed:checked:focus+label:after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type=checkbox].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type=checkbox].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#bdbdbd}[type=checkbox].filled-in:disabled:checked+label:before{background-color:transparent}[type=checkbox].filled-in:disabled:checked+label:after{background-color:#bdbdbd;border-color:#bdbdbd}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a;left:24px}.switch label .lever{content:"";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:"";position:absolute;display:inline-block;width:21px;height:21px;background-color:#f1f1f1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,.4);left:-5px;top:-3px;transition:left .3s ease,background .3s ease,box-shadow .1s ease}input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:checked:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(38,166,154,.1)}input[type=checkbox]:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(0,0,0,.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#bdbdbd}select{display:none}select.browser-default{display:block}select{background-color:hsla(0,0%,100%,.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;display:block}.select-wrapper span.caret{color:initial;position:absolute;right:0;top:0;bottom:0;height:10px;margin:auto 0;font-size:10px;line-height:10px}.select-wrapper span.caret.disabled{color:rgba(0,0,0,.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:.8rem}select:disabled{color:rgba(0,0,0,.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.3)}.select-wrapper i{color:rgba(0,0,0,.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,.3);background-color:transparent}.prefix~.select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix~label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,.4)}.select-dropdown li.optgroup~li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0;transition:.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid #fff}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ee6e73}.side-nav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:calc(100% + 60px);height:100%;padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.side-nav .collapsible{margin:0}.side-nav li{float:none;line-height:48px}.side-nav li.active{background-color:rgba(0,0,0,.05)}.side-nav li>a{color:rgba(0,0,0,.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.side-nav li>a:hover{background-color:rgba(0,0,0,.05)}.side-nav li>a.btn,.side-nav li>a.btn-flat,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{margin:10px 15px}.side-nav li>a.btn,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{color:#fff}.side-nav li>a.btn-flat{color:#343434}.side-nav li>a.btn-large:hover,.side-nav li>a.btn:hover{background-color:#2bbbad}.side-nav li>a.btn-floating:hover{background-color:#26a69a}.side-nav li>a>[class^=mdi-],.side-nav li>a>i,.side-nav li>a>i.material-icons,.side-nav li>a li>a>[class*=mdi-]{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,.54)}.side-nav .divider{margin:8px 0 0}.side-nav .subheader{cursor:auto;pointer-events:none;color:rgba(0,0,0,.54);font-size:14px;font-weight:500;line-height:48px}.side-nav .subheader:hover{background-color:transparent}.side-nav .userView{position:relative;padding:32px 32px 0;margin-bottom:8px}.side-nav .userView>a{height:auto;padding:0}.side-nav .userView>a:hover{background-color:transparent}.side-nav .userView .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.side-nav .userView .circle,.side-nav .userView .email,.side-nav .userView .name{display:block}.side-nav .userView .circle{height:64px;width:64px}.side-nav .userView .email,.side-nav .userView .name{font-size:14px;line-height:24px}.side-nav .userView .name{margin-top:16px;font-weight:500}.side-nav .userView .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width:992px){.side-nav.fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.side-nav a{padding:0 16px}.side-nav .userView{padding:16px 16px 0}}.side-nav .collapsible-body>ul:not(.collapsible)>li.active,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.side-nav .collapsible-body>ul:not(.collapsible)>li.active a,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.side-nav .collapsible-body{padding:0}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(1turn)}}@keyframes container-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-green-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(3turn)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(3turn);transform:rotate(3turn)}}@-webkit-keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@-webkit-keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}@keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes left-spin{0%{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{0%{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1);animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1)}@-webkit-keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:50%}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4caf50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0 50%;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0;height:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{display:none;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:hsla(0,0%,100%,.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel .carousel-item:not(.active) .materialboxed,.carousel.scrolling .carousel-item .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0s}.tap-target-wrapper.open .tap-target{opacity:.95;transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-wrapper.open .tap-target,.tap-target-wrapper.open .tap-target-wave:before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave:after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;transition:opacity .3s,visibility 0s 1s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s 1s;transition:opacity .3s,transform .3s,visibility 0s 1s,-webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;box-shadow:0 20px 20px 0 rgba(0,0,0,.14),0 10px 50px 0 rgba(0,0,0,.12),0 30px 10px -20px rgba(0,0,0,.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave:after,.tap-target-wave:before{content:"";display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave:before{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.tap-target-wave:after{visibility:hidden;transition:opacity .3s,visibility 0s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s;transition:opacity .3s,transform .3s,visibility 0s,-webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large),.tap-target-origin:not(.btn):not(.btn-large):hover{background:none}@media only screen and (max-width:600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:initial;position:relative}.pulse:before{content:"";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.picker__frame,.picker__holder{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;transition:background .15s ease-out,top 0s .15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;min-width:256px;width:300px;max-height:350px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;transition:all .15s ease-out}@media (min-height:28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:28.875em){.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:28.875em){.picker__box{display:block;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height:35.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__input.picker__input--active{border-color:#e3f2fd}.picker__frame{margin:0 auto;max-width:325px}@media (min-height:38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#fff;width:40%}.picker__select--year.browser-default{display:inline;background-color:#fff;width:26%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,.05)}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em}.picker__table,.picker__table td,.picker__table th{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#ddd;font-weight:500}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{cursor:pointer}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{-webkit-transform:scale(.75);transform:scale(.75);background:#0089ec}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__footer{text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:rgba(0,0,0,.05);outline:none}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:hsla(0,0%,100%,.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{border-radius:50%;-webkit-transform:scale(.9);transform:scale(.9);background-color:#26a69a;color:#fff}.picker--focused .picker__day--selected.picker__day--outfocus,.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #676767}button.picker__clear:focus,button.picker__close:focus,button.picker__today:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #ddd;border-top:1px solid #ddd;margin-bottom:-1px;position:relative;background:#fff;padding:.75em 1.25em}@media (min-height:46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__list-item--highlighted,.picker__list-item:hover{border-color:#0089ec;z-index:10}.picker--focused .picker__list-item--highlighted,.picker__list-item--highlighted:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker--focused .picker__list-item--selected,.picker__list-item--selected,.picker__list-item--selected:hover{background:#0089ec;color:#fff;z-index:10}.picker--focused .picker__list-item--disabled,.picker__list-item--disabled,.picker__list-item--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default;border-color:#ddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:focus,.picker--time .picker__button--clear:hover{color:#000;background:#b1dcfb;background:#e20;border-color:#e20;cursor:pointer;color:#fff;outline:none}.picker--time .picker__button--clear:before{top:-.25em;color:#666;font-size:1.25em;font-weight:700}.picker--time .picker__button--clear:focus:before,.picker--time .picker__button--clear:hover:before{color:#fff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height:40.125em){.picker--time .picker__box{margin-bottom:5em}}.annotator-filter *,.annotator-notice,.annotator-widget *{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:400;text-align:left;margin:0;padding:0;background:none;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;-moz-box-shadow:none;-webkit-box-shadow:none;-o-box-shadow:none;box-shadow:none;color:#909090}.annotator-adder{background-image:url(img/annotator-icon-sprite.png);background-repeat:no-repeat}.annotator-editor a:after,.annotator-filter .annotator-filter-navigation button:after,.annotator-filter .annotator-filter-property .annotator-filter-clear,.annotator-resize,.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button,.annotator-widget:after{background-image:url(img/annotator-glyph-sprite.png);background-repeat:no-repeat}.annotator-hl{background:#ffff0a;background:rgba(255,255,10,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4DFFFF0A, endColorstr=#4DFFFF0A)"}.annotator-hl-temporary{background:#007cff;background:rgba(0,124,255,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4D007CFF, endColorstr=#4D007CFF)"}.annotator-wrapper{position:relative}.annotator-adder,.annotator-notice,.annotator-outer{z-index:1020}.annotator-filter{z-index:1010}.annotator-adder,.annotator-notice,.annotator-outer,.annotator-widget{position:absolute;font-size:10px;line-height:1}.annotator-hide{display:none;visibility:hidden}.annotator-adder{margin-top:-48px;margin-left:-24px;width:48px;height:48px;background-position:0 0}.annotator-adder:hover{background-position:top}.annotator-adder:active{background-position:100%}.annotator-adder button{display:block;width:36px;height:41px;margin:0 auto;border:none;background:none;text-indent:-999em;cursor:pointer}.annotator-outer{width:0;height:0}.annotator-widget{margin:0;padding:0;bottom:15px;left:-18px;min-width:265px;background-color:#fbfbfb;background-color:hsla(0,0%,98%,.98);border:1px solid #7a7a7a;border:1px solid hsla(0,0%,48%,.6);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.2);-moz-box-shadow:0 5px 15px rgba(0,0,0,.2);-o-box-shadow:0 5px 15px rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.2)}.annotator-invert-x .annotator-widget{left:auto;right:-18px}.annotator-invert-y .annotator-widget{bottom:auto;top:8px}.annotator-widget strong{font-weight:700}.annotator-widget .annotator-item,.annotator-widget .annotator-listing{padding:0;margin:0;list-style:none}.annotator-widget:after{content:"";display:block;width:18px;height:10px;background-position:0 0;position:absolute;bottom:-10px;left:8px}.annotator-invert-x .annotator-widget:after{left:auto;right:8px}.annotator-invert-y .annotator-widget:after{background-position:0 -15px;bottom:auto;top:-9px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea,.annotator-widget .annotator-item{position:relative;font-size:12px}.annotator-viewer .annotator-item{border-top:2px solid #7a7a7a;border-top:2px solid hsla(0,0%,48%,.2)}.annotator-widget .annotator-item:first-child{border-top:none}.annotator-editor .annotator-item,.annotator-viewer div{border-top:1px solid #858585;border-top:1px solid hsla(0,0%,52%,.11)}.annotator-viewer div{padding:6px}.annotator-viewer .annotator-item ol,.annotator-viewer .annotator-item ul{padding:4px 16px}.annotator-editor .annotator-item:first-child textarea,.annotator-viewer div:first-of-type{padding-top:12px;padding-bottom:12px;color:#3c3c3c;font-size:13px;font-style:italic;line-height:1.3;border-top:none}.annotator-viewer .annotator-controls{position:relative;top:5px;right:5px;padding-left:5px;opacity:0;-webkit-transition:opacity .2s ease-in;-moz-transition:opacity .2s ease-in;-o-transition:opacity .2s ease-in;transition:opacity .2s ease-in;float:right}.annotator-viewer li .annotator-controls.annotator-visible,.annotator-viewer li:hover .annotator-controls{opacity:1}.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button{cursor:pointer;display:inline-block;width:13px;height:13px;margin-left:2px;border:none;opacity:.2;text-indent:-900em;background-color:transparent;outline:none}.annotator-viewer .annotator-controls a:focus,.annotator-viewer .annotator-controls a:hover,.annotator-viewer .annotator-controls button:focus,.annotator-viewer .annotator-controls button:hover{opacity:.9}.annotator-viewer .annotator-controls a:active,.annotator-viewer .annotator-controls button:active{opacity:1}.annotator-viewer .annotator-controls button[disabled]{display:none}.annotator-viewer .annotator-controls .annotator-edit{background-position:0 -60px}.annotator-viewer .annotator-controls .annotator-delete{background-position:0 -75px}.annotator-viewer .annotator-controls .annotator-link{background-position:0 -270px}.annotator-editor .annotator-item{position:relative}.annotator-editor .annotator-item label{top:0;display:inline;cursor:pointer;font-size:12px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea{display:block;min-width:100%;padding:10px 8px;border:none;margin:0;color:#3c3c3c;background:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;resize:none}.annotator-editor .annotator-item textarea::-webkit-scrollbar{height:8px;width:8px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-track-piece{margin:13px 0 3px;background-color:#e5e5e5;-webkit-border-radius:4px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:vertical{height:25px;background-color:#ccc;-webkit-border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1)}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:horizontal{width:25px;background-color:#ccc;-webkit-border-radius:4px}.annotator-editor .annotator-item:first-child textarea{min-height:5.5em;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor .annotator-item input:focus,.annotator-editor .annotator-item textarea:focus{background-color:#f3f3f3;outline:none}.annotator-editor .annotator-item input[type=checkbox],.annotator-editor .annotator-item input[type=radio]{width:auto;min-width:0;padding:0;display:inline;margin:0 4px 0 0;cursor:pointer}.annotator-editor .annotator-checkbox{padding:8px 6px}.annotator-editor .annotator-controls,.annotator-filter,.annotator-filter .annotator-filter-navigation button{text-align:right;padding:3px;border-top:1px solid #d4d4d4;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.6,#dcdcdc),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);-webkit-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-moz-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-o-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-o-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.annotator-editor.annotator-invert-y .annotator-controls{border-top:none;border-bottom:1px solid #b4b4b4;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor a,.annotator-filter .annotator-filter-property label{position:relative;display:inline-block;padding:0 6px 0 22px;color:#363636;text-shadow:0 1px 0 hsla(0,0%,100%,.75);text-decoration:none;line-height:24px;font-size:12px;font-weight:700;border:1px solid #a2a2a2;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.5,#d2d2d2),color-stop(.5,#bebebe),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#d2d2d2 50%,#bebebe 50%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px}.annotator-editor a:after{position:absolute;top:50%;left:5px;display:block;content:"";width:15px;height:15px;margin-top:-7px;background-position:0 -90px}.annotator-editor a.annotator-focus,.annotator-editor a:focus,.annotator-editor a:hover,.annotator-filter .annotator-filter-active label,.annotator-filter .annotator-filter-navigation button:hover{outline:none;border-color:#435aa0;background-color:#3865f9;background-image:-webkit-gradient(linear,left top,left bottom,from(#7691fb),color-stop(.5,#5075fb),color-stop(.5,#3865f9),to(#3665fa));background-image:-moz-linear-gradient(to bottom,#7691fb,#5075fb 50%,#3865f9 50%,#3665fa);background-image:-webkit-linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);background-image:linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.42)}.annotator-editor a:focus:after,.annotator-editor a:hover:after{margin-top:-8px;background-position:0 -105px}.annotator-editor a:active,.annotator-filter .annotator-filter-navigation button:active{border-color:#700c49;background-color:#d12e8e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fc7cca),color-stop(.5,#e85db2),color-stop(.5,#d12e8e),to(#ff009c));background-image:-moz-linear-gradient(to bottom,#fc7cca,#e85db2 50%,#d12e8e 50%,#ff009c);background-image:-webkit-linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c);background-image:linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c)}.annotator-editor a.annotator-save:after{background-position:0 -120px}.annotator-editor a.annotator-save.annotator-focus:after,.annotator-editor a.annotator-save:focus:after,.annotator-editor a.annotator-save:hover:after{margin-top:-8px;background-position:0 -135px}.annotator-editor .annotator-widget:after{background-position:0 -30px}.annotator-editor.annotator-invert-y .annotator-widget .annotator-controls{background-color:#f2f2f2}.annotator-editor.annotator-invert-y .annotator-widget:after{background-position:0 -45px;height:11px}.annotator-resize{position:absolute;top:0;right:0;width:12px;height:12px;background-position:2px -150px}.annotator-invert-x .annotator-resize{right:auto;left:0;background-position:0 -195px}.annotator-invert-y .annotator-resize{top:auto;bottom:0;background-position:2px -165px}.annotator-invert-y.annotator-invert-x .annotator-resize{background-position:0 -180px}.annotator-notice{color:#fff;position:fixed;top:-54px;left:0;width:100%;font-size:14px;line-height:50px;text-align:center;background:#000;background:rgba(0,0,0,.9);border-bottom:4px solid #d4d4d4;-webkit-transition:top .4s ease-out;-moz-transition:top .4s ease-out;-o-transition:top .4s ease-out;transition:top .4s ease-out}.annotator-notice-success{border-color:#3665f9}.annotator-notice-error{border-color:#ff7e00}.annotator-notice p{margin:0}.annotator-notice a{color:#fff}.annotator-notice-show{top:0}.annotator-tags{margin-bottom:-2px}.annotator-tags .annotator-tag{display:inline-block;padding:0 8px;margin-bottom:2px;line-height:1.6;font-weight:700;background-color:#e6e6e6;-webkit-border-radius:8px;-moz-border-radius:8px;-o-border-radius:8px;border-radius:8px}.annotator-filter{position:fixed;top:0;right:0;left:0;text-align:left;line-height:0;border:none;border-bottom:1px solid #878787;padding-left:10px;padding-right:10px;-webkit-border-radius:0;-moz-border-radius:0;-o-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-moz-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-o-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3)}.annotator-filter strong{font-size:12px;font-weight:700;color:#3c3c3c;text-shadow:0 1px 0 hsla(0,0%,100%,.7);position:relative;top:-9px}.annotator-filter .annotator-filter-navigation,.annotator-filter .annotator-filter-property{position:relative;display:inline-block;overflow:hidden;line-height:10px;padding:2px 0;margin-right:8px}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-property label{text-align:left;display:block;float:left;line-height:20px;-webkit-border-radius:10px 0 0 10px;-moz-border-radius:10px 0 0 10px;-o-border-radius:10px 0 0 10px;border-radius:10px 0 0 10px}.annotator-filter .annotator-filter-property label{padding-left:8px}.annotator-filter .annotator-filter-property input{display:block;float:right;-webkit-appearance:none;background-color:#fff;border:1px solid #878787;border-left:none;padding:2px 4px;line-height:16px;min-height:16px;font-size:12px;width:150px;color:#333;background-color:#f8f8f8;-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-o-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px rgba(0,0,0,.2)}.annotator-filter .annotator-filter-property input:focus{outline:none;background-color:#fff}.annotator-filter .annotator-filter-clear{position:absolute;right:3px;top:6px;border:none;text-indent:-900em;width:15px;height:15px;background-position:0 -90px;opacity:.4}.annotator-filter .annotator-filter-clear:focus,.annotator-filter .annotator-filter-clear:hover{opacity:.8}.annotator-filter .annotator-filter-clear:active{opacity:1}.annotator-filter .annotator-filter-navigation button{border:1px solid #a2a2a2;padding:0;text-indent:-900px;width:20px;min-height:22px;-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8)}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-navigation button:focus,.annotator-filter .annotator-filter-navigation button:hover{color:transparent}.annotator-filter .annotator-filter-navigation button:after{position:absolute;top:8px;left:8px;content:"";display:block;width:9px;height:9px;background-position:0 -210px}.annotator-filter .annotator-filter-navigation button:hover:after{background-position:0 -225px}.annotator-filter .annotator-filter-navigation .annotator-filter-next{-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}.annotator-filter .annotator-filter-navigation .annotator-filter-next:after{left:auto;right:7px;background-position:0 -240px}.annotator-filter .annotator-filter-navigation .annotator-filter-next:hover:after{background-position:0 -255px}.annotator-hl-active{background:#ffff0a;background:rgba(255,255,10,.8);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#CCFFFF0A, endColorstr=#CCFFFF0A)"}.annotator-hl-filtered{background-color:transparent}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(fonts/MaterialIcons-Regular.woff2) format("woff2"),url(fonts/MaterialIcons-Regular.woff) format("woff"),url(fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Lato;font-weight:100;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-hairline.woff2) format("woff2"),url(fonts/lato-hairline.woff) format("woff")}@font-face{font-family:Lato;font-weight:100;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-hairline-italic.woff2) format("woff2"),url(fonts/lato-hairline-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-thin.woff2) format("woff2"),url(fonts/lato-thin.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-thin-italic.woff2) format("woff2"),url(fonts/lato-thin-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-light.woff2) format("woff2"),url(fonts/lato-light.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-light-italic.woff2) format("woff2"),url(fonts/lato-light-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-normal.woff2) format("woff2"),url(fonts/lato-normal.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-normal-italic.woff2) format("woff2"),url(fonts/lato-normal-italic.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-medium.woff2) format("woff2"),url(fonts/lato-medium.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-medium-italic.woff2) format("woff2"),url(fonts/lato-medium-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-semibold.woff2) format("woff2"),url(fonts/lato-semibold.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-semibold-italic.woff2) format("woff2"),url(fonts/lato-semibold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-bold.woff2) format("woff2"),url(fonts/lato-bold.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-bold-italic.woff2) format("woff2"),url(fonts/lato-bold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-heavy.woff2) format("woff2"),url(fonts/lato-heavy.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-heavy-italic.woff2) format("woff2"),url(fonts/lato-heavy-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-black.woff2) format("woff2"),url(fonts/lato-black.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-black-italic.woff2) format("woff2"),url(fonts/lato-black-italic.woff) format("woff")}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}.hljs{display:block;overflow-x:auto;padding:.5em;color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-built_in,.hljs-class .hljs-title{color:#c18401}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}#article{font-size:20px;margin:0 auto;max-width:45em}#article article{color:#424242;font-size:18px;line-height:1.7em;overflow-wrap:break-word}#article article h1,#article article h2,#article article h3,#article article h4,#article article h5,#article article h6{color:#212121}#article article h1 strong,#article article h2 strong,#article article h3 strong,#article article h4 strong,#article article h5 strong,#article article h6 strong{font-weight:500}#article article h6{font-size:1.2rem}#article article h5{font-size:1.6rem}#article article h4{font-size:1.9rem}#article article h3{font-size:2.2rem}#article article h2{font-size:2.5rem}#article article h1{font-size:2.7rem}#article article a{border-bottom:1px dotted #03a9f4;text-decoration:none}#article article a:hover{border-bottom-style:solid}#article article ul{padding-left:30px}#article article ul,#article article ul li{list-style-type:disc}#article article blockquote{font-style:italic}#article article strong{font-weight:700}#article figure,#article img{max-width:100%;height:auto}#article pre{box-sizing:border-box;margin:0 0 1.75em;border:1px solid #e3f2fd;width:100%;padding:10px;font-family:monospace;font-size:.8em;white-space:pre;overflow:auto;background:#f5f5f5;border-radius:3px}#article>header>h1{font-size:2em;margin:2.1rem 0 .68rem}#article aside .tools{display:flex;flex-flow:row wrap}#article aside .tools .stats{font-size:.8em;margin:8px 5px 5px}#article aside .tools .stats li{display:inline-flex;vertical-align:middle;margin:3px 5px}#article aside .tools .stats li i.material-icons{color:#3e3e3e;margin-right:3px}#article aside .tools .stats a{color:#000;text-decoration:none}#article aside .tools .tags{float:right;margin:5px 15px 10px}#article aside .chip{background-color:rgba(0,151,167,.85);padding:0 15px 0 10px;margin:auto 2px;border-radius:6px}#article aside .chip a,#article aside .chip i{color:#fff}#article aside .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.reader-mode{width:70px!important;transition:width .2s ease}.reader-mode .collapsible-body{height:0;overflow:hidden}.reader-mode span{opacity:0;transition:opacity .2s ease}.reader-mode:hover{width:260px!important}.reader-mode:hover .collapsible-body{height:auto}.reader-mode:hover .collapsible-body li a i.material-icons{margin:auto 5px auto -8px}.reader-mode:hover span{opacity:1}.progress{position:fixed;top:0;width:100%;height:3px;margin:0;z-index:9999}main #content{padding:0 .5rem}main ul.row{margin:.4rem 0 0;padding:0 .75rem}.data .card .card-body{height:19em;overflow:hidden}.card .card-content .card-title,.card .card-reveal .card-title{line-height:22.8px;max-height:80px;font-size:19px;font-family:roberto,Helvetica Neue,Helvetica,Arial,sans-serif}.card .card-stacked .card-content .card-title{display:inline-block}.card .card-content .activator,.card .card-reveal .activator{cursor:pointer;font-family:Material Icons}.card .card-content i.right,.card .card-reveal i.right{margin-left:0}.card .card-content .original{line-height:24px;font-size:15px}.card .card-entry-labels{position:absolute;top:10px;z-index:90;max-width:50%}.card .card-entry-labels-hidden{margin:2.5px auto}.card .card-entry-labels-hidden li{display:inline-block;background-color:rgba(0,151,167,.85);margin:0 5px;padding:5px 12px;border-radius:3px;color:#fff;max-height:2em;max-width:calc(100% - 15px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card .card-content .estimatedTime{margin-bottom:10px}.card .card-action{padding:10px 5px 10px 15px}.card .card-action ul.links{margin:0;font-size:24px;line-height:24px}.card .card-action a{color:#fff;margin:0}.card .card-action a:hover{color:#fff}.card .card-action ul.tools li a.tool{margin-right:5px!important}.card .card-action .reading-time{display:inline-flex;vertical-align:middle}.card .card-action .reading-time .card-created-at,.card .card-action .reading-time .card-reading-time{display:inline-flex}.card .card-action .reading-time span{margin-right:5px}.card .card-image{height:10em}.card .card-fullimage{height:13.5em}.card.sw{max-width:370px;margin-left:auto;margin-right:auto}a.original:not(.waves-effect){text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.card-stacked .preview,.card .card-fullimage .preview,.card .card-image .preview{height:100%;background:no-repeat 50%/cover;background-color:#efefef;display:block}.card-stacked .preview--default,.card .card-fullimage .preview--default,.card .card-image .preview--default{background-size:contain}.card-entry-labels li,.card-tag-labels li{margin:10px 10px 10px auto;padding:5px 12px 5px 16px!important;background-color:rgba(0,151,167,.85);border-radius:3px;color:#fff;cursor:default}.card-entry-labels li{text-overflow:ellipsis;white-space:nowrap;border-radius:0 3px 3px 0;overflow:hidden}.card-tag-labels li{display:flex;justify-content:space-between}#list .chip a,.card-entry-labels-hidden a,.card-entry-labels a,.card-entry-tags a,.card-tag-labels a{text-decoration:none;font-weight:400;color:#fff}.card-tag-labels a{height:100%;align-items:center}.card-tag-form,.card-tag-link{display:flex;min-width:100px;flex-grow:1}.card-tag-form input{margin-bottom:0;height:2rem}.card-tag-rss{display:flex}.card-tag-labels{display:flex;flex-wrap:wrap}.card-tag-labels li{margin:10px;flex-basis:19%;flex-grow:1;align-items:center}.card-stacked{display:flex;flex-flow:row wrap}.card-stacked:hover ul.tools-list{display:inline;text-align:right}.card-stacked .card-preview{max-width:100px;max-height:50px;margin-right:10px;flex:1}.card-stacked div.metadata .chip{background-color:rgba(0,151,167,.85);padding:0 7px;margin:auto 2px;border-radius:6px;line-height:22px;height:22px}.card-stacked div.metadata .chip a,.card-stacked div.metadata .chip i{color:#fff}.card-stacked div.metadata .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.card-stacked div.card-content{flex:4}.card-stacked ul.tools-list{flex:1;display:none;flex-basis:5em;align-self:flex-end;float:right;max-width:6em}.card-stacked .tags{display:inline-block}#content .collection .collection-item{min-height:65px;height:auto}.quickstart .card .card-action a,.quickstart .card .card-action a:hover{color:#fff!important}.settings .div_tabs{padding-bottom:15px}.collection{margin:15px 15px 0}.collection .collection-item{padding:7px;height:65px}.results{display:flex;padding:1rem 1rem 0;flex-wrap:wrap;justify-content:space-between}.results .nb-results{display:inline-flex}.results a{color:#444}.pagination ul{display:flex;margin:0;flex-wrap:wrap;justify-content:space-around}.pagination ul .next.disabled,.pagination ul .prev.disabled{display:none}.pagination li{padding:0}.pagination a,.pagination span{padding:0 10px;height:30px;display:block;line-height:30px}.pagination .disabled{margin-right:10px;margin-left:10px}.pagination li.active span{padding:0 10px;height:30px;display:block;color:#fff}.footer-text{margin:.7rem .5rem}.hidden,.picker__date-display{display:none}footer.page-footer{margin-top:10px;padding-top:0}footer .row{margin-bottom:10px}#filters button{padding:0;width:100%}#filters div.with-checkbox{height:3rem;margin-top:0}body{display:flex;min-height:100vh;flex-direction:column;background:#fafafa}body.login main{padding:0;min-height:100vh}.border-bottom{border-bottom:1px solid #ddd}#content,.valign-wrapper,main{height:100%}.typo-logo{max-width:150px}#main{flex:1 0 auto}#main .logo a{height:100pt}#main .logo img{height:100pt;width:100pt}#main .logo:hover{background:transparent}nav{height:auto;line-height:normal}nav input{color:#aaa}nav ul a:hover{background-color:initial}.nav-panel-item .button-collapse{margin-left:0;margin-right:.5rem;padding:0 .5rem;height:auto;line-height:1;background-color:transparent;border:none}.nav-panel-item{display:flex;padding:.6rem .4rem .6rem .75rem;flex-wrap:wrap;justify-content:space-between;align-items:center}.nav-panel-item .material-icons{height:46px;line-height:46px}.nav-input{display:none}.nav-panel-buttom{display:flex;flex-grow:1;justify-content:flex-end}.nav-panel-item .add,.nav-panel-item .search,.nav-panels .close{color:#444!important}.nav-panels{transition:background .2s ease}.nav-panels .action{margin:0;font-size:2.1rem}.nav-panels .input-field input{display:block;line-height:inherit;height:3rem}.nav-panels .input-field input:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.nav-panel-top{display:flex;align-items:center}.input-field.nav-panel-item label{left:1rem}.input-field.nav-panel-item .close{color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}.input-field.nav-panel-item{display:flex;flex:1;flex-wrap:nowrap;align-items:center}.input-field.nav-panel-add.disabled,.input-field.nav-panel-add.disabled input{background-color:#f5f5f5}.nav-form-button{padding:0;background-color:transparent;border:none}.nav-form-button:focus{background-color:inherit}.nav-form-button,.nav-panel-item .close{margin:0 1%}#button_export,#button_filters{display:none}@media (min-width:993px){.button-collapse{display:none}}.side-nav{width:240px}.side-nav li{padding:0}.side-nav li.logo>a:hover{background:initial}.side-nav a{margin:0}.side-nav.fixed a{font-size:13px;line-height:44px;height:44px}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{height:45px;line-height:44px;padding:0 20px}.side-nav>li.logo{line-height:0;text-align:center}.bold>a{font-weight:700}span.numberItems{float:right}div.settings div.file-field div,div.settings div.file-field ul{margin-top:40px}div.settings div.file-field div{margin-top:inherit}.input-field label.active{font-size:1rem}nav .input-field input{margin:0;padding-left:.5rem}.tabs{display:flex}.tab{flex:1}@font-face{font-family:icomoon;src:url(fonts/IcoMoon-Free.ttf);font-weight:400;font-style:normal}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;width:1em;height:1em;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.material-icons .md-18{font-size:18px}.material-icons .md-24{font-size:24px}.material-icons .md-36{font-size:36px}.material-icons .md-48{font-size:48px}.material-icons .md-dark{color:rgba(0,0,0,.54)}.material-icons .md-dark .md-inactive{color:rgba(0,0,0,.26)}.material-icons .md-light{color:#fff}.material-icons .md-light .md-inactive{color:hsla(0,0%,100%,.3)}[class*=" icon-"]:before,[class^=icon-]:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;background-size:24px;letter-spacing:0;font-feature-settings:"liga"}.icon-eye:before{content:"\E9CE"}.icon-no-eye:before{content:"\E9D1"}.icon-calendar:before{content:"\E953"}.icon-mail:before{content:"\EA86"}.icon-time:before{content:"\E952"}a.icon-image{background-repeat:no-repeat;padding-right:.4em!important;padding-left:0!important;margin-left:25px}a.icon-image:before{content:"";display:block;width:24px;height:24px;float:left;margin:7px 1.5px 0 0}a.icon-image.carrot:before{background:url(themes/_global/img/icons/carrot-icon--black.png) no-repeat 50%/90%}a.icon-image.diaspora:before{background:url(themes/_global/img/icons/diaspora-icon--black.png) no-repeat 50%/80%}a.icon-image.unmark:before{background:url(themes/_global/img/icons/unmark-icon--black.png) no-repeat 50%/80%}a.icon-image.shaarli:before{background:url(themes/_global/img/icons/shaarli.png) no-repeat 50%/80%}a.icon-image.scuttle:before{background:url(themes/_global/img/icons/scuttle.png) no-repeat 50%/80%}.icon-google-plus2:before{content:"\EA89"}.icon-facebook2:before{content:"\EA8D"}.icon-twitter:before{content:"\EA96"}.icon-apple:before{content:"\EABF"}.icon-android:before{content:"\EAC1"}.icon-chrome:before{content:"\EAE5"}.icon-firefox:before{content:"\EAE6"}.icon-link:before{content:"\E9CB"}footer [class*=" icon-"],footer [class^=icon-]{font-size:2em;transition:text-shadow .2s ease;padding-right:10px}footer [class*=" icon-"]:hover,footer [class^=icon-]:hover{text-shadow:0 0 10px rgba(0,0,0,.3)}@media print{body{font-family:Serif;background-color:#fff}@page{margin:1cm}img{max-width:100%!important}#article .mbm a,#article>aside,#article_toolbar,#links,#slide-out,#sort,.entry+.results,.hide-on-large-only,.messages,.progress,.top_link,body>footer,body>header,div.tools,header div{display:none!important}main{padding-left:0!important}#article{margin:inherit!important}article{border:none!important}.vieworiginal a:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.pagination span.current{border-style:dashed}#main{margin:0;padding:0}#article,#main{width:100%}}@media only screen and (min-width:992px){body:not(.entry):not(.login) main,footer,nav{padding-left:240px}.pagination{margin-left:auto}.card-tag-labels li{max-width:50%}}@media screen and (min-width:993px){body.entry main #content{padding-left:70px}}@media only screen and (max-width:992px){footer,header,main,nav{padding-left:0}table{display:block;overflow:auto}iframe{max-width:100%;height:auto}.nav-panels .action{padding-right:.75rem}.nav-panel-buttom{justify-content:space-between}#article{max-width:35em;margin-left:auto;margin-right:auto;font-size:18px}#article>header>h1{font-size:1.33em}.reader-mode{width:240px!important}.reader-mode span{opacity:1}.tabs{display:inline-block;height:auto}.tab{min-width:100%}.indicator{display:none}.pagination li{margin-bottom:.5rem}.pagination li.next,.pagination li.prev{width:auto}.drag-target+.drag-target{height:50%}.drag-target+.drag-target+.drag-target{top:50%}}@media only screen and (min-width:1200px) and (max-width:1650px){.row .col.l3{width:33.33333%;margin-left:0}}@media only screen and (min-width:993px) and (max-width:1200px){.row .col.l1{width:25%;margin-left:0}.row .col.l2{width:33.33333%;margin-left:0}.row .col.l3{width:41.66667%;margin-left:0}.row .col.l4{width:50%;margin-left:0}.row .col.l5{width:58.33333%;margin-left:0}.row .col.l6{width:66.66667%;margin-left:0}.row .col.l7{width:75%;margin-left:0}.row .col.l8{width:83.33333%;margin-left:0}.row .col.l9{width:91.66667%;margin-left:0}.row .col.l10{width:100%;margin-left:0}}@media only screen and (max-width:350px){.nb-results{display:none}.row .col,main ul.row{padding:0}}@media screen and (max-width:310px),screen and (min-width:601px) and (max-width:660px),screen and (min-width:993px) and (max-width:1050px),screen and (min-width:1201px) and (max-width:1250px){.card .card-action .reading-time .card-created-at{display:none}} 1.materialize-red{background-color:#e51c23!important}.materialize-red-text{color:#e51c23!important}.materialize-red.lighten-5{background-color:#fdeaeb!important}.materialize-red-text.text-lighten-5{color:#fdeaeb!important}.materialize-red.lighten-4{background-color:#f8c1c3!important}.materialize-red-text.text-lighten-4{color:#f8c1c3!important}.materialize-red.lighten-3{background-color:#f3989b!important}.materialize-red-text.text-lighten-3{color:#f3989b!important}.materialize-red.lighten-2{background-color:#ee6e73!important}.materialize-red-text.text-lighten-2{color:#ee6e73!important}.materialize-red.lighten-1{background-color:#ea454b!important}.materialize-red-text.text-lighten-1{color:#ea454b!important}.materialize-red.darken-1{background-color:#d0181e!important}.materialize-red-text.text-darken-1{color:#d0181e!important}.materialize-red.darken-2{background-color:#b9151b!important}.materialize-red-text.text-darken-2{color:#b9151b!important}.materialize-red.darken-3{background-color:#a21318!important}.materialize-red-text.text-darken-3{color:#a21318!important}.materialize-red.darken-4{background-color:#8b1014!important}.materialize-red-text.text-darken-4{color:#8b1014!important}.red{background-color:#f44336!important}.red-text{color:#f44336!important}.red.lighten-5{background-color:#ffebee!important}.red-text.text-lighten-5{color:#ffebee!important}.red.lighten-4{background-color:#ffcdd2!important}.red-text.text-lighten-4{color:#ffcdd2!important}.red.lighten-3{background-color:#ef9a9a!important}.red-text.text-lighten-3{color:#ef9a9a!important}.red.lighten-2{background-color:#e57373!important}.red-text.text-lighten-2{color:#e57373!important}.red.lighten-1{background-color:#ef5350!important}.red-text.text-lighten-1{color:#ef5350!important}.red.darken-1{background-color:#e53935!important}.red-text.text-darken-1{color:#e53935!important}.red.darken-2{background-color:#d32f2f!important}.red-text.text-darken-2{color:#d32f2f!important}.red.darken-3{background-color:#c62828!important}.red-text.text-darken-3{color:#c62828!important}.red.darken-4{background-color:#b71c1c!important}.red-text.text-darken-4{color:#b71c1c!important}.red.accent-1{background-color:#ff8a80!important}.red-text.text-accent-1{color:#ff8a80!important}.red.accent-2{background-color:#ff5252!important}.red-text.text-accent-2{color:#ff5252!important}.red.accent-3{background-color:#ff1744!important}.red-text.text-accent-3{color:#ff1744!important}.red.accent-4{background-color:#d50000!important}.red-text.text-accent-4{color:#d50000!important}.pink{background-color:#e91e63!important}.pink-text{color:#e91e63!important}.pink.lighten-5{background-color:#fce4ec!important}.pink-text.text-lighten-5{color:#fce4ec!important}.pink.lighten-4{background-color:#f8bbd0!important}.pink-text.text-lighten-4{color:#f8bbd0!important}.pink.lighten-3{background-color:#f48fb1!important}.pink-text.text-lighten-3{color:#f48fb1!important}.pink.lighten-2{background-color:#f06292!important}.pink-text.text-lighten-2{color:#f06292!important}.pink.lighten-1{background-color:#ec407a!important}.pink-text.text-lighten-1{color:#ec407a!important}.pink.darken-1{background-color:#d81b60!important}.pink-text.text-darken-1{color:#d81b60!important}.pink.darken-2{background-color:#c2185b!important}.pink-text.text-darken-2{color:#c2185b!important}.pink.darken-3{background-color:#ad1457!important}.pink-text.text-darken-3{color:#ad1457!important}.pink.darken-4{background-color:#880e4f!important}.pink-text.text-darken-4{color:#880e4f!important}.pink.accent-1{background-color:#ff80ab!important}.pink-text.text-accent-1{color:#ff80ab!important}.pink.accent-2{background-color:#ff4081!important}.pink-text.text-accent-2{color:#ff4081!important}.pink.accent-3{background-color:#f50057!important}.pink-text.text-accent-3{color:#f50057!important}.pink.accent-4{background-color:#c51162!important}.pink-text.text-accent-4{color:#c51162!important}.purple{background-color:#9c27b0!important}.purple-text{color:#9c27b0!important}.purple.lighten-5{background-color:#f3e5f5!important}.purple-text.text-lighten-5{color:#f3e5f5!important}.purple.lighten-4{background-color:#e1bee7!important}.purple-text.text-lighten-4{color:#e1bee7!important}.purple.lighten-3{background-color:#ce93d8!important}.purple-text.text-lighten-3{color:#ce93d8!important}.purple.lighten-2{background-color:#ba68c8!important}.purple-text.text-lighten-2{color:#ba68c8!important}.purple.lighten-1{background-color:#ab47bc!important}.purple-text.text-lighten-1{color:#ab47bc!important}.purple.darken-1{background-color:#8e24aa!important}.purple-text.text-darken-1{color:#8e24aa!important}.purple.darken-2{background-color:#7b1fa2!important}.purple-text.text-darken-2{color:#7b1fa2!important}.purple.darken-3{background-color:#6a1b9a!important}.purple-text.text-darken-3{color:#6a1b9a!important}.purple.darken-4{background-color:#4a148c!important}.purple-text.text-darken-4{color:#4a148c!important}.purple.accent-1{background-color:#ea80fc!important}.purple-text.text-accent-1{color:#ea80fc!important}.purple.accent-2{background-color:#e040fb!important}.purple-text.text-accent-2{color:#e040fb!important}.purple.accent-3{background-color:#d500f9!important}.purple-text.text-accent-3{color:#d500f9!important}.purple.accent-4{background-color:#a0f!important}.purple-text.text-accent-4{color:#a0f!important}.deep-purple{background-color:#673ab7!important}.deep-purple-text{color:#673ab7!important}.deep-purple.lighten-5{background-color:#ede7f6!important}.deep-purple-text.text-lighten-5{color:#ede7f6!important}.deep-purple.lighten-4{background-color:#d1c4e9!important}.deep-purple-text.text-lighten-4{color:#d1c4e9!important}.deep-purple.lighten-3{background-color:#b39ddb!important}.deep-purple-text.text-lighten-3{color:#b39ddb!important}.deep-purple.lighten-2{background-color:#9575cd!important}.deep-purple-text.text-lighten-2{color:#9575cd!important}.deep-purple.lighten-1{background-color:#7e57c2!important}.deep-purple-text.text-lighten-1{color:#7e57c2!important}.deep-purple.darken-1{background-color:#5e35b1!important}.deep-purple-text.text-darken-1{color:#5e35b1!important}.deep-purple.darken-2{background-color:#512da8!important}.deep-purple-text.text-darken-2{color:#512da8!important}.deep-purple.darken-3{background-color:#4527a0!important}.deep-purple-text.text-darken-3{color:#4527a0!important}.deep-purple.darken-4{background-color:#311b92!important}.deep-purple-text.text-darken-4{color:#311b92!important}.deep-purple.accent-1{background-color:#b388ff!important}.deep-purple-text.text-accent-1{color:#b388ff!important}.deep-purple.accent-2{background-color:#7c4dff!important}.deep-purple-text.text-accent-2{color:#7c4dff!important}.deep-purple.accent-3{background-color:#651fff!important}.deep-purple-text.text-accent-3{color:#651fff!important}.deep-purple.accent-4{background-color:#6200ea!important}.deep-purple-text.text-accent-4{color:#6200ea!important}.indigo{background-color:#3f51b5!important}.indigo-text{color:#3f51b5!important}.indigo.lighten-5{background-color:#e8eaf6!important}.indigo-text.text-lighten-5{color:#e8eaf6!important}.indigo.lighten-4{background-color:#c5cae9!important}.indigo-text.text-lighten-4{color:#c5cae9!important}.indigo.lighten-3{background-color:#9fa8da!important}.indigo-text.text-lighten-3{color:#9fa8da!important}.indigo.lighten-2{background-color:#7986cb!important}.indigo-text.text-lighten-2{color:#7986cb!important}.indigo.lighten-1{background-color:#5c6bc0!important}.indigo-text.text-lighten-1{color:#5c6bc0!important}.indigo.darken-1{background-color:#3949ab!important}.indigo-text.text-darken-1{color:#3949ab!important}.indigo.darken-2{background-color:#303f9f!important}.indigo-text.text-darken-2{color:#303f9f!important}.indigo.darken-3{background-color:#283593!important}.indigo-text.text-darken-3{color:#283593!important}.indigo.darken-4{background-color:#1a237e!important}.indigo-text.text-darken-4{color:#1a237e!important}.indigo.accent-1{background-color:#8c9eff!important}.indigo-text.text-accent-1{color:#8c9eff!important}.indigo.accent-2{background-color:#536dfe!important}.indigo-text.text-accent-2{color:#536dfe!important}.indigo.accent-3{background-color:#3d5afe!important}.indigo-text.text-accent-3{color:#3d5afe!important}.indigo.accent-4{background-color:#304ffe!important}.indigo-text.text-accent-4{color:#304ffe!important}.blue{background-color:#2196f3!important}.blue-text{color:#2196f3!important}.blue.lighten-5{background-color:#e3f2fd!important}.blue-text.text-lighten-5{color:#e3f2fd!important}.blue.lighten-4{background-color:#bbdefb!important}.blue-text.text-lighten-4{color:#bbdefb!important}.blue.lighten-3{background-color:#90caf9!important}.blue-text.text-lighten-3{color:#90caf9!important}.blue.lighten-2{background-color:#64b5f6!important}.blue-text.text-lighten-2{color:#64b5f6!important}.blue.lighten-1{background-color:#42a5f5!important}.blue-text.text-lighten-1{color:#42a5f5!important}.blue.darken-1{background-color:#1e88e5!important}.blue-text.text-darken-1{color:#1e88e5!important}.blue.darken-2{background-color:#1976d2!important}.blue-text.text-darken-2{color:#1976d2!important}.blue.darken-3{background-color:#1565c0!important}.blue-text.text-darken-3{color:#1565c0!important}.blue.darken-4{background-color:#0d47a1!important}.blue-text.text-darken-4{color:#0d47a1!important}.blue.accent-1{background-color:#82b1ff!important}.blue-text.text-accent-1{color:#82b1ff!important}.blue.accent-2{background-color:#448aff!important}.blue-text.text-accent-2{color:#448aff!important}.blue.accent-3{background-color:#2979ff!important}.blue-text.text-accent-3{color:#2979ff!important}.blue.accent-4{background-color:#2962ff!important}.blue-text.text-accent-4{color:#2962ff!important}.light-blue{background-color:#03a9f4!important}.light-blue-text{color:#03a9f4!important}.light-blue.lighten-5{background-color:#e1f5fe!important}.light-blue-text.text-lighten-5{color:#e1f5fe!important}.light-blue.lighten-4{background-color:#b3e5fc!important}.light-blue-text.text-lighten-4{color:#b3e5fc!important}.light-blue.lighten-3{background-color:#81d4fa!important}.light-blue-text.text-lighten-3{color:#81d4fa!important}.light-blue.lighten-2{background-color:#4fc3f7!important}.light-blue-text.text-lighten-2{color:#4fc3f7!important}.light-blue.lighten-1{background-color:#29b6f6!important}.light-blue-text.text-lighten-1{color:#29b6f6!important}.light-blue.darken-1{background-color:#039be5!important}.light-blue-text.text-darken-1{color:#039be5!important}.light-blue.darken-2{background-color:#0288d1!important}.light-blue-text.text-darken-2{color:#0288d1!important}.light-blue.darken-3{background-color:#0277bd!important}.light-blue-text.text-darken-3{color:#0277bd!important}.light-blue.darken-4{background-color:#01579b!important}.light-blue-text.text-darken-4{color:#01579b!important}.light-blue.accent-1{background-color:#80d8ff!important}.light-blue-text.text-accent-1{color:#80d8ff!important}.light-blue.accent-2{background-color:#40c4ff!important}.light-blue-text.text-accent-2{color:#40c4ff!important}.light-blue.accent-3{background-color:#00b0ff!important}.light-blue-text.text-accent-3{color:#00b0ff!important}.light-blue.accent-4{background-color:#0091ea!important}.light-blue-text.text-accent-4{color:#0091ea!important}.cyan{background-color:#00bcd4!important}.cyan-text{color:#00bcd4!important}.cyan.lighten-5{background-color:#e0f7fa!important}.cyan-text.text-lighten-5{color:#e0f7fa!important}.cyan.lighten-4{background-color:#b2ebf2!important}.cyan-text.text-lighten-4{color:#b2ebf2!important}.cyan.lighten-3{background-color:#80deea!important}.cyan-text.text-lighten-3{color:#80deea!important}.cyan.lighten-2{background-color:#4dd0e1!important}.cyan-text.text-lighten-2{color:#4dd0e1!important}.cyan.lighten-1{background-color:#26c6da!important}.cyan-text.text-lighten-1{color:#26c6da!important}.cyan.darken-1{background-color:#00acc1!important}.cyan-text.text-darken-1{color:#00acc1!important}.cyan.darken-2{background-color:#0097a7!important}.cyan-text.text-darken-2{color:#0097a7!important}.cyan.darken-3{background-color:#00838f!important}.cyan-text.text-darken-3{color:#00838f!important}.cyan.darken-4{background-color:#006064!important}.cyan-text.text-darken-4{color:#006064!important}.cyan.accent-1{background-color:#84ffff!important}.cyan-text.text-accent-1{color:#84ffff!important}.cyan.accent-2{background-color:#18ffff!important}.cyan-text.text-accent-2{color:#18ffff!important}.cyan.accent-3{background-color:#00e5ff!important}.cyan-text.text-accent-3{color:#00e5ff!important}.cyan.accent-4{background-color:#00b8d4!important}.cyan-text.text-accent-4{color:#00b8d4!important}.teal{background-color:#009688!important}.teal-text{color:#009688!important}.teal.lighten-5{background-color:#e0f2f1!important}.teal-text.text-lighten-5{color:#e0f2f1!important}.teal.lighten-4{background-color:#b2dfdb!important}.teal-text.text-lighten-4{color:#b2dfdb!important}.teal.lighten-3{background-color:#80cbc4!important}.teal-text.text-lighten-3{color:#80cbc4!important}.teal.lighten-2{background-color:#4db6ac!important}.teal-text.text-lighten-2{color:#4db6ac!important}.teal.lighten-1{background-color:#26a69a!important}.teal-text.text-lighten-1{color:#26a69a!important}.teal.darken-1{background-color:#00897b!important}.teal-text.text-darken-1{color:#00897b!important}.teal.darken-2{background-color:#00796b!important}.teal-text.text-darken-2{color:#00796b!important}.teal.darken-3{background-color:#00695c!important}.teal-text.text-darken-3{color:#00695c!important}.teal.darken-4{background-color:#004d40!important}.teal-text.text-darken-4{color:#004d40!important}.teal.accent-1{background-color:#a7ffeb!important}.teal-text.text-accent-1{color:#a7ffeb!important}.teal.accent-2{background-color:#64ffda!important}.teal-text.text-accent-2{color:#64ffda!important}.teal.accent-3{background-color:#1de9b6!important}.teal-text.text-accent-3{color:#1de9b6!important}.teal.accent-4{background-color:#00bfa5!important}.teal-text.text-accent-4{color:#00bfa5!important}.green{background-color:#4caf50!important}.green-text{color:#4caf50!important}.green.lighten-5{background-color:#e8f5e9!important}.green-text.text-lighten-5{color:#e8f5e9!important}.green.lighten-4{background-color:#c8e6c9!important}.green-text.text-lighten-4{color:#c8e6c9!important}.green.lighten-3{background-color:#a5d6a7!important}.green-text.text-lighten-3{color:#a5d6a7!important}.green.lighten-2{background-color:#81c784!important}.green-text.text-lighten-2{color:#81c784!important}.green.lighten-1{background-color:#66bb6a!important}.green-text.text-lighten-1{color:#66bb6a!important}.green.darken-1{background-color:#43a047!important}.green-text.text-darken-1{color:#43a047!important}.green.darken-2{background-color:#388e3c!important}.green-text.text-darken-2{color:#388e3c!important}.green.darken-3{background-color:#2e7d32!important}.green-text.text-darken-3{color:#2e7d32!important}.green.darken-4{background-color:#1b5e20!important}.green-text.text-darken-4{color:#1b5e20!important}.green.accent-1{background-color:#b9f6ca!important}.green-text.text-accent-1{color:#b9f6ca!important}.green.accent-2{background-color:#69f0ae!important}.green-text.text-accent-2{color:#69f0ae!important}.green.accent-3{background-color:#00e676!important}.green-text.text-accent-3{color:#00e676!important}.green.accent-4{background-color:#00c853!important}.green-text.text-accent-4{color:#00c853!important}.light-green{background-color:#8bc34a!important}.light-green-text{color:#8bc34a!important}.light-green.lighten-5{background-color:#f1f8e9!important}.light-green-text.text-lighten-5{color:#f1f8e9!important}.light-green.lighten-4{background-color:#dcedc8!important}.light-green-text.text-lighten-4{color:#dcedc8!important}.light-green.lighten-3{background-color:#c5e1a5!important}.light-green-text.text-lighten-3{color:#c5e1a5!important}.light-green.lighten-2{background-color:#aed581!important}.light-green-text.text-lighten-2{color:#aed581!important}.light-green.lighten-1{background-color:#9ccc65!important}.light-green-text.text-lighten-1{color:#9ccc65!important}.light-green.darken-1{background-color:#7cb342!important}.light-green-text.text-darken-1{color:#7cb342!important}.light-green.darken-2{background-color:#689f38!important}.light-green-text.text-darken-2{color:#689f38!important}.light-green.darken-3{background-color:#558b2f!important}.light-green-text.text-darken-3{color:#558b2f!important}.light-green.darken-4{background-color:#33691e!important}.light-green-text.text-darken-4{color:#33691e!important}.light-green.accent-1{background-color:#ccff90!important}.light-green-text.text-accent-1{color:#ccff90!important}.light-green.accent-2{background-color:#b2ff59!important}.light-green-text.text-accent-2{color:#b2ff59!important}.light-green.accent-3{background-color:#76ff03!important}.light-green-text.text-accent-3{color:#76ff03!important}.light-green.accent-4{background-color:#64dd17!important}.light-green-text.text-accent-4{color:#64dd17!important}.lime{background-color:#cddc39!important}.lime-text{color:#cddc39!important}.lime.lighten-5{background-color:#f9fbe7!important}.lime-text.text-lighten-5{color:#f9fbe7!important}.lime.lighten-4{background-color:#f0f4c3!important}.lime-text.text-lighten-4{color:#f0f4c3!important}.lime.lighten-3{background-color:#e6ee9c!important}.lime-text.text-lighten-3{color:#e6ee9c!important}.lime.lighten-2{background-color:#dce775!important}.lime-text.text-lighten-2{color:#dce775!important}.lime.lighten-1{background-color:#d4e157!important}.lime-text.text-lighten-1{color:#d4e157!important}.lime.darken-1{background-color:#c0ca33!important}.lime-text.text-darken-1{color:#c0ca33!important}.lime.darken-2{background-color:#afb42b!important}.lime-text.text-darken-2{color:#afb42b!important}.lime.darken-3{background-color:#9e9d24!important}.lime-text.text-darken-3{color:#9e9d24!important}.lime.darken-4{background-color:#827717!important}.lime-text.text-darken-4{color:#827717!important}.lime.accent-1{background-color:#f4ff81!important}.lime-text.text-accent-1{color:#f4ff81!important}.lime.accent-2{background-color:#eeff41!important}.lime-text.text-accent-2{color:#eeff41!important}.lime.accent-3{background-color:#c6ff00!important}.lime-text.text-accent-3{color:#c6ff00!important}.lime.accent-4{background-color:#aeea00!important}.lime-text.text-accent-4{color:#aeea00!important}.yellow{background-color:#ffeb3b!important}.yellow-text{color:#ffeb3b!important}.yellow.lighten-5{background-color:#fffde7!important}.yellow-text.text-lighten-5{color:#fffde7!important}.yellow.lighten-4{background-color:#fff9c4!important}.yellow-text.text-lighten-4{color:#fff9c4!important}.yellow.lighten-3{background-color:#fff59d!important}.yellow-text.text-lighten-3{color:#fff59d!important}.yellow.lighten-2{background-color:#fff176!important}.yellow-text.text-lighten-2{color:#fff176!important}.yellow.lighten-1{background-color:#ffee58!important}.yellow-text.text-lighten-1{color:#ffee58!important}.yellow.darken-1{background-color:#fdd835!important}.yellow-text.text-darken-1{color:#fdd835!important}.yellow.darken-2{background-color:#fbc02d!important}.yellow-text.text-darken-2{color:#fbc02d!important}.yellow.darken-3{background-color:#f9a825!important}.yellow-text.text-darken-3{color:#f9a825!important}.yellow.darken-4{background-color:#f57f17!important}.yellow-text.text-darken-4{color:#f57f17!important}.yellow.accent-1{background-color:#ffff8d!important}.yellow-text.text-accent-1{color:#ffff8d!important}.yellow.accent-2{background-color:#ff0!important}.yellow-text.text-accent-2{color:#ff0!important}.yellow.accent-3{background-color:#ffea00!important}.yellow-text.text-accent-3{color:#ffea00!important}.yellow.accent-4{background-color:#ffd600!important}.yellow-text.text-accent-4{color:#ffd600!important}.amber{background-color:#ffc107!important}.amber-text{color:#ffc107!important}.amber.lighten-5{background-color:#fff8e1!important}.amber-text.text-lighten-5{color:#fff8e1!important}.amber.lighten-4{background-color:#ffecb3!important}.amber-text.text-lighten-4{color:#ffecb3!important}.amber.lighten-3{background-color:#ffe082!important}.amber-text.text-lighten-3{color:#ffe082!important}.amber.lighten-2{background-color:#ffd54f!important}.amber-text.text-lighten-2{color:#ffd54f!important}.amber.lighten-1{background-color:#ffca28!important}.amber-text.text-lighten-1{color:#ffca28!important}.amber.darken-1{background-color:#ffb300!important}.amber-text.text-darken-1{color:#ffb300!important}.amber.darken-2{background-color:#ffa000!important}.amber-text.text-darken-2{color:#ffa000!important}.amber.darken-3{background-color:#ff8f00!important}.amber-text.text-darken-3{color:#ff8f00!important}.amber.darken-4{background-color:#ff6f00!important}.amber-text.text-darken-4{color:#ff6f00!important}.amber.accent-1{background-color:#ffe57f!important}.amber-text.text-accent-1{color:#ffe57f!important}.amber.accent-2{background-color:#ffd740!important}.amber-text.text-accent-2{color:#ffd740!important}.amber.accent-3{background-color:#ffc400!important}.amber-text.text-accent-3{color:#ffc400!important}.amber.accent-4{background-color:#ffab00!important}.amber-text.text-accent-4{color:#ffab00!important}.orange{background-color:#ff9800!important}.orange-text{color:#ff9800!important}.orange.lighten-5{background-color:#fff3e0!important}.orange-text.text-lighten-5{color:#fff3e0!important}.orange.lighten-4{background-color:#ffe0b2!important}.orange-text.text-lighten-4{color:#ffe0b2!important}.orange.lighten-3{background-color:#ffcc80!important}.orange-text.text-lighten-3{color:#ffcc80!important}.orange.lighten-2{background-color:#ffb74d!important}.orange-text.text-lighten-2{color:#ffb74d!important}.orange.lighten-1{background-color:#ffa726!important}.orange-text.text-lighten-1{color:#ffa726!important}.orange.darken-1{background-color:#fb8c00!important}.orange-text.text-darken-1{color:#fb8c00!important}.orange.darken-2{background-color:#f57c00!important}.orange-text.text-darken-2{color:#f57c00!important}.orange.darken-3{background-color:#ef6c00!important}.orange-text.text-darken-3{color:#ef6c00!important}.orange.darken-4{background-color:#e65100!important}.orange-text.text-darken-4{color:#e65100!important}.orange.accent-1{background-color:#ffd180!important}.orange-text.text-accent-1{color:#ffd180!important}.orange.accent-2{background-color:#ffab40!important}.orange-text.text-accent-2{color:#ffab40!important}.orange.accent-3{background-color:#ff9100!important}.orange-text.text-accent-3{color:#ff9100!important}.orange.accent-4{background-color:#ff6d00!important}.orange-text.text-accent-4{color:#ff6d00!important}.deep-orange{background-color:#ff5722!important}.deep-orange-text{color:#ff5722!important}.deep-orange.lighten-5{background-color:#fbe9e7!important}.deep-orange-text.text-lighten-5{color:#fbe9e7!important}.deep-orange.lighten-4{background-color:#ffccbc!important}.deep-orange-text.text-lighten-4{color:#ffccbc!important}.deep-orange.lighten-3{background-color:#ffab91!important}.deep-orange-text.text-lighten-3{color:#ffab91!important}.deep-orange.lighten-2{background-color:#ff8a65!important}.deep-orange-text.text-lighten-2{color:#ff8a65!important}.deep-orange.lighten-1{background-color:#ff7043!important}.deep-orange-text.text-lighten-1{color:#ff7043!important}.deep-orange.darken-1{background-color:#f4511e!important}.deep-orange-text.text-darken-1{color:#f4511e!important}.deep-orange.darken-2{background-color:#e64a19!important}.deep-orange-text.text-darken-2{color:#e64a19!important}.deep-orange.darken-3{background-color:#d84315!important}.deep-orange-text.text-darken-3{color:#d84315!important}.deep-orange.darken-4{background-color:#bf360c!important}.deep-orange-text.text-darken-4{color:#bf360c!important}.deep-orange.accent-1{background-color:#ff9e80!important}.deep-orange-text.text-accent-1{color:#ff9e80!important}.deep-orange.accent-2{background-color:#ff6e40!important}.deep-orange-text.text-accent-2{color:#ff6e40!important}.deep-orange.accent-3{background-color:#ff3d00!important}.deep-orange-text.text-accent-3{color:#ff3d00!important}.deep-orange.accent-4{background-color:#dd2c00!important}.deep-orange-text.text-accent-4{color:#dd2c00!important}.brown{background-color:#795548!important}.brown-text{color:#795548!important}.brown.lighten-5{background-color:#efebe9!important}.brown-text.text-lighten-5{color:#efebe9!important}.brown.lighten-4{background-color:#d7ccc8!important}.brown-text.text-lighten-4{color:#d7ccc8!important}.brown.lighten-3{background-color:#bcaaa4!important}.brown-text.text-lighten-3{color:#bcaaa4!important}.brown.lighten-2{background-color:#a1887f!important}.brown-text.text-lighten-2{color:#a1887f!important}.brown.lighten-1{background-color:#8d6e63!important}.brown-text.text-lighten-1{color:#8d6e63!important}.brown.darken-1{background-color:#6d4c41!important}.brown-text.text-darken-1{color:#6d4c41!important}.brown.darken-2{background-color:#5d4037!important}.brown-text.text-darken-2{color:#5d4037!important}.brown.darken-3{background-color:#4e342e!important}.brown-text.text-darken-3{color:#4e342e!important}.brown.darken-4{background-color:#3e2723!important}.brown-text.text-darken-4{color:#3e2723!important}.blue-grey{background-color:#607d8b!important}.blue-grey-text{color:#607d8b!important}.blue-grey.lighten-5{background-color:#eceff1!important}.blue-grey-text.text-lighten-5{color:#eceff1!important}.blue-grey.lighten-4{background-color:#cfd8dc!important}.blue-grey-text.text-lighten-4{color:#cfd8dc!important}.blue-grey.lighten-3{background-color:#b0bec5!important}.blue-grey-text.text-lighten-3{color:#b0bec5!important}.blue-grey.lighten-2{background-color:#90a4ae!important}.blue-grey-text.text-lighten-2{color:#90a4ae!important}.blue-grey.lighten-1{background-color:#78909c!important}.blue-grey-text.text-lighten-1{color:#78909c!important}.blue-grey.darken-1{background-color:#546e7a!important}.blue-grey-text.text-darken-1{color:#546e7a!important}.blue-grey.darken-2{background-color:#455a64!important}.blue-grey-text.text-darken-2{color:#455a64!important}.blue-grey.darken-3{background-color:#37474f!important}.blue-grey-text.text-darken-3{color:#37474f!important}.blue-grey.darken-4{background-color:#263238!important}.blue-grey-text.text-darken-4{color:#263238!important}.grey{background-color:#9e9e9e!important}.grey-text{color:#9e9e9e!important}.grey.lighten-5{background-color:#fafafa!important}.grey-text.text-lighten-5{color:#fafafa!important}.grey.lighten-4{background-color:#f5f5f5!important}.grey-text.text-lighten-4{color:#f5f5f5!important}.grey.lighten-3{background-color:#eee!important}.grey-text.text-lighten-3{color:#eee!important}.grey.lighten-2{background-color:#e0e0e0!important}.grey-text.text-lighten-2{color:#e0e0e0!important}.grey.lighten-1{background-color:#bdbdbd!important}.grey-text.text-lighten-1{color:#bdbdbd!important}.grey.darken-1{background-color:#757575!important}.grey-text.text-darken-1{color:#757575!important}.grey.darken-2{background-color:#616161!important}.grey-text.text-darken-2{color:#616161!important}.grey.darken-3{background-color:#424242!important}.grey-text.text-darken-3{color:#424242!important}.grey.darken-4{background-color:#212121!important}.grey-text.text-darken-4{color:#212121!important}.black{background-color:#000!important}.black-text{color:#000!important}.white{background-color:#fff!important}.white-text{color:#fff!important}.transparent{background-color:transparent!important}.transparent-text{color:transparent!important}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default) li{list-style-type:none}a{color:#039be5;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.btn,.btn-floating,.btn-large,.card,.card-panel,.collapsible,.dropdown-content,.side-nav,.toast,.z-depth-1,nav{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.btn-floating:hover,.btn-large:hover,.btn:hover,.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.3)}.modal,.z-depth-4{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.3)}.z-depth-5{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.3)}.hoverable{transition:box-shadow .25s;box-shadow:0}.hoverable:hover{transition:box-shadow .25s;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width:992px){.pagination{width:100%}.pagination li.next,.pagination li.prev{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:hsla(0,0%,100%,.7)}.breadcrumb [class*=mdi-],.breadcrumb [class^=mdi-],.breadcrumb i,.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:"\E5CC";color:hsla(0,0%,100%,.7);vertical-align:top;display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{top:0;left:0;right:0;z-index:-1}.parallax,.parallax img{position:absolute;bottom:0}.parallax img{display:none;left:50%;min-width:100%;min-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-bottom,.pin-top{position:relative}.pinned{position:fixed!important}.fade-in,ul.staggered-list li{opacity:0}.fade-in{-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width:600px){.hide-on-small-and-down,.hide-on-small-only{display:none!important}}@media only screen and (max-width:992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width:601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width:600px) and (max-width:992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width:993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width:993px){.show-on-large{display:block!important}}@media only screen and (min-width:600px) and (max-width:992px){.show-on-medium{display:block!important}}@media only screen and (max-width:600px){.show-on-small{display:block!important}}@media only screen and (min-width:601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width:992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width:600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:10px 0;color:hsla(0,0%,100%,.8);background-color:rgba(51,51,51,.08)}table,td,th{border:none}table{width:100%;display:table}table.bordered>tbody>tr,table.bordered>thead>tr{border-bottom:1px solid #d0d0d0}table.striped>tbody>tr:nth-child(odd){background-color:#f2f2f2}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:#f2f2f2}table.centered tbody tr td,table.centered thead tr th{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width:992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:"\A0"}table.responsive-table td,table.responsive-table th{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th:before{content:"\A0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container embed,.video-container iframe,.video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;transition:width .3s linear}.progress .determinate,.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{-webkit-animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress .indeterminate:after,.progress .indeterminate:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right}.progress .indeterminate:after{-webkit-animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]:after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-top:calc(1.5rem - 11px)}.side-nav span.badge{margin-top:13px}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:"liga";-moz-font-feature-settings:"liga";font-feature-settings:"liga"}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width:601px){.container{width:85%}}@media only screen and (min-width:993px){.container{width:70%}}.container .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=pull-],.row .col[class*=push-]{position:relative}.row .col.s1{width:8.3333333333%}.row .col.s1,.row .col.s2{margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%}.row .col.s3{width:25%}.row .col.s3,.row .col.s4{margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%}.row .col.s5{width:41.6666666667%}.row .col.s5,.row .col.s6{margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%}.row .col.s7{width:58.3333333333%}.row .col.s7,.row .col.s8{margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%}.row .col.s9{width:75%}.row .col.s9,.row .col.s10{margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%}.row .col.s11{width:91.6666666667%}.row .col.s11,.row .col.s12{margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width:601px){.row .col.m1{width:8.3333333333%}.row .col.m1,.row .col.m2{margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%}.row .col.m3{width:25%}.row .col.m3,.row .col.m4{margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%}.row .col.m5{width:41.6666666667%}.row .col.m5,.row .col.m6{margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%}.row .col.m7{width:58.3333333333%}.row .col.m7,.row .col.m8{margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%}.row .col.m9{width:75%}.row .col.m9,.row .col.m10{margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%}.row .col.m11{width:91.6666666667%}.row .col.m11,.row .col.m12{margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width:993px){.row .col.l1{width:8.3333333333%}.row .col.l1,.row .col.l2{margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%}.row .col.l3{width:25%}.row .col.l3,.row .col.l4{margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%}.row .col.l5{width:41.6666666667%}.row .col.l5,.row .col.l6{margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%}.row .col.l7{width:58.3333333333%}.row .col.l7,.row .col.l8{margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%}.row .col.l9{width:75%}.row .col.l9,.row .col.l10{margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%}.row .col.l11{width:91.6666666667%}.row .col.l11,.row .col.l12{margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width:1201px){.row .col.xl1{width:8.3333333333%}.row .col.xl1,.row .col.xl2{margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%}.row .col.xl3{width:25%}.row .col.xl3,.row .col.xl4{margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%}.row .col.xl5{width:41.6666666667%}.row .col.xl5,.row .col.xl6{margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%}.row .col.xl7{width:58.3333333333%}.row .col.xl7,.row .col.xl8{margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%}.row .col.xl9{width:75%}.row .col.xl9,.row .col.xl10{margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%}.row .col.xl11{width:91.6666666667%}.row .col.xl11,.row .col.xl12{margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav [class*=mdi-],nav [class^=mdi-],nav i,nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width:993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .button-collapse i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0;white-space:nowrap}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width:992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo [class*=mdi-],nav .brand-logo [class^=mdi-],nav .brand-logo i,nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-flat,nav ul a.btn-floating,nav ul a.btn-large{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=date]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=text]:valid,nav .input-field input[type=url]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:hsla(0,0%,100%,.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width:601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:Roboto;src:local(Roboto Thin),url(fonts/Roboto-Thin.woff2) format("woff2"),url(fonts/Roboto-Thin.woff) format("woff");font-weight:100}@font-face{font-family:Roboto;src:local(Roboto Light),url(fonts/Roboto-Light.woff2) format("woff2"),url(fonts/Roboto-Light.woff) format("woff");font-weight:300}@font-face{font-family:Roboto;src:local(Roboto Regular),url(fonts/Roboto-Regular.woff2) format("woff2"),url(fonts/Roboto-Regular.woff) format("woff");font-weight:400}@font-face{font-family:Roboto;src:local(Roboto Medium),url(fonts/Roboto-Medium.woff2) format("woff2"),url(fonts/Roboto-Medium.woff) format("woff");font-weight:500}@font-face{font-family:Roboto;src:local(Roboto Bold),url(fonts/Roboto-Bold.woff2) format("woff2"),url(fonts/Roboto-Bold.woff) format("woff");font-weight:700}a{text-decoration:none}html{line-height:1.5;font-family:Roboto,sans-serif;font-weight:400;color:rgba(0,0,0,.87)}@media only screen and (min-width:0){html{font-size:14px}}@media only screen and (min-width:992px){html{font-size:14.5px}}@media only screen and (min-width:1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.1}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;margin:2.1rem 0 1.68rem}h1,h2{line-height:110%}h2{font-size:3.56rem;margin:1.78rem 0 1.424rem}h3{font-size:2.92rem;margin:1.46rem 0 1.168rem}h3,h4{line-height:110%}h4{font-size:2.28rem;margin:1.14rem 0 .912rem}h5{font-size:1.64rem;margin:.82rem 0 .656rem}h5,h6{line-height:110%}h6{font-size:1rem;margin:.5rem 0 .4rem}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width:360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width:390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width:420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width:450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width:480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width:510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width:540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width:570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width:600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width:630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width:660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width:690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width:720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width:750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width:780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width:810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width:840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width:870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width:900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width:930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width:960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width:360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63),-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s!important;transition:transform .2s!important;transition:transform .2s,-webkit-transform .2s!important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{padding:24px}.card,.card-panel{transition:box-shadow .25s;margin:.5rem 0 1rem;border-radius:2px;background-color:#fff}.card{position:relative}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.large,.card.medium,.card.small{position:relative}.card.large .card-image,.card.medium .card-image,.card.small .card-image{max-height:60%;overflow:hidden}.card.large .card-image+.card-content,.card.medium .card-image+.card-content,.card.small .card-image+.card-content{max-height:40%}.card.large .card-content,.card.medium .card-content,.card.small .card-content{max-height:100%;overflow:hidden}.card.large .card-action,.card.medium .card-action,.card.small .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.large .card-image,.card.horizontal.medium .card-image,.card.horizontal.small .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.large .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.small .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{position:relative;background-color:inherit;border-top:1px solid hsla(0,0%,63%,.2);padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width:600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width:601px) and (max-width:992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width:993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;word-break:break-all;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.toast .btn,.toast .btn-flat,.toast .btn-large{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width:600px){.toast{width:100%;border-radius:0}}@media only screen and (min-width:601px) and (max-width:992px){.toast{float:left}}@media only screen and (min-width:993px){.toast{float:right}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover,.tabs.tabs-transparent .tab a{color:hsla(0,0%,100%,.7)}.tabs.tabs-transparent .tab a.active,.tabs.tabs-transparent .tab a:hover{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease}.tabs .tab a.active,.tabs .tab a:hover{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,.7);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left,right}@media only screen and (max-width:992px){.tabs{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none}.backdrop,.material-tooltip{opacity:0;position:absolute;visibility:hidden}.backdrop{height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0;transform-origin:50% 0}.btn,.btn-flat,.btn-large{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn-flat.disabled,.btn-flat:disabled,.btn-flat[disabled],.btn-floating.disabled,.btn-floating:disabled,.btn-floating[disabled],.btn-large.disabled,.btn-large:disabled,.btn-large[disabled],.btn.disabled,.btn:disabled,.btn[disabled],.disabled.btn-large,[disabled].btn-large{pointer-events:none;background-color:#dfdfdf!important;box-shadow:none;color:#9f9f9f!important;cursor:default}.btn-flat.disabled:hover,.btn-flat:disabled:hover,.btn-flat[disabled]:hover,.btn-floating.disabled:hover,.btn-floating:disabled:hover,.btn-floating[disabled]:hover,.btn-large.disabled:hover,.btn-large:disabled:hover,.btn-large[disabled]:hover,.btn.disabled:hover,.btn:disabled:hover,.btn[disabled]:hover,.disabled.btn-large:hover,[disabled].btn-large:hover{background-color:#dfdfdf!important;color:#9f9f9f!important}.btn,.btn-flat,.btn-floating,.btn-large{font-size:1rem;outline:0}.btn-flat i,.btn-floating i,.btn-large i,.btn i{font-size:1.3rem;line-height:inherit}.btn-floating:focus,.btn-large:focus,.btn:focus{background-color:#1d7d74}.btn,.btn-large{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.btn-large:hover,.btn:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating,.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.horizontal{padding:0 0 0 15px}.fixed-action-btn.horizontal ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.horizontal ul li{display:inline-block;margin:15px 15px 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0}.fixed-action-btn.toolbar ul li{-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{box-shadow:none;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat,.btn-flat:active,.btn-flat:focus{background-color:transparent}.btn-flat:focus,.btn-flat:hover{background-color:rgba(0,0,0,.1);box-shadow:none}.btn-flat:active{background-color:rgba(0,0,0,.2)}.btn-flat.disabled{background-color:transparent!important;color:#b3b3b3!important;cursor:default}.btn-large{height:54px;line-height:54px}.btn-large i{font-size:1.6rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;z-index:999;will-change:width,height}.dropdown-content li{clear:both;color:rgba(0,0,0,.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li.active,.dropdown-content li.selected,.dropdown-content li:hover{background-color:#eee}.dropdown-content li.active.selected{background-color:#e1e1e1}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}.input-field.col .dropdown-content [type=checkbox]+label{top:1px;left:0;height:18px}.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,.2);transition:all .7s ease-out;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:hsla(0,0%,100%,.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,.7)}.waves-effect input[type=button],.waves-effect input[type=reset],.waves-effect input[type=submit]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}@media only screen and (max-width:992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-flat,.modal .modal-footer .btn-large{float:right;margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-100px;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem}.collapsible-header{display:block;cursor:pointer;min-height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box;padding:2rem}.side-nav .collapsible,.side-nav.fixed .collapsible{border:none;box-shadow:none}.side-nav .collapsible li,.side-nav.fixed .collapsible li{padding:0}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.side-nav .collapsible-header:hover,.side-nav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,.05)}.side-nav .collapsible-header i,.side-nav.fixed .collapsible-header i{line-height:inherit}.side-nav .collapsible-body,.side-nav.fixed .collapsible-body{border:0;background-color:#fff}.side-nav .collapsible-body li a,.side-nav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 24px;transition:margin .35s cubic-bezier(.25,.46,.45,.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;box-shadow:none;margin:0 0 20px;min-height:45px;outline:none;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .chip.selected{background-color:#26a69a;color:#fff}.chips .input{background:none;border:0;color:rgba(0,0,0,.6);display:inline-block;font-size:1rem;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0}.prefix~.chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty~label{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{top:0;right:0;background-color:#292929;will-change:opacity}#materialbox-overlay,.materialbox-caption{position:fixed;bottom:0;left:0;z-index:1000}.materialbox-caption{display:none;color:#fff;line-height:50px;width:100%;text-align:center;padding:0 15%;height:50px;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder,::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input:not([type]),input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}input:not([type]):disabled,input:not([type])[readonly=readonly],input[type=date]:disabled,input[type=date][readonly=readonly],input[type=datetime-local]:disabled,input[type=datetime-local][readonly=readonly],input[type=datetime]:disabled,input[type=datetime][readonly=readonly],input[type=email]:disabled,input[type=email][readonly=readonly],input[type=number]:disabled,input[type=number][readonly=readonly],input[type=password]:disabled,input[type=password][readonly=readonly],input[type=search]:disabled,input[type=search][readonly=readonly],input[type=tel]:disabled,input[type=tel][readonly=readonly],input[type=text]:disabled,input[type=text][readonly=readonly],input[type=time]:disabled,input[type=time][readonly=readonly],input[type=url]:disabled,input[type=url][readonly=readonly],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly=readonly]{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26)}input:not([type]):disabled+label,input:not([type])[readonly=readonly]+label,input[type=date]:disabled+label,input[type=date][readonly=readonly]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly=readonly]+label,input[type=datetime]:disabled+label,input[type=datetime][readonly=readonly]+label,input[type=email]:disabled+label,input[type=email][readonly=readonly]+label,input[type=number]:disabled+label,input[type=number][readonly=readonly]+label,input[type=password]:disabled+label,input[type=password][readonly=readonly]+label,input[type=search]:disabled+label,input[type=search][readonly=readonly]+label,input[type=tel]:disabled+label,input[type=tel][readonly=readonly]+label,input[type=text]:disabled+label,input[type=text][readonly=readonly]+label,input[type=time]:disabled+label,input[type=time][readonly=readonly]+label,input[type=url]:disabled+label,input[type=url][readonly=readonly]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly=readonly]+label{color:rgba(0,0,0,.26)}input:not([type]):focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=datetime]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=search]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=text]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=url]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=datetime]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=text]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]).valid,input:not([type]):focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=datetime].valid,input[type=datetime]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=text].valid,input[type=text]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type]).valid+label:after,input:not([type]):focus.valid+label:after,input[type=date].valid+label:after,input[type=date]:focus.valid+label:after,input[type=datetime-local].valid+label:after,input[type=datetime-local]:focus.valid+label:after,input[type=datetime].valid+label:after,input[type=datetime]:focus.valid+label:after,input[type=email].valid+label:after,input[type=email]:focus.valid+label:after,input[type=number].valid+label:after,input[type=number]:focus.valid+label:after,input[type=password].valid+label:after,input[type=password]:focus.valid+label:after,input[type=search].valid+label:after,input[type=search]:focus.valid+label:after,input[type=tel].valid+label:after,input[type=tel]:focus.valid+label:after,input[type=text].valid+label:after,input[type=text]:focus.valid+label:after,input[type=time].valid+label:after,input[type=time]:focus.valid+label:after,input[type=url].valid+label:after,input[type=url]:focus.valid+label:after,textarea.materialize-textarea.valid+label:after,textarea.materialize-textarea:focus.valid+label:after{content:attr(data-success);color:#4caf50;opacity:1}input:not([type]).invalid,input:not([type]):focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=datetime].invalid,input[type=datetime]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=text].invalid,input[type=text]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}input:not([type]).invalid+label:after,input:not([type]):focus.invalid+label:after,input[type=date].invalid+label:after,input[type=date]:focus.invalid+label:after,input[type=datetime-local].invalid+label:after,input[type=datetime-local]:focus.invalid+label:after,input[type=datetime].invalid+label:after,input[type=datetime]:focus.invalid+label:after,input[type=email].invalid+label:after,input[type=email]:focus.invalid+label:after,input[type=number].invalid+label:after,input[type=number]:focus.invalid+label:after,input[type=password].invalid+label:after,input[type=password]:focus.invalid+label:after,input[type=search].invalid+label:after,input[type=search]:focus.invalid+label:after,input[type=tel].invalid+label:after,input[type=tel]:focus.invalid+label:after,input[type=text].invalid+label:after,input[type=text]:focus.invalid+label:after,input[type=time].invalid+label:after,input[type=time]:focus.invalid+label:after,input[type=url].invalid+label:after,input[type=url]:focus.invalid+label:after,textarea.materialize-textarea.invalid+label:after,textarea.materialize-textarea:focus.invalid+label:after{content:attr(data-error);color:#f44336;opacity:1}input:not([type]).validate+label,input[type=date].validate+label,input[type=datetime-local].validate+label,input[type=datetime].validate+label,input[type=email].validate+label,input[type=number].validate+label,input[type=password].validate+label,input[type=search].validate+label,input[type=tel].validate+label,input[type=text].validate+label,input[type=time].validate+label,input[type=url].validate+label,textarea.materialize-textarea.validate+label{width:100%;pointer-events:none}input:not([type])+label:after,input[type=date]+label:after,input[type=datetime-local]+label:after,input[type=datetime]+label:after,input[type=email]+label:after,input[type=number]+label:after,input[type=password]+label:after,input[type=search]+label:after,input[type=tel]+label:after,input[type=text]+label:after,input[type=time]+label:after,input[type=url]+label:after,textarea.materialize-textarea+label:after{display:block;content:"";position:absolute;top:60px;opacity:0;transition:opacity .2s ease-out,color .2s ease-out}.input-field{position:relative;margin-top:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline .select-dropdown,.input-field.inline input{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix~.validate~label,.input-field.col .prefix~label{width:calc(100% - 3rem - 1.5rem)}.input-field label{color:#9e9e9e;position:absolute;top:.8rem;left:0;font-size:1rem;cursor:text;transition:.2s ease-out;text-align:initial}.input-field label:not(.label-icon).active{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix~.autocomplete-content,.input-field .prefix~.validate~label,.input-field .prefix~input,.input-field .prefix~label,.input-field .prefix~textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix~label{margin-left:3rem}@media only screen and (max-width:992px){.input-field .prefix~input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width:600px){.input-field .prefix~input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus~.material-icons,.input-field input[type=search]:focus~.mdi-navigation-close{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search]~.material-icons,.input-field input[type=search]~.mdi-navigation-close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:.8rem 0 1.6rem;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0}.autocomplete-content{margin-top:-20px;display:block;opacity:1;position:static}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}[type=radio]:checked,[type=radio]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=radio]:checked+label,[type=radio]:not(:checked)+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=radio]+label:after,[type=radio]+label:before{content:"";position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after,[type=radio]:checked+label:before,[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border-radius:50%}[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border:2px solid #5a5a5a}[type=radio]:not(:checked)+label:after{-webkit-transform:scale(0);transform:scale(0)}[type=radio]:checked+label:before{border:2px solid transparent}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after{border:2px solid #26a69a}[type=radio].with-gap:checked+label:after,[type=radio]:checked+label:after{background-color:#26a69a}[type=radio]:checked+label:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type=radio].with-gap:checked+label:after{-webkit-transform:scale(.5);transform:scale(.5)}[type=radio].tabbed:focus+label:before{box-shadow:0 0 0 10px rgba(0,0,0,.1)}[type=radio].with-gap:disabled:checked+label:before{border:2px solid rgba(0,0,0,.26)}[type=radio].with-gap:disabled:checked+label:after{border:none;background-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:before,[type=radio]:disabled:not(:checked)+label:before{background-color:transparent;border-color:rgba(0,0,0,.26)}[type=radio]:disabled+label{color:rgba(0,0,0,.26)}[type=radio]:disabled:not(:checked)+label:before{border-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:after{background-color:rgba(0,0,0,.26);border-color:#bdbdbd}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type=checkbox]:checked,[type=checkbox]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=checkbox]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type=checkbox]+label:before,[type=checkbox]:not(.filled-in)+label:after{content:"";position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;transition:.2s}[type=checkbox]:not(.filled-in)+label:after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type=checkbox]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,.26)}[type=checkbox].tabbed:focus+label:after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}[type=checkbox]:checked+label:before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);border-bottom:2px solid rgba(0,0,0,.26)}[type=checkbox]:indeterminate+label:before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);background-color:transparent}[type=checkbox].filled-in+label:after{border-radius:2px}[type=checkbox].filled-in+label:after,[type=checkbox].filled-in+label:before{content:"";left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type=checkbox].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type=checkbox].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type=checkbox].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox].filled-in:checked+label:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type=checkbox].filled-in.tabbed:focus+label:after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,.1)}[type=checkbox].filled-in.tabbed:checked:focus+label:after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type=checkbox].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type=checkbox].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#bdbdbd}[type=checkbox].filled-in:disabled:checked+label:before{background-color:transparent}[type=checkbox].filled-in:disabled:checked+label:after{background-color:#bdbdbd;border-color:#bdbdbd}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a;left:24px}.switch label .lever{content:"";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:"";position:absolute;display:inline-block;width:21px;height:21px;background-color:#f1f1f1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,.4);left:-5px;top:-3px;transition:left .3s ease,background .3s ease,box-shadow .1s ease}input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:checked:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(38,166,154,.1)}input[type=checkbox]:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(0,0,0,.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#bdbdbd}select{display:none}select.browser-default{display:block}select{background-color:hsla(0,0%,100%,.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;display:block}.select-wrapper span.caret{color:initial;position:absolute;right:0;top:0;bottom:0;height:10px;margin:auto 0;font-size:10px;line-height:10px}.select-wrapper span.caret.disabled{color:rgba(0,0,0,.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:.8rem}select:disabled{color:rgba(0,0,0,.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.3)}.select-wrapper i{color:rgba(0,0,0,.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,.3);background-color:transparent}.prefix~.select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix~label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,.4)}.select-dropdown li.optgroup~li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0;transition:.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid #fff}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ee6e73}.side-nav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:calc(100% + 60px);height:100%;padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.side-nav .collapsible{margin:0}.side-nav li{float:none;line-height:48px}.side-nav li.active{background-color:rgba(0,0,0,.05)}.side-nav li>a{color:rgba(0,0,0,.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.side-nav li>a:hover{background-color:rgba(0,0,0,.05)}.side-nav li>a.btn,.side-nav li>a.btn-flat,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{margin:10px 15px}.side-nav li>a.btn,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{color:#fff}.side-nav li>a.btn-flat{color:#343434}.side-nav li>a.btn-large:hover,.side-nav li>a.btn:hover{background-color:#2bbbad}.side-nav li>a.btn-floating:hover{background-color:#26a69a}.side-nav li>a>[class^=mdi-],.side-nav li>a>i,.side-nav li>a>i.material-icons,.side-nav li>a li>a>[class*=mdi-]{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,.54)}.side-nav .divider{margin:8px 0 0}.side-nav .subheader{cursor:auto;pointer-events:none;color:rgba(0,0,0,.54);font-size:14px;font-weight:500;line-height:48px}.side-nav .subheader:hover{background-color:transparent}.side-nav .userView{position:relative;padding:32px 32px 0;margin-bottom:8px}.side-nav .userView>a{height:auto;padding:0}.side-nav .userView>a:hover{background-color:transparent}.side-nav .userView .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.side-nav .userView .circle,.side-nav .userView .email,.side-nav .userView .name{display:block}.side-nav .userView .circle{height:64px;width:64px}.side-nav .userView .email,.side-nav .userView .name{font-size:14px;line-height:24px}.side-nav .userView .name{margin-top:16px;font-weight:500}.side-nav .userView .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width:992px){.side-nav.fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.side-nav a{padding:0 16px}.side-nav .userView{padding:16px 16px 0}}.side-nav .collapsible-body>ul:not(.collapsible)>li.active,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.side-nav .collapsible-body>ul:not(.collapsible)>li.active a,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.side-nav .collapsible-body{padding:0}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(1turn)}}@keyframes container-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-green-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(3turn)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(3turn);transform:rotate(3turn)}}@-webkit-keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@-webkit-keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}@keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes left-spin{0%{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{0%{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1);animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1)}@-webkit-keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:50%}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4caf50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0 50%;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0;height:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{display:none;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:hsla(0,0%,100%,.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel .carousel-item:not(.active) .materialboxed,.carousel.scrolling .carousel-item .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0s}.tap-target-wrapper.open .tap-target{opacity:.95;transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-wrapper.open .tap-target,.tap-target-wrapper.open .tap-target-wave:before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave:after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;transition:opacity .3s,visibility 0s 1s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s 1s;transition:opacity .3s,transform .3s,visibility 0s 1s,-webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;box-shadow:0 20px 20px 0 rgba(0,0,0,.14),0 10px 50px 0 rgba(0,0,0,.12),0 30px 10px -20px rgba(0,0,0,.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave:after,.tap-target-wave:before{content:"";display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave:before{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.tap-target-wave:after{visibility:hidden;transition:opacity .3s,visibility 0s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s;transition:opacity .3s,transform .3s,visibility 0s,-webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large),.tap-target-origin:not(.btn):not(.btn-large):hover{background:none}@media only screen and (max-width:600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:initial;position:relative}.pulse:before{content:"";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.picker__frame,.picker__holder{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;transition:background .15s ease-out,top 0s .15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;min-width:256px;width:300px;max-height:350px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;transition:all .15s ease-out}@media (min-height:28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:28.875em){.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:28.875em){.picker__box{display:block;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height:35.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__input.picker__input--active{border-color:#e3f2fd}.picker__frame{margin:0 auto;max-width:325px}@media (min-height:38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#fff;width:40%}.picker__select--year.browser-default{display:inline;background-color:#fff;width:26%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,.05)}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em}.picker__table,.picker__table td,.picker__table th{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#ddd;font-weight:500}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{cursor:pointer}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{-webkit-transform:scale(.75);transform:scale(.75);background:#0089ec}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__footer{text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:rgba(0,0,0,.05);outline:none}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:hsla(0,0%,100%,.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{border-radius:50%;-webkit-transform:scale(.9);transform:scale(.9);background-color:#26a69a;color:#fff}.picker--focused .picker__day--selected.picker__day--outfocus,.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #676767}button.picker__clear:focus,button.picker__close:focus,button.picker__today:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #ddd;border-top:1px solid #ddd;margin-bottom:-1px;position:relative;background:#fff;padding:.75em 1.25em}@media (min-height:46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__list-item--highlighted,.picker__list-item:hover{border-color:#0089ec;z-index:10}.picker--focused .picker__list-item--highlighted,.picker__list-item--highlighted:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker--focused .picker__list-item--selected,.picker__list-item--selected,.picker__list-item--selected:hover{background:#0089ec;color:#fff;z-index:10}.picker--focused .picker__list-item--disabled,.picker__list-item--disabled,.picker__list-item--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default;border-color:#ddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:focus,.picker--time .picker__button--clear:hover{color:#000;background:#b1dcfb;background:#e20;border-color:#e20;cursor:pointer;color:#fff;outline:none}.picker--time .picker__button--clear:before{top:-.25em;color:#666;font-size:1.25em;font-weight:700}.picker--time .picker__button--clear:focus:before,.picker--time .picker__button--clear:hover:before{color:#fff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height:40.125em){.picker--time .picker__box{margin-bottom:5em}}.annotator-filter *,.annotator-notice,.annotator-widget *{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:400;text-align:left;margin:0;padding:0;background:none;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;-moz-box-shadow:none;-webkit-box-shadow:none;-o-box-shadow:none;box-shadow:none;color:#909090}.annotator-adder{background-image:url(img/annotator-icon-sprite.png);background-repeat:no-repeat}.annotator-editor a:after,.annotator-filter .annotator-filter-navigation button:after,.annotator-filter .annotator-filter-property .annotator-filter-clear,.annotator-resize,.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button,.annotator-widget:after{background-image:url(img/annotator-glyph-sprite.png);background-repeat:no-repeat}.annotator-hl{background:#ffff0a;background:rgba(255,255,10,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4DFFFF0A, endColorstr=#4DFFFF0A)"}.annotator-hl-temporary{background:#007cff;background:rgba(0,124,255,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4D007CFF, endColorstr=#4D007CFF)"}.annotator-wrapper{position:relative}.annotator-adder,.annotator-notice,.annotator-outer{z-index:1020}.annotator-filter{z-index:1010}.annotator-adder,.annotator-notice,.annotator-outer,.annotator-widget{position:absolute;font-size:10px;line-height:1}.annotator-hide{display:none;visibility:hidden}.annotator-adder{margin-top:-48px;margin-left:-24px;width:48px;height:48px;background-position:0 0}.annotator-adder:hover{background-position:top}.annotator-adder:active{background-position:100%}.annotator-adder button{display:block;width:36px;height:41px;margin:0 auto;border:none;background:none;text-indent:-999em;cursor:pointer}.annotator-outer{width:0;height:0}.annotator-widget{margin:0;padding:0;bottom:15px;left:-18px;min-width:265px;background-color:#fbfbfb;background-color:hsla(0,0%,98%,.98);border:1px solid #7a7a7a;border:1px solid hsla(0,0%,48%,.6);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.2);-moz-box-shadow:0 5px 15px rgba(0,0,0,.2);-o-box-shadow:0 5px 15px rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.2)}.annotator-invert-x .annotator-widget{left:auto;right:-18px}.annotator-invert-y .annotator-widget{bottom:auto;top:8px}.annotator-widget strong{font-weight:700}.annotator-widget .annotator-item,.annotator-widget .annotator-listing{padding:0;margin:0;list-style:none}.annotator-widget:after{content:"";display:block;width:18px;height:10px;background-position:0 0;position:absolute;bottom:-10px;left:8px}.annotator-invert-x .annotator-widget:after{left:auto;right:8px}.annotator-invert-y .annotator-widget:after{background-position:0 -15px;bottom:auto;top:-9px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea,.annotator-widget .annotator-item{position:relative;font-size:12px}.annotator-viewer .annotator-item{border-top:2px solid #7a7a7a;border-top:2px solid hsla(0,0%,48%,.2)}.annotator-widget .annotator-item:first-child{border-top:none}.annotator-editor .annotator-item,.annotator-viewer div{border-top:1px solid #858585;border-top:1px solid hsla(0,0%,52%,.11)}.annotator-viewer div{padding:6px}.annotator-viewer .annotator-item ol,.annotator-viewer .annotator-item ul{padding:4px 16px}.annotator-editor .annotator-item:first-child textarea,.annotator-viewer div:first-of-type{padding-top:12px;padding-bottom:12px;color:#3c3c3c;font-size:13px;font-style:italic;line-height:1.3;border-top:none}.annotator-viewer .annotator-controls{position:relative;top:5px;right:5px;padding-left:5px;opacity:0;-webkit-transition:opacity .2s ease-in;-moz-transition:opacity .2s ease-in;-o-transition:opacity .2s ease-in;transition:opacity .2s ease-in;float:right}.annotator-viewer li .annotator-controls.annotator-visible,.annotator-viewer li:hover .annotator-controls{opacity:1}.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button{cursor:pointer;display:inline-block;width:13px;height:13px;margin-left:2px;border:none;opacity:.2;text-indent:-900em;background-color:transparent;outline:none}.annotator-viewer .annotator-controls a:focus,.annotator-viewer .annotator-controls a:hover,.annotator-viewer .annotator-controls button:focus,.annotator-viewer .annotator-controls button:hover{opacity:.9}.annotator-viewer .annotator-controls a:active,.annotator-viewer .annotator-controls button:active{opacity:1}.annotator-viewer .annotator-controls button[disabled]{display:none}.annotator-viewer .annotator-controls .annotator-edit{background-position:0 -60px}.annotator-viewer .annotator-controls .annotator-delete{background-position:0 -75px}.annotator-viewer .annotator-controls .annotator-link{background-position:0 -270px}.annotator-editor .annotator-item{position:relative}.annotator-editor .annotator-item label{top:0;display:inline;cursor:pointer;font-size:12px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea{display:block;min-width:100%;padding:10px 8px;border:none;margin:0;color:#3c3c3c;background:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;resize:none}.annotator-editor .annotator-item textarea::-webkit-scrollbar{height:8px;width:8px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-track-piece{margin:13px 0 3px;background-color:#e5e5e5;-webkit-border-radius:4px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:vertical{height:25px;background-color:#ccc;-webkit-border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1)}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:horizontal{width:25px;background-color:#ccc;-webkit-border-radius:4px}.annotator-editor .annotator-item:first-child textarea{min-height:5.5em;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor .annotator-item input:focus,.annotator-editor .annotator-item textarea:focus{background-color:#f3f3f3;outline:none}.annotator-editor .annotator-item input[type=checkbox],.annotator-editor .annotator-item input[type=radio]{width:auto;min-width:0;padding:0;display:inline;margin:0 4px 0 0;cursor:pointer}.annotator-editor .annotator-checkbox{padding:8px 6px}.annotator-editor .annotator-controls,.annotator-filter,.annotator-filter .annotator-filter-navigation button{text-align:right;padding:3px;border-top:1px solid #d4d4d4;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.6,#dcdcdc),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);-webkit-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-moz-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-o-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-o-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.annotator-editor.annotator-invert-y .annotator-controls{border-top:none;border-bottom:1px solid #b4b4b4;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor a,.annotator-filter .annotator-filter-property label{position:relative;display:inline-block;padding:0 6px 0 22px;color:#363636;text-shadow:0 1px 0 hsla(0,0%,100%,.75);text-decoration:none;line-height:24px;font-size:12px;font-weight:700;border:1px solid #a2a2a2;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.5,#d2d2d2),color-stop(.5,#bebebe),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#d2d2d2 50%,#bebebe 50%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px}.annotator-editor a:after{position:absolute;top:50%;left:5px;display:block;content:"";width:15px;height:15px;margin-top:-7px;background-position:0 -90px}.annotator-editor a.annotator-focus,.annotator-editor a:focus,.annotator-editor a:hover,.annotator-filter .annotator-filter-active label,.annotator-filter .annotator-filter-navigation button:hover{outline:none;border-color:#435aa0;background-color:#3865f9;background-image:-webkit-gradient(linear,left top,left bottom,from(#7691fb),color-stop(.5,#5075fb),color-stop(.5,#3865f9),to(#3665fa));background-image:-moz-linear-gradient(to bottom,#7691fb,#5075fb 50%,#3865f9 50%,#3665fa);background-image:-webkit-linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);background-image:linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.42)}.annotator-editor a:focus:after,.annotator-editor a:hover:after{margin-top:-8px;background-position:0 -105px}.annotator-editor a:active,.annotator-filter .annotator-filter-navigation button:active{border-color:#700c49;background-color:#d12e8e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fc7cca),color-stop(.5,#e85db2),color-stop(.5,#d12e8e),to(#ff009c));background-image:-moz-linear-gradient(to bottom,#fc7cca,#e85db2 50%,#d12e8e 50%,#ff009c);background-image:-webkit-linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c);background-image:linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c)}.annotator-editor a.annotator-save:after{background-position:0 -120px}.annotator-editor a.annotator-save.annotator-focus:after,.annotator-editor a.annotator-save:focus:after,.annotator-editor a.annotator-save:hover:after{margin-top:-8px;background-position:0 -135px}.annotator-editor .annotator-widget:after{background-position:0 -30px}.annotator-editor.annotator-invert-y .annotator-widget .annotator-controls{background-color:#f2f2f2}.annotator-editor.annotator-invert-y .annotator-widget:after{background-position:0 -45px;height:11px}.annotator-resize{position:absolute;top:0;right:0;width:12px;height:12px;background-position:2px -150px}.annotator-invert-x .annotator-resize{right:auto;left:0;background-position:0 -195px}.annotator-invert-y .annotator-resize{top:auto;bottom:0;background-position:2px -165px}.annotator-invert-y.annotator-invert-x .annotator-resize{background-position:0 -180px}.annotator-notice{color:#fff;position:fixed;top:-54px;left:0;width:100%;font-size:14px;line-height:50px;text-align:center;background:#000;background:rgba(0,0,0,.9);border-bottom:4px solid #d4d4d4;-webkit-transition:top .4s ease-out;-moz-transition:top .4s ease-out;-o-transition:top .4s ease-out;transition:top .4s ease-out}.annotator-notice-success{border-color:#3665f9}.annotator-notice-error{border-color:#ff7e00}.annotator-notice p{margin:0}.annotator-notice a{color:#fff}.annotator-notice-show{top:0}.annotator-tags{margin-bottom:-2px}.annotator-tags .annotator-tag{display:inline-block;padding:0 8px;margin-bottom:2px;line-height:1.6;font-weight:700;background-color:#e6e6e6;-webkit-border-radius:8px;-moz-border-radius:8px;-o-border-radius:8px;border-radius:8px}.annotator-filter{position:fixed;top:0;right:0;left:0;text-align:left;line-height:0;border:none;border-bottom:1px solid #878787;padding-left:10px;padding-right:10px;-webkit-border-radius:0;-moz-border-radius:0;-o-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-moz-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-o-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3)}.annotator-filter strong{font-size:12px;font-weight:700;color:#3c3c3c;text-shadow:0 1px 0 hsla(0,0%,100%,.7);position:relative;top:-9px}.annotator-filter .annotator-filter-navigation,.annotator-filter .annotator-filter-property{position:relative;display:inline-block;overflow:hidden;line-height:10px;padding:2px 0;margin-right:8px}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-property label{text-align:left;display:block;float:left;line-height:20px;-webkit-border-radius:10px 0 0 10px;-moz-border-radius:10px 0 0 10px;-o-border-radius:10px 0 0 10px;border-radius:10px 0 0 10px}.annotator-filter .annotator-filter-property label{padding-left:8px}.annotator-filter .annotator-filter-property input{display:block;float:right;-webkit-appearance:none;background-color:#fff;border:1px solid #878787;border-left:none;padding:2px 4px;line-height:16px;min-height:16px;font-size:12px;width:150px;color:#333;background-color:#f8f8f8;-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-o-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px rgba(0,0,0,.2)}.annotator-filter .annotator-filter-property input:focus{outline:none;background-color:#fff}.annotator-filter .annotator-filter-clear{position:absolute;right:3px;top:6px;border:none;text-indent:-900em;width:15px;height:15px;background-position:0 -90px;opacity:.4}.annotator-filter .annotator-filter-clear:focus,.annotator-filter .annotator-filter-clear:hover{opacity:.8}.annotator-filter .annotator-filter-clear:active{opacity:1}.annotator-filter .annotator-filter-navigation button{border:1px solid #a2a2a2;padding:0;text-indent:-900px;width:20px;min-height:22px;-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8)}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-navigation button:focus,.annotator-filter .annotator-filter-navigation button:hover{color:transparent}.annotator-filter .annotator-filter-navigation button:after{position:absolute;top:8px;left:8px;content:"";display:block;width:9px;height:9px;background-position:0 -210px}.annotator-filter .annotator-filter-navigation button:hover:after{background-position:0 -225px}.annotator-filter .annotator-filter-navigation .annotator-filter-next{-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}.annotator-filter .annotator-filter-navigation .annotator-filter-next:after{left:auto;right:7px;background-position:0 -240px}.annotator-filter .annotator-filter-navigation .annotator-filter-next:hover:after{background-position:0 -255px}.annotator-hl-active{background:#ffff0a;background:rgba(255,255,10,.8);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#CCFFFF0A, endColorstr=#CCFFFF0A)"}.annotator-hl-filtered{background-color:transparent}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(fonts/MaterialIcons-Regular.woff2) format("woff2"),url(fonts/MaterialIcons-Regular.woff) format("woff"),url(fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Lato;font-weight:100;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-hairline.woff2) format("woff2"),url(fonts/lato-hairline.woff) format("woff")}@font-face{font-family:Lato;font-weight:100;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-hairline-italic.woff2) format("woff2"),url(fonts/lato-hairline-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-thin.woff2) format("woff2"),url(fonts/lato-thin.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-thin-italic.woff2) format("woff2"),url(fonts/lato-thin-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-light.woff2) format("woff2"),url(fonts/lato-light.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-light-italic.woff2) format("woff2"),url(fonts/lato-light-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-normal.woff2) format("woff2"),url(fonts/lato-normal.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-normal-italic.woff2) format("woff2"),url(fonts/lato-normal-italic.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-medium.woff2) format("woff2"),url(fonts/lato-medium.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-medium-italic.woff2) format("woff2"),url(fonts/lato-medium-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-semibold.woff2) format("woff2"),url(fonts/lato-semibold.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-semibold-italic.woff2) format("woff2"),url(fonts/lato-semibold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-bold.woff2) format("woff2"),url(fonts/lato-bold.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-bold-italic.woff2) format("woff2"),url(fonts/lato-bold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-heavy.woff2) format("woff2"),url(fonts/lato-heavy.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-heavy-italic.woff2) format("woff2"),url(fonts/lato-heavy-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:normal;text-rendering:optimizeLegibility;src:url(fonts/lato-black.woff2) format("woff2"),url(fonts/lato-black.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:italic;text-rendering:optimizeLegibility;src:url(fonts/lato-black-italic.woff2) format("woff2"),url(fonts/lato-black-italic.woff) format("woff")}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}.hljs{display:block;overflow-x:auto;padding:.5em;color:#383a42;background:#fafafa}.hljs-comment,.hljs-quote{color:#a0a1a7;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#a626a4}.hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst{color:#e45649}.hljs-literal{color:#0184bb}.hljs-addition,.hljs-attribute,.hljs-meta-string,.hljs-regexp,.hljs-string{color:#50a14f}.hljs-built_in,.hljs-class .hljs-title{color:#c18401}.hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#986801}.hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#4078f2}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}.hljs-link{text-decoration:underline}#article{font-size:20px;margin:0 auto;max-width:45em}#article article{color:#424242;font-size:18px;line-height:1.7em;overflow-wrap:break-word}#article article h1,#article article h2,#article article h3,#article article h4,#article article h5,#article article h6{color:#212121}#article article h1 strong,#article article h2 strong,#article article h3 strong,#article article h4 strong,#article article h5 strong,#article article h6 strong{font-weight:500}#article article h6{font-size:1.2rem}#article article h5{font-size:1.6rem}#article article h4{font-size:1.9rem}#article article h3{font-size:2.2rem}#article article h2{font-size:2.5rem}#article article h1{font-size:2.7rem}#article article a{border-bottom:1px dotted #03a9f4;text-decoration:none}#article article a:hover{border-bottom-style:solid}#article article ul{padding-left:30px}#article article ul,#article article ul li{list-style-type:disc}#article article blockquote{font-style:italic}#article article strong{font-weight:700}#article figure,#article img{max-width:100%;height:auto}#article pre{box-sizing:border-box;margin:0 0 1.75em;border:1px solid #e3f2fd;width:100%;padding:10px;font-family:monospace;font-size:.8em;white-space:pre;overflow:auto;background:#f5f5f5;border-radius:3px}#article>header>h1{font-size:2em;margin:2.1rem 0 .68rem}#article aside .tools{display:flex;flex-flow:row wrap}#article aside .tools .stats{font-size:.8em;margin:8px 5px 5px}#article aside .tools .stats li{display:inline-flex;vertical-align:middle;margin:3px 5px}#article aside .tools .stats li i.material-icons{color:#3e3e3e;margin-right:3px}#article aside .tools .stats a{color:#000;text-decoration:none}#article aside .tools .tags{float:right;margin:5px 15px 10px}#article aside .chip{background-color:rgba(0,151,167,.85);padding:0 15px 0 10px;margin:auto 2px;border-radius:6px}#article aside .chip a,#article aside .chip i{color:#fff}#article aside .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.reader-mode{width:70px!important;transition:width .2s ease}.reader-mode .collapsible-body{height:0;overflow:hidden}.reader-mode span{opacity:0;transition:opacity .2s ease}.reader-mode:hover{width:260px!important}.reader-mode:hover .collapsible-body{height:auto}.reader-mode:hover .collapsible-body li a i.material-icons{margin:auto 5px auto -8px}.reader-mode:hover span{opacity:1}.progress{position:fixed;top:0;width:100%;height:3px;margin:0;z-index:9999}main #content{padding:0 .5rem}main ul.row{margin:.4rem 0 0;padding:0 .75rem}.data .card .card-body{height:19em;overflow:hidden}.card .card-content .card-title,.card .card-reveal .card-title{line-height:22.8px;max-height:80px;font-size:19px;font-family:roberto,Helvetica Neue,Helvetica,Arial,sans-serif}.card .card-stacked .card-content .card-title{display:inline-block}.card .card-content .activator,.card .card-reveal .activator{cursor:pointer;font-family:Material Icons}.card .card-content i.right,.card .card-reveal i.right{margin-left:0}.card .card-content .original{line-height:24px;font-size:15px}.card .card-entry-labels{position:absolute;top:10px;z-index:90;max-width:50%}.card .card-entry-labels-hidden{margin:2.5px auto}.card .card-entry-labels-hidden li{display:inline-block;background-color:rgba(0,151,167,.85);margin:0 5px;padding:5px 12px;border-radius:3px;color:#fff;max-height:2em;max-width:calc(100% - 15px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card .card-content .estimatedTime{margin-bottom:10px}.card .card-action{padding:10px 5px 10px 15px}.card .card-action ul.links{margin:0;font-size:24px;line-height:24px}.card .card-action a{color:#fff;margin:0}.card .card-action a:hover{color:#fff}.card .card-action ul.tools li a.tool{margin-right:5px!important}.card .card-action .reading-time{display:inline-flex;vertical-align:middle}.card .card-action .reading-time .card-created-at,.card .card-action .reading-time .card-reading-time{display:inline-flex}.card .card-action .reading-time span{margin-right:5px}.card .card-image{height:10em}.card .card-fullimage{height:13.5em}.card.sw{max-width:370px;margin-left:auto;margin-right:auto}a.original:not(.waves-effect){text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.card-stacked .preview,.card .card-fullimage .preview,.card .card-image .preview{height:100%;background:no-repeat 50%/cover;background-color:#efefef;display:block}.card-stacked .preview--default,.card .card-fullimage .preview--default,.card .card-image .preview--default{background-size:contain}.card-entry-labels li,.card-tag-labels li{margin:10px 10px 10px auto;padding:5px 12px 5px 16px!important;background-color:rgba(0,151,167,.85);border-radius:3px;color:#fff;cursor:default}.card-entry-labels li{text-overflow:ellipsis;white-space:nowrap;border-radius:0 3px 3px 0;overflow:hidden}.card-tag-labels li{display:flex;justify-content:space-between}#list .chip a,.card-entry-labels-hidden a,.card-entry-labels a,.card-entry-tags a,.card-tag-labels a{text-decoration:none;font-weight:400;color:#fff}.card-tag-labels a{height:100%;align-items:center}.card-tag-form,.card-tag-link{display:flex;min-width:100px;flex-grow:1}.card-tag-form input{margin-bottom:0;height:2rem}.card-tag-rss{display:flex}.card-tag-labels{display:flex;flex-wrap:wrap}.card-tag-labels li{margin:10px;flex-basis:19%;flex-grow:1;align-items:center}.card-stacked{display:flex;flex-flow:row wrap}.card-stacked:hover ul.tools-list{display:inline;text-align:right}.card-stacked .card-preview{max-width:100px;max-height:50px;margin-right:10px;flex:1}.card-stacked div.metadata{overflow:hidden;height:1.5em;display:flex}.card-stacked div.metadata ul.tags{margin-left:4px}.card-stacked div.metadata .chip{background-color:rgba(0,151,167,.85);padding:0 7px;margin:auto 1px;border-radius:6px;line-height:22px;height:22px}.card-stacked div.metadata .chip a,.card-stacked div.metadata .chip i{color:#fff}.card-stacked div.metadata .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.card-stacked div.metadata .reading-time{display:inline-flex;vertical-align:middle;padding:0 5px;flex-wrap:wrap;margin-left:auto}.card-stacked div.metadata .reading-time .card-created-at,.card-stacked div.metadata .reading-time .card-reading-time{display:inline-flex}.card-stacked div.metadata .reading-time span{margin-right:5px}.card-stacked div.metadata .reading-time i.material-icons{font-size:20px}.card-stacked div.card-content{flex:4}.card-stacked ul.tools-list{flex:1;display:none;flex-basis:5em;align-self:flex-end;float:right;max-width:6em}.card-stacked .tags{display:inline-block}#content .collection .collection-item{min-height:65px;height:auto}.quickstart .card .card-action a,.quickstart .card .card-action a:hover{color:#fff!important}.settings .div_tabs{padding-bottom:15px}.collection{margin:15px 15px 0}.collection .collection-item{padding:7px;height:65px}.results{display:flex;padding:1rem 1rem 0;flex-wrap:wrap;justify-content:space-between}.results .nb-results{display:inline-flex}.results a{color:#444}.pagination ul{display:flex;margin:0;flex-wrap:wrap;justify-content:space-around}.pagination ul .next.disabled,.pagination ul .prev.disabled{display:none}.pagination li{padding:0}.pagination a,.pagination span{padding:0 10px;height:30px;display:block;line-height:30px}.pagination .disabled{margin-right:10px;margin-left:10px}.pagination li.active span{padding:0 10px;height:30px;display:block;color:#fff}.footer-text{margin:.7rem .5rem}.hidden,.picker__date-display{display:none}footer.page-footer{margin-top:10px;padding-top:0}footer .row{margin-bottom:10px}#filters button{padding:0;width:100%}#filters div.with-checkbox{height:3rem;margin-top:0}body{display:flex;min-height:100vh;flex-direction:column;background:#fafafa}body.login main{padding:0;min-height:100vh}.border-bottom{border-bottom:1px solid #ddd}#content,.valign-wrapper,main{height:100%}.typo-logo{max-width:150px}#main{flex:1 0 auto}#main .logo a{height:100pt}#main .logo img{height:100pt;width:100pt}#main .logo:hover{background:transparent}nav{height:auto;line-height:normal}nav input{color:#aaa}nav ul a:hover{background-color:initial}.nav-panel-item .button-collapse{margin-left:0;margin-right:.5rem;padding:0 .5rem;height:auto;line-height:1;background-color:transparent;border:none}.nav-panel-item{display:flex;padding:.6rem .4rem .6rem .75rem;flex-wrap:wrap;justify-content:space-between;align-items:center}.nav-panel-item .material-icons{height:46px;line-height:46px}.nav-input{display:none}.nav-panel-buttom{display:flex;flex-grow:1;justify-content:flex-end}.nav-panel-item .add,.nav-panel-item .search,.nav-panels .close{color:#444!important}.nav-panels{transition:background .2s ease}.nav-panels .action{margin:0;font-size:2.1rem}.nav-panels .input-field input{display:block;line-height:inherit;height:3rem}.nav-panels .input-field input:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.nav-panel-top{display:flex;align-items:center}.input-field.nav-panel-item label{left:1rem}.input-field.nav-panel-item .close{color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}.input-field.nav-panel-item{display:flex;flex:1;flex-wrap:nowrap;align-items:center}.input-field.nav-panel-add.disabled,.input-field.nav-panel-add.disabled input{background-color:#f5f5f5}.nav-form-button{padding:0;background-color:transparent;border:none}.nav-form-button:focus{background-color:inherit}.nav-form-button,.nav-panel-item .close{margin:0 1%}#button_export,#button_filters{display:none}@media (min-width:993px){.button-collapse{display:none}}.side-nav{width:240px}.side-nav li{padding:0}.side-nav li.logo>a:hover{background:initial}.side-nav a{margin:0}.side-nav.fixed a{font-size:13px;line-height:44px;height:44px}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{height:45px;line-height:44px;padding:0 20px}.side-nav>li.logo{line-height:0;text-align:center}.bold>a{font-weight:700}span.numberItems{float:right}div.settings div.file-field div,div.settings div.file-field ul{margin-top:40px}div.settings div.file-field div{margin-top:inherit}.input-field label.active{font-size:1rem}nav .input-field input{margin:0;padding-left:.5rem}.tabs{display:flex}.tab{flex:1}@font-face{font-family:icomoon;src:url(fonts/IcoMoon-Free.ttf);font-weight:400;font-style:normal}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;width:1em;height:1em;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.material-icons .md-18{font-size:18px}.material-icons .md-24{font-size:24px}.material-icons .md-36{font-size:36px}.material-icons .md-48{font-size:48px}.material-icons .md-dark{color:rgba(0,0,0,.54)}.material-icons .md-dark .md-inactive{color:rgba(0,0,0,.26)}.material-icons .md-light{color:#fff}.material-icons .md-light .md-inactive{color:hsla(0,0%,100%,.3)}[class*=" icon-"]:before,[class^=icon-]:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;background-size:24px;letter-spacing:0;font-feature-settings:"liga"}.icon-eye:before{content:"\E9CE"}.icon-no-eye:before{content:"\E9D1"}.icon-calendar:before{content:"\E953"}.icon-mail:before{content:"\EA86"}.icon-time:before{content:"\E952"}a.icon-image{background-repeat:no-repeat;padding-right:.4em!important;padding-left:0!important;margin-left:25px}a.icon-image:before{content:"";display:block;width:24px;height:24px;float:left;margin:7px 1.5px 0 0}a.icon-image.carrot:before{background:url(themes/_global/img/icons/carrot-icon--black.png) no-repeat 50%/90%}a.icon-image.diaspora:before{background:url(themes/_global/img/icons/diaspora-icon--black.png) no-repeat 50%/80%}a.icon-image.unmark:before{background:url(themes/_global/img/icons/unmark-icon--black.png) no-repeat 50%/80%}a.icon-image.shaarli:before{background:url(themes/_global/img/icons/shaarli.png) no-repeat 50%/80%}a.icon-image.scuttle:before{background:url(themes/_global/img/icons/scuttle.png) no-repeat 50%/80%}.icon-google-plus2:before{content:"\EA89"}.icon-facebook2:before{content:"\EA8D"}.icon-twitter:before{content:"\EA96"}.icon-apple:before{content:"\EABF"}.icon-android:before{content:"\EAC1"}.icon-chrome:before{content:"\EAE5"}.icon-firefox:before{content:"\EAE6"}.icon-link:before{content:"\E9CB"}footer [class*=" icon-"],footer [class^=icon-]{font-size:2em;transition:text-shadow .2s ease;padding-right:10px}footer [class*=" icon-"]:hover,footer [class^=icon-]:hover{text-shadow:0 0 10px rgba(0,0,0,.3)}@media print{body{font-family:Serif;background-color:#fff}@page{margin:1cm}img{max-width:100%!important}#article .mbm a,#article>aside,#article_toolbar,#links,#slide-out,#sort,.entry+.results,.hide-on-large-only,.messages,.progress,.top_link,body>footer,body>header,div.tools,header div{display:none!important}main{padding-left:0!important}#article{margin:inherit!important}article{border:none!important}.vieworiginal a:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.pagination span.current{border-style:dashed}#main{margin:0;padding:0}#article,#main{width:100%}}@media only screen and (min-width:992px){body:not(.entry):not(.login) main,footer,nav{padding-left:240px}.pagination{margin-left:auto}.card-tag-labels li{max-width:50%}}@media screen and (min-width:993px){body.entry main #content{padding-left:70px}}@media only screen and (max-width:992px){footer,header,main,nav{padding-left:0}table{display:block;overflow:auto}iframe{max-width:100%;height:auto}.nav-panels .action{padding-right:.75rem}.nav-panel-buttom{justify-content:space-between}#article{max-width:35em;margin-left:auto;margin-right:auto;font-size:18px}#article>header>h1{font-size:1.33em}.reader-mode{width:240px!important}.reader-mode span{opacity:1}.tabs{display:inline-block;height:auto}.tab{min-width:100%}.indicator{display:none}.pagination li{margin-bottom:.5rem}.pagination li.next,.pagination li.prev{width:auto}.drag-target+.drag-target{height:50%}.drag-target+.drag-target+.drag-target{top:50%}}@media only screen and (min-width:1200px) and (max-width:1650px){.row .col.l3{width:33.33333%;margin-left:0}}@media only screen and (min-width:993px) and (max-width:1200px){.row .col.l1{width:25%;margin-left:0}.row .col.l2{width:33.33333%;margin-left:0}.row .col.l3{width:41.66667%;margin-left:0}.row .col.l4{width:50%;margin-left:0}.row .col.l5{width:58.33333%;margin-left:0}.row .col.l6{width:66.66667%;margin-left:0}.row .col.l7{width:75%;margin-left:0}.row .col.l8{width:83.33333%;margin-left:0}.row .col.l9{width:91.66667%;margin-left:0}.row .col.l10{width:100%;margin-left:0}}@media only screen and (max-width:350px){.nb-results{display:none}.row .col,main ul.row{padding:0}.card-stacked div.metadata .reading-time{display:none}}@media screen and (max-width:310px),screen and (min-width:601px) and (max-width:660px),screen and (min-width:993px) and (max-width:1050px),screen and (min-width:1201px) and (max-width:1250px){.card .card-action .reading-time .card-created-at{display:none}}
2/*# sourceMappingURL=material.css.map*/ \ No newline at end of file 2/*# sourceMappingURL=material.css.map*/ \ No newline at end of file