From 6cd81e5656e3a5c2f82d88d35d63f147eea2bede Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sun, 20 Jan 2019 22:44:17 -0500 Subject: [PATCH 01/74] Temporary list of macOS and iOS clients --- docs/FeedClients.html | 213 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 docs/FeedClients.html diff --git a/docs/FeedClients.html b/docs/FeedClients.html new file mode 100644 index 0000000..222450a --- /dev/null +++ b/docs/FeedClients.html @@ -0,0 +1,213 @@ + + + + Feed Reader Apps + + + + + + + + + +
+

Feed Reader Apps

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameOSProtocolNotes
FeverNextcloud NewsTiny Tiny RSS
ReedermacOS & iOS

Supports other services which use derivatives of the Google Reader API, but the settings do not allow input of a server.

Fiery FeedsiOS +

Supports other services which use derivatives of the Google Reader API, but the settings do not allow input of a server.

+

Currently keeps showing items in the unread badge which have already been read.

+
CloudNewsiOS +

Has a lot of difficulty showing feeds in correct order. Maybe when atom feeds are updated they show up again?

+
+ + From 4191f77094fb23553154e9b75d2918ef94356ecd Mon Sep 17 00:00:00 2001 From: "J. King" Date: Mon, 21 Jan 2019 12:15:25 -0500 Subject: [PATCH 02/74] Add daux as a dev dependency --- composer.lock | 2 +- vendor-bin/csfixer/composer.lock | 111 +-- vendor-bin/daux/composer.json | 5 + vendor-bin/daux/composer.lock | 1208 ++++++++++++++++++++++++++++++ vendor-bin/phpunit/composer.lock | 73 +- vendor-bin/robo/composer.lock | 235 ++++-- 6 files changed, 1498 insertions(+), 136 deletions(-) create mode 100644 vendor-bin/daux/composer.json create mode 100644 vendor-bin/daux/composer.lock diff --git a/composer.lock b/composer.lock index 30c0c79..baf62e3 100644 --- a/composer.lock +++ b/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "7d381fa958169b7079c1d3c5b911f3bd", diff --git a/vendor-bin/csfixer/composer.lock b/vendor-bin/csfixer/composer.lock index 9a89268..fe1d67e 100644 --- a/vendor-bin/csfixer/composer.lock +++ b/vendor-bin/csfixer/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "3fb53f1e3b4dd21c4d1e88c3ffd570ca", @@ -70,16 +70,16 @@ }, { "name": "composer/xdebug-handler", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c" + "reference": "dc523135366eb68f22268d069ea7749486458562" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/b8e9745fb9b06ea6664d8872c4505fb16df4611c", - "reference": "b8e9745fb9b06ea6664d8872c4505fb16df4611c", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/dc523135366eb68f22268d069ea7749486458562", + "reference": "dc523135366eb68f22268d069ea7749486458562", "shasum": "" }, "require": { @@ -110,7 +110,7 @@ "Xdebug", "performance" ], - "time": "2018-08-31T19:07:57+00:00" + "time": "2018-11-29T10:59:02+00:00" }, { "name": "doctrine/annotations", @@ -236,16 +236,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v2.13.1", + "version": "v2.14.0", "source": { "type": "git", "url": "https://github.com/FriendsOfPHP/PHP-CS-Fixer.git", - "reference": "54814c62d5beef3ba55297b9b3186ed8b8a1b161" + "reference": "b788ea0af899cedc8114dca7db119c93b6685da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/54814c62d5beef3ba55297b9b3186ed8b8a1b161", - "reference": "54814c62d5beef3ba55297b9b3186ed8b8a1b161", + "url": "https://api.github.com/repos/FriendsOfPHP/PHP-CS-Fixer/zipball/b788ea0af899cedc8114dca7db119c93b6685da2", + "reference": "b788ea0af899cedc8114dca7db119c93b6685da2", "shasum": "" }, "require": { @@ -254,7 +254,7 @@ "doctrine/annotations": "^1.2", "ext-json": "*", "ext-tokenizer": "*", - "php": "^5.6 || >=7.0 <7.3", + "php": "^5.6 || ^7.0", "php-cs-fixer/diff": "^1.3", "symfony/console": "^3.4.17 || ^4.1.6", "symfony/event-dispatcher": "^3.0 || ^4.0", @@ -272,7 +272,7 @@ "require-dev": { "johnkary/phpunit-speedtrap": "^1.1 || ^2.0 || ^3.0", "justinrainbow/json-schema": "^5.0", - "keradus/cli-executor": "^1.1", + "keradus/cli-executor": "^1.2", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.1", "php-cs-fixer/accessible-object": "^1.0", @@ -292,6 +292,11 @@ "php-cs-fixer" ], "type": "application", + "extra": { + "branch-alias": { + "dev-master": "2.14-dev" + } + }, "autoload": { "psr-4": { "PhpCsFixer\\": "src/" @@ -323,7 +328,7 @@ } ], "description": "A tool to automatically fix PHP code style", - "time": "2018-10-21T00:32:10+00:00" + "time": "2019-01-04T18:29:47+00:00" }, { "name": "paragonie/random_compat", @@ -470,16 +475,16 @@ }, { "name": "symfony/console", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1d228fb4602047d7b26a0554e0d3efd567da5803" + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1d228fb4602047d7b26a0554e0d3efd567da5803", - "reference": "1d228fb4602047d7b26a0554e0d3efd567da5803", + "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", "shasum": "" }, "require": { @@ -535,20 +540,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-10-30T16:50:50+00:00" + "time": "2019-01-04T04:42:43+00:00" }, { "name": "symfony/debug", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "fe9793af008b651c5441bdeab21ede8172dab097" + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/fe9793af008b651c5441bdeab21ede8172dab097", - "reference": "fe9793af008b651c5441bdeab21ede8172dab097", + "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", "shasum": "" }, "require": { @@ -591,20 +596,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-10-31T09:06:03+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14" + "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14", - "reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", + "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", "shasum": "" }, "require": { @@ -654,20 +659,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-10-30T16:50:50+00:00" + "time": "2019-01-01T18:08:36+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d69930fc337d767607267d57c20a7403d0a822a4" + "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d69930fc337d767607267d57c20a7403d0a822a4", - "reference": "d69930fc337d767607267d57c20a7403d0a822a4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", + "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", "shasum": "" }, "require": { @@ -704,20 +709,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-10-02T12:28:39+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/finder", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d" + "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d", - "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", + "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", "shasum": "" }, "require": { @@ -753,20 +758,20 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:46:40+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/options-resolver", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "1cf7d8e704a9cc4164c92e430f2dfa3e6983661d" + "reference": "8a10e36ffd04c0c551051594952304d34ecece71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/1cf7d8e704a9cc4164c92e430f2dfa3e6983661d", - "reference": "1cf7d8e704a9cc4164c92e430f2dfa3e6983661d", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/8a10e36ffd04c0c551051594952304d34ecece71", + "reference": "8a10e36ffd04c0c551051594952304d34ecece71", "shasum": "" }, "require": { @@ -807,7 +812,7 @@ "configuration", "options" ], - "time": "2018-09-17T17:29:18+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1042,16 +1047,16 @@ }, { "name": "symfony/process", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "35c2914a9f50519bd207164c353ae4d59182c2cb" + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/35c2914a9f50519bd207164c353ae4d59182c2cb", - "reference": "35c2914a9f50519bd207164c353ae4d59182c2cb", + "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", "shasum": "" }, "require": { @@ -1087,20 +1092,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-10-14T17:33:21+00:00" + "time": "2019-01-02T21:24:08+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4" + "reference": "af55d31cb58c5452d2c160655fa1968b872a8084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/05e52a39de52ba690aebaed462b2bc8a9649f0a4", - "reference": "05e52a39de52ba690aebaed462b2bc8a9649f0a4", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/af55d31cb58c5452d2c160655fa1968b872a8084", + "reference": "af55d31cb58c5452d2c160655fa1968b872a8084", "shasum": "" }, "require": { @@ -1136,7 +1141,7 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2018-10-02T12:28:39+00:00" + "time": "2019-01-01T13:45:19+00:00" } ], "packages-dev": [], diff --git a/vendor-bin/daux/composer.json b/vendor-bin/daux/composer.json new file mode 100644 index 0000000..9ef0036 --- /dev/null +++ b/vendor-bin/daux/composer.json @@ -0,0 +1,5 @@ +{ + "require": { + "daux/daux.io": "*" + } +} diff --git a/vendor-bin/daux/composer.lock b/vendor-bin/daux/composer.lock new file mode 100644 index 0000000..d3905db --- /dev/null +++ b/vendor-bin/daux/composer.lock @@ -0,0 +1,1208 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "18f1867fdb8b951d62546b63f535d837", + "packages": [ + { + "name": "daux/daux.io", + "version": "0.7.2", + "source": { + "type": "git", + "url": "https://github.com/dauxio/daux.io.git", + "reference": "2caa193a1690c95100936ae60b58b059ed19b852" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dauxio/daux.io/zipball/2caa193a1690c95100936ae60b58b059ed19b852", + "reference": "2caa193a1690c95100936ae60b58b059ed19b852", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~6.0", + "league/commonmark": "^0.15", + "league/plates": "~3.1", + "myclabs/deep-copy": "^1.5", + "php": ">=5.6", + "symfony/console": "^3.3", + "symfony/http-foundation": "^3.3", + "symfony/process": "^3.3", + "webuni/commonmark-table-extension": "0.6.*", + "webuni/front-matter": "^1.0.0" + }, + "replace": { + "justinwalsh/daux.io": "*" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "~5.7" + }, + "bin": [ + "bin/daux" + ], + "type": "project", + "autoload": { + "psr-4": { + "Todaymade\\Daux\\": "libs/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Walsh", + "homepage": "http://todaymade.com/" + }, + { + "name": "Stéphane Goetz", + "homepage": "http://onigoetz.ch/" + } + ], + "description": "Documentation generator that uses a simple folder structure and Markdown files to create custom documentation on the fly", + "homepage": "https://dauxio.github.io/", + "keywords": [ + "docs", + "documentation", + "markdown", + "md" + ], + "time": "2018-02-27T22:43:36+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.3", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.3-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ], + "time": "2018-04-22T15:46:56+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2016-12-20T10:07:11+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "9f83dded91781a01c63574e387eaa769be769115" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", + "reference": "9f83dded91781a01c63574e387eaa769be769115", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2018-12-04T20:46:45+00:00" + }, + { + "name": "league/commonmark", + "version": "0.15.7", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/36d82f166e441dfa28643f8d01dd8bdd3a579adf", + "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=5.4.8" + }, + "replace": { + "colinodell/commonmark-php": "*" + }, + "require-dev": { + "cebe/markdown": "~1.0", + "erusev/parsedown": "~1.0", + "jgm/commonmark": "0.28", + "michelf/php-markdown": "~1.4", + "mikehaertl/php-shellcommand": "~1.2.0", + "phpunit/phpunit": "~4.3|~5.0", + "scrutinizer/ocular": "~1.1", + "symfony/finder": "~2.3|~3.0" + }, + "suggest": { + "league/commonmark-extras": "Library of useful extensions including smart punctuation" + }, + "bin": [ + "bin/commonmark" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.16-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Markdown parser for PHP based on the CommonMark spec", + "homepage": "https://github.com/thephpleague/commonmark", + "keywords": [ + "commonmark", + "markdown", + "parser" + ], + "time": "2017-10-26T15:41:07+00:00" + }, + { + "name": "league/plates", + "version": "3.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/plates.git", + "reference": "b1684b6f127714497a0ef927ce42c0b44b45a8af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/plates/zipball/b1684b6f127714497a0ef927ce42c0b44b45a8af", + "reference": "b1684b6f127714497a0ef927ce42c0b44b45a8af", + "shasum": "" + }, + "require": { + "php": "^5.3 | ^7.0" + }, + "require-dev": { + "mikey179/vfsstream": "^1.4", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "~1.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Plates\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "role": "Developer" + } + ], + "description": "Plates, the native PHP template system that's fast, easy to use and easy to extend.", + "homepage": "http://platesphp.com", + "keywords": [ + "league", + "package", + "templates", + "templating", + "views" + ], + "time": "2016-12-28T00:14:17+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2017-10-19T19:58:43+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "time": "2018-07-02T15:55:56+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2018-11-20T15:27:04+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "2.0.5", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "require-dev": { + "phpunit/phpunit": "~3.7.0", + "satooshi/php-coveralls": ">=1.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2016-02-11T07:05:27+00:00" + }, + { + "name": "symfony/console", + "version": "v3.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log-implementation": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2019-01-04T04:42:43+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2019-01-01T13:45:19+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v3.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "2b97319e68816d2120eee7f13f4b76da12e04d03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2b97319e68816d2120eee7f13f4b76da12e04d03", + "reference": "2b97319e68816d2120eee7f13f4b76da12e04d03", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php70": "~1.6" + }, + "require-dev": { + "symfony/expression-language": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony HttpFoundation Component", + "homepage": "https://symfony.com", + "time": "2019-01-05T08:05:37+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "backendtea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2018-09-21T13:07:52+00:00" + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224", + "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2018-09-21T06:26:08+00:00" + }, + { + "name": "symfony/process", + "version": "v3.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2019-01-02T21:24:08+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.21", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/console": "<3.4" + }, + "require-dev": { + "symfony/console": "~3.4|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2019-01-01T13:45:19+00:00" + }, + { + "name": "webuni/commonmark-table-extension", + "version": "0.6.1", + "source": { + "type": "git", + "url": "https://github.com/webuni/commonmark-table-extension.git", + "reference": "ebbd69b63436283ec726658835b213ec634485e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/ebbd69b63436283ec726658835b213ec634485e8", + "reference": "ebbd69b63436283ec726658835b213ec634485e8", + "shasum": "" + }, + "require": { + "league/commonmark": "^0.14|^0.15", + "php": "^5.5|^7.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^1.9", + "phpunit/phpunit": "^4.3|^5.0", + "sllh/php-cs-fixer-styleci-bridge": "^2.0", + "symfony/var-dumper": "^2.7|^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.7-dev" + } + }, + "autoload": { + "psr-4": { + "Webuni\\CommonMark\\TableExtension\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Hasoň", + "email": "martin.hason@gmail.com", + "role": "Lead Developer" + }, + { + "name": "Webuni s.r.o.", + "homepage": "https://www.webuni.cz" + } + ], + "description": "The table extension for CommonMark PHP implementation", + "homepage": "https://github.com/webuni/commonmark-table-extension", + "keywords": [ + "commonmark", + "markdown", + "table" + ], + "time": "2017-01-11T14:52:17+00:00" + }, + { + "name": "webuni/front-matter", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/webuni/front-matter.git", + "reference": "c7d1c51f9864ff015365ce515374e63bcd3b558e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webuni/front-matter/zipball/c7d1c51f9864ff015365ce515374e63bcd3b558e", + "reference": "c7d1c51f9864ff015365ce515374e63bcd3b558e", + "shasum": "" + }, + "require": { + "php": "^5.6|^7.0", + "symfony/yaml": "^2.3|^3.0|^4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.9", + "mthaml/mthaml": "^1.3", + "nette/neon": "^2.2", + "phpunit/phpunit": "^5.7|^6.0|^7.0", + "symfony/var-dumper": "^3.0|^4.0", + "twig/twig": "^1.27|^2.0", + "vimeo/psalm": "^1.0", + "yosymfony/toml": "~0.3|^1.0" + }, + "suggest": { + "nette/neon": "If you want to use NEON as front matter", + "yosymfony/toml": "If you want to use TOML as front matter" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Webuni\\FrontMatter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Martin Hasoň", + "email": "martin.hason@gmail.com" + }, + { + "name": "Webuni s.r.o.", + "homepage": "https://www.webuni.cz" + } + ], + "description": "Front matter parser and dumper for PHP", + "homepage": "https://github.com/webuni/front-matter", + "keywords": [ + "front-matter", + "json", + "neon", + "toml", + "yaml" + ], + "time": "2018-03-20T13:36:33+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock index 53d62ca..40ac728 100644 --- a/vendor-bin/phpunit/composer.lock +++ b/vendor-bin/phpunit/composer.lock @@ -1,7 +1,7 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "4252b3d7817c9a4a5f60ac81f28202e2", @@ -1527,6 +1527,64 @@ "homepage": "https://github.com/sebastianbergmann/version", "time": "2016-10-03T07:35:21+00:00" }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.10.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "backendtea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, { "name": "theseer/tokenizer", "version": "1.1.0", @@ -1569,20 +1627,21 @@ }, { "name": "webmozart/assert", - "version": "1.3.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a" + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", - "reference": "0df1908962e7a3071564e857d86874dad1ef204a", + "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", + "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^5.3.3 || ^7.0", + "symfony/polyfill-ctype": "^1.8" }, "require-dev": { "phpunit/phpunit": "^4.6", @@ -1615,7 +1674,7 @@ "check", "validate" ], - "time": "2018-01-29T19:49:41+00:00" + "time": "2018-12-25T11:19:39+00:00" }, { "name": "webmozart/glob", diff --git a/vendor-bin/robo/composer.lock b/vendor-bin/robo/composer.lock index 09a7ac7..624be20 100644 --- a/vendor-bin/robo/composer.lock +++ b/vendor-bin/robo/composer.lock @@ -1,23 +1,23 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], "content-hash": "87a37068875d67919f797af9dc08e108", "packages": [ { "name": "consolidation/annotated-command", - "version": "2.10.0", + "version": "2.11.0", "source": { "type": "git", "url": "https://github.com/consolidation/annotated-command.git", - "reference": "8e7d1a05230dc1159c751809e98b74f2b7f71873" + "reference": "edea407f57104ed518cc3c3b47d5b84403ee267a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/8e7d1a05230dc1159c751809e98b74f2b7f71873", - "reference": "8e7d1a05230dc1159c751809e98b74f2b7f71873", + "url": "https://api.github.com/repos/consolidation/annotated-command/zipball/edea407f57104ed518cc3c3b47d5b84403ee267a", + "reference": "edea407f57104ed518cc3c3b47d5b84403ee267a", "shasum": "" }, "require": { @@ -29,13 +29,57 @@ "symfony/finder": "^2.5|^3|^4" }, "require-dev": { - "g1a/composer-test-scenarios": "^2", + "g1a/composer-test-scenarios": "^3", + "php-coveralls/php-coveralls": "^1", "phpunit/phpunit": "^6", - "satooshi/php-coveralls": "^2", "squizlabs/php_codesniffer": "^2.7" }, "type": "library", "extra": { + "scenarios": { + "symfony4": { + "require": { + "symfony/console": "^4.0" + }, + "config": { + "platform": { + "php": "7.1.3" + } + } + }, + "symfony2": { + "require": { + "symfony/console": "^2.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.4.8" + } + }, + "scenario-options": { + "create-lockfile": "false" + } + }, + "phpunit4": { + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.4.8" + } + } + } + }, "branch-alias": { "dev-master": "2.x-dev" } @@ -56,7 +100,7 @@ } ], "description": "Initialize Symfony Console commands from annotated command class methods.", - "time": "2018-11-15T01:46:18+00:00" + "time": "2018-12-29T04:43:17+00:00" }, { "name": "consolidation/config", @@ -114,31 +158,72 @@ }, { "name": "consolidation/log", - "version": "1.0.6", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/consolidation/log.git", - "reference": "dfd8189a771fe047bf3cd669111b2de5f1c79395" + "reference": "b2e887325ee90abc96b0a8b7b474cd9e7c896e3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/log/zipball/dfd8189a771fe047bf3cd669111b2de5f1c79395", - "reference": "dfd8189a771fe047bf3cd669111b2de5f1c79395", + "url": "https://api.github.com/repos/consolidation/log/zipball/b2e887325ee90abc96b0a8b7b474cd9e7c896e3a", + "reference": "b2e887325ee90abc96b0a8b7b474cd9e7c896e3a", "shasum": "" }, "require": { - "php": ">=5.5.0", - "psr/log": "~1.0", + "php": ">=5.4.5", + "psr/log": "^1.0", "symfony/console": "^2.8|^3|^4" }, "require-dev": { - "g1a/composer-test-scenarios": "^1", - "phpunit/phpunit": "4.*", - "satooshi/php-coveralls": "^2", - "squizlabs/php_codesniffer": "2.*" + "g1a/composer-test-scenarios": "^3", + "php-coveralls/php-coveralls": "^1", + "phpunit/phpunit": "^6", + "squizlabs/php_codesniffer": "^2" }, "type": "library", "extra": { + "scenarios": { + "symfony4": { + "require": { + "symfony/console": "^4.0" + }, + "config": { + "platform": { + "php": "7.1.3" + } + } + }, + "symfony2": { + "require": { + "symfony/console": "^2.8" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.4.8" + } + } + }, + "phpunit4": { + "require-dev": { + "phpunit/phpunit": "^4.8.36" + }, + "remove": [ + "php-coveralls/php-coveralls" + ], + "config": { + "platform": { + "php": "5.4.8" + } + } + } + }, "branch-alias": { "dev-master": "1.x-dev" } @@ -159,7 +244,7 @@ } ], "description": "Improved Psr-3 / Psr\\Log logger based on Symfony Console components.", - "time": "2018-05-25T18:14:39+00:00" + "time": "2019-01-01T17:30:51+00:00" }, { "name": "consolidation/output-formatters", @@ -219,20 +304,20 @@ }, { "name": "consolidation/robo", - "version": "1.3.2", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/consolidation/Robo.git", - "reference": "a9bd9ecf00751aa92754903c0d17612c4e840ce8" + "reference": "d0b6f516ec940add7abed4f1432d30cca5f8ae0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/consolidation/Robo/zipball/a9bd9ecf00751aa92754903c0d17612c4e840ce8", - "reference": "a9bd9ecf00751aa92754903c0d17612c4e840ce8", + "url": "https://api.github.com/repos/consolidation/Robo/zipball/d0b6f516ec940add7abed4f1432d30cca5f8ae0c", + "reference": "d0b6f516ec940add7abed4f1432d30cca5f8ae0c", "shasum": "" }, "require": { - "consolidation/annotated-command": "^2.8.2", + "consolidation/annotated-command": "^2.10.2", "consolidation/config": "^1.0.10", "consolidation/log": "~1", "consolidation/output-formatters": "^3.1.13", @@ -304,7 +389,7 @@ } }, "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -323,7 +408,7 @@ } ], "description": "Modern task runner", - "time": "2018-11-22T05:43:44+00:00" + "time": "2019-01-02T21:33:28+00:00" }, { "name": "consolidation/self-update", @@ -627,16 +712,16 @@ }, { "name": "pear/archive_tar", - "version": "1.4.3", + "version": "1.4.5", "source": { "type": "git", "url": "https://github.com/pear/Archive_Tar.git", - "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb" + "reference": "ff716ca697c5e9e8593212cb785ffd03ee11b01f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/43455c960da70e655c6bdf8ea2bc8cc1a6034afb", - "reference": "43455c960da70e655c6bdf8ea2bc8cc1a6034afb", + "url": "https://api.github.com/repos/pear/Archive_Tar/zipball/ff716ca697c5e9e8593212cb785ffd03ee11b01f", + "reference": "ff716ca697c5e9e8593212cb785ffd03ee11b01f", "shasum": "" }, "require": { @@ -647,8 +732,8 @@ "phpunit/phpunit": "*" }, "suggest": { - "ext-bz2": "bz2 compression support.", - "ext-xz": "lzma2 compression support.", + "ext-bz2": "Bz2 compression support.", + "ext-xz": "Lzma2 compression support.", "ext-zlib": "Gzip compression support." }, "type": "library", @@ -683,13 +768,13 @@ "email": "mrook@php.net" } ], - "description": "Tar file management class", + "description": "Tar file management class with compression support (gzip, bzip2, lzma2)", "homepage": "https://github.com/pear/Archive_Tar", "keywords": [ "archive", "tar" ], - "time": "2017-06-11T17:28:11+00:00" + "time": "2019-01-02T21:45:13+00:00" }, { "name": "pear/console_getopt", @@ -740,20 +825,20 @@ }, { "name": "pear/pear-core-minimal", - "version": "v1.10.6", + "version": "v1.10.7", "source": { "type": "git", "url": "https://github.com/pear/pear-core-minimal.git", - "reference": "052868b244d31f822796e7e9981f62557eb256d4" + "reference": "19a3e0fcd50492c4357372f623f55f1b144346da" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/052868b244d31f822796e7e9981f62557eb256d4", - "reference": "052868b244d31f822796e7e9981f62557eb256d4", + "url": "https://api.github.com/repos/pear/pear-core-minimal/zipball/19a3e0fcd50492c4357372f623f55f1b144346da", + "reference": "19a3e0fcd50492c4357372f623f55f1b144346da", "shasum": "" }, "require": { - "pear/console_getopt": "~1.3", + "pear/console_getopt": "~1.4", "pear/pear_exception": "~1.0" }, "replace": { @@ -780,7 +865,7 @@ } ], "description": "Minimal set of PEAR core files to be used as composer dependency", - "time": "2018-08-22T19:28:09+00:00" + "time": "2018-12-05T20:03:52+00:00" }, { "name": "pear/pear_exception", @@ -935,16 +1020,16 @@ }, { "name": "symfony/console", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "1d228fb4602047d7b26a0554e0d3efd567da5803" + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/1d228fb4602047d7b26a0554e0d3efd567da5803", - "reference": "1d228fb4602047d7b26a0554e0d3efd567da5803", + "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", + "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", "shasum": "" }, "require": { @@ -1000,20 +1085,20 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-10-30T16:50:50+00:00" + "time": "2019-01-04T04:42:43+00:00" }, { "name": "symfony/debug", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "fe9793af008b651c5441bdeab21ede8172dab097" + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/fe9793af008b651c5441bdeab21ede8172dab097", - "reference": "fe9793af008b651c5441bdeab21ede8172dab097", + "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", "shasum": "" }, "require": { @@ -1056,20 +1141,20 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-10-31T09:06:03+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14" + "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14", - "reference": "db9e829c8f34c3d35cf37fcd4cdb4293bc4a2f14", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", + "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", "shasum": "" }, "require": { @@ -1119,20 +1204,20 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2018-10-30T16:50:50+00:00" + "time": "2019-01-01T18:08:36+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d69930fc337d767607267d57c20a7403d0a822a4" + "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d69930fc337d767607267d57c20a7403d0a822a4", - "reference": "d69930fc337d767607267d57c20a7403d0a822a4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", + "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", "shasum": "" }, "require": { @@ -1169,20 +1254,20 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2018-10-02T12:28:39+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/finder", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d" + "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/54ba444dddc5bd5708a34bd095ea67c6eb54644d", - "reference": "54ba444dddc5bd5708a34bd095ea67c6eb54644d", + "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", + "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", "shasum": "" }, "require": { @@ -1218,7 +1303,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-10-03T08:46:40+00:00" + "time": "2019-01-01T13:45:19+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1339,16 +1424,16 @@ }, { "name": "symfony/process", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "35c2914a9f50519bd207164c353ae4d59182c2cb" + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/35c2914a9f50519bd207164c353ae4d59182c2cb", - "reference": "35c2914a9f50519bd207164c353ae4d59182c2cb", + "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", "shasum": "" }, "require": { @@ -1384,20 +1469,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-10-14T17:33:21+00:00" + "time": "2019-01-02T21:24:08+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.18", + "version": "v3.4.21", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f" + "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/640b6c27fed4066d64b64d5903a86043f4a4de7f", - "reference": "640b6c27fed4066d64b64d5903a86043f4a4de7f", + "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea", "shasum": "" }, "require": { @@ -1443,7 +1528,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-10-02T16:33:53+00:00" + "time": "2019-01-01T13:45:19+00:00" } ], "packages-dev": [], From 00ca726e1208cd73f77d964f93ea0715a6abfbb9 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Tue, 22 Jan 2019 17:49:14 -0500 Subject: [PATCH 03/74] Partial first draft of a manual, generated using Daux --- .gitignore | 1 + RoboFile.php | 13 +- docs/config.json | 11 + docs/en/010_About.md | 6 + docs/en/020_Installation/010_Requirements.md | 11 + .../020_Downloading_The_Arsse.md | 0 .../030_Web_Server_Configuration.md | 0 .../040_Database_Setup/000_SQLite.md | 3 + .../040_Database_Setup/010_PostgreSQL.md | 0 .../040_Database_Setup/020_MySQL.md | 0 .../040_Database_Setup/index.md | 13 + .../en/020_Installation/050_Managing_Users.md | 0 .../020_Installation/060_Using_the_Daemon.md | 0 .../010_NextCloud_News.md | 0 .../020_Tiny_Tiny_RSS.md | 0 docs/en/030_Supported_Protocols/index.md | 0 docs/en/040_Compatible_Clients.md | 0 docs/en/050_Configuring_The_Arsse.md | 368 ++++++++++++++++++ docs/en/060_Command-Line_Functionality.md | 0 .../en/070_Contributing/010_Reporting_Bugs.md | 0 docs/en/070_Contributing/020_Writing_Code.md | 0 21 files changed, 422 insertions(+), 4 deletions(-) create mode 100644 docs/config.json create mode 100644 docs/en/010_About.md create mode 100644 docs/en/020_Installation/010_Requirements.md create mode 100644 docs/en/020_Installation/020_Downloading_The_Arsse.md create mode 100644 docs/en/020_Installation/030_Web_Server_Configuration.md create mode 100644 docs/en/020_Installation/040_Database_Setup/000_SQLite.md create mode 100644 docs/en/020_Installation/040_Database_Setup/010_PostgreSQL.md create mode 100644 docs/en/020_Installation/040_Database_Setup/020_MySQL.md create mode 100644 docs/en/020_Installation/040_Database_Setup/index.md create mode 100644 docs/en/020_Installation/050_Managing_Users.md create mode 100644 docs/en/020_Installation/060_Using_the_Daemon.md create mode 100644 docs/en/030_Supported_Protocols/010_NextCloud_News.md create mode 100644 docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md create mode 100644 docs/en/030_Supported_Protocols/index.md create mode 100644 docs/en/040_Compatible_Clients.md create mode 100644 docs/en/050_Configuring_The_Arsse.md create mode 100644 docs/en/060_Command-Line_Functionality.md create mode 100644 docs/en/070_Contributing/010_Reporting_Bugs.md create mode 100644 docs/en/070_Contributing/020_Writing_Code.md diff --git a/.gitignore b/.gitignore index 31a77e3..3e5e003 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ /vendor/ /vendor-bin/*/vendor /documentation/ +/manual/ /tests/coverage/ /arsse.db* /config.php diff --git a/RoboFile.php b/RoboFile.php index e73d3e4..ef87571 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -17,7 +17,7 @@ class RoboFile extends \Robo\Tasks { * Please see the PHPUnit documentation for available options. */ public function test(array $args): Result { - return $this->runTests("php", "typical", $args); + return $this->runTests(escapeshellarg(\PHP_BINARY), "typical", $args); } /** @@ -27,7 +27,7 @@ class RoboFile extends \Robo\Tasks { * See help for the "test" task for more details. */ public function testFull(array $args): Result { - return $this->runTests("php", "full", $args); + return $this->runTests(escapeshellarg(\PHP_BINARY), "full", $args); } /** @@ -36,7 +36,7 @@ class RoboFile extends \Robo\Tasks { * See help for the "test" task for more details. */ public function testQuick(array $args): Result { - return $this->runTests("php", "quick", $args); + return $this->runTests(escapeshellarg(\PHP_BINARY), "quick", $args); } /** Produces a code coverage report @@ -161,7 +161,7 @@ class RoboFile extends \Robo\Tasks { $dir."robo.bat", ]); // generate a sample configuration file - $t->taskExec("php arsse.php conf save-defaults config.defaults.php")->dir($dir); + $t->taskExec(escapeshellarg(\PHP_BINARY)." arsse.php conf save-defaults config.defaults.php")->dir($dir); // package it all up $t->taskPack($archive)->addDir("arsse", $dir); // execute the collection @@ -170,4 +170,9 @@ class RoboFile extends \Robo\Tasks { $this->_exec("git worktree prune"); return $out; } + + public function manual(array $args): Result { + $execpath = escapeshellarg(realpath(self::BASE."vendor/bin/daux")); + return $this->taskExec($execpath)->arg("generate")->option("-d", self::BASE."manual")->args($args)->run(); + } } diff --git a/docs/config.json b/docs/config.json new file mode 100644 index 0000000..84d2974 --- /dev/null +++ b/docs/config.json @@ -0,0 +1,11 @@ +{ + "title": "The Arsse", + "tagline": "The clean & modern RSS server that doesn't give you any crap.", + "languages": { + "en": "English" + }, + "html": { + "float": false, + "toggle_code": false + } +} diff --git a/docs/en/010_About.md b/docs/en/010_About.md new file mode 100644 index 0000000..67edc4b --- /dev/null +++ b/docs/en/010_About.md @@ -0,0 +1,6 @@ +The Arsse is a news aggregator server which implements multiple synchronization protocols, including [version 1.2](https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md) of [NextCloud News](https://github.com/nextcloud/news)' protocol and the [Tiny Tiny RSS](https://git.tt-rss.org/git/tt-rss/wiki/ApiReference) protocol (details below). Unlike most other aggregator servers, The Arsse does not include a Web front-end (though one is planned as a separate project), and it relies on existing protocols to maximize compatibility with existing clients. + +At present the software should be considered in an "alpha" state: though its core subsystems are covered by unit tests and should be free of major bugs, not everything has been rigorously tested. Additionally, many features one would expect from other similar software have yet to be implemented. Areas of future work include: + +- Providing more sync protocols (Google Reader, Fever, others) +- Better packaging and configuration samples diff --git a/docs/en/020_Installation/010_Requirements.md b/docs/en/020_Installation/010_Requirements.md new file mode 100644 index 0000000..425c4c0 --- /dev/null +++ b/docs/en/020_Installation/010_Requirements.md @@ -0,0 +1,11 @@ +The Arsse has the following requirements: + +- A Linux server utilizing systemd and Nginx (tested on Ubuntu 16.04) +- PHP 7.0.7 or later with the following extensions: + - [intl](http://php.net/manual/en/book.intl.php), [json](http://php.net/manual/en/book.json.php), and [hash](http://php.net/manual/en/book.hash.php) + - [dom](http://php.net/manual/en/book.dom.php), [simplexml](http://php.net/manual/en/book.simplexml.php), and [iconv](http://php.net/manual/en/book.iconv.php) (for picoFeed) + - One of: + - [sqlite3](http://php.net/manual/en/book.sqlite3.php) or [pdo_sqlite](http://php.net/manual/en/ref.pdo-sqlite.php) for SQLite databases + - [pgsql](http://php.net/manual/en/book.pgsql.php) or [pdo_pgsql](http://php.net/manual/en/ref.pdo-pgsql.php) for PostgreSQL 10 or later databases + - [mysqli](http://php.net/manual/en/book.mysqli.php) or [pdo_mysql](http://php.net/manual/en/ref.pdo-mysql.php) for MySQL 8.0.7 or later databases +- Privileges to create and run daemon processes on the server diff --git a/docs/en/020_Installation/020_Downloading_The_Arsse.md b/docs/en/020_Installation/020_Downloading_The_Arsse.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/020_Installation/030_Web_Server_Configuration.md b/docs/en/020_Installation/030_Web_Server_Configuration.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/020_Installation/040_Database_Setup/000_SQLite.md b/docs/en/020_Installation/040_Database_Setup/000_SQLite.md new file mode 100644 index 0000000..a8876a1 --- /dev/null +++ b/docs/en/020_Installation/040_Database_Setup/000_SQLite.md @@ -0,0 +1,3 @@ +SQLite requires very little setup. By default the database will be created at the root of The Arsse's program directory (e.g. `/usr/share/arsse/arsse.db`), but this can be changed with the [`dbSQLite3File` setting](/en/Configuring_The_Arsse#dbSQLite3File). + +Regardless of the location chosen, The Arsse **must** be able to both read from and write to the database file, as well as create files in the directory containing it. This is because SQLite also creates a write-ahead log file and a shared-memory file during operation. diff --git a/docs/en/020_Installation/040_Database_Setup/010_PostgreSQL.md b/docs/en/020_Installation/040_Database_Setup/010_PostgreSQL.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/020_Installation/040_Database_Setup/020_MySQL.md b/docs/en/020_Installation/040_Database_Setup/020_MySQL.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/020_Installation/040_Database_Setup/index.md b/docs/en/020_Installation/040_Database_Setup/index.md new file mode 100644 index 0000000..eb55561 --- /dev/null +++ b/docs/en/020_Installation/040_Database_Setup/index.md @@ -0,0 +1,13 @@ +The Arsse supports the following database backends: + +- SQLite 3.8.3 and later +- PostgreSQL 10 and later +- MySQL 8.07 and later + +All of the above are supported both via their PDO driver extensions as well as their native PHP extensions. One or the other is selected based on availability in your PHP installation. + +Functionally there is no reason to prefer either SQLite or PostgreSQL over the other. SQLite is significantly simpler to set up in most cases, requiring only read and write access to a containing directory in order to function; PostgreSQL may perform better than SQLite when serving hundreds of users or more, though this has not been tested. + +MySQL, on the other hand, is **not recommended** due to its relatively constrained index prefix limits which may cause some newsfeeds which would otherwise work to be rejected. If using MySQL, special care should also be taken when performing schema upgrades, as errors during the process can leave the database in a half-upgraded state which The Arsse cannot itself recover from. + +Note that MariaDB is not compatible with The Arsse: its support for common table expressions is, as of this writing, not sufficient for our needs. diff --git a/docs/en/020_Installation/050_Managing_Users.md b/docs/en/020_Installation/050_Managing_Users.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/020_Installation/060_Using_the_Daemon.md b/docs/en/020_Installation/060_Using_the_Daemon.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/030_Supported_Protocols/010_NextCloud_News.md b/docs/en/030_Supported_Protocols/010_NextCloud_News.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/030_Supported_Protocols/index.md b/docs/en/030_Supported_Protocols/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/050_Configuring_The_Arsse.md b/docs/en/050_Configuring_The_Arsse.md new file mode 100644 index 0000000..ba56d29 --- /dev/null +++ b/docs/en/050_Configuring_The_Arsse.md @@ -0,0 +1,368 @@ +## General settings + +### lang + +| Type | Default | +|--------|---------| +| string | `"en"` | + +The default language locale, mostly used when reporting errors on the command line or in logs. Currently only `"en"` (English) is available. + +## Database Settings + +### dbDriver + +| Type | Default | +|--------|-------------| +| string | `"sqlite3"` | + +The database driver to use. The following values are understood: + +- `"sqlite3"` for SQLite databases +- `"postgresql"` for PostgreSQL databases +- `"mysql"` for MySQL databases + +It is also possible to specify the fully-qualified name of a class which implements the database driver interface. For example, specifying `"JKingWeb\Arsse\Db\SQLite3\PDODriver"` would use the PDO driver for SQLite 3. + +### dbAutoUpdate + +| Type | Default | +|---------|---------| +| boolean | `true` | + +Whether to attempt to automatically upgrade the database schema when upgrading The Arsse to a new version with schema changes. + +If set to `false`, the database schema must be manually upgraded. Schema files can be found under `sql//#.sql`; the `UPGRADING` file will advise when a schema upgrade is required. + +### dbTimeoutConnect + +| Type | Default | +|----------|---------| +| interval | `5.0` | + +The number of seconds to wait before returning a timeout error when connecting to a database server. + +Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT) for details on how the timeout is interpreted by PostgreSQL. This setting does not apply to SQLite. + +### dbTimeoutExec + +| Type | Default | +|----------|---------| +| interval | `0.0` | + +The number of seconds to wait before returning a timeout error when executing a database operation (i.e. computing results). + +PostgreSQL and MySQL both interpret `0.0` as "wait forever". This setting does not apply to SQLite. + +## Database Settings Specific to SQLite 3 + +### dbSQLite3File + +| Type | Default | +|----------------|---------| +| string or null | `null` | + +The full path and file name of SQLite database. The special value `null` evaluates to a file named `"arsse.db"` in the directory where The Arsse is installed. + +### dbSQLite3Key + +| Type | Default | +|--------|---------| +| string | `""` | + +The key used to encrypt/decrypt the SQLite database. This is only relevant if using the [SQLite Encryption Extension](https://www.sqlite.org/see/). + +### dbSQLite3Timeout + +| Type | Default | +|----------|---------| +| interval | `60.0` | + +The number of seconds for SQLite to wait before returning a timeout error when trying to acquire a write lock on the database file. Setting this to a low value may cause operations to fail with an error. + +Consult [SQLite's documentation](https://sqlite.org/c3ref/busy_timeout.html) for more details. + +## Database Settings Specific to PostgreSQL + +### dbPostgreSQLHost + +| Type | Default | +|--------|---------| +| string | `""` | + +The host name, address, or socket path of the PostgreSQL database server. + +Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-HOST) for more details. + +### dbPostgreSQLUser + +| Type | Default | +|--------|-----------| +| string | `"arsse"` | + +The log-in user name for the PostgreSQL database server. + +### dbPostgreSQLPass + +| Type | Default | +|--------|---------| +| string | `""` | + +The log-in password for the PostgreSQL database server. + +### dbPostgreSQLPort + +| Type | Default | +|---------|---------| +| integer | `5432` | + +The TCP port on which to connect to the PostgreSQL database server, if connecting via TCP. + +### dbPostgreSQLDb + +| Type | Default | +|--------|-----------| +| string | `"arsse"` | + +The name of the database used by The Arsse on the PostgreSQL database server. + +### dbPostgreSQLSchema + +| Type | Default | +|--------|---------| +| string | `""` | + +The name of the schema used by The Arsse on the PostgreSQL database server. When not set to the empty string, the PostgreSQL search path is modified to consist of the specified schema with a fallback to the public schema. + +Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/ddl-schemas.html) for more details. + +### dbPostgreSQLService + +| Type | Default | +|--------|---------| +| string | `""` | + +A PostgreSQL service file entry to use *instead of* the above configuration; if using a service entry all above PostgreSQL-specific parameters except schema are ignored. + +Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-pgservice.html) for more details. + +## Database Settings Specific to MySQL + +### dbMySQLHost + +| Type | Default | +|--------|---------------| +| string | `"localhost"` | + +The host name or address of the MySQL database server. The values `"localhost"` and `"."` are special. + +Consult [MySQL's documentation](https://dev.mysql.com/doc/refman/8.0/en/connecting.html) for more details. + +### dbMySQLUser + +| Type | Default | +|--------|-----------| +| string | `"arsse"` | + +The log-in user name for the MySQL database server. + +### dbMySQLPass + +| Type | Default | +|--------|---------| +| string | `""` | + +The log-in password for the MySQL database server. + +### dbMySQLPort + +| Type | Default | +|---------|---------| +| integer | `3306` | + +The TCP port on which to connect to the MySQL database server, if connecting via TCP. + +### dbMySQLDb + +| Type | Default | +|--------|-----------| +| string | `"arsse"` | + +The name of the database used by The Arsse on the MySQL database server. + +### dbMySQLSocket + +| Type | Default | +|--------|---------| +| string | `""` | + +A Unix domain socket or named pipe to use for the MySQL database server when not connecting via TCP. + +## User Management Settings + +### userDriver + +| Type | Default | +|--------|--------------| +| string | `"internal"` | + +The user management driver to use. Currently only `"internal"` is available, which stores user IDs and hashed passwords in the configured database. + +It is also possible to specify the fully-qualified name of a class which implements the user management driver interface. For example, specifying `"JKingWeb\Arsse\User\Internal\Driver"` would use the internal driver. + +### userPreAuth + +| Type | Default | +|---------|---------| +| boolean | `false` | + +Whether users are authenticated by the Web server before requests are passed to The Arsse. If set to `true` The Arsse will perform no HTTP-level authentication and assume that the user ID supplied in either the `REMOTE_USER` CGI variable or the `Authorization` HTTP header-field (if `Basic` authentication was used) is authentic. + +For synchronization protocols which implement their own authentication (such as Tiny Tiny RSS), this setting may or may not affect how protocol-level authentication is handled; consult the section on The Arsse's [supported protocols](/en/Supported_Protocols) for more information. + +If the user has not previously logged in, an entry is created for them in the database automatically. If the Web server uses `Basic` HTTP authentication and passes along the `Authorization` field, a hash of the user's password will also be stored in The Arsse's database. + +### userHTTPAuthRequired + +| Type | Default | +|---------|---------| +| boolean | `false` | + +Whether to require successful HTTP authentication before processing API-level authentication, for protocol which implement their own authentication. + +### userSessionEnforced + +| Type | Default | +|---------|---------| +| boolean | `true` | + +Whether invalid or expired API session tokens should prevent logging in when HTTP authentication is used, for protocol which implement their own authentication. + +### userSessionTimeout + +| Type | Default | +|----------|-----------| +| interval | `"PT24H"` | + +The period of inactivity after which log-in sessions should be considered invalid. Session timeouts should not be made too long, to guard against session hijacking. + +### userSessionLifetime + +| Type | Default | +|----------|-----------| +| interval | `"P7D"` | + +The maximum lifetime of log-in sessions regardless of recent activity. Session lifetimes should not be made too long, to guard against session hijacking. + +### userTempPasswordLength + +| Type | Default | +|---------|---------| +| integer | `20` | + +The desired length in characters of randomly-generated user passwords. When [adding users](/en/Command-Line_Functionality), omitting a desired password generates a random one; this setting controls the length of these passwords. + +## Newsfeed Fetching Service Settings + +### serviceDriver + +| Type | Default | +|--------|----------------| +| string | `"subprocess"` | + +The newsfeed fetching service driver to use. The following values are understood: + +- `"serial"`: Fetches feeds and processed them one at a time. This is the slowest method, but is simple and reliable. +- `"subprocess"`: Fetches and processes multiple feeds concurrently by starting a separate process for each feed using PHP's [`popen`](https://php.net/manual/en/function.popen.php) function. This uses more memory and processing power, but takes less total time. + +It is also possible to specify the fully-qualified name of a class which implements the service driver interface. For example, specifying `"JKingWeb\Arsse\Service\Serial\Driver"` would use the serial driver. + +### serviceFrequency + +| Type | Default | +|----------|----------| +| interval | `"PT2M"` | + +The interval the newsfeed fetching service observes between checks for new articles. Note that requests to foreign servers are not necessarily made at this frequency: each newsfeed is assigned its own time at which to be next retrieved. This setting instead defines the length of time the fetching service will sleep between periods of activity. + +Consult "[Newsfeed Refresh Schedule](/en/Installation/Using_the_Daemon#Newsfeed_Refresh_Schedule)" for details on how often newsfeeds are fetched. + +### serviceQueueWidth + +| Type | Default | +|---------|---------| +| integer | `5` | + +The maximum number of concurrent feed updates to perform, if a concurrent service driver is used. + +### fetchTimeout + +| Type | Default | +|----------|---------| +| interval | `10.0` | + +The maximum number of seconds to wait for data when fetching newsfeeds from foreign servers. + +### fetchSizeLimit + +| Type | Default | +|---------|-------------------| +| integer | `2 * 1024 * 1024` | + +The maximum size, in bytes, of data to accept when fetching a newsfeed. Newsfeeds larger than this will be rejected to guard against denial-of-servioce attacks. + +The default value is equal to two megabytes. + +### fetchEnableScraping + +| Type | Default | +|---------|---------| +| boolean | `true` | + +Whether to allow the possibility of fetching full article contents from an article's source, if a newsfeed only provides excerpts. Whether fetching will actually happen is governed by a per-newsfeed toggle (defaulting to `false`) which currently can only be changed by manually editing the database. + +### fetchUserAgentString + +| Type | Default | +|----------------|---------| +| string or null | `null` | + +The [user agent](https://tools.ietf.org/html/rfc7231#section-5.5.3) The Arsse will identify as when fetching newsfeeds. The special value null will use an identifier similar to the following: + +``` +Arsse/0.6.0 (Linux 4.15.0; x86_64; https://thearsse.com/) +``` + +## Housekeeping settings + +### purgeFeeds + +| Type | Default | +|------------------|-----------| +| interval or null | `"PT24H"` | + +How long to keep a newsfeed and its articles in the database after all its subscriptions have been deleted. Specifying `null` will retain unsubscribed newsfeeds forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. + +Note that articles of orphaned feeds are still subject to the `purgeArticleUnread` threshold below. + +### purgeArticlesRead + +| Type | Default | +|------------------|---------| +| interval or null | `"P7D"` | + +How long to keep a an article in the database after all users subscribed to its feed have read it. Specifying `null` will retain articles up to the `purgeArticlesUnread` threshold below, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. + +If an article is starred by any user, it is retained indefinitely regardless of this setting. + +This setting also governs when an article is hidden from a user after being read by that user, regardless of its actual presence in the database. + +### purgeArticlesUnread + +| Type | Default | +|------------------|----------| +| interval or null | `"P21D"` | + +How long to keep a an article in the database regardless of whether any users have read it. Specifying `null` will retain articles forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. + +If an article is starred by any user, it is retained indefinitely regardless of this setting. diff --git a/docs/en/060_Command-Line_Functionality.md b/docs/en/060_Command-Line_Functionality.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/070_Contributing/010_Reporting_Bugs.md b/docs/en/070_Contributing/010_Reporting_Bugs.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/en/070_Contributing/020_Writing_Code.md b/docs/en/070_Contributing/020_Writing_Code.md new file mode 100644 index 0000000..e69de29 From f5c5d49d975036e095cf4e7691e008bdbcf4bbef Mon Sep 17 00:00:00 2001 From: "J. King" Date: Thu, 24 Jan 2019 11:40:25 -0500 Subject: [PATCH 04/74] Document SQL timeout changes --- docs/en/050_Configuring_The_Arsse.md | 66 +++++++++++++++++++++------- lib/Db/PostgreSQL/Driver.php | 2 +- 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/docs/en/050_Configuring_The_Arsse.md b/docs/en/050_Configuring_The_Arsse.md index ba56d29..1c575e4 100644 --- a/docs/en/050_Configuring_The_Arsse.md +++ b/docs/en/050_Configuring_The_Arsse.md @@ -36,23 +36,51 @@ If set to `false`, the database schema must be manually upgraded. Schema files c ### dbTimeoutConnect +| Type | Default | +|------------------|---------| +| interval or null | `5.0` | + +The number of seconds to wait before returning a timeout error when connecting to a database server. The special value `null` waits the maximum amount of time, while `0.0` waits the minimum amount of time. The minimums are maximums for each backend are as follows: + +| Backend | Minimum | Maximum | +|------------|----------|----------| +| SQLite 3 | *(does not apply)* | *(does not apply)* | +| PostgreSQL | 1 second | forever | +| MySQL | 1 second | forever | + +Note that in practice neither PostgreSQL nor MySQL will wait indefinitely: they are still subject to PHP's socket timeouts. Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT) for details on how the timeout is interpreted by PostgreSQL. + +### dbTimeoutExec + | Type | Default | |----------|---------| -| interval | `5.0` | +| interval | `null` | -The number of seconds to wait before returning a timeout error when connecting to a database server. +The number of seconds to wait before returning a timeout error when executing a database operation (i.e. computing results). The special value `null` waits the maximum amount of time, while `0.0` waits the minimum amount of time. The minimums are maximums for each backend are as follows: -Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT) for details on how the timeout is interpreted by PostgreSQL. This setting does not apply to SQLite. +| Backend | Minimum | Maximum | +|------------|---------------|----------| +| SQLite 3 | *(does not apply)* | *(does not apply)* | +| PostgreSQL | 1 millisecond | forever | +| MySQL | 1 second | forever | -### dbTimeoutExec +With MySQL this timeout only to read operations, whereas PostgreSQL will time out write operations as well. + +### dbTimeoutLock | Type | Default | |----------|---------| -| interval | `0.0` | +| interval | `60.0` | + +The number of seconds to wait before returning a timeout error when acquiring database locks. The special value `null` waits the maximum amount of time, while `0.0` waits the minimum amount of time. The minimums are maximums for each backend are as follows: -The number of seconds to wait before returning a timeout error when executing a database operation (i.e. computing results). +| Backend | Minimum | Maximum | +|------------|----------------|-----------------------| +| SQLite 3 | 0 milliseconds | at least 24 days | +| PostgreSQL | 1 millisecond | forever | +| MySQL | 1 second | approximately 1 year | -PostgreSQL and MySQL both interpret `0.0` as "wait forever". This setting does not apply to SQLite. +Note that PostgreSQL counts time spent waiting for locks as part of the above execution timeout. The maximum timeout for SQLite is `PHP_INT_MAX` milliseconds, which on 32-bit systems is just under 25 days, and on 64-bit systems is billions of years. ## Database Settings Specific to SQLite 3 @@ -72,16 +100,6 @@ The full path and file name of SQLite database. The special value `null` evaluat The key used to encrypt/decrypt the SQLite database. This is only relevant if using the [SQLite Encryption Extension](https://www.sqlite.org/see/). -### dbSQLite3Timeout - -| Type | Default | -|----------|---------| -| interval | `60.0` | - -The number of seconds for SQLite to wait before returning a timeout error when trying to acquire a write lock on the database file. Setting this to a low value may cause operations to fail with an error. - -Consult [SQLite's documentation](https://sqlite.org/c3ref/busy_timeout.html) for more details. - ## Database Settings Specific to PostgreSQL ### dbPostgreSQLHost @@ -366,3 +384,17 @@ This setting also governs when an article is hidden from a user after being read How long to keep a an article in the database regardless of whether any users have read it. Specifying `null` will retain articles forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. If an article is starred by any user, it is retained indefinitely regardless of this setting. + +# Obsolete Settings + +### dbSQLite3Timeout + +| Type | Historical Default | +|----------|--------------------| +| interval | `60.0` | + +*This setting has been replaced by [dbTimeoutLock](#dbTimeoutLock).* + +The number of seconds for SQLite to wait before returning a timeout error when trying to acquire a write lock on the database file. Setting this to a low value may cause operations to fail with an error. + +Consult [SQLite's documentation](https://sqlite.org/c3ref/busy_timeout.html) for more details. diff --git a/lib/Db/PostgreSQL/Driver.php b/lib/Db/PostgreSQL/Driver.php index 513ce99..95496ea 100644 --- a/lib/Db/PostgreSQL/Driver.php +++ b/lib/Db/PostgreSQL/Driver.php @@ -42,7 +42,7 @@ class Driver extends \JKingWeb\Arsse\Db\AbstractDriver { $base = [ 'client_encoding' => "UTF8", 'application_name' => "arsse", - 'connect_timeout' => (string) ceil(Arsse::$conf->dbTimeoutConnect), + 'connect_timeout' => (string) (int) ceil(Arsse::$conf->dbTimeoutConnect), ]; $out = []; if ($service != "") { From 94ba58fa60dd3c5719c905dde5377eeccd621a99 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 25 Jan 2019 15:24:52 -0500 Subject: [PATCH 05/74] Use latest version of Daux --- vendor-bin/csfixer/composer.lock | 184 +++++++------ vendor-bin/daux/composer.lock | 432 +++++++++++++++---------------- vendor-bin/phpunit/composer.lock | 35 +-- vendor-bin/robo/composer.lock | 139 +++++----- 4 files changed, 410 insertions(+), 380 deletions(-) diff --git a/vendor-bin/csfixer/composer.lock b/vendor-bin/csfixer/composer.lock index fe1d67e..f522cb4 100644 --- a/vendor-bin/csfixer/composer.lock +++ b/vendor-bin/csfixer/composer.lock @@ -114,30 +114,30 @@ }, { "name": "doctrine/annotations", - "version": "v1.4.0", + "version": "v1.6.0", "source": { "type": "git", "url": "https://github.com/doctrine/annotations.git", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", - "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", + "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5", "shasum": "" }, "require": { "doctrine/lexer": "1.*", - "php": "^5.6 || ^7.0" + "php": "^7.1" }, "require-dev": { "doctrine/cache": "1.*", - "phpunit/phpunit": "^5.7" + "phpunit/phpunit": "^6.4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4.x-dev" + "dev-master": "1.6.x-dev" } }, "autoload": { @@ -178,7 +178,7 @@ "docblock", "parser" ], - "time": "2017-02-24T16:22:25+00:00" + "time": "2017-12-06T07:11:42+00:00" }, { "name": "doctrine/lexer", @@ -475,21 +475,21 @@ }, { "name": "symfony/console", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -498,11 +498,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", @@ -513,7 +513,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -540,44 +540,48 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-01-04T04:42:43+00:00" + "time": "2019-01-04T15:13:53+00:00" }, { - "name": "symfony/debug", - "version": "v3.4.21", + "name": "symfony/contracts", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "php": "^7.1.3" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Contracts\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "**/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -586,44 +590,53 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "A set of abstractions extracted out of the Symfony components", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2" + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/887de6d34c86cf0cb6cbf910afb170cdb743cb5e", + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", @@ -632,7 +645,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -659,30 +672,30 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-01-01T18:08:36+00:00" + "time": "2019-01-05T16:37:49+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde" + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -709,29 +722,29 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/finder", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e" + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", + "url": "https://api.github.com/repos/symfony/finder/zipball/9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -758,29 +771,29 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/options-resolver", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "8a10e36ffd04c0c551051594952304d34ecece71" + "reference": "fbcb106aeee72f3450298bf73324d2cc00d083d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/8a10e36ffd04c0c551051594952304d34ecece71", - "reference": "8a10e36ffd04c0c551051594952304d34ecece71", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/fbcb106aeee72f3450298bf73324d2cc00d083d1", + "reference": "fbcb106aeee72f3450298bf73324d2cc00d083d1", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -812,7 +825,7 @@ "configuration", "options" ], - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1047,25 +1060,25 @@ }, { "name": "symfony/process", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "url": "https://api.github.com/repos/symfony/process/zipball/ea043ab5d8ed13b467a9087d81cb876aee7f689a", + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1092,29 +1105,30 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-01-02T21:24:08+00:00" + "time": "2019-01-03T14:48:52+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "af55d31cb58c5452d2c160655fa1968b872a8084" + "reference": "af62b35760fc92c8dbdce659b4eebdfe0e6a0472" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/af55d31cb58c5452d2c160655fa1968b872a8084", - "reference": "af55d31cb58c5452d2c160655fa1968b872a8084", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/af62b35760fc92c8dbdce659b4eebdfe0e6a0472", + "reference": "af62b35760fc92c8dbdce659b4eebdfe0e6a0472", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1141,7 +1155,7 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" } ], "packages-dev": [], diff --git a/vendor-bin/daux/composer.lock b/vendor-bin/daux/composer.lock index d3905db..6adb1a1 100644 --- a/vendor-bin/daux/composer.lock +++ b/vendor-bin/daux/composer.lock @@ -8,28 +8,29 @@ "packages": [ { "name": "daux/daux.io", - "version": "0.7.2", + "version": "0.8.1", "source": { "type": "git", "url": "https://github.com/dauxio/daux.io.git", - "reference": "2caa193a1690c95100936ae60b58b059ed19b852" + "reference": "7d8d5c86cfce682166bb55bc2298f2658c75cdc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dauxio/daux.io/zipball/2caa193a1690c95100936ae60b58b059ed19b852", - "reference": "2caa193a1690c95100936ae60b58b059ed19b852", + "url": "https://api.github.com/repos/dauxio/daux.io/zipball/7d8d5c86cfce682166bb55bc2298f2658c75cdc3", + "reference": "7d8d5c86cfce682166bb55bc2298f2658c75cdc3", "shasum": "" }, "require": { "guzzlehttp/guzzle": "~6.0", - "league/commonmark": "^0.15", + "league/commonmark": "^0.17", "league/plates": "~3.1", "myclabs/deep-copy": "^1.5", - "php": ">=5.6", - "symfony/console": "^3.3", - "symfony/http-foundation": "^3.3", - "symfony/process": "^3.3", - "webuni/commonmark-table-extension": "0.6.*", + "php": ">=7.1.3", + "symfony/console": "^4.0", + "symfony/http-foundation": "^4.0", + "symfony/polyfill-intl-icu": "^1.9", + "symfony/process": "^4.0", + "webuni/commonmark-table-extension": "0.8.*", "webuni/front-matter": "^1.0.0" }, "replace": { @@ -37,7 +38,10 @@ }, "require-dev": { "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "~5.7" + "phpunit/phpunit": "~7.3" + }, + "suggest": { + "ext-intl": "Allows to translate the modified at date" }, "bin": [ "bin/daux" @@ -70,7 +74,7 @@ "markdown", "md" ], - "time": "2018-02-27T22:43:36+00:00" + "time": "2018-10-01T20:25:59+00:00" }, { "name": "guzzlehttp/guzzle", @@ -257,34 +261,34 @@ }, { "name": "league/commonmark", - "version": "0.15.7", + "version": "0.17.5", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf" + "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/36d82f166e441dfa28643f8d01dd8bdd3a579adf", - "reference": "36d82f166e441dfa28643f8d01dd8bdd3a579adf", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/82d7ab62d7f68391cb9d323f3ccce50be24a5369", + "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": ">=5.4.8" + "php": ">=5.6.5" }, "replace": { "colinodell/commonmark-php": "*" }, "require-dev": { "cebe/markdown": "~1.0", + "commonmark/commonmark.js": "0.28", "erusev/parsedown": "~1.0", - "jgm/commonmark": "0.28", "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "~1.2.0", - "phpunit/phpunit": "~4.3|~5.0", - "scrutinizer/ocular": "~1.1", - "symfony/finder": "~2.3|~3.0" + "mikehaertl/php-shellcommand": "^1.2", + "phpunit/phpunit": "^5.7|^6.5", + "scrutinizer/ocular": "^1.1", + "symfony/finder": "^3.0|^4.0" }, "suggest": { "league/commonmark-extras": "Library of useful extensions including smart punctuation" @@ -295,7 +299,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.16-dev" + "dev-master": "0.18-dev" } }, "autoload": { @@ -322,7 +326,7 @@ "markdown", "parser" ], - "time": "2017-10-26T15:41:07+00:00" + "time": "2018-03-29T14:35:19+00:00" }, { "name": "league/plates", @@ -381,25 +385,28 @@ }, { "name": "myclabs/deep-copy", - "version": "1.7.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "phpunit/phpunit": "^7.1" }, "type": "library", "autoload": { @@ -422,52 +429,7 @@ "object", "object graph" ], - "time": "2017-10-19T19:58:43+00:00" - }, - { - "name": "paragonie/random_compat", - "version": "v9.99.99", - "source": { - "type": "git", - "url": "https://github.com/paragonie/random_compat.git", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", - "shasum": "" - }, - "require": { - "php": "^7" - }, - "require-dev": { - "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" - }, - "suggest": { - "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." - }, - "type": "library", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com" - } - ], - "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", - "keywords": [ - "csprng", - "polyfill", - "pseudorandom", - "random" - ], - "time": "2018-07-02T15:55:56+00:00" + "time": "2018-06-11T23:09:50+00:00" }, { "name": "psr/http-message", @@ -519,53 +481,6 @@ ], "time": "2016-08-06T14:39:51+00:00" }, - { - "name": "psr/log", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "time": "2018-11-20T15:27:04+00:00" - }, { "name": "ralouphie/getallheaders", "version": "2.0.5", @@ -608,21 +523,21 @@ }, { "name": "symfony/console", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -631,11 +546,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", @@ -646,7 +561,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -673,44 +588,48 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-01-04T04:42:43+00:00" + "time": "2019-01-04T15:13:53+00:00" }, { - "name": "symfony/debug", - "version": "v3.4.21", + "name": "symfony/contracts", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "php": "^7.1.3" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Contracts\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "**/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -719,44 +638,52 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "A set of abstractions extracted out of the Symfony components", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "2b97319e68816d2120eee7f13f4b76da12e04d03" + "reference": "a633d422a09242064ba24e44a6e1494c5126de86" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2b97319e68816d2120eee7f13f4b76da12e04d03", - "reference": "2b97319e68816d2120eee7f13f4b76da12e04d03", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a633d422a09242064ba24e44a6e1494c5126de86", + "reference": "a633d422a09242064ba24e44a6e1494c5126de86", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "predis/predis": "~1.0", + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -783,7 +710,82 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-01-05T08:05:37+00:00" + "time": "2019-01-05T16:37:49+00:00" + }, + { + "name": "symfony/intl", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "9bc515dfd1f02bcf64309ab5fd86bace4f43b86d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/9bc515dfd1f02bcf64309ab5fd86bace4f43b86d", + "reference": "9bc515dfd1f02bcf64309ab5fd86bace4f43b86d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-icu": "~1.0" + }, + "require-dev": { + "symfony/filesystem": "~3.4|~4.0" + }, + "suggest": { + "ext-intl": "to use the component with locales other than \"en\"" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "classmap": [ + "Resources/stubs" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "time": "2019-01-05T16:37:49+00:00" }, { "name": "symfony/polyfill-ctype", @@ -844,24 +846,25 @@ "time": "2018-08-06T14:22:27+00:00" }, { - "name": "symfony/polyfill-mbstring", + "name": "symfony/polyfill-intl-icu", "version": "v1.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "url": "https://github.com/symfony/polyfill-intl-icu.git", + "reference": "f22a90256d577c7ef7efad8df1f0201663d57644" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644", + "reference": "f22a90256d577c7ef7efad8df1f0201663d57644", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/intl": "~2.3|~3.0|~4.0" }, "suggest": { - "ext-mbstring": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -870,9 +873,6 @@ } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" ] @@ -891,35 +891,38 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill for intl's ICU-related data and classes", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", + "icu", + "intl", "polyfill", "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2018-08-06T14:22:27+00:00" }, { - "name": "symfony/polyfill-php70", + "name": "symfony/polyfill-mbstring", "version": "v1.10.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/6b88000cdd431cd2e940caa2cb569201f3f84224", - "reference": "6b88000cdd431cd2e940caa2cb569201f3f84224", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", + "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0|~9.99", "php": ">=5.3.3" }, + "suggest": { + "ext-mbstring": "For best performance" + }, "type": "library", "extra": { "branch-alias": { @@ -928,13 +931,10 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Mbstring\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -951,37 +951,38 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "mbstring", "polyfill", "portable", "shim" ], - "time": "2018-09-21T06:26:08+00:00" + "time": "2018-09-21T13:07:52+00:00" }, { "name": "symfony/process", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c" + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", - "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c", + "url": "https://api.github.com/repos/symfony/process/zipball/ea043ab5d8ed13b467a9087d81cb876aee7f689a", + "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1008,24 +1009,24 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-01-02T21:24:08+00:00" + "time": "2019-01-03T14:48:52+00:00" }, { "name": "symfony/yaml", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea" + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -1040,7 +1041,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1067,36 +1068,36 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "webuni/commonmark-table-extension", - "version": "0.6.1", + "version": "0.8.0", "source": { "type": "git", "url": "https://github.com/webuni/commonmark-table-extension.git", - "reference": "ebbd69b63436283ec726658835b213ec634485e8" + "reference": "4304b1f56b26e5213a4a781b654f62ef5ed8fbe3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/ebbd69b63436283ec726658835b213ec634485e8", - "reference": "ebbd69b63436283ec726658835b213ec634485e8", + "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/4304b1f56b26e5213a4a781b654f62ef5ed8fbe3", + "reference": "4304b1f56b26e5213a4a781b654f62ef5ed8fbe3", "shasum": "" }, "require": { - "league/commonmark": "^0.14|^0.15", - "php": "^5.5|^7.0" + "league/commonmark": "^0.16|^0.17", + "php": "^5.6|^7.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^1.9", - "phpunit/phpunit": "^4.3|^5.0", - "sllh/php-cs-fixer-styleci-bridge": "^2.0", - "symfony/var-dumper": "^2.7|^3.0" + "friendsofphp/php-cs-fixer": "^2.9", + "phpunit/phpunit": "^5.4|^6.0", + "symfony/var-dumper": "^3.0|^4.0", + "vimeo/psalm": "~0.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.7-dev" + "dev-master": "0.8-dev" } }, "autoload": { @@ -1111,8 +1112,7 @@ "authors": [ { "name": "Martin Hasoň", - "email": "martin.hason@gmail.com", - "role": "Lead Developer" + "email": "martin.hason@gmail.com" }, { "name": "Webuni s.r.o.", @@ -1126,7 +1126,7 @@ "markdown", "table" ], - "time": "2017-01-11T14:52:17+00:00" + "time": "2018-01-24T12:30:02+00:00" }, { "name": "webuni/front-matter", diff --git a/vendor-bin/phpunit/composer.lock b/vendor-bin/phpunit/composer.lock index 40ac728..fb99feb 100644 --- a/vendor-bin/phpunit/composer.lock +++ b/vendor-bin/phpunit/composer.lock @@ -58,32 +58,32 @@ }, { "name": "doctrine/instantiator", - "version": "1.0.5", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", - "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", + "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", "shasum": "" }, "require": { - "php": ">=5.3,<8.0-DEV" + "php": "^7.1" }, "require-dev": { "athletic/athletic": "~0.1.8", "ext-pdo": "*", "ext-phar": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~2.0" + "phpunit/phpunit": "^6.2.3", + "squizlabs/php_codesniffer": "^3.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -108,7 +108,7 @@ "constructor", "instantiate" ], - "time": "2015-06-14T21:17:01+00:00" + "time": "2017-07-22T11:58:36+00:00" }, { "name": "mikey179/vfsStream", @@ -158,25 +158,28 @@ }, { "name": "myclabs/deep-copy", - "version": "1.7.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e" + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", - "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.1" + }, + "replace": { + "myclabs/deep-copy": "self.version" }, "require-dev": { "doctrine/collections": "^1.0", "doctrine/common": "^2.6", - "phpunit/phpunit": "^4.1" + "phpunit/phpunit": "^7.1" }, "type": "library", "autoload": { @@ -199,7 +202,7 @@ "object", "object graph" ], - "time": "2017-10-19T19:58:43+00:00" + "time": "2018-06-11T23:09:50+00:00" }, { "name": "phake/phake", diff --git a/vendor-bin/robo/composer.lock b/vendor-bin/robo/composer.lock index 624be20..123dceb 100644 --- a/vendor-bin/robo/composer.lock +++ b/vendor-bin/robo/composer.lock @@ -1020,21 +1020,21 @@ }, { "name": "symfony/console", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a" + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a", - "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a", + "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", + "symfony/contracts": "^1.0", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -1043,11 +1043,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log-implementation": "For using the console logger", @@ -1058,7 +1058,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1085,44 +1085,48 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-01-04T04:42:43+00:00" + "time": "2019-01-04T15:13:53+00:00" }, { - "name": "symfony/debug", - "version": "v3.4.21", + "name": "symfony/contracts", + "version": "v1.0.2", "source": { "type": "git", - "url": "https://github.com/symfony/debug.git", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186" + "url": "https://github.com/symfony/contracts.git", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", - "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186", + "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", + "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "psr/log": "~1.0" - }, - "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "php": "^7.1.3" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "psr/cache": "^1.0", + "psr/container": "^1.0" + }, + "suggest": { + "psr/cache": "When using the Cache contracts", + "psr/container": "When using the Service contracts", + "symfony/cache-contracts-implementation": "", + "symfony/service-contracts-implementation": "", + "symfony/translation-contracts-implementation": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "1.0-dev" } }, "autoload": { "psr-4": { - "Symfony\\Component\\Debug\\": "" + "Symfony\\Contracts\\": "" }, "exclude-from-classmap": [ - "/Tests/" + "**/Tests/" ] }, "notification-url": "https://packagist.org/downloads/", @@ -1131,44 +1135,53 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony Debug Component", + "description": "A set of abstractions extracted out of the Symfony components", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2018-12-05T08:06:11+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2" + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", - "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/887de6d34c86cf0cb6cbf910afb170cdb743cb5e", + "reference": "887de6d34c86cf0cb6cbf910afb170cdb743cb5e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3", + "symfony/contracts": "^1.0" }, "conflict": { - "symfony/dependency-injection": "<3.3" + "symfony/dependency-injection": "<3.4" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0" + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/stopwatch": "~3.4|~4.0" }, "suggest": { "symfony/dependency-injection": "", @@ -1177,7 +1190,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1204,30 +1217,30 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2019-01-01T18:08:36+00:00" + "time": "2019-01-05T16:37:49+00:00" }, { "name": "symfony/filesystem", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde" + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", - "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", + "reference": "c2ffd9a93f2d6c5be2f68a0aa7953cc229f871f8", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1254,29 +1267,29 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/finder", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e" + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", - "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e", + "url": "https://api.github.com/repos/symfony/finder/zipball/9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", + "reference": "9094d69e8c6ee3fe186a0ec5a4f1401e506071ce", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1303,7 +1316,7 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1473,20 +1486,20 @@ }, { "name": "symfony/yaml", - "version": "v3.4.21", + "version": "v4.2.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea" + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea", - "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", + "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "symfony/polyfill-ctype": "~1.8" }, "conflict": { @@ -1501,7 +1514,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.2-dev" } }, "autoload": { @@ -1528,7 +1541,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-01-01T13:45:19+00:00" + "time": "2019-01-03T09:07:35+00:00" } ], "packages-dev": [], From 6ce1f68ed77f17b29cbe5114186489f3e7f7e04c Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 25 Jan 2019 16:32:47 -0500 Subject: [PATCH 06/74] Document supported protocols Also standardize some stylistic conventions --- .../010_NextCloud_News.md | 39 +++++++++ .../020_Tiny_Tiny_RSS.md | 85 +++++++++++++++++++ docs/en/030_Supported_Protocols/index.md | 6 ++ docs/en/050_Configuring_The_Arsse.md | 24 +++--- docs/index.md | 0 5 files changed, 142 insertions(+), 12 deletions(-) create mode 100644 docs/index.md diff --git a/docs/en/030_Supported_Protocols/010_NextCloud_News.md b/docs/en/030_Supported_Protocols/010_NextCloud_News.md index e69de29..e1c46b5 100644 --- a/docs/en/030_Supported_Protocols/010_NextCloud_News.md +++ b/docs/en/030_Supported_Protocols/010_NextCloud_News.md @@ -0,0 +1,39 @@ +[TOC] + +# About + +The NextCloud News protocol was the first supported by The Arsse, and has been supported in full since version 0.3.0. + +It allows organizing newsfeeds into single-level folders, and supports a wide range of operations on newsfeeds, folders, and articles. + +
+
Supported since
+
0.1.0
+
Base URL
+
/
+
API endpoint
+
/index.php/apps/news/api/v1-2/
+
Specifications
+
Version 1.2
+
+ +# Differences + +- Article GUID hashes are not hashes like in NCN; they are integers rendered as strings +- Article fingerprints are a combination of hashes rather than a single hash +- When marking articles as starred the feed ID is ignored, as they are not needed to establish uniqueness +- The feed updater ignores the `userId` parameter: feeds in The Arsse are deduplicated, and have no owner +- The `/feeds/all` route lists only feeds which should be checked for updates, and it also returns all `userId` attributes as empty strings: feeds in The Arsse are deduplicated, and have no owner +- The API's "updater" routes do not require administrator priviledges as The Arsse has no concept of user classes +- The "updater" console commands mentioned in the protocol specification are not implemented, as The Arsse does not implement the required NextCloud subsystems +- The `lastLoginTimestamp` attribute of the user metadata is always the current time: The Arsse's implementation of the protocol is fully stateless +- Syntactically invalid JSON input will yield a `400 Bad Request` response instead of falling back to GET parameters +- Folder names consisting only of whitespace are rejected along with the empty string +- Feed titles consisting only of whitespace or the empty string are rejected with a `422 Unprocessable Entity` reponse instead of being accepted +- Bulk-marking operations without a `newestItemId` argument result in a `422 Unprocessable Entity` reponse instead of silently failing +- Creating a feed in a folder which does not exist places the feed in the root folder rather than suppressing the feed +- Moving a feed to a folder which does not exist results in a `422 Unprocessable Entity` reponse rather than suppressing the feed + +# Interaction with nested folders + +Tiny Tiny RSS is unique in allowing newsfeeds to be grouped into folders nested to arbitrary depth. When nesfeeds are placed into nested folders, they simply appear in the top-level folder when accessed via the NextCloud News protocol. diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md index e69de29..1e6f9e3 100644 --- a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md +++ b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md @@ -0,0 +1,85 @@ +[TOC] + +# About + +The Arsse supports not only the Tiny Tiny RSS protocol, but also extensions required by the FeedReader client and the more commonly supported `getCompactHeadlines` extension. + +It allows organizing newsfeeds into nested folders, and supports odd patchwork subset of Tiny Tiny RSS' full capabilities. The FeedReader extensions round out the protocol with significantly more features. Unlike TT-RSS itself, API access is always enabled with The Arsse. + +
+
Supported since
+
0.2.0
+
Base URL
+
/tt-rss/
+
API endpoint
+
/tt-rss/api
+
Specifications
+
Main, FeedReader extensions, News+ extension
+
+ +# Missing features + +The Arsse does not currently support the entire protocol. Notably missing features include manipulation of the special "Published" newsfeed, as well as searching. The full list of missing features is as follows: + +- The `shareToPublished` operation is not implemented; it returns `UNKNOWN_METHOD` +- Setting an article's "published" flag with the `updateArticle` operation is not implemented and will gracefully fail +- The `search` parameter of the `getHeadlines` operation is not implemented; the operation will proceed as if no search string were specified +- The `sanitize`, `force_update`, and `has_sandbox` parameters of the `getHeadlines` operation are ignored +- String `feed_id` values for the `getCompactHeadlines` operation are not supported and will yield an `INCORRECT_USAGE` error +- Articles are limited to a single attachment rather than multiple attachments +- The `getPref` operation is not implemented; it returns `UNKNOWN_METHOD` + +# Differences + +- Input that cannot be parsed as JSON normally returns a `NOT_LOGGED_IN` error; The Arsse returns a non-standard `MALFORMED_INPUT` error instead +- Feed, category, and label names are normally unrestricted; The Arsse rejects empty strings, as well as strings composed solely of whitespace +- Discovering multiple feeds during `subscribeToFeed` processing normally produces an error; The Arsse instead chooses the first feed it finds +- Providing the `setArticleLabel` operation with an invalid label normally silently fails; The Arsse returns an `INVALID_USAGE` error instead +- Article hashes are normally SHA1; The Arsse uses SHA256 hashes +- Article attachments normally have unique IDs; The Arsse always gives attachments an ID of `"0"` +- The default sort order of the `getHeadlines` operation normally uses custom sorting for "special" feeds; The Arsse's default sort order is equivalent to `feed_dates` for all feeds +- The `getCounters` operation normally omits members with zero unread; The Arsse includes everything to appease some clients + +# Other notes + +- TT-RSS accepts base64-encoded passwords, though this is undocumented; The Arsse accepts base64-encoded passwords as well +- TT-RSS sometimes returns an incorrect count from the `setArticleLabel` operation; The Arsse returns a correct count in all cases +- TT-RSS sometimes returns out-of-date cached information; The Arsse does not use caches as TT-RSS does, so information is always current +- TT-RSS returns results for _feed_ ID `-3` when providing the `getHeadlines` operation with _category_ ID `-3`; The Arsse retuns the correct results +- The protocol doucmentation advises not to use `limit` or `skip` together with `unread_only` for the `getFeeds` operation as it produces unpredictable results; The Arsse produces predictable results by first retrieving all unread feeds and then applying `skip` and `limit` +- The protocol documentation on values for the `view_mode` parameter of the `getHeadlines` operation is out of date; The Arsse matches the actual implementation and supports the undocumented `published` and `has_note` values exposed by the Web user interface +- The protocol documentation makes mention of a `search_mode` parameter for the `getHeadlines` operation, but this seems to be ignored; The Arsse does not implement it +- The protocol documentation makes mention of an `output_mode` parameter for the `getCounters` operation, but this seems to be ignored; The Arsse does not implement it +- The documentation for the `getCompactHeadlines` operation states the default value for `limit` is 20, but the reference implementation defaults to unlimited; The Arsse also defaults to unlimited +- It is assumed TT-RSS exposes other undocumented behaviour; unless otherwise noted The Arsse only implements documented behaviour + +# Interaction with HTTP authentication + +Tiny Tiny RSS itself is unaware of HTTP authentication: if HTTP authentication is used in the server configuration, it has no effect on authentication in the API. The Arsse, however, makes use of HTTP authentication for NextCloud News, and can do so for TT-RSS as well. In a default configuration The Arsse functions in the same way as TT-RSS: HTTP authentication and API authentication are completely separate and independent. Alternative behaviour is summarized below: + +- With default settings: + - Clients may optionally provide HTTP credentials + - API authentication proceeds as normal + - All feed icons are visible to unauthenticated clients +- If the `userHTTPAuthRequired` setting is `true`: + - Clients must pass HTTP authentication + - API authentication proceeds as normal + - Feed icons are visible only to their owners +- If the `userSessionEnforced` setting is `false`: + - Clients may optionally provide HTTP credentials + - If HTTP authentication succeeded API authentication is skipped: tokens are issued upon login, but ignored for HTTP-authenticated requests + - All feed icons are visible to unauthenticated clients +- If the `userHTTPAuthRequired` setting is `true` and the `userSessionEnforced` setting is `false`: + - Clients must pass HTTP authentication + - API authentication is skipped: tokens are issued upon login, but thereafter ignored + - Feed icons are visible only to their owners +- If the `userPreAuth` setting is `true`: + - The Web server asserts HTTP authentication was successful + - API authentication only checks that HTTP and API user names match + - Feed icons are visible only to their owners +- If the `userPreAuth` setting is `true` and the `userSessionEnforced` setting is `false`: + - The Web server asserts HTTP authentication was successful + - API authentication is skipped: tokens are issued upon login, but thereafter ignored + - Feed icons are visible only to their owners + +In all cases, supplying invalid HTTP credentials will result in a 401 response. diff --git a/docs/en/030_Supported_Protocols/index.md b/docs/en/030_Supported_Protocols/index.md index e69de29..4df46b3 100644 --- a/docs/en/030_Supported_Protocols/index.md +++ b/docs/en/030_Supported_Protocols/index.md @@ -0,0 +1,6 @@ +The Arsse was designed from the start as a server for multiple synchronization protocols which clients can make use of. Currently the following protocols are supported: + +- [NextCloud News](NextCloud_News) +- [Tiny Tiny RSS](Tiny_Tiny_RSS) + +The protocols are merely different ways of accessing and manipulating the same data: subscribing to a newsfeed using one protocol will see the newsfeed also present when later connecting via another protocol, for example. Because not all protocols work according to the same concepts, sometimes the interactions between them are not obvious. These interactions are documented here when warranted. diff --git a/docs/en/050_Configuring_The_Arsse.md b/docs/en/050_Configuring_The_Arsse.md index 1c575e4..e09111e 100644 --- a/docs/en/050_Configuring_The_Arsse.md +++ b/docs/en/050_Configuring_The_Arsse.md @@ -8,7 +8,7 @@ The default language locale, mostly used when reporting errors on the command line or in logs. Currently only `"en"` (English) is available. -## Database Settings +## Database settings ### dbDriver @@ -82,7 +82,7 @@ The number of seconds to wait before returning a timeout error when acquiring da Note that PostgreSQL counts time spent waiting for locks as part of the above execution timeout. The maximum timeout for SQLite is `PHP_INT_MAX` milliseconds, which on 32-bit systems is just under 25 days, and on 64-bit systems is billions of years. -## Database Settings Specific to SQLite 3 +## Database settings specific to SQLite 3 ### dbSQLite3File @@ -100,7 +100,7 @@ The full path and file name of SQLite database. The special value `null` evaluat The key used to encrypt/decrypt the SQLite database. This is only relevant if using the [SQLite Encryption Extension](https://www.sqlite.org/see/). -## Database Settings Specific to PostgreSQL +## Database settings specific to PostgreSQL ### dbPostgreSQLHost @@ -164,7 +164,7 @@ A PostgreSQL service file entry to use *instead of* the above configuration; if Consult [PostgreSQL's documentation](https://www.postgresql.org/docs/current/libpq-pgservice.html) for more details. -## Database Settings Specific to MySQL +## Database settings specific to MySQL ### dbMySQLHost @@ -216,7 +216,7 @@ The name of the database used by The Arsse on the MySQL database server. A Unix domain socket or named pipe to use for the MySQL database server when not connecting via TCP. -## User Management Settings +## User management settings ### userDriver @@ -280,7 +280,7 @@ The maximum lifetime of log-in sessions regardless of recent activity. Session l The desired length in characters of randomly-generated user passwords. When [adding users](/en/Command-Line_Functionality), omitting a desired password generates a random one; this setting controls the length of these passwords. -## Newsfeed Fetching Service Settings +## Newsfeed fetching service settings ### serviceDriver @@ -290,8 +290,8 @@ The desired length in characters of randomly-generated user passwords. When [add The newsfeed fetching service driver to use. The following values are understood: -- `"serial"`: Fetches feeds and processed them one at a time. This is the slowest method, but is simple and reliable. -- `"subprocess"`: Fetches and processes multiple feeds concurrently by starting a separate process for each feed using PHP's [`popen`](https://php.net/manual/en/function.popen.php) function. This uses more memory and processing power, but takes less total time. +- `"serial"`: Fetches newsfeeds and processed them one at a time. This is the slowest method, but is simple and reliable. +- `"subprocess"`: Fetches and processes multiple newsfeeds concurrently by starting a separate process for each newsfeed using PHP's [`popen`](https://php.net/manual/en/function.popen.php) function. This uses more memory and processing power, but takes less total time. It is also possible to specify the fully-qualified name of a class which implements the service driver interface. For example, specifying `"JKingWeb\Arsse\Service\Serial\Driver"` would use the serial driver. @@ -311,7 +311,7 @@ Consult "[Newsfeed Refresh Schedule](/en/Installation/Using_the_Daemon#Newsfeed_ |---------|---------| | integer | `5` | -The maximum number of concurrent feed updates to perform, if a concurrent service driver is used. +The maximum number of concurrent newsfeed updates to perform, if a concurrent service driver is used. ### fetchTimeout @@ -361,7 +361,7 @@ Arsse/0.6.0 (Linux 4.15.0; x86_64; https://thearsse.com/) How long to keep a newsfeed and its articles in the database after all its subscriptions have been deleted. Specifying `null` will retain unsubscribed newsfeeds forever, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. -Note that articles of orphaned feeds are still subject to the `purgeArticleUnread` threshold below. +Note that articles of orphaned newsfeeds are still subject to the `purgeArticleUnread` threshold below. ### purgeArticlesRead @@ -369,7 +369,7 @@ Note that articles of orphaned feeds are still subject to the `purgeArticleUnrea |------------------|---------| | interval or null | `"P7D"` | -How long to keep a an article in the database after all users subscribed to its feed have read it. Specifying `null` will retain articles up to the `purgeArticlesUnread` threshold below, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. +How long to keep a an article in the database after all users subscribed to its newsfeed have read it. Specifying `null` will retain articles up to the `purgeArticlesUnread` threshold below, whereas an interval evaluating to zero (e.g. `"PT0S"`) will delete them immediately. If an article is starred by any user, it is retained indefinitely regardless of this setting. @@ -385,7 +385,7 @@ How long to keep a an article in the database regardless of whether any users ha If an article is starred by any user, it is retained indefinitely regardless of this setting. -# Obsolete Settings +# Obsolete settings ### dbSQLite3Timeout diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..e69de29 From e07253867cc96c7619fcda0b0ceaa29c54245b94 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 25 Jan 2019 16:56:05 -0500 Subject: [PATCH 07/74] Add served manual to Robo tasks --- RoboFile.php | 16 ++++++++++++---- .../030_Supported_Protocols/020_Tiny_Tiny_RSS.md | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/RoboFile.php b/RoboFile.php index ef87571..104a8b7 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -6,8 +6,7 @@ class RoboFile extends \Robo\Tasks { const BASE = __DIR__.\DIRECTORY_SEPARATOR; const BASE_TEST = self::BASE."tests".\DIRECTORY_SEPARATOR; - /** - * Runs the typical test suite + /** Runs the typical test suite * * Arguments passed to the task are passed on to PHPUnit. Thus one may, for * example, run the following command and get the expected results: @@ -20,8 +19,7 @@ class RoboFile extends \Robo\Tasks { return $this->runTests(escapeshellarg(\PHP_BINARY), "typical", $args); } - /** - * Runs the full test suite + /** Runs the full test suite * * This includes pedantic tests which may help to identify problems. * See help for the "test" task for more details. @@ -171,8 +169,18 @@ class RoboFile extends \Robo\Tasks { return $out; } + /** Generates static manual pages in the "manual" directory + * + * The resultant files are suitable for offline viewing and inclusion into release builds + */ public function manual(array $args): Result { $execpath = escapeshellarg(realpath(self::BASE."vendor/bin/daux")); return $this->taskExec($execpath)->arg("generate")->option("-d", self::BASE."manual")->args($args)->run(); } + + /** Serves a live view of the manual using PHP's built-in Web server */ + public function manualLive(array $args): Result { + $execpath = escapeshellarg(realpath(self::BASE."vendor/bin/daux")); + return $this->taskExec($execpath)->arg("serve")->args($args)->run(); + } } diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md index 1e6f9e3..a8db4ce 100644 --- a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md +++ b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md @@ -4,7 +4,7 @@ The Arsse supports not only the Tiny Tiny RSS protocol, but also extensions required by the FeedReader client and the more commonly supported `getCompactHeadlines` extension. -It allows organizing newsfeeds into nested folders, and supports odd patchwork subset of Tiny Tiny RSS' full capabilities. The FeedReader extensions round out the protocol with significantly more features. Unlike TT-RSS itself, API access is always enabled with The Arsse. +It allows organizing newsfeeds into nested folders, and supports an odd patchwork subset of Tiny Tiny RSS' full capabilities. The FeedReader extensions round out the protocol with significantly more features. Unlike TT-RSS itself, API access is always enabled with The Arsse.
Supported since
From ee8701320d6bb1ca6680f8438d8cf540880f57e2 Mon Sep 17 00:00:00 2001 From: Dustin Wilson Date: Sun, 27 Jan 2019 13:31:49 -0600 Subject: [PATCH 08/74] Added clients to documentation --- docs/FeedClients.html | 213 ------------------------------ docs/en/040_Compatible_Clients.md | 74 +++++++++++ vendor-bin/csfixer/composer.lock | 2 +- vendor-bin/robo/composer.lock | 2 +- 4 files changed, 76 insertions(+), 215 deletions(-) delete mode 100644 docs/FeedClients.html diff --git a/docs/FeedClients.html b/docs/FeedClients.html deleted file mode 100644 index 222450a..0000000 --- a/docs/FeedClients.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - Feed Reader Apps - - - - - - - - - -
-

Feed Reader Apps

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameOSProtocolNotes
FeverNextcloud NewsTiny Tiny RSS
ReedermacOS & iOS

Supports other services which use derivatives of the Google Reader API, but the settings do not allow input of a server.

Fiery FeedsiOS -

Supports other services which use derivatives of the Google Reader API, but the settings do not allow input of a server.

-

Currently keeps showing items in the unread badge which have already been read.

-
CloudNewsiOS -

Has a lot of difficulty showing feeds in correct order. Maybe when atom feeds are updated they show up again?

-
- - diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index e69de29..9a7942b 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -0,0 +1,74 @@ +The Arsse does not at this time have any first party clients. However, because The Arsse supports other protocols, most clients built for NextCloud News and Tiny Tiny RSS are compatible with The Arsse. Below are a few that we personally know of and have tested with The Arsse. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameOSProtocolNotes
Nextcloud NewsTiny Tiny RSS
CloudNewsiOS +

Very bland looking application, but it functions well.

+
FeedReaderLinux +

Excellent reader; one of the best on any platform.

+
Fiery FeedsiOS +

Rentalware - For the software to be usable (you can't even add feeds otherwise) a subscription fee must be paid.

+

Currently keeps showing items in the unread badge which have already been read.

+
+ +## Known Incompatible Clients + + + + + + + + + + + + + + + + + + + + + + + +
NameOSProtocolNotes
Nextcloud NewsTiny Tiny RSS
tiny Reader RSSiOS +

Does not support HTTP authentication.

+
\ No newline at end of file diff --git a/vendor-bin/csfixer/composer.lock b/vendor-bin/csfixer/composer.lock index f522cb4..ab76c71 100644 --- a/vendor-bin/csfixer/composer.lock +++ b/vendor-bin/csfixer/composer.lock @@ -872,7 +872,7 @@ }, { "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "email": "backendtea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", diff --git a/vendor-bin/robo/composer.lock b/vendor-bin/robo/composer.lock index 123dceb..52ab736 100644 --- a/vendor-bin/robo/composer.lock +++ b/vendor-bin/robo/composer.lock @@ -1363,7 +1363,7 @@ }, { "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" + "email": "backendtea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", From 5885e145668cdf657165d31ed16a26c8f53d33ae Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 8 Feb 2019 13:08:55 -0500 Subject: [PATCH 09/74] Add more compatible clients --- docs/en/040_Compatible_Clients.md | 83 ++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 7 deletions(-) diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index 9a7942b..2841fa6 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -15,13 +15,7 @@ The Arsse does not at this time have any first party clients. However, because T - CloudNews - iOS - ✔ - ✘ - -

Very bland looking application, but it functions well.

- + Desktop FeedReader @@ -32,6 +26,47 @@ The Arsse does not at this time have any first party clients. However, because T

Excellent reader; one of the best on any platform.

+ + Newsboat + Linux, macOS + ✔ + ✔ + +

Terminal-based client.

+ + + + RSS Guard + Windows, macOS, Linux + ✔ + ✔ + +

Very basic client; now discontinued.

+ + + + Tiny Tiny RSS Reader + Windows + ✘ + ✔ + +

Does not deal well with expired sessions; discontinued.

+ + + + + + Mobile + + +
CloudNews + iOS + ✔ + ✘ + +

Very bland looking application, but it functions well.

+ + Fiery Feeds iOS @@ -42,6 +77,40 @@ The Arsse does not at this time have any first party clients. However, because T

Currently keeps showing items in the unread badge which have already been read.

+ + NextCloud News + Android + ✔ + ✘ + +

Official Android client for NextCloud News.

+ + + + OCReader + Android + ✔ + ✘ + + + + Tiny Tiny RSS + Android + ✘ + ✔ + +

Official Android client for Tiny Tiny RSS.

+ + + + TTRSS-Reader + Android + ✘ + ✔ + +

+ + From a467115d599f8f59d91d6e1f0429279326166762 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Mon, 18 Feb 2019 14:40:08 -0500 Subject: [PATCH 10/74] Document TTRSS authentication modes better The different modes can be likened to either multi-user or single-user mode in original --- docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md index a8db4ce..8653969 100644 --- a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md +++ b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md @@ -61,25 +61,31 @@ Tiny Tiny RSS itself is unaware of HTTP authentication: if HTTP authentication i - Clients may optionally provide HTTP credentials - API authentication proceeds as normal - All feed icons are visible to unauthenticated clients + - Analogous to multi-user mode - If the `userHTTPAuthRequired` setting is `true`: - Clients must pass HTTP authentication - API authentication proceeds as normal - Feed icons are visible only to their owners + - Analoguous to multi-user mode with additional HTTP authentication - If the `userSessionEnforced` setting is `false`: - Clients may optionally provide HTTP credentials - If HTTP authentication succeeded API authentication is skipped: tokens are issued upon login, but ignored for HTTP-authenticated requests - All feed icons are visible to unauthenticated clients + - Analogous to single-user mode if using HTTP authentication, and to multi-user mode otherwise - If the `userHTTPAuthRequired` setting is `true` and the `userSessionEnforced` setting is `false`: - Clients must pass HTTP authentication - API authentication is skipped: tokens are issued upon login, but thereafter ignored - Feed icons are visible only to their owners + - Analogous to single-user mode - If the `userPreAuth` setting is `true`: - The Web server asserts HTTP authentication was successful - API authentication only checks that HTTP and API user names match - Feed icons are visible only to their owners + - Analoguous to multi-user mode with additional HTTP authentication - If the `userPreAuth` setting is `true` and the `userSessionEnforced` setting is `false`: - The Web server asserts HTTP authentication was successful - API authentication is skipped: tokens are issued upon login, but thereafter ignored - Feed icons are visible only to their owners + - Analogous to single-user mode In all cases, supplying invalid HTTP credentials will result in a 401 response. From 75cba3ca10903e396dafa2ae5323f231b16ac718 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Wed, 20 Feb 2019 10:02:59 -0500 Subject: [PATCH 11/74] Fix fragment identifiers in manual internal links --- docs/en/020_Installation/040_Database_Setup/000_SQLite.md | 2 +- docs/en/050_Configuring_The_Arsse.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/020_Installation/040_Database_Setup/000_SQLite.md b/docs/en/020_Installation/040_Database_Setup/000_SQLite.md index a8876a1..77bf4b9 100644 --- a/docs/en/020_Installation/040_Database_Setup/000_SQLite.md +++ b/docs/en/020_Installation/040_Database_Setup/000_SQLite.md @@ -1,3 +1,3 @@ -SQLite requires very little setup. By default the database will be created at the root of The Arsse's program directory (e.g. `/usr/share/arsse/arsse.db`), but this can be changed with the [`dbSQLite3File` setting](/en/Configuring_The_Arsse#dbSQLite3File). +SQLite requires very little setup. By default the database will be created at the root of The Arsse's program directory (e.g. `/usr/share/arsse/arsse.db`), but this can be changed with the [`dbSQLite3File` setting](/en/Configuring_The_Arsse#page_dbSQLite3File). Regardless of the location chosen, The Arsse **must** be able to both read from and write to the database file, as well as create files in the directory containing it. This is because SQLite also creates a write-ahead log file and a shared-memory file during operation. diff --git a/docs/en/050_Configuring_The_Arsse.md b/docs/en/050_Configuring_The_Arsse.md index e09111e..f66843c 100644 --- a/docs/en/050_Configuring_The_Arsse.md +++ b/docs/en/050_Configuring_The_Arsse.md @@ -303,7 +303,7 @@ It is also possible to specify the fully-qualified name of a class which impleme The interval the newsfeed fetching service observes between checks for new articles. Note that requests to foreign servers are not necessarily made at this frequency: each newsfeed is assigned its own time at which to be next retrieved. This setting instead defines the length of time the fetching service will sleep between periods of activity. -Consult "[Newsfeed Refresh Schedule](/en/Installation/Using_the_Daemon#Newsfeed_Refresh_Schedule)" for details on how often newsfeeds are fetched. +Consult "[Newsfeed Refresh Schedule](/en/Installation/Using_the_Daemon#page_Newsfeed_Refresh_Schedule)" for details on how often newsfeeds are fetched. ### serviceQueueWidth @@ -393,7 +393,7 @@ If an article is starred by any user, it is retained indefinitely regardless of |----------|--------------------| | interval | `60.0` | -*This setting has been replaced by [dbTimeoutLock](#dbTimeoutLock).* +*This setting has been replaced by [dbTimeoutLock](#page_dbTimeoutLock).* The number of seconds for SQLite to wait before returning a timeout error when trying to acquire a write lock on the database file. Setting this to a low value may cause operations to fail with an error. From 9ef4b4fdfbfad62d4e311a5e3d447d1666d6d7d7 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 1 Mar 2019 12:32:02 -0500 Subject: [PATCH 12/74] Update TT-RSS documentation --- docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md index 8653969..d3f1203 100644 --- a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md +++ b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md @@ -14,7 +14,7 @@ It allows organizing newsfeeds into nested folders, and supports an odd patchwor
API endpoint
/tt-rss/api
Specifications
-
Main, FeedReader extensions, News+ extension
+
Main, search syntax, FeedReader extensions, News+ extension
# Missing features @@ -23,7 +23,6 @@ The Arsse does not currently support the entire protocol. Notably missing featur - The `shareToPublished` operation is not implemented; it returns `UNKNOWN_METHOD` - Setting an article's "published" flag with the `updateArticle` operation is not implemented and will gracefully fail -- The `search` parameter of the `getHeadlines` operation is not implemented; the operation will proceed as if no search string were specified - The `sanitize`, `force_update`, and `has_sandbox` parameters of the `getHeadlines` operation are ignored - String `feed_id` values for the `getCompactHeadlines` operation are not supported and will yield an `INCORRECT_USAGE` error - Articles are limited to a single attachment rather than multiple attachments @@ -35,6 +34,12 @@ The Arsse does not currently support the entire protocol. Notably missing featur - Feed, category, and label names are normally unrestricted; The Arsse rejects empty strings, as well as strings composed solely of whitespace - Discovering multiple feeds during `subscribeToFeed` processing normally produces an error; The Arsse instead chooses the first feed it finds - Providing the `setArticleLabel` operation with an invalid label normally silently fails; The Arsse returns an `INVALID_USAGE` error instead +- Processing of the `search` parameter of the `getHeadlines` operation differs in the following ways: + - Values other than `"true"` or `"false"` for the `unread`, `star`, and `pub` special keywords treat the entire token as a search term rather than as `"false"` + - Invalid dates are ignored rather than assumed to be `"1970-01-01"` + - Only a single negative date is allowed (this is a known bug rather than intentional) + - Dates are always relative to UTC + - Full-text search is not yet employed with any database, including PostgreSQL - Article hashes are normally SHA1; The Arsse uses SHA256 hashes - Article attachments normally have unique IDs; The Arsse always gives attachments an ID of `"0"` - The default sort order of the `getHeadlines` operation normally uses custom sorting for "special" feeds; The Arsse's default sort order is equivalent to `feed_dates` for all feeds From c32fdf59cd2d6e1d8239bf5c127886dbb350b270 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 16 Mar 2019 18:30:00 -0400 Subject: [PATCH 13/74] Add details on HTTP authentication in client list --- docs/en/040_Compatible_Clients.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index 2841fa6..0c62813 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -24,6 +24,7 @@ The Arsse does not at this time have any first party clients. However, because T ✔

Excellent reader; one of the best on any platform.

+

Not compatible with HTTP authentication when using TT-RSS.

@@ -67,6 +68,15 @@ The Arsse does not at this time have any first party clients. However, because T

Very bland looking application, but it functions well.

+ + FeedMe + Android + ✘ + ✔ + +

Not compatible with HTTP authentication.

+ + Fiery Feeds iOS From f50a78eafa6ba70be34d0544f529c729b879a586 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 26 Jul 2019 19:06:02 -0400 Subject: [PATCH 14/74] Add basic Fever data; expand client list Most new clients yet to be tested, but Newsout works fine. --- .../020_Tiny_Tiny_RSS.md | 1 - docs/en/030_Supported_Protocols/030_Fever.md | 22 + docs/en/040_Compatible_Clients.md | 94 ++- vendor-bin/daux/composer.lock | 615 +++++++++++++----- 4 files changed, 560 insertions(+), 172 deletions(-) create mode 100644 docs/en/030_Supported_Protocols/030_Fever.md diff --git a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md index d3f1203..dc896df 100644 --- a/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md +++ b/docs/en/030_Supported_Protocols/020_Tiny_Tiny_RSS.md @@ -42,7 +42,6 @@ The Arsse does not currently support the entire protocol. Notably missing featur - Full-text search is not yet employed with any database, including PostgreSQL - Article hashes are normally SHA1; The Arsse uses SHA256 hashes - Article attachments normally have unique IDs; The Arsse always gives attachments an ID of `"0"` -- The default sort order of the `getHeadlines` operation normally uses custom sorting for "special" feeds; The Arsse's default sort order is equivalent to `feed_dates` for all feeds - The `getCounters` operation normally omits members with zero unread; The Arsse includes everything to appease some clients # Other notes diff --git a/docs/en/030_Supported_Protocols/030_Fever.md b/docs/en/030_Supported_Protocols/030_Fever.md new file mode 100644 index 0000000..08041eb --- /dev/null +++ b/docs/en/030_Supported_Protocols/030_Fever.md @@ -0,0 +1,22 @@ +[TOC] + +# About + +The Fever protocol is a basic protocol which has historically been popular with iOS and macOS clients. + +It allows marking articles as read or starred, but does not allow adding or modifying newsfeeds. Instead of being classified into folders, newfeeds may belong to multiple groups, which do not nest. + +
+
Supported since
+
0.8.0
+
Base URL
+
/fever/
+
API endpoint
+
/fever/?api
+
Specifications
+
"Public beta" (at the Internet Archive)
+
+ +# Differences + +# Interaction with folders diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index 0c62813..af40da6 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -5,51 +5,86 @@ The Arsse does not at this time have any first party clients. However, because T Name OS - Protocol + Protocol Notes Nextcloud News Tiny Tiny RSS + Fever - Desktop + Desktop FeedReader Linux ✔ ✔ + ✘

Excellent reader; one of the best on any platform.

Not compatible with HTTP authentication when using TT-RSS.

+ + FeedTheMonkey + Linux + ✘ + ✔ + ✘ + +

+ + Newsboat Linux, macOS ✔ ✔ + ✘

Terminal-based client.

+ + ReadKit + macOS + ✘ + ✘ + ✔ + +

Requires purchase.

+ + + + Reeder + macOS + ✘ + ✘ + ✔ + +

Also available for iOS.

+ + RSS Guard Windows, macOS, Linux ✔ ✔ + ✘

Very basic client; now discontinued.

- Tiny Tiny RSS Reader + Tiny Tiny RSS Reader Windows ✘ ✔ + ✘

Does not deal well with expired sessions; discontinued.

@@ -57,13 +92,14 @@ The Arsse does not at this time have any first party clients. However, because T - Mobile + Mobile
CloudNews iOS ✔ ✘ + ✘

Very bland looking application, but it functions well.

@@ -73,6 +109,7 @@ The Arsse does not at this time have any first party clients. However, because T Android ✘ ✔ + ✘

Not compatible with HTTP authentication.

@@ -82,16 +119,28 @@ The Arsse does not at this time have any first party clients. However, because T iOS ✘ ✔ + ✔

Rentalware - For the software to be usable (you can't even add feeds otherwise) a subscription fee must be paid.

Currently keeps showing items in the unread badge which have already been read.

+ + Newsout + Android, iOS + ✔ + ✘ + ✘ + +

iOS version only as source code.

+ + NextCloud News Android ✔ ✘ + ✘

Official Android client for NextCloud News.

@@ -101,13 +150,33 @@ The Arsse does not at this time have any first party clients. However, because T Android ✔ ✘ + ✘ + + Readably + Android + ✘ + ✘ + ✔ + + + + Reeder + iOS + ✘ + ✘ + ✔ + +

Also available for macOS.

+ + Tiny Tiny RSS Android ✘ ✔ + ✘

Official Android client for Tiny Tiny RSS.

@@ -117,10 +186,21 @@ The Arsse does not at this time have any first party clients. However, because T Android ✘ ✔ + ✘

+ + Unread + iOS + ✘ + ✘ + ✔ + +

Trialware with one-time purchase.

+ + @@ -131,12 +211,13 @@ The Arsse does not at this time have any first party clients. However, because T Name OS - Protocol + Protocol Notes Nextcloud News Tiny Tiny RSS + Fever @@ -145,9 +226,10 @@ The Arsse does not at this time have any first party clients. However, because T iOS ✘ ✔ + ✘

Does not support HTTP authentication.

- \ No newline at end of file + diff --git a/vendor-bin/daux/composer.lock b/vendor-bin/daux/composer.lock index 6adb1a1..b422d75 100644 --- a/vendor-bin/daux/composer.lock +++ b/vendor-bin/daux/composer.lock @@ -8,29 +8,29 @@ "packages": [ { "name": "daux/daux.io", - "version": "0.8.1", + "version": "0.9.3", "source": { "type": "git", "url": "https://github.com/dauxio/daux.io.git", - "reference": "7d8d5c86cfce682166bb55bc2298f2658c75cdc3" + "reference": "dbfb4cf70dd35259dc112356109e726532127595" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dauxio/daux.io/zipball/7d8d5c86cfce682166bb55bc2298f2658c75cdc3", - "reference": "7d8d5c86cfce682166bb55bc2298f2658c75cdc3", + "url": "https://api.github.com/repos/dauxio/daux.io/zipball/dbfb4cf70dd35259dc112356109e726532127595", + "reference": "dbfb4cf70dd35259dc112356109e726532127595", "shasum": "" }, "require": { "guzzlehttp/guzzle": "~6.0", - "league/commonmark": "^0.17", + "league/commonmark": "^0.18", "league/plates": "~3.1", "myclabs/deep-copy": "^1.5", "php": ">=7.1.3", "symfony/console": "^4.0", "symfony/http-foundation": "^4.0", - "symfony/polyfill-intl-icu": "^1.9", + "symfony/polyfill-intl-icu": "^1.10", "symfony/process": "^4.0", - "webuni/commonmark-table-extension": "0.8.*", + "webuni/commonmark-table-extension": "0.9.*", "webuni/front-matter": "^1.0.0" }, "replace": { @@ -38,7 +38,7 @@ }, "require-dev": { "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "~7.3" + "phpunit/phpunit": "~7.4" }, "suggest": { "ext-intl": "Allows to translate the modified at date" @@ -74,7 +74,7 @@ "markdown", "md" ], - "time": "2018-10-01T20:25:59+00:00" + "time": "2019-07-09T19:16:05+00:00" }, { "name": "guzzlehttp/guzzle", @@ -194,33 +194,37 @@ }, { "name": "guzzlehttp/psr7", - "version": "1.5.2", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "9f83dded91781a01c63574e387eaa769be769115" + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", - "reference": "9f83dded91781a01c63574e387eaa769be769115", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", "shasum": "" }, "require": { "php": ">=5.4.0", "psr/http-message": "~1.0", - "ralouphie/getallheaders": "^2.0.5" + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" }, "provide": { "psr/http-message-implementation": "1.0" }, "require-dev": { + "ext-zlib": "*", "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.5-dev" + "dev-master": "1.6-dev" } }, "autoload": { @@ -257,20 +261,20 @@ "uri", "url" ], - "time": "2018-12-04T20:46:45+00:00" + "time": "2019-07-01T23:21:34+00:00" }, { "name": "league/commonmark", - "version": "0.17.5", + "version": "0.18.5", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369" + "reference": "f94e18d68260f43a7d846279cad88405854b1306" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/82d7ab62d7f68391cb9d323f3ccce50be24a5369", - "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/f94e18d68260f43a7d846279cad88405854b1306", + "reference": "f94e18d68260f43a7d846279cad88405854b1306", "shasum": "" }, "require": { @@ -286,7 +290,7 @@ "erusev/parsedown": "~1.0", "michelf/php-markdown": "~1.4", "mikehaertl/php-shellcommand": "^1.2", - "phpunit/phpunit": "^5.7|^6.5", + "phpunit/phpunit": "^5.7.27|^6.5.14", "scrutinizer/ocular": "^1.1", "symfony/finder": "^3.0|^4.0" }, @@ -299,7 +303,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.18-dev" + "dev-master": "0.19-dev" } }, "autoload": { @@ -319,14 +323,14 @@ "role": "Lead Developer" } ], - "description": "Markdown parser for PHP based on the CommonMark spec", + "description": "PHP Markdown parser based on the CommonMark spec", "homepage": "https://github.com/thephpleague/commonmark", "keywords": [ "commonmark", "markdown", "parser" ], - "time": "2018-03-29T14:35:19+00:00" + "time": "2019-03-28T13:52:31+00:00" }, { "name": "league/plates", @@ -385,16 +389,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.8.1", + "version": "1.9.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", - "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", + "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72", "shasum": "" }, "require": { @@ -429,7 +433,56 @@ "object", "object graph" ], - "time": "2018-06-11T23:09:50+00:00" + "time": "2019-04-07T13:18:21+00:00" + }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" }, { "name": "psr/http-message", @@ -483,24 +536,24 @@ }, { "name": "ralouphie/getallheaders", - "version": "2.0.5", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" + "reference": "120b605dfeb996808c31b6477290a714d356e822" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", - "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", "shasum": "" }, "require": { - "php": ">=5.3" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "~3.7.0", - "satooshi/php-coveralls": ">=1.0" + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" }, "type": "library", "autoload": { @@ -519,41 +572,47 @@ } ], "description": "A polyfill for getallheaders.", - "time": "2016-02-11T07:05:27+00:00" + "time": "2019-03-08T08:55:37+00:00" }, { "name": "symfony/console", - "version": "v4.2.2", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522" + "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", - "reference": "b0a03c1bb0fcbe288629956cf2f1dd3f1dc97522", + "url": "https://api.github.com/repos/symfony/console/zipball/b592b26a24265a35172d8a2094d8b10f22b7cc39", + "reference": "b592b26a24265a35172d8a2094d8b10f22b7cc39", "shasum": "" }, "require": { "php": "^7.1.3", - "symfony/contracts": "^1.0", - "symfony/polyfill-mbstring": "~1.0" + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/service-contracts": "^1.1" }, "conflict": { "symfony/dependency-injection": "<3.4", + "symfony/event-dispatcher": "<4.3", "symfony/process": "<3.3" }, + "provide": { + "psr/log-implementation": "1.0" + }, "require-dev": { "psr/log": "~1.0", "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/event-dispatcher": "^4.3", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.4|~4.0" + "symfony/process": "~3.4|~4.0", + "symfony/var-dumper": "^4.3" }, "suggest": { - "psr/log-implementation": "For using the console logger", + "psr/log": "For using the console logger", "symfony/event-dispatcher": "", "symfony/lock": "", "symfony/process": "" @@ -561,7 +620,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -588,92 +647,25 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2019-01-04T15:13:53+00:00" - }, - { - "name": "symfony/contracts", - "version": "v1.0.2", - "source": { - "type": "git", - "url": "https://github.com/symfony/contracts.git", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", - "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", - "shasum": "" - }, - "require": { - "php": "^7.1.3" - }, - "require-dev": { - "psr/cache": "^1.0", - "psr/container": "^1.0" - }, - "suggest": { - "psr/cache": "When using the Cache contracts", - "psr/container": "When using the Service contracts", - "symfony/cache-contracts-implementation": "", - "symfony/service-contracts-implementation": "", - "symfony/translation-contracts-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\": "" - }, - "exclude-from-classmap": [ - "**/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A set of abstractions extracted out of the Symfony components", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "time": "2018-12-05T08:06:11+00:00" + "time": "2019-06-13T11:03:18+00:00" }, { "name": "symfony/http-foundation", - "version": "v4.2.2", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "a633d422a09242064ba24e44a6e1494c5126de86" + "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a633d422a09242064ba24e44a6e1494c5126de86", - "reference": "a633d422a09242064ba24e44a6e1494c5126de86", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e1b507fcfa4e87d192281774b5ecd4265370180d", + "reference": "e1b507fcfa4e87d192281774b5ecd4265370180d", "shasum": "" }, "require": { "php": "^7.1.3", + "symfony/mime": "^4.3", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { @@ -683,7 +675,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -710,20 +702,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2019-01-05T16:37:49+00:00" + "time": "2019-06-26T09:25:00+00:00" }, { "name": "symfony/intl", - "version": "v4.2.2", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/intl.git", - "reference": "9bc515dfd1f02bcf64309ab5fd86bace4f43b86d" + "reference": "ae61816fdc00809928bb45ebc5df593d7e0878ad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/intl/zipball/9bc515dfd1f02bcf64309ab5fd86bace4f43b86d", - "reference": "9bc515dfd1f02bcf64309ab5fd86bace4f43b86d", + "url": "https://api.github.com/repos/symfony/intl/zipball/ae61816fdc00809928bb45ebc5df593d7e0878ad", + "reference": "ae61816fdc00809928bb45ebc5df593d7e0878ad", "shasum": "" }, "require": { @@ -739,7 +731,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -785,20 +777,79 @@ "l10n", "localization" ], - "time": "2019-01-05T16:37:49+00:00" + "time": "2019-06-17T17:37:00+00:00" + }, + { + "name": "symfony/mime", + "version": "v4.3.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/ec2c5565de60e03f33d4296a655e3273f0ad1f8b", + "reference": "ec2c5565de60e03f33d4296a655e3273f0ad1f8b", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "egulias/email-validator": "^2.0", + "symfony/dependency-injection": "~3.4|^4.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.3-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A library to manipulate MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2019-06-04T09:22:54+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" + "reference": "82ebae02209c21113908c229e9883c419720738a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", - "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", + "reference": "82ebae02209c21113908c229e9883c419720738a", "shasum": "" }, "require": { @@ -810,7 +861,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -832,7 +883,7 @@ }, { "name": "Gert de Pagter", - "email": "backendtea@gmail.com" + "email": "BackEndTea@gmail.com" } ], "description": "Symfony polyfill for ctype functions", @@ -843,20 +894,20 @@ "polyfill", "portable" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "f22a90256d577c7ef7efad8df1f0201663d57644" + "reference": "999878a3a09d73cae157b0cf89bb6fb2cc073057" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/f22a90256d577c7ef7efad8df1f0201663d57644", - "reference": "f22a90256d577c7ef7efad8df1f0201663d57644", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/999878a3a09d73cae157b0cf89bb6fb2cc073057", + "reference": "999878a3a09d73cae157b0cf89bb6fb2cc073057", "shasum": "" }, "require": { @@ -901,20 +952,82 @@ "portable", "shim" ], - "time": "2018-08-06T14:22:27+00:00" + "time": "2019-01-07T19:39:47+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "reference": "c766e95bec706cdd89903b1eda8afab7d7a6b7af", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-mbstring": "^1.3", + "symfony/polyfill-php72": "^1.9" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2019-03-04T13:44:35+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.10.0", + "version": "v1.11.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", - "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", + "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", "shasum": "" }, "require": { @@ -926,7 +1039,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.9-dev" + "dev-master": "1.11-dev" } }, "autoload": { @@ -960,20 +1073,133 @@ "portable", "shim" ], - "time": "2018-09-21T13:07:52+00:00" + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "reference": "ab50dcf166d5f577978419edd37aa2bb8eabce0c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "reference": "d1fb4abcc0c47be136208ad9d68bf59f1ee17abd", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2019-02-06T07:57:58+00:00" }, { "name": "symfony/process", - "version": "v4.2.2", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a" + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ea043ab5d8ed13b467a9087d81cb876aee7f689a", - "reference": "ea043ab5d8ed13b467a9087d81cb876aee7f689a", + "url": "https://api.github.com/repos/symfony/process/zipball/856d35814cf287480465bb7a6c413bb7f5f5e69c", + "reference": "856d35814cf287480465bb7a6c413bb7f5f5e69c", "shasum": "" }, "require": { @@ -982,7 +1208,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -1009,20 +1235,78 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2019-01-03T14:48:52+00:00" + "time": "2019-05-30T16:10:05+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v1.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", + "reference": "f391a00de78ec7ec8cf5cdcdae59ec7b883edb8d", + "shasum": "" + }, + "require": { + "php": "^7.1.3", + "psr/container": "^1.0" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2019-06-13T11:15:36+00:00" }, { "name": "symfony/yaml", - "version": "v4.2.2", + "version": "v4.3.2", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6" + "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/d0aa6c0ea484087927b49fd513383a7d36190ca6", - "reference": "d0aa6c0ea484087927b49fd513383a7d36190ca6", + "url": "https://api.github.com/repos/symfony/yaml/zipball/c60ecf5ba842324433b46f58dc7afc4487dbab99", + "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99", "shasum": "" }, "require": { @@ -1041,7 +1325,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "4.3-dev" } }, "autoload": { @@ -1068,24 +1352,24 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2019-01-03T09:07:35+00:00" + "time": "2019-04-06T14:04:46+00:00" }, { "name": "webuni/commonmark-table-extension", - "version": "0.8.0", + "version": "0.9.0", "source": { "type": "git", "url": "https://github.com/webuni/commonmark-table-extension.git", - "reference": "4304b1f56b26e5213a4a781b654f62ef5ed8fbe3" + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/4304b1f56b26e5213a4a781b654f62ef5ed8fbe3", - "reference": "4304b1f56b26e5213a4a781b654f62ef5ed8fbe3", + "url": "https://api.github.com/repos/webuni/commonmark-table-extension/zipball/94bc98d802d0b706e748716854e5fa0bd3644df3", + "reference": "94bc98d802d0b706e748716854e5fa0bd3644df3", "shasum": "" }, "require": { - "league/commonmark": "^0.16|^0.17", + "league/commonmark": "^0.16|^0.17|^0.18", "php": "^5.6|^7.0" }, "require-dev": { @@ -1097,7 +1381,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "0.8-dev" + "dev-master": "0.9-dev" } }, "autoload": { @@ -1126,7 +1410,8 @@ "markdown", "table" ], - "time": "2018-01-24T12:30:02+00:00" + "abandoned": "league/commonmark-ext-table", + "time": "2018-11-28T11:29:11+00:00" }, { "name": "webuni/front-matter", From 85fa1e48ab2416c7e6d3d023ef9de69bedb3ef23 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Fri, 26 Jul 2019 19:43:52 -0400 Subject: [PATCH 15/74] Add Fever to list of protocols --- docs/en/030_Supported_Protocols/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/030_Supported_Protocols/index.md b/docs/en/030_Supported_Protocols/index.md index 4df46b3..6124960 100644 --- a/docs/en/030_Supported_Protocols/index.md +++ b/docs/en/030_Supported_Protocols/index.md @@ -2,5 +2,6 @@ The Arsse was designed from the start as a server for multiple synchronization p - [NextCloud News](NextCloud_News) - [Tiny Tiny RSS](Tiny_Tiny_RSS) +- [Fever](Fever) -The protocols are merely different ways of accessing and manipulating the same data: subscribing to a newsfeed using one protocol will see the newsfeed also present when later connecting via another protocol, for example. Because not all protocols work according to the same concepts, sometimes the interactions between them are not obvious. These interactions are documented here when warranted. +The protocols are merely different ways of accessing and manipulating the same data: subscribing to a newsfeed using one protocol will see the newsfeed also present when later connecting via another protocol, for example. Because not all protocols work according to the same concepts, however, sometimes the interactions between them are not obvious. These interactions are documented here when warranted. From 8a184ae99dbc43da883e71d4edce3f9cd1ab41fe Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 27 Jul 2019 12:15:19 -0400 Subject: [PATCH 16/74] Move inline style rules out to a stylesheet --- docs/en/040_Compatible_Clients.md | 178 +++++++++++++++++------------- 1 file changed, 104 insertions(+), 74 deletions(-) diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index af40da6..b68bf9b 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -1,17 +1,45 @@ The Arsse does not at this time have any first party clients. However, because The Arsse supports other protocols, most clients built for NextCloud News and Tiny Tiny RSS are compatible with The Arsse. Below are a few that we personally know of and have tested with The Arsse. - + +
- - - - + + + + - - - + + + @@ -21,9 +49,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + - - - + + + @@ -42,9 +70,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -52,9 +80,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -62,9 +90,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -72,9 +100,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -82,9 +110,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -97,9 +125,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -107,9 +135,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -117,9 +145,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + - - - + + + @@ -138,9 +166,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -148,25 +176,27 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + - - - - + + + + - - - + + + @@ -174,9 +204,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -184,9 +214,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -194,9 +224,9 @@ The Arsse does not at this time have any first party clients. However, because T - - - + + + @@ -206,27 +236,27 @@ The Arsse does not at this time have any first party clients. However, because T ## Known Incompatible Clients -
NameOSProtocolNotesNameOSProtocolNotes
Nextcloud NewsTiny Tiny RSSFeverNextcloud NewsTiny Tiny RSSFever
FeedReader Linux

Excellent reader; one of the best on any platform.

Not compatible with HTTP authentication when using TT-RSS.

@@ -32,9 +60,9 @@ The Arsse does not at this time have any first party clients. However, because T
FeedTheMonkey Linux

Newsboat Linux, macOS

Terminal-based client.

ReadKit macOS

Requires purchase.

Reeder macOS

Also available for iOS.

RSS Guard Windows, macOS, Linux

Very basic client; now discontinued.

Tiny Tiny RSS Reader Windows

Does not deal well with expired sessions; discontinued.

CloudNews iOS

Very bland looking application, but it functions well.

FeedMe Android

Not compatible with HTTP authentication.

Fiery Feeds iOS

Rentalware - For the software to be usable (you can't even add feeds otherwise) a subscription fee must be paid.

Currently keeps showing items in the unread badge which have already been read.

@@ -128,9 +156,9 @@ The Arsse does not at this time have any first party clients. However, because T
Newsout Android, iOS

iOS version only as source code.

NextCloud News Android

Official Android client for NextCloud News.

OCReader Android
Readably Android +

Fetches favicons independently.

+
Reeder iOS

Also available for macOS.

Tiny Tiny RSS Android

Official Android client for Tiny Tiny RSS.

TTRSS-Reader Android

Unread iOS

Trialware with one-time purchase.

+
- - - - + + + + - - - + + + - - - + + + From f0c99edd22377d8544cff2144d3a05e0883354af Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 27 Jul 2019 17:36:41 -0400 Subject: [PATCH 17/74] Various corrections --- docs/en/010_About.md | 10 +++++++--- docs/en/030_Supported_Protocols/010_NextCloud_News.md | 2 +- docs/en/030_Supported_Protocols/030_Fever.md | 2 +- docs/en/040_Compatible_Clients.md | 2 +- docs/en/050_Configuring_The_Arsse.md | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/en/010_About.md b/docs/en/010_About.md index 67edc4b..08fa98e 100644 --- a/docs/en/010_About.md +++ b/docs/en/010_About.md @@ -1,6 +1,10 @@ -The Arsse is a news aggregator server which implements multiple synchronization protocols, including [version 1.2](https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md) of [NextCloud News](https://github.com/nextcloud/news)' protocol and the [Tiny Tiny RSS](https://git.tt-rss.org/git/tt-rss/wiki/ApiReference) protocol (details below). Unlike most other aggregator servers, The Arsse does not include a Web front-end (though one is planned as a separate project), and it relies on existing protocols to maximize compatibility with existing clients. +The Arsse is a news aggregator server which implements multiple synchronization protocols. Unlike most other aggregator servers, The Arsse does not include a Web front-end (though one is planned as a separate project), and it relies on existing protocols to maximize compatibility with existing clients. Supported protocols are: -At present the software should be considered in an "alpha" state: though its core subsystems are covered by unit tests and should be free of major bugs, not everything has been rigorously tested. Additionally, many features one would expect from other similar software have yet to be implemented. Areas of future work include: +- [NextCloud News](https://github.com/nextcloud/news/blob/master/docs/externalapi/Legacy.md) +- [Tiny Tiny RSS](https://git.tt-rss.org/git/tt-rss/wiki/ApiReference) +- [Fever](https://web.archive.org/web/20161217042229/https://feedafever.com/api) -- Providing more sync protocols (Google Reader, Fever, others) +At present the software should be considered in an "alpha" state: many features one would expect from other similar software have yet to be implemented. Areas of future work include: + +- Providing more sync protocols (Google Reader, others) - Better packaging and configuration samples diff --git a/docs/en/030_Supported_Protocols/010_NextCloud_News.md b/docs/en/030_Supported_Protocols/010_NextCloud_News.md index e1c46b5..a7b814f 100644 --- a/docs/en/030_Supported_Protocols/010_NextCloud_News.md +++ b/docs/en/030_Supported_Protocols/010_NextCloud_News.md @@ -36,4 +36,4 @@ It allows organizing newsfeeds into single-level folders, and supports a wide ra # Interaction with nested folders -Tiny Tiny RSS is unique in allowing newsfeeds to be grouped into folders nested to arbitrary depth. When nesfeeds are placed into nested folders, they simply appear in the top-level folder when accessed via the NextCloud News protocol. +Tiny Tiny RSS is unique in allowing newsfeeds to be grouped into folders nested to arbitrary depth. When newsfeeds are placed into nested folders, they simply appear in the top-level folder when accessed via the NextCloud News protocol. diff --git a/docs/en/030_Supported_Protocols/030_Fever.md b/docs/en/030_Supported_Protocols/030_Fever.md index 08041eb..87e6a6c 100644 --- a/docs/en/030_Supported_Protocols/030_Fever.md +++ b/docs/en/030_Supported_Protocols/030_Fever.md @@ -4,7 +4,7 @@ The Fever protocol is a basic protocol which has historically been popular with iOS and macOS clients. -It allows marking articles as read or starred, but does not allow adding or modifying newsfeeds. Instead of being classified into folders, newfeeds may belong to multiple groups, which do not nest. +It allows marking articles as read or starred, but does not allow adding or modifying newsfeeds. Moreover, instead of being classified into folders, newfeeds may belong to multiple groups, which do not nest.
Supported since
diff --git a/docs/en/040_Compatible_Clients.md b/docs/en/040_Compatible_Clients.md index b68bf9b..50718660 100644 --- a/docs/en/040_Compatible_Clients.md +++ b/docs/en/040_Compatible_Clients.md @@ -1,4 +1,4 @@ -The Arsse does not at this time have any first party clients. However, because The Arsse supports other protocols, most clients built for NextCloud News and Tiny Tiny RSS are compatible with The Arsse. Below are a few that we personally know of and have tested with The Arsse. +The Arsse does not at this time have any first party clients. However, because The Arsse [supports existing protocols](/en/Supported_Protocols), most clients built for these protocols are compatible with The Arsse. Below are those that we personally know of and have tested with The Arsse. ",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[e],starts:{e:"<\/script>",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},e]}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}}); \ No newline at end of file diff --git a/package.json b/package.json index d1ced76..5cc02a6 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,13 @@ { "devDependencies": { - "postcss-cli": "^6.1.3", - "postcss-custom-media": "^7.0.8", - "postcss-import": "^12.0.1", - "postcss-media-minmax": "^4.0.0", "autoprefixer": "^9.6.1", + "postcss-cli": "^6.1.3", "postcss-csso": "^3.0.0", + "postcss-custom-media": "^7.0.8", "postcss-custom-properties": "^9.0.2", "postcss-discard-comments": "^4.0.2", - "postcss-mixins": "^6.2.2", + "postcss-import": "^12.0.1", + "postcss-media-minmax": "^4.0.0", "postcss-nested": "^4.1.2", "postcss-sassy-mixins": "^2.1.0", "postcss-scss": "^2.0.0" diff --git a/vendor-bin/robo/composer.json b/vendor-bin/robo/composer.json index 38be501..8cba849 100644 --- a/vendor-bin/robo/composer.json +++ b/vendor-bin/robo/composer.json @@ -3,5 +3,8 @@ "consolidation/robo": "^1.1", "pear/archive_tar": "^1.4", "symfony/process": "^3.0" + }, + "require-dev": { + "splitbrain/php-archive": "^1.1" } } diff --git a/vendor-bin/robo/composer.lock b/vendor-bin/robo/composer.lock index a544acc..76036f8 100644 --- a/vendor-bin/robo/composer.lock +++ b/vendor-bin/robo/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "87a37068875d67919f797af9dc08e108", + "content-hash": "0f7d93d4c470b72b0f6f0bc0317d603f", "packages": [ { "name": "consolidation/annotated-command", @@ -1734,7 +1734,62 @@ "time": "2019-04-06T14:04:46+00:00" } ], - "packages-dev": [], + "packages-dev": [ + { + "name": "splitbrain/php-archive", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/splitbrain/php-archive.git", + "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/10d89013572ba1f4d4ad7fcb74860242f4c3860b", + "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "require-dev": { + "ext-bz2": "*", + "ext-zip": "*", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": "^4.8" + }, + "suggest": { + "ext-iconv": "Used for proper filename encode handling", + "ext-mbstring": "Can be used alternatively for handling filename encoding" + }, + "type": "library", + "autoload": { + "psr-4": { + "splitbrain\\PHPArchive\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Gohr", + "email": "andi@splitbrain.org" + } + ], + "description": "Pure-PHP implementation to read and write TAR and ZIP archives", + "keywords": [ + "archive", + "extract", + "tar", + "unpack", + "unzip", + "zip" + ], + "time": "2018-09-09T12:13:53+00:00" + } + ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], diff --git a/yarn.lock b/yarn.lock index d846caf..0eefa8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -109,7 +109,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-union@^1.0.1, array-union@^1.0.2: +array-union@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= @@ -126,11 +126,6 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -254,11 +249,6 @@ callsites@^2.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -494,14 +484,6 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -dir-glob@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" - integrity sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag== - dependencies: - arrify "^1.0.1" - path-type "^3.0.0" - dir-glob@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" @@ -593,7 +575,7 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -fast-glob@^2.0.2, fast-glob@^2.2.6: +fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== @@ -723,7 +705,7 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3: +glob@^7.1.3: version "7.1.4" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== @@ -735,19 +717,6 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -globby@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.2.tgz#5697619ccd95c5275dbb2d6faa42087c1a941d8d" - integrity sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w== - dependencies: - array-union "^1.0.1" - dir-glob "2.0.0" - fast-glob "^2.0.2" - glob "^7.1.2" - ignore "^3.3.5" - pify "^3.0.0" - slash "^1.0.0" - globby@^9.0.0: version "9.2.0" resolved "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d" @@ -834,11 +803,6 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== - ignore@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" @@ -1606,14 +1570,6 @@ postcss-import@^12.0.1: read-cache "^1.0.0" resolve "^1.1.7" -postcss-js@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-2.0.2.tgz#a5e75d3fb9d85b28e1d2bd57956c115665ea8542" - integrity sha512-HxXLw1lrczsbVXxyC+t/VIfje9ZeZhkkXE8KpFa3MEKfp2FyHDv29JShYY9eLhYrhLyWWHNIuwkktTfLXu2otw== - dependencies: - camelcase-css "^2.0.1" - postcss "^7.0.17" - postcss-load-config@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" @@ -1629,17 +1585,6 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" -postcss-mixins@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/postcss-mixins/-/postcss-mixins-6.2.2.tgz#3acea63271e2c75db62fb80bc1c29e1a609a4742" - integrity sha512-QqEZamiAMguYR6d2h73XXEHZgkxs03PlbU0PqgqtdCnbRlMLFNQgsfL/Td0rjIe2SwpLXOQyB9uoiLWa4GR7tg== - dependencies: - globby "^8.0.1" - postcss "^7.0.17" - postcss-js "^2.0.2" - postcss-simple-vars "^5.0.2" - sugarss "^2.0.0" - postcss-nested@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-4.1.2.tgz#8e0570f736bfb4be5136e31901bf2380b819a561" @@ -1690,13 +1635,6 @@ postcss-simple-vars@^1.2.0: dependencies: postcss "^5.0.13" -postcss-simple-vars@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-simple-vars/-/postcss-simple-vars-5.0.2.tgz#e2f81b3d0847ddd4169816b6d141b91d51e6e22e" - integrity sha512-xWIufxBoINJv6JiLb7jl5oElgp+6puJwvT5zZHliUSydoLz4DADRB3NDDsYgfKVwojn4TDLiseoC65MuS8oGGg== - dependencies: - postcss "^7.0.14" - postcss-value-parser@^3.2.3: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" @@ -1929,11 +1867,6 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -2063,13 +1996,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -sugarss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" - integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== - dependencies: - postcss "^7.0.2" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" From b514ac983b61b1ec86510d0523bb4b4d24beebc8 Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 3 Aug 2019 21:32:13 -0400 Subject: [PATCH 43/74] Rely on Zip extension for extracting highlight.js --- RoboFile.php | 79 +++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/RoboFile.php b/RoboFile.php index fb81a5c..7651a01 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -1,7 +1,6 @@ taskExec($postcss)->arg($scss)->option("-o", $css); // download highlight.js - $t->addCode(function() use ($tmp, $themeout) { - $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; - $post = http_build_query((function($langs) { - $out = []; - foreach($langs as $l) { - $out[$l.".js"] = "on"; + if (extension_loaded("zip")) { + $t->addCode(function() use ($tmp, $themeout) { + $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; + $post = http_build_query((function($langs) { + $out = []; + foreach($langs as $l) { + $out[$l.".js"] = "on"; + } + return $out; + })($languages)); + $conn = @fopen("https://highlightjs.org/download/", "r"); + if ($conn === false) { + throw new Exception("Unable to download Highlight.js"); } - return $out; - })($languages)); - $conn = fopen("https://highlightjs.org/download/", "r"); - if ($conn === false) { - throw new Exception("Unable to download Highlight.js"); - } - foreach (stream_get_meta_data($conn)['wrapper_data'] as $field) { - if (preg_match("/^Set-Cookie: csrftoken=([^;]+)/i", $field, $cookie)) { - break; + foreach (stream_get_meta_data($conn)['wrapper_data'] as $field) { + if (preg_match("/^Set-Cookie: csrftoken=([^;]+)/i", $field, $cookie)) { + break; + } } - } - $token = stream_get_contents($conn); - preg_match("/ [ - 'method' => "POST", - 'content' => $post, - 'header' => [ - "Referer: https://highlightjs.org/download/", - "Cookie: csrftoken={$cookie[1]}", - "Content-Type: application/x-www-form-urlencoded", - ], - ]])); - if ($hljs === false) { - throw new Exception("Unable to download Highlight.js"); - } else { - file_put_contents($tmp."highlightjs.zip", $hljs); - } - $z = new Zip; - $z->open($tmp."highlightjs.zip"); - $z->extract($themeout, "", "", "highlight.pack.js"); - }, "downloadHighlightjs"); + $token = stream_get_contents($conn); + preg_match("/ [ + 'method' => "POST", + 'content' => $post, + 'header' => [ + "Referer: https://highlightjs.org/download/", + "Cookie: csrftoken={$cookie[1]}", + "Content-Type: application/x-www-form-urlencoded", + ], + ]])); + if ($hljs === false) { + throw new Exception("Unable to download Highlight.js"); + } else { + file_put_contents($tmp."highlightjs.zip", $hljs); + } + $z = new \ZipArchive; + $z->open($tmp."highlightjs.zip"); + $z->extractTo($themeout, "highlight.pack.js"); + }, "downloadHighlightjs"); + } else { + $this->say("Zip extension not installed; not updating hightlight.js"); + } // execute the collection return $t->run(); } From b3566f8d48ec43d4dba469ee23de586ac59f958d Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sat, 3 Aug 2019 22:06:57 -0400 Subject: [PATCH 44/74] Use Robo to extract zip archive --- RoboFile.php | 79 +++++++++++++++++------------------ vendor-bin/robo/composer.json | 1 - vendor-bin/robo/composer.lock | 59 +------------------------- 3 files changed, 40 insertions(+), 99 deletions(-) diff --git a/RoboFile.php b/RoboFile.php index 7651a01..4e5e306 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -208,49 +208,46 @@ class RoboFile extends \Robo\Tasks { // compile the stylesheet $t->taskExec($postcss)->arg($scss)->option("-o", $css); // download highlight.js - if (extension_loaded("zip")) { - $t->addCode(function() use ($tmp, $themeout) { - $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; - $post = http_build_query((function($langs) { - $out = []; - foreach($langs as $l) { - $out[$l.".js"] = "on"; - } - return $out; - })($languages)); - $conn = @fopen("https://highlightjs.org/download/", "r"); - if ($conn === false) { - throw new Exception("Unable to download Highlight.js"); + $t->addCode(function() use ($tmp, $themeout) { + $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; + $post = http_build_query((function($langs) { + $out = []; + foreach($langs as $l) { + $out[$l.".js"] = "on"; } - foreach (stream_get_meta_data($conn)['wrapper_data'] as $field) { - if (preg_match("/^Set-Cookie: csrftoken=([^;]+)/i", $field, $cookie)) { - break; - } + return $out; + })($languages)); + $conn = @fopen("https://highlightjs.org/download/", "r"); + if ($conn === false) { + throw new Exception("Unable to download Highlight.js"); + } + foreach (stream_get_meta_data($conn)['wrapper_data'] as $field) { + if (preg_match("/^Set-Cookie: csrftoken=([^;]+)/i", $field, $cookie)) { + break; } - $token = stream_get_contents($conn); - preg_match("/ [ - 'method' => "POST", - 'content' => $post, - 'header' => [ - "Referer: https://highlightjs.org/download/", - "Cookie: csrftoken={$cookie[1]}", - "Content-Type: application/x-www-form-urlencoded", - ], - ]])); - if ($hljs === false) { - throw new Exception("Unable to download Highlight.js"); - } else { - file_put_contents($tmp."highlightjs.zip", $hljs); - } - $z = new \ZipArchive; - $z->open($tmp."highlightjs.zip"); - $z->extractTo($themeout, "highlight.pack.js"); - }, "downloadHighlightjs"); - } else { - $this->say("Zip extension not installed; not updating hightlight.js"); - } + } + $token = stream_get_contents($conn); + preg_match("/ [ + 'method' => "POST", + 'content' => $post, + 'header' => [ + "Referer: https://highlightjs.org/download/", + "Cookie: csrftoken={$cookie[1]}", + "Content-Type: application/x-www-form-urlencoded", + ], + ]])); + if ($hljs === false) { + throw new Exception("Unable to download Highlight.js"); + } else { + file_put_contents($tmp."highlightjs.zip", $hljs); + } + $this->taskExtract($tmp."highlightjs.zip")->to($tmp."hljs")->run(); + $this->taskFilesystemStack()->copy($tmp."hljs/highlight.pack.js", $themeout."/highlight.pack.js")->run(); + }, "downloadHighlightjs"); + // copy JavaScript files from the Daux theme + # TODO // execute the collection return $t->run(); } diff --git a/vendor-bin/robo/composer.json b/vendor-bin/robo/composer.json index 8cba849..58e4932 100644 --- a/vendor-bin/robo/composer.json +++ b/vendor-bin/robo/composer.json @@ -5,6 +5,5 @@ "symfony/process": "^3.0" }, "require-dev": { - "splitbrain/php-archive": "^1.1" } } diff --git a/vendor-bin/robo/composer.lock b/vendor-bin/robo/composer.lock index 76036f8..33c71e2 100644 --- a/vendor-bin/robo/composer.lock +++ b/vendor-bin/robo/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0f7d93d4c470b72b0f6f0bc0317d603f", + "content-hash": "d95cf402fed434140db8ae87c3c8bf32", "packages": [ { "name": "consolidation/annotated-command", @@ -1734,62 +1734,7 @@ "time": "2019-04-06T14:04:46+00:00" } ], - "packages-dev": [ - { - "name": "splitbrain/php-archive", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/splitbrain/php-archive.git", - "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/splitbrain/php-archive/zipball/10d89013572ba1f4d4ad7fcb74860242f4c3860b", - "reference": "10d89013572ba1f4d4ad7fcb74860242f4c3860b", - "shasum": "" - }, - "require": { - "php": ">=5.4" - }, - "require-dev": { - "ext-bz2": "*", - "ext-zip": "*", - "mikey179/vfsstream": "^1.6", - "phpunit/phpunit": "^4.8" - }, - "suggest": { - "ext-iconv": "Used for proper filename encode handling", - "ext-mbstring": "Can be used alternatively for handling filename encoding" - }, - "type": "library", - "autoload": { - "psr-4": { - "splitbrain\\PHPArchive\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Andreas Gohr", - "email": "andi@splitbrain.org" - } - ], - "description": "Pure-PHP implementation to read and write TAR and ZIP archives", - "keywords": [ - "archive", - "extract", - "tar", - "unpack", - "unzip", - "zip" - ], - "time": "2018-09-09T12:13:53+00:00" - } - ], + "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], From 6f8182b94077e6c3f92a22b300c371ce67f0f2ce Mon Sep 17 00:00:00 2001 From: "J. King" Date: Sun, 4 Aug 2019 10:57:05 -0400 Subject: [PATCH 45/74] Working theme builder --- RoboFile.php | 28 ++++--- docs/config.json | 2 + docs/theme/arsse/config.json | 11 +++ docs/theme/arsse/daux.js | 98 +++++++++++++++++++++++ docs/theme/arsse/jquery.min.js | 5 ++ docs/theme/daux/js/html5shiv-3.7.3.min.js | 4 + 6 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 docs/theme/arsse/config.json create mode 100644 docs/theme/arsse/daux.js create mode 100644 docs/theme/arsse/jquery.min.js create mode 100644 docs/theme/daux/js/html5shiv-3.7.3.min.js diff --git a/RoboFile.php b/RoboFile.php index 4e5e306..3ac09f6 100644 --- a/RoboFile.php +++ b/RoboFile.php @@ -196,20 +196,30 @@ class RoboFile extends \Robo\Tasks { */ public function manualTheme(array $args): Result { $postcss = escapeshellarg(realpath(self::BASE."node_modules/.bin/postcss")); - $themesrc = realpath(self::BASE."docs/theme/src/"); - $themeout = realpath(self::BASE."docs/theme/arsse/"); - $scss = $themesrc."/arsse.scss"; - $css = $themeout."/arsse.css"; + $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; + $themesrc = realpath(self::BASE."docs/theme/src/").\DIRECTORY_SEPARATOR; + $themeout = realpath(self::BASE."docs/theme/arsse/").\DIRECTORY_SEPARATOR; + $dauxjs = realpath(self::BASE."vendor-bin/daux/vendor/daux/daux.io/themes/daux/js/").\DIRECTORY_SEPARATOR; + $dauxout = realpath(self::BASE."docs/theme/daux/js/").\DIRECTORY_SEPARATOR; // start a collection; this stops after the first failure $t = $this->collectionBuilder(); $tmp = $t->tmpDir().\DIRECTORY_SEPARATOR; // install dependencies via Yarn $t->taskExec("yarn install"); // compile the stylesheet - $t->taskExec($postcss)->arg($scss)->option("-o", $css); + $t->taskExec($postcss)->arg($themesrc."arsse.scss")->option("-o", $themeout."arsse.css"); + // copy JavaScript files from the Daux theme + foreach(glob($dauxjs."daux*") as $file) { + $t->taskFilesystemStack()->copy($file, $themeout.basename($file), true); + } + foreach(glob($dauxjs."jquery*") as $file) { + $t->taskFilesystemStack()->copy($file, $themeout.basename("jquery.min.js"), true); + } + foreach(glob($dauxjs."html5shiv*") as $file) { + $t->taskFilesystemStack()->copy($file, $dauxout.basename($file), true); + } // download highlight.js - $t->addCode(function() use ($tmp, $themeout) { - $languages = ["php", "bash", "shell", "xml", "nginx", "apache"]; + $t->addCode(function() use ($languages, $tmp, $themeout) { $post = http_build_query((function($langs) { $out = []; foreach($langs as $l) { @@ -244,10 +254,8 @@ class RoboFile extends \Robo\Tasks { file_put_contents($tmp."highlightjs.zip", $hljs); } $this->taskExtract($tmp."highlightjs.zip")->to($tmp."hljs")->run(); - $this->taskFilesystemStack()->copy($tmp."hljs/highlight.pack.js", $themeout."/highlight.pack.js")->run(); + $this->taskFilesystemStack()->copy($tmp."hljs".\DIRECTORY_SEPARATOR."highlight.pack.js", $themeout."highlight.pack.js")->run(); }, "downloadHighlightjs"); - // copy JavaScript files from the Daux theme - # TODO // execute the collection return $t->run(); } diff --git a/docs/config.json b/docs/config.json index bc2034b..8d9f2f0 100644 --- a/docs/config.json +++ b/docs/config.json @@ -4,7 +4,9 @@ "languages": { "en": "English" }, + "themes_directory": "docs/theme", "html": { + "theme": "arsse", "float": false, "toggle_code": false } diff --git a/docs/theme/arsse/config.json b/docs/theme/arsse/config.json new file mode 100644 index 0000000..13a472a --- /dev/null +++ b/docs/theme/arsse/config.json @@ -0,0 +1,11 @@ +{ + "favicon": "favicon.png", + "js": [ + "jquery.min.js", + "highlight.pack.js", + "daux.js" + ], + "css": [ + "arsse.css" + ] +} diff --git a/docs/theme/arsse/daux.js b/docs/theme/arsse/daux.js new file mode 100644 index 0000000..43b1f49 --- /dev/null +++ b/docs/theme/arsse/daux.js @@ -0,0 +1,98 @@ +/** global localStorage, hljs */ + +if (hljs) { + hljs.initHighlightingOnLoad(); +} + +//Initialize CodeBlock Visibility Settings +$(function () { + var codeBlockView = $('.Columns__right'), + codeBlocks = $('.s-content pre'), + toggleCodeSection = $('.CodeToggler'), + toggleCodeBlockBtns = toggleCodeSection.find('.CodeToggler__button'), + toggleCodeBlockBtn = toggleCodeSection.find('.CodeToggler__button--main'), + toggleCodeBlockBtnHide = toggleCodeSection.find('.CodeToggler__button--hide'), + toggleCodeBlockBtnBelow = toggleCodeSection.find('.CodeToggler__button--below'), + toggleCodeBlockBtnFloat = toggleCodeSection.find('.CodeToggler__button--float'); + + // If there is no code block we hide the link + if (!codeBlocks.size()) { + toggleCodeSection.addClass('Hidden'); + return; + } + + function setCodeBlockStyle(codeBlockState) { + localStorage.setItem("codeBlockState", codeBlockState); + + toggleCodeBlockBtns.removeClass("Button--active"); + + switch (codeBlockState) { + case 2: // Show code blocks inline + toggleCodeBlockBtnFloat.addClass("Button--active"); + codeBlockView.addClass('Columns__right--float'); + codeBlockView.removeClass('Columns__right--full'); + codeBlocks.removeClass('Hidden'); + break; + case 1: // Show code blocks below + toggleCodeBlockBtnBelow.addClass("Button--active"); + toggleCodeBlockBtn.prop('checked', true); + codeBlockView.removeClass('Columns__right--float'); + codeBlockView.addClass('Columns__right--full'); + codeBlocks.removeClass('Hidden'); + break; + case 0: // Hidden code blocks + default: + toggleCodeBlockBtnHide.addClass("Button--active"); + toggleCodeBlockBtn.prop('checked', false); + codeBlockView.removeClass('Columns__right--float'); + codeBlockView.addClass('Columns__right--full'); + codeBlocks.addClass('Hidden'); + break; + } + } + + toggleCodeBlockBtn.click(function() { + setCodeBlockStyle(codeBlocks.hasClass('Hidden') ? 1 : 0); + }); + + toggleCodeBlockBtnHide.click(function() { setCodeBlockStyle(0); }); + toggleCodeBlockBtnBelow.click(function() { setCodeBlockStyle(1); }); + toggleCodeBlockBtnFloat.click(function() { setCodeBlockStyle(2); }); + + var floating = $(document.body).hasClass("with-float"); + var codeBlockState = localStorage.getItem("codeBlockState"); + + if (!codeBlockState) { + codeBlockState = floating? 2 : 1; + } else { + codeBlockState = parseInt(codeBlockState); + } + + if (!floating && codeBlockState == 2) { + codeBlockState = 1; + } + + setCodeBlockStyle(codeBlockState); +}); + + +$(function () { + // Tree navigation + $('.aj-nav').click(function (e) { + e.preventDefault(); + $(this).parent().siblings().find('ul').slideUp(); + $(this).next().slideToggle(); + }); + + // New Tree navigation + $('ul.Nav > li.has-children > a > .Nav__arrow').click(function() { + $(this).parent().parent().toggleClass('Nav__item--open'); + return false; + }); + + // Responsive navigation + $('.Collapsible__trigger').click(function () { + $('.Collapsible__content').slideToggle(); + }); +}); + diff --git a/docs/theme/arsse/jquery.min.js b/docs/theme/arsse/jquery.min.js new file mode 100644 index 0000000..0f60b7b --- /dev/null +++ b/docs/theme/arsse/jquery.min.js @@ -0,0 +1,5 @@ +/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; + +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
NameOSProtocolNotesNameOSProtocolNotes
Nextcloud NewsTiny Tiny RSSFeverNextcloud NewsTiny Tiny RSSFever
tiny Reader RSS iOS

Does not support HTTP authentication.

a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function aa(){return!0}function ba(){return!1}function ca(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ha=/^\s+/,ia=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,ja=/<([\w:]+)/,ka=/\s*$/g,ra={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sa=da(y),ta=sa.appendChild(y.createElement("div"));ra.optgroup=ra.option,ra.tbody=ra.tfoot=ra.colgroup=ra.caption=ra.thead,ra.th=ra.td;function ua(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ua(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function va(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wa(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xa(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function ya(a){var b=pa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function za(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Aa(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Ba(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xa(b).text=a.text,ya(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!ga.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ta.innerHTML=a.outerHTML,ta.removeChild(f=ta.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ua(f),h=ua(a),g=0;null!=(e=h[g]);++g)d[g]&&Ba(e,d[g]);if(b)if(c)for(h=h||ua(a),d=d||ua(f),g=0;null!=(e=h[g]);g++)Aa(e,d[g]);else Aa(a,f);return d=ua(f,"script"),d.length>0&&za(d,!i&&ua(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=da(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(la.test(f)){h=h||o.appendChild(b.createElement("div")),i=(ja.exec(f)||["",""])[1].toLowerCase(),l=ra[i]||ra._default,h.innerHTML=l[1]+f.replace(ia,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&ha.test(f)&&p.push(b.createTextNode(ha.exec(f)[0])),!k.tbody){f="table"!==i||ka.test(f)?""!==l[1]||ka.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ua(p,"input"),va),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ua(o.appendChild(f),"script"),g&&za(h),c)){e=0;while(f=h[e++])oa.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ua(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&za(ua(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ua(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fa,""):void 0;if(!("string"!=typeof a||ma.test(a)||!k.htmlSerialize&&ga.test(a)||!k.leadingWhitespace&&ha.test(a)||ra[(ja.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ia,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ua(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ua(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&na.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ua(i,"script"),xa),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ua(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,ya),j=0;f>j;j++)d=g[j],oa.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qa,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Ca,Da={};function Ea(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fa(a){var b=y,c=Da[a];return c||(c=Ea(a,b),"none"!==c&&c||(Ca=(Ca||m("