From e2ba89c80eceb3e18ba5069cb47e1a4833701a4f Mon Sep 17 00:00:00 2001 From: Kode Date: Wed, 29 Jun 2022 13:20:08 +0100 Subject: [PATCH] Update dependencies --- composer.lock | 616 ++-- storage/app/supportedapps.json | 2 +- vendor/bin/carbon | 118 +- vendor/bin/carbon.bat | 5 - vendor/bin/patch-type-declarations | 118 +- vendor/bin/patch-type-declarations.bat | 5 - vendor/bin/php-parse | 118 +- vendor/bin/php-parse.bat | 5 - vendor/bin/psysh | 118 +- vendor/bin/psysh.bat | 5 - vendor/bin/var-dump-server | 118 +- vendor/bin/var-dump-server.bat | 5 - vendor/composer/autoload_classmap.php | 65 +- vendor/composer/autoload_files.php | 8 +- vendor/composer/autoload_static.php | 73 +- vendor/composer/installed.json | 702 ++--- vendor/composer/installed.php | 280 +- vendor/composer/platform_check.php | 4 +- vendor/graham-campbell/bounded-cache/LICENSE | 2 +- .../bounded-cache/composer.json | 12 +- vendor/graham-campbell/github/composer.json | 4 +- vendor/guzzlehttp/guzzle/CHANGELOG.md | 22 + vendor/guzzlehttp/guzzle/README.md | 28 +- vendor/guzzlehttp/guzzle/composer.json | 5 +- .../guzzle/src/Cookie/CookieJar.php | 5 + .../guzzle/src/Cookie/SetCookie.php | 6 +- .../guzzle/src/Handler/CurlMultiHandler.php | 4 +- .../guzzle/src/Handler/StreamHandler.php | 9 +- .../guzzle/src/RedirectMiddleware.php | 26 +- vendor/guzzlehttp/psr7/CHANGELOG.md | 52 + vendor/guzzlehttp/psr7/README.md | 35 +- vendor/guzzlehttp/psr7/composer.json | 5 +- vendor/guzzlehttp/psr7/src/CachingStream.php | 5 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 3 + vendor/guzzlehttp/psr7/src/FnStream.php | 1 + vendor/guzzlehttp/psr7/src/Header.php | 105 +- vendor/guzzlehttp/psr7/src/InflateStream.php | 3 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 1 + vendor/guzzlehttp/psr7/src/LimitStream.php | 3 + vendor/guzzlehttp/psr7/src/Message.php | 3 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 47 +- vendor/guzzlehttp/psr7/src/MimeType.php | 1311 ++++++++- .../guzzlehttp/psr7/src/MultipartStream.php | 8 +- vendor/guzzlehttp/psr7/src/NoSeekStream.php | 3 + vendor/guzzlehttp/psr7/src/Query.php | 2 +- vendor/guzzlehttp/psr7/src/ServerRequest.php | 2 +- vendor/guzzlehttp/psr7/src/Stream.php | 15 +- vendor/guzzlehttp/psr7/src/Uri.php | 7 +- vendor/guzzlehttp/psr7/src/UriComparator.php | 52 + vendor/guzzlehttp/psr7/src/Utils.php | 51 +- .../vendor-bin/php-cs-fixer/composer.json | 9 - .../psr7/vendor-bin/phpstan/composer.json | 10 - .../psr7/vendor-bin/psalm/composer.json | 9 - vendor/knplabs/github-api/CHANGELOG-3.X.md | 11 + vendor/knplabs/github-api/composer.json | 3 +- .../github-api/lib/Github/Api/Apps.php | 2 +- .../lib/Github/Api/Repository/Commits.php | 4 +- .../tinker/src/Console/TinkerCommand.php | 4 +- .../league/mime-type-detection/CHANGELOG.md | 8 +- vendor/league/mime-type-detection/LICENSE | 2 +- .../src/FinfoMimeTypeDetector.php | 19 +- .../src/GeneratedExtensionToMimeTypeMap.php | 9 +- vendor/monolog/monolog/CHANGELOG.md | 37 + vendor/monolog/monolog/README.md | 3 + vendor/monolog/monolog/composer.json | 28 +- .../Monolog/Attribute/AsMonologProcessor.php | 46 + .../monolog/src/Monolog/ErrorHandler.php | 18 +- .../Formatter/GelfMessageFormatter.php | 4 + .../src/Monolog/Formatter/JsonFormatter.php | 9 +- .../src/Monolog/Formatter/LineFormatter.php | 36 +- .../Monolog/Formatter/MongoDBFormatter.php | 3 +- .../Monolog/Formatter/NormalizerFormatter.php | 8 +- .../Monolog/Handler/BrowserConsoleHandler.php | 51 +- .../Monolog/Handler/ElasticSearchHandler.php | 47 +- .../src/Monolog/Handler/FleepHookHandler.php | 23 +- .../src/Monolog/Handler/FlowdockHandler.php | 23 +- .../src/Monolog/Handler/InsightOpsHandler.php | 25 +- .../src/Monolog/Handler/LogEntriesHandler.php | 25 +- .../src/Monolog/Handler/LogmaticHandler.php | 26 +- .../src/Monolog/Handler/PushoverHandler.php | 18 +- .../Monolog/Handler/RotatingFileHandler.php | 6 +- .../src/Monolog/Handler/Slack/SlackRecord.php | 14 +- .../src/Monolog/Handler/SlackHandler.php | 18 +- .../src/Monolog/Handler/SocketHandler.php | 43 +- .../src/Monolog/Handler/SqsHandler.php | 2 +- .../src/Monolog/Handler/StreamHandler.php | 6 +- .../Monolog/Handler/SwiftMailerHandler.php | 7 +- .../Monolog/Handler/SymfonyMailerHandler.php | 111 + .../src/Monolog/Handler/SyslogHandler.php | 3 +- .../Monolog/Handler/SyslogUdp/UdpSocket.php | 40 +- .../Monolog/Handler/TelegramBotHandler.php | 94 +- .../monolog/monolog/src/Monolog/LogRecord.php | 34 + vendor/monolog/monolog/src/Monolog/Logger.php | 111 +- .../Processor/IntrospectionProcessor.php | 1 + .../src/Monolog/Processor/WebProcessor.php | 22 +- .../monolog/src/Monolog/Test/TestCase.php | 11 + vendor/monolog/monolog/src/Monolog/Utils.php | 21 + vendor/nesbot/carbon/bin/carbon | 0 vendor/nesbot/carbon/composer.json | 83 +- .../Carbon/PHPStan/AbstractMacroBuiltin.php | 31 + .../Carbon/PHPStan/AbstractMacroStatic.php | 41 + .../lazy/Carbon/PHPStan/MacroStrongType.php | 2 +- .../lazy/Carbon/PHPStan/MacroWeakType.php | 2 +- vendor/nesbot/carbon/readme.md | 4 + .../carbon/src/Carbon/AbstractTranslator.php | 18 +- .../carbon/src/Carbon/CarbonInterface.php | 1 + .../carbon/src/Carbon/CarbonInterval.php | 87 +- .../nesbot/carbon/src/Carbon/CarbonPeriod.php | 79 +- .../carbon/src/Carbon/CarbonTimeZone.php | 30 +- .../Exceptions/BadComparisonUnitException.php | 25 +- .../BadFluentConstructorException.php | 25 +- .../Exceptions/BadFluentSetterException.php | 29 +- .../Exceptions/BadMethodCallException.php | 1 + .../Exceptions/EndLessPeriodException.php | 19 + .../src/Carbon/Exceptions/Exception.php | 1 + .../Carbon/Exceptions/ImmutableException.php | 24 +- .../Exceptions/InvalidArgumentException.php | 1 + .../Exceptions/InvalidCastException.php | 13 +- .../Exceptions/InvalidDateException.php | 6 +- .../Exceptions/InvalidFormatException.php | 13 +- .../Exceptions/InvalidIntervalException.php | 13 +- .../Exceptions/InvalidPeriodDateException.php | 13 +- .../InvalidPeriodParameterException.php | 13 +- .../Exceptions/InvalidTimeZoneException.php | 13 +- .../Exceptions/InvalidTypeException.php | 13 +- .../Exceptions/NotACarbonClassException.php | 31 +- .../Carbon/Exceptions/NotAPeriodException.php | 13 +- .../Exceptions/NotLocaleAwareException.php | 6 +- .../Carbon/Exceptions/OutOfRangeException.php | 6 +- .../Carbon/Exceptions/ParseErrorException.php | 61 +- .../Carbon/Exceptions/RuntimeException.php | 1 + .../src/Carbon/Exceptions/UnitException.php | 13 +- .../Exceptions/UnitNotConfiguredException.php | 25 +- .../Exceptions/UnknownGetterException.php | 29 +- .../Exceptions/UnknownMethodException.php | 25 +- .../Exceptions/UnknownSetterException.php | 29 +- .../Exceptions/UnknownUnitException.php | 25 +- .../Exceptions/UnreachableException.php | 13 +- vendor/nesbot/carbon/src/Carbon/Lang/ckb.php | 89 + vendor/nesbot/carbon/src/Carbon/Lang/cs.php | 3 +- vendor/nesbot/carbon/src/Carbon/Lang/cy.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/da.php | 7 +- vendor/nesbot/carbon/src/Carbon/Lang/en.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/fr.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/it.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/mn.php | 62 +- vendor/nesbot/carbon/src/Carbon/Lang/sk.php | 10 +- vendor/nesbot/carbon/src/Carbon/Lang/ss.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/sv.php | 2 +- vendor/nesbot/carbon/src/Carbon/Lang/uk.php | 1 + .../src/Carbon/PHPStan/AbstractMacro.php | 10 - .../carbon/src/Carbon/PHPStan/Macro.php | 7 + .../src/Carbon/PHPStan/MacroExtension.php | 5 + .../carbon/src/Carbon/Traits/Comparison.php | 24 +- .../carbon/src/Carbon/Traits/Converter.php | 2 +- .../carbon/src/Carbon/Traits/Creator.php | 8 +- .../nesbot/carbon/src/Carbon/Traits/Date.php | 27 +- .../carbon/src/Carbon/Traits/Difference.php | 2 +- .../carbon/src/Carbon/Traits/Localization.php | 20 +- .../carbon/src/Carbon/Traits/Rounding.php | 4 +- .../src/Carbon/Traits/Serialization.php | 2 +- .../nesbot/carbon/src/Carbon/Traits/Test.php | 26 +- .../carbon/src/Carbon/Traits/Timestamp.php | 6 +- .../nesbot/carbon/src/Carbon/Traits/Units.php | 10 +- vendor/nikic/php-parser/README.md | 4 +- vendor/nikic/php-parser/grammar/php5.y | 10 +- vendor/nikic/php-parser/grammar/php7.y | 20 +- vendor/nikic/php-parser/grammar/phpyLang.php | 8 - .../lib/PhpParser/Builder/Class_.php | 10 +- .../lib/PhpParser/BuilderHelpers.php | 9 + .../php-parser/lib/PhpParser/Node/Const_.php | 4 +- .../lib/PhpParser/Node/Scalar/DNumber.php | 13 +- .../lib/PhpParser/Node/Scalar/LNumber.php | 4 +- .../lib/PhpParser/Node/Scalar/String_.php | 16 + .../lib/PhpParser/Node/Stmt/ClassLike.php | 2 +- .../lib/PhpParser/Node/Stmt/Class_.php | 25 + .../lib/PhpParser/Node/Stmt/Function_.php | 2 +- .../php-parser/lib/PhpParser/Parser/Php5.php | 8 +- .../php-parser/lib/PhpParser/Parser/Php7.php | 2201 +++++++------- .../lib/PhpParser/ParserAbstract.php | 9 + vendor/php-http/discovery/.php-cs-fixer.php | 16 + vendor/php-http/discovery/CHANGELOG.md | 4 + vendor/php-http/discovery/composer.json | 3 +- .../php-http/discovery/src/ClassDiscovery.php | 2 +- .../src/Exception/NotFoundException.php | 2 +- .../discovery/src/Psr18ClientDiscovery.php | 2 +- .../src/Strategy/CommonClassesStrategy.php | 54 +- .../src/Strategy/DiscoveryStrategy.php | 2 +- .../type-resolver/src/TypeResolver.php | 2 +- vendor/psy/psysh/composer.json | 4 +- vendor/psy/psysh/src/Command/Command.php | 4 +- vendor/psy/psysh/src/Configuration.php | 8 +- .../psy/psysh/src/Formatter/CodeFormatter.php | 2 +- .../psy/psysh/src/Output/ProcOutputPager.php | 4 +- .../psysh/src/Readline/Hoa/Autocompleter.php | 57 + .../Readline/Hoa/AutocompleterAggregate.php | 118 + .../src/Readline/Hoa/AutocompleterPath.php | 194 ++ .../src/Readline/Hoa/AutocompleterWord.php | 119 + vendor/psy/psysh/src/Readline/Hoa/Console.php | 347 +++ .../psysh/src/Readline/Hoa/ConsoleCursor.php | 694 +++++ .../src/Readline/Hoa/ConsoleException.php | 46 + .../psysh/src/Readline/Hoa/ConsoleInput.php | 168 ++ .../psysh/src/Readline/Hoa/ConsoleOutput.php | 208 ++ .../src/Readline/Hoa/ConsoleProcessus.php | 892 ++++++ .../psysh/src/Readline/Hoa/ConsoleTput.php | 805 ++++++ .../psysh/src/Readline/Hoa/ConsoleWindow.php | 529 ++++ vendor/psy/psysh/src/Readline/Hoa/Event.php | 193 ++ .../psysh/src/Readline/Hoa/EventBucket.php | 109 + .../psysh/src/Readline/Hoa/EventException.php | 44 + .../src/Readline/Hoa/EventListenable.php | 48 + .../psysh/src/Readline/Hoa/EventListener.php | 137 + .../psysh/src/Readline/Hoa/EventListens.php | 83 + .../psysh/src/Readline/Hoa/EventSource.php | 44 + .../psy/psysh/src/Readline/Hoa/Exception.php | 79 + .../psysh/src/Readline/Hoa/ExceptionIdle.php | 267 ++ vendor/psy/psysh/src/Readline/Hoa/File.php | 278 ++ .../psysh/src/Readline/Hoa/FileDirectory.php | 221 ++ .../Hoa/FileDoesNotExistException.php | 48 + .../psysh/src/Readline/Hoa/FileException.php | 48 + .../psy/psysh/src/Readline/Hoa/FileFinder.php | 658 +++++ .../psysh/src/Readline/Hoa/FileGeneric.php | 487 ++++ .../psy/psysh/src/Readline/Hoa/FileLink.php | 149 + .../psysh/src/Readline/Hoa/FileLinkRead.php | 231 ++ .../src/Readline/Hoa/FileLinkReadWrite.php | 279 ++ .../psy/psysh/src/Readline/Hoa/FileRead.php | 177 ++ .../psysh/src/Readline/Hoa/FileReadWrite.php | 279 ++ vendor/psy/psysh/src/Readline/Hoa/IStream.php | 50 + .../src/Readline/Hoa/IteratorFileSystem.php | 86 + .../Hoa/IteratorRecursiveDirectory.php | 126 + .../src/Readline/Hoa/IteratorSplFileInfo.php | 122 + .../psy/psysh/src/Readline/Hoa/Protocol.php | 223 ++ .../src/Readline/Hoa/ProtocolException.php | 44 + .../psysh/src/Readline/Hoa/ProtocolNode.php | 323 +++ .../src/Readline/Hoa/ProtocolNodeLibrary.php | 90 + .../src/Readline/Hoa/ProtocolWrapper.php | 473 +++ .../psy/psysh/src/Readline/Hoa/Readline.php | 1028 +++++++ vendor/psy/psysh/src/Readline/Hoa/Stream.php | 571 ++++ .../src/Readline/Hoa/StreamBufferable.php | 73 + .../psysh/src/Readline/Hoa/StreamContext.php | 136 + .../src/Readline/Hoa/StreamException.php | 46 + .../psy/psysh/src/Readline/Hoa/StreamIn.php | 102 + .../psysh/src/Readline/Hoa/StreamLockable.php | 85 + .../psy/psysh/src/Readline/Hoa/StreamOut.php | 95 + .../psysh/src/Readline/Hoa/StreamPathable.php | 55 + .../src/Readline/Hoa/StreamPointable.php | 75 + .../psysh/src/Readline/Hoa/StreamStatable.php | 115 + .../src/Readline/Hoa/StreamTouchable.php | 110 + .../src/Readline/Hoa/Terminfo/77/windows-ansi | Bin 0 -> 1481 bytes .../psysh/src/Readline/Hoa/Terminfo/78/xterm | Bin 0 -> 3258 bytes .../Readline/Hoa/Terminfo/78/xterm-256color | Bin 0 -> 3322 bytes vendor/psy/psysh/src/Readline/Hoa/Ustring.php | 143 + .../psy/psysh/src/Readline/Hoa/Xcallable.php | 254 ++ vendor/psy/psysh/src/Readline/HoaConsole.php | 114 +- vendor/psy/psysh/src/Readline/Userland.php | 161 ++ vendor/psy/psysh/src/Shell.php | 19 +- .../AbstractDefaultParametersMatcher.php | 2 +- .../src/VersionUpdater/GitHubChecker.php | 2 +- vendor/psy/psysh/src/functions.php | 1 + vendor/symfony/cache-contracts/LICENSE | 2 +- vendor/symfony/cache/Adapter/ArrayAdapter.php | 5 +- vendor/symfony/cache/Adapter/ChainAdapter.php | 11 +- vendor/symfony/cache/DoctrineProvider.php | 4 + vendor/symfony/cache/LockRegistry.php | 12 +- .../symfony/cache/Traits/ContractsTrait.php | 2 +- vendor/symfony/cache/Traits/RedisTrait.php | 6 +- vendor/symfony/console/Application.php | 17 +- .../console/Command/CompleteCommand.php | 3 +- .../console/Command/DumpCompletionCommand.php | 6 +- .../Output/BashCompletionOutput.php | 3 + .../AddConsoleCommandPass.php | 4 +- .../Formatter/NullOutputFormatterStyle.php | 1 + vendor/symfony/console/Helper/Table.php | 117 +- .../symfony/console/Input/InputArgument.php | 2 +- .../console/Tester/ApplicationTester.php | 42 +- vendor/symfony/deprecation-contracts/LICENSE | 2 +- .../error-handler/DebugClassLoader.php | 7 + .../error-handler/Internal/TentativeTypes.php | 12 +- .../Resources/assets/css/exception.css | 2 +- .../bin/extract-tentative-return-types.php | 0 .../Resources/bin/patch-type-declarations | 0 .../event-dispatcher-contracts/LICENSE | 2 +- .../Debug/TraceableEventDispatcher.php | 6 +- .../event-dispatcher/EventDispatcher.php | 4 +- .../Iterator/MultiplePcreFilterIterator.php | 8 +- .../http-foundation/File/UploadedFile.php | 3 - .../Session/Storage/NativeSessionStorage.php | 6 + vendor/symfony/http-kernel/CHANGELOG.md | 2 +- .../DataCollector/MemoryDataCollector.php | 3 - ...RegisterControllerArgumentLocatorsPass.php | 2 +- .../EventListener/AbstractSessionListener.php | 77 +- .../AbstractTestSessionListener.php | 8 +- .../EventListener/ProfilerListener.php | 18 +- .../EventListener/TestSessionListener.php | 9 +- .../http-kernel/HttpCache/HttpCache.php | 2 +- vendor/symfony/http-kernel/Kernel.php | 10 +- vendor/symfony/mime/Crypto/DkimOptions.php | 2 +- vendor/symfony/mime/Email.php | 20 +- vendor/symfony/mime/Part/DataPart.php | 9 +- .../mime/Test/Constraint/EmailHeaderSame.php | 8 +- vendor/symfony/polyfill-ctype/README.md | 2 +- vendor/symfony/polyfill-ctype/composer.json | 2 +- vendor/symfony/polyfill-iconv/README.md | 2 +- vendor/symfony/polyfill-iconv/composer.json | 2 +- .../symfony/polyfill-intl-grapheme/README.md | 2 +- .../polyfill-intl-grapheme/composer.json | 2 +- vendor/symfony/polyfill-intl-idn/README.md | 2 +- .../symfony/polyfill-intl-idn/composer.json | 2 +- .../polyfill-intl-normalizer/README.md | 2 +- .../polyfill-intl-normalizer/composer.json | 2 +- vendor/symfony/polyfill-mbstring/Mbstring.php | 2 +- vendor/symfony/polyfill-mbstring/README.md | 2 +- .../symfony/polyfill-mbstring/composer.json | 2 +- vendor/symfony/polyfill-php72/README.md | 9 +- vendor/symfony/polyfill-php72/composer.json | 2 +- vendor/symfony/polyfill-php73/README.md | 2 +- vendor/symfony/polyfill-php73/composer.json | 2 +- vendor/symfony/polyfill-php80/README.md | 7 +- vendor/symfony/polyfill-php80/composer.json | 2 +- vendor/symfony/polyfill-php81/README.md | 5 +- vendor/symfony/polyfill-php81/composer.json | 2 +- .../symfony/process/PhpExecutableFinder.php | 10 +- vendor/symfony/process/Process.php | 2 +- vendor/symfony/routing/RequestContext.php | 2 +- vendor/symfony/service-contracts/LICENSE | 2 +- .../ServiceSubscriberTrait.php | 10 +- .../symfony/service-contracts/composer.json | 2 +- .../symfony/string/AbstractUnicodeString.php | 2 +- .../string/Inflector/FrenchInflector.php | 2 +- vendor/symfony/translation-contracts/LICENSE | 2 +- .../Test/TranslatorTest.php | 2 +- .../Command/TranslationPushCommand.php | 7 + .../TranslationDataCollector.php | 0 .../translation/Resources/data/parents.json | 3 + vendor/symfony/translation/TranslatorBag.php | 5 +- .../symfony/var-dumper/Caster/DateCaster.php | 6 +- .../var-dumper/Caster/XmlReaderCaster.php | 1 + .../var-dumper/Dumper/AbstractDumper.php | 6 +- .../symfony/var-dumper/Dumper/HtmlDumper.php | 6 +- vendor/symfony/var-exporter/Instantiator.php | 4 +- .../var-exporter/Internal/Exporter.php | 12 +- vendor/webmozart/assert/.editorconfig | 12 - .../assert/.github/workflows/ci.yaml | 120 - vendor/webmozart/assert/.php_cs | 24 - vendor/webmozart/assert/CHANGELOG.md | 17 + vendor/webmozart/assert/README.md | 4 +- vendor/webmozart/assert/composer.json | 20 +- vendor/webmozart/assert/psalm.xml | 14 - vendor/webmozart/assert/src/Assert.php | 38 +- vendor/webmozart/assert/src/Mixin.php | 2551 +++++++++++++++-- 349 files changed, 21017 insertions(+), 4079 deletions(-) mode change 100644 => 120000 vendor/bin/carbon delete mode 100644 vendor/bin/carbon.bat mode change 100644 => 120000 vendor/bin/patch-type-declarations delete mode 100644 vendor/bin/patch-type-declarations.bat mode change 100755 => 120000 vendor/bin/php-parse delete mode 100644 vendor/bin/php-parse.bat mode change 100755 => 120000 vendor/bin/psysh delete mode 100644 vendor/bin/psysh.bat mode change 100755 => 120000 vendor/bin/var-dump-server delete mode 100644 vendor/bin/var-dump-server.bat create mode 100644 vendor/guzzlehttp/psr7/src/UriComparator.php delete mode 100644 vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json delete mode 100644 vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json delete mode 100644 vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json create mode 100644 vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php mode change 100755 => 100644 vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php create mode 100644 vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php create mode 100644 vendor/monolog/monolog/src/Monolog/LogRecord.php mode change 100644 => 100755 vendor/nesbot/carbon/bin/carbon create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php create mode 100644 vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php create mode 100644 vendor/nesbot/carbon/src/Carbon/Lang/ckb.php create mode 100644 vendor/php-http/discovery/.php-cs-fixer.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Autocompleter.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/AutocompleterAggregate.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/AutocompleterPath.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/AutocompleterWord.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Console.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleCursor.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleInput.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleOutput.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleTput.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ConsoleWindow.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Event.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventBucket.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventListenable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventListener.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventListens.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/EventSource.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Exception.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ExceptionIdle.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/File.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileDirectory.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileFinder.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileGeneric.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileLink.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileLinkRead.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileRead.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/FileReadWrite.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/IStream.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Protocol.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ProtocolException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ProtocolNode.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Readline.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Stream.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamBufferable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamContext.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamException.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamIn.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamLockable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamOut.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamPathable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamPointable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamStatable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/StreamTouchable.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Terminfo/77/windows-ansi create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm-256color create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Ustring.php create mode 100644 vendor/psy/psysh/src/Readline/Hoa/Xcallable.php create mode 100644 vendor/psy/psysh/src/Readline/Userland.php mode change 100644 => 100755 vendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.php mode change 100644 => 100755 vendor/symfony/error-handler/Resources/bin/patch-type-declarations mode change 100755 => 100644 vendor/symfony/translation/DataCollector/TranslationDataCollector.php delete mode 100644 vendor/webmozart/assert/.editorconfig delete mode 100644 vendor/webmozart/assert/.github/workflows/ci.yaml delete mode 100644 vendor/webmozart/assert/.php_cs delete mode 100644 vendor/webmozart/assert/psalm.xml diff --git a/composer.lock b/composer.lock index 45a9cc26..a9a06d42 100644 --- a/composer.lock +++ b/composer.lock @@ -491,27 +491,27 @@ }, { "name": "graham-campbell/bounded-cache", - "version": "v1.1.3", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Bounded-Cache.git", - "reference": "cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b" + "reference": "91ec403b5c66f31d446b317bf3f0958205353fe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Bounded-Cache/zipball/cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b", - "reference": "cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b", + "url": "https://api.github.com/repos/GrahamCampbell/Bounded-Cache/zipball/91ec403b5c66f31d446b317bf3f0958205353fe2", + "reference": "91ec403b5c66f31d446b317bf3f0958205353fe2", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/simple-cache": "^1.0" + "php": "^7.4.15 || ^8.0.2", + "psr/simple-cache": "^1.0 || ^2.0" }, "require-dev": { - "graham-campbell/analyzer": "^3.0", - "graham-campbell/testbench-core": "^3.1", - "mockery/mockery": "^1.3.2", - "phpunit/phpunit": "^8.5.8 || ^9.3.7" + "graham-campbell/analyzer": "^3.1", + "graham-campbell/testbench-core": "^3.4", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5" }, "type": "library", "autoload": { @@ -542,7 +542,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Bounded-Cache/issues", - "source": "https://github.com/GrahamCampbell/Bounded-Cache/tree/v1.1.3" + "source": "https://github.com/GrahamCampbell/Bounded-Cache/tree/v1.2.0" }, "funding": [ { @@ -554,28 +554,28 @@ "type": "tidelift" } ], - "time": "2021-11-21T20:48:45+00:00" + "time": "2022-05-30T19:33:36+00:00" }, { "name": "graham-campbell/github", - "version": "v10.5.0", + "version": "v10.6.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Laravel-GitHub.git", - "reference": "b88f6737bcc088a84ce3ec863a50afbc3ab8e867" + "reference": "3b25fdfd160827cbc103a737fee08f7f113b6923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Laravel-GitHub/zipball/b88f6737bcc088a84ce3ec863a50afbc3ab8e867", - "reference": "b88f6737bcc088a84ce3ec863a50afbc3ab8e867", + "url": "https://api.github.com/repos/GrahamCampbell/Laravel-GitHub/zipball/3b25fdfd160827cbc103a737fee08f7f113b6923", + "reference": "3b25fdfd160827cbc103a737fee08f7f113b6923", "shasum": "" }, "require": { - "graham-campbell/bounded-cache": "^1.1", + "graham-campbell/bounded-cache": "^1.1 || ^2.0", "graham-campbell/manager": "^4.7", "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "knplabs/github-api": "3.5.*", + "knplabs/github-api": "3.6.*", "php": "^7.2.5 || ^8.0", "symfony/cache": "^4.3 || ^5.0 || ^6.0" }, @@ -631,7 +631,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Laravel-GitHub/issues", - "source": "https://github.com/GrahamCampbell/Laravel-GitHub/tree/v10.5.0" + "source": "https://github.com/GrahamCampbell/Laravel-GitHub/tree/v10.6.0" }, "funding": [ { @@ -643,7 +643,7 @@ "type": "tidelift" } ], - "time": "2022-01-24T03:22:38+00:00" + "time": "2022-05-30T19:59:57+00:00" }, { "name": "graham-campbell/manager", @@ -717,22 +717,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.4.1", + "version": "7.4.5", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -821,7 +821,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.1" + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" }, "funding": [ { @@ -837,7 +837,7 @@ "type": "tidelift" } ], - "time": "2021-12-06T18:43:05+00:00" + "time": "2022-06-20T22:16:13+00:00" }, { "name": "guzzlehttp/promises", @@ -925,16 +925,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.1.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "reference": "13388f00956b1503577598873fffb5ae994b5737" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", + "reference": "13388f00956b1503577598873fffb5ae994b5737", "shasum": "" }, "require": { @@ -958,7 +958,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.4-dev" } }, "autoload": { @@ -1020,7 +1020,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" + "source": "https://github.com/guzzle/psr7/tree/2.4.0" }, "funding": [ { @@ -1036,20 +1036,20 @@ "type": "tidelift" } ], - "time": "2021-10-06T17:43:30+00:00" + "time": "2022-06-20T21:43:11+00:00" }, { "name": "knplabs/github-api", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/php-github-api.git", - "reference": "37b167998e8e1f318b3d99633675cfa007540565" + "reference": "7f283177b96eb626e5cf6038d8771859a0af4b02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/37b167998e8e1f318b3d99633675cfa007540565", - "reference": "37b167998e8e1f318b3d99633675cfa007540565", + "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/7f283177b96eb626e5cf6038d8771859a0af4b02", + "reference": "7f283177b96eb626e5cf6038d8771859a0af4b02", "shasum": "" }, "require": { @@ -1116,7 +1116,7 @@ ], "support": { "issues": "https://github.com/KnpLabs/php-github-api/issues", - "source": "https://github.com/KnpLabs/php-github-api/tree/v3.5.1" + "source": "https://github.com/KnpLabs/php-github-api/tree/v3.6.0" }, "funding": [ { @@ -1124,7 +1124,7 @@ "type": "github" } ], - "time": "2022-02-19T11:15:46+00:00" + "time": "2022-03-24T09:08:32+00:00" }, { "name": "laravel/framework", @@ -1290,16 +1290,16 @@ }, { "name": "laravel/tinker", - "version": "v2.7.0", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073" + "reference": "dff39b661e827dae6e092412f976658df82dbac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/5f2f9815b7631b9f586a3de7933c25f9327d4073", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073", + "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", + "reference": "dff39b661e827dae6e092412f976658df82dbac5", "shasum": "" }, "require": { @@ -1352,9 +1352,9 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.0" + "source": "https://github.com/laravel/tinker/tree/v2.7.2" }, - "time": "2022-01-10T08:52:49+00:00" + "time": "2022-03-23T12:38:24+00:00" }, { "name": "laravel/ui", @@ -1672,16 +1672,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.9.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", "shasum": "" }, "require": { @@ -1712,7 +1712,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" }, "funding": [ { @@ -1724,20 +1724,20 @@ "type": "tidelift" } ], - "time": "2021-11-21T11:48:40+00:00" + "time": "2022-04-17T13:12:02+00:00" }, { "name": "monolog/monolog", - "version": "2.3.5", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524", + "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524", "shasum": "" }, "require": { @@ -1750,18 +1750,23 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", + "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", + "phpunit/phpunit": "^8.5.14", "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -1811,7 +1816,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + "source": "https://github.com/Seldaek/monolog/tree/2.7.0" }, "funding": [ { @@ -1823,20 +1828,20 @@ "type": "tidelift" } ], - "time": "2021-10-01T21:08:31+00:00" + "time": "2022-06-09T08:59:12+00:00" }, { "name": "nesbot/carbon", - "version": "2.57.0", + "version": "2.59.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4a54375c21eea4811dbd1149fe6b246517554e78" + "reference": "9cea2f72585a46d0651ee6d4c8c8f752e78c16c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78", - "reference": "4a54375c21eea4811dbd1149fe6b246517554e78", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/9cea2f72585a46d0651ee6d4c8c8f752e78c16c6", + "reference": "9cea2f72585a46d0651ee6d4c8c8f752e78c16c6", "shasum": "" }, "require": { @@ -1851,10 +1856,12 @@ "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54 || ^1.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, "bin": [ @@ -1911,28 +1918,32 @@ }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], - "time": "2022-02-13T18:13:33+00:00" + "time": "2022-06-26T20:26:59+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.2", + "version": "v4.14.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", "shasum": "" }, "require": { @@ -1973,9 +1984,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" }, - "time": "2021-11-30T19:35:32+00:00" + "time": "2022-05-31T20:59:12+00:00" }, { "name": "opis/closure", @@ -2178,16 +2189,16 @@ }, { "name": "php-http/discovery", - "version": "1.14.1", + "version": "1.14.2", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223" + "reference": "c8d48852fbc052454af42f6de27635ddd916b959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/de90ab2b41d7d61609f504e031339776bc8c7223", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223", + "url": "https://api.github.com/repos/php-http/discovery/zipball/c8d48852fbc052454af42f6de27635ddd916b959", + "reference": "c8d48852fbc052454af42f6de27635ddd916b959", "shasum": "" }, "require": { @@ -2200,8 +2211,7 @@ "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" + "phpspec/phpspec": "^5.1 || ^6.1" }, "suggest": { "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" @@ -2240,9 +2250,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.1" + "source": "https://github.com/php-http/discovery/tree/1.14.2" }, - "time": "2021-09-18T07:57:46+00:00" + "time": "2022-05-25T07:26:05+00:00" }, { "name": "php-http/httplug", @@ -3034,16 +3044,16 @@ }, { "name": "psy/psysh", - "version": "v0.11.2", + "version": "v0.11.5", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514" + "reference": "c23686f9c48ca202710dbb967df8385a952a2daf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7f7da640d68b9c9fec819caae7c744a213df6514", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/c23686f9c48ca202710dbb967df8385a952a2daf", + "reference": "c23686f9c48ca202710dbb967df8385a952a2daf", "shasum": "" }, "require": { @@ -3058,15 +3068,13 @@ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.05.02" + "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." }, "bin": [ "bin/psysh" @@ -3106,9 +3114,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.2" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.5" }, - "time": "2022-02-28T15:28:54+00:00" + "time": "2022-05-27T18:03:49+00:00" }, { "name": "ralouphie/getallheaders", @@ -3409,16 +3417,16 @@ }, { "name": "symfony/cache", - "version": "v5.4.6", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b" + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c0718d0e01ac14251a45cc9c8b93716ec41ae64b", - "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b", + "url": "https://api.github.com/repos/symfony/cache/zipball/c4e387b739022fd4b20abd8edb2143c44c5daa14", + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14", "shasum": "" }, "require": { @@ -3486,7 +3494,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.6" + "source": "https://github.com/symfony/cache/tree/v5.4.10" }, "funding": [ { @@ -3502,20 +3510,20 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:56:28+00:00" + "time": "2022-06-19T12:03:50+00:00" }, { "name": "symfony/cache-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "shasum": "" }, "require": { @@ -3565,7 +3573,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -3581,20 +3589,20 @@ "type": "tidelift" } ], - "time": "2021-08-17T14:20:01+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/console", - "version": "v5.4.5", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad" + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", "shasum": "" }, "require": { @@ -3664,7 +3672,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.5" + "source": "https://github.com/symfony/console/tree/v5.4.10" }, "funding": [ { @@ -3680,7 +3688,7 @@ "type": "tidelift" } ], - "time": "2022-02-24T12:45:35+00:00" + "time": "2022-06-26T13:00:04+00:00" }, { "name": "symfony/css-selector", @@ -3750,16 +3758,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { @@ -3797,7 +3805,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -3813,20 +3821,20 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/error-handler", - "version": "v5.4.3", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5" + "reference": "c116cda1f51c678782768dce89a45f13c949455d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", + "reference": "c116cda1f51c678782768dce89a45f13c949455d", "shasum": "" }, "require": { @@ -3868,7 +3876,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.3" + "source": "https://github.com/symfony/error-handler/tree/v5.4.9" }, "funding": [ { @@ -3884,20 +3892,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-05-21T13:57:48+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.4.3", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { @@ -3953,7 +3961,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -3969,20 +3977,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-05-05T16:45:39+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { @@ -4032,7 +4040,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -4048,20 +4056,20 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2022-01-02T09:53:40+00:00" }, { "name": "symfony/finder", - "version": "v5.4.3", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", "shasum": "" }, "require": { @@ -4095,7 +4103,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.3" + "source": "https://github.com/symfony/finder/tree/v5.4.8" }, "funding": [ { @@ -4111,20 +4119,20 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:34:36+00:00" + "time": "2022-04-15T08:07:45+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.6", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465" + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465", - "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", "shasum": "" }, "require": { @@ -4168,7 +4176,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.6" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.10" }, "funding": [ { @@ -4184,20 +4192,20 @@ "type": "tidelift" } ], - "time": "2022-03-05T21:03:43+00:00" + "time": "2022-06-19T13:13:40+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.6", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d" + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d41f29ae9af1b5f40c7ebcddf09082953229411d", - "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948", + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948", "shasum": "" }, "require": { @@ -4280,7 +4288,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.6" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.10" }, "funding": [ { @@ -4296,20 +4304,20 @@ "type": "tidelift" } ], - "time": "2022-03-05T21:14:51+00:00" + "time": "2022-06-26T16:57:59+00:00" }, { "name": "symfony/mime", - "version": "v5.4.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f" + "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/e1503cfb5c9a225350f549d3bb99296f4abfb80f", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f", + "url": "https://api.github.com/repos/symfony/mime/zipball/02265e1e5111c3cd7480387af25e82378b7ab9cc", + "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc", "shasum": "" }, "require": { @@ -4363,7 +4371,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.3" + "source": "https://github.com/symfony/mime/tree/v5.4.10" }, "funding": [ { @@ -4379,7 +4387,7 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-09T12:22:40+00:00" }, { "name": "symfony/options-resolver", @@ -4452,16 +4460,16 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { @@ -4476,7 +4484,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4514,7 +4522,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -4530,20 +4538,20 @@ "type": "tidelift" } ], - "time": "2021-10-20T20:35:02+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40" + "reference": "143f1881e655bebca1312722af8068de235ae5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f1aed619e28cb077fc83fac8c4c0383578356e40", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc", + "reference": "143f1881e655bebca1312722af8068de235ae5dc", "shasum": "" }, "require": { @@ -4558,7 +4566,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4597,7 +4605,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" }, "funding": [ { @@ -4613,20 +4621,20 @@ "type": "tidelift" } ], - "time": "2022-01-04T09:04:05+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -4638,7 +4646,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4678,7 +4686,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -4694,20 +4702,20 @@ "type": "tidelift" } ], - "time": "2021-11-23T21:10:46+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44" + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", "shasum": "" }, "require": { @@ -4721,7 +4729,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4765,7 +4773,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" }, "funding": [ { @@ -4781,20 +4789,20 @@ "type": "tidelift" } ], - "time": "2021-09-14T14:02:44+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -4806,7 +4814,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4849,7 +4857,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -4865,20 +4873,20 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { @@ -4893,7 +4901,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -4932,7 +4940,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -4948,20 +4956,20 @@ "type": "tidelift" } ], - "time": "2021-11-30T18:21:41+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", "shasum": "" }, "require": { @@ -4970,7 +4978,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5008,7 +5016,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" }, "funding": [ { @@ -5024,20 +5032,20 @@ "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { @@ -5046,7 +5054,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5087,7 +5095,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -5103,20 +5111,20 @@ "type": "tidelift" } ], - "time": "2021-06-05T21:20:04+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { @@ -5125,7 +5133,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5170,7 +5178,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -5186,20 +5194,20 @@ "type": "tidelift" } ], - "time": "2022-03-04T08:16:47+00:00" + "time": "2022-05-10T07:21:04+00:00" }, { "name": "symfony/polyfill-php81", - "version": "v1.25.0", + "version": "v1.26.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", "shasum": "" }, "require": { @@ -5208,7 +5216,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -5249,7 +5257,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" }, "funding": [ { @@ -5265,20 +5273,20 @@ "type": "tidelift" } ], - "time": "2021-09-13T13:58:11+00:00" + "time": "2022-05-24T11:49:31+00:00" }, { "name": "symfony/process", - "version": "v5.4.5", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c" + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c", + "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", "shasum": "" }, "require": { @@ -5311,7 +5319,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.5" + "source": "https://github.com/symfony/process/tree/v5.4.8" }, "funding": [ { @@ -5327,20 +5335,20 @@ "type": "tidelift" } ], - "time": "2022-01-30T18:16:22+00:00" + "time": "2022-04-08T05:07:18+00:00" }, { "name": "symfony/routing", - "version": "v5.4.3", + "version": "v5.4.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "44b29c7a94e867ccde1da604792f11a469958981" + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981", - "reference": "44b29c7a94e867ccde1da604792f11a469958981", + "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", "shasum": "" }, "require": { @@ -5401,7 +5409,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.3" + "source": "https://github.com/symfony/routing/tree/v5.4.8" }, "funding": [ { @@ -5417,26 +5425,26 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-04-18T21:45:37+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -5484,7 +5492,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -5500,20 +5508,20 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:48:04+00:00" + "time": "2022-05-30T19:17:29+00:00" }, { "name": "symfony/string", - "version": "v5.4.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", "shasum": "" }, "require": { @@ -5570,7 +5578,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.3" + "source": "https://github.com/symfony/string/tree/v5.4.10" }, "funding": [ { @@ -5586,20 +5594,20 @@ "type": "tidelift" } ], - "time": "2022-01-02T09:53:40+00:00" + "time": "2022-06-26T15:57:47+00:00" }, { "name": "symfony/translation", - "version": "v5.4.6", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b" + "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a7ca9fdfffb0174209440c2ffa1dee228e15d95b", - "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b", + "url": "https://api.github.com/repos/symfony/translation/zipball/1639abc1177d26bcd4320e535e664cef067ab0ca", + "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca", "shasum": "" }, "require": { @@ -5667,7 +5675,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.6" + "source": "https://github.com/symfony/translation/tree/v5.4.9" }, "funding": [ { @@ -5683,20 +5691,20 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:56:28+00:00" + "time": "2022-05-06T12:33:37+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.0", + "version": "v2.5.2", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -5745,7 +5753,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5761,20 +5769,20 @@ "type": "tidelift" } ], - "time": "2021-08-17T14:20:01+00:00" + "time": "2022-06-27T16:58:25+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.4.6", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0" + "reference": "af52239a330fafd192c773795520dc2dd62b5657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", + "reference": "af52239a330fafd192c773795520dc2dd62b5657", "shasum": "" }, "require": { @@ -5834,7 +5842,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.9" }, "funding": [ { @@ -5850,20 +5858,20 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:42:23+00:00" + "time": "2022-05-21T10:24:18+00:00" }, { "name": "symfony/var-exporter", - "version": "v5.4.6", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/49e2355fe6f59ea30c18ebb68edf13b7e20582e5", - "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { @@ -5907,7 +5915,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.6" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -5923,20 +5931,20 @@ "type": "tidelift" } ], - "time": "2022-03-02T12:42:23+00:00" + "time": "2022-05-27T12:56:18+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.3", + "version": "v5.4.10", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", "shasum": "" }, "require": { @@ -5982,7 +5990,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.10" }, "funding": [ { @@ -5998,7 +6006,7 @@ "type": "tidelift" } ], - "time": "2022-01-26T16:32:32+00:00" + "time": "2022-06-20T11:50:59+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -6804,16 +6812,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" + "reference": "77a32518733312af16a44300404e945338981de3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", "shasum": "" }, "require": { @@ -6848,9 +6856,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" }, - "time": "2022-01-04T19:58:01+00:00" + "time": "2022-03-15T21:29:03+00:00" }, { "name": "phpspec/prophecy", @@ -8088,21 +8096,21 @@ }, { "name": "webmozart/assert", - "version": "1.10.0", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", @@ -8140,9 +8148,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, - "time": "2021-03-09T10:59:23+00:00" + "time": "2022-06-03T18:03:27+00:00" } ], "aliases": [], @@ -8154,5 +8162,5 @@ "php": ">=7.2.5" }, "platform-dev": [], - "plugin-api-version": "2.2.0" + "plugin-api-version": "2.1.0" } diff --git a/storage/app/supportedapps.json b/storage/app/supportedapps.json index 66fe8a3b..8b2cbc4a 100644 --- a/storage/app/supportedapps.json +++ b/storage/app/supportedapps.json @@ -1 +1 @@ -{"appcount":338,"apps":[{"appid":"140902edbcc424c09736af28ab2de604c3bde936","name":"AdGuard Home","website":"https://github.com/AdguardTeam/AdGuardHome","license":"GNU General Public License v3.0 only","description":"AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that.\r\n\r\nIt operates as a DNS server that re-routes tracking domains to a \"black hole,\" thus preventing your devices from connecting to those servers. It's based on software we use for our public AdGuard DNS servers -- both share a lot of common code.","enhanced":true,"tile_background":"light","icon":"adguardhome.png","sha":"5f29cbd790a9f1f6ecf22b6937dd6f6073349dbb"},{"appid":"653caf8bdf55d6a99d77ceacd79f622353cd821a","name":"Adminer","website":"https://www.adminer.org","license":"Apache License 2.0","description":"Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Firebird, SimpleDB, Elasticsearch and MongoDB.","enhanced":false,"tile_background":"light","icon":"adminer.svg","sha":"3ee8dd2f68fbb5ed1b3351c2d661668bd48ec71d"},{"appid":"317f16f137fe0fd9eaf67dd6e203e50c0c1bf319","name":"Airsonic","website":"https://airsonic.github.io","license":"GNU General Public License v3.0 only","description":"Airsonic is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work.","enhanced":false,"tile_background":"dark","icon":"airsonic.png","sha":"6931807b90c7adce936e355ca664937d7ae741a1"},{"appid":"4a1349c03398a3e66f6efdf6395fb689d80f83fa","name":"AlarmPI","website":"https://github.com/bkbilly/AlarmPI","license":"MIT License","description":"AlarmPI is a home security system based on Raspberry PI. It supports wired sensors (PIR, Magnetic etc.) and wireless through MQTT or Hikvision.","enhanced":true,"tile_background":"dark","icon":"alarmpi.png","sha":"53e1455698e09fbd5a844dcbc377c0e3caef864c"},{"appid":"9fe84adc4eb8248be3322c8754a0cf6219d122d6","name":"Alertmanager","website":"https://prometheus.io/docs/alerting/alertmanager","license":"Apache License 2.0","description":"The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integrations such as email, PagerDuty, or OpsGenie. It also takes care of silencing and inhibition of alerts.","enhanced":false,"tile_background":"light","icon":"alertmanager.png","sha":"19e4a42015cbf17b9045dc646b9f7faa4272dd44"},{"appid":"65f59ec6b1ecd6170d5044474043cca9560a8071","name":"AMP","website":"https://cubecoders.com/AMP","license":"Proprietary","description":"AMP is short for Application Management Panel. It's our next-generation server administration software built for both users, and service providers. It supports both Windows and Linux based servers and allows you to manage all your game servers from a single web interface.","enhanced":false,"tile_background":"light","icon":"amp.png","sha":"bc92cd47a01d3b67e4c564de2af2b210b847d010"},{"appid":"7779bfb41003301f1b395c0691002423773d68c1","name":"ArchiSteamFarm","website":"https://github.com/JustArchiNET/ArchiSteamFarm","license":"Apache License 2.0","description":"ASF is a C# application with primary purpose of idling Steam cards from multiple accounts simultaneously.","enhanced":true,"tile_background":"dark","icon":"archisteamfarm.png","sha":"6fbdaa7d1adf7e06f8f6202924328943b1be9187"},{"appid":"b74f349cf434a529c0fe8589315b5956a4562097","name":"ArchiveBox","website":"https://github.com/pirate/ArchiveBox","license":"MIT License","description":"The open-source self-hosted web archive. ArchiveBox takes a list of website URLs you want to archive, and creates a local, static, browsable HTML clone of the content from those websites (it saves HTML, JS, media files, PDFs, images and more).","enhanced":false,"tile_background":"light","icon":"archivebox.png","sha":"0420ec19e7173a65c805d4ee1f93a5d24d0682b5"},{"appid":"5eef559f19eadb9593bafbd3ca6155dc6721a0d7","name":"ArchiveTeam Warrior","website":"https://www.archiveteam.org/index.php?title=ArchiveTeam_Warrior","license":"The Unlicense","description":"The Archive Team Warrior is a virtual archiving appliance. You can run it to help with the ArchiveTeam archiving efforts. It will download sites and upload them to their archive.","enhanced":false,"tile_background":"light","icon":"archiveteamwarrior.png","sha":"6042e58957f5678625ac1aa7c914db711f9041c7"},{"appid":"a0f88a6334b03ff11dc56d1b627f122ccacb75ce","name":"AriaNg","website":"https://github.com/mayswind/AriaNg","license":"MIT License","description":"AriaNg is a modern web frontend making aria2 easier to use. AriaNg is written in pure html & javascript, thus it does not need any compilers or runtime environment. You can just put AriaNg in your web server and open it in your browser. AriaNg uses responsive layout, and supports any desktop or mobile devices.","enhanced":true,"tile_background":"dark","icon":"ariang.png","sha":"c5a92289c32176f679db7cdd16933c6e945ebf3a"},{"appid":"4950589b19623304e3adb649d9eee6a3bf70c35b","name":"Artifactory","website":"https://jfrog.com/open-source","license":"MIT License","description":"Universal Repository Manager, OSS version","enhanced":true,"tile_background":"light","icon":"artifactory.png","sha":"d24447288db24286c35e51bfac20fbecb8a3ae66"},{"appid":"fa8a2fb9dfd946ec30d5e6b2ee69e24f8a252c5b","name":"Asrock Rack IPMI","website":"https://www.asrockrack.com/support/faq.de.asp?id=28","license":"Commercial","description":"Asrock Rack IPMI is an embedded server management technology by Asrock Rack.","enhanced":false,"tile_background":"light","icon":"asrockrackipmi.png","sha":"119861e8c159a29784c0dc35206764b8a05aea38"},{"appid":"c7ec3e2f2d9be6a4d313d2451184b08ade93ce47","name":"Audiobookshelf","website":"https://audiobookshelf.org","license":"GNU General Public License v3.0 or later","description":"Audiobookshelf is a self-hosted audiobook server for managing and playing your audiobooks.","enhanced":false,"tile_background":"dark","icon":"audiobookshelf.svg","sha":"a41d72e0a7b4191506cdb993317cedafc6852c0b"},{"appid":"e8354374b262e6f1055e7412d11f24a164a50f79","name":"AVM Fritzbox","website":"https://avm.de","license":"GNU General Public License v2.0 only","description":"\"The\" Fritzbox, stylised as FRITZ!Box, is a series of residential gateway devices produced by the German company AVM GmbH. \r\nFRITZ!OS is the FRITZ!Box operating system and can be easily controlled via your browser. User-friendly menus, easy-to-understand wizards, and the optional advanced mode come in handy in all scenarios.","enhanced":false,"tile_background":"light","icon":"avmfritzbox.png","sha":"a782dedfdb190a615fbbb63f21f37b6fbf0adef3"},{"appid":"47bf44c0ec908654f16bacf131107a5aac3ae7b4","name":"AWX","website":"https://github.com/ansible/awx","license":"Apache License 2.0","description":"AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is the upstream project for Tower, a commercial derivative of AWX.","enhanced":true,"tile_background":"dark","icon":"awx.svg","sha":"82d1c4388df3015d76ba1fcaadd30bd8e3b1718d"},{"appid":"808ff47f28ddce2652860f5da59a4c62a7e285dd","name":"Bacula","website":"https://www.bacula.org","license":"GNU Affero General Public License v3.0","description":"Bacula is a set of Open Source, computer programs that permit you (or the system administrator) to manage backup, recovery, and verification of computer data across a network of computers of different kinds.","enhanced":false,"tile_background":"light","icon":"bacula.png","sha":"007b06acd478e5c05b5a69182f4853c13ac94612"},{"appid":"2577aa56d31c9817a26e412e90d419f70ebc6353","name":"Baïkal","website":"https://sabre.io/baikal","license":"GNU General Public License v3.0 only","description":"Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database.","enhanced":false,"tile_background":"dark","icon":"baikal.png","sha":"5c6d168a144e7ed12da5a8d9d6d21c57bf00e3f6"},{"appid":"c07ac2e365e175d304c1cd409bcfc288ff18594f","name":"Bastillion","website":"https://www.bastillion.io","license":"GNU Affero General Public License v3.0 or later","description":"Bastillion is an open-source web-based SSH console that centrally manages administrative access to systems. A bastion host for administrators with features that promote infrastructure security, including key management and auditing.","enhanced":false,"tile_background":"dark","icon":"bastillion.png","sha":"9fabc3f700061109f59fb5f77ab302f3e4f378c8"},{"appid":"085f0b437f9bf9c98bb68b745c8dcf323a7e0499","name":"Bazarr","website":"https://github.com/morpheus65535/bazarr","license":"GNU General Public License v3.0 only","description":"Bazarr is a companion application to Sonarr and Radarr. It manage and download subtitles based on your requirements. You defined your preferences by TV show or movies and Bazarr take care of everything for you.","enhanced":true,"tile_background":"dark","icon":"bazarr.png","config":{"type":"apikey","stat1":{"name":"missing series","url":":url:/api/episodes/wanted?apikey=:apikey:","key":"total","filter":"none","updateOnChange":"No"},"stat2":{"name":"missing movies","url":":url:/api/movies/wanted?apikey=:apikey:","key":"total","filter":"none","updateOnChange":"No"}},"sha":"076de7b2d7ce4a2acf179d160b1d9e77be552eda"},{"appid":"8a846dca305866d821748c007cf6b64adf00ea22","name":"Bitwarden","website":"https://bitwarden.com","license":"GNU Affero General Public License v3.0","description":"Open source password management solutions for individuals, teams, and business organizations.","enhanced":false,"tile_background":"dark","icon":"bitwarden.svg","sha":"747ba24883bf94945c3953c6283b960eff10c10b"},{"appid":"091d3909d7e0bde850659125a13712c0122a6493","name":"Booksonic","website":"https://booksonic.org","license":"GPL","description":"Booksonic is a server and an app for streaming your audiobooks to any pc or android phone. Most of the functionality is also available on other platforms that have apps for subsonic.","enhanced":false,"tile_background":"dark","icon":"booksonic.png","sha":"3f0dd1784276ffad4db83df0d31c3d3e982b1446"},{"appid":"348c49dd03dddd418929316668d2e67bf2d9ae88","name":"Bookstack","website":"https://www.bookstackapp.com","license":"MIT License","description":"BookStack is a simple, self-hosted, easy-to-use platform for organising and storing information.","enhanced":true,"tile_background":"dark","icon":"bookstack.svg","sha":"b574cbacfccc367a9410f38c65ec4f9d23096fd7"},{"appid":"c7d8a6d722a1ec9a16fae165177c418d4fd63175","name":"Box","website":"https://box.com","license":"Commercial","description":"The company focuses on cloud content management and file sharing service for businesses.","enhanced":false,"tile_background":"dark","icon":"box.png","sha":"b70926dad3e30a00f68fb34cdc5408170900e398"},{"appid":"36cf09d76e7173b82ef23504aae37c05784b0215","name":"Cabot","website":"https://cabotapp.com","license":"MIT License","description":"Self-hosted watchdog for your websites and infrastructure.","enhanced":true,"tile_background":"light","icon":"cabot.png","sha":"8e5b37107ce360b5fefd8745fb79862984d9d3be"},{"appid":"d0404064982ed19f24e76ca261e1fbb4d821c2a6","name":"CalibreWeb","website":"https://github.com/janeczku/calibre-web","license":"GNU General Public License v3.0","description":"Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.","enhanced":false,"tile_background":"dark","icon":"calibreweb.png","sha":"080423be752face0448e790117657a4f000b30d8"},{"appid":"9f2e2dd8217d1186f9ad484d91e009227efa5897","name":"Cardigann","website":"https://github.com/cardigann/cardigann","license":"MIT License","description":"A proxy server for adding new indexers to Sonarr, SickRage and other media managers","enhanced":false,"tile_background":"light","icon":"cardigann.png","sha":"1ba617414ce026c6e5ca177e28c2dd6d75f49ba9"},{"appid":"86c6a58798da154166de71097263f9c40804d636","name":"ChangeDetection.io","website":"https://changedetection.io","license":"Apache License 2.0","description":"Self-hosted change monitoring of web pages.\r\n\r\nKnow when web pages change! Stay ontop of new information!\r\n\r\nLive your data-life pro-actively instead of re-actively, do not rely on manipulative social media for consuming important information.","enhanced":false,"tile_background":"dark","icon":"changedetectionio.png","sha":"974acdffec2e5159505eb6bb7ee3b892511056dc"},{"appid":"ba15c0ff84b20ffe205935dbbf8ffb5f02648632","name":"Check_MK","website":"https://mathias-kettner.de","license":"GNU General Public License v2.0 only","description":"Check_MK is a comprehensive Solution for IT Monitoring of applications, servers, and networks.","enhanced":false,"tile_background":"dark","icon":"checkmk.png","sha":"8595a8367c3fcb3e51f592ce66cac5ac61906c36"},{"appid":"d8a153c2cb84da8b2556b093d1f98659b89d7e26","name":"Chevereto","website":"https://chevereto.com","license":"GNU Affero General Public License v3.0 only","description":"Chevereto Free is a powerful and fast open source image hosting script that allows you to create your very own image hosting website in just minutes.","enhanced":false,"tile_background":"light","icon":"chevereto.png","sha":"f768a0321b42da8fc1bb617a9307544bb38e57ab"},{"appid":"7799a0f63bdae67145c85519239860c8882f9a64","name":"Chronograf","website":"https://www.influxdata.com/time-series-platform/chronograf","license":"GNU Affero General Public License v3.0 or later","description":"Chronograf is an open-source web application designed to visualize\r\nmonitoring data and create alerting and automation rules.","enhanced":false,"tile_background":"dark","icon":"chronograf.png","sha":"c181c094ebe7ae3fa06085954347b0390d135de9"},{"appid":"e4b57a729acdf2e7eefcb9c3022796ed5fdb9aca","name":"Clarkson","website":"https://github.com/linuxserver/Clarkson","license":"MIT License","description":"Clarkson is a web-based dashboard application that gives you a neat and clean interface for logging your fuel fill-ups for all of your vehicles. The application has full multi-user support, as well as multiple vehicles per user. Whenever you fill-up your car or motorcycle, keep the receipt and record the data in Clarkson.","enhanced":false,"tile_background":"light","icon":"clarkson.png","sha":"187f2d1c55553aa1e01ed97994680eadc03c7158"},{"appid":"6f968228bc1947fee1320a37c5b2429dfdbf8081","name":"Cloud CMD","website":"http://cloudcmd.io","license":"MIT License","description":"Cloud Commander a file manager for the web with console and editor. Will help you manage the server and work with files, directories and programs in browser from any computer, mobile or tablet.","enhanced":false,"tile_background":"dark","icon":"cloudcmd.png","sha":"67ca3fd25616ab03dfc2a09ebf2b019782ed6b1a"},{"appid":"e4475bc2121ed1ffd1e742c7c2521ca0f16cef93","name":"Cockpit","website":"https://cockpit-project.org","license":"GNU Lesser General Public License v2.1 only","description":"Cockpit is an interactive server admin interface. It is easy to use and very lightweight. Cockpit interacts directly with the operating system from a real Linux session in a browser.","enhanced":false,"tile_background":"dark","icon":"cockpit.png","sha":"eaeb4539fcc1216f7640370a7b543d55cbaddc96"},{"appid":"ca6a902fe117cd57f037f771998f6c6f35f87be2","name":"Cockpit CMS","website":"https://getcockpit.com","license":"MIT License","description":"Cockpit is an open source, self-hosted, headless and api-driven CMS. It's a simple content platform to manage any structured content.","enhanced":false,"tile_background":"light","icon":"cockpitcms.png","sha":"53911a1b64446b3f9b22374f6e5a2de1db28f3a1"},{"appid":"9eebc5964efd0e6656fe4f143474988bde6c9ef3","name":"Code server","website":"https://github.com/cdr/code-server","license":"MIT License","description":"code-server is VS Code running on a remote server, accessible through the browser.","enhanced":false,"tile_background":"light","icon":"codeserver.png","sha":"98532779f4a937369dbb8a72941bbddfc2c87950"},{"appid":"2ab436efba9e25585ac0ed6232c92fa57173a4aa","name":"CodiMD","website":"https://codimd.org","license":"GNU Affero General Public License v3.0","description":"CodiMD is a realtime, multi-platform collaborative markdown note editor. This means that you can write notes with other people on your desktop, tablet or even on the phone. You can sign-in via multiple auth providers like Facebook, Twitter, GitHub and many more on the homepage.","enhanced":false,"tile_background":"light","icon":"codimd.png","sha":"daed056cc02c2f01d4157124202b92700a3c9929"},{"appid":"03959669b24360f78cd9d5f092ac57a80074b3ac","name":"Concourse","website":"https://concourse-ci.org","license":"Apache License 2.0","description":"Concourse is an open-source continuous thing-doer.\r\n\r\nBuilt on the simple mechanics of resources, tasks, and jobs, Concourse presents a general approach to automation that makes it great for CI/CD.","enhanced":false,"tile_background":"light","icon":"concourse.png","sha":"d4445fb34ae0ec75ee44e6d0a790ccdfed1b3329"},{"appid":"cfca44c2f5ed9c775cf5953ef3a3ab86eae6cb8a","name":"Confluence","website":"https://www.atlassian.com/software/confluence","license":"Commercial","description":"A shared workspace tool for documentation, planning and notes with powerful collaboration features and easy-to-use WYSIWYG editing.","enhanced":false,"tile_background":"dark","icon":"confluence.svg","sha":"5c706c8d00a2c1181116720323dc33435e9ab00f"},{"appid":"8629d759d41163a10142fabb192a49dc33d4b959","name":"CouchPotato","website":"https://couchpota.to","license":"GNU General Public License v3.0 only","description":"Download movies automatically, easily and in the best quality as soon as they are released, via usenet or torrents.","enhanced":true,"tile_background":"dark","icon":"couchpotato.svg","sha":"6f5db8526859c5e4b1981478caeac25406ec373e"},{"appid":"fef97bae9058a5beeacfc2ec9de3fec9c97969ec","name":"cPanel","website":"https://www.cpanel.net","license":"Proprietary","description":"cPanel & WHM is a suite of tools built for Linux OS that gives you the ability to automate web hosting tasks via a simple graphical user interface. Its goal — to make managing servers easier for you and managing websites easier for your customers.","enhanced":false,"tile_background":"light","icon":"cpanel.png","sha":"9d1af47d42b4fd9ad3e556ac9ce9b1556e5fae29"},{"appid":"e677af5c4f005d316f3a74b26b0134cfe5288033","name":"CryptPad","website":"https://cryptpad.fr","license":"GNU Affero General Public License v3.0 or later","description":"The Zero Knowledge, Self-Hosted Cloud. CryptPad is a private-by-design alternative to popular office tools and cloud services. All the content stored on CryptPad is encrypted before being sent, which means nobody can access your data unless you give them the keys (not even us).","enhanced":false,"tile_background":"light","icon":"cryptpad.png","sha":"b7d5c7277edd88f1dfb140a5e459b0536aa79581"},{"appid":"ba8ed4dc9e438b22c9456a78a2c09652955be42c","name":"CUPS","website":"https://www.cups.org","license":"GNU General Public License v1.0 or later","description":"The standards-based, open source printing system developed by Apple for iOS®, iPadOS®, and macOS®. CUPS uses IPP Everywhere™ to support printing to local and network printers.","enhanced":false,"tile_background":"light","icon":"cups.svg","sha":"d4c412159124848ae27895babe8ce559c18019de"},{"appid":"bc28bfa49a73fd2384cbecd6572ea72d0166aa28","name":"Deluge","website":"https://deluge-torrent.org","license":"GNU General Public License v3.0 only","description":"Deluge is a BitTorrent client written in Python. Deluge is cross-platform, using a front and back end architecture where libtorrent, a software library written in C++ which provides the application's networking logic, is connected to one of various front ends through the project's own Python bindings","enhanced":true,"config":{"auth_payload":{"method":"auth.login","id":1,"params":[":password:"]},"type":"apikey","stats":[{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"size","updateOnChange":"Yes","suffix":""},{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}],"stat1":{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"size","updateOnChange":"Yes","suffix":""},"stat2":{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}},"tile_background":"dark","icon":"deluge.svg","sha":"d7d248a2acd9130b64abb5d69f3e8971924b8134"},{"appid":"3561ed8ae1660eadbe92128eedcff5e6f8e9280e","name":"Dillinger","website":"https://dillinger.io","license":"MIT License","description":"Dillinger is a cloud-enabled, mobile-ready, offline-storage compatible,\r\nAngularJS-powered HTML5 Markdown editor.","enhanced":false,"tile_background":"dark","icon":"dillinger.png","sha":"d78aaed631b52e273fef1fc031f324d09aa4a554"},{"appid":"12764b8bb7cd332f7d4937851a2af2815df706ac","name":"Directus","website":"https://directus.io","license":"GNU General Public License v3.0 only","description":"Directus is a future-proof, open source, headless CMS to manage all your content in one place. It's elegant and easy user interface will enable you to craft powerfull content backend APIs in minutes.","enhanced":false,"tile_background":"dark","icon":"directus.png","sha":"a93748312d635081ead30ce5d68d1ce9fcab6515"},{"appid":"a17f1a47dbc391814d321ae33ad51c0c7695a08d","name":"DokuWiki","website":"https://www.dokuwiki.org","license":"GNU General Public License v2.0 only","description":"DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.","enhanced":false,"tile_background":"dark","icon":"dokuwiki.png","sha":"8aae1dcf245b5d5f7112b5a97d1feec454ad4199"},{"appid":"17ea5305bc5cb99da61e121542864bb15e280f30","name":"Domoticz","website":"https://www.domoticz.com","license":"GNU General Public License v3.0 only","description":"Open source Home Automation System","enhanced":true,"tile_background":"dark","icon":"domoticz.png","sha":"6d6576f301d9d01105dc5e66e828cfa5a76d187e"},{"appid":"176d99d897dbd7c02b1a1db4142054f74a76aa47","name":"Dozzle","website":"https://dozzle.dev","license":"MIT License","description":"Dozzle is a real-time log viewer for docker containers.","enhanced":false,"tile_background":"dark","icon":"dozzle.png","sha":"6d26dc2356cf457a5e7b3fdf95272e014d22954b"},{"appid":"1430fd26ed07651f08ab03098c8e6745701abf6a","name":"Drone","website":"https://github.com/drone/drone","license":"Apache License 2.0","description":"Drone is a Continuous Delivery system built on container technology. Drone uses a simple YAML configuration file, a superset of docker-compose, to define and execute Pipelines inside Docker containers.","enhanced":false,"tile_background":"light","icon":"drone.scg","sha":"6a7b7f4cf9d0fa5da2f85de8a47bdd6790bf1af0"},{"appid":"ff96f6956d6ce73ca564a5843157a9849a8f1c58","name":"Droppy","website":"https://github.com/silverwind/droppy","license":"BSD Source Code Attribution","description":"droppy is a self-hosted file storage server with a web interface and capabilities to edit files and view media directly in the browser. It is particularly well-suited to be run on low-end hardware like the Raspberry Pi.","enhanced":false,"tile_background":"light","icon":"droppy.png","sha":"f1d371f646fd38204215d3c90d6050c0ccc7102b"},{"appid":"9a5f55cd744dbbcb8b1cffdd748605565da9edce","name":"Duplicacy","website":"https://duplicacy.com","license":"Commercial","description":"Duplicacy is a new generation cross-platform cloud backup tool. Duplicacy backs up your files to many cloud storage locations with compression, client-side encryption, and the highest level of deduplication.\r\nFeature-Driven Design:\r\nIncremental backup - Only back up what has been changed\r\nFull snapshot - Although each backup is incremental, it must behave like a full snapshot for easy restore and deletion\r\nDeduplication - Identical files must be stored as one copy (file-level deduplication), and identical parts from different files must be stored as one copy (block-level deduplication)\r\nEncryption -Encrypt not only file contents but also file paths, sizes, times, etc.\r\nDeletion - Every backup can be deleted independently without affecting others\r\nConcurrent backup - Multiple clients can back up to the same storage at the same time\r\nBackup migration - All or selected backups can be migrated from one storage to another","enhanced":false,"tile_background":"dark","icon":"duplicacy.png","sha":"52ce30cacb104d1565a8afd62a4c111d5b58a2c2"},{"appid":"bc99430645db7c79e2901d65598bb8cf91f77b4e","name":"Duplicati","website":"https://www.duplicati.com","license":"GNU Lesser General Public License v2.1 only","description":"Free backup software to store backups online with strong encryption. Works with FTP, SSH, WebDAV, OneDrive, Amazon S3, Google Drive and many others.","enhanced":false,"tile_background":"dark","icon":"duplicati.png","sha":"f1567f1d1440827047e189b07ce0d5c96fe832e5"},{"appid":"dece05484839df110745b0a800297c33cc078287","name":"Element","website":"https://element.io","license":"Apache License 2.0","description":"All-in-one secure chat app for teams, friends and organisations. Keeps conversations in your control, safe from data-mining and ads. Talk to everyone through the open global Matrix network, protected by proper end-to-end encryption.","enhanced":false,"tile_background":"dark","icon":"element.png","sha":"9b1b9ec9e91a46236c7299eb4a48bfcaa0017c79"},{"appid":"3021fea57e9b932f14822d47e47d163f47812ef1","name":"Emby","website":"https://emby.media","license":"Proprietary","description":"Emby (formerly Media Browser) is a media server designed to organize, play, and stream audio and video to a variety of devices.","enhanced":true,"tile_background":"dark","icon":"emby.png","config":{"type":"apikey","stat1":{"name":"Movies","url":":url:emby/Items/Counts?api_key=:apikey:","key":"MovieCount","filter":"none","updateOnChange":"No","suffix":""},"stat2":{"name":"Series","url":":url:emby/Items/Counts?api_key=:apikey:","key":"SeriesCount","filter":"none","updateOnChange":"No","suffix":""}},"sha":"1487b5e21f81a45633683f2cea97bd3c81aaafc9"},{"appid":"226df5bc61e5f2e107911be546e20ef7f1397e07","name":"EmbyStat","website":"https://github.com/mregni/EmbyStat","license":"MIT License","description":"Multiplatform statistics server for Emby server.","enhanced":false,"tile_background":"dark","icon":"embystat.png","sha":"96be889b2e24409f453ee9f112f4cd16fcae4d9a"},{"appid":"6b1df10bbb1575fb941f402500ccb516ac34b542","name":"ESPHome","website":"https://esphome.io","license":"MIT License","description":"ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems.","enhanced":false,"tile_background":"light","icon":"esphome.png","sha":"1d58bb4a8454790aa946f2206600d5e3dc6885f7"},{"appid":"601c9ad5341b0ba351540520eabd0a6cb1526a86","name":"FileBot","website":"https://www.filebot.net","license":"Commercial","description":"FileBot is the ultimate tool for renaming and organizing your movies, TV shows and Anime. Match and rename media files against online databases, download artwork and cover images, fetch subtitles, write metadata, and more, all at once in matter of seconds. It's smart and just works.","enhanced":false,"tile_background":"dark","icon":"filebot.svg","sha":"a3d6223ca825b5b8fa243f00df84aa4745d65f5f"},{"appid":"ba05dd8e070851895ee6184eb9778cfa0753a490","name":"FileBrowser","website":"https://github.com/filebrowser/filebrowser","license":"Apache License 2.0","description":"filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app or as a middleware.","enhanced":false,"tile_background":"dark","icon":"filebrowser.svg","sha":"ef7f8631cade47f0097d5bd29a6311e1b5fbad40"},{"appid":"a3440558df5c42ea2fdaf402aa9624d5ee586515","name":"FileFlows","website":"https://fileflows.com","license":"Freemium","description":"Application that processes files using Flow based rules. Primarily designed to convert video files to specific formats automatically","enhanced":true,"tile_background":"dark","icon":"fileflows.png","sha":"79a9f160280cf1bfc883ee0e67b071e77b349dd3"},{"appid":"b8fa84fbe86d39557144410d201d466c53cb0c4e","name":"FileRun","website":"https://filerun.com","license":"Commercial","description":"FileRun is a self-hosted Google Drive alternative. It is a full featured web based file manager with an easy to use user interface. It is great for managing your photo, movie, audio collection, or sharing files with your family and friends.","enhanced":false,"tile_background":"light","icon":"filerun.svg","sha":"b96d86db3f42b9706881cef0923e76a93ba91314"},{"appid":"f798d73306e6c7b7145b163baf11d88f43c91527","name":"Firefly 3","website":"https://www.firefly-iii.org","license":"GNU General Public License v3.0 only","description":"\"Firefly III\" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. It can import data from external sources and it has many neat financial reports available. (Taken from the README)","enhanced":false,"tile_background":"light","icon":"firefly.png","sha":"11f9e7c9b349198a0afb1d2ee6dca6b8fa56d701"},{"appid":"675e42556cab1552e279e17a1f2a363e334fd2f0","name":"Firefox Send","website":"https://send.firefox.com","license":"Mozilla Public License 2.0","description":"Firefox Send lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever.","enhanced":false,"tile_background":"light","icon":"firefoxsend.png","sha":"33132330afd2672aa44835c90cd459ed0d324cb4"},{"appid":"bbe5a51792acf2e90900e10d33bb02a86a50b6ff","name":"FlexGet","website":"https://www.flexget.com","license":"MIT License","description":"like sonarr and radarr etc. combined, but with integrations to trakt.tv etc. Actually very capable","enhanced":false,"tile_background":"dark","icon":"flexget.png","sha":"cfa0b5dfa86ae2586784db0e1682c6b69f95ebaf"},{"appid":"ff0db992256ad5c44c979bf4be0234a919eccdc7","name":"Flood","website":"https://github.com/jfurrow/flood","license":"GNU General Public License v3.0 only","description":"A web UI for rTorrent with a Node.js backend and React frontend.","enhanced":false,"tile_background":"light","icon":"flood.png","sha":"3ae4fe219fad1e3e8132c24919c82d94e735b861"},{"appid":"0619bf7cc62aeb10ccbf7566912d4d44bb42e7a5","name":"Focalboard","website":"https://www.focalboard.com","license":"Apache License 2.0","description":"Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.\r\nIt's a project management tool that helps define, organize, track and manage work across teams, using a familiar kanban board view.","enhanced":false,"tile_background":"light","icon":"focalboard.svg","sha":"8bb0444240350bddb7a31480dc3bda2a2550c39e"},{"appid":"d4f480701f176a366bb9175ce282f80d18da5122","name":"Folding@Home","website":"https://foldingathome.org","license":"Proprietary","description":"Folding@home is a project focused on disease research. The problems we’re solving require so many computer calcul­ations – and we need your help to find the cures!\r\nAccess the your F@H webUI directly from Heimdall.","enhanced":true,"tile_background":"dark","icon":"foldingathome.svg","sha":"7ec560147e445a40c817cd8d3995f9b5643eb38c"},{"appid":"4179f0ec44f292021561f0ef872892aaf604f670","name":"Fortinet FortiMonitor","website":"https://fortimonitor.forticloud.com","license":"Commercial","description":"FortiMonitor helps organizations modernize their performance-monitoring tools into a comprehensive digital experience monitoring platform to gain end-to-end visibility into the overall user experience. It doesn’t matter where the user resides or where the application is hosted.","enhanced":true,"tile_background":"light","icon":"fortinetfortimonitor.png","sha":"da8036aa98d52d4cbb2a704abe4ae39f9ac3a4d6"},{"appid":"3d258071fa9cd41a85627f6bf7fc6998c3a8f5cf","name":"Freenas","website":"https://www.freenas.org","license":"BSD-2-Clause","description":"FreeNAS is an embedded open source network-attached storage (NAS) operating system based on FreeBSD.","enhanced":true,"tile_background":"light","icon":"freenas.png","sha":"0f3e430fbfc8912caf6747449c427830dfc0171a"},{"appid":"5c68de7acdaff4da4f680545bb51a847840c81da","name":"FreshRSS","website":"https://freshrss.org","license":"GNU Affero General Public License v3.0","description":"FreshRSS is a self-hosted RSS feed aggregator. It is lightweight, easy to work with, powerful and customizable.","enhanced":true,"tile_background":"dark","icon":"freshrss.svg","sha":"cdbbb5d20c618ffdb89d6db089eff0c6cd54ce7a"},{"appid":"d27d8db484c3e734262730b0673f158f1f88924d","name":"Frigate","website":"https://frigate.video/","license":"MIT License","description":"Frigate is an open source NVR built around real-time AI object detection. All processing is performed locally on your own hardware, and your camera feeds never leave your home.","enhanced":false,"tile_background":"light","icon":"frigate.svg","sha":"3e8decc01231dc462f7f55516ec7b1d12663ac07"},{"appid":"36211c66ecd5984827673c89373ae184f06c000f","name":"Fronius","website":"https://www.fronius.com","license":"MIT License","description":"This app allows to monitor the electrical production of the photovoltaic panels connected to a Fronius inverter.\r\n\r\nThe enhanced app connects to the inverter API and shows the current production of the system, as well as the daily production.","enhanced":true,"tile_background":"dark","icon":"fronius.svg","sha":"de6db7628c4aac96f66f3ca04f8c7aef5779bada"},{"appid":"7853f58e7245aa624ddec1f97d7b4c18ac0047c7","name":"Funkwhale","website":"https://funkwhale.audio","license":"GNU Affero General Public License v3.0 only","description":"Funkwhale is a community-driven project that lets you listen and share music and audio within a decentralized, open network.","enhanced":false,"tile_background":"light","icon":"funkwhale.svg","sha":"c846432af5a7b1ff8ce2ab8dac53bbf726fdfa8f"},{"appid":"c4745785181de931cfd5bd79294cb1687d82aea9","name":"Ghost","website":"https://ghost.org","license":"MIT License","description":"Fiercely independent, professional publishing. A fully open source, powerful platform for building and running modern publications, we power serious blogs, magazines and journalism from DuckDuckGo to OpenAI & Sky News.","enhanced":true,"tile_background":"light","icon":"ghost.png","sha":"dfd1be680959ff062b0d0c7d0271ec7f6837aaa8"},{"appid":"060b3b99f88e96085b4a68e095bc9e3d1d91e1bc","name":"Gitea","website":"https://gitea.io","license":"MIT License","description":"Gitea is a community managed fork of Gogs, lightweight code hosting solution written in Go and published under the MIT license.","enhanced":false,"tile_background":"dark","icon":"gitea.svg","sha":"4cdf699f56dfdc83b378ad17c8ad18633748255f"},{"appid":"64b2b6d12bfe4baae7dad3d018f8cbf6b0e7a044","name":"GitHub","website":"https://github.com","license":"MIT License","description":"GitHub brings together the world's largest community of developers to discover, share, and build better software.","enhanced":false,"tile_background":"light","icon":"github.svg","sha":"befbfb2172537c177d1fa32a9fd97954aa03daee"},{"appid":"322f31631de66bcf71bd6c199b41606d516fe3f9","name":"GitLab","website":"https://gitlab.com","license":"MIT License","description":"From project planning and source code management to CI/CD and monitoring, GitLab is a single application for the entire DevOps lifecycle.","enhanced":true,"tile_background":"dark","icon":"gitlab.svg","sha":"848ef4664caa63eb9b78738c8ef8ab40edfcdf14"},{"appid":"8acd9f66ec707deda1345479909166aa1c31bdad","name":"Glances","website":"https://nicolargo.github.io/glances","license":"GNU Lesser General Public License v3.0 only","description":"Glances is a cross-platform monitoring tool which aims to present a large amount of monitoring information through a curses or Web based interface.","enhanced":false,"tile_background":"dark","icon":"glances.png","sha":"cac7578c269f66fcbe2fdfdda34465c29a719132"},{"appid":"df505c6582933deef50ad5181747782f1f514713","name":"Gogs","website":"https://gogs.io","license":"MIT License","description":"A painless self-hosted Git service.","enhanced":false,"tile_background":"dark","icon":"gogs.png","sha":"722c1d48c6fadcdf4ca2beb6aa72aea42389cdf3"},{"appid":"b3fdc0b49deb0e7db32311b64867b000409193e5","name":"Gotify","website":"https://gotify.net","license":"MIT License","description":"A self-hosted push notification service.","enhanced":false,"tile_background":"dark","icon":"gotify.png","sha":"bc53dfef30cc7684cc4ef5ee5ca0f64674b11531"},{"appid":"f519bce8b0ae84d8dbbc0a793bf6a180043be855","name":"Grafana","website":"https://grafana.com","license":"Apache License 2.0","description":"Data visualization & Monitoring with support for Graphite, InfluxDB, Prometheus, Elasticsearch and many more databases.","enhanced":false,"tile_background":"dark","icon":"grafana.svg","sha":"d6f5ead92435c766d32c383b170ab82888275097"},{"appid":"b1577ad1f7e68c2190f8c68885f945c855b0d5ea","name":"Grav","website":"https://getgrav.org","license":"MIT License","description":"Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful Package Management System to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.","enhanced":false,"tile_background":"light","icon":"grav.png","sha":"509cac826afc85571c2c28a9ef83ae420b84144f"},{"appid":"6d88bccf40bf65b911fe79d78c7af98e382f0c1a","name":"Graylog","website":"https://www.graylog.org","license":"GNU General Public License v3.0 only","description":"Finally, all your log data available and accessible in one central location. Graylog is an open source log management platform.","enhanced":false,"tile_background":"dark","icon":"graylog.svg","sha":"7c913c468a3ad167d69c855366ecb73904f88b36"},{"appid":"c1292685cddb9472cece8e457c31fbf6446d5010","name":"Grocy","website":"https://grocy.info","license":"MIT License","description":"grocy is a web-based self-hosted groceries & household management solution for your home.","enhanced":false,"tile_background":"light","icon":"grocy.svg","sha":"d50ef9a26280b6f076d38a52d08461c602b55bae"},{"appid":"1c772e7ff575c76274b2ab9f90d82b428029b50b","name":"Guacamole","website":"https://guacamole.apache.org","license":"Apache License 2.0","description":"Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.","enhanced":false,"tile_background":"dark","icon":"guacamole.png","sha":"4992aa34d3671878da8af0eaa40cad08627c72e3"},{"appid":"b96c7f74fe817b3fb2ea26bfefbf26efaffe6dea","name":"Handbrake","website":"https://handbrake.fr","license":"GNU General Public License v2.0 or later","description":"HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs.\r\n\r\nThe GUI of the application is accessed through a modern web browser (no installation or configuration needed on client side) or via any VNC client.\r\n\r\nA fully automated mode is also available: drop files into a watch folder and let HandBrake process them without any user interaction.","enhanced":false,"tile_background":"dark","icon":"handbrake.png","sha":"6c41477f133401b230816d784d1615f8afda9ced"},{"appid":"b6ac1c3e3b1f6f4296faceeb0eaeda83d1f578a4","name":"HAProxy","website":"http://www.haproxy.org","license":"GNU General Public License v3.0 or later","description":"HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for very high traffic web sites and powers quite a number of the world's most visited ones. Over the years it has become the de-facto standard opensource load balancer, is now shipped with most mainstream Linux distributions, and is often deployed by default in cloud platforms.","enhanced":false,"tile_background":"dark","icon":"haproxy.png","sha":"43bb0538c587eca424584eca7ac6cd32133c9312"},{"appid":"e347660d52d87798674d406f8c820aa07835b0be","name":"Harbor","website":"https://goharbor.io","license":"Apache License 2.0","description":"Harbor is an open source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted. Harbor, a CNCF Graduated project, delivers compliance, performance, and interoperability to help you consistently and securely manage artifacts across cloud native compute platforms like Kubernetes and Docker.","enhanced":false,"tile_background":"dark","icon":"harbor.svg","sha":"4e51e2cd6be048ec0012058c8d5325691b1d4555"},{"appid":"241e4d951466ee4a38bde6aa73f7c8f0fab3a3f2","name":"Hasura","website":"https://hasura.io","license":"Apache License 2.0","description":"Instantly make your data accessible over GraphQL.","enhanced":false,"tile_background":"light","icon":"hasura.svg","sha":"139c80c13b70576f58c50dceaf6ccf9df990feca"},{"appid":"8fe021dbb159e76695ab080421f68fac90579b0c","name":"HDHomeRun","website":"https://www.silicondust.com","license":"Proprietary","description":"The DVR reimagined. Watch and Record all of your favorite live TV. Your way.","enhanced":true,"tile_background":"dark","icon":"hdhomerun.png","sha":"5fdb82c01061275f01c2674591edfd194599c91b"},{"appid":"355bf1cb47b9ff34cad71db2350056dfb2794c68","name":"Headphones","website":"https://github.com/rembo10/headphones","license":"GNU General Public License v3.0 only","description":"Headphones is an automated music downloader for NZB and Torrent, written in Python. It supports SABnzbd, NZBget, Transmission, µTorrent, Deluge and Blackhole.","enhanced":false,"tile_background":"dark","icon":"headphones.png","sha":"ad690e9ec64c32158c0d15bc6140af95ab8c4ac4"},{"appid":"2d97a1f26a2c0647566d6e0a1779a024607f9f1d","name":"Healthchecks","website":"https://healthchecks.io","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Instant alerts when your cron jobs fail silently.","enhanced":false,"tile_background":"light","icon":"healthchecks.png","sha":"410fed85b1b2dfdd131d1685962a6060a6d349b8"},{"appid":"5c81a4f5ee23ebffa0724a22a040c54e6cb9d7c5","name":"HomeAssistant","website":"https://www.home-assistant.io","license":"Apache License 2.0","description":"Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.","enhanced":true,"tile_background":"dark","icon":"homeassistant.svg","sha":"13eeaad3602c72d6a1e5fb964d4778c838a4c0a8"},{"appid":"7d9fd30322f354d733c7c3b1b395f1655d12beb0","name":"Homebridge","website":"https://homebridge.io","license":"Apache License 2.0","description":"Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of \"smart home\" devices.\r\n\r\nSince Siri supports devices added through HomeKit, this means that with Homebridge you can ask Siri to control devices that don't have any support for HomeKit at all.","enhanced":true,"tile_background":"dark","icon":"homebridge.svg","sha":"a1d4024c44c991913be6999e07f3b9be77c5ef0d"},{"appid":"8a30fca9ea5b46722cbdad24c7470a442718cac8","name":"Homer","website":"https://github.com/bastienwirtz/homer","license":"Apache License 2.0","description":"A very simple static homepage for your server.","enhanced":false,"tile_background":"dark","icon":"homer.svg","sha":"10d330a94e3694fe45ae81edeb9ce7189011579e"},{"appid":"e79bac4ca442f484164741d7d41ea4e2426b308e","name":"Hubitat","website":"https://hubitat.com","license":"Proprietary","description":"Hubitat is a home automation platform supporting z-wave, zigbee, and many other devices. It offers local administration and remote access.","enhanced":false,"tile_background":"dark","icon":"hubitat.png","sha":"29f7d296cb02af794e8d5dfdc1f7d8b7610a4400"},{"appid":"2403e3c8c1da513b11a77bf482cd494658695d05","name":"Huginn","website":"https://github.com/huginn/huginn","license":"MIT License","description":"Huginn is a system for building agents that perform automated tasks for you online. They can read the web, watch for events, and take actions on your behalf. Huginn's Agents create and consume events, propagating them along a directed graph. Think of it as a hackable version of IFTTT or Zapier on your own server.","enhanced":false,"tile_background":"dark","icon":"huginn.png","sha":"f0f78d6c5391af45fb30684d79ef9300fb76d66f"},{"appid":"13a2a3d6e668c91b77ccc436162118ce7568ee4e","name":"Icecast","website":"https://icecast.org","license":"GNU General Public License v2.0 only","description":"Icecast is a streaming media (audio/video) server which currently supports Ogg (Vorbis and Theora), Opus, WebM and MP3 streams.\r\nIt can be used to create an Internet radio station or a privately running jukebox and many things in between. It is very versatile in that new formats can be added relatively easily and supports open standards for communication and interaction.","enhanced":false,"tile_background":"dark","icon":"icecast.png","sha":"9e1280eed3a44740d97d65468f0f31452a0f667a"},{"appid":"d483256e2837a012106afa135d3e4ba1a03c8ddb","name":"Icinga Web","website":"https://icinga.com","license":"GNU General Public License v2.0 only","description":"Icinga Web 2 is a powerful PHP framework for web applications that comes in a clean and reduced design. It’s fast, responsive, accessible and easily extensible with modules.","enhanced":false,"tile_background":"light","icon":"icingaweb.svg","sha":"2d50c1c972c364e9808b77329ffb345b6666d954"},{"appid":"2fa965004249898edbbd6030adfdb0ead5bc5f7c","name":"iDRAC","website":"https://dell.com","license":"Proprietary","description":"The Dell Remote Access Controller or DRAC is an out-of-band management platform on Dell servers.","enhanced":false,"tile_background":"dark","icon":"idrac.png","sha":"c397df32d8e5c5d1b730cb8e8a7a5bccec557e19"},{"appid":"ef49854fbbea334dbaf393d4b4ad9381cb931e91","name":"iLO","website":"https://www.hpe.com/us/en/servers/integrated-lights-out-ilo.html","license":"Proprietary","description":"HP Integrated Lights-Out, is an embedded server management technology by Hewlett-Packard ","enhanced":false,"tile_background":"light","icon":"ilo.svg","sha":"6fc23c4eb78e3b58803cddafc4c588942b0a1e29"},{"appid":"5e1e914cba38acaa83d4e39139dadbec478fbb6e","name":"InfluxDB","website":"https://www.influxdata.com/products/influxdb","license":"MIT License","description":"InfluxDB is an open source time series platform. This includes APIs for storing and querying data, processing it in the background for ETL or monitoring and alerting purposes, user dashboards, and visualizing and exploring the data and more.","enhanced":false,"tile_background":"dark","icon":"influxdb.svg","sha":"e897da488ff00b0e5f5dadaeb0f537ab7d7ef509"},{"appid":"c112604b5b33659f85dda854ac8bc271cb744b8a","name":"Infoblox","website":"https://infoblox.com","license":"Commercial","description":"The company focuses on managing and identifying devices connected to networks—specifically for the Domain Name System, Dynamic Host Configuration Protocol, and IP address management","enhanced":false,"tile_background":"dark","icon":"infoblox.svg","sha":"b228eb03ef5e577690841dc382fcbd1905f8e8be"},{"appid":"44aae3efe784b1886f020103d8344287be143c58","name":"Invidious","website":"https://github.com/omarroth/invidious","license":"Apache License 2.0","description":"Self-hosted, Open Source YouTube Alternative","enhanced":false,"tile_background":"light","icon":"invidious.svg","sha":"ac5fe7f879f416bb5558433e080d3b16c9415279"},{"appid":"f4a9130aed175372c50f1b36cbc740193aed5fdf","name":"Invoice Ninja","website":"https://www.invoiceninja.com","license":"Attribution Assurance License","description":"A feature-rich, easy to use, open source invoicing suite. You can use the hosted service or host it yourself.","enhanced":false,"tile_background":"dark","icon":"invoiceninja.png","sha":"3b8d988771907c9a7a3b8ac9dc5ef9768b10af0f"},{"appid":"e3e34703718888700cefb3c28a0e52cb6a903ff0","name":"ioBroker","website":"https://www.iobroker.net","license":"MIT License","description":"ioBroker is an integration platform for the Internet of Things, focused on Building Automation, Smart Metering, Ambient Assisted Living, Process Automation, Visualization and Data Logging","enhanced":false,"tile_background":"light","icon":"iobroker.png","sha":"c099ae1b38bef9fe192af684efb4c83965aaf62f"},{"appid":"9d24b65315557ddd848ba44b09191a6ab305966f","name":"Jackett","website":"https://github.com/Jackett/Jackett","license":"GNU General Public License v2.0 only","description":"Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software.","enhanced":false,"tile_background":"light","icon":"jackett.svg","sha":"5db83ada597098431a53d08b5bb24bdc26246241"},{"appid":"917883dc82d936304725edacb6bf11e5cf537be6","name":"Jaeger","website":"https://www.jaegertracing.io","license":"Apache License 2.0","description":"Jaeger is a distributed tracing platform, which can be used for monitoring microservices-based distributed systems.","enhanced":true,"tile_background":"light","icon":"jaeger.svg","sha":"4ac240e6a8dacd23889f405caf2ddb5708ecfb09"},{"appid":"af7b37e2841d9150f6abd5a936b32a1f681d6bda","name":"JDownloader","website":"http://jdownloader.org","license":"Creative Commons Attribution Non Commercial Share Alike 2.0 Generic","description":"JDownloader is a free, open-source download management tool with a huge community of developers that makes downloading as easy and fast as it should be.","enhanced":false,"tile_background":"dark","icon":"jdownloader.png","sha":"780eb3119a92355efc1ae776aef06ae4f1b5c8c6"},{"appid":"5c64032d583b4cf000188a68c373d41b8e1b34c1","name":"Jeedom","website":"https://www.jeedom.com/site/fr","license":"Open Source","description":"Open source Home Automation System","enhanced":false,"tile_background":"light","icon":"jeedom.png","sha":"3c483409fa3a60ae7f4b8908bc4234bace3d6f2c"},{"appid":"3e0a7f109bd760b9474c78cb652e8c3e82669226","name":"Jellyfin","website":"https://jellyfin.github.io","license":"GNU General Public License v2.0 only","description":"Jellyfin is the Free Software Media System that puts you in control of managing and streaming your media. There are no strings attached, no premium licenses or features, and no hidden agendas.","enhanced":true,"tile_background":"dark","icon":"jellyfin.svg","sha":"4d46374169d739ac2671748c53aea6383be42fbb"},{"appid":"d95b56ce41a2e1ac4cecdd398defd7414407cc08","name":"Jenkins","website":"https://jenkins.io","license":"MIT License","description":"Jenkins is an open source automation server with an unparalleled plugin ecosystem to support practically every tool as part of your delivery pipelines.","enhanced":false,"tile_background":"light","icon":"jenkins.svg","sha":"7f68abe4b00b3808e74a8cba1eac7cb083a53492"},{"appid":"3fb76ec47a9913f61e1bba0337af66ff0c59cc74","name":"Jira","website":"https://www.atlassian.com/software/jira","license":"Commercial","description":"A bug tracking and agile project management software with powerful collaboration features and easy-to-use WYSIWYG editing","enhanced":false,"tile_background":"light","icon":"jira.svg","sha":"5364797ae861a094a1424ba2e35d2512848ea1de"},{"appid":"5640232c98c04a627fbdcc1cb26cd34a4a0088bc","name":"Jitsi","website":"https://jitsi.org","license":"Apache License 2.0","description":"Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.","enhanced":false,"tile_background":"light","icon":"jitsi.png","sha":"12b4a3d3fbd93b9338adbf033c3d7fab14a37042"},{"appid":"1f87fdb388c8208f77da09b7507b59635fb7ddcb","name":"Joomla","website":"https://www.joomla.org","license":"GNU General Public License v2.0 or later","description":"Joomla! is the mobile-ready and user-friendly way to build your website.","enhanced":false,"tile_background":"light","icon":"joomla.png","sha":"f2ceda7561fcbb4e060a18258f67296931801082"},{"appid":"7d93500c86ae587b3d9f4bf1b8cec36f221c8183","name":"Jupyter","website":"https://jupyter.org","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Open source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.","enhanced":false,"tile_background":"light","icon":"jupyter.svg","sha":"9d24bcfbe31c45bcd320ce9924311a73e5ae834a"},{"appid":"43036744dd731a810155d82144c286cae5cb8ca3","name":"Kanboard","website":"https://kanboard.org","license":"MIT License","description":"Kanboard is a free and open source Kanban project management software.","enhanced":false,"tile_background":"light","icon":"kanboard.png","sha":"c13d7321851c0ec7d64300aa34baf3522ae31b15"},{"appid":"d1081e351fbebe0deb0c2867d5f731c8f9cc3fd8","name":"Keycloak","website":"https://www.keycloak.org","license":"Apache License 2.0","description":"Open Source Identity and Access Management.","enhanced":false,"tile_background":"dark","icon":"keycloak.svg","sha":"b20cf28e1545c6049a510606bd00fe91aad4526d"},{"appid":"80d4015f1f71198cb285a89daf9796ebde0b5c29","name":"Kibana","website":"https://www.elastic.co/products/kibana","license":"Apache License 2.0","description":"Kibana lets you visualise your Elasticsearch data and navigate the Elastic Stack.","enhanced":false,"tile_background":"light","icon":"kibana.png","sha":"a62f477c792b95828109bbeeb94cb59b5d62b59b"},{"appid":"e928abf116d933773b1e4e31445213f1f1b01609","name":"Kimai","website":"https://www.kimai.org","license":"GNU General Public License v3.0 only","description":"Kimai is a free open source timetracker. It tracks work time and prints out a summary of your activities on demand. Yearly, monthly, daily, by customer, by project, by action …","enhanced":false,"tile_background":"dark","icon":"kimai.png","sha":"09330baad1cd4721f370ee9f3394bed0c3facc96"},{"appid":"dcd2c1d3cbc33b14e439da0d94c1451e70d7536e","name":"Kitana","website":"https://github.com/pannal/Kitana","license":"MIT License","description":"Kitana exposes your Plex plugin interfaces \"to the outside world\". It does that by authenticating against Plex.TV, then connecting to the Plex Media Server you tell it to, and essentially proxying the plugin UI. It has full PMS connection awareness and allows you to connect locally, remotely, or even via relay.","enhanced":false,"tile_background":"light","icon":"kitana.png","sha":"3e3fb4ee71e05a06f3c94a68e145dc63fd936027"},{"appid":"8ac539a79155a0032834264ac3f6dbd38f1c812d","name":"Kodi","website":"https://kodi.tv","license":"GNU General Public License v1.0 or later","description":"Kodi (formerly known as XBMC) is an award-winning free and open source (GPL) software media player and entertainment hub that can be installed on Linux, OSX, Windows, iOS and Android, featuring a 10-foot user interface for use with televisions and remote controls.","enhanced":true,"tile_background":"dark","icon":"kodi.svg","sha":"621f5ab1c2a99d480d46399f3c6e288c44c5da26"},{"appid":"6cd97a5fefab651371f821cb5167733112fbc536","name":"Komga","website":"https://komga.org","license":"MIT License","description":"Komga is a free and open source comics/mangas server.","enhanced":true,"tile_background":"dark","icon":"komga.svg","sha":"9a220a332e57ac1856ef06f7a3d228320ec87a01"},{"appid":"22b161d97fbf69f88c548fa1dc938f0840abfd58","name":"Kopia","website":"https://kopia.io","license":"Apache License 2.0","description":"Kopia is a simple, cross-platform tool for managing encrypted backups in the cloud. It provides fast, incremental backups, secure, client-side end-to-end encryption, compression and data deduplication.","enhanced":false,"tile_background":"light","icon":"kopia.png","sha":"a1c1a66128b33a7705ab1063d3cb341d320dda61"},{"appid":"556651b611ac6cb9876f54eb950084090e060846","name":"Krusader","website":"https://krusader.org","license":"GNU General Public License v3.0 only","description":"Krusader is an advanced twin panel (commander style) file manager for KDE Plasma and other desktops in the *nix world, similar to Midnight or Total Commander.","enhanced":false,"tile_background":"dark","icon":"krusader.svg","sha":"052d7050bf1125186d04ae28e3ace851656d05a0"},{"appid":"211e5bfaaa8f220a748e1e9ef8a2513cb391f651","name":"Kubernetes Dashboard","website":"https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard","license":"Apache License 2.0","description":"Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters. It allows users to manage applications running in the cluster and troubleshoot them, as well as manage the cluster itself.","enhanced":false,"tile_background":"dark","icon":"kubernetesdashboard.svg","sha":"6411cad15b9545f65d1d18fee991d3c01c005942"},{"appid":"49eac3c78f71626d0364c2691336b2113daedf4c","name":"LazyLibrarian","website":"https://lazylibrarian.gitlab.io","license":"CNRI Python Open Source GPL Compatible License Agreement","description":"LazyLibrarian is a program to follow authors and grab metadata for all your digital reading needs.","enhanced":false,"tile_background":"dark","icon":"lazylibrarian.png","sha":"c0d68db0f22566143c636ddffd192a8354ada363"},{"appid":"48b8edcabb38cf25b257b7da1042eb8f19d16248","name":"LemonLDAP::NG","website":"https://lemonldap-ng.org/welcome","license":"GNU General Public License v2.0 or later","description":"LemonLDAP::NG is a complete and modular Web-SSO system that can run with\r\nreverse-proxies or directly on application webservers. It can be used in\r\nconjunction with OpenID-Connect, CAS and SAML systems as identity or\r\nservice provider. It can also be used as proxy between those federation\r\nsystems.\r\nIt manages both authentication and authorization and provides headers for\r\naccounting. So you can have a full AAA protection. Authorizations are built by\r\nassociating a regular expression and a rule. Regular expression is applied on\r\nthe requested URL and the rule calculates if the user is authorized.","enhanced":false,"tile_background":"light","icon":"lemonldapng.png","sha":"a6eb8a4531d9ed45b12e27cd9e056518265e5f53"},{"appid":"3efb63c16a70f296c1cdb7992bd621c26423da99","name":"LibreNMS","website":"https://www.librenms.org","license":"GNU General Public License v3.0 or later","description":"LibreNMS, a fully featured network monitoring system that provides a wealth of features and device support","enhanced":false,"tile_background":"dark","icon":"librenms.png","sha":"9a24bdaf8d3ed672525c30378506349940759ef7"},{"appid":"3771bfd8b92b695b317391d4e685d13fc9a14433","name":"LibreSpeed","website":"https://github.com/librespeed/speedtest","license":"GNU Lesser General Public License v3.0 or later","description":"A Free and Open Source Speedtest for HTML5 and more.","enhanced":false,"tile_background":"light","icon":"librespeed.png","sha":"e71e76f576d02c64bae64b7546b135e67e45a318"},{"appid":"c015fff30a3dc43f5987079c0142437e3e757fd0","name":"Lidarr","website":"https://lidarr.audio","license":"GNU General Public License v3.0 only","description":"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them.","enhanced":true,"tile_background":"dark","icon":"lidarr.svg","sha":"bb9d8e163381481a70360cd850bc07ac94b61617"},{"appid":"c7eef6a399bb48a066d4e11fc577e896bc142cf3","name":"LinkAce","website":"https://www.linkace.org","license":"GNU General Public License v3.0 only","description":"LinkAce is a self-hosted archive to collect links of your favorite websites. Save articles to read them later, tools to use them in your next project, or historic content to archive it for the long term. LinkAce comes with a lot of features while keeping a clean and minimal interface.","enhanced":true,"tile_background":"light","icon":"linkace.svg","sha":"06a0acd1078a6612a914904652f372ddd04030fe"},{"appid":"4c1738fdd3a5743e76bc256be5e112d3e4dd511d","name":"Lychee","website":"https://lycheeorg.github.io","license":"MIT License","description":"Self-hosted photo-management done right","enhanced":false,"tile_background":"light","icon":"lychee.png","sha":"77c60104575beb43652de897fe3b01594ea167d1"},{"appid":"aeabf6597d765c42d67abdc8c1918c8ec5b18cb8","name":"Mailcow","website":"https://mailcow.email","license":"GNU General Public License v3.0 only","description":"Mailcow is a Docker based email server which provides an elegant web interface for managing domains, mailboxes and more.","enhanced":false,"tile_background":"dark","icon":"mailcow.svg","sha":"6d6871124054c3ae11c2d99debfc223278e5290a"},{"appid":"1ec48781d2c87a9e6dc9ee99e5eff0ab5958df09","name":"Mailcow - SOGo","website":"https://sogo.nu","license":"GNU GPL/LGPL v2 and above","description":"SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.\r\n\r\nPart of the Mailcow stack.","enhanced":false,"tile_background":"dark","icon":"mailcowsogo.svg","sha":"030252c7cab4abe64fa27b79dd05748df06d0f9a"},{"appid":"cffc32ba3ead25ff79a6f34e163b120cf68ab9e2","name":"Mailhog","website":"https://github.com/mailhog/MailHog","license":"MIT License","description":"MailHog is an email testing tool for developers:\r\n\r\n- Configure your application to use MailHog for SMTP delivery\r\n- View messages in the web UI, or retrieve them with the JSON API\r\n- Optionally release messages to real SMTP servers for delivery","enhanced":false,"tile_background":"light","icon":"mailhog.png","sha":"a97fad4dea6f1d5881f908257230bb5cf915e46a"},{"appid":"042c8e5dba563bf592d67d024ff2d66c011a9a69","name":"Mainsail","website":"https://github.com/meteyou/mainsail","license":"GNU General Public License v3.0 only","description":"Mainsail is a lightweight & responsive web interface for the Klipper 3D printer firmware. It communicates with the Moonraker (Klipper-API) from Arksine.","enhanced":false,"tile_background":"light","icon":"mainsail.png","sha":"18a4de413ad82d3bf7b1a47b6dc19928c29b3c3a"},{"appid":"0efc652ff6792fef6190e3f066133e37a050e52a","name":"Mastodon","website":"https://joinmastodon.org","license":"GNU Affero General Public License v3.0","description":"Mastodon is a free, open-source social network server based on ActivityPub where users can follow friends and discover new ones. On Mastodon, users can publish anything they want: links, pictures, text, video. All Mastodon servers are interoperable as a federated network (users on one server can seamlessly communicate with users from another one, including non-Mastodon software that implements ActivityPub)!","enhanced":false,"tile_background":"light","icon":"mastodon.svg","sha":"d0c3cab6fb82dd2cb631bd0ac0fd8edc1504d76d"},{"appid":"b3e1424fb69ca08481b03ad9d81e95488421997f","name":"Mattermost","website":"https://mattermost.com","license":"MIT License","description":"Mattermost provides high trust collaboration and messaging solutions through an open source, community-powered approach. Enjoy all the productivity benefits of workplace messaging across web, mobile and PC, with unlimited archiving, search and integrations within IT-controlled private environments in public clouds, including AWS and Azure, as well as on-premise in private clouds and virtual or physical servers.","enhanced":false,"tile_background":"light","icon":"mattermost.png","sha":"d7e4ff9c8627344e9144bea9665213d764bba513"},{"appid":"6b9e062ff02ea610df64e9b0eca1c973faf1b51d","name":"Mayan EDMS","website":"https://gitlab.com/mayan-edms/mayan-edms","license":"Apache License 2.0","description":"Mayan EDMS is an open-source document management system. Its main purpose is to store, introspect, and categorize files, with a strong emphasis on preserving the contextual and business information of documents. It can also OCR, preview, label, sign, send, and receive thoses files. Other features of interest are its workflow system, role based access control, and REST API.","enhanced":false,"tile_background":"light","icon":"mayanedms.png","sha":"12b9ddfbffce601aa90d611b76b62dd9a2d4f057"},{"appid":"1ca09632db905908f09e8c8e6fe6d64b6798aaaa","name":"McMyAdmin","website":"https://www.mcmyadmin.com","license":"Proprietary","description":"McMyAdmin is the leading web control panel and administration console for Minecraft servers. McMyAdmin makes it easy for you to control your Minecraft servers via it's straight forward user interface and mobile apps.","enhanced":false,"tile_background":"dark","icon":"mcmyadmin.png","sha":"158bb37eace62f153dabcd70fca82e15b6a49f55"},{"appid":"95fc71dc5b7a31e5a244df43f457a6eedc966ac9","name":"Mealie","website":"https://github.com/hay-kot/mealie","license":"MIT License","description":"Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and mealie will automatically import the relevant data or add a family recipe with the UI editor.","enhanced":false,"tile_background":"dark","icon":"mealie.png","sha":"096c874dceca12c2d9566263655fff00ac2d0055"},{"appid":"67dcc2f0c9930fb08b0eaa39ad076264965b2bd6","name":"MediaWiki","website":"https://www.mediawiki.org/wiki/MediaWiki","license":"GNU General Public License v2.0 or later","description":"MediaWiki is a collaboration and documentation platform brought to you by a vibrant community.","enhanced":false,"tile_background":"light","icon":"mediawiki.png","sha":"53e3eaa4b448726782427e6aae23655d3893fc2c"},{"appid":"7209e12ecf01afc45db4ff41be3602a898cf77f8","name":"Medusa","website":"https://pymedusa.com","license":"GNU General Public License v3.0 only","description":"Medusa is an automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want.","enhanced":false,"tile_background":"dark","icon":"medusa.png","sha":"51e28cdbfa4c5d16490a50f6baadf0a59b8f6bdf"},{"appid":"ad35ad6e82ecf7b9f4e279795d3ef30a496d2a21","name":"Meraki","website":"https://meraki.com","license":"Commercial","description":"Cloud web portal for Meraki device management.","enhanced":false,"tile_background":"light","icon":"meraki.png","sha":"9ce0d2fff9ddf2578e2361d1e944def8cbb1a89f"},{"appid":"4a0a491219ae93bc0848b0d05efbe250ace4049c","name":"Metabase","website":"https://www.metabase.com/","license":"GNU Affero General Public License v3.0","description":"The simplest, fastest way to get business intelligence and analytics to everyone in your company 😋","enhanced":false,"tile_background":"light","icon":"metabase.svg","sha":"a68ee80ecf0eef9d32f1b481af12577620a6ec7f"},{"appid":"757ff43646cf978b954d695926049f0ce636e3df","name":"MineOS","website":"https://minecraft.codeemo.com","license":"GNU General Public License v3.0 only","description":"MineOS is a platform-independent server front-end to create, host and manage Minecraft servers with a few mouse clicks.","enhanced":false,"tile_background":"dark","icon":"mineos.png","sha":"b6cd6ad101f5c06af551c4bf355b4e7e6a8da125"},{"appid":"f1a89a23921939fc4ea89777cf9c7d6c08679fde","name":"Miniflux","website":"https://miniflux.app","license":"Apache License 2.0","description":"Miniflux is a lightweight RSS feed reader app.","enhanced":true,"tile_background":"dark","icon":"miniflux.png","sha":"95a7ad4fad01e32cbb9d0b4d07760e0e8ec3a110"},{"appid":"30747605e1f6faad5d1cedb2c7953d31ffad3fd4","name":"Minio","website":"https://www.minio.io","license":"Apache License 2.0","description":"Minio is an object storage server released under Apache License v2.0. It is compatible with Amazon S3 cloud storage service. It is best suited for storing unstructured data such as photos, videos, log files, backups and container / VM images.","enhanced":false,"tile_background":"light","icon":"minio.png","sha":"f2e32af03d1ac78923527b0494c76ad380ddbedc"},{"appid":"96d53734fc1bd54d848cd30f98069b90333b1bb3","name":"Monica","website":"https://www.monicahq.com","license":"GNU Affero General Public License v3.0 only","description":"Monica is an open-source web application to organize the interactions with your loved ones. We call it a PRM, or Personal Relationship Management. Think of it as a CRM for your friends or family.","enhanced":true,"tile_background":"light","icon":"monica.png","sha":"6204b4255c9725a190ea91ad08999f3c188321e6"},{"appid":"3568f62a517667d3dae77d47746d8382dd3b9f3b","name":"Monit","website":"https://mmonit.com/monit","license":"GNU Affero General Public License v3.0 or later","description":"Monit is a small Open Source utility for managing and monitoring Unix systems. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.","enhanced":true,"tile_background":"dark","icon":"monit.png","sha":"001be15a58098b779c177925d26afe1dbcd1b1bb"},{"appid":"19bd1c6a4f62ecc721b771b42e71d2eaff67824e","name":"MotionEye","website":"https://github.com/ccrisan/motioneye","license":"GNU General Public License v3.0 only","description":"motionEye is a web-based frontend for motion.","enhanced":false,"tile_background":"light","icon":"motioneye.png","sha":"43f3e4cff010a4071c2b1a33524027120c58f382"},{"appid":"756e9d172c05c14d07ff2428e6a75d5885bf5ae0","name":"Munin","website":"http://munin-monitoring.org","license":"GNU General Public License v2.0 only","description":"Munin is a networked resource monitoring tool that can help analyze resource trends and \"what just happened to kill our performance?\" problems. It is designed to be very plug and play. A default installation provides a lot of graphs with almost no work.","enhanced":false,"tile_background":"light","icon":"munin.png","sha":"b1ac456dae20cc526810de1ae72de341070406f9"},{"appid":"8962c794c6557b091455fdd5ad0d1fc7a266cfe7","name":"MusicBrainz","website":"https://musicbrainz.org","license":"GNU General Public License v2.0 only","description":"MusicBrainz is an open music encyclopedia that collects music metadata and makes it available to the public.","enhanced":false,"tile_background":"dark","icon":"musicbrainz.svg","sha":"053354ad524e783ffe27361628d87fffccce9903"},{"appid":"1c7c1eebcd96285956627a1d10006a6756d9c2b4","name":"Mylar","website":"https://github.com/evilhero/mylar","license":"GNU General Public License v3.0 only","description":"Mylar is an automated Comic Book (cbr/cbz) downloader program heavily-based on the Headphones template and logic (which is also based on Sick-Beard).","enhanced":true,"tile_background":"dark","icon":"mylar.png","sha":"d01dfbbce97e78ca1f9fded911f4f17c9c7f87b9"},{"appid":"fe2d0a7a5b34951b6ec3c46184f1ed3eae19459d","name":"Nagios","website":"https://www.nagios.com/products/nagios-core","license":"GNU General Public License v2.0 only","description":"The open source industry standard in IT infrastructure monitoring and alerting.","enhanced":false,"tile_background":"light","icon":"nagios.png","sha":"19dc4c8045ebc6f2c251a4c01cabfaa43ec7c128"},{"appid":"0e0c78c72d4215bccbe4a8ad0c0234bfb9998b88","name":"NAS","website":"https://en.wikipedia.org/wiki/Network-attached_storage","license":"Commercial","description":"Network-attached storage (NAS) is a file-level computer data storage server connected to a computer network providing data access to a heterogeneous group of clients. NAS is specialized for serving files either by its hardware, software, or configuration.","enhanced":false,"tile_background":"light","icon":"nas.svg","sha":"e7bfd5f7d542f21b2fb3d4a62d474cd1dbcbd33e"},{"appid":"31e028553b33bf830e42d88a888ee1093e3dd591","name":"Navidrome","website":"https://www.navidrome.org","license":"GNU General Public License v3.0 only","description":"Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device.","enhanced":true,"tile_background":"dark","icon":"navidrome.svg","sha":"a22e038a19e45164242785e352909a326bf698f6"},{"appid":"b69a8d8e93fa412531b8ef117c50ce520d71cd5a","name":"n8n","website":"https://n8n.io","license":"Apache License 2.0","description":"n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly versatile, enabling you to connect anything to everything.","enhanced":false,"tile_background":"light","icon":"n8n.png","sha":"7c9b995a60f99fd848764bc86a8edf6b28222c95"},{"appid":"c47466c999c3113a3291ab09cab20b0df630d8e8","name":"Nessus","website":"https://www.tenable.com/products/nessus","license":"Commercial","description":"Nessus is trusted by more than 27,000 organizations worldwide as one of the most widely deployed security technologies on the planet - and the gold standard for vulnerability assessment.","enhanced":true,"tile_background":"light","icon":"nessus.png","sha":"04768c20745a0884066ffaa3f352118fc4c1616f"},{"appid":"81bf08fbb240b662b17c0d837c5cb9f30a7e89e5","name":"Netatmo","website":"https://www.netatmo.com/en-us/weather","license":"Commercial","description":"With the Netatmo Smart Home Weather Station and its accessories, measure, analyse, and understand your indoor and outdoor environment to adapt your daily life and optimise your comfort at home.","enhanced":false,"tile_background":"light","icon":"netatmo.png","sha":"bb0e805a522670412aaf75cd20c0688da200211e"},{"appid":"3f903351ae2408404930a6af98e669510149abbd","name":"Netboot","website":"https://netboot.xyz","license":"Apache License 2.0","description":"netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool.","enhanced":false,"tile_background":"dark","icon":"netboot.png","sha":"5270fd6efad8363eeb2ca92fe112d9386f9e9142"},{"appid":"b42bf8635b4e7c528339fd4e073ddc9fecf1e5a7","name":"NetBox","website":"https://github.com/netbox-community/netbox","license":"Apache License 2.0","description":"NetBox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers.","enhanced":false,"tile_background":"light","icon":"netbox.png","sha":"c8cc85d3bfd3f9af90be9917369e7a63f84a9314"},{"appid":"810d3926feac8c1bd3957fdac48b6c9475b932d0","name":"Netdata","website":"https://my-netdata.io","license":"GNU General Public License v3.0 only","description":"Unparalleled insights, in real-time, of everything happening on your systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms.","enhanced":true,"tile_background":"dark","icon":"netdata.svg","sha":"5cdc80e42f13fc21fa895cff6f90a0af1162f9bf"},{"appid":"f2baa52d02ca888455ce47823f47bf372d5eecb3","name":"Nextcloud","website":"https://nextcloud.com","license":"GNU Affero General Public License v3.0 only","description":"Nextcloud is an open source, self-hosted file share and communication platform. Access and sync your files, contacts, calendars and communicate and collaborate across your devices.","enhanced":true,"tile_background":"light","icon":"nextcloud.svg","config":{"type":"basic_auth","additional_headers":{"OCS-APIRequest":"true"},"stat1":{"name":"Total","url":":url:ocs/v1.php/cloud/users/:username:?format=json","key":"ocs.data.quota.total","filter":"size","updateOnChange":"No","suffix":""},"stat2":{"name":"Used","url":":url:ocs/v1.php/cloud/users/:username:?format=json","key":"ocs.data.quota.used","filter":"size","updateOnChange":"No","suffix":""}},"sha":"676349fdcae87ee48a8e673db38d6e795073e065"},{"appid":"cbfad988a16a9fbcc1812bc206afcc1f73dd36de","name":"Nginx Proxy Manager","website":"https://nginxproxymanager.jc21.com","license":"MIT License","description":"This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.","enhanced":true,"tile_background":"light","icon":"nginxproxymanager.png","sha":"018be1bd778b84d537e5ab10a0315bd35388c2d3"},{"appid":"570ecf8de333013382f0dc93aa7faacbccdee575","name":"Nitter","website":"https://github.com/zedeus/nitter","license":"GNU Affero General Public License v3.0","description":"A free and open source alternative Twitter front-end focused on privacy.","enhanced":false,"tile_background":"dark","icon":"nitter.svg","sha":"1e58d9bf697b7eb027d2ac9206de549aac22b580"},{"appid":"1608962f5295ccc488f3103ea8df2c6d45c62c65","name":"Node-Red","website":"https://nodered.org","license":"Apache License 2.0","description":"Node-RED is a flow-based development tool for visual programming developed originally by IBM for wiring together hardware devices, APIs and online services as part of the Internet of Things. \r\n\r\nNode-RED provides a browser-based flow editor, which can be used to create JavaScript functions. Elements of applications can be saved or shared for re-use. The runtime is built on Node.js. The flows created in Node-RED are stored using JSON. Since version 0.14 MQTT nodes can make properly configured TLS connections","enhanced":false,"tile_background":"dark","icon":"nodered.png","sha":"3fd4745d466bbf8166d45318dd079f56a53d3d3c"},{"appid":"b3d874a5d85233d394ed569fc8f67f4864993308","name":"NowShowing","website":"https://github.com/ninthwalker/NowShowing","license":"MIT License","description":"Generates an email and web page of Plex recently added content. NowShowing is the successor of the popular plexReport docker.","enhanced":false,"tile_background":"light","icon":"nowshowing.png","sha":"f4b1ec8654b35a7df9a29a64f08db3fe62998d7c"},{"appid":"361f712137443a3d7f1047a4f470bcf0158cc6d6","name":"ntopng","website":"https://www.ntop.org","license":"GNU General Public License v3.0 or later","description":"ntopng is the next generation version of the original ntop, a network traffic probe that monitors network usage. ntopng is based on libpcap and it has been written in a portable way in order to virtually run on every Unix platform, MacOSX and on Windows as well.","enhanced":false,"tile_background":"light","icon":"ntopng.png","sha":"1b37b25a7d816420bd8b552676b4f959092bff34"},{"appid":"533dc2434d2aee76aac442ece4bcc94b53fd7246","name":"NxFilter","website":"https://nxfilter.org","license":"Commercial","description":"NxFilter is a free DNS filter for commercial and non-commercial purposes. It's light, fast and easy.","enhanced":false,"tile_background":"light","icon":"nxfilter.png","sha":"94a026cf7028c6f0b65e2ce2d348c7eeb6fb7a7c"},{"appid":"31a7b1d936c4e8503bb446e5ff8ada669d1846bd","name":"Nzbget","website":"https://nzbget.net","license":"GNU General Public License v2.0 only","description":"NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files. NZBGet is written in C++ and is known for its extraordinary performance and efficiency.","enhanced":true,"tile_background":"dark","icon":"nzbget.png","sha":"fe14069189fb0ceda3046ac2904f3804226df108"},{"appid":"a5b4faf84287a35c98adc76f2117aa10d1ea6eb8","name":"NZBHydra","website":"https://github.com/theotherp/nzbhydra2","license":"Apache License 2.0","description":"NZBHydra is a meta search for NZB indexers. It provides easy access to a number of raw and newznab based indexers. You can search all your indexers from one place and use it as an indexer source for tools like Sonarr, Radarr or CouchPotato.","enhanced":false,"tile_background":"light","icon":"nzbhydra.png","sha":"e62ca0399d88874231216312da21ed4662152ea5"},{"appid":"99be0df8034cbcd7b5dfb3290839f7db21c1acbb","name":"Octoprint","website":"https://octoprint.org","license":"GNU Affero General Public License v3.0","description":"OctoPrint is the snappy web interface for your 3D printer that allows you to control and monitor all aspects of your printer and print jobs, right from your browser.","enhanced":true,"tile_background":"dark","icon":"octoprint.png","sha":"f63b48c1a90cb3064a54c48f327087c31ebe752d"},{"appid":"aeddfb31b642e8e30591a99b3b3c30b8a765be32","name":"Omada SDN Controller","website":"https://www.tp-link.com/us/omada-sdn","license":"No Limit Public License","description":"Omada’s Software Defined Networking (SDN) platform integrates network devices, including access points, switches and gateways, providing 100% centralized cloud management. Omada creates a highly scalable network—all controlled from a single interface. Seamless wireless and wired connections are provided, ideal for use in hospitality, education, retail, offices, and more.","enhanced":false,"tile_background":"dark","icon":"omadasdncontroller.png","sha":"2ddef0fcd5aa90a2a8668174a808ac513c4f971e"},{"appid":"57b25ceb94bd4c9ba9038ce17656f5ede9007e4c","name":"Ombi","website":"https://ombi.io","license":"GNU General Public License v2.0 only","description":"Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users.","enhanced":true,"tile_background":"dark","icon":"ombi.png","sha":"6d18549aab23aa8151c34cee4bda96dbd6e50643"},{"appid":"1d41498511148e83a9c731b2fce96478e8ae402e","name":"OmniDB","website":"https://www.omnidb.org","license":"MIT License","description":"OmniDB is an open source collaborative environment for database management. It provides a unified workspace for various database technologies like PostgreSQL, MySql, MariaDB and others.","enhanced":false,"tile_background":"dark","icon":"omnidb.png","sha":"14bac1bb9f1e5a56aa453f679bc13b450c98956f"},{"appid":"fc4e407d69510b855b678aa4fba6083fbbfc5383","name":"OnlyOffice","website":"https://www.onlyoffice.com","license":"GNU Affero General Public License v3.0 or later","description":"ONLYOFFICE online editors for text documents, spreadsheets, and presentations with access to pro features and connect them to the platform of your choice with ready-to-use connectors: https://www.onlyoffice.com/download.aspx#connectors","enhanced":false,"tile_background":"light","icon":"onlyoffice.png","sha":"6703cdcd504d4f6f964ecfa3c1553c8531acad80"},{"appid":"c6a4fe0b25a74497e966f279f5186c99e5ce30e3","name":"openHAB","website":"https://www.openhab.org","license":"Eclipse Public License 1.0","description":"The open Home Automation Bus (openHAB) project aims at providing a universal integration platform for all things around home automation. It is a pure Java solution, fully based on OSGi.","enhanced":false,"tile_background":"light","icon":"openhab.png","sha":"e521e86b065022985a662ce6346b74cd3d1e4425"},{"appid":"ce88c5ed9d12b302762ca57ee01d494b96466946","name":"OpenMapTiler","website":"https://openmaptiles.org","license":"BSD 3-Clause Clear License","description":"Open-source maps made for self-hosting","enhanced":false,"tile_background":"dark","icon":"openmaptiler.png","sha":"df7e140fbc9cb9e2d7775ccacac10cdbf15d7772"},{"appid":"68a90a2f21aad7a09a3533a2c6ab9a03dc94af49","name":"openmediavault","website":"https://www.openmediavault.org","license":"GNU General Public License v3.0 only","description":"openmediavault is the next generation network attached storage (NAS) solution based on Debian Linux.","enhanced":true,"tile_background":"dark","icon":"openmediavault.svg","sha":"bb95b51806038e3e83d39c89d21fb6a8ae94b4c7"},{"appid":"a42cc8d686807c59dc3858e14faf1028d766abf0","name":"OpenSpeedTest","website":"https://openspeedtest.com","license":"Creative Commons Attribution No Derivatives 3.0 Unported","description":"OpenSpeedTest is a 100% browser-based speed test application. It allows you to test your network connection speed on any device using various web browsers without installing any additional apps or plugins (no Flash or Java Needed!).","enhanced":false,"tile_background":"light","icon":"openspeedtest.png","sha":"4389e4a409203365cacf09fef8d467fb074758ca"},{"appid":"bd1d7a45d17d62fd7db0c3f69e8a52661eedcc5b","name":"OpenSprinkler","website":"https://opensprinkler.com","license":"GNU General Public License v3.0 only","description":"OpenSprinkler is an open-source, web-based sprinkler / irrigation controller. It’s a drop-in replacement for conventional sprinkler controllers that are not web connected.","enhanced":false,"tile_background":"light","icon":"opensprinkler.png","sha":"49c3e84f3d42019d33f291f7e54cf365d71a9dfb"},{"appid":"9b934cf284d9b196f48b43876d3e01912797242c","name":"OpenWrt","website":"https://openwrt.org","license":"GNU General Public License v2.0 or later","description":"OpenWrt is an open source project based on Linux, primarily used on devices to route network traffic\r\n\r\n#please use tile background color #578","enhanced":false,"tile_background":"light","icon":"openwrt.png","sha":"a4100d73322b1533ecbacfb39795947702e1b328"},{"appid":"b7dcd77029f908fb21195dd01e29882ca52d4f3a","name":"OPNsense","website":"https://opnsense.org","license":"BSD 2-Clause \"Simplified\" License","description":"OPNsense is open source, FreeBSD-based firewall and routing software developed by Deciso. It is a fork of pfSense, which in turn was forked from m0n0wall.","enhanced":false,"tile_background":"light","icon":"opnsense.png","sha":"b7e14b5a06c1b709b10d33cde08ca35ce3793c99"},{"appid":"46ede88d6d440af5d3c7cc70cabbab6722245acd","name":"Oscarr","website":"https://github.com/morpheus65535/oscarr","license":"GNU General Public License v3.0 only","description":"Oscarr is a dashboard application for users of Plex, Emby, Sonarr, Radarr and Bazarr. It gives you and overview of your media management software.","enhanced":false,"tile_background":"light","icon":"oscarr.svg","sha":"b1ea948c0b9ecd48853d562d39dfa6f76579d2ba"},{"appid":"727706dbdf86b593f7be63c2fcca20718fd8caca","name":"osTicket","website":"https://osticket.com","license":"GNU General Public License v2.0 only","description":"osTicket is a widely-used open source support ticket system.","enhanced":false,"tile_background":"dark","icon":"osticket.png","sha":"1dea77b484f9cbbcdaf05e3b6fa2959f902f21de"},{"appid":"989fb18945a331b430fc284edfe6451aa760f8e6","name":"Overseerr","website":"https://github.com/sct/overseerr","license":"MIT License","description":"Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services such as Sonarr, Radarr and Plex!","enhanced":true,"tile_background":"dark","icon":"overseerr.svg","sha":"fe2243f0ed3a59f3cc622fc25ccec71f1d9504b8"},{"appid":"668b5fcda851fe516fef14e82973beffe32f385a","name":"ownCloud","website":"https://owncloud.org","license":"GNU Affero General Public License v3.0 or later","description":"ownCloud is a free and open source file hosting service. It also supports extensions for online document editing, calendar and contact synchronization. It's a safe home for all your data.","enhanced":false,"tile_background":"dark","icon":"owncloud.png","sha":"0e9b8f03d91738450e0efd2a73d4550f2205af03"},{"appid":"742fb53dbb4fac003115e7f6ec7c46f39c797040","name":"OwnPhotos","website":"https://github.com/hooram/ownphotos","license":"MIT License","description":"Self hosted wannabe Google Photos clone, with a slight focus on cool graphs","enhanced":false,"tile_background":"light","icon":"ownphotos.png","sha":"244f5fc5d8ce00f4e0761c766ac2c63a9384cd3a"},{"appid":"710f91b65aed9bbc884898b19b6b4bb17ec5b32c","name":"Palo Alto Networks","website":"https://www.paloaltonetworks.com","license":"Commercial","description":"Palo Alto ore products are a platform that includes advanced firewalls and cloud-based offerings that extend those firewalls to cover other aspects of security.","enhanced":false,"tile_background":"light","icon":"paloaltonetworks.png","sha":"63573045afff2fa32aa033790898dd007483d074"},{"appid":"6249c08eaa417b9918c69ed2d32ac88b386bc1b2","name":"Paperless","website":"https://github.com/danielquinn/paperless","license":"GPL-3.0","description":"Scan, index, and archive all of your paper documents","enhanced":false,"tile_background":"light","icon":"paperless.png","sha":"f8bc3d876f637b1c6aa9f5b07ff6c2c5b88f6c4a"},{"appid":"e782bdad5e303d079375eac9d6b2bc03ed4fb7c5","name":"Papermerge","website":"https://www.papermerge.com/","license":"Apache License 2.0","description":"Papermerge is an open source document management system (DMS) primarily designed for archiving and retrieving your digital documents. Instead of having piles of paper documents all over your desk, office or drawers - you can quickly scan them and configure your scanner to directly upload to Papermerge DMS. Papermerge DMS on its turn will extract text data from the scanned documents using Optical Character Recognition (OCR) technology the index it and make it searchable. You will be able to quickly find any (scanned!) document using full text search capabilities.\r\n\r\nPapermerge is perfect tool to manage documents in PDF, JPEG, TIFF and PNG formats.","enhanced":false,"tile_background":"dark","icon":"papermerge.svg","sha":"b3a36b8ed0a1c2961d94c07778def6d72643190e"},{"appid":"1194ad979d9724f6866d0d0f2347580a78a283cc","name":"PartKeepr","website":"https://partkeepr.org","license":"GNU General Public License v3.0 only","description":"PartKeepr is an inventory management software, primarily designed for electronic components.","enhanced":false,"tile_background":"light","icon":"partkeepr.png","sha":"a3cf0d8865d087497cd0b981da3b357f4fa068a3"},{"appid":"bf096d8f5ce86ff113f6cad2a36d565dc0f13ffc","name":"PeerTube","website":"https://joinpeertube.org","license":"GNU Affero General Public License v3.0 only","description":"PeerTube is an experimental decentralized federated video platform system that uses peer-to-peer technology to reduce load on individual servers.","enhanced":false,"tile_background":"light","icon":"peertube.png","sha":"8136bb12e32fd5b5914df7ea11adec14ea644da1"},{"appid":"f8ac7f280fe53cea71efe29c42f0d3bca430c02d","name":"pfSense","website":"https://www.pfsense.org","license":"Apache License 2.0","description":"pfSense is an open source firewall/router computer software distribution based on FreeBSD.","enhanced":false,"tile_background":"dark","icon":"pfsense.svg","sha":"380a85cbbeea4a2686adc12a3124125a1b6033bb"},{"appid":"43784e464f66bfc0254a3bad48939f14a70c878e","name":"pgAdmin","website":"https://www.pgadmin.org","license":"PostgreSQL License","description":"pgAdmin is a feature rich open-source administration and development platform for PostgreSQL.","enhanced":false,"tile_background":"dark","icon":"pgadmin.png","sha":"31fa2ad4d3b8629e8eb780280171c3e66d035bdc"},{"appid":"ec9dab93c7d9cba1c5171ed468dfee950b933c94","name":"Photonix","website":"https://photonix.org","license":"GNU Affero General Public License v3.0 only","description":"This is a photo management application based on web technologies. Run it on your home server and it will let you find what you want from your photo collection using any device. Smart filtering is made possible automatically by object recognition, location awareness, color analysis and other algorithms.","enhanced":false,"tile_background":"light","icon":"photonix.png","sha":"0ecfee45a84204e516ca767a46e91d8666aab2c7"},{"appid":"f60f5b25d59c397989e3cd374f81cdd7710a4fca","name":"PhotoPrism","website":"https://photoprism.org","license":"GNU General Public License v3.0 only","description":"PhotoPrism is a server-based application for browsing, organizing and sharing your personal photo collection. It makes use of the latest technologies to automatically tag and find pictures without getting in your way. Say goodbye to solutions that force you to upload your visual memories to the cloud.","enhanced":true,"tile_background":"light","icon":"photoprism.png","sha":"136f5dbe0dcc30d4ab999701fdd224de9d5fe558"},{"appid":"d9946b11ca2139e9299705b734b94e3d3066d4ec","name":"Photoview","website":"https://photoview.github.io","license":"GNU Affero General Public License v3.0 or later","description":"Photoview is a simple and user-friendly photo gallery that's made for photographers and aims to provide an easy and fast way to navigate directories, with thousands of high-resolution photos.\r\n\r\nYou configure Photoview to look for photos and videos within a directory on your file system. The scanner automatically picks up your media and start to generate thumbnail images to make browsing super fast.\r\n\r\nWhen your media has been scanned they show up on the website, organised in the same way as on the filesystem.","enhanced":false,"tile_background":"dark","icon":"photoview.svg","sha":"877e08ac35fb6f6895e303bb9e867ffae6ac2d4d"},{"appid":"db44aad188b5bbe570bd96e3e5a9e7f0e893bc90","name":"phpIPAM","website":"https://phpipam.net","license":"GNU General Public License v3.0 or later","description":"phpIPAM is an open-source web IP address management application. Its goal is to provide light, modern and useful IP address management. It is a php-based application with a MySQL database backend, using jQuery libraries, ajax and HTML5/CSS3 features.","enhanced":false,"tile_background":"light","icon":"phpipam.jpeg","sha":"446ee59e345f8b52531033174d1e52f330501771"},{"appid":"6a8263e6e3ad594a12e111f0f952e4cc57fe5077","name":"phpLDAPadmin","website":"http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page","license":"GNU General Public License v2.0 or later","description":"phpLDAPadmin (also known as PLA) is a web-based LDAP client. It provides easy, anywhere-accessible, multi-language administration for your LDAP server.\r\n\r\nIts hierarchical tree-viewer and advanced search functionality make it intuitive to browse and administer your LDAP directory. Since it is a web application, this LDAP browser works on many platforms, making your LDAP server easily manageable from any location.\r\n\r\nphpLDAPadmin is the perfect LDAP browser for the LDAP professional and novice alike. Its user base consists mostly of LDAP administration professionals.","enhanced":false,"tile_background":"light","icon":"phpldapadmin.png","sha":"e63c19edc62181d2836fde4cb7a38d5ba4a9249b"},{"appid":"51ca673ea8e89a868706fd309777a101ac63a409","name":"phpMyAdmin","website":"https://www.phpmyadmin.net","license":"GNU General Public License, version 2","description":"phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement.","enhanced":false,"tile_background":"light","icon":"phpmyadmin.png","sha":"4cef6397295c2f3af8bc5fa0768591960ef59309"},{"appid":"b897f0f558bc83256a49d5c7e8f1658d87cfe820","name":"PiAware","website":"https://github.com/flightaware/piaware","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Client-side package and programs for forwarding ADS-B data to FlightAware","enhanced":true,"tile_background":"light","icon":"piaware.png","sha":"2340bb3c1ba2695811e6b2ba47a088121ffa0beb"},{"appid":"b89920409bdce40e08ba1023480b0546061cd577","name":"Pi-hole","website":"https://pi-hole.net","license":"European Union Public License 1.2","description":"Pi-hole is a Linux network-level advertisement and internet tracker blocking application which acts as a DNS sinkhole, intended for use on a private network.","enhanced":true,"tile_background":"dark","icon":"pihole.svg","sha":"c31c3d5f197e1bd6c3981fa4ab1b758a386147da"},{"appid":"3c8ecb5a9c477237e32b3776922fce3fd6e8a514","name":"PiKVM","website":"https://pikvm.org/","license":"GNU General Public License v3.0 or later","description":"A very simple and fully functional Raspberry Pi-based KVM over IP that you can make with your own hands without any soldering!","enhanced":false,"tile_background":"light","icon":"pikvm.png","sha":"5bd2e47ea1cfeb34cb8ccc21209e107e2154156d"},{"appid":"c0f951b12d14c47e4e488294584808ff31747eea","name":"PiVPN","website":"https://www.pivpn.io","license":"MIT License","description":"The simplest way to setup and manage a VPN, designed for Raspberry Pi.","enhanced":false,"tile_background":"light","icon":"pivpn.png","sha":"f2783ea8f07e2ae0d666a4a81c53eb30c9b73543"},{"appid":"73821d23ad8bb436e7478fec8305ad0636c17d7a","name":"Piwigo","website":"piwigo.org","license":"GNU General Public License v2.0 only","description":"Piwigo is an open source photo galley software. Designed as an alternative to Picasa or Flickr it can be self-hosted or used as a service. It offers many plugins, and offers full photo management capabilities","enhanced":false,"tile_background":"light","icon":"piwigo.png","sha":"5a4456e76cd79d9f576ea9fec233ac4573a51a3f"},{"appid":"7ba6bc2c0f5fbf27166c29bc5b39f6527fb27835","name":"Pleroma","website":"https://pleroma.social","license":"GNU Affero General Public License v3.0 or later","description":"Pleroma is a free, federated social networking server built on open protocols. It is compatible with GNU Social, Mastodon, and many other ActivityPub implementations.","enhanced":false,"tile_background":"dark","icon":"pleroma.png","sha":"219f96a8bb2d32311393c5c240ad5ed97ceaa27a"},{"appid":"96bace2f6616fad61930a4ca021809c00a7e9e2a","name":"Plesk","website":"https://www.plesk.com","license":"Proprietary","description":"Plesk is a commercial web hosting platform with a control panel that allows a server administrator to set up new websites, reseller accounts, e-mail accounts and DNS entries through a web-based interface.","enhanced":false,"tile_background":"light","icon":"plesk.png","sha":"474dc05a909803aed145ced11156d66d7b2dfc3d"},{"appid":"aebda823a279b219476c565be863d83739999502","name":"Plex","website":"https://www.plex.tv","license":"Freemium","description":"Plex media server allows you to aggregate all your personal media and access it anywhere you go. Enjoy your own content on all your devices with Plex.","enhanced":true,"tile_background":"dark","icon":"plex.png","sha":"311aab1fb02e669f2d9cdeaff206858edcdec07c"},{"appid":"6dec25c0d43491eadaf519800e0dbf6adfe86f1a","name":"PlexRequests","website":"http://plexrequests.8bits.ca","license":"MIT License","description":"Simple automated way for users to request new content for Plex.","enhanced":false,"tile_background":"dark","icon":"plexrequests.png","sha":"fded145866bb5a5986c091c7fdd35f4d921f552c"},{"appid":"e5289e584b9daf86b4ee2b2b394696cdd99a07cf","name":"Plume","website":"https://joinplu.me","license":"GNU Affero General Public License v3.0","description":"Plume is a federated blogging engine based on ActivityPub. It is written in Rust, with the Rocket framework, and Diesel to interact with the database. The front-end uses Ructe templates, WASM and SCSS.","enhanced":false,"tile_background":"light","icon":"plume.png","sha":"6a8c26b1458cba55a119d1c83fc786028a96fcab"},{"appid":"07b796b3a10eaa8b6f485ed2379187a39400b459","name":"Portainer","website":"https://portainer.io","license":"zlib License","description":"Portainer is a simple management solution for Docker. Easily manage your Docker hosts and Docker Swarm clusters via Portainer web user interface.","enhanced":true,"tile_background":"dark","icon":"portainer.svg","sha":"b5f679c2de65648de0edd5950c0342b27b8f7f8e"},{"appid":"a28abde6e5a823e9c7115a94d71c3fc628a0efd4","name":"Poste","website":"https://poste.io","license":"MIT License","description":"Full stack mailserver solution with SSL TLS support. POP3s, SMTP(s), IMAPs, RSPAMD, Clamav, Roundcube(HTTPS), SPF, DKIM with simple installation and web administration.","enhanced":false,"tile_background":"dark","icon":"Poste.png","sha":"6c6f733ee1845b199e9c2e45c438a661193224df"},{"appid":"3d3221b2db3115d65e938a1c497f209256c6185f","name":"Printer","website":"https://en.wikipedia.org/wiki/Printer_(computing)","license":"Commercial","description":"A printer is a peripheral device which makes a persistent representation of graphics or text, usually on paper. Printers that have a network connection often include a built-in web server that lets you manage the printer from any browser on the network.","enhanced":false,"tile_background":"dark","icon":"printer.png","sha":"b331a85dcb7f8f6f3fa6296f1ee9ab45bfd91d93"},{"appid":"87ecbead58e42b5ab9e1a92ccc0b42075f4fba91","name":"Privatebin","website":"https://privatebin.info","license":"zlib/libpng License with Acknowledgement","description":"PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data.\r\n\r\nData is encrypted and decrypted in the browser using 256bit AES in Galois Counter mode.","enhanced":false,"tile_background":"light","icon":"privatebin.png","sha":"2c724848ef1235377fa1679ddd410a9f2dbbe20f"},{"appid":"91adc8832dfee8dea234877dad680682ab947980","name":"ProjectSend","website":"https://www.projectsend.org","license":"GNU General Public License v3.0 only","description":"ProjectSend is a self-hosted, free and open source, secure and user friendly file sharing software focusing on exchanging files between you and your clients.","enhanced":false,"tile_background":"light","icon":"projectsend.png","sha":"1dcbfa11b9d98b186a7419895d6aa23a6ac129c0"},{"appid":"aad8f23c2fa06d46c52ae4e06c8d4bdac6074b8f","name":"Prometheus","website":"https://prometheus.io","license":"Apache License 2.0","description":"Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true.","enhanced":false,"tile_background":"light","icon":"prometheus.png","sha":"6d9e43e1d1239c386bbe6ca2d8bb435b110b1c98"},{"appid":"de6ff49c94538e6e13a77f75991141a4fe9af8bf","name":"Prowlarr","website":"https://prowlarr.com","license":"GNU General Public License v3.0 only","description":"Prowlarr is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all).","enhanced":true,"tile_background":"dark","icon":"prowlarr.svg","sha":"d658d894a946408d4fd7ddf44f443448a35b5830"},{"appid":"391f2b7f3fe853e1ea09723eeafc354fa291ab48","name":"Proxmox","website":"https://www.proxmox.com/en/","license":"GNU Affero General Public License v3.0 only","description":"Proxmox Virtual Environment is an open-source server virtualization environment. It allows deployment and management of virtual machines and containers","enhanced":true,"tile_background":"light","icon":"proxmox.svg","sha":"320194212137cb14ba8b946524816b8ecd0f003f"},{"appid":"0ea6cd5e52e84ef9afd444f5693d09d216b10ba2","name":"PRTG","website":"https://www.paessler.com/prtg","license":"100 sensors free","description":"Monitor all systems, devices, traffic and applications of your IT infrastructure.","enhanced":true,"tile_background":"light","icon":"prtg.png","sha":"c8d0178a3808302d5b733ad69bc8a024e15b289d"},{"appid":"1beb54ac8e91638c7a181fd04ca5a4a5ec5343c1","name":"PsiTransfer","website":"https://hub.docker.com/r/psitrax/psitransfer","license":"BSD with attribution","description":"A simple open source self-hosted file sharing app. Upload a file instantly anywhere around the world.","enhanced":false,"tile_background":"light","icon":"psitransfer.png","sha":"f222ec019d4f32ecebfa45575e7c9219304f4369"},{"appid":"0a5cd6b94160a13583653d188b5083c3fa3cacdf","name":"Pterodactyl","website":"https://pterodactyl.io","license":"MIT License","description":"Pterodactyl is an open-source game server management panel built with PHP 7, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end-users.","enhanced":false,"tile_background":"light","icon":"pterodactyl.png","sha":"d8fb01d2ea273bf779f724f2cb16b1efd72e7c05"},{"appid":"0e859100d4a94f55ca42b82db2dadce415aff7ad","name":"pyLoad","website":"https://pyload.net","license":"GNU General Public License v3.0 only","description":"Free and Open Source download manager written in Pure Python and designed to be extremely lightweight, fully customizable and remotely manageable","enhanced":false,"tile_background":"dark","icon":"pyload.png","sha":"743add28479af670cb9111f2dc5f3f56ad95aa12"},{"appid":"3ebd4dd8afe6308e392ccf09e3516eee99a1e8df","name":"qBittorrent","website":"https://www.qbittorrent.org","license":"GNU General Public License v2.0 only","description":"The qBittorrent project aims to provide an open-source software alternative to µTorrent.","enhanced":true,"tile_background":"dark","icon":"qbittorrent.svg","sha":"21be843040fd1368e04f064e18faae0e9295c04f"},{"appid":"4095a83996a808dfa4ef0e283b08fa3684596bb4","name":"QNAP","website":"https://www.qnap.com","license":"commercial","description":"QNAP Systems, Inc. is a Taiwanese corporation that specializes in Network-attached storage (NAS) appliances used for file sharing, virtualization, storage management and surveillance applications.","enhanced":false,"tile_background":"light","icon":"qnap.png","sha":"e82b4bd4e0230cef7ab8db8ed2fd9416efbe761b"},{"appid":"8a5cd39a1a5dff323d63bbe45fffe0c9c03bd2e7","name":"Radarr","website":"https://radarr.video","license":"GNU General Public License v3.0 only","description":"Radarr is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent.\r\n\r\nThe project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.","enhanced":true,"tile_background":"light","icon":"radarr.svg","config":{"type":"apikey","stat1":{"name":"Missing","url":":url:api/v3/movie?apikey=:apikey:","key":"","filter":"filter","filterBy":"hasFile","filterByValue":"false","updateOnChange":"no","suffix":""},"stat2":{"name":"Queue","url":":url:api/v3/queue?apikey=:apikey:","key":"totalRecords","filter":"none","updateOnChange":"no","suffix":""}},"sha":"39f3162e7d38343019fb72455d22d53e342d9bfa"},{"appid":"10bde312e853977971f0fb1873afb70c713df2bf","name":"Rainloop","website":"https://www.rainloop.net","license":"GNU Affero General Public License v3.0","description":"Simple, modern & fast web-based email client","enhanced":false,"tile_background":"dark","icon":"rainloop.png","sha":"ffe896bb44e01831d00b9e76ac56b8e17482e7e1"},{"appid":"cb4fa9655f4c77e40e3a9c2a5e5841927fc7b8a6","name":"Rancher","website":"https://rancher.com","license":"Apache License 2.0","description":"Rancher is an open source project that provides a container management platform built for organizations that deploy containers in production.","enhanced":false,"tile_background":"dark","icon":"rancher.svg","sha":"002724cbb352b2373c36acd61d989af7f198a0dc"},{"appid":"8bfa46ba721763e4ee235d6a8caef46247735eda","name":"Raneto","website":"https://github.com/gilbitron/Raneto","license":"MIT License","description":"Raneto is a free, open, simple Markdown powered Knowledgebase for Node.js.","enhanced":false,"tile_background":"light","icon":"raneto.png","sha":"8c399107daae66e19c6a83599d76292609d423cd"},{"appid":"506c7a7e21b5c2b750eccf8fdf91f072a9826f52","name":"Rclone","website":"https://rclone.org","license":"MIT License","description":"Rclone (\"rsync for cloud storage\") is a command line program to sync files and directories to and from different cloud storage providers.","enhanced":false,"tile_background":"light","icon":"rclone.png","sha":"ebd823c7dcec5611acfdd5d17828ece619dc9cbc"},{"appid":"533ab349d29dba8f2ecc5a552ba8846a9453f82a","name":"Readarr","website":"https://readarr.com","license":"GNU General Public License v3.0 only","description":"Readarr is a ebook (and maybe eventually magazine/audiobook) collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new books from your favorite authors and will grab, sort and rename them.","enhanced":true,"tile_background":"dark","icon":"readarr.svg","sha":"6a8d8e553957f60d44544a0e913ece0d49f9c150"},{"appid":"8d6955fafc1996f6b6535739e8e2419d09e0d545","name":"Recalbox","website":"https://www.recalbox.com","license":"MIT License","description":"Recalbox allows you to re-play a variety of videogame consoles and platforms in your living room, with ease! Recalbox OS is free, open source and designed to let you create your very own Recalbox in no time! Use Raspberry Pi, ODROID or even PC (x86)!","enhanced":false,"tile_background":"dark","icon":"recalbox.png","sha":"b0c01445bce5914baef365d89f7f43be8792f4f3"},{"appid":"fd3e5a20d3595a90e1b6d0243ab6e78ff18d68b4","name":"RedisInsight","website":"https://redis.com/redis-enterprise/redis-insight/","license":"Commercial","description":"RedisInsight is a visual tool that provides capabilities to design, develop and optimize your Redis application. Query, analyse and interact with your Redis data.","enhanced":false,"tile_background":"dark","icon":"redisinsight.svg","sha":"b2560a39b574947f2c682957e1a478cbc9423ec2"},{"appid":"e7a69443c2470473fe7e5a90b049ec771472f6aa","name":"Requestrr","website":"https://github.com/darkalfx/requestrr","license":"MIT License","description":"Requestrr is a chatbot used to simplify using services like Sonarr/Radarr/Ombi via the use of chat!","enhanced":false,"tile_background":"dark","icon":"requestrr.png","sha":"48d5aa9a17656a1e7c94e746709369e1cef6710c"},{"appid":"891934b3a775769d929fabfaf93520db8205eaf6","name":"Resilio Sync","website":"https://www.resilio.com","license":"Proprietary","description":"Resilio Sync is a fast, reliable, and simple file sync and share solution, powered by P2P technology.","enhanced":false,"tile_background":"dark","icon":"resiliosync.png","sha":"504c2b358b319594c55261faa3af13a01aa52ce9"},{"appid":"c3fdfdc6801bd71a615317cf54a113b3b0bc0bf4","name":"Riot Web","website":"https://about.riot.im","license":"Apache License 2.0","description":"Communicate the way you want with Riot - a universal secure chat app entirely under your control.","enhanced":false,"tile_background":"light","icon":"riotweb.svg","sha":"c36bb18c0aac54990fba61b272d30b82c4da285c"},{"appid":"404b6861a94932750a70d2779fd785f018d90e36","name":"RocketChat","website":"https://rocket.chat","license":"MIT License","description":"Open Source Slack like chat server","enhanced":false,"tile_background":"dark","icon":"rocketchat.png","sha":"f85d1d2dd0c53c6c9ac8f57b00a4c81ccdafaab3"},{"appid":"f54fdb78762ce2a47c25c0fb8508141d72e29777","name":"RompЯ","website":"https://fatg3erman.github.io/RompR","license":"Creative Commons Attribution Non Commercial Share Alike 4.0 International","description":"RompЯ is a music player with the emphasis on discovery - discovering more about the music you know, and discovering new music you don’t know yet. RompЯ is an interface that runs in a web browser on any device and controls a music player which can be on any other device. I recommend using Mopidy as the music player. When used with Mopidy and a Spotify Premium subscription RompЯ is a powerful Spotify client with many music discovery features.","enhanced":false,"tile_background":"dark","icon":"rompya.png","sha":"8f5701ee76aa818f7a21aa4982440f3e00849225"},{"appid":"0faa0037bf071040588c082c0c5c8dee3e11f2cd","name":"Roundcube","website":"https://roundcube.net","license":"GNU General Public License v3.0 or later","description":"Roundcube webmail is a browser-based multilingual IMAP client with an application-like user interface. It provides full functionality you expect from an email client, including MIME support, address book, folder manipulation, message searching and spell checking.","enhanced":false,"tile_background":"light","icon":"roundcube.png","sha":"fb89049c01b25e301465cdd03a8106f6ff4bc330"},{"appid":"77eb1db6cb81b3cb088d36ab7aae8f230dcfaa28","name":"Router","website":"https://en.wikipedia.org/wiki/Router_(computing)","license":"Commercial","description":"A router is a networking device that forwards data packets between computer networks.","enhanced":false,"tile_background":"light","icon":"router.svg","sha":"fca31a69cdc14e8b75c6bccff90868219f30166f"},{"appid":"5876529d5d47f91c435d9230576044bc4cad8547","name":"Rspamd","website":"https://rspamd.com","license":"Apache 2.0","description":"Fast, free and open-source spam filtering system.","enhanced":false,"tile_background":"dark","icon":"rspamd.png","sha":"095dd659937d3b7248b5df0f880f4ed79b7caa45"},{"appid":"243338479393d415bba0b6a94f70db8dadd672db","name":"RStudio Server","website":"https://rstudio.com/products/rstudio/download-server","license":"GNU Affero General Public License v3.0","description":"RStudio Server provides a browser-based interface to the RStudio IDE for interacting with server-based deployments of R. R is a statistical programming language used by statisticians, analysts, and data scientists for for processing, modeling, and visualizing data.","enhanced":false,"tile_background":"light","icon":"rstudioserver.png","sha":"4ce247e2a034d6aee8d19650626ce9267daff1b5"},{"appid":"eea19d4cce28c77d2a0c1449a508d6290d00f9dd","name":"Rundeck","website":"https://www.rundeck.com/open-source","license":"Apache License 2.0","description":"Rundeck is an open source automation service with a web console, command line tools and a WebAPI. It lets you easily run automation tasks across a set of nodes.","enhanced":false,"tile_background":"dark","icon":"rundeck.png","sha":"9097058a8bc4b887bb39aa792e262eca9b610784"},{"appid":"11f6ce44eb513a288ca4ef26cbbdb3fece2d6ec4","name":"RuneAudio","website":"http://www.runeaudio.com","license":"GNU General Public License v3.0 or later","description":"RuneAudio is a free and open source software that turns inexpensive, silent and low-consumption mini-PC into Hi-Fi music players.","enhanced":true,"tile_background":"dark","icon":"runeaudio.png","sha":"60771f7beca3c6c9b9315f392497df965eafeea3"},{"appid":"fbf13ee99afeadddc4f73e1183fd1b52774b3474","name":"ruTorrent","website":"https://github.com/Novik/ruTorrent","license":"GNU General Public License v3.0 or later","description":"ruTorrent is a front-end for the popular Bittorrent client rtorrent.","enhanced":true,"tile_background":"dark","icon":"rutorrent.png","sha":"33bfc2cb41f08f48f13cbbdaf94a3595ca0db7ad"},{"appid":"7aa898759f1d210aaa5edc8a184bfe5e1668b5bd","name":"SABnzbd","website":"https://sabnzbd.org","license":"GNU General Public License v2.0 or later","description":"SABnzbd is a multi-platform binary newsgroup downloader. The program works in the background and simplifies the downloading verifying and extracting of files from Usenet.","enhanced":true,"tile_background":"dark","icon":"sabnzbd.svg","config":{"type":"apikey","stat1":{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"none","updateOnChange":"Yes","suffix":""},"stat2":{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}},"sha":"f88ef3e417e93cf6412a1911e78977926d726028"},{"appid":"40892c1b428213c21516114ade1eaeb8fe26fc96","name":"Scrutiny","website":"https://github.com/AnalogJ/scrutiny","license":"MIT License","description":"Scrutiny is a Hard Drive Health Dashboard & Monitoring solution, merging manufacturer provided S.M.A.R.T metrics with real-world failure rates.","enhanced":false,"tile_background":"light","icon":"scrutiny.png","sha":"3f1802bb52635d69d60a7388212ce3cc0ac641e3"},{"appid":"055bbb599e68faa20cba22098b4802152b33b763","name":"Seafile","website":"https://www.seafile.com","license":"GNU General Public License v2.0 only","description":"Seafile is an open source enterprise file hosting platform with high reliability and performance. Put files on your own server. Sync and share files across different devices, or access all the files as a virtual disk.","enhanced":false,"tile_background":"dark","icon":"seafile.png","sha":"83faa5b6866eabb53804ed4773d1b026dedbbfdf"},{"appid":"d3f896182b5c10b07918e295fce8c5aef054d266","name":"Searx Metasearch Engine","website":"https://searx.me","license":"https://github.com/asciimoo/searx/blob/master/LICENSE","description":"A privacy-respecting, hackable metasearch engine.","enhanced":false,"tile_background":"dark","icon":"searxmetasearchengine.png","sha":"60e20827eae7b443033c18bce465d403782f55c8"},{"appid":"3de4f901fffb30ac720b0e7eb654b4faa2dd03fa","name":"Server","website":"https://en.wikipedia.org/wiki/Server_(computing)","license":"Commercial","description":"In computing, a server is a piece of computer hardware or software (computer program) that provides functionality for other programs or devices, called \"clients\". This architecture is called the client–server model. Servers can provide various functionalities, often called \"services\", such as sharing data or resources among multiple clients, or performing computation for a client.","enhanced":false,"tile_background":"light","icon":"server.svg","sha":"77871ddcf67e89ee491c515135c3590a0a5637ad"},{"appid":"8830438516d806a81d3d2650afa14af4f61bec1f","name":"Serviio","website":"http://serviio.org","license":"Free","description":"Serviio is a free media server. It allows you to stream your media files (music, video or images) to renderer devices (e.g. a TV set, Bluray player, games console or mobile phone) on your connected home network.","enhanced":false,"tile_background":"dark","icon":"serviio.png","sha":"0a065e637718dff3e466415987858418d3264478"},{"appid":"9db4c1b8312db195c8c176f4df4b31998bf1a534","name":"Shaarli","website":"https://github.com/shaarli/Shaarli","license":"GNU General Public License v3.0 only","description":"Shaarli is a minimalist, database-free self-hosted bookmarking and link sharing service. It is designed to be personal (single-user), fast and handy.","enhanced":false,"tile_background":"dark","icon":"shaarli.png","sha":"5f8e4a22ef7d1a92e0aa313d89fd8b1ef1335f84"},{"appid":"dcf2874559e0304e2811c796cb873ae9aac07fa2","name":"Shinobi","website":"https://shinobi.video","license":"GNU Public License 3.0","description":"An open-source CCTV NVR for recording, monitoring, and streaming modern IP cameras. Lightweight, extremely compatible and simple to use.","enhanced":false,"tile_background":"dark","icon":"shinobi.png","sha":"2781b48b52a9c2a20c27bc55f6907a2ddd945793"},{"appid":"f758b0b8b86303210695bf561763bf1d3aadfbb5","name":"Shiori","website":"https://github.com/go-shiori/shiori","license":"MIT License","description":"Shiori is a simple bookmarks manager written in the Go language. Intended as a simple clone of Pocket. You can use it as a command line application or as a web application.","enhanced":false,"tile_background":"dark","icon":"shiori.svg","sha":"fc3adc92248392644d1715e9a40d70fec0419170"},{"appid":"23829a678218110cead136b504b2f256bd4bf2c7","name":"Sickchill","website":"https://sickchill.github.io","license":"GNU General Public License v3.0 or later","description":"Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.","enhanced":false,"tile_background":"light","icon":"sickchill.png","sha":"3dfec726ee50d9e838de6ce9dcaa9fc7b9fc93c8"},{"appid":"675dd93307bd5235a9b5da4268f9fee3d95d6235","name":"SickGear","website":"https://github.com/SickGear/SickGear","license":"GNU General Public License v3.0 only","description":"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more.","enhanced":false,"tile_background":"dark","icon":"sickgear.png","sha":"c1dcff6a74937d05f3a62e760dbe21b21603a778"},{"appid":"0ffe6c3e1f43f953bcfe3a5adb50759b5938aa36","name":"Slack","website":"https://slack.com","license":"Proprietary","description":"Slack is a cloud-based set of proprietary team collaboration tools and services.","enhanced":false,"tile_background":"dark","icon":"slack.svg","sha":"daa36e43a69c3940fbf8c9a02fce7d6428e2a8ff"},{"appid":"b914d6bc6d5e2eb2cb5c4722489521a6d949d8e3","name":"Snapdrop","website":"https://snapdrop.net","license":"GNU General Public License v3.0 or later","description":"Snapdrop - The easiest way to transfer files across devices. Local file sharing in your browser. Inspired by Apple's Airdrop.","enhanced":false,"tile_background":"dark","icon":"snapdrop.png","sha":"605be751eba4dee206d6ad39f4d6964883ad1ea1"},{"appid":"6c050d5bdf522fa20599560ff0f6b74e7dcd97a8","name":"Snibox","website":"https://github.com/snibox/snibox","license":"MIT License","description":"Snibox is a self-hosted, single-user (for now) snippet manager. Developed to collect and organize code snippets. Supports various programming languages, markdown, plain text.","enhanced":false,"tile_background":"dark","icon":"snibox.png","sha":"a2205c47ec8bade945727284f8a2d2b2291c9655"},{"appid":"d143b3a76b72591495655c5257c7523456bdd736","name":"SOGo","website":"https://sogo.nu","license":"GNU GPL/LGPL v2 and above","description":"SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.","enhanced":false,"tile_background":"light","icon":"sogo.svg","sha":"a71a94170c14d8b22de2a2b71d81a0a56803ef73"},{"appid":"68b3ab5f7810a9984bd8f46d53de0abf35f613f9","name":"SonarQube","website":"https://www.sonarqube.org","license":"GNU Lesser General Public License v3.0 only","description":"Catch bugs and vulnerabilities in your app, with thousands of automated Static Code Analysis rules.","enhanced":false,"tile_background":"dark","icon":"sonarqube.png","sha":"1ee8581fb73aafe0a2a2ae3f354177d2d55d784c"},{"appid":"6e2a525ceb737f9ed8badcef5eb20d1502e39656","name":"Sonarr","website":"https://sonarr.tv","license":"GNU General Public License v3.0 only","description":"Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.","enhanced":true,"tile_background":"dark","icon":"sonarr.svg","config":{"type":"apikey","stat1":{"name":"Missing","url":":url:api/v3/wanted/missing?sortKey=series.title&apikey=:apikey:","key":"totalRecords","filter":"none","updateOnChange":"No"},"stat2":{"name":"Queue","url":":url:api/v3/queue?apikey=:apikey:","key":null,"filter":"count","updateOnChange":"No"}},"sha":"21856734489b14e4ee9c53511645b0ae518182e2"},{"appid":"f491c749924e2532e3b6c4496b94e03fd2b54f27","name":"Sourcegraph","website":"https://sourcegraph.com","license":"Apache License 2.0","description":"Sourcegraph is a free, open-source, self-hosted code search and navigation tool for developers. Use it with any Git code host for teams of any size.","enhanced":false,"tile_background":"dark","icon":"sourcegraph.png","sha":"36f07df2c56008766ab29bf2734ead7f73a3eec2"},{"appid":"c106a4464d1b08d0e35edb92ddfabae6f9dc765f","name":"Speedtest Tracker","website":"https://github.com/henrywhitaker3/Speedtest-Tracker","license":"GNU General Public License v3.0 only","description":"This program runs a speedtest check every hour and graphs the results. The back-end is written in Laravel and the front-end uses React. It uses the Ookla's speedtest cli package to get the data and uses Chart.js to plot the results.","enhanced":true,"tile_background":"dark","icon":"speedtesttracker.png","sha":"98fd79fa4e2ea63d084f2662aad0caa780679559"},{"appid":"c8714150b8061714a04b8cc146c8bf0210c05b62","name":"Splunk","website":"https://splunk.com","license":"Commercial","description":"Splunk (the product) captures, indexes and correlates real-time data in a searchable repository from which it can generate graphs, reports, alerts, dashboards and visualizations.","enhanced":false,"tile_background":"dark","icon":"splunk.png","sha":"7fbbcf62234a47ae17335a549ae39ea9a8c4df2a"},{"appid":"8d40ec161e2793d4ad3526e66d1723b2043780b6","name":"Spotweb","website":"https://github.com/spotweb/spotweb","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Spotweb is a decentralized usenet community based on the Spotnet protocol.","enhanced":true,"tile_background":"dark","icon":"spotweb.png","sha":"f2d2564e46ddc0412d31b64ea5bb30786d359d2d"},{"appid":"dddd912a7abafef0d73bf3ca9e2575e33971c012","name":"Squidex","website":"https://squidex.io","license":"MIT License","description":"Squidex is an open source headless content management system (cms) with automatic API generation. It can manage all your backend content, for example: Dynamic elements for your mobile apps. Blog posts and articles for your website. Configuration data for your backend. Rich and structured data for your application.","enhanced":false,"tile_background":"dark","icon":"squidex.svg","sha":"947528f4a99d0da8213a66411553e363e004aaa7"},{"appid":"585815f2ee7291f96ea30333fd94d20b5722693f","name":"Stash","website":"https://github.com/stashapp/stash","license":"MIT License","description":"Stash is a Go app which organizes and serves your porn.","enhanced":true,"tile_background":"dark","icon":"stash.svg","sha":"c261ff5a4c91cb35a64d75aaa6d559afb8df0477"},{"appid":"2a7e2a851e5597e23c2be647eeda17d9105933ba","name":"Statping","website":"https://github.com/hunterlong/statping","license":"GNU General Public License v3.0 only","description":"Status Page for monitoring your websites and applications with beautiful graphs, analytics, and plugins. Run on any type of environment.","enhanced":false,"tile_background":"light","icon":"statping.png","sha":"8d778ff214f9a210d6929ca23aa8704cc82c6dff"},{"appid":"f2c4ab39ad8485316cf9f0ed6c5951629e324feb","name":"Strapi","website":"https://strapi.io","license":"MIT License","description":"Strapi is an open source headless content management system (CMS). Keep control and deliver faster. Building self-hosted, customizable and performant Content API has never been easier.","enhanced":false,"tile_background":"light","icon":"strapi.png","sha":"7860a7ac1e6258e8eef6fc9c1dbbeef8557908ab"},{"appid":"3e1575bb500ee1e3bb80d84d3a8fb2d90a707ba4","name":"Streama","website":"https://github.com/streamaserver/streama","license":"MIT License","description":"Ever had a huge bookshelf full of shows and movies? Ever wanted to digitalize them, but didn't have a good way of organizing the files? Worry no more! Streama is your own personal Netflix for just such a purpose!","enhanced":false,"tile_background":"light","icon":"streama.png","sha":"76296bf9354fb14581e310e919e38ccffc91781e"},{"appid":"0680196c9ecb05c60ff8f8e757deff6fc7260754","name":"Supermicro IPMI","website":"https://www.supermicro.com/en/solutions/management-software/ipmi-utilities","license":"Commercial","description":"IPMI is a hardware solution for controlling and managing your servers. It has significant differences and benefits compared to system diagnosis software. For example, IPMI gives you the ability to manage servers in remote physical locations regardless of the installed operating system.","enhanced":false,"tile_background":"light","icon":"supermicroipmi.png","sha":"10534206a2fee003e4c72974aa7533bdfa816eaf"},{"appid":"35bc724730476a47cf18f92f486cd9e7745d4f15","name":"Sympa","website":"https://www.sympa.org","license":"GNU General Public License v2.0 only","description":"Sympa is an open source mailing list manager. It provides advanced features with a rich and secure web interface.","enhanced":false,"tile_background":"light","icon":"sympa.svg","sha":"855159759136c30e20b684a3e7810e6b5635bfe2"},{"appid":"361732e3fd1161330a49bebcccb955241621e1b1","name":"Synclounge","website":"https://github.com/samcm/SyncLounge","license":"MIT License","description":"SyncLounge (Previously PlexTogether) is a tool to sync Plex content across multiple players in multiple locations.","enhanced":false,"tile_background":"dark","icon":"synclounge.png","sha":"0dc305754e8830f5bdc979e3f70c7aa7d21742c1"},{"appid":"7775c3bbf580fbaf57818e68ce7b1b48b8f93b95","name":"Syncthing","website":"https://syncthing.net","license":"Mozilla Public License 2.0","description":"Syncthing is a free, open-source peer-to-peer file synchronization application. It can sync files between devices on a local network, or between remote devices over the Internet.","enhanced":true,"tile_background":"dark","icon":"syncthing.svg","sha":"60854ca8169219c621d3ca1c6e0432e31d585b02"},{"appid":"8521f6e426ad621f27a6b48be57a3c6056c9cfd3","name":"Synology","website":"http://synology.com","license":"commercial","description":"Synology is a popular NAS appliance","enhanced":false,"tile_background":"light","icon":"synology.png","sha":"3ac222187caf2d69944933b4403429754c5f625f"},{"appid":"1de00f5662a5c44f3d23b50f9e13232cdd64f667","name":"Tachidesk","website":"https://github.com/Suwayomi/Tachidesk-Server","license":"Mozilla Public License 2.0","description":"A free and open source manga reader server that runs extensions built for Tachiyomi.\r\nTachidesk is an independent Tachiyomi compatible software and is not a Fork of Tachiyomi.","enhanced":false,"tile_background":"dark","icon":"tachidesk.png","sha":"1c28a6bfb621aa45fc91c5b0e1fab3d6b6674713"},{"appid":"4c0f3ebde3d0c13fce8b4b02d1d80fea4123e07a","name":"Taiga","website":"https://taiga.io","license":"GNU Affero General Public License v3.0","description":"Taiga is a project management platform for agile developers & designers and project managers who want a beautiful tool that makes work truly enjoyable. It's free, open source and simple to use.","enhanced":false,"tile_background":"dark","icon":"taiga.png","sha":"f1c19e0c35c618b1eb493bb422e9298c857887bb"},{"appid":"343eebd3e9330c34952dcb3bc5c94ba12bf07a67","name":"Tandoor Recipes","website":"https://docs.tandoor.dev","license":"GNU Affero General Public License v3.0","description":"The recipe manager that allows you to manage your ever growing collection of digital recipes.","enhanced":false,"tile_background":"light","icon":"tandoorrecipes.svg","sha":"2e51eff3aba9ad6149727b8bcb6fb9c1d9466e74"},{"appid":"44fb3ee60816316d3c253e7454f5e0ab5f46680a","name":"Tar1090","website":"https://github.com/wiedehopf/tar1090","license":"GNU General Public License v2.0 only","description":"Provides an improved webinterface for use with ADS-B decoders readsb / dump1090-fa","enhanced":true,"tile_background":"dark","icon":"tar1090.png","sha":"56864298c40a6d210efb04f13bd710991e4de092"},{"appid":"0c0c3373606e00d765583eaf1fc2c1bca6c09df3","name":"Tartube","website":"https://github.com/axcore/tartube","license":"GNU General Public License v3.0 only","description":"Tartube is a GUI front-end for youtube-dl, yt-dlp and other compatible video downloaders.","enhanced":false,"tile_background":"dark","icon":"tartube.png","sha":"2660a795f1fe1dc70f32969482bcdeab414fc8ff"},{"appid":"ecf26dc5795ae2ccb3afbfa44570237590d65145","name":"TasmoAdmin","website":"https://github.com/reloxx13/TasmoAdmin","license":"GNU General Public License v3.0 only","description":"TasmoAdmin (previously SonWEB) is an administrative Website for Devices flashed with Tasmota.","enhanced":false,"tile_background":"dark","icon":"tasmoadmin.png","sha":"621e5459a31877d513be69cf6929e882d1a0c9b0"},{"appid":"0d318b04d2442102c6a9643405bce18b5df5cf78","name":"Tasmota","website":"https://github.com/arendst/Tasmota","license":"GNU General Public License v3.0 or later","description":"Alternative firmware for ESP8266 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX.","enhanced":true,"tile_background":"light","icon":"tasmota.png","sha":"64eccc8b53a0a1eb1233f8235abbad636a2d2d91"},{"appid":"93ce76191583a25ac33c1918c5ad0b8a5f260451","name":"Tautulli","website":"https://tautulli.com","license":"GNU General Public License v3.0 only","description":"A python based web application for monitoring, analytics and notifications for Plex Media Server.","enhanced":true,"tile_background":"light","icon":"tautulli.png","sha":"0066b48addd54251ae95c9d7b1456ee6e5cefa90"},{"appid":"279db11ace3924a4a2a36dfd59a34e3bd352a5b4","name":"Tdarr","website":"https://github.com/HaveAGitGat/Tdarr","license":"GNU General Public License v3.0 only","description":"Tdarr is a self hosted web-app for automating media library transcode/remux management and making sure your files are exactly how you need them to be in terms of codecs/streams/containers etc. Designed to work alongside Sonarr/Radarr and built with the aim of modularisation, parallelisation and scalability, each library you add has its own transcode settings, filters and schedule. Workers can be fired up and closed down as necessary, and are split into 3 types - 'general', 'transcode' and 'health check'. Worker limits can be managed by the scheduler as well as manually. For a desktop application with similar functionality please see HBBatchBeast.","enhanced":true,"tile_background":"dark","icon":"tdarr.png","sha":"4985c32ffb917ba8708234babddcaaef6ba63e30"},{"appid":"fe8ca35ebcfc6fa1fc949fbcac58e083a19f6381","name":"Technitium DNS","website":"https://technitium.com/dns","license":"GNU General Public License v3.0 only","description":"Technitium DNS Server is an open source authoritative as well as recursive DNS server that can be used for self hosting a DNS server for privacy & security. It works out-of-the-box with no or minimal configuration and provides a user friendly web console accessible using any modern web browser.","enhanced":false,"tile_background":"dark","icon":"technitiumdns.png","sha":"f5f795d41f5b3379e1791041c708fa477f663493"},{"appid":"18bd5c19b49acc0a5030708e664fb1ed249a8fa5","name":"Teedy","website":"https://teedy.io","license":"GNU General Public License v2.0 only","description":"Teedy is a lightweight document management system packed with all the features you can expect from big expensive solutions but still easy to use.","enhanced":false,"tile_background":"dark","icon":"teedy.png","sha":"d3b09e92540d9f6dff419d21a7ce386c08ad9b24"},{"appid":"5023ad25cdb679ee3bf1e659434da75ec0177924","name":"The Lounge","website":"https://thelounge.chat","license":"MIT License","description":"Modern multi-user web IRC client designed for self-hosting","enhanced":false,"tile_background":"dark","icon":"thelounge.png","sha":"c1665a8035979a41438f870d1f58659e29e92af7"},{"appid":"9a83dce0e30910276872015367d926660780e6d8","name":"Tiny Tiny RSS","website":"https://tt-rss.org","license":"GNU General Public License v3.0 only","description":"Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator","enhanced":false,"tile_background":"light","icon":"tinytinyrss.png","sha":"3f0978f20b3b3059674e90783f126ff7c0dc4b54"},{"appid":"67f7ed18fb98b30dc7ee328877f789de10be4227","name":"Traccar","website":"https://www.traccar.org","license":"Apache License 2.0","description":"Server software for GPS tracking including device communication back-end and web interface","enhanced":false,"tile_background":"light","icon":"traccar.png","sha":"529d4bd0ba721771e55bbeccd5d3ed44bf63554e"},{"appid":"a83e2ce54bbef3bef63aa7f02b08dbda7fdae4c5","name":"Traefik","website":"https://traefik.io","license":"MIT License","description":"Træfik is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Træfik integrates with your existing infrastructure components and configures itself automatically and dynamically.","enhanced":true,"tile_background":"dark","icon":"traefik.svg","sha":"534e7365427b496bd78fd270a67a1d2e76c6102c"},{"appid":"34899a33e3d7e33e1966b921ea250350fc71591a","name":"Transmission","website":"https://transmissionbt.com","license":"GNU General Public License v3.0 only","description":"Transmission is a BitTorrent client which features a variety of user interfaces on top of a cross-platform back-end.","enhanced":true,"tile_background":"dark","icon":"transmission.svg","sha":"c74297140cff668aba5638529809ab2324ab04f3"},{"appid":"3add4f3aea6cc6eb1ec164d73b6935ce454b8f16","name":"Trilium","website":"https://github.com/zadam/trilium","license":"GNU Affero General Public License v3.0","description":"Build your personal knowledge base with Trilium Notes.","enhanced":false,"tile_background":"dark","icon":"trilium.png","sha":"5b540443d20c6115b9d4a987ad61d061c0db7135"},{"appid":"07f6df4f81edd2e3dadf7e5fb56c37d6fb8acef4","name":"TrueNAS","website":"https://www.truenas.com","license":"BSD-2-Clause","description":"TrueNAS is an embedded open source network-attached storage (NAS) operating system based on FreeBSD.","enhanced":false,"tile_background":"light","icon":"truenas.png","sha":"0fd0046da3ce6740a29b1d4db9d2f9caee8a7edc"},{"appid":"a1e408cd7144157cd6400993af4f68046bf77fd5","name":"TrueNAS CORE","website":"https://www.truenas.com/truenas-core","license":"BSD 2-Clause FreeBSD License","description":"TrueNAS CORE is enterprise-quality software-defined storage that can be used without restrictions or cost. It is also the core of the full-fledged enterprise edition, TrueNAS Enterprise, which provides the additional fault-tolerance, performance, and support that businesses and critical applications require.","enhanced":true,"tile_background":"dark","icon":"truenascore.png","sha":"d773b391f895e968e100f085c12bae64a87f8dcb"},{"appid":"ac61e1834dac0f75ea1ab6d3a23976ffc4f46b74","name":"TVHeadend","website":"https://tvheadend.org","license":"GNU General Public License v3.0 only","description":"TVHeadend, sometimes TVH for short, is a server application that reads video streams from LinuxTV sources and publishes them as internet streams.","enhanced":false,"tile_background":"dark","icon":"tvheadend.png","sha":"816d83d265854f107a9a0fb647a71e8910d4a69a"},{"appid":"6bf857ca7de026fbed4ae790a809a0ea640901f4","name":"TYPO3","website":"https://typo3.org","license":"GNU General Public License v2.0 or later","description":"The Professional, Flexible Content Management System.\nTYPO3 CMS is an Open Source Enterprise Content Management System with a large global community, backed by the approximately 900 members of the TYPO3 Association.","enhanced":false,"tile_background":"light","icon":"typo3.svg","sha":"6bbc4f9019d62c4cc06fb96464383509e75fb4cd"},{"appid":"cf79bd157a6af435240abdd8fbf9afb5f09abb7d","name":"Ubooquity","website":"https://vaemendis.net/ubooquity","license":"MIT License","description":"Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer.","enhanced":false,"tile_background":"dark","icon":"ubooquity.png","sha":"9948aed9246bdc3ab97647513dd0223bff8c46f2"},{"appid":"8cdba423d7bb49fad21662247750cd715f08cdc5","name":"UniFi","website":"https://unifi-sdn.ubnt.com","license":"Unknown","description":"The UniFi® Controller software is a powerful, enterprise wireless software engine ideal for high-density client deployments requiring low latency and high uptime performance.","enhanced":false,"tile_background":"light","icon":"unifi.png","sha":"d18d390e8dab266760076873a7429658f348b8fb"},{"appid":"11b790731286c7538e27885bc827dc6f6ceb8db2","name":"Unraid","website":"https://unraid.net","license":"Proprietary","description":"Unraid is software for storing and managing digital files on a mass-storage server. It is an embedded Network Attached Storage (NAS) server operating system.","enhanced":false,"tile_background":"dark","icon":"unraid.png","sha":"374d7a23caa6eec728bda91b1076a7acfc1d10c9"},{"appid":"366c6646eedab83cc4b349f198424d2291cbfa76","name":"Uptime Kuma","website":"https://uptime.kuma.pet","license":"MIT License","description":"It is a self-hosted monitoring tool like \"Uptime Robot\".","enhanced":false,"tile_background":"dark","icon":"uptimekuma.svg","sha":"dbfb2672e35259dc210ade0fc37e14f0f500f2a9"},{"appid":"89f71687e2a69d7c9432b2ee76a9b638306e9fd5","name":"UrBackup","website":"https://www.urbackup.org","license":"GNU Affero General Public License v3.0 or later","description":"UrBackup is an easy to setup Open Source client/server backup system, that through a combination of image and file backups accomplishes both data safety and a fast restoration time.\r\nFile and image backups are made while the system is running without interrupting current processes.\r\nUrBackup also continuously watches folders you want backed up in order to quickly find differences to previous backups. Because of that, incremental file backups are really fast.\r\nYour files can be restored through the web interface, via the client or the Windows Explorer while the backups of drive volumes can be restored with a bootable CD or USB-Stick (bare metal restore).","enhanced":true,"tile_background":"light","icon":"urbackup.png","sha":"de492f3162636ce940570b8a6e13c41b37bbd701"},{"appid":"5f0180fbeccdee64f7314b367e87e6994089f199","name":"ViMbAdmin","website":"https://www.vimbadmin.net","license":"GNU General Public License v3.0 only","description":"The ViMbAdmin project (vim-be-admin) provides a web based virtual mailbox administration system allowing mail administrators to manage domains, mailboxes and aliases.","enhanced":false,"tile_background":"light","icon":"vimbadmin.jpeg","sha":"b0b494af73a0bfeec20654771db1f31c217e2b2f"},{"appid":"62484a2ddd0930286322c0a4364dd404951a1070","name":"Virtualmin","website":"https://www.virtualmin.com","license":"GNU General Public License v3.0 only","description":"Virtualmin is a domain hosting and website control panel, which gives the ability to create and manage many domains. As well as simplify both automation and tasks.","enhanced":false,"tile_background":"dark","icon":"virtualmin.svg","sha":"5d7e507eefaf03e332acba63ae11268d7926fc53"},{"appid":"c934574c40a11992b08ce4e659ca23310916436c","name":"Virtual Radar Server","website":"https://www.virtualradarserver.co.uk","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Virtual Radar Server is an open-source .NET application that runs a local web server. You can connect to the web server with any modern browser and see the aircraft plotted on a map. You will need a radio that is capable of receiving Mode-S transmissions. Virtual Radar Server was written and tested using Kinetic Avionic's SBS-1er and SBS-3 radios but it will work with any receiver or SDR that can produce the Kinetic text message format, Kinetic's SBS-3 binary format, the AVR \"*\", \"@\" or \":\" formats or the Mode-S Beast binary format.","enhanced":false,"tile_background":"light","icon":"virtualradarserver.png","sha":"96b314116c60eb77507cd382ec3d697ced14d29e"},{"appid":"39d2762d5690a6ebeb6ac1615d3ee5d58b07ab7e","name":"VMware ESXi","website":"https://www.vmware.com/products/esxi-and-esx.html","license":"Commercial","description":"VMware ESXi is an enterprise-class, type-1 hypervisor developed by VMware for deploying and serving virtual computers. As a type-1 hypervisor, ESXi is not a software application that is installed on an operating system; instead, it includes and integrates vital OS components, such as a kernel.","enhanced":false,"tile_background":"dark","icon":"vmwareesxi.png","sha":"f85871709215674edd1bf0cfa025a2f1f7df9b25"},{"appid":"b63d3ad41413da4056fbae6dc0ebc190668b3545","name":"vmware horizon","website":"https://www.vmware.com/products/horizon.html","license":"Commercial","description":"desktop and app virtualization.","enhanced":false,"tile_background":"dark","icon":"vmwarehorizon.png","sha":"4646b5284fe335b3d03f83e6b8a9ee2a2bc5f7a8"},{"appid":"a0a47ab17060b3437e3f16fed9cae275c7e8d43a","name":"VMware vCenter","website":"https://www.vmware.com/products/vcenter-server.html","license":"Proprietary","description":"VMware vCenter Server provides a centralized platform for managing your VMware vSphere environments, allowing you to automate and deliver a virtual infrastructure across the hybrid cloud with confidence.","enhanced":false,"tile_background":"light","icon":"vmwarevcenter.png","sha":"832d45664fe386c57315639f9d02d36a94667b27"},{"appid":"90c60ebc78d163e508d41233af19bf9b31706012","name":"Volumio","website":"https://volumio.org","license":"GNU General Public License v3.0 only","description":"Volumio is an open source audiophile music player. It is designed and fine-tuned for high-quality music playback and it runs on a variety of devices such as Raspberry PI and other microcomputers as well as PCs and Notebooks.","enhanced":true,"tile_background":"light","icon":"volumio.png","sha":"12944dab377c93f020e217c168e941a1b337d8ed"},{"appid":"095afe286edc44dd8241e7a33138bc6d","name":"VuPlus","website":"http://vuplus.com","license":"commercial","description":"The Vu+ (pronounced VuPlus), is a series of Linux-powered DVB satellite, terrestrial digital television receivers (set-top box)","enhanced":true,"tile_background":"light","icon":"vuplus.png","sha":"66e4026a07441e818a1fc076b8bb6d03a37370fa"},{"appid":"9dc07af7d1d88c183c6ae42c903650ab19ada2bb","name":"Wallabag","website":"https://www.wallabag.org/en","license":"MIT License","description":"Wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.","enhanced":false,"tile_background":"dark","icon":"wallabag.png","sha":"891cb18c5768d6b61700da7800d840a44e3edc46"},{"appid":"dc115cfaac280c4b97289484356c21428af565be","name":"WaniKani","website":"https://www.wanikani.com","license":"Proprietary","description":"WaniKani is a Japanese radicals, kanji, and vocabulary learning web app that uses mnemonics and SRS to make kanji learning simple.","enhanced":true,"tile_background":"light","icon":"wanikani.png","sha":"d0272bb69054dccad8127c396d3caf333a299256"},{"appid":"785ad2ec16dcf34b4fc83b025b930818c6372567","name":"Watcher","website":"https://github.com/nosmokingbandit/Watcher3","license":"Apache License 2.0","description":"Watcher is an automated movie NZB & Torrent searcher and snatcher. You can add a list of wanted movies and Watcher will automatically send the NZB or Torrent to your download client.","enhanced":false,"tile_background":"dark","icon":"watcher.png","sha":"fbb828f6b576aaabaec12cf7bb0a7e467535eef3"},{"appid":"b9726e44ef09db12f6e010af8977d55dc971b841","name":"Webmin","website":"http://www.webmin.com","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Webmin is a web-based system configuration tool for Unix-like systems, although recent versions can also be installed and run on Windows.","enhanced":false,"tile_background":"dark","icon":"webmin.svg","sha":"82fd5506867a4ad15840b5f045e03173cacf1405"},{"appid":"11915e3ab4fbb44453d956eb4d5163cad8050d6b","name":"WebTools","website":"https://github.com/ukdtom/WebTools.bundle","license":"Mozilla Public License 2.0","description":"WebTools is a collection of tools for Plex Media Server. Like the Unsupported AppStore (UAS)","enhanced":false,"tile_background":"dark","icon":"webtools.png","sha":"ebf888ae20fe6388f418dda2e6ea3f728d89704d"},{"appid":"b4021dd275593e7b96610fc7b6300af8cdca8765","name":"Wekan","website":"https://wekan.github.io","license":"MIT License","description":"Wekan is an open source, collaborative kanban board application.","enhanced":false,"tile_background":"dark","icon":"wekan.png","sha":"a8619f8d94c2edda44ae736453d3cdb13f36009c"},{"appid":"9b4e87ab376cf2327facda32fa98617676dfccd9","name":"Wetty","website":"https://github.com/krishnasrinivas/wetty","license":"MIT License","description":"WeTTy = Web + TTy. Terminal web app in browser over http/https. (Ajaxterm/Anyterm alternative, but much better). WeTTy is an alternative to ajaxterm and anyterm but much better than them because WeTTy uses xterm.js which is a full fledged implementation of terminal emulation written entirely in JavaScript. WeTTy uses websockets rather then Ajax and hence better response time.","enhanced":false,"tile_background":"dark","icon":"wetty.png","sha":"4968396922acda79b17198c89262e3a3eef96774"},{"appid":"daec766cafab4e5297d8c2359810b3dfcc7626fd","name":"Wg Gen Web","website":"https://github.com/vx3r/wg-gen-web","license":"Do What The F*ck You Want To Public License","description":"Simple Web based configuration generator for WireGuard","enhanced":false,"tile_background":"dark","icon":"wggenweb.png","sha":"90cd2250ba15be9eab07ddb358e985d6d9896fb4"},{"appid":"170b7d7a0634e8d51a768a113f00d7601fa9b182","name":"Whoogle","website":"https://github.com/benbusby/whoogle-search","license":"MIT License","description":"A self-hosted, ad-free, privacy-respecting metasearch engine. Get Google search results, but without any ads, javascript, AMP links, cookies, or IP address tracking.","enhanced":false,"tile_background":"light","icon":"whoogle.png","sha":"9645a73fba32442d29b585857f0890ea733eea74"},{"appid":"cf796459bad1da470debfed16506e47aab347dbe","name":"Wiki.js","website":"https://wiki.js.org","license":"GNU Affero General Public License v3.0","description":"Wiki.js | A modern, lightweight and powerful wiki app built on Node.js","enhanced":false,"tile_background":"light","icon":"wikijs.png","sha":"621a1c99a70b92b7fd2f1136d13078b7ce1d47f0"},{"appid":"afef2217e82ee20638490bb102605f6e09789093","name":"WireGuard","website":"https://www.wireguard.com","license":"CNRI Python Open Source GPL Compatible License Agreement","description":"WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.","enhanced":false,"tile_background":"dark","icon":"wireguard.png","sha":"83e191e4d2a549f48f113acc9589a46d5a6baad4"},{"appid":"ac894a3a9399f135f6eb87f27fb742c71189cc86","name":"WLED","website":"https://wled.me","license":"MIT License","description":"A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs or also SPI based chipsets like the WS2801 and APA102! More Info see wled.me","enhanced":false,"tile_background":"dark","icon":"wled.png","sha":"99d49dbec81f657d3a6e668e151b1f09f116325d"},{"appid":"b1909932aac1c5510c044de0cb8c0f3ef049a250","name":"WordPress","website":"https://wordpress.org","license":"GNU General Public License v2.0 only","description":"WordPress is open source software you can use to create a beautiful website, blog, or app.","enhanced":false,"tile_background":"dark","icon":"wordpress.svg","sha":"87e140cbfd1c3af26afb259e20d152ef1d269073"},{"appid":"d1d0f952ebdcb6b8918bdd7ddbf55793dca5fa93","name":"Xen-Orchestra","website":"https://xen-orchestra.com","license":"GNU Affero General Public License v3.0","description":"XO is a web interface to visualize and administer your XenServer (or XAPI enabled) hosts.","enhanced":false,"tile_background":"dark","icon":"xenorchestra.png","sha":"6bcaafa72d5160eac7998fc5c09b68b61dd79acb"},{"appid":"8304785b9937bf6d4e04c2d7aaa786b3577fb10c","name":"Xigmanas","website":"https://www.xigmanas.com","license":"BSD 2-Clause \"Simplified\" License","description":"XigmaNAS is an Open Source Storage NAS (Network-Attached Storage) distribution based on FreeBSD.","enhanced":false,"tile_background":"dark","icon":"xigmanas.png","sha":"cfedf8483c7876e11f001381afb66f49f43208f7"},{"appid":"cb6a8a853393228efd2b7b1963f50d56b7f0d818","name":"xTeVe","website":"https://xteve.de","license":"MIT License","description":"M3U Proxy for Plex DVR and Emby Live TV","enhanced":false,"tile_background":"dark","icon":"xteve.png","sha":"87617790b891bcfe76047a85e740b2f62537bbd1"},{"appid":"991894ca059d0faa7400a50c0aefb30d252346e7","name":"XWiki","website":"https://www.xwiki.org","license":"GNU Lesser General Public License v2.1 only","description":"Advanced Open Source Enterprise Wiki","enhanced":false,"tile_background":"light","icon":"xwiki.png","sha":"081ef4e4c9e9d062b8fcd9a58f79c268a28b4f51"},{"appid":"56eb3a3ec734e5a66d4f1746ef58961d266fdabe","name":"Yacht","website":"https://github.com/SelfhostedPro/Yacht","license":"MIT License","description":"Yacht is a container management UI with a focus on templates and 1-click deployments.","enhanced":false,"tile_background":"dark","icon":"yacht.svg","sha":"5483dc7fd4fefbe4edc137daeda889ed06b8bd5b"},{"appid":"d5dc44619c761e1012648613619006016a669ee7","name":"YNAB","website":"https://www.youneedabudget.com","license":"Commercial","description":"You Need a Budget (YNAB) (pronounced Why-nab) is an multi-platform personal budgeting program based on the envelope method.","enhanced":false,"tile_background":"light","icon":"ynab.png","sha":"37bf33d68cf85dda6506b73ca888566a55516f99"},{"appid":"f23460c5b2dba5711733151081cd82ecc9106964","name":"YOURLS","website":"https://yourls.org","license":"MIT License","description":"YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener, on your server. You'll have full control over your data, detailed stats, analytics, plugins, and more. It's free and open-source.","enhanced":false,"tile_background":"dark","icon":"yourls.svg","sha":"ba9193806fa47b1e906470099254cc6a3cd439d5"},{"appid":"6c87650cad54af69bf838f03b190280f7537c03d","name":"Your Spotify","website":"https://github.com/Yooooomi/your_spotify","license":"MIT License","description":"Your Spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.","enhanced":false,"tile_background":"light","icon":"yourspotify.svg","sha":"02ce5767423ee00b577a9077425418ac52c9ff85"},{"appid":"6e4a451c7c654ae2bc5c75689e690966a5fd29ee","name":"youtube-dl","website":"https://youtube-dl.org","license":"The Unlicense","description":"youtube-dl is a command-line program to download videos from YouTube.com and a few more sites","enhanced":false,"tile_background":"light","icon":"youtubedl.png","sha":"dc57c93bd4285ef1dd92a8c33644c80f211edf92"},{"appid":"19132c3f80c33d38bbe4c51828f05b081e9f66cd","name":"Zabbix","website":"https://www.zabbix.com","license":"GNU General Public License v2.0 only","description":"Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics.","enhanced":false,"tile_background":"dark","icon":"zabbix.svg","sha":"c628b621f93015b2f13e92f396e78e66f4ed1c80"},{"appid":"4caf560ca51d18d1be6dd09a48fafa883c293462","name":"Zammad","website":"https://zammad.org","license":"GNU Affero General Public License v3.0","description":"Zammad is a web-based, open source user support/ticketing solution.","enhanced":false,"tile_background":"dark","icon":"zammad.svg","sha":"39652da7cdd76303359b525fc395ce86804d60bf"},{"appid":"563c45bed29a24c1a1a2981af1a93bdeb692713b","name":"ZNC","website":"https://wiki.znc.in/ZNC","license":"Apache License","description":"IRC bouncer","enhanced":false,"tile_background":"dark","icon":"znc.png","sha":"1610953b6bb76a70fdcdd7712895eeb6020f80a6"},{"appid":"e7ebe523e3dcf616e0553e60747f415d47a6fe22","name":"ZoneMinder","website":"https://zoneminder.com","license":"GNU General Public License v2.0 only","description":"A full-featured, open source, state-of-the-art video surveillance software system.\r\n\r\nMonitor your home, office, or wherever you want. Using off the shelf hardware with any camera, you can design a system as large or as small as you need.","enhanced":false,"tile_background":"dark","icon":"zoneminder.png","sha":"6676c2f1aa8601355d52cf1aa6e14809aeee138d"},{"appid":"d17139efd0d8e0cba9bf8380c9818838911dfe0f","name":"Zulip","website":"https://zulipchat.com","license":"Apache License 2.0","description":"Powerful open source team chat. Zulip combines the immediacy of real-time chat with an email threading model. With Zulip, you can catch up on important conversations while ignoring irrelevant ones.","enhanced":false,"tile_background":"light","icon":"zulip.png","sha":"d33ca773e13658ad763dcce6a7f7f6362365965c"}]} \ No newline at end of file +{"appcount":353,"apps":[{"appid":"140902edbcc424c09736af28ab2de604c3bde936","name":"AdGuard Home","website":"https://github.com/AdguardTeam/AdGuardHome","license":"GNU General Public License v3.0 only","description":"AdGuard Home is a network-wide software for blocking ads & tracking. After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that.\r\n\r\nIt operates as a DNS server that re-routes tracking domains to a \"black hole,\" thus preventing your devices from connecting to those servers. It's based on software we use for our public AdGuard DNS servers -- both share a lot of common code.","enhanced":true,"tile_background":"light","icon":"adguardhome.png","sha":"4a888eb1344ab21a7280dc296e3ac7c0185dea02"},{"appid":"653caf8bdf55d6a99d77ceacd79f622353cd821a","name":"Adminer","website":"https://www.adminer.org","license":"Apache License 2.0","description":"Adminer (formerly phpMinAdmin) is a full-featured database management tool written in PHP. Conversely to phpMyAdmin, it consists of a single file ready to deploy to the target server. Adminer is available for MySQL, MariaDB, PostgreSQL, SQLite, MS SQL, Oracle, Firebird, SimpleDB, Elasticsearch and MongoDB.","enhanced":false,"tile_background":"light","icon":"adminer.svg","sha":"d31e0dae2c981c7e069cc0910fbb3b57079bed05"},{"appid":"317f16f137fe0fd9eaf67dd6e203e50c0c1bf319","name":"Airsonic","website":"https://airsonic.github.io","license":"GNU General Public License v3.0 only","description":"Airsonic is a free, web-based media streamer, providing ubiquitious access to your music. Use it to share your music with friends, or to listen to your own music while at work.","enhanced":false,"tile_background":"dark","icon":"airsonic.png","sha":"d911cfafb087e772225a2b8f4401b31c0d049e98"},{"appid":"4a1349c03398a3e66f6efdf6395fb689d80f83fa","name":"AlarmPI","website":"https://github.com/bkbilly/AlarmPI","license":"MIT License","description":"AlarmPI is a home security system based on Raspberry PI. It supports wired sensors (PIR, Magnetic etc.) and wireless through MQTT or Hikvision.","enhanced":true,"tile_background":"dark","icon":"alarmpi.png","sha":"06f19db7969150b40bda61824174bfb6a4060e51"},{"appid":"9fe84adc4eb8248be3322c8754a0cf6219d122d6","name":"Alertmanager","website":"https://prometheus.io/docs/alerting/alertmanager","license":"Apache License 2.0","description":"The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integrations such as email, PagerDuty, or OpsGenie. It also takes care of silencing and inhibition of alerts.","enhanced":false,"tile_background":"light","icon":"alertmanager.png","sha":"4b9423144ba243902f0c83289c862c4dcf407afe"},{"appid":"65f59ec6b1ecd6170d5044474043cca9560a8071","name":"AMP","website":"https://cubecoders.com/AMP","license":"Proprietary","description":"AMP is short for Application Management Panel. It's our next-generation server administration software built for both users, and service providers. It supports both Windows and Linux based servers and allows you to manage all your game servers from a single web interface.","enhanced":false,"tile_background":"light","icon":"amp.png","sha":"e9f6f24acc99081f9d9563fa5f08bb53d0622dc0"},{"appid":"7779bfb41003301f1b395c0691002423773d68c1","name":"ArchiSteamFarm","website":"https://github.com/JustArchiNET/ArchiSteamFarm","license":"Apache License 2.0","description":"ASF is a C# application with primary purpose of idling Steam cards from multiple accounts simultaneously.","enhanced":true,"tile_background":"dark","icon":"archisteamfarm.png","sha":"7b327befb2654f0586da45b437aefda2432d1be6"},{"appid":"b74f349cf434a529c0fe8589315b5956a4562097","name":"ArchiveBox","website":"https://github.com/pirate/ArchiveBox","license":"MIT License","description":"The open-source self-hosted web archive. ArchiveBox takes a list of website URLs you want to archive, and creates a local, static, browsable HTML clone of the content from those websites (it saves HTML, JS, media files, PDFs, images and more).","enhanced":false,"tile_background":"light","icon":"archivebox.png","sha":"d14483074e70455d6aafd76ab3d9ab9604f85836"},{"appid":"5eef559f19eadb9593bafbd3ca6155dc6721a0d7","name":"ArchiveTeam Warrior","website":"https://www.archiveteam.org/index.php?title=ArchiveTeam_Warrior","license":"The Unlicense","description":"The Archive Team Warrior is a virtual archiving appliance. You can run it to help with the ArchiveTeam archiving efforts. It will download sites and upload them to their archive.","enhanced":false,"tile_background":"light","icon":"archiveteamwarrior.png","sha":"fdbec1754e6e539685a54934c98dcc0bdaef4c45"},{"appid":"88dc19bddba6e23ec39f978777b5adc5784ca27a","name":"Argo CD","website":"https://argoproj.github.io/cd/","license":"Apache License 2.0","description":"Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.","enhanced":false,"tile_background":"dark","icon":"argocd.svg","sha":"28a5235ecc1cf2da8d9c0d4cd0a766f773d4a095"},{"appid":"a0f88a6334b03ff11dc56d1b627f122ccacb75ce","name":"AriaNg","website":"https://github.com/mayswind/AriaNg","license":"MIT License","description":"AriaNg is a modern web frontend making aria2 easier to use. AriaNg is written in pure html & javascript, thus it does not need any compilers or runtime environment. You can just put AriaNg in your web server and open it in your browser. AriaNg uses responsive layout, and supports any desktop or mobile devices.","enhanced":true,"tile_background":"dark","icon":"ariang.png","sha":"a423a35f7a5dbcd90e56b1486ef85d02e11be99b"},{"appid":"4950589b19623304e3adb649d9eee6a3bf70c35b","name":"Artifactory","website":"https://jfrog.com/open-source","license":"MIT License","description":"Universal Repository Manager, OSS version","enhanced":true,"tile_background":"light","icon":"artifactory.png","sha":"dc65aa407ae6bda66447ee6ee40ef89657aa6f13"},{"appid":"fa8a2fb9dfd946ec30d5e6b2ee69e24f8a252c5b","name":"Asrock Rack IPMI","website":"https://www.asrockrack.com/support/faq.de.asp?id=28","license":"Commercial","description":"Asrock Rack IPMI is an embedded server management technology by Asrock Rack.","enhanced":false,"tile_background":"light","icon":"asrockrackipmi.png","sha":"2e3620cd17703a6a493e949b345b984bca06acce"},{"appid":"c7ec3e2f2d9be6a4d313d2451184b08ade93ce47","name":"Audiobookshelf","website":"https://audiobookshelf.org","license":"GNU General Public License v3.0 or later","description":"Audiobookshelf is a self-hosted audiobook server for managing and playing your audiobooks.","enhanced":false,"tile_background":"dark","icon":"audiobookshelf.svg","sha":"37ae5da810f7c019d60d3d2008901cd1c6f09447"},{"appid":"e8354374b262e6f1055e7412d11f24a164a50f79","name":"AVM Fritzbox","website":"https://avm.de","license":"GNU General Public License v2.0 only","description":"\"The\" Fritzbox, stylised as FRITZ!Box, is a series of residential gateway devices produced by the German company AVM GmbH. \r\nFRITZ!OS is the FRITZ!Box operating system and can be easily controlled via your browser. User-friendly menus, easy-to-understand wizards, and the optional advanced mode come in handy in all scenarios.","enhanced":false,"tile_background":"light","icon":"avmfritzbox.png","sha":"c1d079cf2a8efd27c3efcaa317d139eb27a889b2"},{"appid":"47bf44c0ec908654f16bacf131107a5aac3ae7b4","name":"AWX","website":"https://github.com/ansible/awx","license":"Apache License 2.0","description":"AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is the upstream project for Tower, a commercial derivative of AWX.","enhanced":true,"tile_background":"dark","icon":"awx.svg","sha":"d1a258a5e36e81f4f8c58ac0e6ada129bd81a942"},{"appid":"808ff47f28ddce2652860f5da59a4c62a7e285dd","name":"Bacula","website":"https://www.bacula.org","license":"GNU Affero General Public License v3.0","description":"Bacula is a set of Open Source, computer programs that permit you (or the system administrator) to manage backup, recovery, and verification of computer data across a network of computers of different kinds.","enhanced":false,"tile_background":"light","icon":"bacula.png","sha":"444af1f259eff81dde46ee3e96eaa211f7488b55"},{"appid":"2577aa56d31c9817a26e412e90d419f70ebc6353","name":"Baïkal","website":"https://sabre.io/baikal","license":"GNU General Public License v3.0 only","description":"Baïkal is a lightweight CalDAV+CardDAV server. It offers an extensive web interface with easy management of users, address books and calendars. It is fast and simple to install and only needs a basic php capable server. The data can be stored in a MySQL or a SQLite database.","enhanced":false,"tile_background":"dark","icon":"baikal.png","sha":"17e0d51b78285019eebc8af2bcef8a363e955371"},{"appid":"c07ac2e365e175d304c1cd409bcfc288ff18594f","name":"Bastillion","website":"https://www.bastillion.io","license":"GNU Affero General Public License v3.0 or later","description":"Bastillion is an open-source web-based SSH console that centrally manages administrative access to systems. A bastion host for administrators with features that promote infrastructure security, including key management and auditing.","enhanced":false,"tile_background":"dark","icon":"bastillion.png","sha":"5bcb1313d7806fedccd86b897089de2692519f23"},{"appid":"085f0b437f9bf9c98bb68b745c8dcf323a7e0499","name":"Bazarr","website":"https://github.com/morpheus65535/bazarr","license":"GNU General Public License v3.0 only","description":"Bazarr is a companion application to Sonarr and Radarr. It manage and download subtitles based on your requirements. You defined your preferences by TV show or movies and Bazarr take care of everything for you.","enhanced":true,"tile_background":"dark","icon":"bazarr.png","config":{"type":"apikey","stat1":{"name":"missing series","url":":url:/api/episodes/wanted?apikey=:apikey:","key":"total","filter":"none","updateOnChange":"No"},"stat2":{"name":"missing movies","url":":url:/api/movies/wanted?apikey=:apikey:","key":"total","filter":"none","updateOnChange":"No"}},"sha":"629a6ac32b435ce546956a3ebd22465f79916587"},{"appid":"8a846dca305866d821748c007cf6b64adf00ea22","name":"Bitwarden","website":"https://bitwarden.com","license":"GNU Affero General Public License v3.0","description":"Open source password management solutions for individuals, teams, and business organizations.","enhanced":false,"tile_background":"dark","icon":"bitwarden.svg","sha":"a9a4b2ac040548c12d6835fa485b974632b08e80"},{"appid":"091d3909d7e0bde850659125a13712c0122a6493","name":"Booksonic","website":"https://booksonic.org","license":"GPL","description":"Booksonic is a server and an app for streaming your audiobooks to any pc or android phone. Most of the functionality is also available on other platforms that have apps for subsonic.","enhanced":false,"tile_background":"dark","icon":"booksonic.png","sha":"a733ed45f1b6a27f5777ccb4a92db538e37a6c77"},{"appid":"348c49dd03dddd418929316668d2e67bf2d9ae88","name":"Bookstack","website":"https://www.bookstackapp.com","license":"MIT License","description":"BookStack is a simple, self-hosted, easy-to-use platform for organising and storing information.","enhanced":true,"tile_background":"dark","icon":"bookstack.svg","sha":"b13dac82761ff81a9914be386db4b5ebdf670d72"},{"appid":"c7d8a6d722a1ec9a16fae165177c418d4fd63175","name":"Box","website":"https://box.com","license":"Commercial","description":"The company focuses on cloud content management and file sharing service for businesses.","enhanced":false,"tile_background":"dark","icon":"box.png","sha":"e47031e999106897c2d692edd5046a7978b2526f"},{"appid":"36cf09d76e7173b82ef23504aae37c05784b0215","name":"Cabot","website":"https://cabotapp.com","license":"MIT License","description":"Self-hosted watchdog for your websites and infrastructure.","enhanced":true,"tile_background":"light","icon":"cabot.png","sha":"19a6c9a4573562afed1b2d0ee0e2b8579303fcf1"},{"appid":"d0404064982ed19f24e76ca261e1fbb4d821c2a6","name":"CalibreWeb","website":"https://github.com/janeczku/calibre-web","license":"GNU General Public License v3.0","description":"Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database.","enhanced":false,"tile_background":"dark","icon":"calibreweb.png","sha":"996efc47ce6252cef853f8f268b29617054f630b"},{"appid":"9f2e2dd8217d1186f9ad484d91e009227efa5897","name":"Cardigann","website":"https://github.com/cardigann/cardigann","license":"MIT License","description":"A proxy server for adding new indexers to Sonarr, SickRage and other media managers","enhanced":false,"tile_background":"light","icon":"cardigann.png","sha":"2c9a74ed5bb336d4788bf4cd5aefc9133e1a6612"},{"appid":"86c6a58798da154166de71097263f9c40804d636","name":"ChangeDetection.io","website":"https://changedetection.io","license":"Apache License 2.0","description":"Self-hosted change monitoring of web pages.\r\n\r\nKnow when web pages change! Stay ontop of new information!\r\n\r\nLive your data-life pro-actively instead of re-actively, do not rely on manipulative social media for consuming important information.","enhanced":false,"tile_background":"dark","icon":"changedetectionio.png","sha":"2c77cfa3e9257b4620a43cbfd046114db0f96971"},{"appid":"c5490738886244f3795807b7cd537fe34df0c274","name":"Channels DVR","website":"https://getchannels.com/dvr/","license":"Commercial","description":"Channels DVR Server runs on your computer or NAS device at home. There's no cloud to worry about. Your recordings and shows will always be available. Simply install Channels DVR Server on a device and Channels will magically see it from any TV or device you own.","enhanced":true,"tile_background":"dark","icon":"channelsdvr.svg","sha":"3d4f9c7634debb614720b0263b5776be355556e5"},{"appid":"ba15c0ff84b20ffe205935dbbf8ffb5f02648632","name":"Check_MK","website":"https://mathias-kettner.de","license":"GNU General Public License v2.0 only","description":"Check_MK is a comprehensive Solution for IT Monitoring of applications, servers, and networks.","enhanced":false,"tile_background":"dark","icon":"checkmk.png","sha":"09a827468e63b53445e5a861ee742a9623555533"},{"appid":"d8a153c2cb84da8b2556b093d1f98659b89d7e26","name":"Chevereto","website":"https://chevereto.com","license":"GNU Affero General Public License v3.0 only","description":"Chevereto Free is a powerful and fast open source image hosting script that allows you to create your very own image hosting website in just minutes.","enhanced":false,"tile_background":"light","icon":"chevereto.png","sha":"df6c5c00977594d018d7121dfcbb417b707c3610"},{"appid":"7799a0f63bdae67145c85519239860c8882f9a64","name":"Chronograf","website":"https://www.influxdata.com/time-series-platform/chronograf","license":"GNU Affero General Public License v3.0 or later","description":"Chronograf is an open-source web application designed to visualize\r\nmonitoring data and create alerting and automation rules.","enhanced":false,"tile_background":"dark","icon":"chronograf.png","sha":"1d13eec1d2f1f734f86a246349639f9665f20eb3"},{"appid":"e4b57a729acdf2e7eefcb9c3022796ed5fdb9aca","name":"Clarkson","website":"https://github.com/linuxserver/Clarkson","license":"MIT License","description":"Clarkson is a web-based dashboard application that gives you a neat and clean interface for logging your fuel fill-ups for all of your vehicles. The application has full multi-user support, as well as multiple vehicles per user. Whenever you fill-up your car or motorcycle, keep the receipt and record the data in Clarkson.","enhanced":false,"tile_background":"light","icon":"clarkson.png","sha":"e91d6d5b32ea9fdae16fc4f621f5e23bd375901f"},{"appid":"6f968228bc1947fee1320a37c5b2429dfdbf8081","name":"Cloud CMD","website":"http://cloudcmd.io","license":"MIT License","description":"Cloud Commander a file manager for the web with console and editor. Will help you manage the server and work with files, directories and programs in browser from any computer, mobile or tablet.","enhanced":false,"tile_background":"dark","icon":"cloudcmd.png","sha":"2281d5bef8c0059db32d057ff250e34f2c4ca193"},{"appid":"f036f579066ad71bd653f5a6418dbede5b500370","name":"Cloudflare","website":"https://dash.cloudflare.com/","license":"Commercial","description":"Cloudflare DNS is an enterprise-grade authoritative DNS service that offers the fastest response time, unparalleled redundancy, and advanced security with built-in DDoS mitigation and DNSSEC.","enhanced":false,"tile_background":"dark","icon":"cloudflare.svg","sha":"96993d1fede196af6b8af1c462746dc1a666daf6"},{"appid":"e4475bc2121ed1ffd1e742c7c2521ca0f16cef93","name":"Cockpit","website":"https://cockpit-project.org","license":"GNU Lesser General Public License v2.1 only","description":"Cockpit is an interactive server admin interface. It is easy to use and very lightweight. Cockpit interacts directly with the operating system from a real Linux session in a browser.","enhanced":false,"tile_background":"dark","icon":"cockpit.png","sha":"184beefebcf4d61bdb0371f89382ff79961e2581"},{"appid":"ca6a902fe117cd57f037f771998f6c6f35f87be2","name":"Cockpit CMS","website":"https://getcockpit.com","license":"MIT License","description":"Cockpit is an open source, self-hosted, headless and api-driven CMS. It's a simple content platform to manage any structured content.","enhanced":false,"tile_background":"light","icon":"cockpitcms.png","sha":"52a0dbb619f8791ffbad26654a1818aa78c31e83"},{"appid":"9eebc5964efd0e6656fe4f143474988bde6c9ef3","name":"Code server","website":"https://github.com/cdr/code-server","license":"MIT License","description":"code-server is VS Code running on a remote server, accessible through the browser.","enhanced":false,"tile_background":"light","icon":"codeserver.png","sha":"e5c48c8b05ceb04b0fb525e90f952fdec18c2273"},{"appid":"2ab436efba9e25585ac0ed6232c92fa57173a4aa","name":"CodiMD","website":"https://codimd.org","license":"GNU Affero General Public License v3.0","description":"CodiMD is a realtime, multi-platform collaborative markdown note editor. This means that you can write notes with other people on your desktop, tablet or even on the phone. You can sign-in via multiple auth providers like Facebook, Twitter, GitHub and many more on the homepage.","enhanced":false,"tile_background":"light","icon":"codimd.png","sha":"be01b11d32d29ffe3bea67521e5f1c62fc24387a"},{"appid":"03959669b24360f78cd9d5f092ac57a80074b3ac","name":"Concourse","website":"https://concourse-ci.org","license":"Apache License 2.0","description":"Concourse is an open-source continuous thing-doer.\r\n\r\nBuilt on the simple mechanics of resources, tasks, and jobs, Concourse presents a general approach to automation that makes it great for CI/CD.","enhanced":false,"tile_background":"light","icon":"concourse.png","sha":"e5760f7299ce8552b5762c1f148d9f3d79b616c8"},{"appid":"cfca44c2f5ed9c775cf5953ef3a3ab86eae6cb8a","name":"Confluence","website":"https://www.atlassian.com/software/confluence","license":"Commercial","description":"A shared workspace tool for documentation, planning and notes with powerful collaboration features and easy-to-use WYSIWYG editing.","enhanced":false,"tile_background":"dark","icon":"confluence.svg","sha":"10f3109e69340d993ea6a3a460f2f661c20430f9"},{"appid":"8629d759d41163a10142fabb192a49dc33d4b959","name":"CouchPotato","website":"https://couchpota.to","license":"GNU General Public License v3.0 only","description":"Download movies automatically, easily and in the best quality as soon as they are released, via usenet or torrents.","enhanced":true,"tile_background":"dark","icon":"couchpotato.svg","sha":"4194751b8642914e32b694b8842ccd63680edb0c"},{"appid":"fef97bae9058a5beeacfc2ec9de3fec9c97969ec","name":"cPanel","website":"https://www.cpanel.net","license":"Proprietary","description":"cPanel & WHM is a suite of tools built for Linux OS that gives you the ability to automate web hosting tasks via a simple graphical user interface. Its goal — to make managing servers easier for you and managing websites easier for your customers.","enhanced":false,"tile_background":"light","icon":"cpanel.png","sha":"f974b1b1db741f4f05dfc8e36843589d2289c699"},{"appid":"3d6a86d0b53584491e13b12173441f0b945307d2","name":"crowdsec","website":"https://crowdsec.net/","license":"MIT License","description":"CrowdSec is a free, modern & collaborative behavior detection engine, coupled with a global IP reputation network. It stacks on fail2ban's philosophy but is IPV6 compatible and 60x faster (Go vs Python), uses Grok patterns to parse logs and YAML scenario to identify behaviors. CrowdSec is engineered for modern Cloud / Containers / VM based infrastructures (by decoupling detection and remediation). Once detected you can remedy threats with various bouncers (firewall block, nginx http 403, Captchas, etc.) while the aggressive IP can be sent to CrowdSec for curation before being shared among all users to further improve everyone's security.","enhanced":false,"tile_background":"dark","icon":"crowdsec.png","sha":"209e20ea98520e9ca605c409aa55444665af8365"},{"appid":"e677af5c4f005d316f3a74b26b0134cfe5288033","name":"CryptPad","website":"https://cryptpad.fr","license":"GNU Affero General Public License v3.0 or later","description":"The Zero Knowledge, Self-Hosted Cloud. CryptPad is a private-by-design alternative to popular office tools and cloud services. All the content stored on CryptPad is encrypted before being sent, which means nobody can access your data unless you give them the keys (not even us).","enhanced":false,"tile_background":"light","icon":"cryptpad.png","sha":"0b97198b8ac242217341c767161cc1bd5f0e7fcf"},{"appid":"ba8ed4dc9e438b22c9456a78a2c09652955be42c","name":"CUPS","website":"https://www.cups.org","license":"GNU General Public License v1.0 or later","description":"The standards-based, open source printing system developed by Apple for iOS®, iPadOS®, and macOS®. CUPS uses IPP Everywhere™ to support printing to local and network printers.","enhanced":false,"tile_background":"light","icon":"cups.svg","sha":"140857323960fe8b9441fc788c59e7c68689db51"},{"appid":"bc28bfa49a73fd2384cbecd6572ea72d0166aa28","name":"Deluge","website":"https://deluge-torrent.org","license":"GNU General Public License v3.0 only","description":"Deluge is a BitTorrent client written in Python. Deluge is cross-platform, using a front and back end architecture where libtorrent, a software library written in C++ which provides the application's networking logic, is connected to one of various front ends through the project's own Python bindings","enhanced":true,"config":{"auth_payload":{"method":"auth.login","id":1,"params":[":password:"]},"type":"apikey","stats":[{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"size","updateOnChange":"Yes","suffix":""},{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}],"stat1":{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"size","updateOnChange":"Yes","suffix":""},"stat2":{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}},"tile_background":"dark","icon":"deluge.svg","sha":"2a1a84b260930e57a39aebfbb68514b1adb06a6c"},{"appid":"3561ed8ae1660eadbe92128eedcff5e6f8e9280e","name":"Dillinger","website":"https://dillinger.io","license":"MIT License","description":"Dillinger is a cloud-enabled, mobile-ready, offline-storage compatible,\r\nAngularJS-powered HTML5 Markdown editor.","enhanced":false,"tile_background":"dark","icon":"dillinger.png","sha":"131ee57b13c4adc9dd4167df468b5a7d9b8ea0c2"},{"appid":"d8f39246e8c87704876f107fc4ca01c962abf53d","name":"DirectAdmin","website":"https://www.directadmin.com/","license":"Proprietary","description":"DirectAdmin is a graphical web-based web hosting control panel allowing administration of websites through a web browser. The software is configurable to enable standalone, reseller, and shared web hosting from a single instance. DirectAdmin also permits management of server tasks and upgrades to package software (such as Apache HTTP Server, PHP, and MySQL ) from within the control panel - simplifying server and hosting configuration.","enhanced":false,"tile_background":"dark","icon":"directadmin.svg","sha":"ff7b09ed7d76f42a1aea7b146c34fefbfcafd653"},{"appid":"12764b8bb7cd332f7d4937851a2af2815df706ac","name":"Directus","website":"https://directus.io","license":"GNU General Public License v3.0 only","description":"Directus is a future-proof, open source, headless CMS to manage all your content in one place. It's elegant and easy user interface will enable you to craft powerfull content backend APIs in minutes.","enhanced":false,"tile_background":"dark","icon":"directus.png","sha":"5f0487aca7013f6bcdf7fa4f2d99f4b3e1f13467"},{"appid":"a17f1a47dbc391814d321ae33ad51c0c7695a08d","name":"DokuWiki","website":"https://www.dokuwiki.org","license":"GNU General Public License v2.0 only","description":"DokuWiki is a simple to use and highly versatile Open Source wiki software that doesn't require a database.","enhanced":false,"tile_background":"dark","icon":"dokuwiki.png","sha":"325ab1e56632d330a704fc233131fb625add772f"},{"appid":"17ea5305bc5cb99da61e121542864bb15e280f30","name":"Domoticz","website":"https://www.domoticz.com","license":"GNU General Public License v3.0 only","description":"Open source Home Automation System","enhanced":true,"tile_background":"dark","icon":"domoticz.png","sha":"cf93be1899c156da5db274b1ff5c1710814daf62"},{"appid":"45468267c4cf4e7260419a2a7c24bab37dc5cbe9","name":"Double Commander","website":"https://doublecmd.sourceforge.io/","license":"GNU General Public License v2.0 or later","description":"Double Commander is a free cross platform open source file manager with two panels side by side. It is inspired by Total Commander and features some new ideas.","enhanced":false,"tile_background":"dark","icon":"doublecommander.svg","sha":"abd0fce81a51ef633f4a0847e51f0f048a32a191"},{"appid":"176d99d897dbd7c02b1a1db4142054f74a76aa47","name":"Dozzle","website":"https://dozzle.dev","license":"MIT License","description":"Dozzle is a real-time log viewer for docker containers.","enhanced":false,"tile_background":"dark","icon":"dozzle.png","sha":"9800017426acaaeddab141f23030743cc0a5258c"},{"appid":"1430fd26ed07651f08ab03098c8e6745701abf6a","name":"Drone","website":"https://github.com/drone/drone","license":"Apache License 2.0","description":"Drone is a Continuous Delivery system built on container technology. Drone uses a simple YAML configuration file, a superset of docker-compose, to define and execute Pipelines inside Docker containers.","enhanced":false,"tile_background":"light","icon":"drone.scg","sha":"b5ef54b3f8b0d3ac7633171a410cbd6767aed1a2"},{"appid":"ff96f6956d6ce73ca564a5843157a9849a8f1c58","name":"Droppy","website":"https://github.com/silverwind/droppy","license":"BSD Source Code Attribution","description":"droppy is a self-hosted file storage server with a web interface and capabilities to edit files and view media directly in the browser. It is particularly well-suited to be run on low-end hardware like the Raspberry Pi.","enhanced":false,"tile_background":"light","icon":"droppy.png","sha":"0836ce4252debe16e1a647417ec1f8e4ac93384e"},{"appid":"311aa8b0218a2cac6b81d9ed1bb7814531fbeb03","name":"Duet Web Control","website":"www.duet3d.com","license":"GNU General Public License v3.0 or later","description":"Duet3D is a manufacturer and maintainer of 3D and CNC control boards and firmware (RepRap Firmware). Their boards can be controlled via a lightweight web UI called Duet Web Control (DWC).","enhanced":true,"tile_background":"light","icon":"duetwebcontrol.png","sha":"ba6c435d21c3056e182510bb553d5a85fed95882"},{"appid":"9a5f55cd744dbbcb8b1cffdd748605565da9edce","name":"Duplicacy","website":"https://duplicacy.com","license":"Commercial","description":"Duplicacy is a new generation cross-platform cloud backup tool. Duplicacy backs up your files to many cloud storage locations with compression, client-side encryption, and the highest level of deduplication.\r\nFeature-Driven Design:\r\nIncremental backup - Only back up what has been changed\r\nFull snapshot - Although each backup is incremental, it must behave like a full snapshot for easy restore and deletion\r\nDeduplication - Identical files must be stored as one copy (file-level deduplication), and identical parts from different files must be stored as one copy (block-level deduplication)\r\nEncryption -Encrypt not only file contents but also file paths, sizes, times, etc.\r\nDeletion - Every backup can be deleted independently without affecting others\r\nConcurrent backup - Multiple clients can back up to the same storage at the same time\r\nBackup migration - All or selected backups can be migrated from one storage to another","enhanced":false,"tile_background":"dark","icon":"duplicacy.png","sha":"1964adbed8bdf8105f53cbf27cc147cd235d3a58"},{"appid":"bc99430645db7c79e2901d65598bb8cf91f77b4e","name":"Duplicati","website":"https://www.duplicati.com","license":"GNU Lesser General Public License v2.1 only","description":"Free backup software to store backups online with strong encryption. Works with FTP, SSH, WebDAV, OneDrive, Amazon S3, Google Drive and many others.","enhanced":false,"tile_background":"dark","icon":"duplicati.png","sha":"0285315ec1f0a9b1c6d6dcf323e0129ca29cb3f3"},{"appid":"dece05484839df110745b0a800297c33cc078287","name":"Element","website":"https://element.io","license":"Apache License 2.0","description":"All-in-one secure chat app for teams, friends and organisations. Keeps conversations in your control, safe from data-mining and ads. Talk to everyone through the open global Matrix network, protected by proper end-to-end encryption.","enhanced":false,"tile_background":"dark","icon":"element.png","sha":"f8084e68f953e895e2498e0abc69737fabc7d519"},{"appid":"3021fea57e9b932f14822d47e47d163f47812ef1","name":"Emby","website":"https://emby.media","license":"Proprietary","description":"Emby (formerly Media Browser) is a media server designed to organize, play, and stream audio and video to a variety of devices.","enhanced":true,"tile_background":"dark","icon":"emby.png","config":{"type":"apikey","stat1":{"name":"Movies","url":":url:emby/Items/Counts?api_key=:apikey:","key":"MovieCount","filter":"none","updateOnChange":"No","suffix":""},"stat2":{"name":"Series","url":":url:emby/Items/Counts?api_key=:apikey:","key":"SeriesCount","filter":"none","updateOnChange":"No","suffix":""}},"sha":"ba81a86c6785c1cde062accca0d578a213bb8b96"},{"appid":"226df5bc61e5f2e107911be546e20ef7f1397e07","name":"EmbyStat","website":"https://github.com/mregni/EmbyStat","license":"MIT License","description":"Multiplatform statistics server for Emby server.","enhanced":false,"tile_background":"dark","icon":"embystat.png","sha":"26888a7c1801cd8d2a96047e1467a1469059e34e"},{"appid":"6b1df10bbb1575fb941f402500ccb516ac34b542","name":"ESPHome","website":"https://esphome.io","license":"MIT License","description":"ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems.","enhanced":false,"tile_background":"light","icon":"esphome.png","sha":"ba56414796bc93208f2a09abdad3d2598d92c6ec"},{"appid":"601c9ad5341b0ba351540520eabd0a6cb1526a86","name":"FileBot","website":"https://www.filebot.net","license":"Commercial","description":"FileBot is the ultimate tool for renaming and organizing your movies, TV shows and Anime. Match and rename media files against online databases, download artwork and cover images, fetch subtitles, write metadata, and more, all at once in matter of seconds. It's smart and just works.","enhanced":false,"tile_background":"dark","icon":"filebot.svg","sha":"004b4406a588a48892f5bf40618afb1d548b1072"},{"appid":"ba05dd8e070851895ee6184eb9778cfa0753a490","name":"FileBrowser","website":"https://github.com/filebrowser/filebrowser","license":"Apache License 2.0","description":"filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app or as a middleware.","enhanced":false,"tile_background":"dark","icon":"filebrowser.svg","sha":"2eaa3fac0afd68f027a457e37ee2297655eaa0e9"},{"appid":"a3440558df5c42ea2fdaf402aa9624d5ee586515","name":"FileFlows","website":"https://fileflows.com","license":"Freemium","description":"Application that processes files using Flow based rules. Primarily designed to convert video files to specific formats automatically","enhanced":true,"tile_background":"dark","icon":"fileflows.png","sha":"4f6d5b4d5d949550e405ffb2e82d28b54733e0b3"},{"appid":"b8fa84fbe86d39557144410d201d466c53cb0c4e","name":"FileRun","website":"https://filerun.com","license":"Commercial","description":"FileRun is a self-hosted Google Drive alternative. It is a full featured web based file manager with an easy to use user interface. It is great for managing your photo, movie, audio collection, or sharing files with your family and friends.","enhanced":false,"tile_background":"light","icon":"filerun.svg","sha":"ed8214e85e90b50c5f556d7562f83e0ef24117e8"},{"appid":"f798d73306e6c7b7145b163baf11d88f43c91527","name":"Firefly 3","website":"https://www.firefly-iii.org","license":"GNU General Public License v3.0 only","description":"\"Firefly III\" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. It can import data from external sources and it has many neat financial reports available. (Taken from the README)","enhanced":false,"tile_background":"light","icon":"firefly.png","sha":"b0eeb59e2f11a088544ac96545b6b3fe12064af6"},{"appid":"675e42556cab1552e279e17a1f2a363e334fd2f0","name":"Firefox Send","website":"https://send.firefox.com","license":"Mozilla Public License 2.0","description":"Firefox Send lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever.","enhanced":false,"tile_background":"light","icon":"firefoxsend.png","sha":"431ce25963b10f0e3bd73012168226013906c58c"},{"appid":"bbe5a51792acf2e90900e10d33bb02a86a50b6ff","name":"FlexGet","website":"https://www.flexget.com","license":"MIT License","description":"like sonarr and radarr etc. combined, but with integrations to trakt.tv etc. Actually very capable","enhanced":false,"tile_background":"dark","icon":"flexget.png","sha":"90c66894d2e780ca165fe228fb0a4c3ab07d46fd"},{"appid":"ff0db992256ad5c44c979bf4be0234a919eccdc7","name":"Flood","website":"https://github.com/jfurrow/flood","license":"GNU General Public License v3.0 only","description":"A web UI for rTorrent with a Node.js backend and React frontend.","enhanced":false,"tile_background":"light","icon":"flood.png","sha":"e463605e3516f1e13ec4272d6f960313038b921d"},{"appid":"0619bf7cc62aeb10ccbf7566912d4d44bb42e7a5","name":"Focalboard","website":"https://www.focalboard.com","license":"Apache License 2.0","description":"Focalboard is an open source, self-hosted alternative to Trello, Notion, and Asana.\r\nIt's a project management tool that helps define, organize, track and manage work across teams, using a familiar kanban board view.","enhanced":false,"tile_background":"light","icon":"focalboard.svg","sha":"67dee2ee0b6e8be5fd8cdfb8b486faf8e31d432b"},{"appid":"d4f480701f176a366bb9175ce282f80d18da5122","name":"Folding@Home","website":"https://foldingathome.org","license":"Proprietary","description":"Folding@home is a project focused on disease research. The problems we’re solving require so many computer calcul­ations – and we need your help to find the cures!\r\nAccess the your F@H webUI directly from Heimdall.","enhanced":true,"tile_background":"dark","icon":"foldingathome.svg","sha":"5f1328ff578229a174ec28b0e47c1dc977af4565"},{"appid":"4179f0ec44f292021561f0ef872892aaf604f670","name":"Fortinet FortiMonitor","website":"https://fortimonitor.forticloud.com","license":"Commercial","description":"FortiMonitor helps organizations modernize their performance-monitoring tools into a comprehensive digital experience monitoring platform to gain end-to-end visibility into the overall user experience. It doesn’t matter where the user resides or where the application is hosted.","enhanced":true,"tile_background":"light","icon":"fortinetfortimonitor.png","sha":"7bcbb7f4eb3723d41e44766057fb5e73070efe52"},{"appid":"3d258071fa9cd41a85627f6bf7fc6998c3a8f5cf","name":"Freenas","website":"https://www.freenas.org","license":"BSD-2-Clause","description":"FreeNAS is an embedded open source network-attached storage (NAS) operating system based on FreeBSD.","enhanced":true,"tile_background":"light","icon":"freenas.png","sha":"032a6492a510b56a424661e604375731e7c2537b"},{"appid":"370f94c68bf709289a0193e0a5c83c6fbd1ac06e","name":"FreePBX","website":"https://www.freepbx.org/","license":"GNU General Public License v1.0 or later","description":"FreePBX is an open source community\r\nCompletely free to download and use, the power of FreePBX comes from a global community of developers who ensure it remains a high compatibility and customizable platform with all the key features needed to build a scalable business phone system on any budget.\r\n\r\nWith millions of installations worldwide and a very active development base, the FreePBX community continues to out-perform the telecom industry’s commercial efforts.","enhanced":false,"tile_background":"light","icon":"freepbx.png","sha":"9b65ecd4a6cccecffec7f41ce583886c5248e774"},{"appid":"5c68de7acdaff4da4f680545bb51a847840c81da","name":"FreshRSS","website":"https://freshrss.org","license":"GNU Affero General Public License v3.0","description":"FreshRSS is a self-hosted RSS feed aggregator. It is lightweight, easy to work with, powerful and customizable.","enhanced":true,"tile_background":"dark","icon":"freshrss.svg","sha":"a95ed9dec8302beead030ecb9c1a726ce866a643"},{"appid":"d27d8db484c3e734262730b0673f158f1f88924d","name":"Frigate","website":"https://frigate.video/","license":"MIT License","description":"Frigate is an open source NVR built around real-time AI object detection. All processing is performed locally on your own hardware, and your camera feeds never leave your home.","enhanced":false,"tile_background":"light","icon":"frigate.svg","sha":"91accf6d9868f661a1258c07a73bbb00801437a7"},{"appid":"36211c66ecd5984827673c89373ae184f06c000f","name":"Fronius","website":"https://www.fronius.com","license":"MIT License","description":"This app allows to monitor the electrical production of the photovoltaic panels connected to a Fronius inverter.\r\n\r\nThe enhanced app connects to the inverter API and shows the current production of the system, as well as the daily production.","enhanced":true,"tile_background":"dark","icon":"fronius.svg","sha":"852cf67b69fc4279c3a7cd9a209bf875f232d4fa"},{"appid":"7853f58e7245aa624ddec1f97d7b4c18ac0047c7","name":"Funkwhale","website":"https://funkwhale.audio","license":"GNU Affero General Public License v3.0 only","description":"Funkwhale is a community-driven project that lets you listen and share music and audio within a decentralized, open network.","enhanced":false,"tile_background":"light","icon":"funkwhale.svg","sha":"cc9856964dbc4de99ca18c7a739beb568ee91b6b"},{"appid":"c4745785181de931cfd5bd79294cb1687d82aea9","name":"Ghost","website":"https://ghost.org","license":"MIT License","description":"Fiercely independent, professional publishing. A fully open source, powerful platform for building and running modern publications, we power serious blogs, magazines and journalism from DuckDuckGo to OpenAI & Sky News.","enhanced":true,"tile_background":"light","icon":"ghost.png","sha":"2acef3cad62bb1ac41d40c5516fbdf55b6764f67"},{"appid":"060b3b99f88e96085b4a68e095bc9e3d1d91e1bc","name":"Gitea","website":"https://gitea.io","license":"MIT License","description":"Gitea is a community managed fork of Gogs, lightweight code hosting solution written in Go and published under the MIT license.","enhanced":false,"tile_background":"dark","icon":"gitea.svg","sha":"4e0acbd5052dfafc1fe77ea07850cc724c9ecd8b"},{"appid":"64b2b6d12bfe4baae7dad3d018f8cbf6b0e7a044","name":"GitHub","website":"https://github.com","license":"MIT License","description":"GitHub brings together the world's largest community of developers to discover, share, and build better software.","enhanced":false,"tile_background":"light","icon":"github.svg","sha":"817713ecc57d4e3c0e77e367ffd7257f431704b2"},{"appid":"322f31631de66bcf71bd6c199b41606d516fe3f9","name":"GitLab","website":"https://gitlab.com","license":"MIT License","description":"From project planning and source code management to CI/CD and monitoring, GitLab is a single application for the entire DevOps lifecycle.","enhanced":true,"tile_background":"dark","icon":"gitlab.svg","sha":"004f9ce4ddb9e5070d9063ba16bdf624f960dfe4"},{"appid":"8acd9f66ec707deda1345479909166aa1c31bdad","name":"Glances","website":"https://nicolargo.github.io/glances","license":"GNU Lesser General Public License v3.0 only","description":"Glances is a cross-platform monitoring tool which aims to present a large amount of monitoring information through a curses or Web based interface.","enhanced":false,"tile_background":"dark","icon":"glances.png","sha":"adbf7553b26f3fd1fdb5ac573a2e21dc2684f35f"},{"appid":"df505c6582933deef50ad5181747782f1f514713","name":"Gogs","website":"https://gogs.io","license":"MIT License","description":"A painless self-hosted Git service.","enhanced":false,"tile_background":"dark","icon":"gogs.png","sha":"8ea8f0ff8c602cd01c19ab283d9f17bb94dfaeae"},{"appid":"b3fdc0b49deb0e7db32311b64867b000409193e5","name":"Gotify","website":"https://gotify.net","license":"MIT License","description":"A self-hosted push notification service.","enhanced":false,"tile_background":"dark","icon":"gotify.png","sha":"a58c6ffde4c3fedaeecfa36e70b77e3ca21ad2e9"},{"appid":"f519bce8b0ae84d8dbbc0a793bf6a180043be855","name":"Grafana","website":"https://grafana.com","license":"Apache License 2.0","description":"Data visualization & Monitoring with support for Graphite, InfluxDB, Prometheus, Elasticsearch and many more databases.","enhanced":false,"tile_background":"dark","icon":"grafana.svg","sha":"0ded06b7ec25dded55ce20a2cbdbfc4e497caa3d"},{"appid":"b1577ad1f7e68c2190f8c68885f945c855b0d5ea","name":"Grav","website":"https://getgrav.org","license":"MIT License","description":"Grav is a Fast, Simple, and Flexible, file-based Web-platform. There is Zero installation required. Just extract the ZIP archive, and you are already up and running. It follows similar principles to other flat-file CMS platforms, but has a different design philosophy than most. Grav comes with a powerful Package Management System to allow for simple installation and upgrading of plugins and themes, as well as simple updating of Grav itself.","enhanced":false,"tile_background":"light","icon":"grav.png","sha":"97daed7eae5edd60d8e13d398af346d3adf29be5"},{"appid":"6d88bccf40bf65b911fe79d78c7af98e382f0c1a","name":"Graylog","website":"https://www.graylog.org","license":"GNU General Public License v3.0 only","description":"Finally, all your log data available and accessible in one central location. Graylog is an open source log management platform.","enhanced":false,"tile_background":"dark","icon":"graylog.svg","sha":"ad01c15c1c4f646f20ffcb679c5da5617d41c3e0"},{"appid":"c1292685cddb9472cece8e457c31fbf6446d5010","name":"Grocy","website":"https://grocy.info","license":"MIT License","description":"grocy is a web-based self-hosted groceries & household management solution for your home.","enhanced":false,"tile_background":"light","icon":"grocy.svg","sha":"9ba570739551bff2f1af0d55a301a6cd345c19a2"},{"appid":"1c772e7ff575c76274b2ab9f90d82b428029b50b","name":"Guacamole","website":"https://guacamole.apache.org","license":"Apache License 2.0","description":"Apache Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC, RDP, and SSH.","enhanced":false,"tile_background":"dark","icon":"guacamole.png","sha":"077e3e77afaf9956dbfec256d3d5e14ca438aaa6"},{"appid":"b96c7f74fe817b3fb2ea26bfefbf26efaffe6dea","name":"Handbrake","website":"https://handbrake.fr","license":"GNU General Public License v2.0 or later","description":"HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs.\r\n\r\nThe GUI of the application is accessed through a modern web browser (no installation or configuration needed on client side) or via any VNC client.\r\n\r\nA fully automated mode is also available: drop files into a watch folder and let HandBrake process them without any user interaction.","enhanced":false,"tile_background":"dark","icon":"handbrake.png","sha":"4084914326b38e0effe022d294e502ef993325c3"},{"appid":"b6ac1c3e3b1f6f4296faceeb0eaeda83d1f578a4","name":"HAProxy","website":"http://www.haproxy.org","license":"GNU General Public License v3.0 or later","description":"HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for very high traffic web sites and powers quite a number of the world's most visited ones. Over the years it has become the de-facto standard opensource load balancer, is now shipped with most mainstream Linux distributions, and is often deployed by default in cloud platforms.","enhanced":false,"tile_background":"dark","icon":"haproxy.png","sha":"75facd36f3eae9a2cd335798a273e5175b435254"},{"appid":"e347660d52d87798674d406f8c820aa07835b0be","name":"Harbor","website":"https://goharbor.io","license":"Apache License 2.0","description":"Harbor is an open source registry that secures artifacts with policies and role-based access control, ensures images are scanned and free from vulnerabilities, and signs images as trusted. Harbor, a CNCF Graduated project, delivers compliance, performance, and interoperability to help you consistently and securely manage artifacts across cloud native compute platforms like Kubernetes and Docker.","enhanced":false,"tile_background":"dark","icon":"harbor.svg","sha":"dea1371940937f6319b609b9a99f78396b494779"},{"appid":"241e4d951466ee4a38bde6aa73f7c8f0fab3a3f2","name":"Hasura","website":"https://hasura.io","license":"Apache License 2.0","description":"Instantly make your data accessible over GraphQL.","enhanced":false,"tile_background":"light","icon":"hasura.svg","sha":"c76d42e9c5fe15632ede76d47aca70c15a9e066c"},{"appid":"8fe021dbb159e76695ab080421f68fac90579b0c","name":"HDHomeRun","website":"https://www.silicondust.com","license":"Proprietary","description":"The DVR reimagined. Watch and Record all of your favorite live TV. Your way.","enhanced":true,"tile_background":"dark","icon":"hdhomerun.png","sha":"acbd07e1e441494173ba28c3542cba6849f62298"},{"appid":"355bf1cb47b9ff34cad71db2350056dfb2794c68","name":"Headphones","website":"https://github.com/rembo10/headphones","license":"GNU General Public License v3.0 only","description":"Headphones is an automated music downloader for NZB and Torrent, written in Python. It supports SABnzbd, NZBget, Transmission, µTorrent, Deluge and Blackhole.","enhanced":false,"tile_background":"dark","icon":"headphones.png","sha":"582e13916fc8a8679f495b8907f3446272033c85"},{"appid":"2d97a1f26a2c0647566d6e0a1779a024607f9f1d","name":"Healthchecks","website":"https://healthchecks.io","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Instant alerts when your cron jobs fail silently.","enhanced":false,"tile_background":"light","icon":"healthchecks.png","sha":"7c2ee2c67a12279d0febe4a7a5c3978648d7c2c2"},{"appid":"5c81a4f5ee23ebffa0724a22a040c54e6cb9d7c5","name":"HomeAssistant","website":"https://www.home-assistant.io","license":"Apache License 2.0","description":"Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.","enhanced":true,"tile_background":"dark","icon":"homeassistant.svg","sha":"675b0335cce85338110af6945426b49b9c8a7b25"},{"appid":"7d9fd30322f354d733c7c3b1b395f1655d12beb0","name":"Homebridge","website":"https://homebridge.io","license":"Apache License 2.0","description":"Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of \"smart home\" devices.\r\n\r\nSince Siri supports devices added through HomeKit, this means that with Homebridge you can ask Siri to control devices that don't have any support for HomeKit at all.","enhanced":true,"tile_background":"dark","icon":"homebridge.svg","sha":"9417a0057cc0a604d8e9b42a41084e375ffb8640"},{"appid":"8a30fca9ea5b46722cbdad24c7470a442718cac8","name":"Homer","website":"https://github.com/bastienwirtz/homer","license":"Apache License 2.0","description":"A very simple static homepage for your server.","enhanced":false,"tile_background":"dark","icon":"homer.svg","sha":"2a77b6d5677287347f99ef100aa18a9723c74242"},{"appid":"e79bac4ca442f484164741d7d41ea4e2426b308e","name":"Hubitat","website":"https://hubitat.com","license":"Proprietary","description":"Hubitat is a home automation platform supporting z-wave, zigbee, and many other devices. It offers local administration and remote access.","enhanced":false,"tile_background":"dark","icon":"hubitat.png","sha":"0e43dcf55b1ba3ca89a523e78690227df3bdc151"},{"appid":"2403e3c8c1da513b11a77bf482cd494658695d05","name":"Huginn","website":"https://github.com/huginn/huginn","license":"MIT License","description":"Huginn is a system for building agents that perform automated tasks for you online. They can read the web, watch for events, and take actions on your behalf. Huginn's Agents create and consume events, propagating them along a directed graph. Think of it as a hackable version of IFTTT or Zapier on your own server.","enhanced":false,"tile_background":"dark","icon":"huginn.png","sha":"60537d393311925dc088ff14a7e12d896dbb043d"},{"appid":"13a2a3d6e668c91b77ccc436162118ce7568ee4e","name":"Icecast","website":"https://icecast.org","license":"GNU General Public License v2.0 only","description":"Icecast is a streaming media (audio/video) server which currently supports Ogg (Vorbis and Theora), Opus, WebM and MP3 streams.\r\nIt can be used to create an Internet radio station or a privately running jukebox and many things in between. It is very versatile in that new formats can be added relatively easily and supports open standards for communication and interaction.","enhanced":false,"tile_background":"dark","icon":"icecast.png","sha":"2defbd71c01db85bbf29f757358731c5c5cb8190"},{"appid":"d483256e2837a012106afa135d3e4ba1a03c8ddb","name":"Icinga Web","website":"https://icinga.com","license":"GNU General Public License v2.0 only","description":"Icinga Web 2 is a powerful PHP framework for web applications that comes in a clean and reduced design. It’s fast, responsive, accessible and easily extensible with modules.","enhanced":false,"tile_background":"light","icon":"icingaweb.svg","sha":"1e82d625e9362f082712e5e2089a989e4fe122b2"},{"appid":"2fa965004249898edbbd6030adfdb0ead5bc5f7c","name":"iDRAC","website":"https://dell.com","license":"Proprietary","description":"The Dell Remote Access Controller or DRAC is an out-of-band management platform on Dell servers.","enhanced":false,"tile_background":"dark","icon":"idrac.png","sha":"cdd4fadcfc260e21375e1768b668a04922f10314"},{"appid":"ef49854fbbea334dbaf393d4b4ad9381cb931e91","name":"iLO","website":"https://www.hpe.com/us/en/servers/integrated-lights-out-ilo.html","license":"Proprietary","description":"HP Integrated Lights-Out, is an embedded server management technology by Hewlett-Packard ","enhanced":false,"tile_background":"light","icon":"ilo.svg","sha":"fee4d92c0ad3877601865c97617f06ce06348ca8"},{"appid":"5e1e914cba38acaa83d4e39139dadbec478fbb6e","name":"InfluxDB","website":"https://www.influxdata.com/products/influxdb","license":"MIT License","description":"InfluxDB is an open source time series platform. This includes APIs for storing and querying data, processing it in the background for ETL or monitoring and alerting purposes, user dashboards, and visualizing and exploring the data and more.","enhanced":false,"tile_background":"dark","icon":"influxdb.svg","sha":"ce520a99aae18eeef01fa69ec973f3426fdd6fb4"},{"appid":"c112604b5b33659f85dda854ac8bc271cb744b8a","name":"Infoblox","website":"https://infoblox.com","license":"Commercial","description":"The company focuses on managing and identifying devices connected to networks—specifically for the Domain Name System, Dynamic Host Configuration Protocol, and IP address management","enhanced":false,"tile_background":"dark","icon":"infoblox.svg","sha":"019789951d8c069fdfc10def6327dfd7b8affd9c"},{"appid":"44aae3efe784b1886f020103d8344287be143c58","name":"Invidious","website":"https://github.com/omarroth/invidious","license":"Apache License 2.0","description":"Self-hosted, Open Source YouTube Alternative","enhanced":false,"tile_background":"light","icon":"invidious.svg","sha":"06fc449b0e1b5fb2abba7d0312d0fe3d969d1c7d"},{"appid":"f4a9130aed175372c50f1b36cbc740193aed5fdf","name":"Invoice Ninja","website":"https://www.invoiceninja.com","license":"Attribution Assurance License","description":"A feature-rich, easy to use, open source invoicing suite. You can use the hosted service or host it yourself.","enhanced":false,"tile_background":"dark","icon":"invoiceninja.png","sha":"e873e0053cbcb42a29089913eeca31ca9dafe1ec"},{"appid":"e3e34703718888700cefb3c28a0e52cb6a903ff0","name":"ioBroker","website":"https://www.iobroker.net","license":"MIT License","description":"ioBroker is an integration platform for the Internet of Things, focused on Building Automation, Smart Metering, Ambient Assisted Living, Process Automation, Visualization and Data Logging","enhanced":false,"tile_background":"light","icon":"iobroker.png","sha":"879409c00d30697f9fec84c18be1791cfb0481ca"},{"appid":"9d24b65315557ddd848ba44b09191a6ab305966f","name":"Jackett","website":"https://github.com/Jackett/Jackett","license":"GNU General Public License v2.0 only","description":"Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software.","enhanced":false,"tile_background":"light","icon":"jackett.svg","sha":"2a67b77a932b7b148f9374a90d2680eb98930e38"},{"appid":"917883dc82d936304725edacb6bf11e5cf537be6","name":"Jaeger","website":"https://www.jaegertracing.io","license":"Apache License 2.0","description":"Jaeger is a distributed tracing platform, which can be used for monitoring microservices-based distributed systems.","enhanced":true,"tile_background":"light","icon":"jaeger.svg","sha":"9301835a4f6042fb9d21520d83571063fbd87a0e"},{"appid":"af7b37e2841d9150f6abd5a936b32a1f681d6bda","name":"JDownloader","website":"http://jdownloader.org","license":"Creative Commons Attribution Non Commercial Share Alike 2.0 Generic","description":"JDownloader is a free, open-source download management tool with a huge community of developers that makes downloading as easy and fast as it should be.","enhanced":false,"tile_background":"dark","icon":"jdownloader.png","sha":"ba243f0e1eaafd24bcf96ef7bc2313a2a90a0881"},{"appid":"5c64032d583b4cf000188a68c373d41b8e1b34c1","name":"Jeedom","website":"https://www.jeedom.com/site/fr","license":"Open Source","description":"Open source Home Automation System","enhanced":false,"tile_background":"light","icon":"jeedom.png","sha":"6b70d229d34be309d2b449fbd276a2a3b7012673"},{"appid":"3e0a7f109bd760b9474c78cb652e8c3e82669226","name":"Jellyfin","website":"https://jellyfin.github.io","license":"GNU General Public License v2.0 only","description":"Jellyfin is the Free Software Media System that puts you in control of managing and streaming your media. There are no strings attached, no premium licenses or features, and no hidden agendas.","enhanced":true,"tile_background":"dark","icon":"jellyfin.svg","sha":"c10108461833eed734cfee94e52dc6d54e6031ee"},{"appid":"d95b56ce41a2e1ac4cecdd398defd7414407cc08","name":"Jenkins","website":"https://jenkins.io","license":"MIT License","description":"Jenkins is an open source automation server with an unparalleled plugin ecosystem to support practically every tool as part of your delivery pipelines.","enhanced":true,"tile_background":"light","icon":"jenkins.svg","sha":"365378881ae0247f303f6604cf2ff7cb78cdea2e"},{"appid":"3fb76ec47a9913f61e1bba0337af66ff0c59cc74","name":"Jira","website":"https://www.atlassian.com/software/jira","license":"Commercial","description":"A bug tracking and agile project management software with powerful collaboration features and easy-to-use WYSIWYG editing","enhanced":false,"tile_background":"light","icon":"jira.svg","sha":"d9da770ac1f33f724ba05aae37746efc4ac7c713"},{"appid":"5640232c98c04a627fbdcc1cb26cd34a4a0088bc","name":"Jitsi","website":"https://jitsi.org","license":"Apache License 2.0","description":"Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application.","enhanced":false,"tile_background":"light","icon":"jitsi.png","sha":"75816d65831f2c14c32b44a72e9baef4910b284f"},{"appid":"1f87fdb388c8208f77da09b7507b59635fb7ddcb","name":"Joomla","website":"https://www.joomla.org","license":"GNU General Public License v2.0 or later","description":"Joomla! is the mobile-ready and user-friendly way to build your website.","enhanced":false,"tile_background":"light","icon":"joomla.png","sha":"4636bd3cb480d60cc28f53b2ba268fe20822f1cc"},{"appid":"7d93500c86ae587b3d9f4bf1b8cec36f221c8183","name":"Jupyter","website":"https://jupyter.org","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Open source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text.","enhanced":false,"tile_background":"light","icon":"jupyter.svg","sha":"aa70e1d349eb469d945794bd6e25d8bf6644e71e"},{"appid":"43036744dd731a810155d82144c286cae5cb8ca3","name":"Kanboard","website":"https://kanboard.org","license":"MIT License","description":"Kanboard is a free and open source Kanban project management software.","enhanced":false,"tile_background":"light","icon":"kanboard.png","sha":"83d720e7d99de58a2cb4b633ebb14496b5114dfa"},{"appid":"d1081e351fbebe0deb0c2867d5f731c8f9cc3fd8","name":"Keycloak","website":"https://www.keycloak.org","license":"Apache License 2.0","description":"Open Source Identity and Access Management.","enhanced":false,"tile_background":"dark","icon":"keycloak.svg","sha":"e7d76d2ca239bbc3d5ec91681443d69ad8ff36fd"},{"appid":"80d4015f1f71198cb285a89daf9796ebde0b5c29","name":"Kibana","website":"https://www.elastic.co/products/kibana","license":"Apache License 2.0","description":"Kibana lets you visualise your Elasticsearch data and navigate the Elastic Stack.","enhanced":false,"tile_background":"light","icon":"kibana.png","sha":"fa7a560ed9da30f833f27fd260f006695662ffff"},{"appid":"e928abf116d933773b1e4e31445213f1f1b01609","name":"Kimai","website":"https://www.kimai.org","license":"GNU General Public License v3.0 only","description":"Kimai is a free open source timetracker. It tracks work time and prints out a summary of your activities on demand. Yearly, monthly, daily, by customer, by project, by action …","enhanced":false,"tile_background":"dark","icon":"kimai.png","sha":"1ef6a2cc946b96c15f4cdb5956bb5fb61c25491b"},{"appid":"dcd2c1d3cbc33b14e439da0d94c1451e70d7536e","name":"Kitana","website":"https://github.com/pannal/Kitana","license":"MIT License","description":"Kitana exposes your Plex plugin interfaces \"to the outside world\". It does that by authenticating against Plex.TV, then connecting to the Plex Media Server you tell it to, and essentially proxying the plugin UI. It has full PMS connection awareness and allows you to connect locally, remotely, or even via relay.","enhanced":false,"tile_background":"light","icon":"kitana.png","sha":"ead52807e4fc718eeab4da9d3ae334b0201deba5"},{"appid":"8ac539a79155a0032834264ac3f6dbd38f1c812d","name":"Kodi","website":"https://kodi.tv","license":"GNU General Public License v1.0 or later","description":"Kodi (formerly known as XBMC) is an award-winning free and open source (GPL) software media player and entertainment hub that can be installed on Linux, OSX, Windows, iOS and Android, featuring a 10-foot user interface for use with televisions and remote controls.","enhanced":true,"tile_background":"dark","icon":"kodi.svg","sha":"bf6a49cc189bfe4de0a6de3e965775f30272d5f9"},{"appid":"6cd97a5fefab651371f821cb5167733112fbc536","name":"Komga","website":"https://komga.org","license":"MIT License","description":"Komga is a free and open source comics/mangas server.","enhanced":true,"tile_background":"dark","icon":"komga.svg","sha":"b16820cd0cdbcfe53df953861c200713143a65dc"},{"appid":"22b161d97fbf69f88c548fa1dc938f0840abfd58","name":"Kopia","website":"https://kopia.io","license":"Apache License 2.0","description":"Kopia is a simple, cross-platform tool for managing encrypted backups in the cloud. It provides fast, incremental backups, secure, client-side end-to-end encryption, compression and data deduplication.","enhanced":false,"tile_background":"light","icon":"kopia.png","sha":"02517e269139d696a24b3ec04235cd49ba76422f"},{"appid":"556651b611ac6cb9876f54eb950084090e060846","name":"Krusader","website":"https://krusader.org","license":"GNU General Public License v3.0 only","description":"Krusader is an advanced twin panel (commander style) file manager for KDE Plasma and other desktops in the *nix world, similar to Midnight or Total Commander.","enhanced":false,"tile_background":"dark","icon":"krusader.svg","sha":"9e1f927d9ca4ff1776f7e4303fb072df3d8ecb7d"},{"appid":"211e5bfaaa8f220a748e1e9ef8a2513cb391f651","name":"Kubernetes Dashboard","website":"https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard","license":"Apache License 2.0","description":"Kubernetes Dashboard is a general purpose, web-based UI for Kubernetes clusters. It allows users to manage applications running in the cluster and troubleshoot them, as well as manage the cluster itself.","enhanced":false,"tile_background":"dark","icon":"kubernetesdashboard.svg","sha":"3eec881fc08b4e9cc118f1e403b8d8ecbd3c6e2d"},{"appid":"49eac3c78f71626d0364c2691336b2113daedf4c","name":"LazyLibrarian","website":"https://lazylibrarian.gitlab.io","license":"CNRI Python Open Source GPL Compatible License Agreement","description":"LazyLibrarian is a program to follow authors and grab metadata for all your digital reading needs.","enhanced":false,"tile_background":"dark","icon":"lazylibrarian.png","sha":"5bb3459966950e1e31b2ced91c266789e501a690"},{"appid":"48b8edcabb38cf25b257b7da1042eb8f19d16248","name":"LemonLDAP::NG","website":"https://lemonldap-ng.org/welcome","license":"GNU General Public License v2.0 or later","description":"LemonLDAP::NG is a complete and modular Web-SSO system that can run with\r\nreverse-proxies or directly on application webservers. It can be used in\r\nconjunction with OpenID-Connect, CAS and SAML systems as identity or\r\nservice provider. It can also be used as proxy between those federation\r\nsystems.\r\nIt manages both authentication and authorization and provides headers for\r\naccounting. So you can have a full AAA protection. Authorizations are built by\r\nassociating a regular expression and a rule. Regular expression is applied on\r\nthe requested URL and the rule calculates if the user is authorized.","enhanced":false,"tile_background":"light","icon":"lemonldapng.png","sha":"a959ac2e6041267e0e58db6b3f14210f9d5aaea4"},{"appid":"3efb63c16a70f296c1cdb7992bd621c26423da99","name":"LibreNMS","website":"https://www.librenms.org","license":"GNU General Public License v3.0 or later","description":"LibreNMS, a fully featured network monitoring system that provides a wealth of features and device support","enhanced":false,"tile_background":"dark","icon":"librenms.png","sha":"c20a2d20bcc2e0354193e5c720a078a7daba53ac"},{"appid":"3771bfd8b92b695b317391d4e685d13fc9a14433","name":"LibreSpeed","website":"https://github.com/librespeed/speedtest","license":"GNU Lesser General Public License v3.0 or later","description":"A Free and Open Source Speedtest for HTML5 and more.","enhanced":false,"tile_background":"light","icon":"librespeed.png","sha":"a54ba486055e53fff1bac790db1bb39cc21855e0"},{"appid":"c015fff30a3dc43f5987079c0142437e3e757fd0","name":"Lidarr","website":"https://lidarr.audio","license":"GNU General Public License v3.0 only","description":"Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them.","enhanced":true,"tile_background":"dark","icon":"lidarr.svg","sha":"b1238e6d6d5323b2de916b16b36f8c4548935b08"},{"appid":"c7eef6a399bb48a066d4e11fc577e896bc142cf3","name":"LinkAce","website":"https://www.linkace.org","license":"GNU General Public License v3.0 only","description":"LinkAce is a self-hosted archive to collect links of your favorite websites. Save articles to read them later, tools to use them in your next project, or historic content to archive it for the long term. LinkAce comes with a lot of features while keeping a clean and minimal interface.","enhanced":true,"tile_background":"light","icon":"linkace.svg","sha":"40cdc6174ecf50ab7d796e5cc00885088bcba18c"},{"appid":"4c1738fdd3a5743e76bc256be5e112d3e4dd511d","name":"Lychee","website":"https://lycheeorg.github.io","license":"MIT License","description":"Self-hosted photo-management done right","enhanced":false,"tile_background":"light","icon":"lychee.png","sha":"05b74504020e5c4516dbbd99bd9b8570c00d01af"},{"appid":"aeabf6597d765c42d67abdc8c1918c8ec5b18cb8","name":"Mailcow","website":"https://mailcow.email","license":"GNU General Public License v3.0 only","description":"Mailcow is a Docker based email server which provides an elegant web interface for managing domains, mailboxes and more.","enhanced":false,"tile_background":"dark","icon":"mailcow.svg","sha":"556eaac237959b7e22cf5ca91182409cd98507ab"},{"appid":"1ec48781d2c87a9e6dc9ee99e5eff0ab5958df09","name":"Mailcow - SOGo","website":"https://sogo.nu","license":"GNU GPL/LGPL v2 and above","description":"SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.\r\n\r\nPart of the Mailcow stack.","enhanced":false,"tile_background":"dark","icon":"mailcowsogo.svg","sha":"99167aebe5736831df03d0bc4c7af60954b7f58b"},{"appid":"cffc32ba3ead25ff79a6f34e163b120cf68ab9e2","name":"Mailhog","website":"https://github.com/mailhog/MailHog","license":"MIT License","description":"MailHog is an email testing tool for developers:\r\n\r\n- Configure your application to use MailHog for SMTP delivery\r\n- View messages in the web UI, or retrieve them with the JSON API\r\n- Optionally release messages to real SMTP servers for delivery","enhanced":false,"tile_background":"light","icon":"mailhog.png","sha":"62b6d0d939b2b19e02fe8a640f3b6e21556fd1a9"},{"appid":"042c8e5dba563bf592d67d024ff2d66c011a9a69","name":"Mainsail","website":"https://github.com/meteyou/mainsail","license":"GNU General Public License v3.0 only","description":"Mainsail is a lightweight & responsive web interface for the Klipper 3D printer firmware. It communicates with the Moonraker (Klipper-API) from Arksine.","enhanced":false,"tile_background":"light","icon":"mainsail.png","sha":"ced9e7708ec0175dfd11330f97fabd29aa028ce9"},{"appid":"0efc652ff6792fef6190e3f066133e37a050e52a","name":"Mastodon","website":"https://joinmastodon.org","license":"GNU Affero General Public License v3.0","description":"Mastodon is a free, open-source social network server based on ActivityPub where users can follow friends and discover new ones. On Mastodon, users can publish anything they want: links, pictures, text, video. All Mastodon servers are interoperable as a federated network (users on one server can seamlessly communicate with users from another one, including non-Mastodon software that implements ActivityPub)!","enhanced":false,"tile_background":"light","icon":"mastodon.svg","sha":"0ace6f4597f1c401c581e324723bc892a278f19a"},{"appid":"b3e1424fb69ca08481b03ad9d81e95488421997f","name":"Mattermost","website":"https://mattermost.com","license":"MIT License","description":"Mattermost provides high trust collaboration and messaging solutions through an open source, community-powered approach. Enjoy all the productivity benefits of workplace messaging across web, mobile and PC, with unlimited archiving, search and integrations within IT-controlled private environments in public clouds, including AWS and Azure, as well as on-premise in private clouds and virtual or physical servers.","enhanced":false,"tile_background":"light","icon":"mattermost.png","sha":"3ce7f26a4e39c1bbe10f8cff0ce5afbe68ff9b19"},{"appid":"6b9e062ff02ea610df64e9b0eca1c973faf1b51d","name":"Mayan EDMS","website":"https://gitlab.com/mayan-edms/mayan-edms","license":"Apache License 2.0","description":"Mayan EDMS is an open-source document management system. Its main purpose is to store, introspect, and categorize files, with a strong emphasis on preserving the contextual and business information of documents. It can also OCR, preview, label, sign, send, and receive thoses files. Other features of interest are its workflow system, role based access control, and REST API.","enhanced":false,"tile_background":"light","icon":"mayanedms.png","sha":"5137e4a437a3e141ce4529a1a96b57547271a7a4"},{"appid":"1ca09632db905908f09e8c8e6fe6d64b6798aaaa","name":"McMyAdmin","website":"https://www.mcmyadmin.com","license":"Proprietary","description":"McMyAdmin is the leading web control panel and administration console for Minecraft servers. McMyAdmin makes it easy for you to control your Minecraft servers via it's straight forward user interface and mobile apps.","enhanced":false,"tile_background":"dark","icon":"mcmyadmin.png","sha":"0c2882b2c77467507a5edb140deae2b8fcf20836"},{"appid":"95fc71dc5b7a31e5a244df43f457a6eedc966ac9","name":"Mealie","website":"https://github.com/hay-kot/mealie","license":"MIT License","description":"Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and mealie will automatically import the relevant data or add a family recipe with the UI editor.","enhanced":false,"tile_background":"dark","icon":"mealie.png","sha":"fee0828023f6722fdaeac2ea7a3b9f0f0c12de7d"},{"appid":"67dcc2f0c9930fb08b0eaa39ad076264965b2bd6","name":"MediaWiki","website":"https://www.mediawiki.org/wiki/MediaWiki","license":"GNU General Public License v2.0 or later","description":"MediaWiki is a collaboration and documentation platform brought to you by a vibrant community.","enhanced":false,"tile_background":"light","icon":"mediawiki.png","sha":"d34135a4a25b36a5ed817792d2df54c167cd7f3e"},{"appid":"7209e12ecf01afc45db4ff41be3602a898cf77f8","name":"Medusa","website":"https://pymedusa.com","license":"GNU General Public License v3.0 only","description":"Medusa is an automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic: automatic torrent/nzb searching, downloading, and processing at the qualities you want.","enhanced":false,"tile_background":"dark","icon":"medusa.png","sha":"01f320763041d156d7ca25df1ae7118c430ff45c"},{"appid":"ad35ad6e82ecf7b9f4e279795d3ef30a496d2a21","name":"Meraki","website":"https://meraki.com","license":"Commercial","description":"Cloud web portal for Meraki device management.","enhanced":false,"tile_background":"light","icon":"meraki.png","sha":"f10e964f141d58304bf747a1181f6cd4681a2ccf"},{"appid":"4a0a491219ae93bc0848b0d05efbe250ace4049c","name":"Metabase","website":"https://www.metabase.com/","license":"GNU Affero General Public License v3.0","description":"The simplest, fastest way to get business intelligence and analytics to everyone in your company 😋","enhanced":false,"tile_background":"light","icon":"metabase.svg","sha":"1625d994c0cb46682cb13f56aa30bfd5c042cb82"},{"appid":"757ff43646cf978b954d695926049f0ce636e3df","name":"MineOS","website":"https://minecraft.codeemo.com","license":"GNU General Public License v3.0 only","description":"MineOS is a platform-independent server front-end to create, host and manage Minecraft servers with a few mouse clicks.","enhanced":false,"tile_background":"dark","icon":"mineos.png","sha":"90daa5d6a0dcf8d5997b325d3b828ab7400226fb"},{"appid":"f1a89a23921939fc4ea89777cf9c7d6c08679fde","name":"Miniflux","website":"https://miniflux.app","license":"Apache License 2.0","description":"Miniflux is a lightweight RSS feed reader app.","enhanced":true,"tile_background":"dark","icon":"miniflux.png","sha":"f5fcb52a7f0017dee826dd87a1445fad49e41ce5"},{"appid":"30747605e1f6faad5d1cedb2c7953d31ffad3fd4","name":"Minio","website":"https://www.minio.io","license":"Apache License 2.0","description":"Minio is an object storage server released under Apache License v2.0. It is compatible with Amazon S3 cloud storage service. It is best suited for storing unstructured data such as photos, videos, log files, backups and container / VM images.","enhanced":false,"tile_background":"light","icon":"minio.png","sha":"3a75342c45c533b4468ac290a46c68f5cb0f182c"},{"appid":"96d53734fc1bd54d848cd30f98069b90333b1bb3","name":"Monica","website":"https://www.monicahq.com","license":"GNU Affero General Public License v3.0 only","description":"Monica is an open-source web application to organize the interactions with your loved ones. We call it a PRM, or Personal Relationship Management. Think of it as a CRM for your friends or family.","enhanced":true,"tile_background":"light","icon":"monica.png","sha":"4aaa8fe489cf3631cb8a62eabd09cbcd9903ce3a"},{"appid":"3568f62a517667d3dae77d47746d8382dd3b9f3b","name":"Monit","website":"https://mmonit.com/monit","license":"GNU Affero General Public License v3.0 or later","description":"Monit is a small Open Source utility for managing and monitoring Unix systems. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.","enhanced":true,"tile_background":"dark","icon":"monit.png","sha":"8888c360c4af34645d050d1cdb4eea5c5568a1be"},{"appid":"19bd1c6a4f62ecc721b771b42e71d2eaff67824e","name":"MotionEye","website":"https://github.com/ccrisan/motioneye","license":"GNU General Public License v3.0 only","description":"motionEye is a web-based frontend for motion.","enhanced":false,"tile_background":"light","icon":"motioneye.png","sha":"24f78375c2769aaf4a1ddddcd961b9574eef47c7"},{"appid":"756e9d172c05c14d07ff2428e6a75d5885bf5ae0","name":"Munin","website":"http://munin-monitoring.org","license":"GNU General Public License v2.0 only","description":"Munin is a networked resource monitoring tool that can help analyze resource trends and \"what just happened to kill our performance?\" problems. It is designed to be very plug and play. A default installation provides a lot of graphs with almost no work.","enhanced":false,"tile_background":"light","icon":"munin.png","sha":"e63001c7f41839143a0e23de8c1901b583d12eec"},{"appid":"8962c794c6557b091455fdd5ad0d1fc7a266cfe7","name":"MusicBrainz","website":"https://musicbrainz.org","license":"GNU General Public License v2.0 only","description":"MusicBrainz is an open music encyclopedia that collects music metadata and makes it available to the public.","enhanced":false,"tile_background":"dark","icon":"musicbrainz.svg","sha":"ffc9002e7bc4785f78ace89cbe3a00f1c48f4ccd"},{"appid":"1c7c1eebcd96285956627a1d10006a6756d9c2b4","name":"Mylar","website":"https://github.com/evilhero/mylar","license":"GNU General Public License v3.0 only","description":"Mylar is an automated Comic Book (cbr/cbz) downloader program heavily-based on the Headphones template and logic (which is also based on Sick-Beard).","enhanced":true,"tile_background":"dark","icon":"mylar.png","sha":"752fb65bf001f7b27a1484206d94afaea1ad383b"},{"appid":"fe2d0a7a5b34951b6ec3c46184f1ed3eae19459d","name":"Nagios","website":"https://www.nagios.com/products/nagios-core","license":"GNU General Public License v2.0 only","description":"The open source industry standard in IT infrastructure monitoring and alerting.","enhanced":false,"tile_background":"light","icon":"nagios.png","sha":"1b27012236f70de4efe5f890e70692ae1490c71c"},{"appid":"0e0c78c72d4215bccbe4a8ad0c0234bfb9998b88","name":"NAS","website":"https://en.wikipedia.org/wiki/Network-attached_storage","license":"Commercial","description":"Network-attached storage (NAS) is a file-level computer data storage server connected to a computer network providing data access to a heterogeneous group of clients. NAS is specialized for serving files either by its hardware, software, or configuration.","enhanced":false,"tile_background":"light","icon":"nas.svg","sha":"120571cf47c5f15b8559eb324373ee4940fbb431"},{"appid":"31e028553b33bf830e42d88a888ee1093e3dd591","name":"Navidrome","website":"https://www.navidrome.org","license":"GNU General Public License v3.0 only","description":"Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device.","enhanced":true,"tile_background":"dark","icon":"navidrome.svg","sha":"970657a815d68e5f3cd86f9b551a00fbaf4315e6"},{"appid":"b69a8d8e93fa412531b8ef117c50ce520d71cd5a","name":"n8n","website":"https://n8n.io","license":"Apache License 2.0","description":"n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly versatile, enabling you to connect anything to everything.","enhanced":false,"tile_background":"light","icon":"n8n.png","sha":"80a9116893bb17a57a1b6d8f3b643a013915f252"},{"appid":"c47466c999c3113a3291ab09cab20b0df630d8e8","name":"Nessus","website":"https://www.tenable.com/products/nessus","license":"Commercial","description":"Nessus is trusted by more than 27,000 organizations worldwide as one of the most widely deployed security technologies on the planet - and the gold standard for vulnerability assessment.","enhanced":true,"tile_background":"light","icon":"nessus.png","sha":"1b7abab6adfce1971506d7632163d66ab05fa8c6"},{"appid":"81bf08fbb240b662b17c0d837c5cb9f30a7e89e5","name":"Netatmo","website":"https://www.netatmo.com/en-us/weather","license":"Commercial","description":"With the Netatmo Smart Home Weather Station and its accessories, measure, analyse, and understand your indoor and outdoor environment to adapt your daily life and optimise your comfort at home.","enhanced":false,"tile_background":"light","icon":"netatmo.png","sha":"ab3a2718d102873b3e1b78bcb31bfc40d3be1737"},{"appid":"3f903351ae2408404930a6af98e669510149abbd","name":"Netboot","website":"https://netboot.xyz","license":"Apache License 2.0","description":"netboot.xyz is a way to PXE boot various operating system installers or utilities from one place within the BIOS without the need of having to go retrieve the media to run the tool.","enhanced":false,"tile_background":"dark","icon":"netboot.png","sha":"5270fd6efad8363eeb2ca92fe112d9386f9e9142"},{"appid":"b42bf8635b4e7c528339fd4e073ddc9fecf1e5a7","name":"NetBox","website":"https://github.com/netbox-community/netbox","license":"Apache License 2.0","description":"NetBox is an IP address management (IPAM) and data center infrastructure management (DCIM) tool. Initially conceived by the network engineering team at DigitalOcean, NetBox was developed specifically to address the needs of network and infrastructure engineers.","enhanced":false,"tile_background":"light","icon":"netbox.png","sha":"d3c3f13f3636a2e802cd3f13a60a0fd6de85c39f"},{"appid":"810d3926feac8c1bd3957fdac48b6c9475b932d0","name":"Netdata","website":"https://my-netdata.io","license":"GNU General Public License v3.0 only","description":"Unparalleled insights, in real-time, of everything happening on your systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms.","enhanced":true,"tile_background":"dark","icon":"netdata.svg","sha":"35e26319f2cc812b7bf7dbadc2e4cd7017e1e1ef"},{"appid":"13121fb95b2b5da427d75de170f479bc8e53ef09","name":"Netgear Orbi","website":"https://www.netgear.com/de/home/wifi/mesh/orbi/","license":"Commercial","description":"Netgear ORBI Dashboard","enhanced":false,"tile_background":"light","icon":"netgearorbi.png","sha":"65253fbd74b3fdf5d0ae4fb2f661358be4580d06"},{"appid":"f2baa52d02ca888455ce47823f47bf372d5eecb3","name":"Nextcloud","website":"https://nextcloud.com","license":"GNU Affero General Public License v3.0 only","description":"Nextcloud is an open source, self-hosted file share and communication platform. Access and sync your files, contacts, calendars and communicate and collaborate across your devices.","enhanced":true,"tile_background":"light","icon":"nextcloud.svg","config":{"type":"basic_auth","additional_headers":{"OCS-APIRequest":"true"},"stat1":{"name":"Total","url":":url:ocs/v1.php/cloud/users/:username:?format=json","key":"ocs.data.quota.total","filter":"size","updateOnChange":"No","suffix":""},"stat2":{"name":"Used","url":":url:ocs/v1.php/cloud/users/:username:?format=json","key":"ocs.data.quota.used","filter":"size","updateOnChange":"No","suffix":""}},"sha":"2a50b3235a8fe4f4aa6031437f694171e63d506b"},{"appid":"cbfad988a16a9fbcc1812bc206afcc1f73dd36de","name":"Nginx Proxy Manager","website":"https://nginxproxymanager.jc21.com","license":"MIT License","description":"This project comes as a pre-built docker image that enables you to easily forward to your websites running at home or otherwise, including free SSL, without having to know too much about Nginx or Letsencrypt.","enhanced":true,"tile_background":"light","icon":"nginxproxymanager.png","sha":"26941fa5d66da7e9cd705e94446ca98051824ba5"},{"appid":"570ecf8de333013382f0dc93aa7faacbccdee575","name":"Nitter","website":"https://github.com/zedeus/nitter","license":"GNU Affero General Public License v3.0","description":"A free and open source alternative Twitter front-end focused on privacy.","enhanced":false,"tile_background":"dark","icon":"nitter.svg","sha":"3618b971c8b1645161543d234b0c09935a172037"},{"appid":"1608962f5295ccc488f3103ea8df2c6d45c62c65","name":"Node-Red","website":"https://nodered.org","license":"Apache License 2.0","description":"Node-RED is a flow-based development tool for visual programming developed originally by IBM for wiring together hardware devices, APIs and online services as part of the Internet of Things. \r\n\r\nNode-RED provides a browser-based flow editor, which can be used to create JavaScript functions. Elements of applications can be saved or shared for re-use. The runtime is built on Node.js. The flows created in Node-RED are stored using JSON. Since version 0.14 MQTT nodes can make properly configured TLS connections","enhanced":false,"tile_background":"dark","icon":"nodered.png","sha":"ca199720e14765c2b3ff392781d047209716fbdb"},{"appid":"b3d874a5d85233d394ed569fc8f67f4864993308","name":"NowShowing","website":"https://github.com/ninthwalker/NowShowing","license":"MIT License","description":"Generates an email and web page of Plex recently added content. NowShowing is the successor of the popular plexReport docker.","enhanced":false,"tile_background":"light","icon":"nowshowing.png","sha":"b3dd5f0bc771707a744b471d84c0e4011af05039"},{"appid":"361f712137443a3d7f1047a4f470bcf0158cc6d6","name":"ntopng","website":"https://www.ntop.org","license":"GNU General Public License v3.0 or later","description":"ntopng is the next generation version of the original ntop, a network traffic probe that monitors network usage. ntopng is based on libpcap and it has been written in a portable way in order to virtually run on every Unix platform, MacOSX and on Windows as well.","enhanced":false,"tile_background":"light","icon":"ntopng.png","sha":"72da47b0d23f9aa67236dda5c78535883a0a9bb6"},{"appid":"533dc2434d2aee76aac442ece4bcc94b53fd7246","name":"NxFilter","website":"https://nxfilter.org","license":"Commercial","description":"NxFilter is a free DNS filter for commercial and non-commercial purposes. It's light, fast and easy.","enhanced":false,"tile_background":"light","icon":"nxfilter.png","sha":"952fdd1515b4ca6bd77513f824c5fd8cd17083ef"},{"appid":"31a7b1d936c4e8503bb446e5ff8ada669d1846bd","name":"Nzbget","website":"https://nzbget.net","license":"GNU General Public License v2.0 only","description":"NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files. NZBGet is written in C++ and is known for its extraordinary performance and efficiency.","enhanced":true,"tile_background":"dark","icon":"nzbget.png","sha":"0819ddf9516d32717ce60a4d367d6b28bd3b72af"},{"appid":"a5b4faf84287a35c98adc76f2117aa10d1ea6eb8","name":"NZBHydra","website":"https://github.com/theotherp/nzbhydra2","license":"Apache License 2.0","description":"NZBHydra is a meta search for NZB indexers. It provides easy access to a number of raw and newznab based indexers. You can search all your indexers from one place and use it as an indexer source for tools like Sonarr, Radarr or CouchPotato.","enhanced":false,"tile_background":"light","icon":"nzbhydra.png","sha":"cdc8edea5ced54f89bcfd8ed991ac2ab3379f576"},{"appid":"99be0df8034cbcd7b5dfb3290839f7db21c1acbb","name":"Octoprint","website":"https://octoprint.org","license":"GNU Affero General Public License v3.0","description":"OctoPrint is the snappy web interface for your 3D printer that allows you to control and monitor all aspects of your printer and print jobs, right from your browser.","enhanced":true,"tile_background":"dark","icon":"octoprint.png","sha":"436f531726faa659a63d7aaf015d0b236465bbeb"},{"appid":"aeddfb31b642e8e30591a99b3b3c30b8a765be32","name":"Omada SDN Controller","website":"https://www.tp-link.com/us/omada-sdn","license":"No Limit Public License","description":"Omada’s Software Defined Networking (SDN) platform integrates network devices, including access points, switches and gateways, providing 100% centralized cloud management. Omada creates a highly scalable network—all controlled from a single interface. Seamless wireless and wired connections are provided, ideal for use in hospitality, education, retail, offices, and more.","enhanced":false,"tile_background":"dark","icon":"omadasdncontroller.png","sha":"2caed228ef4e4066b8f7cdb31093145a6cb9c3f9"},{"appid":"57b25ceb94bd4c9ba9038ce17656f5ede9007e4c","name":"Ombi","website":"https://ombi.io","license":"GNU General Public License v2.0 only","description":"Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users.","enhanced":true,"tile_background":"dark","icon":"ombi.png","sha":"34787935c339fb5e2b2b131ec18ab25307ea7fdc"},{"appid":"1d41498511148e83a9c731b2fce96478e8ae402e","name":"OmniDB","website":"https://www.omnidb.org","license":"MIT License","description":"OmniDB is an open source collaborative environment for database management. It provides a unified workspace for various database technologies like PostgreSQL, MySql, MariaDB and others.","enhanced":false,"tile_background":"dark","icon":"omnidb.png","sha":"7e059000775fc2b4809af52cbfdec03d6b4a24c9"},{"appid":"fc4e407d69510b855b678aa4fba6083fbbfc5383","name":"OnlyOffice","website":"https://www.onlyoffice.com","license":"GNU Affero General Public License v3.0 or later","description":"ONLYOFFICE online editors for text documents, spreadsheets, and presentations with access to pro features and connect them to the platform of your choice with ready-to-use connectors: https://www.onlyoffice.com/download.aspx#connectors","enhanced":false,"tile_background":"light","icon":"onlyoffice.png","sha":"208cf4cf2996ba104d12c37a04271893a3e9b4b1"},{"appid":"c6a4fe0b25a74497e966f279f5186c99e5ce30e3","name":"openHAB","website":"https://www.openhab.org","license":"Eclipse Public License 1.0","description":"The open Home Automation Bus (openHAB) project aims at providing a universal integration platform for all things around home automation. It is a pure Java solution, fully based on OSGi.","enhanced":false,"tile_background":"light","icon":"openhab.png","sha":"f473b6005a47cb92dbef1f67895f8c4c80162ec4"},{"appid":"ce88c5ed9d12b302762ca57ee01d494b96466946","name":"OpenMapTiler","website":"https://openmaptiles.org","license":"BSD 3-Clause Clear License","description":"Open-source maps made for self-hosting","enhanced":false,"tile_background":"dark","icon":"openmaptiler.png","sha":"2a97987794e088723d1c48160e4fadc97acb9573"},{"appid":"68a90a2f21aad7a09a3533a2c6ab9a03dc94af49","name":"openmediavault","website":"https://www.openmediavault.org","license":"GNU General Public License v3.0 only","description":"openmediavault is the next generation network attached storage (NAS) solution based on Debian Linux.","enhanced":true,"tile_background":"dark","icon":"openmediavault.svg","sha":"2e08a94633902ead48d2705e6a10c1286e68d41a"},{"appid":"a42cc8d686807c59dc3858e14faf1028d766abf0","name":"OpenSpeedTest","website":"https://openspeedtest.com","license":"Creative Commons Attribution No Derivatives 3.0 Unported","description":"OpenSpeedTest is a 100% browser-based speed test application. It allows you to test your network connection speed on any device using various web browsers without installing any additional apps or plugins (no Flash or Java Needed!).","enhanced":false,"tile_background":"light","icon":"openspeedtest.png","sha":"4bfbc83ce76ef9048ac8f4f9bb02ebbf19184145"},{"appid":"bd1d7a45d17d62fd7db0c3f69e8a52661eedcc5b","name":"OpenSprinkler","website":"https://opensprinkler.com","license":"GNU General Public License v3.0 only","description":"OpenSprinkler is an open-source, web-based sprinkler / irrigation controller. It’s a drop-in replacement for conventional sprinkler controllers that are not web connected.","enhanced":false,"tile_background":"light","icon":"opensprinkler.png","sha":"3143076bb556beaece1222b28b6522c53167486d"},{"appid":"9b934cf284d9b196f48b43876d3e01912797242c","name":"OpenWrt","website":"https://openwrt.org","license":"GNU General Public License v2.0 or later","description":"OpenWrt is an open source project based on Linux, primarily used on devices to route network traffic\r\n\r\n#please use tile background color #578","enhanced":false,"tile_background":"light","icon":"openwrt.png","sha":"6e46ccda1de1cc2acf91dd9a4d6e13a85b6b8db2"},{"appid":"b7dcd77029f908fb21195dd01e29882ca52d4f3a","name":"OPNsense","website":"https://opnsense.org","license":"BSD 2-Clause \"Simplified\" License","description":"OPNsense is open source, FreeBSD-based firewall and routing software developed by Deciso. It is a fork of pfSense, which in turn was forked from m0n0wall.","enhanced":false,"tile_background":"light","icon":"opnsense.png","sha":"3a1508e0df1e42b47e426783062dd0a9d25e3267"},{"appid":"46ede88d6d440af5d3c7cc70cabbab6722245acd","name":"Oscarr","website":"https://github.com/morpheus65535/oscarr","license":"GNU General Public License v3.0 only","description":"Oscarr is a dashboard application for users of Plex, Emby, Sonarr, Radarr and Bazarr. It gives you and overview of your media management software.","enhanced":false,"tile_background":"light","icon":"oscarr.svg","sha":"876e2bf1a95456a085437f399c8b87ba1c85cf37"},{"appid":"727706dbdf86b593f7be63c2fcca20718fd8caca","name":"osTicket","website":"https://osticket.com","license":"GNU General Public License v2.0 only","description":"osTicket is a widely-used open source support ticket system.","enhanced":false,"tile_background":"dark","icon":"osticket.png","sha":"1012e86467bb88de61fa2e5383a45ae397010094"},{"appid":"989fb18945a331b430fc284edfe6451aa760f8e6","name":"Overseerr","website":"https://github.com/sct/overseerr","license":"MIT License","description":"Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services such as Sonarr, Radarr and Plex!","enhanced":true,"tile_background":"dark","icon":"overseerr.svg","sha":"c83401a43d5c3169f63c7bfe0ca48e7cd2c5149a"},{"appid":"668b5fcda851fe516fef14e82973beffe32f385a","name":"ownCloud","website":"https://owncloud.org","license":"GNU Affero General Public License v3.0 or later","description":"ownCloud is a free and open source file hosting service. It also supports extensions for online document editing, calendar and contact synchronization. It's a safe home for all your data.","enhanced":false,"tile_background":"dark","icon":"owncloud.png","sha":"c78b30a04e73308e8d6d9946bd92c2c9c1b87518"},{"appid":"742fb53dbb4fac003115e7f6ec7c46f39c797040","name":"OwnPhotos","website":"https://github.com/hooram/ownphotos","license":"MIT License","description":"Self hosted wannabe Google Photos clone, with a slight focus on cool graphs","enhanced":false,"tile_background":"light","icon":"ownphotos.png","sha":"275f22fde2d5fbd967557e0d464674ec2434780d"},{"appid":"710f91b65aed9bbc884898b19b6b4bb17ec5b32c","name":"Palo Alto Networks","website":"https://www.paloaltonetworks.com","license":"Commercial","description":"Palo Alto ore products are a platform that includes advanced firewalls and cloud-based offerings that extend those firewalls to cover other aspects of security.","enhanced":false,"tile_background":"light","icon":"paloaltonetworks.png","sha":"e2338d4c3f821e37fdaea634a2a99e04d460e28b"},{"appid":"6249c08eaa417b9918c69ed2d32ac88b386bc1b2","name":"Paperless","website":"https://github.com/danielquinn/paperless","license":"GPL-3.0","description":"Scan, index, and archive all of your paper documents","enhanced":false,"tile_background":"light","icon":"paperless.png","sha":"6ddd8730db70a740077d074b01bcbf3e2c1c2653"},{"appid":"e782bdad5e303d079375eac9d6b2bc03ed4fb7c5","name":"Papermerge","website":"https://www.papermerge.com/","license":"Apache License 2.0","description":"Papermerge is an open source document management system (DMS) primarily designed for archiving and retrieving your digital documents. Instead of having piles of paper documents all over your desk, office or drawers - you can quickly scan them and configure your scanner to directly upload to Papermerge DMS. Papermerge DMS on its turn will extract text data from the scanned documents using Optical Character Recognition (OCR) technology the index it and make it searchable. You will be able to quickly find any (scanned!) document using full text search capabilities.\r\n\r\nPapermerge is perfect tool to manage documents in PDF, JPEG, TIFF and PNG formats.","enhanced":false,"tile_background":"dark","icon":"papermerge.svg","sha":"8d6630b5d5c70a291dc2a7917b84d2dc4fbd6202"},{"appid":"1194ad979d9724f6866d0d0f2347580a78a283cc","name":"PartKeepr","website":"https://partkeepr.org","license":"GNU General Public License v3.0 only","description":"PartKeepr is an inventory management software, primarily designed for electronic components.","enhanced":false,"tile_background":"light","icon":"partkeepr.png","sha":"efa41c7864f8f99855772fb758ca6c00ff0433b2"},{"appid":"bf096d8f5ce86ff113f6cad2a36d565dc0f13ffc","name":"PeerTube","website":"https://joinpeertube.org","license":"GNU Affero General Public License v3.0 only","description":"PeerTube is an experimental decentralized federated video platform system that uses peer-to-peer technology to reduce load on individual servers.","enhanced":false,"tile_background":"light","icon":"peertube.png","sha":"f0e558a787aa48014838d8712c6fefceebc70dcc"},{"appid":"f8ac7f280fe53cea71efe29c42f0d3bca430c02d","name":"pfSense","website":"https://www.pfsense.org","license":"Apache License 2.0","description":"pfSense is an open source firewall/router computer software distribution based on FreeBSD.","enhanced":false,"tile_background":"dark","icon":"pfsense.svg","sha":"ad1156db93b39174bec30120c7b493063eb0f742"},{"appid":"43784e464f66bfc0254a3bad48939f14a70c878e","name":"pgAdmin","website":"https://www.pgadmin.org","license":"PostgreSQL License","description":"pgAdmin is a feature rich open-source administration and development platform for PostgreSQL.","enhanced":false,"tile_background":"dark","icon":"pgadmin.png","sha":"03fc6917174f216f6010539e265e11cbf0516962"},{"appid":"1d49c185b74e2b41addce38d2334000daf4c60d9","name":"Phoscon","website":"https://phoscon.de/en/app/doc","license":"BSD 4-Clause \"Original\" or \"Old\" License","description":"The Phoscon App is a powerful tool to configure and control small and larger smart light installations. Specializing in the popular wireless standard Zigbee, the Phoscon App supports a steadily growing number of lights, sensors and switches from various well-known manufacturers.","enhanced":false,"tile_background":"dark","icon":"phoscon.svg","sha":"38ee9c90b59e948e7feb525c05ecc37dabe23459"},{"appid":"ec9dab93c7d9cba1c5171ed468dfee950b933c94","name":"Photonix","website":"https://photonix.org","license":"GNU Affero General Public License v3.0 only","description":"This is a photo management application based on web technologies. Run it on your home server and it will let you find what you want from your photo collection using any device. Smart filtering is made possible automatically by object recognition, location awareness, color analysis and other algorithms.","enhanced":false,"tile_background":"light","icon":"photonix.png","sha":"d736aa4619f3ce5a90f3b55134891fa6770a71e5"},{"appid":"f60f5b25d59c397989e3cd374f81cdd7710a4fca","name":"PhotoPrism","website":"https://photoprism.org","license":"GNU General Public License v3.0 only","description":"PhotoPrism is a server-based application for browsing, organizing and sharing your personal photo collection. It makes use of the latest technologies to automatically tag and find pictures without getting in your way. Say goodbye to solutions that force you to upload your visual memories to the cloud.","enhanced":true,"tile_background":"light","icon":"photoprism.png","sha":"136f5dbe0dcc30d4ab999701fdd224de9d5fe558"},{"appid":"d9946b11ca2139e9299705b734b94e3d3066d4ec","name":"Photoview","website":"https://photoview.github.io","license":"GNU Affero General Public License v3.0 or later","description":"Photoview is a simple and user-friendly photo gallery that's made for photographers and aims to provide an easy and fast way to navigate directories, with thousands of high-resolution photos.\r\n\r\nYou configure Photoview to look for photos and videos within a directory on your file system. The scanner automatically picks up your media and start to generate thumbnail images to make browsing super fast.\r\n\r\nWhen your media has been scanned they show up on the website, organised in the same way as on the filesystem.","enhanced":false,"tile_background":"dark","icon":"photoview.svg","sha":"ac5dc489997200d264083ac643b472c5aea9f274"},{"appid":"db44aad188b5bbe570bd96e3e5a9e7f0e893bc90","name":"phpIPAM","website":"https://phpipam.net","license":"GNU General Public License v3.0 or later","description":"phpIPAM is an open-source web IP address management application. Its goal is to provide light, modern and useful IP address management. It is a php-based application with a MySQL database backend, using jQuery libraries, ajax and HTML5/CSS3 features.","enhanced":false,"tile_background":"light","icon":"phpipam.jpeg","sha":"d7d4817364adb5f07f12b57011fec29ee8f5ed7c"},{"appid":"6a8263e6e3ad594a12e111f0f952e4cc57fe5077","name":"phpLDAPadmin","website":"http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page","license":"GNU General Public License v2.0 or later","description":"phpLDAPadmin (also known as PLA) is a web-based LDAP client. It provides easy, anywhere-accessible, multi-language administration for your LDAP server.\r\n\r\nIts hierarchical tree-viewer and advanced search functionality make it intuitive to browse and administer your LDAP directory. Since it is a web application, this LDAP browser works on many platforms, making your LDAP server easily manageable from any location.\r\n\r\nphpLDAPadmin is the perfect LDAP browser for the LDAP professional and novice alike. Its user base consists mostly of LDAP administration professionals.","enhanced":false,"tile_background":"light","icon":"phpldapadmin.png","sha":"407438d2ff3bb80ebc61302d3efab6ff708ac2cd"},{"appid":"51ca673ea8e89a868706fd309777a101ac63a409","name":"phpMyAdmin","website":"https://www.phpmyadmin.net","license":"GNU General Public License, version 2","description":"phpMyAdmin is a free software tool written in PHP, intended to handle the administration of MySQL over the Web. phpMyAdmin supports a wide range of operations on MySQL and MariaDB. Frequently used operations (managing databases, tables, columns, relations, indexes, users, permissions, etc) can be performed via the user interface, while you still have the ability to directly execute any SQL statement.","enhanced":false,"tile_background":"light","icon":"phpmyadmin.png","sha":"b93e55e5869be8d1bbd09d5efcd85b640184281b"},{"appid":"b897f0f558bc83256a49d5c7e8f1658d87cfe820","name":"PiAware","website":"https://github.com/flightaware/piaware","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Client-side package and programs for forwarding ADS-B data to FlightAware","enhanced":true,"tile_background":"light","icon":"piaware.png","sha":"519aebcbdad9b8a003c1327e85ac7d4dcdd26d5d"},{"appid":"b89920409bdce40e08ba1023480b0546061cd577","name":"Pi-hole","website":"https://pi-hole.net","license":"European Union Public License 1.2","description":"Pi-hole is a Linux network-level advertisement and internet tracker blocking application which acts as a DNS sinkhole, intended for use on a private network.","enhanced":true,"tile_background":"dark","icon":"pihole.svg","sha":"ecec0f198ac6a56da9eebe332a76cd1eee0a1bbd"},{"appid":"3c8ecb5a9c477237e32b3776922fce3fd6e8a514","name":"PiKVM","website":"https://pikvm.org/","license":"GNU General Public License v3.0 or later","description":"A very simple and fully functional Raspberry Pi-based KVM over IP that you can make with your own hands without any soldering!","enhanced":false,"tile_background":"light","icon":"pikvm.png","sha":"3ad313fc245e70ebab2bd77a336e57508404dd5d"},{"appid":"c0f951b12d14c47e4e488294584808ff31747eea","name":"PiVPN","website":"https://www.pivpn.io","license":"MIT License","description":"The simplest way to setup and manage a VPN, designed for Raspberry Pi.","enhanced":false,"tile_background":"light","icon":"pivpn.png","sha":"a0db6ab0ac07fb2ac43893f522d614b2278b9bb4"},{"appid":"73821d23ad8bb436e7478fec8305ad0636c17d7a","name":"Piwigo","website":"piwigo.org","license":"GNU General Public License v2.0 only","description":"Piwigo is an open source photo galley software. Designed as an alternative to Picasa or Flickr it can be self-hosted or used as a service. It offers many plugins, and offers full photo management capabilities","enhanced":false,"tile_background":"light","icon":"piwigo.png","sha":"6cde474efe808952d4f1cbd1d2678d267c97a964"},{"appid":"7ba6bc2c0f5fbf27166c29bc5b39f6527fb27835","name":"Pleroma","website":"https://pleroma.social","license":"GNU Affero General Public License v3.0 or later","description":"Pleroma is a free, federated social networking server built on open protocols. It is compatible with GNU Social, Mastodon, and many other ActivityPub implementations.","enhanced":false,"tile_background":"dark","icon":"pleroma.png","sha":"49a12095e75caae05633ce0d1ebc5ce622e4eaba"},{"appid":"96bace2f6616fad61930a4ca021809c00a7e9e2a","name":"Plesk","website":"https://www.plesk.com","license":"Proprietary","description":"Plesk is a commercial web hosting platform with a control panel that allows a server administrator to set up new websites, reseller accounts, e-mail accounts and DNS entries through a web-based interface.","enhanced":false,"tile_background":"light","icon":"plesk.png","sha":"8a84443b7cf624ccea16c101ecf9502bccd48c8b"},{"appid":"aebda823a279b219476c565be863d83739999502","name":"Plex","website":"https://www.plex.tv","license":"Freemium","description":"Plex media server allows you to aggregate all your personal media and access it anywhere you go. Enjoy your own content on all your devices with Plex.","enhanced":true,"tile_background":"dark","icon":"plex.png","sha":"c133a3880a77fb729b596a31c0ed398a70ff1e37"},{"appid":"6dec25c0d43491eadaf519800e0dbf6adfe86f1a","name":"PlexRequests","website":"http://plexrequests.8bits.ca","license":"MIT License","description":"Simple automated way for users to request new content for Plex.","enhanced":false,"tile_background":"dark","icon":"plexrequests.png","sha":"7aa26a2176feb7caa64f5bf4b4c9ff7c54a76cc7"},{"appid":"e5289e584b9daf86b4ee2b2b394696cdd99a07cf","name":"Plume","website":"https://joinplu.me","license":"GNU Affero General Public License v3.0","description":"Plume is a federated blogging engine based on ActivityPub. It is written in Rust, with the Rocket framework, and Diesel to interact with the database. The front-end uses Ructe templates, WASM and SCSS.","enhanced":false,"tile_background":"light","icon":"plume.png","sha":"a384129feca346377eb876f9832db01f5e670739"},{"appid":"07b796b3a10eaa8b6f485ed2379187a39400b459","name":"Portainer","website":"https://portainer.io","license":"zlib License","description":"Portainer is a simple management solution for Docker. Easily manage your Docker hosts and Docker Swarm clusters via Portainer web user interface.","enhanced":true,"tile_background":"dark","icon":"portainer.svg","sha":"864da2c4bc430c74d461728b32f445f65fc0a068"},{"appid":"a28abde6e5a823e9c7115a94d71c3fc628a0efd4","name":"Poste","website":"https://poste.io","license":"MIT License","description":"Full stack mailserver solution with SSL TLS support. POP3s, SMTP(s), IMAPs, RSPAMD, Clamav, Roundcube(HTTPS), SPF, DKIM with simple installation and web administration.","enhanced":false,"tile_background":"dark","icon":"Poste.png","sha":"a16c4fd9188d3c47875555f5ee4b4956adb990eb"},{"appid":"3d3221b2db3115d65e938a1c497f209256c6185f","name":"Printer","website":"https://en.wikipedia.org/wiki/Printer_(computing)","license":"Commercial","description":"A printer is a peripheral device which makes a persistent representation of graphics or text, usually on paper. Printers that have a network connection often include a built-in web server that lets you manage the printer from any browser on the network.","enhanced":false,"tile_background":"dark","icon":"printer.png","sha":"8eecb7b5526c7a8e4687235b06d9995f28f78647"},{"appid":"87ecbead58e42b5ab9e1a92ccc0b42075f4fba91","name":"Privatebin","website":"https://privatebin.info","license":"zlib/libpng License with Acknowledgement","description":"PrivateBin is a minimalist, open source online pastebin where the server has zero knowledge of pasted data.\r\n\r\nData is encrypted and decrypted in the browser using 256bit AES in Galois Counter mode.","enhanced":false,"tile_background":"light","icon":"privatebin.png","sha":"a64efaacabc4b2bbe6beb393d17214ecef25ea2f"},{"appid":"91adc8832dfee8dea234877dad680682ab947980","name":"ProjectSend","website":"https://www.projectsend.org","license":"GNU General Public License v3.0 only","description":"ProjectSend is a self-hosted, free and open source, secure and user friendly file sharing software focusing on exchanging files between you and your clients.","enhanced":false,"tile_background":"light","icon":"projectsend.png","sha":"f8df4b91ae10d085420a7f38759cbd6d575f5092"},{"appid":"aad8f23c2fa06d46c52ae4e06c8d4bdac6074b8f","name":"Prometheus","website":"https://prometheus.io","license":"Apache License 2.0","description":"Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts if some condition is observed to be true.","enhanced":false,"tile_background":"light","icon":"prometheus.png","sha":"c93e2763bf74589799826a4e55232b754ad37b62"},{"appid":"de6ff49c94538e6e13a77f75991141a4fe9af8bf","name":"Prowlarr","website":"https://prowlarr.com","license":"GNU General Public License v3.0 only","description":"Prowlarr is a indexer manager/proxy built on the popular arr .net/reactjs base stack to integrate with your various PVR apps. Prowlarr supports both Torrent Trackers and Usenet Indexers. It integrates seamlessly with Sonarr, Radarr, Lidarr, and Readarr offering complete management of your indexers with no per app Indexer setup required (we do it all).","enhanced":true,"tile_background":"dark","icon":"prowlarr.svg","sha":"c97731af081cdd9cfa5c0e989a2e3df997a75690"},{"appid":"391f2b7f3fe853e1ea09723eeafc354fa291ab48","name":"Proxmox","website":"https://www.proxmox.com/en/","license":"GNU Affero General Public License v3.0 only","description":"Proxmox Virtual Environment is an open-source server virtualization environment. It allows deployment and management of virtual machines and containers","enhanced":true,"tile_background":"light","icon":"proxmox.svg","sha":"49e7c00ab1ad801ecde744515718cd1e1cca3784"},{"appid":"0ea6cd5e52e84ef9afd444f5693d09d216b10ba2","name":"PRTG","website":"https://www.paessler.com/prtg","license":"100 sensors free","description":"Monitor all systems, devices, traffic and applications of your IT infrastructure.","enhanced":true,"tile_background":"light","icon":"prtg.png","sha":"07caf01f9907d97302ec9dec7b99a2ba4eaf92ff"},{"appid":"1beb54ac8e91638c7a181fd04ca5a4a5ec5343c1","name":"PsiTransfer","website":"https://hub.docker.com/r/psitrax/psitransfer","license":"BSD with attribution","description":"A simple open source self-hosted file sharing app. Upload a file instantly anywhere around the world.","enhanced":false,"tile_background":"light","icon":"psitransfer.png","sha":"cd0873086d54900df6dba7078572c5d39e367c22"},{"appid":"0a5cd6b94160a13583653d188b5083c3fa3cacdf","name":"Pterodactyl","website":"https://pterodactyl.io","license":"MIT License","description":"Pterodactyl is an open-source game server management panel built with PHP 7, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end-users.","enhanced":false,"tile_background":"light","icon":"pterodactyl.png","sha":"ab67b3b05023cf330118392b11fbd43bff45c022"},{"appid":"0e859100d4a94f55ca42b82db2dadce415aff7ad","name":"pyLoad","website":"https://pyload.net","license":"GNU General Public License v3.0 only","description":"Free and Open Source download manager written in Pure Python and designed to be extremely lightweight, fully customizable and remotely manageable","enhanced":false,"tile_background":"dark","icon":"pyload.png","sha":"7af35ea7bc09daf4ff4a53f78ca3ab60f4c54952"},{"appid":"3ebd4dd8afe6308e392ccf09e3516eee99a1e8df","name":"qBittorrent","website":"https://www.qbittorrent.org","license":"GNU General Public License v2.0 only","description":"The qBittorrent project aims to provide an open-source software alternative to µTorrent.","enhanced":true,"tile_background":"dark","icon":"qbittorrent.svg","sha":"f2b3b6fee53820c4e0d2fa26fa7709aeed754c99"},{"appid":"4095a83996a808dfa4ef0e283b08fa3684596bb4","name":"QNAP","website":"https://www.qnap.com","license":"commercial","description":"QNAP Systems, Inc. is a Taiwanese corporation that specializes in Network-attached storage (NAS) appliances used for file sharing, virtualization, storage management and surveillance applications.","enhanced":false,"tile_background":"light","icon":"qnap.png","sha":"e7ff9be019b7f81a1ec4dcb9cdb608235f9bb602"},{"appid":"d37a9628bc10a8816f3b679566d2505ab43b55a0","name":"RabbitMQ","website":"https://www.rabbitmq.com/","license":"Mozilla Public License 2.0","description":"RabbitMQ is a free, open-source and extensible message queuing solution. It is a message broker that understands AMQP (Advanced Message Queuing Protocol), but is also able to be used with other popular messaging solutions like MQTT. It is highly available, fault tolerant and scalable.","enhanced":true,"tile_background":"light","icon":"rabbitmq.svg","sha":"973c29f08b15c59026f2b780a8ae13ddb39ac08d"},{"appid":"8a5cd39a1a5dff323d63bbe45fffe0c9c03bd2e7","name":"Radarr","website":"https://radarr.video","license":"GNU General Public License v3.0 only","description":"Radarr is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent.\r\n\r\nThe project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.","enhanced":true,"tile_background":"light","icon":"radarr.svg","config":{"type":"apikey","stat1":{"name":"Missing","url":":url:api/v3/movie?apikey=:apikey:","key":"","filter":"filter","filterBy":"hasFile","filterByValue":"false","updateOnChange":"no","suffix":""},"stat2":{"name":"Queue","url":":url:api/v3/queue?apikey=:apikey:","key":"totalRecords","filter":"none","updateOnChange":"no","suffix":""}},"sha":"b60bcc4dc2fe2db382d057d164ec61387f4eca9f"},{"appid":"10bde312e853977971f0fb1873afb70c713df2bf","name":"Rainloop","website":"https://www.rainloop.net","license":"GNU Affero General Public License v3.0","description":"Simple, modern & fast web-based email client","enhanced":false,"tile_background":"dark","icon":"rainloop.png","sha":"9855af2df90714000c4852c56396851a243e49a7"},{"appid":"cb4fa9655f4c77e40e3a9c2a5e5841927fc7b8a6","name":"Rancher","website":"https://rancher.com","license":"Apache License 2.0","description":"Rancher is an open source project that provides a container management platform built for organizations that deploy containers in production.","enhanced":false,"tile_background":"dark","icon":"rancher.svg","sha":"0c1350a07bf96ebbab80bbf075cfab7fd20f0b2e"},{"appid":"8bfa46ba721763e4ee235d6a8caef46247735eda","name":"Raneto","website":"https://github.com/gilbitron/Raneto","license":"MIT License","description":"Raneto is a free, open, simple Markdown powered Knowledgebase for Node.js.","enhanced":false,"tile_background":"light","icon":"raneto.png","sha":"95b2cc182a5e321283a7598ac98f696da605be3c"},{"appid":"506c7a7e21b5c2b750eccf8fdf91f072a9826f52","name":"Rclone","website":"https://rclone.org","license":"MIT License","description":"Rclone (\"rsync for cloud storage\") is a command line program to sync files and directories to and from different cloud storage providers.","enhanced":false,"tile_background":"light","icon":"rclone.png","sha":"fbef134a2b9e89d0d9c8cfe828d4c811d61bc331"},{"appid":"533ab349d29dba8f2ecc5a552ba8846a9453f82a","name":"Readarr","website":"https://readarr.com","license":"GNU General Public License v3.0 only","description":"Readarr is a ebook (and maybe eventually magazine/audiobook) collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new books from your favorite authors and will grab, sort and rename them.","enhanced":true,"tile_background":"dark","icon":"readarr.svg","sha":"c5efc35bae414e7ab25d95b65ef87bb228d9b154"},{"appid":"8d6955fafc1996f6b6535739e8e2419d09e0d545","name":"Recalbox","website":"https://www.recalbox.com","license":"MIT License","description":"Recalbox allows you to re-play a variety of videogame consoles and platforms in your living room, with ease! Recalbox OS is free, open source and designed to let you create your very own Recalbox in no time! Use Raspberry Pi, ODROID or even PC (x86)!","enhanced":false,"tile_background":"dark","icon":"recalbox.png","sha":"178e02a579df6e6d1a637a41610309a67d28f0b6"},{"appid":"fd3e5a20d3595a90e1b6d0243ab6e78ff18d68b4","name":"RedisInsight","website":"https://redis.com/redis-enterprise/redis-insight/","license":"Commercial","description":"RedisInsight is a visual tool that provides capabilities to design, develop and optimize your Redis application. Query, analyse and interact with your Redis data.","enhanced":false,"tile_background":"dark","icon":"redisinsight.svg","sha":"9aaccacb2b2a043aa35c80b25e8207c94c8d4a68"},{"appid":"e7a69443c2470473fe7e5a90b049ec771472f6aa","name":"Requestrr","website":"https://github.com/darkalfx/requestrr","license":"MIT License","description":"Requestrr is a chatbot used to simplify using services like Sonarr/Radarr/Ombi via the use of chat!","enhanced":false,"tile_background":"dark","icon":"requestrr.png","sha":"bff68a5566255926ea27b17797760916fd3f9a84"},{"appid":"891934b3a775769d929fabfaf93520db8205eaf6","name":"Resilio Sync","website":"https://www.resilio.com","license":"Proprietary","description":"Resilio Sync is a fast, reliable, and simple file sync and share solution, powered by P2P technology.","enhanced":false,"tile_background":"dark","icon":"resiliosync.png","sha":"e7d8f632f9a62eb57dc974fbada99f9e0855de19"},{"appid":"c3fdfdc6801bd71a615317cf54a113b3b0bc0bf4","name":"Riot Web","website":"https://about.riot.im","license":"Apache License 2.0","description":"Communicate the way you want with Riot - a universal secure chat app entirely under your control.","enhanced":false,"tile_background":"light","icon":"riotweb.svg","sha":"d45c51b7e7c68adb1c289466f947b376154af41f"},{"appid":"404b6861a94932750a70d2779fd785f018d90e36","name":"RocketChat","website":"https://rocket.chat","license":"MIT License","description":"Open Source Slack like chat server","enhanced":false,"tile_background":"dark","icon":"rocketchat.png","sha":"72b2f32faab82fbba24dd1a1bfc87657ebf914e7"},{"appid":"f54fdb78762ce2a47c25c0fb8508141d72e29777","name":"RompЯ","website":"https://fatg3erman.github.io/RompR","license":"Creative Commons Attribution Non Commercial Share Alike 4.0 International","description":"RompЯ is a music player with the emphasis on discovery - discovering more about the music you know, and discovering new music you don’t know yet. RompЯ is an interface that runs in a web browser on any device and controls a music player which can be on any other device. I recommend using Mopidy as the music player. When used with Mopidy and a Spotify Premium subscription RompЯ is a powerful Spotify client with many music discovery features.","enhanced":false,"tile_background":"dark","icon":"rompya.png","sha":"7d7e2d222cd1d2d2f44da8b7ef9007ac3c7353b5"},{"appid":"0faa0037bf071040588c082c0c5c8dee3e11f2cd","name":"Roundcube","website":"https://roundcube.net","license":"GNU General Public License v3.0 or later","description":"Roundcube webmail is a browser-based multilingual IMAP client with an application-like user interface. It provides full functionality you expect from an email client, including MIME support, address book, folder manipulation, message searching and spell checking.","enhanced":false,"tile_background":"light","icon":"roundcube.png","sha":"f35e1e475ba14a7a09caa8f3fc6743c4b387b5ce"},{"appid":"77eb1db6cb81b3cb088d36ab7aae8f230dcfaa28","name":"Router","website":"https://en.wikipedia.org/wiki/Router_(computing)","license":"Commercial","description":"A router is a networking device that forwards data packets between computer networks.","enhanced":false,"tile_background":"light","icon":"router.svg","sha":"9d4d69326a68bd9a8a382a2bc2ea42127d665ad2"},{"appid":"5876529d5d47f91c435d9230576044bc4cad8547","name":"Rspamd","website":"https://rspamd.com","license":"Apache 2.0","description":"Fast, free and open-source spam filtering system.","enhanced":false,"tile_background":"dark","icon":"rspamd.png","sha":"551f509b161b55fa748b22f25757fd0d7fa3caf7"},{"appid":"243338479393d415bba0b6a94f70db8dadd672db","name":"RStudio Server","website":"https://rstudio.com/products/rstudio/download-server","license":"GNU Affero General Public License v3.0","description":"RStudio Server provides a browser-based interface to the RStudio IDE for interacting with server-based deployments of R. R is a statistical programming language used by statisticians, analysts, and data scientists for for processing, modeling, and visualizing data.","enhanced":false,"tile_background":"light","icon":"rstudioserver.png","sha":"842609472396603a8c6e2e6543a86a895eb28dd9"},{"appid":"eea19d4cce28c77d2a0c1449a508d6290d00f9dd","name":"Rundeck","website":"https://www.rundeck.com/open-source","license":"Apache License 2.0","description":"Rundeck is an open source automation service with a web console, command line tools and a WebAPI. It lets you easily run automation tasks across a set of nodes.","enhanced":false,"tile_background":"dark","icon":"rundeck.png","sha":"6eea7b28e48498307f76819310ee3821333ef870"},{"appid":"11f6ce44eb513a288ca4ef26cbbdb3fece2d6ec4","name":"RuneAudio","website":"http://www.runeaudio.com","license":"GNU General Public License v3.0 or later","description":"RuneAudio is a free and open source software that turns inexpensive, silent and low-consumption mini-PC into Hi-Fi music players.","enhanced":true,"tile_background":"dark","icon":"runeaudio.png","sha":"cf80e3c199d773c0a0360c721ee7f8413ac5e777"},{"appid":"fbf13ee99afeadddc4f73e1183fd1b52774b3474","name":"ruTorrent","website":"https://github.com/Novik/ruTorrent","license":"GNU General Public License v3.0 or later","description":"ruTorrent is a front-end for the popular Bittorrent client rtorrent.","enhanced":true,"tile_background":"dark","icon":"rutorrent.png","sha":"3796f3f175c9be319c47ed62402020cdc4dc6c46"},{"appid":"7aa898759f1d210aaa5edc8a184bfe5e1668b5bd","name":"SABnzbd","website":"https://sabnzbd.org","license":"GNU General Public License v2.0 or later","description":"SABnzbd is a multi-platform binary newsgroup downloader. The program works in the background and simplifies the downloading verifying and extracting of files from Usenet.","enhanced":true,"tile_background":"dark","icon":"sabnzbd.svg","config":{"type":"apikey","stat1":{"name":"Queue","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.sizeleft","filter":"none","updateOnChange":"Yes","suffix":""},"stat2":{"name":"Speed","url":":url:api?output=json&apikey=:apikey:&mode=queue","key":"queue.speed","filter":"speed","updateOnChange":"Yes","suffix":""}},"sha":"dd60edbeff0aa72e4c340f7a5f88e549ba516316"},{"appid":"40892c1b428213c21516114ade1eaeb8fe26fc96","name":"Scrutiny","website":"https://github.com/AnalogJ/scrutiny","license":"MIT License","description":"Scrutiny is a Hard Drive Health Dashboard & Monitoring solution, merging manufacturer provided S.M.A.R.T metrics with real-world failure rates.","enhanced":false,"tile_background":"light","icon":"scrutiny.png","sha":"58feddcebf9122d2287ffb1dc2267b870015c595"},{"appid":"055bbb599e68faa20cba22098b4802152b33b763","name":"Seafile","website":"https://www.seafile.com","license":"GNU General Public License v2.0 only","description":"Seafile is an open source enterprise file hosting platform with high reliability and performance. Put files on your own server. Sync and share files across different devices, or access all the files as a virtual disk.","enhanced":false,"tile_background":"dark","icon":"seafile.png","sha":"76dd9a9b340c12fcec7a19e650dabf8df83c31c5"},{"appid":"d3f896182b5c10b07918e295fce8c5aef054d266","name":"Searx Metasearch Engine","website":"https://searx.me","license":"https://github.com/asciimoo/searx/blob/master/LICENSE","description":"A privacy-respecting, hackable metasearch engine.","enhanced":false,"tile_background":"dark","icon":"searxmetasearchengine.png","sha":"8642e27bf7743dce8be60424c0d247c59349248b"},{"appid":"3de4f901fffb30ac720b0e7eb654b4faa2dd03fa","name":"Server","website":"https://en.wikipedia.org/wiki/Server_(computing)","license":"Commercial","description":"In computing, a server is a piece of computer hardware or software (computer program) that provides functionality for other programs or devices, called \"clients\". This architecture is called the client–server model. Servers can provide various functionalities, often called \"services\", such as sharing data or resources among multiple clients, or performing computation for a client.","enhanced":false,"tile_background":"light","icon":"server.svg","sha":"ca48815e0f88da52733ecdfedb2b70b5c6364cdf"},{"appid":"8830438516d806a81d3d2650afa14af4f61bec1f","name":"Serviio","website":"http://serviio.org","license":"Free","description":"Serviio is a free media server. It allows you to stream your media files (music, video or images) to renderer devices (e.g. a TV set, Bluray player, games console or mobile phone) on your connected home network.","enhanced":false,"tile_background":"dark","icon":"serviio.png","sha":"aece4f6bf07b369329b97ebc16dff6435808331c"},{"appid":"dc616e4c8950e8347b77334581bb126fdf171a86","name":"sftpgo","website":"https://github.com/drakkan/sftpgo","license":"GNU Affero General Public License v3.0","description":"Fully featured and highly configurable SFTP server with optional HTTP/S, FTP/S and WebDAV support. Several storage backends are supported: local filesystem, encrypted local filesystem, S3 (compatible) Object Storage, Google Cloud Storage, Azure Blob Storage, SFTP.","enhanced":false,"tile_background":"dark","icon":"sftpgo.png","sha":"58adf75c95e08657d79f62bece4909c6fd90eb3c"},{"appid":"9db4c1b8312db195c8c176f4df4b31998bf1a534","name":"Shaarli","website":"https://github.com/shaarli/Shaarli","license":"GNU General Public License v3.0 only","description":"Shaarli is a minimalist, database-free self-hosted bookmarking and link sharing service. It is designed to be personal (single-user), fast and handy.","enhanced":false,"tile_background":"dark","icon":"shaarli.png","sha":"1eddf72cf9ac0ce4eca3f3c91faaf66721003bcb"},{"appid":"dcf2874559e0304e2811c796cb873ae9aac07fa2","name":"Shinobi","website":"https://shinobi.video","license":"GNU Public License 3.0","description":"An open-source CCTV NVR for recording, monitoring, and streaming modern IP cameras. Lightweight, extremely compatible and simple to use.","enhanced":false,"tile_background":"dark","icon":"shinobi.png","sha":"e5bd076a39ffbc6f2ebc257c899a0e9b18503d0b"},{"appid":"f758b0b8b86303210695bf561763bf1d3aadfbb5","name":"Shiori","website":"https://github.com/go-shiori/shiori","license":"MIT License","description":"Shiori is a simple bookmarks manager written in the Go language. Intended as a simple clone of Pocket. You can use it as a command line application or as a web application.","enhanced":false,"tile_background":"dark","icon":"shiori.svg","sha":"5446c4f6a92f78224e520371b90d23333e848f01"},{"appid":"23829a678218110cead136b504b2f256bd4bf2c7","name":"Sickchill","website":"https://sickchill.github.io","license":"GNU General Public License v3.0 or later","description":"Automatic Video Library Manager for TV Shows. It watches for new episodes of your favorite shows, and when they are posted it does its magic.","enhanced":false,"tile_background":"light","icon":"sickchill.png","sha":"c728a2565e28952a20c5e6d0e78395b596697471"},{"appid":"675dd93307bd5235a9b5da4268f9fee3d95d6235","name":"SickGear","website":"https://github.com/SickGear/SickGear","license":"GNU General Public License v3.0 only","description":"SickGear provides management of TV shows and/or Anime, it detects new episodes, links downloader apps, and more.","enhanced":false,"tile_background":"dark","icon":"sickgear.png","sha":"3eddbe7fcd94b37e3e26b4819c987483e1d01bc9"},{"appid":"0ffe6c3e1f43f953bcfe3a5adb50759b5938aa36","name":"Slack","website":"https://slack.com","license":"Proprietary","description":"Slack is a cloud-based set of proprietary team collaboration tools and services.","enhanced":false,"tile_background":"dark","icon":"slack.svg","sha":"657035c3779aa7f2cb45c235a669d47c1d1adc83"},{"appid":"b914d6bc6d5e2eb2cb5c4722489521a6d949d8e3","name":"Snapdrop","website":"https://snapdrop.net","license":"GNU General Public License v3.0 or later","description":"Snapdrop - The easiest way to transfer files across devices. Local file sharing in your browser. Inspired by Apple's Airdrop.","enhanced":false,"tile_background":"dark","icon":"snapdrop.png","sha":"0903d13ea42e2eb06126622b8439c8a93f165f32"},{"appid":"6c050d5bdf522fa20599560ff0f6b74e7dcd97a8","name":"Snibox","website":"https://github.com/snibox/snibox","license":"MIT License","description":"Snibox is a self-hosted, single-user (for now) snippet manager. Developed to collect and organize code snippets. Supports various programming languages, markdown, plain text.","enhanced":false,"tile_background":"dark","icon":"snibox.png","sha":"71f6e2b74afc187faee6bb74f6fdea141bd308c9"},{"appid":"d143b3a76b72591495655c5257c7523456bdd736","name":"SOGo","website":"https://sogo.nu","license":"GNU GPL/LGPL v2 and above","description":"SOGo is a fully supported and trusted groupware server with a focus on scalability and open standards.","enhanced":false,"tile_background":"light","icon":"sogo.svg","sha":"cad1975771409baf1371398f9162a30cedfbc144"},{"appid":"68b3ab5f7810a9984bd8f46d53de0abf35f613f9","name":"SonarQube","website":"https://www.sonarqube.org","license":"GNU Lesser General Public License v3.0 only","description":"Catch bugs and vulnerabilities in your app, with thousands of automated Static Code Analysis rules.","enhanced":false,"tile_background":"dark","icon":"sonarqube.png","sha":"206fa3c8c4eb65a126d8476dbc80d5b04cb8cd3a"},{"appid":"6e2a525ceb737f9ed8badcef5eb20d1502e39656","name":"Sonarr","website":"https://sonarr.tv","license":"GNU General Public License v3.0 only","description":"Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.","enhanced":true,"tile_background":"dark","icon":"sonarr.svg","config":{"type":"apikey","stat1":{"name":"Missing","url":":url:api/v3/wanted/missing?sortKey=series.title&apikey=:apikey:","key":"totalRecords","filter":"none","updateOnChange":"No"},"stat2":{"name":"Queue","url":":url:api/v3/queue?apikey=:apikey:","key":null,"filter":"count","updateOnChange":"No"}},"sha":"7c9acef2ec291804d4b24aa09910ecdf39b3aba1"},{"appid":"f491c749924e2532e3b6c4496b94e03fd2b54f27","name":"Sourcegraph","website":"https://sourcegraph.com","license":"Apache License 2.0","description":"Sourcegraph is a free, open-source, self-hosted code search and navigation tool for developers. Use it with any Git code host for teams of any size.","enhanced":false,"tile_background":"dark","icon":"sourcegraph.png","sha":"ec5e692c3995ca2e8d2fb0037f5de21024163c50"},{"appid":"c106a4464d1b08d0e35edb92ddfabae6f9dc765f","name":"Speedtest Tracker","website":"https://github.com/henrywhitaker3/Speedtest-Tracker","license":"GNU General Public License v3.0 only","description":"This program runs a speedtest check every hour and graphs the results. The back-end is written in Laravel and the front-end uses React. It uses the Ookla's speedtest cli package to get the data and uses Chart.js to plot the results.","enhanced":true,"tile_background":"dark","icon":"speedtesttracker.png","sha":"f42d950a133425013650ea4081c5716d2b2c4bbd"},{"appid":"c8714150b8061714a04b8cc146c8bf0210c05b62","name":"Splunk","website":"https://splunk.com","license":"Commercial","description":"Splunk (the product) captures, indexes and correlates real-time data in a searchable repository from which it can generate graphs, reports, alerts, dashboards and visualizations.","enhanced":false,"tile_background":"dark","icon":"splunk.png","sha":"7b7e328ac8d088d2284c966fc1d7ed2ee1957d0f"},{"appid":"8d40ec161e2793d4ad3526e66d1723b2043780b6","name":"Spotweb","website":"https://github.com/spotweb/spotweb","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Spotweb is a decentralized usenet community based on the Spotnet protocol.","enhanced":true,"tile_background":"dark","icon":"spotweb.png","sha":"73078f55ab7639b9d4adf0a2fc49a18ea8157ce1"},{"appid":"dddd912a7abafef0d73bf3ca9e2575e33971c012","name":"Squidex","website":"https://squidex.io","license":"MIT License","description":"Squidex is an open source headless content management system (cms) with automatic API generation. It can manage all your backend content, for example: Dynamic elements for your mobile apps. Blog posts and articles for your website. Configuration data for your backend. Rich and structured data for your application.","enhanced":false,"tile_background":"dark","icon":"squidex.svg","sha":"b86667e15f27aafc2ac42396c4ecfe81de87f36c"},{"appid":"585815f2ee7291f96ea30333fd94d20b5722693f","name":"Stash","website":"https://github.com/stashapp/stash","license":"MIT License","description":"Stash is a Go app which organizes and serves your porn.","enhanced":true,"tile_background":"dark","icon":"stash.svg","sha":"6ae17ea4aeb77ea30cf2fe79b1ef2bba8a47c579"},{"appid":"2a7e2a851e5597e23c2be647eeda17d9105933ba","name":"Statping","website":"https://github.com/hunterlong/statping","license":"GNU General Public License v3.0 only","description":"Status Page for monitoring your websites and applications with beautiful graphs, analytics, and plugins. Run on any type of environment.","enhanced":false,"tile_background":"light","icon":"statping.png","sha":"7fd30f905f5d31ab2700242cdf34199ce4fecd19"},{"appid":"f2c4ab39ad8485316cf9f0ed6c5951629e324feb","name":"Strapi","website":"https://strapi.io","license":"MIT License","description":"Strapi is an open source headless content management system (CMS). Keep control and deliver faster. Building self-hosted, customizable and performant Content API has never been easier.","enhanced":false,"tile_background":"light","icon":"strapi.png","sha":"ca79e93074a23678b9e419f5aeb96259f17595d8"},{"appid":"3e1575bb500ee1e3bb80d84d3a8fb2d90a707ba4","name":"Streama","website":"https://github.com/streamaserver/streama","license":"MIT License","description":"Ever had a huge bookshelf full of shows and movies? Ever wanted to digitalize them, but didn't have a good way of organizing the files? Worry no more! Streama is your own personal Netflix for just such a purpose!","enhanced":false,"tile_background":"light","icon":"streama.png","sha":"cc640e6b5ccb7bcf1e33f298db82f5c7b4ddb57a"},{"appid":"0680196c9ecb05c60ff8f8e757deff6fc7260754","name":"Supermicro IPMI","website":"https://www.supermicro.com/en/solutions/management-software/ipmi-utilities","license":"Commercial","description":"IPMI is a hardware solution for controlling and managing your servers. It has significant differences and benefits compared to system diagnosis software. For example, IPMI gives you the ability to manage servers in remote physical locations regardless of the installed operating system.","enhanced":false,"tile_background":"light","icon":"supermicroipmi.png","sha":"288d0a8fc54b9043bf724c71abb6721105cda728"},{"appid":"35bc724730476a47cf18f92f486cd9e7745d4f15","name":"Sympa","website":"https://www.sympa.org","license":"GNU General Public License v2.0 only","description":"Sympa is an open source mailing list manager. It provides advanced features with a rich and secure web interface.","enhanced":false,"tile_background":"light","icon":"sympa.svg","sha":"4cabcf82554542c298264edd625bd939295a2d14"},{"appid":"361732e3fd1161330a49bebcccb955241621e1b1","name":"Synclounge","website":"https://github.com/samcm/SyncLounge","license":"MIT License","description":"SyncLounge (Previously PlexTogether) is a tool to sync Plex content across multiple players in multiple locations.","enhanced":false,"tile_background":"dark","icon":"synclounge.png","sha":"b4a1b0870b93d9844dc728f74583c6b534ea9d4c"},{"appid":"7775c3bbf580fbaf57818e68ce7b1b48b8f93b95","name":"Syncthing","website":"https://syncthing.net","license":"Mozilla Public License 2.0","description":"Syncthing is a free, open-source peer-to-peer file synchronization application. It can sync files between devices on a local network, or between remote devices over the Internet.","enhanced":true,"tile_background":"dark","icon":"syncthing.svg","sha":"b64364b0024d8fc3d5c99306b2ee29f67433a22c"},{"appid":"8521f6e426ad621f27a6b48be57a3c6056c9cfd3","name":"Synology","website":"http://synology.com","license":"commercial","description":"Synology is a popular NAS appliance","enhanced":false,"tile_background":"light","icon":"synology.png","sha":"7ed45a3c1a511c2bf94348099961db3c4a1d15a1"},{"appid":"1de00f5662a5c44f3d23b50f9e13232cdd64f667","name":"Tachidesk","website":"https://github.com/Suwayomi/Tachidesk-Server","license":"Mozilla Public License 2.0","description":"A free and open source manga reader server that runs extensions built for Tachiyomi.\r\nTachidesk is an independent Tachiyomi compatible software and is not a Fork of Tachiyomi.","enhanced":false,"tile_background":"dark","icon":"tachidesk.png","sha":"4e41a1561c4075cc5ddb57b01f222c4cbd40a900"},{"appid":"4c0f3ebde3d0c13fce8b4b02d1d80fea4123e07a","name":"Taiga","website":"https://taiga.io","license":"GNU Affero General Public License v3.0","description":"Taiga is a project management platform for agile developers & designers and project managers who want a beautiful tool that makes work truly enjoyable. It's free, open source and simple to use.","enhanced":false,"tile_background":"dark","icon":"taiga.png","sha":"fddcb12b8bd7804bed43bc9a3947f30faa715b27"},{"appid":"15f90b18166400660896d011856a88cd88d68b33","name":"Tailscale","website":"https://tailscale.com/","license":"BSD 3-Clause Clear License","description":"A secure network that just works\r\nZero config VPN. Installs on any device in minutes, manages firewall rules for you, and works from anywhere.","enhanced":false,"tile_background":"dark","icon":"tailscale.svg","sha":"326d44f9eeaeb0448d032149a4849c70f8a8e26e"},{"appid":"343eebd3e9330c34952dcb3bc5c94ba12bf07a67","name":"Tandoor Recipes","website":"https://docs.tandoor.dev","license":"GNU Affero General Public License v3.0","description":"The recipe manager that allows you to manage your ever growing collection of digital recipes.","enhanced":false,"tile_background":"light","icon":"tandoorrecipes.svg","sha":"f5f44be3b04673c08c1c0d6703d2a415191878cc"},{"appid":"44fb3ee60816316d3c253e7454f5e0ab5f46680a","name":"Tar1090","website":"https://github.com/wiedehopf/tar1090","license":"GNU General Public License v2.0 only","description":"Provides an improved webinterface for use with ADS-B decoders readsb / dump1090-fa","enhanced":true,"tile_background":"dark","icon":"tar1090.png","sha":"b7dbf0ca6d6d3972df0a9a6994859d3bbd38b3c9"},{"appid":"0c0c3373606e00d765583eaf1fc2c1bca6c09df3","name":"Tartube","website":"https://github.com/axcore/tartube","license":"GNU General Public License v3.0 only","description":"Tartube is a GUI front-end for youtube-dl, yt-dlp and other compatible video downloaders.","enhanced":false,"tile_background":"dark","icon":"tartube.png","sha":"9ebe50a73d0fe0ab2de2ca7cb907c634bc420c0b"},{"appid":"ecf26dc5795ae2ccb3afbfa44570237590d65145","name":"TasmoAdmin","website":"https://github.com/reloxx13/TasmoAdmin","license":"GNU General Public License v3.0 only","description":"TasmoAdmin (previously SonWEB) is an administrative Website for Devices flashed with Tasmota.","enhanced":false,"tile_background":"dark","icon":"tasmoadmin.png","sha":"fedfcb5860140f024d45bba4f2230b7c3237c9d7"},{"appid":"0d318b04d2442102c6a9643405bce18b5df5cf78","name":"Tasmota","website":"https://github.com/arendst/Tasmota","license":"GNU General Public License v3.0 or later","description":"Alternative firmware for ESP8266 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX.","enhanced":true,"tile_background":"light","icon":"tasmota.png","sha":"9245b9eaaa799e7e09479e3ef9c1d01c6b48a48a"},{"appid":"93ce76191583a25ac33c1918c5ad0b8a5f260451","name":"Tautulli","website":"https://tautulli.com","license":"GNU General Public License v3.0 only","description":"A python based web application for monitoring, analytics and notifications for Plex Media Server.","enhanced":true,"tile_background":"light","icon":"tautulli.png","sha":"9b2fe13f9368b248262877dd5263fab9282bdc11"},{"appid":"279db11ace3924a4a2a36dfd59a34e3bd352a5b4","name":"Tdarr","website":"https://github.com/HaveAGitGat/Tdarr","license":"GNU General Public License v3.0 only","description":"Tdarr is a self hosted web-app for automating media library transcode/remux management and making sure your files are exactly how you need them to be in terms of codecs/streams/containers etc. Designed to work alongside Sonarr/Radarr and built with the aim of modularisation, parallelisation and scalability, each library you add has its own transcode settings, filters and schedule. Workers can be fired up and closed down as necessary, and are split into 3 types - 'general', 'transcode' and 'health check'. Worker limits can be managed by the scheduler as well as manually. For a desktop application with similar functionality please see HBBatchBeast.","enhanced":true,"tile_background":"dark","icon":"tdarr.png","sha":"d14e578db58d5e0955562c6baea38d71eedc821b"},{"appid":"fe8ca35ebcfc6fa1fc949fbcac58e083a19f6381","name":"Technitium DNS","website":"https://technitium.com/dns","license":"GNU General Public License v3.0 only","description":"Technitium DNS Server is an open source authoritative as well as recursive DNS server that can be used for self hosting a DNS server for privacy & security. It works out-of-the-box with no or minimal configuration and provides a user friendly web console accessible using any modern web browser.","enhanced":false,"tile_background":"dark","icon":"technitiumdns.png","sha":"d190ff08f6fbf527f42137f7e15f35843052b94a"},{"appid":"18bd5c19b49acc0a5030708e664fb1ed249a8fa5","name":"Teedy","website":"https://teedy.io","license":"GNU General Public License v2.0 only","description":"Teedy is a lightweight document management system packed with all the features you can expect from big expensive solutions but still easy to use.","enhanced":false,"tile_background":"dark","icon":"teedy.png","sha":"f8fa2e0ab53c09ff53bb98ccc66e986d6bbfd17a"},{"appid":"5023ad25cdb679ee3bf1e659434da75ec0177924","name":"The Lounge","website":"https://thelounge.chat","license":"MIT License","description":"Modern multi-user web IRC client designed for self-hosting","enhanced":false,"tile_background":"dark","icon":"thelounge.png","sha":"ac89ff436616f5de776706c2e92f5794afb12f9f"},{"appid":"9a83dce0e30910276872015367d926660780e6d8","name":"Tiny Tiny RSS","website":"https://tt-rss.org","license":"GNU General Public License v3.0 only","description":"Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator","enhanced":false,"tile_background":"light","icon":"tinytinyrss.png","sha":"300e50fca8ea4bcf29fcb840f93377918911d603"},{"appid":"67f7ed18fb98b30dc7ee328877f789de10be4227","name":"Traccar","website":"https://www.traccar.org","license":"Apache License 2.0","description":"Server software for GPS tracking including device communication back-end and web interface","enhanced":false,"tile_background":"light","icon":"traccar.png","sha":"96484e0846cad8902ddefe31149f30cd0edc56ee"},{"appid":"a83e2ce54bbef3bef63aa7f02b08dbda7fdae4c5","name":"Traefik","website":"https://traefik.io","license":"MIT License","description":"Træfik is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Træfik integrates with your existing infrastructure components and configures itself automatically and dynamically.","enhanced":true,"tile_background":"dark","icon":"traefik.svg","sha":"64a2f7cf7d07db4c532d4bc4bddca266279a54f6"},{"appid":"34899a33e3d7e33e1966b921ea250350fc71591a","name":"Transmission","website":"https://transmissionbt.com","license":"GNU General Public License v3.0 only","description":"Transmission is a BitTorrent client which features a variety of user interfaces on top of a cross-platform back-end.","enhanced":true,"tile_background":"dark","icon":"transmission.svg","sha":"4d2e168c639325f0b7d4804e9a5722eba763a6ed"},{"appid":"3add4f3aea6cc6eb1ec164d73b6935ce454b8f16","name":"Trilium","website":"https://github.com/zadam/trilium","license":"GNU Affero General Public License v3.0","description":"Build your personal knowledge base with Trilium Notes.","enhanced":false,"tile_background":"dark","icon":"trilium.png","sha":"cff34654b67f797e4d170eeda8e799428b3e75f8"},{"appid":"07f6df4f81edd2e3dadf7e5fb56c37d6fb8acef4","name":"TrueNAS","website":"https://www.truenas.com","license":"BSD-2-Clause","description":"TrueNAS is an embedded open source network-attached storage (NAS) operating system based on FreeBSD.","enhanced":false,"tile_background":"light","icon":"truenas.png","sha":"61891aa450499ec2f06da2169017f09d27ee9134"},{"appid":"a1e408cd7144157cd6400993af4f68046bf77fd5","name":"TrueNAS CORE","website":"https://www.truenas.com/truenas-core","license":"BSD 2-Clause FreeBSD License","description":"TrueNAS CORE is enterprise-quality software-defined storage that can be used without restrictions or cost. It is also the core of the full-fledged enterprise edition, TrueNAS Enterprise, which provides the additional fault-tolerance, performance, and support that businesses and critical applications require.","enhanced":true,"tile_background":"dark","icon":"truenascore.png","sha":"26285392372c65828a3ee3a496fd856219a604f5"},{"appid":"ac61e1834dac0f75ea1ab6d3a23976ffc4f46b74","name":"TVHeadend","website":"https://tvheadend.org","license":"GNU General Public License v3.0 only","description":"TVHeadend, sometimes TVH for short, is a server application that reads video streams from LinuxTV sources and publishes them as internet streams.","enhanced":false,"tile_background":"dark","icon":"tvheadend.png","sha":"8b794120d61386d753e0c2832dd92565e093f5dd"},{"appid":"6bf857ca7de026fbed4ae790a809a0ea640901f4","name":"TYPO3","website":"https://typo3.org","license":"GNU General Public License v2.0 or later","description":"The Professional, Flexible Content Management System.\nTYPO3 CMS is an Open Source Enterprise Content Management System with a large global community, backed by the approximately 900 members of the TYPO3 Association.","enhanced":false,"tile_background":"light","icon":"typo3.svg","sha":"2a4475f2a35c56a6db531172dfb539a261e0c7fa"},{"appid":"cf79bd157a6af435240abdd8fbf9afb5f09abb7d","name":"Ubooquity","website":"https://vaemendis.net/ubooquity","license":"MIT License","description":"Ubooquity is a free, lightweight and easy-to-use home server for your comics and ebooks. Use it to access your files from anywhere, with a tablet, an e-reader, a phone or a computer.","enhanced":false,"tile_background":"dark","icon":"ubooquity.png","sha":"1b76801606353882947771fd24d1ace3a01f85fa"},{"appid":"8cdba423d7bb49fad21662247750cd715f08cdc5","name":"UniFi","website":"https://unifi-sdn.ubnt.com","license":"Unknown","description":"The UniFi® Controller software is a powerful, enterprise wireless software engine ideal for high-density client deployments requiring low latency and high uptime performance.","enhanced":false,"tile_background":"light","icon":"unifi.png","sha":"4674018d5ac0b28c8de523ee6fd02b1a49b1dc18"},{"appid":"c4727509e4ae21f95d5ba4634add6742e8520b2d","name":"Unmanic","website":"https://docs.unmanic.app/","license":"GNU Affero General Public License v3.0 or later","description":"Unmanic is a simple tool for optimising your file library. You can use it to convert your files into a single, uniform format, manage file movements based on timestamps, or execute custom commands against a file based on its file size.","enhanced":false,"tile_background":"dark","icon":"unmanic.png","sha":"a05310b2f1ca02fcbeac443a73b59d37792be051"},{"appid":"11b790731286c7538e27885bc827dc6f6ceb8db2","name":"Unraid","website":"https://unraid.net","license":"Proprietary","description":"Unraid is software for storing and managing digital files on a mass-storage server. It is an embedded Network Attached Storage (NAS) server operating system.","enhanced":false,"tile_background":"dark","icon":"unraid.png","sha":"26fb9cc31ce6c1632a6a3abea3e5ce872905454f"},{"appid":"366c6646eedab83cc4b349f198424d2291cbfa76","name":"Uptime Kuma","website":"https://uptime.kuma.pet","license":"MIT License","description":"It is a self-hosted monitoring tool like \"Uptime Robot\".","enhanced":false,"tile_background":"dark","icon":"uptimekuma.svg","sha":"1a821df186a61f777d7a58ab6877c35be37b9f99"},{"appid":"89f71687e2a69d7c9432b2ee76a9b638306e9fd5","name":"UrBackup","website":"https://www.urbackup.org","license":"GNU Affero General Public License v3.0 or later","description":"UrBackup is an easy to setup Open Source client/server backup system, that through a combination of image and file backups accomplishes both data safety and a fast restoration time.\r\nFile and image backups are made while the system is running without interrupting current processes.\r\nUrBackup also continuously watches folders you want backed up in order to quickly find differences to previous backups. Because of that, incremental file backups are really fast.\r\nYour files can be restored through the web interface, via the client or the Windows Explorer while the backups of drive volumes can be restored with a bootable CD or USB-Stick (bare metal restore).","enhanced":true,"tile_background":"light","icon":"urbackup.png","sha":"cbe757a6700008ea258844818888700e98e035be"},{"appid":"5f0180fbeccdee64f7314b367e87e6994089f199","name":"ViMbAdmin","website":"https://www.vimbadmin.net","license":"GNU General Public License v3.0 only","description":"The ViMbAdmin project (vim-be-admin) provides a web based virtual mailbox administration system allowing mail administrators to manage domains, mailboxes and aliases.","enhanced":false,"tile_background":"light","icon":"vimbadmin.jpeg","sha":"ce3bb5bf04fbe995217a6f91ab9ba3c140a2abf0"},{"appid":"62484a2ddd0930286322c0a4364dd404951a1070","name":"Virtualmin","website":"https://www.virtualmin.com","license":"GNU General Public License v3.0 only","description":"Virtualmin is a domain hosting and website control panel, which gives the ability to create and manage many domains. As well as simplify both automation and tasks.","enhanced":false,"tile_background":"dark","icon":"virtualmin.svg","sha":"9fc4ef8f6f8dfa53982a0da3e8c1f83f2aa22223"},{"appid":"c934574c40a11992b08ce4e659ca23310916436c","name":"Virtual Radar Server","website":"https://www.virtualradarserver.co.uk","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Virtual Radar Server is an open-source .NET application that runs a local web server. You can connect to the web server with any modern browser and see the aircraft plotted on a map. You will need a radio that is capable of receiving Mode-S transmissions. Virtual Radar Server was written and tested using Kinetic Avionic's SBS-1er and SBS-3 radios but it will work with any receiver or SDR that can produce the Kinetic text message format, Kinetic's SBS-3 binary format, the AVR \"*\", \"@\" or \":\" formats or the Mode-S Beast binary format.","enhanced":false,"tile_background":"light","icon":"virtualradarserver.png","sha":"50da3a7286434f745b62d181835e2eda8da5f39d"},{"appid":"39d2762d5690a6ebeb6ac1615d3ee5d58b07ab7e","name":"VMware ESXi","website":"https://www.vmware.com/products/esxi-and-esx.html","license":"Commercial","description":"VMware ESXi is an enterprise-class, type-1 hypervisor developed by VMware for deploying and serving virtual computers. As a type-1 hypervisor, ESXi is not a software application that is installed on an operating system; instead, it includes and integrates vital OS components, such as a kernel.","enhanced":false,"tile_background":"dark","icon":"vmwareesxi.png","sha":"02d5d658506b10a2becaf8fd7155d3a748b8fc78"},{"appid":"b63d3ad41413da4056fbae6dc0ebc190668b3545","name":"vmware horizon","website":"https://www.vmware.com/products/horizon.html","license":"Commercial","description":"desktop and app virtualization.","enhanced":false,"tile_background":"dark","icon":"vmwarehorizon.png","sha":"bd7fb860f4367dff4156d91ef99df95a1616449e"},{"appid":"a0a47ab17060b3437e3f16fed9cae275c7e8d43a","name":"VMware vCenter","website":"https://www.vmware.com/products/vcenter-server.html","license":"Proprietary","description":"VMware vCenter Server provides a centralized platform for managing your VMware vSphere environments, allowing you to automate and deliver a virtual infrastructure across the hybrid cloud with confidence.","enhanced":false,"tile_background":"light","icon":"vmwarevcenter.png","sha":"184f94e677aa74b1b82bb9b719f7c460b9e3bf9b"},{"appid":"90c60ebc78d163e508d41233af19bf9b31706012","name":"Volumio","website":"https://volumio.org","license":"GNU General Public License v3.0 only","description":"Volumio is an open source audiophile music player. It is designed and fine-tuned for high-quality music playback and it runs on a variety of devices such as Raspberry PI and other microcomputers as well as PCs and Notebooks.","enhanced":true,"tile_background":"light","icon":"volumio.png","sha":"34c8b66f5c242ba69daa2013262e07efe035213c"},{"appid":"095afe286edc44dd8241e7a33138bc6d","name":"VuPlus","website":"http://vuplus.com","license":"commercial","description":"The Vu+ (pronounced VuPlus), is a series of Linux-powered DVB satellite, terrestrial digital television receivers (set-top box)","enhanced":true,"tile_background":"light","icon":"vuplus.png","sha":"571403bf6532b04a3089efa87616425fec95da63"},{"appid":"9dc07af7d1d88c183c6ae42c903650ab19ada2bb","name":"Wallabag","website":"https://www.wallabag.org/en","license":"MIT License","description":"Wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.","enhanced":false,"tile_background":"dark","icon":"wallabag.png","sha":"744b77d7fee77b7bb69aa4e44c0e24b659a73287"},{"appid":"dc115cfaac280c4b97289484356c21428af565be","name":"WaniKani","website":"https://www.wanikani.com","license":"Proprietary","description":"WaniKani is a Japanese radicals, kanji, and vocabulary learning web app that uses mnemonics and SRS to make kanji learning simple.","enhanced":true,"tile_background":"light","icon":"wanikani.png","sha":"2044856b59943a5a213992d63d6afe9d8e694234"},{"appid":"785ad2ec16dcf34b4fc83b025b930818c6372567","name":"Watcher","website":"https://github.com/nosmokingbandit/Watcher3","license":"Apache License 2.0","description":"Watcher is an automated movie NZB & Torrent searcher and snatcher. You can add a list of wanted movies and Watcher will automatically send the NZB or Torrent to your download client.","enhanced":false,"tile_background":"dark","icon":"watcher.png","sha":"9c23f9318cc83bfce10a85de92e5c7f27be37be0"},{"appid":"b9726e44ef09db12f6e010af8977d55dc971b841","name":"Webmin","website":"http://www.webmin.com","license":"BSD 3-Clause \"New\" or \"Revised\" License","description":"Webmin is a web-based system configuration tool for Unix-like systems, although recent versions can also be installed and run on Windows.","enhanced":false,"tile_background":"dark","icon":"webmin.svg","sha":"ae385ef7f7bf3b42985deebb1bafdf5e3421c869"},{"appid":"11915e3ab4fbb44453d956eb4d5163cad8050d6b","name":"WebTools","website":"https://github.com/ukdtom/WebTools.bundle","license":"Mozilla Public License 2.0","description":"WebTools is a collection of tools for Plex Media Server. Like the Unsupported AppStore (UAS)","enhanced":false,"tile_background":"dark","icon":"webtools.png","sha":"6e6e1094038e5ed99a9fc605b83a20941a423e60"},{"appid":"b4021dd275593e7b96610fc7b6300af8cdca8765","name":"Wekan","website":"https://wekan.github.io","license":"MIT License","description":"Wekan is an open source, collaborative kanban board application.","enhanced":false,"tile_background":"dark","icon":"wekan.png","sha":"b290d27bf0326d13eaa57877c181e65af0624807"},{"appid":"9b4e87ab376cf2327facda32fa98617676dfccd9","name":"Wetty","website":"https://github.com/krishnasrinivas/wetty","license":"MIT License","description":"WeTTy = Web + TTy. Terminal web app in browser over http/https. (Ajaxterm/Anyterm alternative, but much better). WeTTy is an alternative to ajaxterm and anyterm but much better than them because WeTTy uses xterm.js which is a full fledged implementation of terminal emulation written entirely in JavaScript. WeTTy uses websockets rather then Ajax and hence better response time.","enhanced":false,"tile_background":"dark","icon":"wetty.png","sha":"495a893f3f35c2a8f8521f4c851531a616dc57d2"},{"appid":"daec766cafab4e5297d8c2359810b3dfcc7626fd","name":"Wg Gen Web","website":"https://github.com/vx3r/wg-gen-web","license":"Do What The F*ck You Want To Public License","description":"Simple Web based configuration generator for WireGuard","enhanced":false,"tile_background":"dark","icon":"wggenweb.png","sha":"3ed31bfa06f79702370dea4504bc0cc41c075b16"},{"appid":"170b7d7a0634e8d51a768a113f00d7601fa9b182","name":"Whoogle","website":"https://github.com/benbusby/whoogle-search","license":"MIT License","description":"A self-hosted, ad-free, privacy-respecting metasearch engine. Get Google search results, but without any ads, javascript, AMP links, cookies, or IP address tracking.","enhanced":false,"tile_background":"light","icon":"whoogle.png","sha":"daf3ff7e2e37be013380072032a38989728e7289"},{"appid":"cf796459bad1da470debfed16506e47aab347dbe","name":"Wiki.js","website":"https://wiki.js.org","license":"GNU Affero General Public License v3.0","description":"Wiki.js | A modern, lightweight and powerful wiki app built on Node.js","enhanced":false,"tile_background":"light","icon":"wikijs.png","sha":"9f02b5f002c77b389cbfc70d08a97dd9392baa3d"},{"appid":"9d3283ea8d3bb69f327af06870657a63ab3bbf6d","name":"Windows Admin Center","website":"https://www.microsoft.com/en-us/windows-server/windows-admin-center","license":"Proprietary","description":"Windows Admin Center is a locally deployed, browser-based app for managing Windows servers, clusters, hyper-converged infrastructure, as well as Windows 10 PCs. It is a free product and is ready to use in production.","enhanced":false,"tile_background":"dark","icon":"windowsadmincenter.png","sha":"131d31d0d716bf679ce7832c607d6369160eed01"},{"appid":"afef2217e82ee20638490bb102605f6e09789093","name":"WireGuard","website":"https://www.wireguard.com","license":"CNRI Python Open Source GPL Compatible License Agreement","description":"WireGuard® is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It aims to be faster, simpler, leaner, and more useful than IPsec, while avoiding the massive headache. It intends to be considerably more performant than OpenVPN. WireGuard is designed as a general purpose VPN for running on embedded interfaces and super computers alike, fit for many different circumstances. Initially released for the Linux kernel, it is now cross-platform (Windows, macOS, BSD, iOS, Android) and widely deployable. It is currently under heavy development, but already it might be regarded as the most secure, easiest to use, and simplest VPN solution in the industry.","enhanced":false,"tile_background":"dark","icon":"wireguard.png","sha":"3e50432e66a90f20f8987d590b5e5e736654912a"},{"appid":"ac894a3a9399f135f6eb87f27fb742c71189cc86","name":"WLED","website":"https://wled.me","license":"MIT License","description":"A fast and feature-rich implementation of an ESP8266/ESP32 webserver to control NeoPixel (WS2812B, WS2811, SK6812) LEDs or also SPI based chipsets like the WS2801 and APA102! More Info see wled.me","enhanced":false,"tile_background":"dark","icon":"wled.png","sha":"ba0039103f2df79df329b5c47518dd8bfa14a235"},{"appid":"b1909932aac1c5510c044de0cb8c0f3ef049a250","name":"WordPress","website":"https://wordpress.org","license":"GNU General Public License v2.0 only","description":"WordPress is open source software you can use to create a beautiful website, blog, or app.","enhanced":false,"tile_background":"dark","icon":"wordpress.svg","sha":"bb234b8744e52e95915f8796f2958485a28b5a75"},{"appid":"d1d0f952ebdcb6b8918bdd7ddbf55793dca5fa93","name":"Xen-Orchestra","website":"https://xen-orchestra.com","license":"GNU Affero General Public License v3.0","description":"XO is a web interface to visualize and administer your XenServer (or XAPI enabled) hosts.","enhanced":false,"tile_background":"dark","icon":"xenorchestra.png","sha":"ded11df2cc3ffcd1f3f2de94cb842272a040df2d"},{"appid":"8304785b9937bf6d4e04c2d7aaa786b3577fb10c","name":"Xigmanas","website":"https://www.xigmanas.com","license":"BSD 2-Clause \"Simplified\" License","description":"XigmaNAS is an Open Source Storage NAS (Network-Attached Storage) distribution based on FreeBSD.","enhanced":false,"tile_background":"dark","icon":"xigmanas.png","sha":"8f3a41a79f5d3779f5a059e6b0e3309659a5bc43"},{"appid":"cb6a8a853393228efd2b7b1963f50d56b7f0d818","name":"xTeVe","website":"https://xteve.de","license":"MIT License","description":"M3U Proxy for Plex DVR and Emby Live TV","enhanced":false,"tile_background":"dark","icon":"xteve.png","sha":"ed7ba523cca7d3321036dfdd677f91fe07d66e16"},{"appid":"991894ca059d0faa7400a50c0aefb30d252346e7","name":"XWiki","website":"https://www.xwiki.org","license":"GNU Lesser General Public License v2.1 only","description":"Advanced Open Source Enterprise Wiki","enhanced":false,"tile_background":"light","icon":"xwiki.png","sha":"e303c430690c851d926b4676b8911e424b950e75"},{"appid":"56eb3a3ec734e5a66d4f1746ef58961d266fdabe","name":"Yacht","website":"https://github.com/SelfhostedPro/Yacht","license":"MIT License","description":"Yacht is a container management UI with a focus on templates and 1-click deployments.","enhanced":false,"tile_background":"dark","icon":"yacht.svg","sha":"0cbce465b84f959ae1067619e7975f84917bba15"},{"appid":"d5dc44619c761e1012648613619006016a669ee7","name":"YNAB","website":"https://www.youneedabudget.com","license":"Commercial","description":"You Need a Budget (YNAB) (pronounced Why-nab) is an multi-platform personal budgeting program based on the envelope method.","enhanced":false,"tile_background":"light","icon":"ynab.png","sha":"b15c381619a5c87330370591f5c6a9712bc70433"},{"appid":"f23460c5b2dba5711733151081cd82ecc9106964","name":"YOURLS","website":"https://yourls.org","license":"MIT License","description":"YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener, on your server. You'll have full control over your data, detailed stats, analytics, plugins, and more. It's free and open-source.","enhanced":false,"tile_background":"dark","icon":"yourls.svg","sha":"0602df71ffb1b32297d84189013b89b12c0a42aa"},{"appid":"6c87650cad54af69bf838f03b190280f7537c03d","name":"Your Spotify","website":"https://github.com/Yooooomi/your_spotify","license":"MIT License","description":"Your Spotify is a self-hosted application that tracks what you listen and offers you a dashboard to explore statistics about it! It's composed of a web server which polls the Spotify API every now and then and a web application on which you can explore your statistics.","enhanced":false,"tile_background":"light","icon":"yourspotify.svg","sha":"50517acff65910363fc0cfcf9c63c1c93dbc1e43"},{"appid":"6e4a451c7c654ae2bc5c75689e690966a5fd29ee","name":"youtube-dl","website":"https://youtube-dl.org","license":"The Unlicense","description":"youtube-dl is a command-line program to download videos from YouTube.com and a few more sites","enhanced":false,"tile_background":"light","icon":"youtubedl.png","sha":"060930194ff512aa6a277e4eb1a48ea085234dd0"},{"appid":"19132c3f80c33d38bbe4c51828f05b081e9f66cd","name":"Zabbix","website":"https://www.zabbix.com","license":"GNU General Public License v2.0 only","description":"Zabbix is a mature and effortless enterprise-class open source monitoring solution for network monitoring and application monitoring of millions of metrics.","enhanced":false,"tile_background":"dark","icon":"zabbix.svg","sha":"1b838ae2e84a07da6f386420aa4e0ceb0acb8ee5"},{"appid":"4caf560ca51d18d1be6dd09a48fafa883c293462","name":"Zammad","website":"https://zammad.org","license":"GNU Affero General Public License v3.0","description":"Zammad is a web-based, open source user support/ticketing solution.","enhanced":false,"tile_background":"dark","icon":"zammad.svg","sha":"108ec3c912971887099fd6adedbf16b08cd0fd27"},{"appid":"563c45bed29a24c1a1a2981af1a93bdeb692713b","name":"ZNC","website":"https://wiki.znc.in/ZNC","license":"Apache License","description":"IRC bouncer","enhanced":false,"tile_background":"dark","icon":"znc.png","sha":"e2ec564eb48581dd242666ada001b8a9b41fe6b4"},{"appid":"e7ebe523e3dcf616e0553e60747f415d47a6fe22","name":"ZoneMinder","website":"https://zoneminder.com","license":"GNU General Public License v2.0 only","description":"A full-featured, open source, state-of-the-art video surveillance software system.\r\n\r\nMonitor your home, office, or wherever you want. Using off the shelf hardware with any camera, you can design a system as large or as small as you need.","enhanced":false,"tile_background":"dark","icon":"zoneminder.png","sha":"a5f0618059a438fecd54472d34d0b78e1eefbe63"},{"appid":"d17139efd0d8e0cba9bf8380c9818838911dfe0f","name":"Zulip","website":"https://zulipchat.com","license":"Apache License 2.0","description":"Powerful open source team chat. Zulip combines the immediacy of real-time chat with an email threading model. With Zulip, you can catch up on important conversations while ignoring irrelevant ones.","enhanced":false,"tile_background":"light","icon":"zulip.png","sha":"1d50d45b25f255a9eda0524b6951c3808970a39e"}]} \ No newline at end of file diff --git a/vendor/bin/carbon b/vendor/bin/carbon deleted file mode 100644 index d6da140b..00000000 --- a/vendor/bin/carbon +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'); - exit(0); - } -} - -include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon'; diff --git a/vendor/bin/carbon b/vendor/bin/carbon new file mode 120000 index 00000000..0da48041 --- /dev/null +++ b/vendor/bin/carbon @@ -0,0 +1 @@ +../nesbot/carbon/bin/carbon \ No newline at end of file diff --git a/vendor/bin/carbon.bat b/vendor/bin/carbon.bat deleted file mode 100644 index 806cf153..00000000 --- a/vendor/bin/carbon.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/carbon -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/patch-type-declarations b/vendor/bin/patch-type-declarations deleted file mode 100644 index 36cc892e..00000000 --- a/vendor/bin/patch-type-declarations +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/error-handler/Resources/bin/patch-type-declarations'); - exit(0); - } -} - -include __DIR__ . '/..'.'/symfony/error-handler/Resources/bin/patch-type-declarations'; diff --git a/vendor/bin/patch-type-declarations b/vendor/bin/patch-type-declarations new file mode 120000 index 00000000..98f2f31e --- /dev/null +++ b/vendor/bin/patch-type-declarations @@ -0,0 +1 @@ +../symfony/error-handler/Resources/bin/patch-type-declarations \ No newline at end of file diff --git a/vendor/bin/patch-type-declarations.bat b/vendor/bin/patch-type-declarations.bat deleted file mode 100644 index 2b070796..00000000 --- a/vendor/bin/patch-type-declarations.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/patch-type-declarations -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse deleted file mode 100755 index 80f0e486..00000000 --- a/vendor/bin/php-parse +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'); - exit(0); - } -} - -include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse'; diff --git a/vendor/bin/php-parse b/vendor/bin/php-parse new file mode 120000 index 00000000..062d66a3 --- /dev/null +++ b/vendor/bin/php-parse @@ -0,0 +1 @@ +../nikic/php-parser/bin/php-parse \ No newline at end of file diff --git a/vendor/bin/php-parse.bat b/vendor/bin/php-parse.bat deleted file mode 100644 index 2c5096dc..00000000 --- a/vendor/bin/php-parse.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/php-parse -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/psysh b/vendor/bin/psysh deleted file mode 100755 index c10304ba..00000000 --- a/vendor/bin/psysh +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/psy/psysh/bin/psysh'); - exit(0); - } -} - -include __DIR__ . '/..'.'/psy/psysh/bin/psysh'; diff --git a/vendor/bin/psysh b/vendor/bin/psysh new file mode 120000 index 00000000..3c06b1ae --- /dev/null +++ b/vendor/bin/psysh @@ -0,0 +1 @@ +../psy/psysh/bin/psysh \ No newline at end of file diff --git a/vendor/bin/psysh.bat b/vendor/bin/psysh.bat deleted file mode 100644 index 2f47770e..00000000 --- a/vendor/bin/psysh.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/psysh -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/bin/var-dump-server b/vendor/bin/var-dump-server deleted file mode 100755 index 527f3ed4..00000000 --- a/vendor/bin/var-dump-server +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env php -realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); - $this->position = 0; - - return (bool) $this->handle; - } - - public function stream_read($count) - { - $data = fread($this->handle, $count); - - if ($this->position === 0) { - $data = preg_replace('{^#!.*\r?\n}', '', $data); - } - - $this->position += strlen($data); - - return $data; - } - - public function stream_cast($castAs) - { - return $this->handle; - } - - public function stream_close() - { - fclose($this->handle); - } - - public function stream_lock($operation) - { - return $operation ? flock($this->handle, $operation) : true; - } - - public function stream_seek($offset, $whence) - { - if (0 === fseek($this->handle, $offset, $whence)) { - $this->position = ftell($this->handle); - return true; - } - - return false; - } - - public function stream_tell() - { - return $this->position; - } - - public function stream_eof() - { - return feof($this->handle); - } - - public function stream_stat() - { - return array(); - } - - public function stream_set_option($option, $arg1, $arg2) - { - return true; - } - - public function url_stat($path, $flags) - { - $path = substr($path, 17); - if (file_exists($path)) { - return stat($path); - } - - return false; - } - } - } - - if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) { - include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'); - exit(0); - } -} - -include __DIR__ . '/..'.'/symfony/var-dumper/Resources/bin/var-dump-server'; diff --git a/vendor/bin/var-dump-server b/vendor/bin/var-dump-server new file mode 120000 index 00000000..6bd4e93d --- /dev/null +++ b/vendor/bin/var-dump-server @@ -0,0 +1 @@ +../symfony/var-dumper/Resources/bin/var-dump-server \ No newline at end of file diff --git a/vendor/bin/var-dump-server.bat b/vendor/bin/var-dump-server.bat deleted file mode 100644 index 94333da5..00000000 --- a/vendor/bin/var-dump-server.bat +++ /dev/null @@ -1,5 +0,0 @@ -@ECHO OFF -setlocal DISABLEDELAYEDEXPANSION -SET BIN_TARGET=%~dp0/var-dump-server -SET COMPOSER_RUNTIME_BIN_DIR=%~dp0 -php "%BIN_TARGET%" %* diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 912e4225..30612982 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -92,7 +92,6 @@ return array( 'App\\SupportedApps\\Drone\\Drone' => $baseDir . '/app/SupportedApps/Drone/Drone.php', 'App\\SupportedApps\\Droppy\\Droppy' => $baseDir . '/app/SupportedApps/Droppy/Droppy.php', 'App\\SupportedApps\\Duplicacy\\Duplicacy' => $baseDir . '/app/SupportedApps/Duplicacy/Duplicacy.php', - 'App\\SupportedApps\\Duplicati\\Duplicati' => $baseDir . '/app/SupportedApps/Duplicati/Duplicati.php', 'App\\SupportedApps\\ESPHome\\ESPHome' => $baseDir . '/app/SupportedApps/ESPHome/ESPHome.php', 'App\\SupportedApps\\Element\\Element' => $baseDir . '/app/SupportedApps/Element/Element.php', 'App\\SupportedApps\\EmbyStat\\EmbyStat' => $baseDir . '/app/SupportedApps/EmbyStat/EmbyStat.php', @@ -100,6 +99,7 @@ return array( 'App\\SupportedApps\\FileBrowser\\FileBrowser' => $baseDir . '/app/SupportedApps/FileBrowser/FileBrowser.php', 'App\\SupportedApps\\FileFlows\\FileFlows' => $baseDir . '/app/SupportedApps/FileFlows/FileFlows.php', 'App\\SupportedApps\\FileRun\\FileRun' => $baseDir . '/app/SupportedApps/FileRun/FileRun.php', + 'App\\SupportedApps\\Firefly3\\Firefly3' => $baseDir . '/app/SupportedApps/Firefly3/Firefly3.php', 'App\\SupportedApps\\Firefly\\Firefly' => $baseDir . '/app/SupportedApps/Firefly/Firefly.php', 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => $baseDir . '/app/SupportedApps/FirefoxSend/FirefoxSend.php', 'App\\SupportedApps\\FlexGet\\FlexGet' => $baseDir . '/app/SupportedApps/FlexGet/FlexGet.php', @@ -297,7 +297,6 @@ return array( 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => $baseDir . '/app/SupportedApps/TarTenNinety/TarTenNinety.php', 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => $baseDir . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php', 'App\\SupportedApps\\Tasmota\\Tasmota' => $baseDir . '/app/SupportedApps/Tasmota/Tasmota.php', - 'App\\SupportedApps\\Tautulli\\Tautulli' => $baseDir . '/app/SupportedApps/Tautulli/Tautulli.php', 'App\\SupportedApps\\Tdarr\\Tdarr' => $baseDir . '/app/SupportedApps/Tdarr/Tdarr.php', 'App\\SupportedApps\\TechnitiumDNS\\TechnitiumDNS' => $baseDir . '/app/SupportedApps/TechnitiumDNS/TechnitiumDNS.php', 'App\\SupportedApps\\Teedy\\Teedy' => $baseDir . '/app/SupportedApps/Teedy/Teedy.php', @@ -402,6 +401,7 @@ return array( 'Carbon\\Exceptions\\BadFluentConstructorException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', 'Carbon\\Exceptions\\BadFluentSetterException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', 'Carbon\\Exceptions\\BadMethodCallException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\EndLessPeriodException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', 'Carbon\\Exceptions\\Exception' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', 'Carbon\\Exceptions\\ImmutableException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', 'Carbon\\Exceptions\\InvalidArgumentException' => $vendorDir . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', @@ -1307,6 +1307,7 @@ return array( 'GuzzleHttp\\Psr7\\StreamWrapper' => $vendorDir . '/guzzlehttp/psr7/src/StreamWrapper.php', 'GuzzleHttp\\Psr7\\UploadedFile' => $vendorDir . '/guzzlehttp/psr7/src/UploadedFile.php', 'GuzzleHttp\\Psr7\\Uri' => $vendorDir . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriComparator' => $vendorDir . '/guzzlehttp/psr7/src/UriComparator.php', 'GuzzleHttp\\Psr7\\UriNormalizer' => $vendorDir . '/guzzlehttp/psr7/src/UriNormalizer.php', 'GuzzleHttp\\Psr7\\UriResolver' => $vendorDir . '/guzzlehttp/psr7/src/UriResolver.php', 'GuzzleHttp\\Psr7\\Utils' => $vendorDir . '/guzzlehttp/psr7/src/Utils.php', @@ -2792,6 +2793,7 @@ return array( 'Mockery\\Undefined' => $vendorDir . '/mockery/mockery/library/Mockery/Undefined.php', 'Mockery\\VerificationDirector' => $vendorDir . '/mockery/mockery/library/Mockery/VerificationDirector.php', 'Mockery\\VerificationExpectation' => $vendorDir . '/mockery/mockery/library/Mockery/VerificationExpectation.php', + 'Monolog\\Attribute\\AsMonologProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php', 'Monolog\\DateTimeImmutable' => $vendorDir . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', 'Monolog\\ErrorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/ErrorHandler.php', 'Monolog\\Formatter\\ChromePHPFormatter' => $vendorDir . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', @@ -2825,6 +2827,7 @@ return array( 'Monolog\\Handler\\DoctrineCouchDBHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', 'Monolog\\Handler\\DynamoDbHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', 'Monolog\\Handler\\ElasticaHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', 'Monolog\\Handler\\ErrorLogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', 'Monolog\\Handler\\FallbackGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', 'Monolog\\Handler\\FilterHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', @@ -2875,6 +2878,7 @@ return array( 'Monolog\\Handler\\SqsHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', 'Monolog\\Handler\\StreamHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', 'Monolog\\Handler\\SwiftMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SymfonyMailerHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php', 'Monolog\\Handler\\SyslogHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', 'Monolog\\Handler\\SyslogUdpHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', @@ -2883,6 +2887,7 @@ return array( 'Monolog\\Handler\\WebRequestRecognizerTrait' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', 'Monolog\\Handler\\WhatFailureGroupHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', 'Monolog\\Handler\\ZendMonitorHandler' => $vendorDir . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\LogRecord' => $vendorDir . '/monolog/monolog/src/Monolog/LogRecord.php', 'Monolog\\Logger' => $vendorDir . '/monolog/monolog/src/Monolog/Logger.php', 'Monolog\\Processor\\GitProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', 'Monolog\\Processor\\HostnameProcessor' => $vendorDir . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', @@ -3834,9 +3839,65 @@ return array( 'Psy\\ParserFactory' => $vendorDir . '/psy/psysh/src/ParserFactory.php', 'Psy\\Readline\\GNUReadline' => $vendorDir . '/psy/psysh/src/Readline/GNUReadline.php', 'Psy\\Readline\\HoaConsole' => $vendorDir . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Hoa\\Autocompleter' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Autocompleter.php', + 'Psy\\Readline\\Hoa\\AutocompleterAggregate' => $vendorDir . '/psy/psysh/src/Readline/Hoa/AutocompleterAggregate.php', + 'Psy\\Readline\\Hoa\\AutocompleterPath' => $vendorDir . '/psy/psysh/src/Readline/Hoa/AutocompleterPath.php', + 'Psy\\Readline\\Hoa\\AutocompleterWord' => $vendorDir . '/psy/psysh/src/Readline/Hoa/AutocompleterWord.php', + 'Psy\\Readline\\Hoa\\Console' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Console.php', + 'Psy\\Readline\\Hoa\\ConsoleCursor' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleCursor.php', + 'Psy\\Readline\\Hoa\\ConsoleException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleException.php', + 'Psy\\Readline\\Hoa\\ConsoleInput' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleInput.php', + 'Psy\\Readline\\Hoa\\ConsoleOutput' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleOutput.php', + 'Psy\\Readline\\Hoa\\ConsoleProcessus' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php', + 'Psy\\Readline\\Hoa\\ConsoleTput' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleTput.php', + 'Psy\\Readline\\Hoa\\ConsoleWindow' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ConsoleWindow.php', + 'Psy\\Readline\\Hoa\\Event' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Event.php', + 'Psy\\Readline\\Hoa\\EventBucket' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventBucket.php', + 'Psy\\Readline\\Hoa\\EventException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventException.php', + 'Psy\\Readline\\Hoa\\EventListenable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventListenable.php', + 'Psy\\Readline\\Hoa\\EventListener' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventListener.php', + 'Psy\\Readline\\Hoa\\EventListens' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventListens.php', + 'Psy\\Readline\\Hoa\\EventSource' => $vendorDir . '/psy/psysh/src/Readline/Hoa/EventSource.php', + 'Psy\\Readline\\Hoa\\Exception' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Exception.php', + 'Psy\\Readline\\Hoa\\ExceptionIdle' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ExceptionIdle.php', + 'Psy\\Readline\\Hoa\\File' => $vendorDir . '/psy/psysh/src/Readline/Hoa/File.php', + 'Psy\\Readline\\Hoa\\FileDirectory' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileDirectory.php', + 'Psy\\Readline\\Hoa\\FileDoesNotExistException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php', + 'Psy\\Readline\\Hoa\\FileException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileException.php', + 'Psy\\Readline\\Hoa\\FileFinder' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileFinder.php', + 'Psy\\Readline\\Hoa\\FileGeneric' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileGeneric.php', + 'Psy\\Readline\\Hoa\\FileLink' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileLink.php', + 'Psy\\Readline\\Hoa\\FileLinkRead' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileLinkRead.php', + 'Psy\\Readline\\Hoa\\FileLinkReadWrite' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php', + 'Psy\\Readline\\Hoa\\FileRead' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileRead.php', + 'Psy\\Readline\\Hoa\\FileReadWrite' => $vendorDir . '/psy/psysh/src/Readline/Hoa/FileReadWrite.php', + 'Psy\\Readline\\Hoa\\IStream' => $vendorDir . '/psy/psysh/src/Readline/Hoa/IStream.php', + 'Psy\\Readline\\Hoa\\IteratorFileSystem' => $vendorDir . '/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php', + 'Psy\\Readline\\Hoa\\IteratorRecursiveDirectory' => $vendorDir . '/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php', + 'Psy\\Readline\\Hoa\\IteratorSplFileInfo' => $vendorDir . '/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php', + 'Psy\\Readline\\Hoa\\Protocol' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Protocol.php', + 'Psy\\Readline\\Hoa\\ProtocolException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ProtocolException.php', + 'Psy\\Readline\\Hoa\\ProtocolNode' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ProtocolNode.php', + 'Psy\\Readline\\Hoa\\ProtocolNodeLibrary' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php', + 'Psy\\Readline\\Hoa\\ProtocolWrapper' => $vendorDir . '/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php', + 'Psy\\Readline\\Hoa\\Readline' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Readline.php', + 'Psy\\Readline\\Hoa\\Stream' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Stream.php', + 'Psy\\Readline\\Hoa\\StreamBufferable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamBufferable.php', + 'Psy\\Readline\\Hoa\\StreamContext' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamContext.php', + 'Psy\\Readline\\Hoa\\StreamException' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamException.php', + 'Psy\\Readline\\Hoa\\StreamIn' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamIn.php', + 'Psy\\Readline\\Hoa\\StreamLockable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamLockable.php', + 'Psy\\Readline\\Hoa\\StreamOut' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamOut.php', + 'Psy\\Readline\\Hoa\\StreamPathable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamPathable.php', + 'Psy\\Readline\\Hoa\\StreamPointable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamPointable.php', + 'Psy\\Readline\\Hoa\\StreamStatable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamStatable.php', + 'Psy\\Readline\\Hoa\\StreamTouchable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/StreamTouchable.php', + 'Psy\\Readline\\Hoa\\Ustring' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Ustring.php', + 'Psy\\Readline\\Hoa\\Xcallable' => $vendorDir . '/psy/psysh/src/Readline/Hoa/Xcallable.php', 'Psy\\Readline\\Libedit' => $vendorDir . '/psy/psysh/src/Readline/Libedit.php', 'Psy\\Readline\\Readline' => $vendorDir . '/psy/psysh/src/Readline/Readline.php', 'Psy\\Readline\\Transient' => $vendorDir . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Readline\\Userland' => $vendorDir . '/psy/psysh/src/Readline/Userland.php', 'Psy\\Reflection\\ReflectionClassConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', 'Psy\\Reflection\\ReflectionConstant' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant.php', 'Psy\\Reflection\\ReflectionConstant_' => $vendorDir . '/psy/psysh/src/Reflection/ReflectionConstant_.php', diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php index 7ff7522c..25d69291 100644 --- a/vendor/composer/autoload_files.php +++ b/vendor/composer/autoload_files.php @@ -6,22 +6,22 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir); return array( - '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', 'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php', '9c67151ae59aff4788964ce8eb2a0f43' => $vendorDir . '/clue/stream-filter/src/functions_include.php', '8cff32064859f4559445b89279f3199c' => $vendorDir . '/php-http/message/src/filters.php', 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', - '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php', + '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php', '2c102faa651ef8ea5874edb585946bce' => $vendorDir . '/swiftmailer/swiftmailer/lib/swift_required.php', '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php', 'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php', diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 6ab1f4b7..6bbad218 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -7,22 +7,22 @@ namespace Composer\Autoload; class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf { public static $files = array ( - '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', 'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php', + '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', - '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php', - '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', + '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php', '9c67151ae59aff4788964ce8eb2a0f43' => __DIR__ . '/..' . '/clue/stream-filter/src/functions_include.php', '8cff32064859f4559445b89279f3199c' => __DIR__ . '/..' . '/php-http/message/src/filters.php', 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', - '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php', 'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php', + '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php', '2c102faa651ef8ea5874edb585946bce' => __DIR__ . '/..' . '/swiftmailer/swiftmailer/lib/swift_required.php', '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php', 'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php', @@ -641,7 +641,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'App\\SupportedApps\\Drone\\Drone' => __DIR__ . '/../..' . '/app/SupportedApps/Drone/Drone.php', 'App\\SupportedApps\\Droppy\\Droppy' => __DIR__ . '/../..' . '/app/SupportedApps/Droppy/Droppy.php', 'App\\SupportedApps\\Duplicacy\\Duplicacy' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicacy/Duplicacy.php', - 'App\\SupportedApps\\Duplicati\\Duplicati' => __DIR__ . '/../..' . '/app/SupportedApps/Duplicati/Duplicati.php', 'App\\SupportedApps\\ESPHome\\ESPHome' => __DIR__ . '/../..' . '/app/SupportedApps/ESPHome/ESPHome.php', 'App\\SupportedApps\\Element\\Element' => __DIR__ . '/../..' . '/app/SupportedApps/Element/Element.php', 'App\\SupportedApps\\EmbyStat\\EmbyStat' => __DIR__ . '/../..' . '/app/SupportedApps/EmbyStat/EmbyStat.php', @@ -649,6 +648,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'App\\SupportedApps\\FileBrowser\\FileBrowser' => __DIR__ . '/../..' . '/app/SupportedApps/FileBrowser/FileBrowser.php', 'App\\SupportedApps\\FileFlows\\FileFlows' => __DIR__ . '/../..' . '/app/SupportedApps/FileFlows/FileFlows.php', 'App\\SupportedApps\\FileRun\\FileRun' => __DIR__ . '/../..' . '/app/SupportedApps/FileRun/FileRun.php', + 'App\\SupportedApps\\Firefly3\\Firefly3' => __DIR__ . '/../..' . '/app/SupportedApps/Firefly3/Firefly3.php', 'App\\SupportedApps\\Firefly\\Firefly' => __DIR__ . '/../..' . '/app/SupportedApps/Firefly/Firefly.php', 'App\\SupportedApps\\FirefoxSend\\FirefoxSend' => __DIR__ . '/../..' . '/app/SupportedApps/FirefoxSend/FirefoxSend.php', 'App\\SupportedApps\\FlexGet\\FlexGet' => __DIR__ . '/../..' . '/app/SupportedApps/FlexGet/FlexGet.php', @@ -846,7 +846,6 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'App\\SupportedApps\\TarTenNinety\\TarTenNinety' => __DIR__ . '/../..' . '/app/SupportedApps/TarTenNinety/TarTenNinety.php', 'App\\SupportedApps\\TasmoAdmin\\TasmoAdmin' => __DIR__ . '/../..' . '/app/SupportedApps/TasmoAdmin/TasmoAdmin.php', 'App\\SupportedApps\\Tasmota\\Tasmota' => __DIR__ . '/../..' . '/app/SupportedApps/Tasmota/Tasmota.php', - 'App\\SupportedApps\\Tautulli\\Tautulli' => __DIR__ . '/../..' . '/app/SupportedApps/Tautulli/Tautulli.php', 'App\\SupportedApps\\Tdarr\\Tdarr' => __DIR__ . '/../..' . '/app/SupportedApps/Tdarr/Tdarr.php', 'App\\SupportedApps\\TechnitiumDNS\\TechnitiumDNS' => __DIR__ . '/../..' . '/app/SupportedApps/TechnitiumDNS/TechnitiumDNS.php', 'App\\SupportedApps\\Teedy\\Teedy' => __DIR__ . '/../..' . '/app/SupportedApps/Teedy/Teedy.php', @@ -951,6 +950,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Carbon\\Exceptions\\BadFluentConstructorException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php', 'Carbon\\Exceptions\\BadFluentSetterException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php', 'Carbon\\Exceptions\\BadMethodCallException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php', + 'Carbon\\Exceptions\\EndLessPeriodException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php', 'Carbon\\Exceptions\\Exception' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/Exception.php', 'Carbon\\Exceptions\\ImmutableException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php', 'Carbon\\Exceptions\\InvalidArgumentException' => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php', @@ -1856,6 +1856,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'GuzzleHttp\\Psr7\\StreamWrapper' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/StreamWrapper.php', 'GuzzleHttp\\Psr7\\UploadedFile' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UploadedFile.php', 'GuzzleHttp\\Psr7\\Uri' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Uri.php', + 'GuzzleHttp\\Psr7\\UriComparator' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriComparator.php', 'GuzzleHttp\\Psr7\\UriNormalizer' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriNormalizer.php', 'GuzzleHttp\\Psr7\\UriResolver' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/UriResolver.php', 'GuzzleHttp\\Psr7\\Utils' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/Utils.php', @@ -3341,6 +3342,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Mockery\\Undefined' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/Undefined.php', 'Mockery\\VerificationDirector' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/VerificationDirector.php', 'Mockery\\VerificationExpectation' => __DIR__ . '/..' . '/mockery/mockery/library/Mockery/VerificationExpectation.php', + 'Monolog\\Attribute\\AsMonologProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php', 'Monolog\\DateTimeImmutable' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/DateTimeImmutable.php', 'Monolog\\ErrorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/ErrorHandler.php', 'Monolog\\Formatter\\ChromePHPFormatter' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php', @@ -3374,6 +3376,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Monolog\\Handler\\DoctrineCouchDBHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php', 'Monolog\\Handler\\DynamoDbHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php', 'Monolog\\Handler\\ElasticaHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticaHandler.php', + 'Monolog\\Handler\\ElasticsearchHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ElasticsearchHandler.php', 'Monolog\\Handler\\ErrorLogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php', 'Monolog\\Handler\\FallbackGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FallbackGroupHandler.php', 'Monolog\\Handler\\FilterHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/FilterHandler.php', @@ -3424,6 +3427,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Monolog\\Handler\\SqsHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SqsHandler.php', 'Monolog\\Handler\\StreamHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/StreamHandler.php', 'Monolog\\Handler\\SwiftMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php', + 'Monolog\\Handler\\SymfonyMailerHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php', 'Monolog\\Handler\\SyslogHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogHandler.php', 'Monolog\\Handler\\SyslogUdpHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php', 'Monolog\\Handler\\SyslogUdp\\UdpSocket' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php', @@ -3432,6 +3436,7 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Monolog\\Handler\\WebRequestRecognizerTrait' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WebRequestRecognizerTrait.php', 'Monolog\\Handler\\WhatFailureGroupHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php', 'Monolog\\Handler\\ZendMonitorHandler' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php', + 'Monolog\\LogRecord' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/LogRecord.php', 'Monolog\\Logger' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Logger.php', 'Monolog\\Processor\\GitProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/GitProcessor.php', 'Monolog\\Processor\\HostnameProcessor' => __DIR__ . '/..' . '/monolog/monolog/src/Monolog/Processor/HostnameProcessor.php', @@ -4383,9 +4388,65 @@ class ComposerStaticInit4b6fb9210a1ea37c2db27b8ff53a1ecf 'Psy\\ParserFactory' => __DIR__ . '/..' . '/psy/psysh/src/ParserFactory.php', 'Psy\\Readline\\GNUReadline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/GNUReadline.php', 'Psy\\Readline\\HoaConsole' => __DIR__ . '/..' . '/psy/psysh/src/Readline/HoaConsole.php', + 'Psy\\Readline\\Hoa\\Autocompleter' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Autocompleter.php', + 'Psy\\Readline\\Hoa\\AutocompleterAggregate' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/AutocompleterAggregate.php', + 'Psy\\Readline\\Hoa\\AutocompleterPath' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/AutocompleterPath.php', + 'Psy\\Readline\\Hoa\\AutocompleterWord' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/AutocompleterWord.php', + 'Psy\\Readline\\Hoa\\Console' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Console.php', + 'Psy\\Readline\\Hoa\\ConsoleCursor' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleCursor.php', + 'Psy\\Readline\\Hoa\\ConsoleException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleException.php', + 'Psy\\Readline\\Hoa\\ConsoleInput' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleInput.php', + 'Psy\\Readline\\Hoa\\ConsoleOutput' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleOutput.php', + 'Psy\\Readline\\Hoa\\ConsoleProcessus' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php', + 'Psy\\Readline\\Hoa\\ConsoleTput' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleTput.php', + 'Psy\\Readline\\Hoa\\ConsoleWindow' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ConsoleWindow.php', + 'Psy\\Readline\\Hoa\\Event' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Event.php', + 'Psy\\Readline\\Hoa\\EventBucket' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventBucket.php', + 'Psy\\Readline\\Hoa\\EventException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventException.php', + 'Psy\\Readline\\Hoa\\EventListenable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventListenable.php', + 'Psy\\Readline\\Hoa\\EventListener' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventListener.php', + 'Psy\\Readline\\Hoa\\EventListens' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventListens.php', + 'Psy\\Readline\\Hoa\\EventSource' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/EventSource.php', + 'Psy\\Readline\\Hoa\\Exception' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Exception.php', + 'Psy\\Readline\\Hoa\\ExceptionIdle' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ExceptionIdle.php', + 'Psy\\Readline\\Hoa\\File' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/File.php', + 'Psy\\Readline\\Hoa\\FileDirectory' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileDirectory.php', + 'Psy\\Readline\\Hoa\\FileDoesNotExistException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php', + 'Psy\\Readline\\Hoa\\FileException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileException.php', + 'Psy\\Readline\\Hoa\\FileFinder' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileFinder.php', + 'Psy\\Readline\\Hoa\\FileGeneric' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileGeneric.php', + 'Psy\\Readline\\Hoa\\FileLink' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileLink.php', + 'Psy\\Readline\\Hoa\\FileLinkRead' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileLinkRead.php', + 'Psy\\Readline\\Hoa\\FileLinkReadWrite' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php', + 'Psy\\Readline\\Hoa\\FileRead' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileRead.php', + 'Psy\\Readline\\Hoa\\FileReadWrite' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/FileReadWrite.php', + 'Psy\\Readline\\Hoa\\IStream' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/IStream.php', + 'Psy\\Readline\\Hoa\\IteratorFileSystem' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php', + 'Psy\\Readline\\Hoa\\IteratorRecursiveDirectory' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php', + 'Psy\\Readline\\Hoa\\IteratorSplFileInfo' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php', + 'Psy\\Readline\\Hoa\\Protocol' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Protocol.php', + 'Psy\\Readline\\Hoa\\ProtocolException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ProtocolException.php', + 'Psy\\Readline\\Hoa\\ProtocolNode' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ProtocolNode.php', + 'Psy\\Readline\\Hoa\\ProtocolNodeLibrary' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php', + 'Psy\\Readline\\Hoa\\ProtocolWrapper' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php', + 'Psy\\Readline\\Hoa\\Readline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Readline.php', + 'Psy\\Readline\\Hoa\\Stream' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Stream.php', + 'Psy\\Readline\\Hoa\\StreamBufferable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamBufferable.php', + 'Psy\\Readline\\Hoa\\StreamContext' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamContext.php', + 'Psy\\Readline\\Hoa\\StreamException' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamException.php', + 'Psy\\Readline\\Hoa\\StreamIn' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamIn.php', + 'Psy\\Readline\\Hoa\\StreamLockable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamLockable.php', + 'Psy\\Readline\\Hoa\\StreamOut' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamOut.php', + 'Psy\\Readline\\Hoa\\StreamPathable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamPathable.php', + 'Psy\\Readline\\Hoa\\StreamPointable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamPointable.php', + 'Psy\\Readline\\Hoa\\StreamStatable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamStatable.php', + 'Psy\\Readline\\Hoa\\StreamTouchable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/StreamTouchable.php', + 'Psy\\Readline\\Hoa\\Ustring' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Ustring.php', + 'Psy\\Readline\\Hoa\\Xcallable' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Hoa/Xcallable.php', 'Psy\\Readline\\Libedit' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Libedit.php', 'Psy\\Readline\\Readline' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Readline.php', 'Psy\\Readline\\Transient' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Transient.php', + 'Psy\\Readline\\Userland' => __DIR__ . '/..' . '/psy/psysh/src/Readline/Userland.php', 'Psy\\Reflection\\ReflectionClassConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionClassConstant.php', 'Psy\\Reflection\\ReflectionConstant' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant.php', 'Psy\\Reflection\\ReflectionConstant_' => __DIR__ . '/..' . '/psy/psysh/src/Reflection/ReflectionConstant_.php', diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index b4bf6a53..8600c353 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -711,30 +711,30 @@ }, { "name": "graham-campbell/bounded-cache", - "version": "v1.1.3", - "version_normalized": "1.1.3.0", + "version": "v1.2.0", + "version_normalized": "1.2.0.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Bounded-Cache.git", - "reference": "cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b" + "reference": "91ec403b5c66f31d446b317bf3f0958205353fe2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Bounded-Cache/zipball/cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b", - "reference": "cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b", + "url": "https://api.github.com/repos/GrahamCampbell/Bounded-Cache/zipball/91ec403b5c66f31d446b317bf3f0958205353fe2", + "reference": "91ec403b5c66f31d446b317bf3f0958205353fe2", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/simple-cache": "^1.0" + "php": "^7.4.15 || ^8.0.2", + "psr/simple-cache": "^1.0 || ^2.0" }, "require-dev": { - "graham-campbell/analyzer": "^3.0", - "graham-campbell/testbench-core": "^3.1", - "mockery/mockery": "^1.3.2", - "phpunit/phpunit": "^8.5.8 || ^9.3.7" + "graham-campbell/analyzer": "^3.1", + "graham-campbell/testbench-core": "^3.4", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5" }, - "time": "2021-11-21T20:48:45+00:00", + "time": "2022-05-30T19:33:36+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -765,7 +765,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Bounded-Cache/issues", - "source": "https://github.com/GrahamCampbell/Bounded-Cache/tree/v1.1.3" + "source": "https://github.com/GrahamCampbell/Bounded-Cache/tree/v1.2.0" }, "funding": [ { @@ -781,25 +781,25 @@ }, { "name": "graham-campbell/github", - "version": "v10.5.0", - "version_normalized": "10.5.0.0", + "version": "v10.6.0", + "version_normalized": "10.6.0.0", "source": { "type": "git", "url": "https://github.com/GrahamCampbell/Laravel-GitHub.git", - "reference": "b88f6737bcc088a84ce3ec863a50afbc3ab8e867" + "reference": "3b25fdfd160827cbc103a737fee08f7f113b6923" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/GrahamCampbell/Laravel-GitHub/zipball/b88f6737bcc088a84ce3ec863a50afbc3ab8e867", - "reference": "b88f6737bcc088a84ce3ec863a50afbc3ab8e867", + "url": "https://api.github.com/repos/GrahamCampbell/Laravel-GitHub/zipball/3b25fdfd160827cbc103a737fee08f7f113b6923", + "reference": "3b25fdfd160827cbc103a737fee08f7f113b6923", "shasum": "" }, "require": { - "graham-campbell/bounded-cache": "^1.1", + "graham-campbell/bounded-cache": "^1.1 || ^2.0", "graham-campbell/manager": "^4.7", "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "knplabs/github-api": "3.5.*", + "knplabs/github-api": "3.6.*", "php": "^7.2.5 || ^8.0", "symfony/cache": "^4.3 || ^5.0 || ^6.0" }, @@ -815,7 +815,7 @@ "suggest": { "lcobucci/jwt": "Allows using the private key authenticator (^3.4 || ^4.0)" }, - "time": "2022-01-24T03:22:38+00:00", + "time": "2022-05-30T19:59:57+00:00", "type": "library", "extra": { "laravel": { @@ -857,7 +857,7 @@ ], "support": { "issues": "https://github.com/GrahamCampbell/Laravel-GitHub/issues", - "source": "https://github.com/GrahamCampbell/Laravel-GitHub/tree/v10.5.0" + "source": "https://github.com/GrahamCampbell/Laravel-GitHub/tree/v10.6.0" }, "funding": [ { @@ -946,23 +946,23 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.4.1", - "version_normalized": "7.4.1.0", + "version": "7.4.5", + "version_normalized": "7.4.5.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", - "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", "shasum": "" }, "require": { "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -982,7 +982,7 @@ "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, - "time": "2021-12-06T18:43:05+00:00", + "time": "2022-06-20T22:16:13+00:00", "type": "library", "extra": { "branch-alias": { @@ -1053,7 +1053,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.4.1" + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" }, "funding": [ { @@ -1160,17 +1160,17 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.1.0", - "version_normalized": "2.1.0.0", + "version": "2.4.0", + "version_normalized": "2.4.0.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + "reference": "13388f00956b1503577598873fffb5ae994b5737" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", - "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", + "reference": "13388f00956b1503577598873fffb5ae994b5737", "shasum": "" }, "require": { @@ -1191,11 +1191,11 @@ "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" }, - "time": "2021-10-06T17:43:30+00:00", + "time": "2022-06-20T21:43:11+00:00", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.4-dev" } }, "installation-source": "dist", @@ -1258,7 +1258,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.1.0" + "source": "https://github.com/guzzle/psr7/tree/2.4.0" }, "funding": [ { @@ -1332,17 +1332,17 @@ }, { "name": "knplabs/github-api", - "version": "v3.5.1", - "version_normalized": "3.5.1.0", + "version": "v3.6.0", + "version_normalized": "3.6.0.0", "source": { "type": "git", "url": "https://github.com/KnpLabs/php-github-api.git", - "reference": "37b167998e8e1f318b3d99633675cfa007540565" + "reference": "7f283177b96eb626e5cf6038d8771859a0af4b02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/37b167998e8e1f318b3d99633675cfa007540565", - "reference": "37b167998e8e1f318b3d99633675cfa007540565", + "url": "https://api.github.com/repos/KnpLabs/php-github-api/zipball/7f283177b96eb626e5cf6038d8771859a0af4b02", + "reference": "7f283177b96eb626e5cf6038d8771859a0af4b02", "shasum": "" }, "require": { @@ -1372,7 +1372,7 @@ "symfony/cache": "^5.1.8", "symfony/phpunit-bridge": "^5.2" }, - "time": "2022-02-19T11:15:46+00:00", + "time": "2022-03-24T09:08:32+00:00", "type": "library", "extra": { "branch-alias": { @@ -1411,7 +1411,7 @@ ], "support": { "issues": "https://github.com/KnpLabs/php-github-api/issues", - "source": "https://github.com/KnpLabs/php-github-api/tree/v3.5.1" + "source": "https://github.com/KnpLabs/php-github-api/tree/v3.6.0" }, "funding": [ { @@ -1588,17 +1588,17 @@ }, { "name": "laravel/tinker", - "version": "v2.7.0", - "version_normalized": "2.7.0.0", + "version": "v2.7.2", + "version_normalized": "2.7.2.0", "source": { "type": "git", "url": "https://github.com/laravel/tinker.git", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073" + "reference": "dff39b661e827dae6e092412f976658df82dbac5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/tinker/zipball/5f2f9815b7631b9f586a3de7933c25f9327d4073", - "reference": "5f2f9815b7631b9f586a3de7933c25f9327d4073", + "url": "https://api.github.com/repos/laravel/tinker/zipball/dff39b661e827dae6e092412f976658df82dbac5", + "reference": "dff39b661e827dae6e092412f976658df82dbac5", "shasum": "" }, "require": { @@ -1616,7 +1616,7 @@ "suggest": { "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0|^9.0)." }, - "time": "2022-01-10T08:52:49+00:00", + "time": "2022-03-23T12:38:24+00:00", "type": "library", "extra": { "branch-alias": { @@ -1653,7 +1653,7 @@ ], "support": { "issues": "https://github.com/laravel/tinker/issues", - "source": "https://github.com/laravel/tinker/tree/v2.7.0" + "source": "https://github.com/laravel/tinker/tree/v2.7.2" }, "install-path": "../laravel/tinker" }, @@ -1985,17 +1985,17 @@ }, { "name": "league/mime-type-detection", - "version": "1.9.0", - "version_normalized": "1.9.0.0", + "version": "1.11.0", + "version_normalized": "1.11.0.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", - "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", "shasum": "" }, "require": { @@ -2007,7 +2007,7 @@ "phpstan/phpstan": "^0.12.68", "phpunit/phpunit": "^8.5.8 || ^9.3" }, - "time": "2021-11-21T11:48:40+00:00", + "time": "2022-04-17T13:12:02+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -2028,7 +2028,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.11.0" }, "funding": [ { @@ -2116,17 +2116,17 @@ }, { "name": "monolog/monolog", - "version": "2.3.5", - "version_normalized": "2.3.5.0", + "version": "2.7.0", + "version_normalized": "2.7.0.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", - "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5579edf28aee1190a798bfa5be8bc16c563bd524", + "reference": "5579edf28aee1190a798bfa5be8bc16c563bd524", "shasum": "" }, "require": { @@ -2139,18 +2139,23 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", + "phpspec/prophecy": "^1.15", "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5", + "phpunit/phpunit": "^8.5.14", "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", - "swiftmailer/swiftmailer": "^5.3|^6.0" + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", @@ -2169,7 +2174,7 @@ "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, - "time": "2021-10-01T21:08:31+00:00", + "time": "2022-06-09T08:59:12+00:00", "type": "library", "extra": { "branch-alias": { @@ -2202,7 +2207,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + "source": "https://github.com/Seldaek/monolog/tree/2.7.0" }, "funding": [ { @@ -2280,17 +2285,17 @@ }, { "name": "nesbot/carbon", - "version": "2.57.0", - "version_normalized": "2.57.0.0", + "version": "2.59.0", + "version_normalized": "2.59.0.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4a54375c21eea4811dbd1149fe6b246517554e78" + "reference": "9cea2f72585a46d0651ee6d4c8c8f752e78c16c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a54375c21eea4811dbd1149fe6b246517554e78", - "reference": "4a54375c21eea4811dbd1149fe6b246517554e78", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/9cea2f72585a46d0651ee6d4c8c8f752e78c16c6", + "reference": "9cea2f72585a46d0651ee6d4c8c8f752e78c16c6", "shasum": "" }, "require": { @@ -2305,13 +2310,15 @@ "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54 || ^1.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, - "time": "2022-02-13T18:13:33+00:00", + "time": "2022-06-26T20:26:59+00:00", "bin": [ "bin/carbon" ], @@ -2367,11 +2374,15 @@ }, "funding": [ { - "url": "https://opencollective.com/Carbon", - "type": "open_collective" + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", "type": "tidelift" } ], @@ -2379,17 +2390,17 @@ }, { "name": "nikic/php-parser", - "version": "v4.13.2", - "version_normalized": "4.13.2.0", + "version": "v4.14.0", + "version_normalized": "4.14.0.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", "shasum": "" }, "require": { @@ -2400,7 +2411,7 @@ "ircmaxell/php-yacc": "^0.0.7", "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" }, - "time": "2021-11-30T19:35:32+00:00", + "time": "2022-05-31T20:59:12+00:00", "bin": [ "bin/php-parse" ], @@ -2432,7 +2443,7 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" }, "install-path": "../nikic/php-parser" }, @@ -2754,17 +2765,17 @@ }, { "name": "php-http/discovery", - "version": "1.14.1", - "version_normalized": "1.14.1.0", + "version": "1.14.2", + "version_normalized": "1.14.2.0", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223" + "reference": "c8d48852fbc052454af42f6de27635ddd916b959" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/de90ab2b41d7d61609f504e031339776bc8c7223", - "reference": "de90ab2b41d7d61609f504e031339776bc8c7223", + "url": "https://api.github.com/repos/php-http/discovery/zipball/c8d48852fbc052454af42f6de27635ddd916b959", + "reference": "c8d48852fbc052454af42f6de27635ddd916b959", "shasum": "" }, "require": { @@ -2777,13 +2788,12 @@ "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" + "phpspec/phpspec": "^5.1 || ^6.1" }, "suggest": { "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" }, - "time": "2021-09-18T07:57:46+00:00", + "time": "2022-05-25T07:26:05+00:00", "type": "library", "extra": { "branch-alias": { @@ -2819,7 +2829,7 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.14.1" + "source": "https://github.com/php-http/discovery/tree/1.14.2" }, "install-path": "../php-http/discovery" }, @@ -3261,17 +3271,17 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.6.0", - "version_normalized": "1.6.0.0", + "version": "1.6.1", + "version_normalized": "1.6.1.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706" + "reference": "77a32518733312af16a44300404e945338981de3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/93ebd0014cab80c4ea9f5e297ea48672f1b87706", - "reference": "93ebd0014cab80c4ea9f5e297ea48672f1b87706", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", "shasum": "" }, "require": { @@ -3282,7 +3292,7 @@ "ext-tokenizer": "*", "psalm/phar": "^4.8" }, - "time": "2022-01-04T19:58:01+00:00", + "time": "2022-03-15T21:29:03+00:00", "type": "library", "extra": { "branch-alias": { @@ -3308,7 +3318,7 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" }, "install-path": "../phpdocumentor/type-resolver" }, @@ -4295,17 +4305,17 @@ }, { "name": "psy/psysh", - "version": "v0.11.2", - "version_normalized": "0.11.2.0", + "version": "v0.11.5", + "version_normalized": "0.11.5.0", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514" + "reference": "c23686f9c48ca202710dbb967df8385a952a2daf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7f7da640d68b9c9fec819caae7c744a213df6514", - "reference": "7f7da640d68b9c9fec819caae7c744a213df6514", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/c23686f9c48ca202710dbb967df8385a952a2daf", + "reference": "c23686f9c48ca202710dbb967df8385a952a2daf", "shasum": "" }, "require": { @@ -4320,17 +4330,15 @@ "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" }, "require-dev": { - "bamarni/composer-bin-plugin": "^1.2", - "hoa/console": "3.17.05.02" + "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-pdo-sqlite": "The doc command requires SQLite to work.", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", - "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." }, - "time": "2022-02-28T15:28:54+00:00", + "time": "2022-05-27T18:03:49+00:00", "bin": [ "bin/psysh" ], @@ -4370,7 +4378,7 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.11.2" + "source": "https://github.com/bobthecow/psysh/tree/v0.11.5" }, "install-path": "../psy/psysh" }, @@ -5327,17 +5335,17 @@ }, { "name": "symfony/cache", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b" + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/c0718d0e01ac14251a45cc9c8b93716ec41ae64b", - "reference": "c0718d0e01ac14251a45cc9c8b93716ec41ae64b", + "url": "https://api.github.com/repos/symfony/cache/zipball/c4e387b739022fd4b20abd8edb2143c44c5daa14", + "reference": "c4e387b739022fd4b20abd8edb2143c44c5daa14", "shasum": "" }, "require": { @@ -5375,7 +5383,7 @@ "symfony/messenger": "^4.4|^5.0|^6.0", "symfony/var-dumper": "^4.4|^5.0|^6.0" }, - "time": "2022-03-02T12:56:28+00:00", + "time": "2022-06-19T12:03:50+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5407,7 +5415,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.6" + "source": "https://github.com/symfony/cache/tree/v5.4.10" }, "funding": [ { @@ -5427,17 +5435,17 @@ }, { "name": "symfony/cache-contracts", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/cache-contracts.git", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2" + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/ac2e168102a2e06a2624f0379bde94cd5854ced2", - "reference": "ac2e168102a2e06a2624f0379bde94cd5854ced2", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", + "reference": "64be4a7acb83b6f2bf6de9a02cee6dad41277ebc", "shasum": "" }, "require": { @@ -5447,7 +5455,7 @@ "suggest": { "symfony/cache-implementation": "" }, - "time": "2021-08-17T14:20:01+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { @@ -5489,7 +5497,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/cache-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/cache-contracts/tree/v2.5.2" }, "funding": [ { @@ -5509,17 +5517,17 @@ }, { "name": "symfony/console", - "version": "v5.4.5", - "version_normalized": "5.4.5.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad" + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", "shasum": "" }, "require": { @@ -5557,7 +5565,7 @@ "symfony/lock": "", "symfony/process": "" }, - "time": "2022-02-24T12:45:35+00:00", + "time": "2022-06-26T13:00:04+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5591,7 +5599,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.5" + "source": "https://github.com/symfony/console/tree/v5.4.10" }, "funding": [ { @@ -5680,23 +5688,23 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-07-12T14:48:14+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { @@ -5730,7 +5738,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" }, "funding": [ { @@ -5750,17 +5758,17 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.9", + "version_normalized": "5.4.9.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5" + "reference": "c116cda1f51c678782768dce89a45f13c949455d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", - "reference": "c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c116cda1f51c678782768dce89a45f13c949455d", + "reference": "c116cda1f51c678782768dce89a45f13c949455d", "shasum": "" }, "require": { @@ -5773,7 +5781,7 @@ "symfony/http-kernel": "^4.4|^5.0|^6.0", "symfony/serializer": "^4.4|^5.0|^6.0" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-05-21T13:57:48+00:00", "bin": [ "Resources/bin/patch-type-declarations" ], @@ -5804,7 +5812,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.3" + "source": "https://github.com/symfony/error-handler/tree/v5.4.9" }, "funding": [ { @@ -5824,17 +5832,17 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.9", + "version_normalized": "5.4.9.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d" + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dec8a9f58d20df252b9cd89f1c6c1530f747685d", - "reference": "dec8a9f58d20df252b9cd89f1c6c1530f747685d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", "shasum": "" }, "require": { @@ -5864,7 +5872,7 @@ "symfony/dependency-injection": "", "symfony/http-kernel": "" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-05-05T16:45:39+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -5892,7 +5900,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" }, "funding": [ { @@ -5912,17 +5920,17 @@ }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", "shasum": "" }, "require": { @@ -5932,7 +5940,7 @@ "suggest": { "symfony/event-dispatcher-implementation": "" }, - "time": "2021-07-12T14:48:14+00:00", + "time": "2022-01-02T09:53:40+00:00", "type": "library", "extra": { "branch-alias": { @@ -5974,7 +5982,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" }, "funding": [ { @@ -5994,17 +6002,17 @@ }, { "name": "symfony/finder", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.8", + "version_normalized": "5.4.8.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d" + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/231313534dded84c7ecaa79d14bc5da4ccb69b7d", - "reference": "231313534dded84c7ecaa79d14bc5da4ccb69b7d", + "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", "shasum": "" }, "require": { @@ -6012,7 +6020,7 @@ "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, - "time": "2022-01-26T16:34:36+00:00", + "time": "2022-04-15T08:07:45+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6040,7 +6048,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.3" + "source": "https://github.com/symfony/finder/tree/v5.4.8" }, "funding": [ { @@ -6060,17 +6068,17 @@ }, { "name": "symfony/http-foundation", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465" + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/34e89bc147633c0f9dd6caaaf56da3b806a21465", - "reference": "34e89bc147633c0f9dd6caaaf56da3b806a21465", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", + "reference": "e7793b7906f72a8cc51054fbca9dcff7a8af1c1e", "shasum": "" }, "require": { @@ -6088,7 +6096,7 @@ "suggest": { "symfony/mime": "To use the file extension guesser" }, - "time": "2022-03-05T21:03:43+00:00", + "time": "2022-06-19T13:13:40+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6116,7 +6124,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.6" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.10" }, "funding": [ { @@ -6136,17 +6144,17 @@ }, { "name": "symfony/http-kernel", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d" + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d41f29ae9af1b5f40c7ebcddf09082953229411d", - "reference": "d41f29ae9af1b5f40c7ebcddf09082953229411d", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/255ae3b0a488d78fbb34da23d3e0c059874b5948", + "reference": "255ae3b0a488d78fbb34da23d3e0c059874b5948", "shasum": "" }, "require": { @@ -6203,7 +6211,7 @@ "symfony/console": "", "symfony/dependency-injection": "" }, - "time": "2022-03-05T21:14:51+00:00", + "time": "2022-06-26T16:57:59+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6231,7 +6239,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.6" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.10" }, "funding": [ { @@ -6251,17 +6259,17 @@ }, { "name": "symfony/mime", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f" + "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/e1503cfb5c9a225350f549d3bb99296f4abfb80f", - "reference": "e1503cfb5c9a225350f549d3bb99296f4abfb80f", + "url": "https://api.github.com/repos/symfony/mime/zipball/02265e1e5111c3cd7480387af25e82378b7ab9cc", + "reference": "02265e1e5111c3cd7480387af25e82378b7ab9cc", "shasum": "" }, "require": { @@ -6285,7 +6293,7 @@ "symfony/property-info": "^4.4|^5.1|^6.0", "symfony/serializer": "^5.2|^6.0" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-06-09T12:22:40+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -6317,7 +6325,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.3" + "source": "https://github.com/symfony/mime/tree/v5.4.10" }, "funding": [ { @@ -6409,17 +6417,17 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", "shasum": "" }, "require": { @@ -6431,11 +6439,11 @@ "suggest": { "ext-ctype": "For best performance" }, - "time": "2021-10-20T20:35:02+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6474,7 +6482,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" }, "funding": [ { @@ -6494,17 +6502,17 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40" + "reference": "143f1881e655bebca1312722af8068de235ae5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/f1aed619e28cb077fc83fac8c4c0383578356e40", - "reference": "f1aed619e28cb077fc83fac8c4c0383578356e40", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc", + "reference": "143f1881e655bebca1312722af8068de235ae5dc", "shasum": "" }, "require": { @@ -6516,11 +6524,11 @@ "suggest": { "ext-iconv": "For best performance" }, - "time": "2022-01-04T09:04:05+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6560,7 +6568,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" }, "funding": [ { @@ -6580,17 +6588,17 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" + "reference": "433d05519ce6990bf3530fba6957499d327395c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", "shasum": "" }, "require": { @@ -6599,11 +6607,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2021-11-23T21:10:46+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6644,7 +6652,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" }, "funding": [ { @@ -6664,17 +6672,17 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44" + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/749045c69efb97c70d25d7463abba812e91f3a44", - "reference": "749045c69efb97c70d25d7463abba812e91f3a44", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/59a8d271f00dd0e4c2e518104cc7963f655a1aa8", + "reference": "59a8d271f00dd0e4c2e518104cc7963f655a1aa8", "shasum": "" }, "require": { @@ -6685,11 +6693,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2021-09-14T14:02:44+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6734,7 +6742,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.26.0" }, "funding": [ { @@ -6754,17 +6762,17 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", "shasum": "" }, "require": { @@ -6773,11 +6781,11 @@ "suggest": { "ext-intl": "For best performance" }, - "time": "2021-02-19T12:13:01+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6821,7 +6829,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" }, "funding": [ { @@ -6841,17 +6849,17 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", "shasum": "" }, "require": { @@ -6863,11 +6871,11 @@ "suggest": { "ext-mbstring": "For best performance" }, - "time": "2021-11-30T18:21:41+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6907,7 +6915,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" }, "funding": [ { @@ -6927,27 +6935,27 @@ }, { "name": "symfony/polyfill-php72", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", - "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/bf44a9fd41feaac72b074de600314a93e2ae78e2", + "reference": "bf44a9fd41feaac72b074de600314a93e2ae78e2", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-05-27T09:17:38+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -6986,7 +6994,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.26.0" }, "funding": [ { @@ -7006,27 +7014,27 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-06-05T21:20:04+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7068,7 +7076,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" }, "funding": [ { @@ -7088,27 +7096,27 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2022-03-04T08:16:47+00:00", + "time": "2022-05-10T07:21:04+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7154,7 +7162,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" }, "funding": [ { @@ -7174,27 +7182,27 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.25.0", - "version_normalized": "1.25.0.0", + "version": "v1.26.0", + "version_normalized": "1.26.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f" + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", - "reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/13f6d1271c663dc5ae9fb843a8f16521db7687a1", + "reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2021-09-13T13:58:11+00:00", + "time": "2022-05-24T11:49:31+00:00", "type": "library", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", @@ -7236,7 +7244,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.25.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.26.0" }, "funding": [ { @@ -7256,24 +7264,24 @@ }, { "name": "symfony/process", - "version": "v5.4.5", - "version_normalized": "5.4.5.0", + "version": "v5.4.8", + "version_normalized": "5.4.8.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c" + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c", + "url": "https://api.github.com/repos/symfony/process/zipball/597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", + "reference": "597f3fff8e3e91836bb0bd38f5718b56ddbde2f3", "shasum": "" }, "require": { "php": ">=7.2.5", "symfony/polyfill-php80": "^1.16" }, - "time": "2022-01-30T18:16:22+00:00", + "time": "2022-04-08T05:07:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7301,7 +7309,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.5" + "source": "https://github.com/symfony/process/tree/v5.4.8" }, "funding": [ { @@ -7321,17 +7329,17 @@ }, { "name": "symfony/routing", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.8", + "version_normalized": "5.4.8.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "44b29c7a94e867ccde1da604792f11a469958981" + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/44b29c7a94e867ccde1da604792f11a469958981", - "reference": "44b29c7a94e867ccde1da604792f11a469958981", + "url": "https://api.github.com/repos/symfony/routing/zipball/e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", + "reference": "e07817bb6244ea33ef5ad31abc4a9288bef3f2f7", "shasum": "" }, "require": { @@ -7360,7 +7368,7 @@ "symfony/http-foundation": "For using a Symfony Request object", "symfony/yaml": "For using the YAML loader" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-04-18T21:45:37+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7394,7 +7402,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.3" + "source": "https://github.com/symfony/routing/tree/v5.4.8" }, "funding": [ { @@ -7414,23 +7422,23 @@ }, { "name": "symfony/service-contracts", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7438,7 +7446,7 @@ "suggest": { "symfony/service-implementation": "" }, - "time": "2021-11-04T16:48:04+00:00", + "time": "2022-05-30T19:17:29+00:00", "type": "library", "extra": { "branch-alias": { @@ -7480,7 +7488,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" }, "funding": [ { @@ -7500,17 +7508,17 @@ }, { "name": "symfony/string", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", "shasum": "" }, "require": { @@ -7530,7 +7538,7 @@ "symfony/translation-contracts": "^1.1|^2", "symfony/var-exporter": "^4.4|^5.0|^6.0" }, - "time": "2022-01-02T09:53:40+00:00", + "time": "2022-06-26T15:57:47+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7569,7 +7577,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.3" + "source": "https://github.com/symfony/string/tree/v5.4.10" }, "funding": [ { @@ -7653,17 +7661,17 @@ }, { "name": "symfony/translation", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.9", + "version_normalized": "5.4.9.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b" + "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/a7ca9fdfffb0174209440c2ffa1dee228e15d95b", - "reference": "a7ca9fdfffb0174209440c2ffa1dee228e15d95b", + "url": "https://api.github.com/repos/symfony/translation/zipball/1639abc1177d26bcd4320e535e664cef067ab0ca", + "reference": "1639abc1177d26bcd4320e535e664cef067ab0ca", "shasum": "" }, "require": { @@ -7702,7 +7710,7 @@ "symfony/config": "", "symfony/yaml": "" }, - "time": "2022-03-02T12:56:28+00:00", + "time": "2022-05-06T12:33:37+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7733,7 +7741,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.6" + "source": "https://github.com/symfony/translation/tree/v5.4.9" }, "funding": [ { @@ -7753,17 +7761,17 @@ }, { "name": "symfony/translation-contracts", - "version": "v2.5.0", - "version_normalized": "2.5.0.0", + "version": "v2.5.2", + "version_normalized": "2.5.2.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/136b19dd05cdf0709db6537d058bcab6dd6e2dbe", + "reference": "136b19dd05cdf0709db6537d058bcab6dd6e2dbe", "shasum": "" }, "require": { @@ -7772,7 +7780,7 @@ "suggest": { "symfony/translation-implementation": "" }, - "time": "2021-08-17T14:20:01+00:00", + "time": "2022-06-27T16:58:25+00:00", "type": "library", "extra": { "branch-alias": { @@ -7814,7 +7822,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.2" }, "funding": [ { @@ -7834,17 +7842,17 @@ }, { "name": "symfony/var-dumper", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.9", + "version_normalized": "5.4.9.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0" + "reference": "af52239a330fafd192c773795520dc2dd62b5657" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/294e9da6e2e0dd404e983daa5aa74253d92c05d0", - "reference": "294e9da6e2e0dd404e983daa5aa74253d92c05d0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/af52239a330fafd192c773795520dc2dd62b5657", + "reference": "af52239a330fafd192c773795520dc2dd62b5657", "shasum": "" }, "require": { @@ -7868,7 +7876,7 @@ "ext-intl": "To show region name in time zone dump", "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" }, - "time": "2022-03-02T12:42:23+00:00", + "time": "2022-05-21T10:24:18+00:00", "bin": [ "Resources/bin/var-dump-server" ], @@ -7906,7 +7914,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.6" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.9" }, "funding": [ { @@ -7926,17 +7934,17 @@ }, { "name": "symfony/var-exporter", - "version": "v5.4.6", - "version_normalized": "5.4.6.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5" + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/49e2355fe6f59ea30c18ebb68edf13b7e20582e5", - "reference": "49e2355fe6f59ea30c18ebb68edf13b7e20582e5", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/8fc03ee75eeece3d9be1ef47d26d79bea1afb340", + "reference": "8fc03ee75eeece3d9be1ef47d26d79bea1afb340", "shasum": "" }, "require": { @@ -7946,7 +7954,7 @@ "require-dev": { "symfony/var-dumper": "^4.4.9|^5.0.9|^6.0" }, - "time": "2022-03-02T12:42:23+00:00", + "time": "2022-05-27T12:56:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -7982,7 +7990,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.6" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.10" }, "funding": [ { @@ -8002,17 +8010,17 @@ }, { "name": "symfony/yaml", - "version": "v5.4.3", - "version_normalized": "5.4.3.0", + "version": "v5.4.10", + "version_normalized": "5.4.10.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", + "url": "https://api.github.com/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", "shasum": "" }, "require": { @@ -8029,7 +8037,7 @@ "suggest": { "symfony/console": "For validating YAML files using the lint command" }, - "time": "2022-01-26T16:32:32+00:00", + "time": "2022-06-20T11:50:59+00:00", "bin": [ "Resources/bin/yaml-lint" ], @@ -8060,7 +8068,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" + "source": "https://github.com/symfony/yaml/tree/v5.4.10" }, "funding": [ { @@ -8347,22 +8355,22 @@ }, { "name": "webmozart/assert", - "version": "1.10.0", - "version_normalized": "1.10.0.0", + "version": "1.11.0", + "version_normalized": "1.11.0.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" + "ext-ctype": "*", + "php": "^7.2 || ^8.0" }, "conflict": { "phpstan/phpstan": "<0.12.20", @@ -8371,7 +8379,7 @@ "require-dev": { "phpunit/phpunit": "^8.5.13" }, - "time": "2021-03-09T10:59:23+00:00", + "time": "2022-06-03T18:03:27+00:00", "type": "library", "extra": { "branch-alias": { @@ -8402,7 +8410,7 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" + "source": "https://github.com/webmozarts/assert/tree/1.11.0" }, "install-path": "../webmozart/assert" } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index ea589206..6b805129 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,11 +1,11 @@ array( - 'pretty_version' => '2.3.x-dev', - 'version' => '2.3.9999999.9999999-dev', + 'pretty_version' => '2.x-dev', + 'version' => '2.9999999.9999999.9999999-dev', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'ed3dbf2f1420e720c7bdcf0c8b36830bf6368c6d', + 'reference' => 'bbae811cd8f4bbfde6df468dbd9053d4a808c250', 'name' => 'laravel/laravel', 'dev' => true, ), @@ -113,21 +113,21 @@ 'dev_requirement' => true, ), 'graham-campbell/bounded-cache' => array( - 'pretty_version' => 'v1.1.3', - 'version' => '1.1.3.0', + 'pretty_version' => 'v1.2.0', + 'version' => '1.2.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../graham-campbell/bounded-cache', 'aliases' => array(), - 'reference' => 'cbb12c2d7b2f93f4d8c2a1e46e16fb1e5842c92b', + 'reference' => '91ec403b5c66f31d446b317bf3f0958205353fe2', 'dev_requirement' => false, ), 'graham-campbell/github' => array( - 'pretty_version' => 'v10.5.0', - 'version' => '10.5.0.0', + 'pretty_version' => 'v10.6.0', + 'version' => '10.6.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../graham-campbell/github', 'aliases' => array(), - 'reference' => 'b88f6737bcc088a84ce3ec863a50afbc3ab8e867', + 'reference' => '3b25fdfd160827cbc103a737fee08f7f113b6923', 'dev_requirement' => false, ), 'graham-campbell/manager' => array( @@ -140,12 +140,12 @@ 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( - 'pretty_version' => '7.4.1', - 'version' => '7.4.1.0', + 'pretty_version' => '7.4.5', + 'version' => '7.4.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), - 'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79', + 'reference' => '1dd98b0564cb3f6bd16ce683cb755f94c10fbd82', 'dev_requirement' => false, ), 'guzzlehttp/promises' => array( @@ -158,12 +158,12 @@ 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( - 'pretty_version' => '2.1.0', - 'version' => '2.1.0.0', + 'pretty_version' => '2.4.0', + 'version' => '2.4.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), - 'reference' => '089edd38f5b8abba6cb01567c2a8aaa47cec4c72', + 'reference' => '13388f00956b1503577598873fffb5ae994b5737', 'dev_requirement' => false, ), 'hamcrest/hamcrest-php' => array( @@ -350,12 +350,12 @@ ), ), 'knplabs/github-api' => array( - 'pretty_version' => 'v3.5.1', - 'version' => '3.5.1.0', + 'pretty_version' => 'v3.6.0', + 'version' => '3.6.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../knplabs/github-api', 'aliases' => array(), - 'reference' => '37b167998e8e1f318b3d99633675cfa007540565', + 'reference' => '7f283177b96eb626e5cf6038d8771859a0af4b02', 'dev_requirement' => false, ), 'kodova/hamcrest-php' => array( @@ -374,21 +374,21 @@ 'dev_requirement' => false, ), 'laravel/laravel' => array( - 'pretty_version' => '2.3.x-dev', - 'version' => '2.3.9999999.9999999-dev', + 'pretty_version' => '2.x-dev', + 'version' => '2.9999999.9999999.9999999-dev', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), - 'reference' => 'ed3dbf2f1420e720c7bdcf0c8b36830bf6368c6d', + 'reference' => 'bbae811cd8f4bbfde6df468dbd9053d4a808c250', 'dev_requirement' => false, ), 'laravel/tinker' => array( - 'pretty_version' => 'v2.7.0', - 'version' => '2.7.0.0', + 'pretty_version' => 'v2.7.2', + 'version' => '2.7.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../laravel/tinker', 'aliases' => array(), - 'reference' => '5f2f9815b7631b9f586a3de7933c25f9327d4073', + 'reference' => 'dff39b661e827dae6e092412f976658df82dbac5', 'dev_requirement' => false, ), 'laravel/ui' => array( @@ -428,12 +428,12 @@ 'dev_requirement' => false, ), 'league/mime-type-detection' => array( - 'pretty_version' => '1.9.0', - 'version' => '1.9.0.0', + 'pretty_version' => '1.11.0', + 'version' => '1.11.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../league/mime-type-detection', 'aliases' => array(), - 'reference' => 'aa70e813a6ad3d1558fc927863d47309b4c23e69', + 'reference' => 'ff6248ea87a9f116e78edd6002e39e5128a0d4dd', 'dev_requirement' => false, ), 'mockery/mockery' => array( @@ -446,12 +446,12 @@ 'dev_requirement' => true, ), 'monolog/monolog' => array( - 'pretty_version' => '2.3.5', - 'version' => '2.3.5.0', + 'pretty_version' => '2.7.0', + 'version' => '2.7.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), - 'reference' => 'fd4380d6fc37626e2f799f29d91195040137eba9', + 'reference' => '5579edf28aee1190a798bfa5be8bc16c563bd524', 'dev_requirement' => false, ), 'myclabs/deep-copy' => array( @@ -464,21 +464,21 @@ 'dev_requirement' => true, ), 'nesbot/carbon' => array( - 'pretty_version' => '2.57.0', - 'version' => '2.57.0.0', + 'pretty_version' => '2.59.0', + 'version' => '2.59.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nesbot/carbon', 'aliases' => array(), - 'reference' => '4a54375c21eea4811dbd1149fe6b246517554e78', + 'reference' => '9cea2f72585a46d0651ee6d4c8c8f752e78c16c6', 'dev_requirement' => false, ), 'nikic/php-parser' => array( - 'pretty_version' => 'v4.13.2', - 'version' => '4.13.2.0', + 'pretty_version' => 'v4.14.0', + 'version' => '4.14.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), - 'reference' => '210577fe3cf7badcc5814d99455df46564f3c077', + 'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1', 'dev_requirement' => false, ), 'opis/closure' => array( @@ -527,12 +527,12 @@ 'dev_requirement' => false, ), 'php-http/discovery' => array( - 'pretty_version' => '1.14.1', - 'version' => '1.14.1.0', + 'pretty_version' => '1.14.2', + 'version' => '1.14.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../php-http/discovery', 'aliases' => array(), - 'reference' => 'de90ab2b41d7d61609f504e031339776bc8c7223', + 'reference' => 'c8d48852fbc052454af42f6de27635ddd916b959', 'dev_requirement' => false, ), 'php-http/httplug' => array( @@ -605,12 +605,12 @@ 'dev_requirement' => true, ), 'phpdocumentor/type-resolver' => array( - 'pretty_version' => '1.6.0', - 'version' => '1.6.0.0', + 'pretty_version' => '1.6.1', + 'version' => '1.6.1.0', 'type' => 'library', 'install_path' => __DIR__ . '/../phpdocumentor/type-resolver', 'aliases' => array(), - 'reference' => '93ebd0014cab80c4ea9f5e297ea48672f1b87706', + 'reference' => '77a32518733312af16a44300404e945338981de3', 'dev_requirement' => true, ), 'phpoption/phpoption' => array( @@ -796,8 +796,8 @@ 'psr/log-implementation' => array( 'dev_requirement' => false, 'provided' => array( - 0 => '1.0.0 || 2.0.0 || 3.0.0', - 1 => '1.0|2.0', + 0 => '1.0|2.0', + 1 => '1.0.0 || 2.0.0 || 3.0.0', ), ), 'psr/simple-cache' => array( @@ -816,12 +816,12 @@ ), ), 'psy/psysh' => array( - 'pretty_version' => 'v0.11.2', - 'version' => '0.11.2.0', + 'pretty_version' => 'v0.11.5', + 'version' => '0.11.5.0', 'type' => 'library', 'install_path' => __DIR__ . '/../psy/psysh', 'aliases' => array(), - 'reference' => '7f7da640d68b9c9fec819caae7c744a213df6514', + 'reference' => 'c23686f9c48ca202710dbb967df8385a952a2daf', 'dev_requirement' => false, ), 'ralouphie/getallheaders' => array( @@ -966,21 +966,21 @@ 'dev_requirement' => false, ), 'symfony/cache' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache', 'aliases' => array(), - 'reference' => 'c0718d0e01ac14251a45cc9c8b93716ec41ae64b', + 'reference' => 'c4e387b739022fd4b20abd8edb2143c44c5daa14', 'dev_requirement' => false, ), 'symfony/cache-contracts' => array( - 'pretty_version' => 'v2.5.0', - 'version' => '2.5.0.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/cache-contracts', 'aliases' => array(), - 'reference' => 'ac2e168102a2e06a2624f0379bde94cd5854ced2', + 'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc', 'dev_requirement' => false, ), 'symfony/cache-implementation' => array( @@ -990,12 +990,12 @@ ), ), 'symfony/console' => array( - 'pretty_version' => 'v5.4.5', - 'version' => '5.4.5.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), - 'reference' => 'd8111acc99876953f52fe16d4c50eb60940d49ad', + 'reference' => '4d671ab4ddac94ee439ea73649c69d9d200b5000', 'dev_requirement' => false, ), 'symfony/css-selector' => array( @@ -1008,39 +1008,39 @@ 'dev_requirement' => false, ), 'symfony/deprecation-contracts' => array( - 'pretty_version' => 'v2.5.0', - 'version' => '2.5.0.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/deprecation-contracts', 'aliases' => array(), - 'reference' => '6f981ee24cf69ee7ce9736146d1c57c2780598a8', + 'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66', 'dev_requirement' => false, ), 'symfony/error-handler' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.9', + 'version' => '5.4.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/error-handler', 'aliases' => array(), - 'reference' => 'c4ffc2cd919950d13c8c9ce32a70c70214c3ffc5', + 'reference' => 'c116cda1f51c678782768dce89a45f13c949455d', 'dev_requirement' => false, ), 'symfony/event-dispatcher' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.9', + 'version' => '5.4.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher', 'aliases' => array(), - 'reference' => 'dec8a9f58d20df252b9cd89f1c6c1530f747685d', + 'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc', 'dev_requirement' => false, ), 'symfony/event-dispatcher-contracts' => array( - 'pretty_version' => 'v2.5.0', - 'version' => '2.5.0.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts', 'aliases' => array(), - 'reference' => '66bea3b09be61613cd3b4043a65a8ec48cfa6d2a', + 'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1', 'dev_requirement' => false, ), 'symfony/event-dispatcher-implementation' => array( @@ -1050,39 +1050,39 @@ ), ), 'symfony/finder' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.8', + 'version' => '5.4.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), - 'reference' => '231313534dded84c7ecaa79d14bc5da4ccb69b7d', + 'reference' => '9b630f3427f3ebe7cd346c277a1408b00249dad9', 'dev_requirement' => false, ), 'symfony/http-foundation' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-foundation', 'aliases' => array(), - 'reference' => '34e89bc147633c0f9dd6caaaf56da3b806a21465', + 'reference' => 'e7793b7906f72a8cc51054fbca9dcff7a8af1c1e', 'dev_requirement' => false, ), 'symfony/http-kernel' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/http-kernel', 'aliases' => array(), - 'reference' => 'd41f29ae9af1b5f40c7ebcddf09082953229411d', + 'reference' => '255ae3b0a488d78fbb34da23d3e0c059874b5948', 'dev_requirement' => false, ), 'symfony/mime' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/mime', 'aliases' => array(), - 'reference' => 'e1503cfb5c9a225350f549d3bb99296f4abfb80f', + 'reference' => '02265e1e5111c3cd7480387af25e82378b7ab9cc', 'dev_requirement' => false, ), 'symfony/options-resolver' => array( @@ -1095,129 +1095,129 @@ 'dev_requirement' => false, ), 'symfony/polyfill-ctype' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-ctype', 'aliases' => array(), - 'reference' => '30885182c981ab175d4d034db0f6f469898070ab', + 'reference' => '6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4', 'dev_requirement' => false, ), 'symfony/polyfill-iconv' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-iconv', 'aliases' => array(), - 'reference' => 'f1aed619e28cb077fc83fac8c4c0383578356e40', + 'reference' => '143f1881e655bebca1312722af8068de235ae5dc', 'dev_requirement' => false, ), 'symfony/polyfill-intl-grapheme' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme', 'aliases' => array(), - 'reference' => '81b86b50cf841a64252b439e738e97f4a34e2783', + 'reference' => '433d05519ce6990bf3530fba6957499d327395c2', 'dev_requirement' => false, ), 'symfony/polyfill-intl-idn' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-idn', 'aliases' => array(), - 'reference' => '749045c69efb97c70d25d7463abba812e91f3a44', + 'reference' => '59a8d271f00dd0e4c2e518104cc7963f655a1aa8', 'dev_requirement' => false, ), 'symfony/polyfill-intl-normalizer' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer', 'aliases' => array(), - 'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8', + 'reference' => '219aa369ceff116e673852dce47c3a41794c14bd', 'dev_requirement' => false, ), 'symfony/polyfill-mbstring' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), - 'reference' => '0abb51d2f102e00a4eefcf46ba7fec406d245825', + 'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e', 'dev_requirement' => false, ), 'symfony/polyfill-php72' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php72', 'aliases' => array(), - 'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976', + 'reference' => 'bf44a9fd41feaac72b074de600314a93e2ae78e2', 'dev_requirement' => false, ), 'symfony/polyfill-php73' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php73', 'aliases' => array(), - 'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5', + 'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85', 'dev_requirement' => false, ), 'symfony/polyfill-php80' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php80', 'aliases' => array(), - 'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c', + 'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace', 'dev_requirement' => false, ), 'symfony/polyfill-php81' => array( - 'pretty_version' => 'v1.25.0', - 'version' => '1.25.0.0', + 'pretty_version' => 'v1.26.0', + 'version' => '1.26.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), - 'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f', + 'reference' => '13f6d1271c663dc5ae9fb843a8f16521db7687a1', 'dev_requirement' => false, ), 'symfony/process' => array( - 'pretty_version' => 'v5.4.5', - 'version' => '5.4.5.0', + 'pretty_version' => 'v5.4.8', + 'version' => '5.4.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), - 'reference' => '95440409896f90a5f85db07a32b517ecec17fa4c', + 'reference' => '597f3fff8e3e91836bb0bd38f5718b56ddbde2f3', 'dev_requirement' => false, ), 'symfony/routing' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.8', + 'version' => '5.4.8.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/routing', 'aliases' => array(), - 'reference' => '44b29c7a94e867ccde1da604792f11a469958981', + 'reference' => 'e07817bb6244ea33ef5ad31abc4a9288bef3f2f7', 'dev_requirement' => false, ), 'symfony/service-contracts' => array( - 'pretty_version' => 'v2.5.0', - 'version' => '2.5.0.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), - 'reference' => '1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc', + 'reference' => '4b426aac47d6427cc1a1d0f7e2ac724627f5966c', 'dev_requirement' => false, ), 'symfony/string' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/string', 'aliases' => array(), - 'reference' => '92043b7d8383e48104e411bc9434b260dbeb5a10', + 'reference' => '4432bc7df82a554b3e413a8570ce2fea90e94097', 'dev_requirement' => false, ), 'symfony/thanks' => array( @@ -1230,21 +1230,21 @@ 'dev_requirement' => true, ), 'symfony/translation' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.9', + 'version' => '5.4.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation', 'aliases' => array(), - 'reference' => 'a7ca9fdfffb0174209440c2ffa1dee228e15d95b', + 'reference' => '1639abc1177d26bcd4320e535e664cef067ab0ca', 'dev_requirement' => false, ), 'symfony/translation-contracts' => array( - 'pretty_version' => 'v2.5.0', - 'version' => '2.5.0.0', + 'pretty_version' => 'v2.5.2', + 'version' => '2.5.2.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/translation-contracts', 'aliases' => array(), - 'reference' => 'd28150f0f44ce854e942b671fc2620a98aae1b1e', + 'reference' => '136b19dd05cdf0709db6537d058bcab6dd6e2dbe', 'dev_requirement' => false, ), 'symfony/translation-implementation' => array( @@ -1254,30 +1254,30 @@ ), ), 'symfony/var-dumper' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.9', + 'version' => '5.4.9.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-dumper', 'aliases' => array(), - 'reference' => '294e9da6e2e0dd404e983daa5aa74253d92c05d0', + 'reference' => 'af52239a330fafd192c773795520dc2dd62b5657', 'dev_requirement' => false, ), 'symfony/var-exporter' => array( - 'pretty_version' => 'v5.4.6', - 'version' => '5.4.6.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/var-exporter', 'aliases' => array(), - 'reference' => '49e2355fe6f59ea30c18ebb68edf13b7e20582e5', + 'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340', 'dev_requirement' => false, ), 'symfony/yaml' => array( - 'pretty_version' => 'v5.4.3', - 'version' => '5.4.3.0', + 'pretty_version' => 'v5.4.10', + 'version' => '5.4.10.0', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/yaml', 'aliases' => array(), - 'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2', + 'reference' => '04e42926429d9e8b39c174387ab990bf7817f7a2', 'dev_requirement' => false, ), 'theseer/tokenizer' => array( @@ -1317,12 +1317,12 @@ 'dev_requirement' => false, ), 'webmozart/assert' => array( - 'pretty_version' => '1.10.0', - 'version' => '1.10.0.0', + 'pretty_version' => '1.11.0', + 'version' => '1.11.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), - 'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25', + 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'dev_requirement' => true, ), ), diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php index 580fa960..3c97a351 100644 --- a/vendor/composer/platform_check.php +++ b/vendor/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 70400)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 70415)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.15". You are running ' . PHP_VERSION . '.'; } if ($issues) { diff --git a/vendor/graham-campbell/bounded-cache/LICENSE b/vendor/graham-campbell/bounded-cache/LICENSE index a9d0755a..9a8accb9 100644 --- a/vendor/graham-campbell/bounded-cache/LICENSE +++ b/vendor/graham-campbell/bounded-cache/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2020 Graham Campbell +Copyright (c) 2020-2022 Graham Campbell Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/graham-campbell/bounded-cache/composer.json b/vendor/graham-campbell/bounded-cache/composer.json index d3f9b2af..8752b38e 100644 --- a/vendor/graham-campbell/bounded-cache/composer.json +++ b/vendor/graham-campbell/bounded-cache/composer.json @@ -11,14 +11,14 @@ } ], "require": { - "php": "^7.2.5 || ^8.0", - "psr/simple-cache": "^1.0" + "php": "^7.4.15 || ^8.0.2", + "psr/simple-cache": "^1.0 || ^2.0" }, "require-dev": { - "graham-campbell/analyzer": "^3.0", - "graham-campbell/testbench-core": "^3.1", - "mockery/mockery": "^1.3.2", - "phpunit/phpunit": "^8.5.8 || ^9.3.7" + "graham-campbell/analyzer": "^3.1", + "graham-campbell/testbench-core": "^3.4", + "mockery/mockery": "^1.5", + "phpunit/phpunit": "^9.5" }, "autoload": { "psr-4": { diff --git a/vendor/graham-campbell/github/composer.json b/vendor/graham-campbell/github/composer.json index bdd9eb88..87b53035 100644 --- a/vendor/graham-campbell/github/composer.json +++ b/vendor/graham-campbell/github/composer.json @@ -12,11 +12,11 @@ ], "require": { "php": "^7.2.5 || ^8.0", - "graham-campbell/bounded-cache": "^1.1", + "graham-campbell/bounded-cache": "^1.1 || ^2.0", "graham-campbell/manager": "^4.7", "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "knplabs/github-api": "3.5.*", + "knplabs/github-api": "3.6.*", "symfony/cache": "^4.3 || ^5.0 || ^6.0" }, "require-dev": { diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md index b278efca..3aaf11bf 100644 --- a/vendor/guzzlehttp/guzzle/CHANGELOG.md +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -2,6 +2,28 @@ Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version. +## 7.4.5 - 2022-06-20 + +* Fix change in port should be considered a change in origin +* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin + +## 7.4.4 - 2022-06-09 + +* Fix failure to strip Authorization header on HTTP downgrade +* Fix failure to strip the Cookie header on change in host or HTTP downgrade + +## 7.4.3 - 2022-05-25 + +* Fix cross-domain cookie leakage + +## 7.4.2 - 2022-03-20 + +### Fixed + +- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header +- Reject non-HTTP schemes in StreamHandler +- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve` + ## 7.4.1 - 2021-12-06 ### Changed diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md index 0025aa7a..f287fa98 100644 --- a/vendor/guzzlehttp/guzzle/README.md +++ b/vendor/guzzlehttp/guzzle/README.md @@ -42,9 +42,9 @@ $promise->wait(); We use GitHub issues only to discuss bugs and new features. For support please refer to: -- [Documentation](http://guzzlephp.org/) -- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle) -- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](http://slack.httplug.io/) +- [Documentation](https://docs.guzzlephp.org) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle) +- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/) - [Gitter](https://gitter.im/guzzle/guzzle) @@ -60,23 +60,23 @@ composer require guzzlehttp/guzzle ## Version Guidance -| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | -|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| -| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | -| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | -| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | -| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | -| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >= 7.2 | +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | +|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------| +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >=5.3.3,<7.0 | +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >=5.4,<7.0 | +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >=5.4,<7.4 | +| 6.x | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >=5.5,<8.0 | +| 7.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes | >=7.2.5,<8.2 | [guzzle-3-repo]: https://github.com/guzzle/guzzle3 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5 [guzzle-7-repo]: https://github.com/guzzle/guzzle -[guzzle-3-docs]: http://guzzle3.readthedocs.org -[guzzle-5-docs]: http://docs.guzzlephp.org/en/5.3/ -[guzzle-6-docs]: http://docs.guzzlephp.org/en/6.5/ -[guzzle-7-docs]: http://docs.guzzlephp.org/en/latest/ +[guzzle-3-docs]: https://guzzle3.readthedocs.io/ +[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/ +[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/ +[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/ ## Security diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json index 2549f78b..7e043b03 100644 --- a/vendor/guzzlehttp/guzzle/composer.json +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -54,7 +54,7 @@ "php": "^7.2.5 || ^8.0", "ext-json": "*", "guzzlehttp/promises": "^1.5", - "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "guzzlehttp/psr7": "^1.9 || ^2.4", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" }, @@ -74,6 +74,9 @@ "psr/log": "Required for using the Log middleware" }, "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, "preferred-install": "dist", "sort-packages": true }, diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php index d6757c65..6ef8e8c1 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php @@ -241,6 +241,11 @@ class CookieJar implements CookieJarInterface if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } + if (!$sc->matchesDomain($request->getUri()->getHost())) { + continue; + } + // Note: At this point `$sc->getDomain()` being a public suffix should + // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php index 7c04034d..a613c77b 100644 --- a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -379,10 +379,12 @@ class SetCookie // Remove the leading '.' as per spec in RFC 6265. // https://tools.ietf.org/html/rfc6265#section-5.2.3 - $cookieDomain = \ltrim($cookieDomain, '.'); + $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); + + $domain = \strtolower($domain); // Domain not set or exact match. - if (!$cookieDomain || !\strcasecmp($domain, $cookieDomain)) { + if ('' === $cookieDomain || $domain === $cookieDomain) { return true; } diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php index 9e2e4703..2f5b3f69 100644 --- a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -32,9 +32,9 @@ class CurlMultiHandler private $selectTimeout; /** - * @var resource|\CurlMultiHandle|null the currently executing resource in `curl_multi_exec`. + * @var int Will be higher than 0 when `curl_multi_exec` is still running. */ - private $active; + private $active = 0; /** * @var array Request entry handles, indexed by handle id in `addRequest`. diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php index 70c646be..543f825a 100644 --- a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php +++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php @@ -266,6 +266,10 @@ class StreamHandler $methods = \array_flip(\get_class_methods(__CLASS__)); } + if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) { + throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request); + } + // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() == '1.1' @@ -318,7 +322,7 @@ class StreamHandler return $this->createResource( function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) { $resource = @\fopen((string) $uri, 'r', false, $contextResource); - $this->lastHeaders = $http_response_header; + $this->lastHeaders = $http_response_header ?? []; if (false === $resource) { throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context); @@ -377,6 +381,9 @@ class StreamHandler 'ignore_errors' => true, 'follow_location' => 0, ], + 'ssl' => [ + 'peer_name' => $request->getUri()->getHost(), + ], ]; $body = (string) $request->getBody(); diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php index 1dd38614..f67d448b 100644 --- a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -88,6 +88,14 @@ class RedirectMiddleware $this->guardMax($request, $response, $options); $nextRequest = $this->modifyRequest($request, $options, $response); + // If authorization is handled by curl, unset it if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) { + unset( + $options['curl'][\CURLOPT_HTTPAUTH], + $options['curl'][\CURLOPT_USERPWD] + ); + } + if (isset($options['allow_redirects']['on_redirect'])) { ($options['allow_redirects']['on_redirect'])( $request, @@ -132,7 +140,7 @@ class RedirectMiddleware } /** - * Check for too many redirects + * Check for too many redirects. * * @throws TooManyRedirectsException Too many redirects. */ @@ -168,7 +176,7 @@ class RedirectMiddleware $modify['body'] = ''; } - $uri = $this->redirectUri($request, $response, $protocols); + $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) { $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); @@ -188,19 +196,23 @@ class RedirectMiddleware $modify['remove_headers'][] = 'Referer'; } - // Remove Authorization header if host is different. - if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { + // Remove Authorization and Cookie headers if URI is cross-origin. + if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; + $modify['remove_headers'][] = 'Cookie'; } return Psr7\Utils::modifyRequest($request, $modify); } /** - * Set the appropriate URL on the request based on the location header + * Set the appropriate URL on the request based on the location header. */ - private function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols): UriInterface - { + private static function redirectUri( + RequestInterface $request, + ResponseInterface $response, + array $protocols + ): UriInterface { $location = Psr7\UriResolver::resolve( $request->getUri(), new Psr7\Uri($response->getHeaderLine('Location')) diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md index 740b2877..90e22ff9 100644 --- a/vendor/guzzlehttp/psr7/CHANGELOG.md +++ b/vendor/guzzlehttp/psr7/CHANGELOG.md @@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## 2.4.0 - 2022-06-20 + +### Added + +- Added provisional PHP 8.2 support +- Added `UriComparator::isCrossOrigin` method + +## 2.3.0 - 2022-06-09 + +### Fixed + +- Added `Header::splitList` method +- Added `Utils::tryGetContents` method +- Improved `Stream::getContents` method +- Updated mimetype mappings + +## 2.2.2 - 2022-06-08 + +### Fixed + +- Fix `Message::parseRequestUri` for numeric headers +- Re-wrap exceptions thrown in `fread` into runtime exceptions +- Throw an exception when multipart options is misformatted + +## 2.2.1 - 2022-03-20 + +### Fixed + +- Correct header value validation + +## 2.2.0 - 2022-03-20 + +### Added + +- A more compressive list of mime types +- Add JsonSerializable to Uri +- Missing return types + +### Fixed + +- Bug MultipartStream no `uri` metadata +- Bug MultipartStream with filename for `data://` streams +- Fixed new line handling in MultipartStream +- Reduced RAM usage when copying streams +- Updated parsing in `Header::normalize()` + +## 2.1.1 - 2022-03-20 + +### Fixed + +- Validate header values properly + ## 2.1.0 - 2021-10-06 ### Changed diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md index ed81c927..eea803a0 100644 --- a/vendor/guzzlehttp/psr7/README.md +++ b/vendor/guzzlehttp/psr7/README.md @@ -1,6 +1,6 @@ # PSR-7 Message Implementation -This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) +This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/) message implementation, several stream decorators, and some helpful functionality like query string parsing. @@ -527,6 +527,17 @@ When fopen fails, PHP normally raises a warning. This function adds an error handler that checks for errors and throws an exception instead. +## `GuzzleHttp\Psr7\Utils::tryGetContents` + +`public static function tryGetContents(resource $stream): string` + +Safely gets the contents of a given stream. + +When stream_get_contents fails, PHP normally raises a warning. This +function adds an error handler that checks for errors and throws an +exception instead. + + ## `GuzzleHttp\Psr7\Utils::uriFor` `public static function uriFor(string|UriInterface $uri): UriInterface` @@ -658,7 +669,7 @@ manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__to `public static function fromParts(array $parts): UriInterface` -Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. +Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components. ### `GuzzleHttp\Psr7\Uri::withQueryValue` @@ -683,6 +694,16 @@ associative array of key => value. Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the provided key are removed. +## Cross-Origin Detection + +`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin. + +### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin` + +`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool` + +Determines if a modified URL should be considered cross-origin with respect to an original URL. + ## Reference Resolution `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according @@ -808,14 +829,24 @@ This of course assumes they will be resolved against the same base URI. If this equivalence or difference of relative references does not mean anything. +## Version Guidance + +| Version | Status | PHP Version | +|---------|----------------|------------------| +| 1.x | Security fixes | >=5.4,<8.1 | +| 2.x | Latest | ^7.2.5 \|\| ^8.0 | + + ## Security If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information. + ## License Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information. + ## For Enterprise Available as part of the Tidelift Subscription diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json index 885aa1da..d2c7106c 100644 --- a/vendor/guzzlehttp/psr7/composer.json +++ b/vendor/guzzlehttp/psr7/composer.json @@ -79,10 +79,13 @@ }, "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "2.4-dev" } }, "config": { + "allow-plugins": { + "bamarni/composer-bin-plugin": true + }, "preferred-install": "dist", "sort-packages": true } diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php index 7a70ee94..f34722cf 100644 --- a/vendor/guzzlehttp/psr7/src/CachingStream.php +++ b/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -20,6 +20,11 @@ final class CachingStream implements StreamInterface /** @var int Number of bytes to skip reading due to a write on the buffer */ private $skipReadBytes = 0; + /** + * @var StreamInterface + */ + private $stream; + /** * We will treat the buffer object as the body of the stream * diff --git a/vendor/guzzlehttp/psr7/src/DroppingStream.php b/vendor/guzzlehttp/psr7/src/DroppingStream.php index d78070ae..6e3d209d 100644 --- a/vendor/guzzlehttp/psr7/src/DroppingStream.php +++ b/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -17,6 +17,9 @@ final class DroppingStream implements StreamInterface /** @var int */ private $maxLength; + /** @var StreamInterface */ + private $stream; + /** * @param StreamInterface $stream Underlying stream to decorate. * @param int $maxLength Maximum size before dropping data. diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php index c2156184..3a1a9512 100644 --- a/vendor/guzzlehttp/psr7/src/FnStream.php +++ b/vendor/guzzlehttp/psr7/src/FnStream.php @@ -12,6 +12,7 @@ use Psr\Http\Message\StreamInterface; * Allows for easy testing and extension of a provided stream without needing * to create a concrete class for a simple extension point. */ +#[\AllowDynamicProperties] final class FnStream implements StreamInterface { private const SLOTS = [ diff --git a/vendor/guzzlehttp/psr7/src/Header.php b/vendor/guzzlehttp/psr7/src/Header.php index 0e79a71a..10744ed4 100644 --- a/vendor/guzzlehttp/psr7/src/Header.php +++ b/vendor/guzzlehttp/psr7/src/Header.php @@ -19,20 +19,22 @@ final class Header static $trimmed = "\"' \n\t\r"; $params = $matches = []; - foreach (self::normalize($header) as $val) { - $part = []; - foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { - if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { - $m = $matches[0]; - if (isset($m[1])) { - $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); - } else { - $part[] = trim($m[0], $trimmed); + foreach ((array) $header as $value) { + foreach (self::splitList($value) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) { + $m = $matches[0]; + if (isset($m[1])) { + $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed); + } else { + $part[] = trim($m[0], $trimmed); + } } } - } - if ($part) { - $params[] = $part; + if ($part) { + $params[] = $part; + } } } @@ -44,23 +46,86 @@ final class Header * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. + * + * @deprecated Use self::splitList() instead. */ public static function normalize($header): array { - if (!is_array($header)) { - return array_map('trim', explode(',', $header)); + $result = []; + foreach ((array) $header as $value) { + foreach (self::splitList($value) as $parsed) { + $result[] = $parsed; + } + } + + return $result; + } + + /** + * Splits a HTTP header defined to contain comma-separated list into + * each individual value. Empty values will be removed. + * + * Example headers include 'accept', 'cache-control' and 'if-none-match'. + * + * This method must not be used to parse headers that are not defined as + * a list, such as 'user-agent' or 'set-cookie'. + * + * @param string|string[] $values Header value as returned by MessageInterface::getHeader() + * + * @return string[] + */ + public static function splitList($values): array + { + if (!\is_array($values)) { + $values = [$values]; } $result = []; - foreach ($header as $value) { - foreach ((array) $value as $v) { - if (strpos($v, ',') === false) { - $result[] = $v; + foreach ($values as $value) { + if (!\is_string($value)) { + throw new \TypeError('$header must either be a string or an array containing strings.'); + } + + $v = ''; + $isQuoted = false; + $isEscaped = false; + for ($i = 0, $max = \strlen($value); $i < $max; $i++) { + if ($isEscaped) { + $v .= $value[$i]; + $isEscaped = false; + continue; } - foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { - $result[] = trim($vv); + + if (!$isQuoted && $value[$i] === ',') { + $v = \trim($v); + if ($v !== '') { + $result[] = $v; + } + + $v = ''; + continue; } + + if ($isQuoted && $value[$i] === '\\') { + $isEscaped = true; + $v .= $value[$i]; + + continue; + } + if ($value[$i] === '"') { + $isQuoted = !$isQuoted; + $v .= $value[$i]; + + continue; + } + + $v .= $value[$i]; + } + + $v = \trim($v); + if ($v !== '') { + $result[] = $v; } } diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php index 8e3cf171..8e00f1c3 100644 --- a/vendor/guzzlehttp/psr7/src/InflateStream.php +++ b/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -21,6 +21,9 @@ final class InflateStream implements StreamInterface { use StreamDecoratorTrait; + /** @var StreamInterface */ + private $stream; + public function __construct(StreamInterface $stream) { $resource = StreamWrapper::getResource($stream); diff --git a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php index 6b604296..5618331f 100644 --- a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php +++ b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -10,6 +10,7 @@ use Psr\Http\Message\StreamInterface; * Lazily reads or writes to a file that is opened only after an IO operation * take place on the stream. */ +#[\AllowDynamicProperties] final class LazyOpenStream implements StreamInterface { use StreamDecoratorTrait; diff --git a/vendor/guzzlehttp/psr7/src/LimitStream.php b/vendor/guzzlehttp/psr7/src/LimitStream.php index 9762d38a..fb223255 100644 --- a/vendor/guzzlehttp/psr7/src/LimitStream.php +++ b/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -19,6 +19,9 @@ final class LimitStream implements StreamInterface /** @var int Limit the number of bytes that can be read */ private $limit; + /** @var StreamInterface */ + private $stream; + /** * @param StreamInterface $stream Stream to wrap * @param int $limit Total number of bytes to allow to be read diff --git a/vendor/guzzlehttp/psr7/src/Message.php b/vendor/guzzlehttp/psr7/src/Message.php index 9b825b30..335a6dd3 100644 --- a/vendor/guzzlehttp/psr7/src/Message.php +++ b/vendor/guzzlehttp/psr7/src/Message.php @@ -175,6 +175,9 @@ final class Message public static function parseRequestUri(string $path, array $headers): string { $hostKey = array_filter(array_keys($headers), function ($k) { + // Numeric array keys are converted to int by PHP. + $k = (string) $k; + return strtolower($k) === 'host'; }); diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php index 503c280b..d2dc28b6 100644 --- a/vendor/guzzlehttp/psr7/src/MessageTrait.php +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -145,11 +145,9 @@ trait MessageTrait { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { - if (is_int($header)) { - // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec - // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. - $header = (string) $header; - } + // Numeric array keys are converted to int by PHP. + $header = (string) $header; + $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = strtolower($header); @@ -171,14 +169,14 @@ trait MessageTrait private function normalizeHeaderValue($value): array { if (!is_array($value)) { - return $this->trimHeaderValues([$value]); + return $this->trimAndValidateHeaderValues([$value]); } if (count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } - return $this->trimHeaderValues($value); + return $this->trimAndValidateHeaderValues($value); } /** @@ -195,7 +193,7 @@ trait MessageTrait * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ - private function trimHeaderValues(array $values): array + private function trimAndValidateHeaderValues(array $values): array { return array_map(function ($value) { if (!is_scalar($value) && null !== $value) { @@ -205,7 +203,10 @@ trait MessageTrait )); } - return trim((string) $value, " \t"); + $trimmed = trim((string) $value, " \t"); + $this->assertValue($trimmed); + + return $trimmed; }, array_values($values)); } @@ -232,4 +233,32 @@ trait MessageTrait ); } } + + /** + * @see https://tools.ietf.org/html/rfc7230#section-3.2 + * + * field-value = *( field-content / obs-fold ) + * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] + * field-vchar = VCHAR / obs-text + * VCHAR = %x21-7E + * obs-text = %x80-FF + * obs-fold = CRLF 1*( SP / HTAB ) + */ + private function assertValue(string $value): void + { + // The regular expression intentionally does not support the obs-fold production, because as + // per RFC 7230#3.2.4: + // + // A sender MUST NOT generate a message that includes + // line folding (i.e., that has any field-value that contains a match to + // the obs-fold rule) unless the message is intended for packaging + // within the message/http media type. + // + // Clients must not send a request with line folding and a server sending folded headers is + // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting + // folding is not likely to break any legitimate use case. + if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/', $value)) { + throw new \InvalidArgumentException(sprintf('"%s" is not valid header value', $value)); + } + } } diff --git a/vendor/guzzlehttp/psr7/src/MimeType.php b/vendor/guzzlehttp/psr7/src/MimeType.php index dfa94251..0debbd18 100644 --- a/vendor/guzzlehttp/psr7/src/MimeType.php +++ b/vendor/guzzlehttp/psr7/src/MimeType.php @@ -7,111 +7,1218 @@ namespace GuzzleHttp\Psr7; final class MimeType { private const MIME_TYPES = [ - '3gp' => 'video/3gpp', - '7z' => 'application/x-7z-compressed', - 'aac' => 'audio/x-aac', - 'ai' => 'application/postscript', - 'aif' => 'audio/x-aiff', - 'asc' => 'text/plain', - 'asf' => 'video/x-ms-asf', - 'atom' => 'application/atom+xml', - 'avi' => 'video/x-msvideo', - 'bmp' => 'image/bmp', - 'bz2' => 'application/x-bzip2', - 'cer' => 'application/pkix-cert', - 'crl' => 'application/pkix-crl', - 'crt' => 'application/x-x509-ca-cert', - 'css' => 'text/css', - 'csv' => 'text/csv', - 'cu' => 'application/cu-seeme', - 'deb' => 'application/x-debian-package', - 'doc' => 'application/msword', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dvi' => 'application/x-dvi', - 'eot' => 'application/vnd.ms-fontobject', - 'eps' => 'application/postscript', - 'epub' => 'application/epub+zip', - 'etx' => 'text/x-setext', - 'flac' => 'audio/flac', - 'flv' => 'video/x-flv', - 'gif' => 'image/gif', - 'gz' => 'application/gzip', - 'htm' => 'text/html', - 'html' => 'text/html', - 'ico' => 'image/x-icon', - 'ics' => 'text/calendar', - 'ini' => 'text/plain', - 'iso' => 'application/x-iso9660-image', - 'jar' => 'application/java-archive', - 'jpe' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'js' => 'text/javascript', - 'json' => 'application/json', - 'latex' => 'application/x-latex', - 'log' => 'text/plain', - 'm4a' => 'audio/mp4', - 'm4v' => 'video/mp4', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mov' => 'video/quicktime', - 'mkv' => 'video/x-matroska', - 'mp3' => 'audio/mpeg', - 'mp4' => 'video/mp4', - 'mp4a' => 'audio/mp4', - 'mp4v' => 'video/mp4', - 'mpe' => 'video/mpeg', - 'mpeg' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mpg4' => 'video/mp4', - 'oga' => 'audio/ogg', - 'ogg' => 'audio/ogg', - 'ogv' => 'video/ogg', - 'ogx' => 'application/ogg', - 'pbm' => 'image/x-portable-bitmap', - 'pdf' => 'application/pdf', - 'pgm' => 'image/x-portable-graymap', - 'png' => 'image/png', - 'pnm' => 'image/x-portable-anymap', - 'ppm' => 'image/x-portable-pixmap', - 'ppt' => 'application/vnd.ms-powerpoint', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'ps' => 'application/postscript', - 'qt' => 'video/quicktime', - 'rar' => 'application/x-rar-compressed', - 'ras' => 'image/x-cmu-raster', - 'rss' => 'application/rss+xml', - 'rtf' => 'application/rtf', - 'sgm' => 'text/sgml', - 'sgml' => 'text/sgml', - 'svg' => 'image/svg+xml', - 'swf' => 'application/x-shockwave-flash', - 'tar' => 'application/x-tar', - 'tif' => 'image/tiff', - 'tiff' => 'image/tiff', - 'torrent' => 'application/x-bittorrent', - 'ttf' => 'application/x-font-ttf', - 'txt' => 'text/plain', - 'wav' => 'audio/x-wav', - 'webm' => 'video/webm', - 'webp' => 'image/webp', - 'wma' => 'audio/x-ms-wma', - 'wmv' => 'video/x-ms-wmv', - 'woff' => 'application/x-font-woff', - 'wsdl' => 'application/wsdl+xml', - 'xbm' => 'image/x-xbitmap', - 'xls' => 'application/vnd.ms-excel', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xml' => 'application/xml', - 'xpm' => 'image/x-xpixmap', - 'xwd' => 'image/x-xwindowdump', - 'yaml' => 'text/yaml', - 'yml' => 'text/yaml', - 'zip' => 'application/zip', + '1km' => 'application/vnd.1000minds.decision-model+xml', + '3dml' => 'text/vnd.in3d.3dml', + '3ds' => 'image/x-3ds', + '3g2' => 'video/3gpp2', + '3gp' => 'video/3gp', + '3gpp' => 'video/3gpp', + '3mf' => 'model/3mf', + '7z' => 'application/x-7z-compressed', + '7zip' => 'application/x-7z-compressed', + '123' => 'application/vnd.lotus-1-2-3', + 'aab' => 'application/x-authorware-bin', + 'aac' => 'audio/x-acc', + 'aam' => 'application/x-authorware-map', + 'aas' => 'application/x-authorware-seg', + 'abw' => 'application/x-abiword', + 'ac' => 'application/vnd.nokia.n-gage.ac+xml', + 'ac3' => 'audio/ac3', + 'acc' => 'application/vnd.americandynamics.acc', + 'ace' => 'application/x-ace-compressed', + 'acu' => 'application/vnd.acucobol', + 'acutc' => 'application/vnd.acucorp', + 'adp' => 'audio/adpcm', + 'aep' => 'application/vnd.audiograph', + 'afm' => 'application/x-font-type1', + 'afp' => 'application/vnd.ibm.modcap', + 'age' => 'application/vnd.age', + 'ahead' => 'application/vnd.ahead.space', + 'ai' => 'application/pdf', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'air' => 'application/vnd.adobe.air-application-installer-package+zip', + 'ait' => 'application/vnd.dvb.ait', + 'ami' => 'application/vnd.amiga.ami', + 'amr' => 'audio/amr', + 'apk' => 'application/vnd.android.package-archive', + 'apng' => 'image/apng', + 'appcache' => 'text/cache-manifest', + 'application' => 'application/x-ms-application', + 'apr' => 'application/vnd.lotus-approach', + 'arc' => 'application/x-freearc', + 'arj' => 'application/x-arj', + 'asc' => 'application/pgp-signature', + 'asf' => 'video/x-ms-asf', + 'asm' => 'text/x-asm', + 'aso' => 'application/vnd.accpac.simply.aso', + 'asx' => 'video/x-ms-asf', + 'atc' => 'application/vnd.acucorp', + 'atom' => 'application/atom+xml', + 'atomcat' => 'application/atomcat+xml', + 'atomdeleted' => 'application/atomdeleted+xml', + 'atomsvc' => 'application/atomsvc+xml', + 'atx' => 'application/vnd.antix.game-component', + 'au' => 'audio/x-au', + 'avci' => 'image/avci', + 'avcs' => 'image/avcs', + 'avi' => 'video/x-msvideo', + 'avif' => 'image/avif', + 'aw' => 'application/applixware', + 'azf' => 'application/vnd.airzip.filesecure.azf', + 'azs' => 'application/vnd.airzip.filesecure.azs', + 'azv' => 'image/vnd.airzip.accelerator.azv', + 'azw' => 'application/vnd.amazon.ebook', + 'b16' => 'image/vnd.pco.b16', + 'bat' => 'application/x-msdownload', + 'bcpio' => 'application/x-bcpio', + 'bdf' => 'application/x-font-bdf', + 'bdm' => 'application/vnd.syncml.dm+wbxml', + 'bdoc' => 'application/x-bdoc', + 'bed' => 'application/vnd.realvnc.bed', + 'bh2' => 'application/vnd.fujitsu.oasysprs', + 'bin' => 'application/octet-stream', + 'blb' => 'application/x-blorb', + 'blorb' => 'application/x-blorb', + 'bmi' => 'application/vnd.bmi', + 'bmml' => 'application/vnd.balsamiq.bmml+xml', + 'bmp' => 'image/bmp', + 'book' => 'application/vnd.framemaker', + 'box' => 'application/vnd.previewsystems.box', + 'boz' => 'application/x-bzip2', + 'bpk' => 'application/octet-stream', + 'bpmn' => 'application/octet-stream', + 'bsp' => 'model/vnd.valve.source.compiled-map', + 'btif' => 'image/prs.btif', + 'buffer' => 'application/octet-stream', + 'bz' => 'application/x-bzip', + 'bz2' => 'application/x-bzip2', + 'c' => 'text/x-c', + 'c4d' => 'application/vnd.clonk.c4group', + 'c4f' => 'application/vnd.clonk.c4group', + 'c4g' => 'application/vnd.clonk.c4group', + 'c4p' => 'application/vnd.clonk.c4group', + 'c4u' => 'application/vnd.clonk.c4group', + 'c11amc' => 'application/vnd.cluetrust.cartomobile-config', + 'c11amz' => 'application/vnd.cluetrust.cartomobile-config-pkg', + 'cab' => 'application/vnd.ms-cab-compressed', + 'caf' => 'audio/x-caf', + 'cap' => 'application/vnd.tcpdump.pcap', + 'car' => 'application/vnd.curl.car', + 'cat' => 'application/vnd.ms-pki.seccat', + 'cb7' => 'application/x-cbr', + 'cba' => 'application/x-cbr', + 'cbr' => 'application/x-cbr', + 'cbt' => 'application/x-cbr', + 'cbz' => 'application/x-cbr', + 'cc' => 'text/x-c', + 'cco' => 'application/x-cocoa', + 'cct' => 'application/x-director', + 'ccxml' => 'application/ccxml+xml', + 'cdbcmsg' => 'application/vnd.contact.cmsg', + 'cdf' => 'application/x-netcdf', + 'cdfx' => 'application/cdfx+xml', + 'cdkey' => 'application/vnd.mediastation.cdkey', + 'cdmia' => 'application/cdmi-capability', + 'cdmic' => 'application/cdmi-container', + 'cdmid' => 'application/cdmi-domain', + 'cdmio' => 'application/cdmi-object', + 'cdmiq' => 'application/cdmi-queue', + 'cdr' => 'application/cdr', + 'cdx' => 'chemical/x-cdx', + 'cdxml' => 'application/vnd.chemdraw+xml', + 'cdy' => 'application/vnd.cinderella', + 'cer' => 'application/pkix-cert', + 'cfs' => 'application/x-cfs-compressed', + 'cgm' => 'image/cgm', + 'chat' => 'application/x-chat', + 'chm' => 'application/vnd.ms-htmlhelp', + 'chrt' => 'application/vnd.kde.kchart', + 'cif' => 'chemical/x-cif', + 'cii' => 'application/vnd.anser-web-certificate-issue-initiation', + 'cil' => 'application/vnd.ms-artgalry', + 'cjs' => 'application/node', + 'cla' => 'application/vnd.claymore', + 'class' => 'application/octet-stream', + 'clkk' => 'application/vnd.crick.clicker.keyboard', + 'clkp' => 'application/vnd.crick.clicker.palette', + 'clkt' => 'application/vnd.crick.clicker.template', + 'clkw' => 'application/vnd.crick.clicker.wordbank', + 'clkx' => 'application/vnd.crick.clicker', + 'clp' => 'application/x-msclip', + 'cmc' => 'application/vnd.cosmocaller', + 'cmdf' => 'chemical/x-cmdf', + 'cml' => 'chemical/x-cml', + 'cmp' => 'application/vnd.yellowriver-custom-menu', + 'cmx' => 'image/x-cmx', + 'cod' => 'application/vnd.rim.cod', + 'coffee' => 'text/coffeescript', + 'com' => 'application/x-msdownload', + 'conf' => 'text/plain', + 'cpio' => 'application/x-cpio', + 'cpl' => 'application/cpl+xml', + 'cpp' => 'text/x-c', + 'cpt' => 'application/mac-compactpro', + 'crd' => 'application/x-mscardfile', + 'crl' => 'application/pkix-crl', + 'crt' => 'application/x-x509-ca-cert', + 'crx' => 'application/x-chrome-extension', + 'cryptonote' => 'application/vnd.rig.cryptonote', + 'csh' => 'application/x-csh', + 'csl' => 'application/vnd.citationstyles.style+xml', + 'csml' => 'chemical/x-csml', + 'csp' => 'application/vnd.commonspace', + 'csr' => 'application/octet-stream', + 'css' => 'text/css', + 'cst' => 'application/x-director', + 'csv' => 'text/csv', + 'cu' => 'application/cu-seeme', + 'curl' => 'text/vnd.curl', + 'cww' => 'application/prs.cww', + 'cxt' => 'application/x-director', + 'cxx' => 'text/x-c', + 'dae' => 'model/vnd.collada+xml', + 'daf' => 'application/vnd.mobius.daf', + 'dart' => 'application/vnd.dart', + 'dataless' => 'application/vnd.fdsn.seed', + 'davmount' => 'application/davmount+xml', + 'dbf' => 'application/vnd.dbf', + 'dbk' => 'application/docbook+xml', + 'dcr' => 'application/x-director', + 'dcurl' => 'text/vnd.curl.dcurl', + 'dd2' => 'application/vnd.oma.dd2+xml', + 'ddd' => 'application/vnd.fujixerox.ddd', + 'ddf' => 'application/vnd.syncml.dmddf+xml', + 'dds' => 'image/vnd.ms-dds', + 'deb' => 'application/x-debian-package', + 'def' => 'text/plain', + 'deploy' => 'application/octet-stream', + 'der' => 'application/x-x509-ca-cert', + 'dfac' => 'application/vnd.dreamfactory', + 'dgc' => 'application/x-dgc-compressed', + 'dic' => 'text/x-c', + 'dir' => 'application/x-director', + 'dis' => 'application/vnd.mobius.dis', + 'disposition-notification' => 'message/disposition-notification', + 'dist' => 'application/octet-stream', + 'distz' => 'application/octet-stream', + 'djv' => 'image/vnd.djvu', + 'djvu' => 'image/vnd.djvu', + 'dll' => 'application/octet-stream', + 'dmg' => 'application/x-apple-diskimage', + 'dmn' => 'application/octet-stream', + 'dmp' => 'application/vnd.tcpdump.pcap', + 'dms' => 'application/octet-stream', + 'dna' => 'application/vnd.dna', + 'doc' => 'application/msword', + 'docm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'dot' => 'application/msword', + 'dotm' => 'application/vnd.ms-word.template.macroEnabled.12', + 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + 'dp' => 'application/vnd.osgi.dp', + 'dpg' => 'application/vnd.dpgraph', + 'dra' => 'audio/vnd.dra', + 'drle' => 'image/dicom-rle', + 'dsc' => 'text/prs.lines.tag', + 'dssc' => 'application/dssc+der', + 'dtb' => 'application/x-dtbook+xml', + 'dtd' => 'application/xml-dtd', + 'dts' => 'audio/vnd.dts', + 'dtshd' => 'audio/vnd.dts.hd', + 'dump' => 'application/octet-stream', + 'dvb' => 'video/vnd.dvb.file', + 'dvi' => 'application/x-dvi', + 'dwd' => 'application/atsc-dwd+xml', + 'dwf' => 'model/vnd.dwf', + 'dwg' => 'image/vnd.dwg', + 'dxf' => 'image/vnd.dxf', + 'dxp' => 'application/vnd.spotfire.dxp', + 'dxr' => 'application/x-director', + 'ear' => 'application/java-archive', + 'ecelp4800' => 'audio/vnd.nuera.ecelp4800', + 'ecelp7470' => 'audio/vnd.nuera.ecelp7470', + 'ecelp9600' => 'audio/vnd.nuera.ecelp9600', + 'ecma' => 'application/ecmascript', + 'edm' => 'application/vnd.novadigm.edm', + 'edx' => 'application/vnd.novadigm.edx', + 'efif' => 'application/vnd.picsel', + 'ei6' => 'application/vnd.pg.osasli', + 'elc' => 'application/octet-stream', + 'emf' => 'image/emf', + 'eml' => 'message/rfc822', + 'emma' => 'application/emma+xml', + 'emotionml' => 'application/emotionml+xml', + 'emz' => 'application/x-msmetafile', + 'eol' => 'audio/vnd.digital-winds', + 'eot' => 'application/vnd.ms-fontobject', + 'eps' => 'application/postscript', + 'epub' => 'application/epub+zip', + 'es' => 'application/ecmascript', + 'es3' => 'application/vnd.eszigno3+xml', + 'esa' => 'application/vnd.osgi.subsystem', + 'esf' => 'application/vnd.epson.esf', + 'et3' => 'application/vnd.eszigno3+xml', + 'etx' => 'text/x-setext', + 'eva' => 'application/x-eva', + 'evy' => 'application/x-envoy', + 'exe' => 'application/octet-stream', + 'exi' => 'application/exi', + 'exp' => 'application/express', + 'exr' => 'image/aces', + 'ext' => 'application/vnd.novadigm.ext', + 'ez' => 'application/andrew-inset', + 'ez2' => 'application/vnd.ezpix-album', + 'ez3' => 'application/vnd.ezpix-package', + 'f' => 'text/x-fortran', + 'f4v' => 'video/mp4', + 'f77' => 'text/x-fortran', + 'f90' => 'text/x-fortran', + 'fbs' => 'image/vnd.fastbidsheet', + 'fcdt' => 'application/vnd.adobe.formscentral.fcdt', + 'fcs' => 'application/vnd.isac.fcs', + 'fdf' => 'application/vnd.fdf', + 'fdt' => 'application/fdt+xml', + 'fe_launch' => 'application/vnd.denovo.fcselayout-link', + 'fg5' => 'application/vnd.fujitsu.oasysgp', + 'fgd' => 'application/x-director', + 'fh' => 'image/x-freehand', + 'fh4' => 'image/x-freehand', + 'fh5' => 'image/x-freehand', + 'fh7' => 'image/x-freehand', + 'fhc' => 'image/x-freehand', + 'fig' => 'application/x-xfig', + 'fits' => 'image/fits', + 'flac' => 'audio/x-flac', + 'fli' => 'video/x-fli', + 'flo' => 'application/vnd.micrografx.flo', + 'flv' => 'video/x-flv', + 'flw' => 'application/vnd.kde.kivio', + 'flx' => 'text/vnd.fmi.flexstor', + 'fly' => 'text/vnd.fly', + 'fm' => 'application/vnd.framemaker', + 'fnc' => 'application/vnd.frogans.fnc', + 'fo' => 'application/vnd.software602.filler.form+xml', + 'for' => 'text/x-fortran', + 'fpx' => 'image/vnd.fpx', + 'frame' => 'application/vnd.framemaker', + 'fsc' => 'application/vnd.fsc.weblaunch', + 'fst' => 'image/vnd.fst', + 'ftc' => 'application/vnd.fluxtime.clip', + 'fti' => 'application/vnd.anser-web-funds-transfer-initiation', + 'fvt' => 'video/vnd.fvt', + 'fxp' => 'application/vnd.adobe.fxp', + 'fxpl' => 'application/vnd.adobe.fxp', + 'fzs' => 'application/vnd.fuzzysheet', + 'g2w' => 'application/vnd.geoplan', + 'g3' => 'image/g3fax', + 'g3w' => 'application/vnd.geospace', + 'gac' => 'application/vnd.groove-account', + 'gam' => 'application/x-tads', + 'gbr' => 'application/rpki-ghostbusters', + 'gca' => 'application/x-gca-compressed', + 'gdl' => 'model/vnd.gdl', + 'gdoc' => 'application/vnd.google-apps.document', + 'ged' => 'text/vnd.familysearch.gedcom', + 'geo' => 'application/vnd.dynageo', + 'geojson' => 'application/geo+json', + 'gex' => 'application/vnd.geometry-explorer', + 'ggb' => 'application/vnd.geogebra.file', + 'ggt' => 'application/vnd.geogebra.tool', + 'ghf' => 'application/vnd.groove-help', + 'gif' => 'image/gif', + 'gim' => 'application/vnd.groove-identity-message', + 'glb' => 'model/gltf-binary', + 'gltf' => 'model/gltf+json', + 'gml' => 'application/gml+xml', + 'gmx' => 'application/vnd.gmx', + 'gnumeric' => 'application/x-gnumeric', + 'gpg' => 'application/gpg-keys', + 'gph' => 'application/vnd.flographit', + 'gpx' => 'application/gpx+xml', + 'gqf' => 'application/vnd.grafeq', + 'gqs' => 'application/vnd.grafeq', + 'gram' => 'application/srgs', + 'gramps' => 'application/x-gramps-xml', + 'gre' => 'application/vnd.geometry-explorer', + 'grv' => 'application/vnd.groove-injector', + 'grxml' => 'application/srgs+xml', + 'gsf' => 'application/x-font-ghostscript', + 'gsheet' => 'application/vnd.google-apps.spreadsheet', + 'gslides' => 'application/vnd.google-apps.presentation', + 'gtar' => 'application/x-gtar', + 'gtm' => 'application/vnd.groove-tool-message', + 'gtw' => 'model/vnd.gtw', + 'gv' => 'text/vnd.graphviz', + 'gxf' => 'application/gxf', + 'gxt' => 'application/vnd.geonext', + 'gz' => 'application/gzip', + 'gzip' => 'application/gzip', + 'h' => 'text/x-c', + 'h261' => 'video/h261', + 'h263' => 'video/h263', + 'h264' => 'video/h264', + 'hal' => 'application/vnd.hal+xml', + 'hbci' => 'application/vnd.hbci', + 'hbs' => 'text/x-handlebars-template', + 'hdd' => 'application/x-virtualbox-hdd', + 'hdf' => 'application/x-hdf', + 'heic' => 'image/heic', + 'heics' => 'image/heic-sequence', + 'heif' => 'image/heif', + 'heifs' => 'image/heif-sequence', + 'hej2' => 'image/hej2k', + 'held' => 'application/atsc-held+xml', + 'hh' => 'text/x-c', + 'hjson' => 'application/hjson', + 'hlp' => 'application/winhlp', + 'hpgl' => 'application/vnd.hp-hpgl', + 'hpid' => 'application/vnd.hp-hpid', + 'hps' => 'application/vnd.hp-hps', + 'hqx' => 'application/mac-binhex40', + 'hsj2' => 'image/hsj2', + 'htc' => 'text/x-component', + 'htke' => 'application/vnd.kenameaapp', + 'htm' => 'text/html', + 'html' => 'text/html', + 'hvd' => 'application/vnd.yamaha.hv-dic', + 'hvp' => 'application/vnd.yamaha.hv-voice', + 'hvs' => 'application/vnd.yamaha.hv-script', + 'i2g' => 'application/vnd.intergeo', + 'icc' => 'application/vnd.iccprofile', + 'ice' => 'x-conference/x-cooltalk', + 'icm' => 'application/vnd.iccprofile', + 'ico' => 'image/x-icon', + 'ics' => 'text/calendar', + 'ief' => 'image/ief', + 'ifb' => 'text/calendar', + 'ifm' => 'application/vnd.shana.informed.formdata', + 'iges' => 'model/iges', + 'igl' => 'application/vnd.igloader', + 'igm' => 'application/vnd.insors.igm', + 'igs' => 'model/iges', + 'igx' => 'application/vnd.micrografx.igx', + 'iif' => 'application/vnd.shana.informed.interchange', + 'img' => 'application/octet-stream', + 'imp' => 'application/vnd.accpac.simply.imp', + 'ims' => 'application/vnd.ms-ims', + 'in' => 'text/plain', + 'ini' => 'text/plain', + 'ink' => 'application/inkml+xml', + 'inkml' => 'application/inkml+xml', + 'install' => 'application/x-install-instructions', + 'iota' => 'application/vnd.astraea-software.iota', + 'ipfix' => 'application/ipfix', + 'ipk' => 'application/vnd.shana.informed.package', + 'irm' => 'application/vnd.ibm.rights-management', + 'irp' => 'application/vnd.irepository.package+xml', + 'iso' => 'application/x-iso9660-image', + 'itp' => 'application/vnd.shana.informed.formtemplate', + 'its' => 'application/its+xml', + 'ivp' => 'application/vnd.immervision-ivp', + 'ivu' => 'application/vnd.immervision-ivu', + 'jad' => 'text/vnd.sun.j2me.app-descriptor', + 'jade' => 'text/jade', + 'jam' => 'application/vnd.jam', + 'jar' => 'application/java-archive', + 'jardiff' => 'application/x-java-archive-diff', + 'java' => 'text/x-java-source', + 'jhc' => 'image/jphc', + 'jisp' => 'application/vnd.jisp', + 'jls' => 'image/jls', + 'jlt' => 'application/vnd.hp-jlyt', + 'jng' => 'image/x-jng', + 'jnlp' => 'application/x-java-jnlp-file', + 'joda' => 'application/vnd.joost.joda-archive', + 'jp2' => 'image/jp2', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpf' => 'image/jpx', + 'jpg' => 'image/jpeg', + 'jpg2' => 'image/jp2', + 'jpgm' => 'video/jpm', + 'jpgv' => 'video/jpeg', + 'jph' => 'image/jph', + 'jpm' => 'video/jpm', + 'jpx' => 'image/jpx', + 'js' => 'application/javascript', + 'json' => 'application/json', + 'json5' => 'application/json5', + 'jsonld' => 'application/ld+json', + 'jsonml' => 'application/jsonml+json', + 'jsx' => 'text/jsx', + 'jxr' => 'image/jxr', + 'jxra' => 'image/jxra', + 'jxrs' => 'image/jxrs', + 'jxs' => 'image/jxs', + 'jxsc' => 'image/jxsc', + 'jxsi' => 'image/jxsi', + 'jxss' => 'image/jxss', + 'kar' => 'audio/midi', + 'karbon' => 'application/vnd.kde.karbon', + 'kdb' => 'application/octet-stream', + 'kdbx' => 'application/x-keepass2', + 'key' => 'application/x-iwork-keynote-sffkey', + 'kfo' => 'application/vnd.kde.kformula', + 'kia' => 'application/vnd.kidspiration', + 'kml' => 'application/vnd.google-earth.kml+xml', + 'kmz' => 'application/vnd.google-earth.kmz', + 'kne' => 'application/vnd.kinar', + 'knp' => 'application/vnd.kinar', + 'kon' => 'application/vnd.kde.kontour', + 'kpr' => 'application/vnd.kde.kpresenter', + 'kpt' => 'application/vnd.kde.kpresenter', + 'kpxx' => 'application/vnd.ds-keypoint', + 'ksp' => 'application/vnd.kde.kspread', + 'ktr' => 'application/vnd.kahootz', + 'ktx' => 'image/ktx', + 'ktx2' => 'image/ktx2', + 'ktz' => 'application/vnd.kahootz', + 'kwd' => 'application/vnd.kde.kword', + 'kwt' => 'application/vnd.kde.kword', + 'lasxml' => 'application/vnd.las.las+xml', + 'latex' => 'application/x-latex', + 'lbd' => 'application/vnd.llamagraphics.life-balance.desktop', + 'lbe' => 'application/vnd.llamagraphics.life-balance.exchange+xml', + 'les' => 'application/vnd.hhe.lesson-player', + 'less' => 'text/less', + 'lgr' => 'application/lgr+xml', + 'lha' => 'application/octet-stream', + 'link66' => 'application/vnd.route66.link66+xml', + 'list' => 'text/plain', + 'list3820' => 'application/vnd.ibm.modcap', + 'listafp' => 'application/vnd.ibm.modcap', + 'litcoffee' => 'text/coffeescript', + 'lnk' => 'application/x-ms-shortcut', + 'log' => 'text/plain', + 'lostxml' => 'application/lost+xml', + 'lrf' => 'application/octet-stream', + 'lrm' => 'application/vnd.ms-lrm', + 'ltf' => 'application/vnd.frogans.ltf', + 'lua' => 'text/x-lua', + 'luac' => 'application/x-lua-bytecode', + 'lvp' => 'audio/vnd.lucent.voice', + 'lwp' => 'application/vnd.lotus-wordpro', + 'lzh' => 'application/octet-stream', + 'm1v' => 'video/mpeg', + 'm2a' => 'audio/mpeg', + 'm2v' => 'video/mpeg', + 'm3a' => 'audio/mpeg', + 'm3u' => 'text/plain', + 'm3u8' => 'application/vnd.apple.mpegurl', + 'm4a' => 'audio/x-m4a', + 'm4p' => 'application/mp4', + 'm4s' => 'video/iso.segment', + 'm4u' => 'application/vnd.mpegurl', + 'm4v' => 'video/x-m4v', + 'm13' => 'application/x-msmediaview', + 'm14' => 'application/x-msmediaview', + 'm21' => 'application/mp21', + 'ma' => 'application/mathematica', + 'mads' => 'application/mads+xml', + 'maei' => 'application/mmt-aei+xml', + 'mag' => 'application/vnd.ecowin.chart', + 'maker' => 'application/vnd.framemaker', + 'man' => 'text/troff', + 'manifest' => 'text/cache-manifest', + 'map' => 'application/json', + 'mar' => 'application/octet-stream', + 'markdown' => 'text/markdown', + 'mathml' => 'application/mathml+xml', + 'mb' => 'application/mathematica', + 'mbk' => 'application/vnd.mobius.mbk', + 'mbox' => 'application/mbox', + 'mc1' => 'application/vnd.medcalcdata', + 'mcd' => 'application/vnd.mcd', + 'mcurl' => 'text/vnd.curl.mcurl', + 'md' => 'text/markdown', + 'mdb' => 'application/x-msaccess', + 'mdi' => 'image/vnd.ms-modi', + 'mdx' => 'text/mdx', + 'me' => 'text/troff', + 'mesh' => 'model/mesh', + 'meta4' => 'application/metalink4+xml', + 'metalink' => 'application/metalink+xml', + 'mets' => 'application/mets+xml', + 'mfm' => 'application/vnd.mfmp', + 'mft' => 'application/rpki-manifest', + 'mgp' => 'application/vnd.osgeo.mapguide.package', + 'mgz' => 'application/vnd.proteus.magazine', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mie' => 'application/x-mie', + 'mif' => 'application/vnd.mif', + 'mime' => 'message/rfc822', + 'mj2' => 'video/mj2', + 'mjp2' => 'video/mj2', + 'mjs' => 'application/javascript', + 'mk3d' => 'video/x-matroska', + 'mka' => 'audio/x-matroska', + 'mkd' => 'text/x-markdown', + 'mks' => 'video/x-matroska', + 'mkv' => 'video/x-matroska', + 'mlp' => 'application/vnd.dolby.mlp', + 'mmd' => 'application/vnd.chipnuts.karaoke-mmd', + 'mmf' => 'application/vnd.smaf', + 'mml' => 'text/mathml', + 'mmr' => 'image/vnd.fujixerox.edmics-mmr', + 'mng' => 'video/x-mng', + 'mny' => 'application/x-msmoney', + 'mobi' => 'application/x-mobipocket-ebook', + 'mods' => 'application/mods+xml', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp2a' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mp4' => 'video/mp4', + 'mp4a' => 'audio/mp4', + 'mp4s' => 'application/mp4', + 'mp4v' => 'video/mp4', + 'mp21' => 'application/mp21', + 'mpc' => 'application/vnd.mophun.certificate', + 'mpd' => 'application/dash+xml', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpf' => 'application/media-policy-dataset+xml', + 'mpg' => 'video/mpeg', + 'mpg4' => 'video/mp4', + 'mpga' => 'audio/mpeg', + 'mpkg' => 'application/vnd.apple.installer+xml', + 'mpm' => 'application/vnd.blueice.multipass', + 'mpn' => 'application/vnd.mophun.application', + 'mpp' => 'application/vnd.ms-project', + 'mpt' => 'application/vnd.ms-project', + 'mpy' => 'application/vnd.ibm.minipay', + 'mqy' => 'application/vnd.mobius.mqy', + 'mrc' => 'application/marc', + 'mrcx' => 'application/marcxml+xml', + 'ms' => 'text/troff', + 'mscml' => 'application/mediaservercontrol+xml', + 'mseed' => 'application/vnd.fdsn.mseed', + 'mseq' => 'application/vnd.mseq', + 'msf' => 'application/vnd.epson.msf', + 'msg' => 'application/vnd.ms-outlook', + 'msh' => 'model/mesh', + 'msi' => 'application/x-msdownload', + 'msl' => 'application/vnd.mobius.msl', + 'msm' => 'application/octet-stream', + 'msp' => 'application/octet-stream', + 'msty' => 'application/vnd.muvee.style', + 'mtl' => 'model/mtl', + 'mts' => 'model/vnd.mts', + 'mus' => 'application/vnd.musician', + 'musd' => 'application/mmt-usd+xml', + 'musicxml' => 'application/vnd.recordare.musicxml+xml', + 'mvb' => 'application/x-msmediaview', + 'mvt' => 'application/vnd.mapbox-vector-tile', + 'mwf' => 'application/vnd.mfer', + 'mxf' => 'application/mxf', + 'mxl' => 'application/vnd.recordare.musicxml', + 'mxmf' => 'audio/mobile-xmf', + 'mxml' => 'application/xv+xml', + 'mxs' => 'application/vnd.triscape.mxs', + 'mxu' => 'video/vnd.mpegurl', + 'n-gage' => 'application/vnd.nokia.n-gage.symbian.install', + 'n3' => 'text/n3', + 'nb' => 'application/mathematica', + 'nbp' => 'application/vnd.wolfram.player', + 'nc' => 'application/x-netcdf', + 'ncx' => 'application/x-dtbncx+xml', + 'nfo' => 'text/x-nfo', + 'ngdat' => 'application/vnd.nokia.n-gage.data', + 'nitf' => 'application/vnd.nitf', + 'nlu' => 'application/vnd.neurolanguage.nlu', + 'nml' => 'application/vnd.enliven', + 'nnd' => 'application/vnd.noblenet-directory', + 'nns' => 'application/vnd.noblenet-sealer', + 'nnw' => 'application/vnd.noblenet-web', + 'npx' => 'image/vnd.net-fpx', + 'nq' => 'application/n-quads', + 'nsc' => 'application/x-conference', + 'nsf' => 'application/vnd.lotus-notes', + 'nt' => 'application/n-triples', + 'ntf' => 'application/vnd.nitf', + 'numbers' => 'application/x-iwork-numbers-sffnumbers', + 'nzb' => 'application/x-nzb', + 'oa2' => 'application/vnd.fujitsu.oasys2', + 'oa3' => 'application/vnd.fujitsu.oasys3', + 'oas' => 'application/vnd.fujitsu.oasys', + 'obd' => 'application/x-msbinder', + 'obgx' => 'application/vnd.openblox.game+xml', + 'obj' => 'model/obj', + 'oda' => 'application/oda', + 'odb' => 'application/vnd.oasis.opendocument.database', + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'odft' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'oga' => 'audio/ogg', + 'ogex' => 'model/vnd.opengex', + 'ogg' => 'audio/ogg', + 'ogv' => 'video/ogg', + 'ogx' => 'application/ogg', + 'omdoc' => 'application/omdoc+xml', + 'onepkg' => 'application/onenote', + 'onetmp' => 'application/onenote', + 'onetoc' => 'application/onenote', + 'onetoc2' => 'application/onenote', + 'opf' => 'application/oebps-package+xml', + 'opml' => 'text/x-opml', + 'oprc' => 'application/vnd.palm', + 'opus' => 'audio/ogg', + 'org' => 'text/x-org', + 'osf' => 'application/vnd.yamaha.openscoreformat', + 'osfpvg' => 'application/vnd.yamaha.openscoreformat.osfpvg+xml', + 'osm' => 'application/vnd.openstreetmap.data+xml', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'otf' => 'font/otf', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'ova' => 'application/x-virtualbox-ova', + 'ovf' => 'application/x-virtualbox-ovf', + 'owl' => 'application/rdf+xml', + 'oxps' => 'application/oxps', + 'oxt' => 'application/vnd.openofficeorg.extension', + 'p' => 'text/x-pascal', + 'p7a' => 'application/x-pkcs7-signature', + 'p7b' => 'application/x-pkcs7-certificates', + 'p7c' => 'application/pkcs7-mime', + 'p7m' => 'application/pkcs7-mime', + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'p8' => 'application/pkcs8', + 'p10' => 'application/x-pkcs10', + 'p12' => 'application/x-pkcs12', + 'pac' => 'application/x-ns-proxy-autoconfig', + 'pages' => 'application/x-iwork-pages-sffpages', + 'pas' => 'text/x-pascal', + 'paw' => 'application/vnd.pawaafile', + 'pbd' => 'application/vnd.powerbuilder6', + 'pbm' => 'image/x-portable-bitmap', + 'pcap' => 'application/vnd.tcpdump.pcap', + 'pcf' => 'application/x-font-pcf', + 'pcl' => 'application/vnd.hp-pcl', + 'pclxl' => 'application/vnd.hp-pclxl', + 'pct' => 'image/x-pict', + 'pcurl' => 'application/vnd.curl.pcurl', + 'pcx' => 'image/x-pcx', + 'pdb' => 'application/x-pilot', + 'pde' => 'text/x-processing', + 'pdf' => 'application/pdf', + 'pem' => 'application/x-x509-user-cert', + 'pfa' => 'application/x-font-type1', + 'pfb' => 'application/x-font-type1', + 'pfm' => 'application/x-font-type1', + 'pfr' => 'application/font-tdpfr', + 'pfx' => 'application/x-pkcs12', + 'pgm' => 'image/x-portable-graymap', + 'pgn' => 'application/x-chess-pgn', + 'pgp' => 'application/pgp', + 'phar' => 'application/octet-stream', + 'php' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'phtml' => 'application/x-httpd-php', + 'pic' => 'image/x-pict', + 'pkg' => 'application/octet-stream', + 'pki' => 'application/pkixcmp', + 'pkipath' => 'application/pkix-pkipath', + 'pkpass' => 'application/vnd.apple.pkpass', + 'pl' => 'application/x-perl', + 'plb' => 'application/vnd.3gpp.pic-bw-large', + 'plc' => 'application/vnd.mobius.plc', + 'plf' => 'application/vnd.pocketlearn', + 'pls' => 'application/pls+xml', + 'pm' => 'application/x-perl', + 'pml' => 'application/vnd.ctc-posml', + 'png' => 'image/png', + 'pnm' => 'image/x-portable-anymap', + 'portpkg' => 'application/vnd.macports.portpkg', + 'pot' => 'application/vnd.ms-powerpoint', + 'potm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'ppa' => 'application/vnd.ms-powerpoint', + 'ppam' => 'application/vnd.ms-powerpoint.addin.macroEnabled.12', + 'ppd' => 'application/vnd.cups-ppd', + 'ppm' => 'image/x-portable-pixmap', + 'pps' => 'application/vnd.ms-powerpoint', + 'ppsm' => 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12', + 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + 'ppt' => 'application/powerpoint', + 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', + 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'pqa' => 'application/vnd.palm', + 'prc' => 'model/prc', + 'pre' => 'application/vnd.lotus-freelance', + 'prf' => 'application/pics-rules', + 'provx' => 'application/provenance+xml', + 'ps' => 'application/postscript', + 'psb' => 'application/vnd.3gpp.pic-bw-small', + 'psd' => 'application/x-photoshop', + 'psf' => 'application/x-font-linux-psf', + 'pskcxml' => 'application/pskc+xml', + 'pti' => 'image/prs.pti', + 'ptid' => 'application/vnd.pvi.ptid1', + 'pub' => 'application/x-mspublisher', + 'pvb' => 'application/vnd.3gpp.pic-bw-var', + 'pwn' => 'application/vnd.3m.post-it-notes', + 'pya' => 'audio/vnd.ms-playready.media.pya', + 'pyv' => 'video/vnd.ms-playready.media.pyv', + 'qam' => 'application/vnd.epson.quickanime', + 'qbo' => 'application/vnd.intu.qbo', + 'qfx' => 'application/vnd.intu.qfx', + 'qps' => 'application/vnd.publishare-delta-tree', + 'qt' => 'video/quicktime', + 'qwd' => 'application/vnd.quark.quarkxpress', + 'qwt' => 'application/vnd.quark.quarkxpress', + 'qxb' => 'application/vnd.quark.quarkxpress', + 'qxd' => 'application/vnd.quark.quarkxpress', + 'qxl' => 'application/vnd.quark.quarkxpress', + 'qxt' => 'application/vnd.quark.quarkxpress', + 'ra' => 'audio/x-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'raml' => 'application/raml+yaml', + 'rapd' => 'application/route-apd+xml', + 'rar' => 'application/x-rar', + 'ras' => 'image/x-cmu-raster', + 'rcprofile' => 'application/vnd.ipunplugged.rcprofile', + 'rdf' => 'application/rdf+xml', + 'rdz' => 'application/vnd.data-vision.rdz', + 'relo' => 'application/p2p-overlay+xml', + 'rep' => 'application/vnd.businessobjects', + 'res' => 'application/x-dtbresource+xml', + 'rgb' => 'image/x-rgb', + 'rif' => 'application/reginfo+xml', + 'rip' => 'audio/vnd.rip', + 'ris' => 'application/x-research-info-systems', + 'rl' => 'application/resource-lists+xml', + 'rlc' => 'image/vnd.fujixerox.edmics-rlc', + 'rld' => 'application/resource-lists-diff+xml', + 'rm' => 'audio/x-pn-realaudio', + 'rmi' => 'audio/midi', + 'rmp' => 'audio/x-pn-realaudio-plugin', + 'rms' => 'application/vnd.jcp.javame.midlet-rms', + 'rmvb' => 'application/vnd.rn-realmedia-vbr', + 'rnc' => 'application/relax-ng-compact-syntax', + 'rng' => 'application/xml', + 'roa' => 'application/rpki-roa', + 'roff' => 'text/troff', + 'rp9' => 'application/vnd.cloanto.rp9', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'rpss' => 'application/vnd.nokia.radio-presets', + 'rpst' => 'application/vnd.nokia.radio-preset', + 'rq' => 'application/sparql-query', + 'rs' => 'application/rls-services+xml', + 'rsa' => 'application/x-pkcs7', + 'rsat' => 'application/atsc-rsat+xml', + 'rsd' => 'application/rsd+xml', + 'rsheet' => 'application/urc-ressheet+xml', + 'rss' => 'application/rss+xml', + 'rtf' => 'text/rtf', + 'rtx' => 'text/richtext', + 'run' => 'application/x-makeself', + 'rusd' => 'application/route-usd+xml', + 'rv' => 'video/vnd.rn-realvideo', + 's' => 'text/x-asm', + 's3m' => 'audio/s3m', + 'saf' => 'application/vnd.yamaha.smaf-audio', + 'sass' => 'text/x-sass', + 'sbml' => 'application/sbml+xml', + 'sc' => 'application/vnd.ibm.secure-container', + 'scd' => 'application/x-msschedule', + 'scm' => 'application/vnd.lotus-screencam', + 'scq' => 'application/scvp-cv-request', + 'scs' => 'application/scvp-cv-response', + 'scss' => 'text/x-scss', + 'scurl' => 'text/vnd.curl.scurl', + 'sda' => 'application/vnd.stardivision.draw', + 'sdc' => 'application/vnd.stardivision.calc', + 'sdd' => 'application/vnd.stardivision.impress', + 'sdkd' => 'application/vnd.solent.sdkm+xml', + 'sdkm' => 'application/vnd.solent.sdkm+xml', + 'sdp' => 'application/sdp', + 'sdw' => 'application/vnd.stardivision.writer', + 'sea' => 'application/octet-stream', + 'see' => 'application/vnd.seemail', + 'seed' => 'application/vnd.fdsn.seed', + 'sema' => 'application/vnd.sema', + 'semd' => 'application/vnd.semd', + 'semf' => 'application/vnd.semf', + 'senmlx' => 'application/senml+xml', + 'sensmlx' => 'application/sensml+xml', + 'ser' => 'application/java-serialized-object', + 'setpay' => 'application/set-payment-initiation', + 'setreg' => 'application/set-registration-initiation', + 'sfd-hdstx' => 'application/vnd.hydrostatix.sof-data', + 'sfs' => 'application/vnd.spotfire.sfs', + 'sfv' => 'text/x-sfv', + 'sgi' => 'image/sgi', + 'sgl' => 'application/vnd.stardivision.writer-global', + 'sgm' => 'text/sgml', + 'sgml' => 'text/sgml', + 'sh' => 'application/x-sh', + 'shar' => 'application/x-shar', + 'shex' => 'text/shex', + 'shf' => 'application/shf+xml', + 'shtml' => 'text/html', + 'sid' => 'image/x-mrsid-image', + 'sieve' => 'application/sieve', + 'sig' => 'application/pgp-signature', + 'sil' => 'audio/silk', + 'silo' => 'model/mesh', + 'sis' => 'application/vnd.symbian.install', + 'sisx' => 'application/vnd.symbian.install', + 'sit' => 'application/x-stuffit', + 'sitx' => 'application/x-stuffitx', + 'siv' => 'application/sieve', + 'skd' => 'application/vnd.koan', + 'skm' => 'application/vnd.koan', + 'skp' => 'application/vnd.koan', + 'skt' => 'application/vnd.koan', + 'sldm' => 'application/vnd.ms-powerpoint.slide.macroenabled.12', + 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', + 'slim' => 'text/slim', + 'slm' => 'text/slim', + 'sls' => 'application/route-s-tsid+xml', + 'slt' => 'application/vnd.epson.salt', + 'sm' => 'application/vnd.stepmania.stepchart', + 'smf' => 'application/vnd.stardivision.math', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'smv' => 'video/x-smv', + 'smzip' => 'application/vnd.stepmania.package', + 'snd' => 'audio/basic', + 'snf' => 'application/x-font-snf', + 'so' => 'application/octet-stream', + 'spc' => 'application/x-pkcs7-certificates', + 'spdx' => 'text/spdx', + 'spf' => 'application/vnd.yamaha.smaf-phrase', + 'spl' => 'application/x-futuresplash', + 'spot' => 'text/vnd.in3d.spot', + 'spp' => 'application/scvp-vp-response', + 'spq' => 'application/scvp-vp-request', + 'spx' => 'audio/ogg', + 'sql' => 'application/x-sql', + 'src' => 'application/x-wais-source', + 'srt' => 'application/x-subrip', + 'sru' => 'application/sru+xml', + 'srx' => 'application/sparql-results+xml', + 'ssdl' => 'application/ssdl+xml', + 'sse' => 'application/vnd.kodak-descriptor', + 'ssf' => 'application/vnd.epson.ssf', + 'ssml' => 'application/ssml+xml', + 'sst' => 'application/octet-stream', + 'st' => 'application/vnd.sailingtracker.track', + 'stc' => 'application/vnd.sun.xml.calc.template', + 'std' => 'application/vnd.sun.xml.draw.template', + 'stf' => 'application/vnd.wt.stf', + 'sti' => 'application/vnd.sun.xml.impress.template', + 'stk' => 'application/hyperstudio', + 'stl' => 'model/stl', + 'stpx' => 'model/step+xml', + 'stpxz' => 'model/step-xml+zip', + 'stpz' => 'model/step+zip', + 'str' => 'application/vnd.pg.format', + 'stw' => 'application/vnd.sun.xml.writer.template', + 'styl' => 'text/stylus', + 'stylus' => 'text/stylus', + 'sub' => 'text/vnd.dvb.subtitle', + 'sus' => 'application/vnd.sus-calendar', + 'susp' => 'application/vnd.sus-calendar', + 'sv4cpio' => 'application/x-sv4cpio', + 'sv4crc' => 'application/x-sv4crc', + 'svc' => 'application/vnd.dvb.service', + 'svd' => 'application/vnd.svd', + 'svg' => 'image/svg+xml', + 'svgz' => 'image/svg+xml', + 'swa' => 'application/x-director', + 'swf' => 'application/x-shockwave-flash', + 'swi' => 'application/vnd.aristanetworks.swi', + 'swidtag' => 'application/swid+xml', + 'sxc' => 'application/vnd.sun.xml.calc', + 'sxd' => 'application/vnd.sun.xml.draw', + 'sxg' => 'application/vnd.sun.xml.writer.global', + 'sxi' => 'application/vnd.sun.xml.impress', + 'sxm' => 'application/vnd.sun.xml.math', + 'sxw' => 'application/vnd.sun.xml.writer', + 't' => 'text/troff', + 't3' => 'application/x-t3vm-image', + 't38' => 'image/t38', + 'taglet' => 'application/vnd.mynfc', + 'tao' => 'application/vnd.tao.intent-module-archive', + 'tap' => 'image/vnd.tencent.tap', + 'tar' => 'application/x-tar', + 'tcap' => 'application/vnd.3gpp2.tcap', + 'tcl' => 'application/x-tcl', + 'td' => 'application/urc-targetdesc+xml', + 'teacher' => 'application/vnd.smart.teacher', + 'tei' => 'application/tei+xml', + 'teicorpus' => 'application/tei+xml', + 'tex' => 'application/x-tex', + 'texi' => 'application/x-texinfo', + 'texinfo' => 'application/x-texinfo', + 'text' => 'text/plain', + 'tfi' => 'application/thraud+xml', + 'tfm' => 'application/x-tex-tfm', + 'tfx' => 'image/tiff-fx', + 'tga' => 'image/x-tga', + 'tgz' => 'application/x-tar', + 'thmx' => 'application/vnd.ms-officetheme', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'tk' => 'application/x-tcl', + 'tmo' => 'application/vnd.tmobile-livetv', + 'toml' => 'application/toml', + 'torrent' => 'application/x-bittorrent', + 'tpl' => 'application/vnd.groove-tool-template', + 'tpt' => 'application/vnd.trid.tpt', + 'tr' => 'text/troff', + 'tra' => 'application/vnd.trueapp', + 'trig' => 'application/trig', + 'trm' => 'application/x-msterminal', + 'ts' => 'video/mp2t', + 'tsd' => 'application/timestamped-data', + 'tsv' => 'text/tab-separated-values', + 'ttc' => 'font/collection', + 'ttf' => 'font/ttf', + 'ttl' => 'text/turtle', + 'ttml' => 'application/ttml+xml', + 'twd' => 'application/vnd.simtech-mindmapper', + 'twds' => 'application/vnd.simtech-mindmapper', + 'txd' => 'application/vnd.genomatix.tuxedo', + 'txf' => 'application/vnd.mobius.txf', + 'txt' => 'text/plain', + 'u3d' => 'model/u3d', + 'u8dsn' => 'message/global-delivery-status', + 'u8hdr' => 'message/global-headers', + 'u8mdn' => 'message/global-disposition-notification', + 'u8msg' => 'message/global', + 'u32' => 'application/x-authorware-bin', + 'ubj' => 'application/ubjson', + 'udeb' => 'application/x-debian-package', + 'ufd' => 'application/vnd.ufdl', + 'ufdl' => 'application/vnd.ufdl', + 'ulx' => 'application/x-glulx', + 'umj' => 'application/vnd.umajin', + 'unityweb' => 'application/vnd.unity', + 'uoml' => 'application/vnd.uoml+xml', + 'uri' => 'text/uri-list', + 'uris' => 'text/uri-list', + 'urls' => 'text/uri-list', + 'usdz' => 'model/vnd.usdz+zip', + 'ustar' => 'application/x-ustar', + 'utz' => 'application/vnd.uiq.theme', + 'uu' => 'text/x-uuencode', + 'uva' => 'audio/vnd.dece.audio', + 'uvd' => 'application/vnd.dece.data', + 'uvf' => 'application/vnd.dece.data', + 'uvg' => 'image/vnd.dece.graphic', + 'uvh' => 'video/vnd.dece.hd', + 'uvi' => 'image/vnd.dece.graphic', + 'uvm' => 'video/vnd.dece.mobile', + 'uvp' => 'video/vnd.dece.pd', + 'uvs' => 'video/vnd.dece.sd', + 'uvt' => 'application/vnd.dece.ttml+xml', + 'uvu' => 'video/vnd.uvvu.mp4', + 'uvv' => 'video/vnd.dece.video', + 'uvva' => 'audio/vnd.dece.audio', + 'uvvd' => 'application/vnd.dece.data', + 'uvvf' => 'application/vnd.dece.data', + 'uvvg' => 'image/vnd.dece.graphic', + 'uvvh' => 'video/vnd.dece.hd', + 'uvvi' => 'image/vnd.dece.graphic', + 'uvvm' => 'video/vnd.dece.mobile', + 'uvvp' => 'video/vnd.dece.pd', + 'uvvs' => 'video/vnd.dece.sd', + 'uvvt' => 'application/vnd.dece.ttml+xml', + 'uvvu' => 'video/vnd.uvvu.mp4', + 'uvvv' => 'video/vnd.dece.video', + 'uvvx' => 'application/vnd.dece.unspecified', + 'uvvz' => 'application/vnd.dece.zip', + 'uvx' => 'application/vnd.dece.unspecified', + 'uvz' => 'application/vnd.dece.zip', + 'vbox' => 'application/x-virtualbox-vbox', + 'vbox-extpack' => 'application/x-virtualbox-vbox-extpack', + 'vcard' => 'text/vcard', + 'vcd' => 'application/x-cdlink', + 'vcf' => 'text/x-vcard', + 'vcg' => 'application/vnd.groove-vcard', + 'vcs' => 'text/x-vcalendar', + 'vcx' => 'application/vnd.vcx', + 'vdi' => 'application/x-virtualbox-vdi', + 'vds' => 'model/vnd.sap.vds', + 'vhd' => 'application/x-virtualbox-vhd', + 'vis' => 'application/vnd.visionary', + 'viv' => 'video/vnd.vivo', + 'vlc' => 'application/videolan', + 'vmdk' => 'application/x-virtualbox-vmdk', + 'vob' => 'video/x-ms-vob', + 'vor' => 'application/vnd.stardivision.writer', + 'vox' => 'application/x-authorware-bin', + 'vrml' => 'model/vrml', + 'vsd' => 'application/vnd.visio', + 'vsf' => 'application/vnd.vsf', + 'vss' => 'application/vnd.visio', + 'vst' => 'application/vnd.visio', + 'vsw' => 'application/vnd.visio', + 'vtf' => 'image/vnd.valve.source.texture', + 'vtt' => 'text/vtt', + 'vtu' => 'model/vnd.vtu', + 'vxml' => 'application/voicexml+xml', + 'w3d' => 'application/x-director', + 'wad' => 'application/x-doom', + 'wadl' => 'application/vnd.sun.wadl+xml', + 'war' => 'application/java-archive', + 'wasm' => 'application/wasm', + 'wav' => 'audio/x-wav', + 'wax' => 'audio/x-ms-wax', + 'wbmp' => 'image/vnd.wap.wbmp', + 'wbs' => 'application/vnd.criticaltools.wbs+xml', + 'wbxml' => 'application/wbxml', + 'wcm' => 'application/vnd.ms-works', + 'wdb' => 'application/vnd.ms-works', + 'wdp' => 'image/vnd.ms-photo', + 'weba' => 'audio/webm', + 'webapp' => 'application/x-web-app-manifest+json', + 'webm' => 'video/webm', + 'webmanifest' => 'application/manifest+json', + 'webp' => 'image/webp', + 'wg' => 'application/vnd.pmi.widget', + 'wgt' => 'application/widget', + 'wif' => 'application/watcherinfo+xml', + 'wks' => 'application/vnd.ms-works', + 'wm' => 'video/x-ms-wm', + 'wma' => 'audio/x-ms-wma', + 'wmd' => 'application/x-ms-wmd', + 'wmf' => 'image/wmf', + 'wml' => 'text/vnd.wap.wml', + 'wmlc' => 'application/wmlc', + 'wmls' => 'text/vnd.wap.wmlscript', + 'wmlsc' => 'application/vnd.wap.wmlscriptc', + 'wmv' => 'video/x-ms-wmv', + 'wmx' => 'video/x-ms-wmx', + 'wmz' => 'application/x-msmetafile', + 'woff' => 'font/woff', + 'woff2' => 'font/woff2', + 'word' => 'application/msword', + 'wpd' => 'application/vnd.wordperfect', + 'wpl' => 'application/vnd.ms-wpl', + 'wps' => 'application/vnd.ms-works', + 'wqd' => 'application/vnd.wqd', + 'wri' => 'application/x-mswrite', + 'wrl' => 'model/vrml', + 'wsc' => 'message/vnd.wfa.wsc', + 'wsdl' => 'application/wsdl+xml', + 'wspolicy' => 'application/wspolicy+xml', + 'wtb' => 'application/vnd.webturbo', + 'wvx' => 'video/x-ms-wvx', + 'x3d' => 'model/x3d+xml', + 'x3db' => 'model/x3d+fastinfoset', + 'x3dbz' => 'model/x3d+binary', + 'x3dv' => 'model/x3d-vrml', + 'x3dvz' => 'model/x3d+vrml', + 'x3dz' => 'model/x3d+xml', + 'x32' => 'application/x-authorware-bin', + 'x_b' => 'model/vnd.parasolid.transmit.binary', + 'x_t' => 'model/vnd.parasolid.transmit.text', + 'xaml' => 'application/xaml+xml', + 'xap' => 'application/x-silverlight-app', + 'xar' => 'application/vnd.xara', + 'xav' => 'application/xcap-att+xml', + 'xbap' => 'application/x-ms-xbap', + 'xbd' => 'application/vnd.fujixerox.docuworks.binder', + 'xbm' => 'image/x-xbitmap', + 'xca' => 'application/xcap-caps+xml', + 'xcs' => 'application/calendar+xml', + 'xdf' => 'application/xcap-diff+xml', + 'xdm' => 'application/vnd.syncml.dm+xml', + 'xdp' => 'application/vnd.adobe.xdp+xml', + 'xdssc' => 'application/dssc+xml', + 'xdw' => 'application/vnd.fujixerox.docuworks', + 'xel' => 'application/xcap-el+xml', + 'xenc' => 'application/xenc+xml', + 'xer' => 'application/patch-ops-error+xml', + 'xfdf' => 'application/vnd.adobe.xfdf', + 'xfdl' => 'application/vnd.xfdl', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xhvml' => 'application/xv+xml', + 'xif' => 'image/vnd.xiff', + 'xl' => 'application/excel', + 'xla' => 'application/vnd.ms-excel', + 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', + 'xlc' => 'application/vnd.ms-excel', + 'xlf' => 'application/xliff+xml', + 'xlm' => 'application/vnd.ms-excel', + 'xls' => 'application/vnd.ms-excel', + 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', + 'xlsm' => 'application/vnd.ms-excel.sheet.macroEnabled.12', + 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'xlt' => 'application/vnd.ms-excel', + 'xltm' => 'application/vnd.ms-excel.template.macroEnabled.12', + 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + 'xlw' => 'application/vnd.ms-excel', + 'xm' => 'audio/xm', + 'xml' => 'application/xml', + 'xns' => 'application/xcap-ns+xml', + 'xo' => 'application/vnd.olpc-sugar', + 'xop' => 'application/xop+xml', + 'xpi' => 'application/x-xpinstall', + 'xpl' => 'application/xproc+xml', + 'xpm' => 'image/x-xpixmap', + 'xpr' => 'application/vnd.is-xpr', + 'xps' => 'application/vnd.ms-xpsdocument', + 'xpw' => 'application/vnd.intercon.formnet', + 'xpx' => 'application/vnd.intercon.formnet', + 'xsd' => 'application/xml', + 'xsl' => 'application/xml', + 'xslt' => 'application/xslt+xml', + 'xsm' => 'application/vnd.syncml+xml', + 'xspf' => 'application/xspf+xml', + 'xul' => 'application/vnd.mozilla.xul+xml', + 'xvm' => 'application/xv+xml', + 'xvml' => 'application/xv+xml', + 'xwd' => 'image/x-xwindowdump', + 'xyz' => 'chemical/x-xyz', + 'xz' => 'application/x-xz', + 'yaml' => 'text/yaml', + 'yang' => 'application/yang', + 'yin' => 'application/yin+xml', + 'yml' => 'text/yaml', + 'ymp' => 'text/x-suse-ymp', + 'z' => 'application/x-compress', + 'z1' => 'application/x-zmachine', + 'z2' => 'application/x-zmachine', + 'z3' => 'application/x-zmachine', + 'z4' => 'application/x-zmachine', + 'z5' => 'application/x-zmachine', + 'z6' => 'application/x-zmachine', + 'z7' => 'application/x-zmachine', + 'z8' => 'application/x-zmachine', + 'zaz' => 'application/vnd.zzazz.deck+xml', + 'zip' => 'application/zip', + 'zir' => 'application/vnd.zul', + 'zirz' => 'application/vnd.zul', + 'zmm' => 'application/vnd.handheld-entertainment+xml', + 'zsh' => 'text/x-scriptzsh', ]; /** * Determines the mimetype of a file by looking at its extension. + * + * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json */ public static function fromFilename(string $filename): ?string { @@ -121,7 +1228,7 @@ final class MimeType /** * Maps a file extensions to a mimetype. * - * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types + * @link https://raw.githubusercontent.com/jshttp/mime-db/master/db.json */ public static function fromExtension(string $extension): ?string { diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php index f76d7c61..3ae2c84a 100644 --- a/vendor/guzzlehttp/psr7/src/MultipartStream.php +++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -17,6 +17,9 @@ final class MultipartStream implements StreamInterface /** @var string */ private $boundary; + /** @var StreamInterface */ + private $stream; + /** * @param array $elements Array of associative arrays, each containing a * required "name" key mapping to the form field, @@ -68,6 +71,9 @@ final class MultipartStream implements StreamInterface $stream = new AppendStream(); foreach ($elements as $element) { + if (!is_array($element)) { + throw new \UnexpectedValueException("An array is expected"); + } $this->addElement($stream, $element); } @@ -89,7 +95,7 @@ final class MultipartStream implements StreamInterface if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); - if (substr($uri, 0, 6) !== 'php://') { + if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') { $element['filename'] = $uri; } } diff --git a/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/vendor/guzzlehttp/psr7/src/NoSeekStream.php index 99e25b9e..161a224f 100644 --- a/vendor/guzzlehttp/psr7/src/NoSeekStream.php +++ b/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -13,6 +13,9 @@ final class NoSeekStream implements StreamInterface { use StreamDecoratorTrait; + /** @var StreamInterface */ + private $stream; + public function seek($offset, $whence = SEEK_SET): void { throw new \RuntimeException('Cannot seek a NoSeekStream'); diff --git a/vendor/guzzlehttp/psr7/src/Query.php b/vendor/guzzlehttp/psr7/src/Query.php index 4fd0ca96..2faab3a8 100644 --- a/vendor/guzzlehttp/psr7/src/Query.php +++ b/vendor/guzzlehttp/psr7/src/Query.php @@ -43,7 +43,7 @@ final class Query $parts = explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; - if (!isset($result[$key])) { + if (!array_key_exists($key, $result)) { $result[$key] = $value; } else { if (!is_array($result[$key])) { diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php index 6ae3f9be..43cbb502 100644 --- a/vendor/guzzlehttp/psr7/src/ServerRequest.php +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -80,7 +80,7 @@ class ServerRequest extends Request implements ServerRequestInterface /** * Return an UploadedFile instance array. * - * @param array $files A array which respect $_FILES structure + * @param array $files An array which respect $_FILES structure * * @throws InvalidArgumentException for unrecognized values */ diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php index d389427c..ecd31861 100644 --- a/vendor/guzzlehttp/psr7/src/Stream.php +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -96,13 +96,11 @@ class Stream implements StreamInterface throw new \RuntimeException('Stream is detached'); } - $contents = stream_get_contents($this->stream); - - if ($contents === false) { - throw new \RuntimeException('Unable to read stream contents'); + if (!$this->readable) { + throw new \RuntimeException('Cannot read from non-readable stream'); } - return $contents; + return Utils::tryGetContents($this->stream); } public function close(): void @@ -229,7 +227,12 @@ class Stream implements StreamInterface return ''; } - $string = fread($this->stream, $length); + try { + $string = fread($this->stream, $length); + } catch (\Exception $e) { + throw new \RuntimeException('Unable to read from stream', 0, $e); + } + if (false === $string) { throw new \RuntimeException('Unable to read from stream'); } diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php index 3898f783..5c6416ae 100644 --- a/vendor/guzzlehttp/psr7/src/Uri.php +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -14,7 +14,7 @@ use Psr\Http\Message\UriInterface; * @author Tobias Schultze * @author Matthew Weier O'Phinney */ -class Uri implements UriInterface +class Uri implements UriInterface, \JsonSerializable { /** * Absolute http and https URIs require a host per RFC 7230 Section 2.7 @@ -525,6 +525,11 @@ class Uri implements UriInterface return $new; } + public function jsonSerialize(): string + { + return $this->__toString(); + } + /** * Apply parse_url parts to a URI. * diff --git a/vendor/guzzlehttp/psr7/src/UriComparator.php b/vendor/guzzlehttp/psr7/src/UriComparator.php new file mode 100644 index 00000000..70c582aa --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriComparator.php @@ -0,0 +1,52 @@ +getHost(), $modified->getHost()) !== 0) { + return true; + } + + if ($original->getScheme() !== $modified->getScheme()) { + return true; + } + + if (self::computePort($original) !== self::computePort($modified)) { + return true; + } + + return false; + } + + private static function computePort(UriInterface $uri): int + { + $port = $uri->getPort(); + + if (null !== $port) { + return $port; + } + + return 'https' === $uri->getScheme() ? 443 : 80; + } + + private function __construct() + { + // cannot be instantiated + } +} diff --git a/vendor/guzzlehttp/psr7/src/Utils.php b/vendor/guzzlehttp/psr7/src/Utils.php index 6cc04ee4..3a4cf394 100644 --- a/vendor/guzzlehttp/psr7/src/Utils.php +++ b/vendor/guzzlehttp/psr7/src/Utils.php @@ -131,7 +131,7 @@ final class Utils hash_update($ctx, $stream->read(1048576)); } - $out = hash_final($ctx, (bool) $rawOutput); + $out = hash_final($ctx, $rawOutput); $stream->seek($pos); return $out; @@ -304,7 +304,7 @@ final class Utils /** @var resource $resource */ if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') { $stream = self::tryFopen('php://temp', 'w+'); - fwrite($stream, stream_get_contents($resource)); + stream_copy_to_stream($resource, $stream); fseek($stream, 0); $resource = $stream; } @@ -386,6 +386,53 @@ final class Utils return $handle; } + /** + * Safely gets the contents of a given stream. + * + * When stream_get_contents fails, PHP normally raises a warning. This + * function adds an error handler that checks for errors and throws an + * exception instead. + * + * @param resource $stream + * + * @throws \RuntimeException if the stream cannot be read + */ + public static function tryGetContents($stream): string + { + $ex = null; + set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool { + $ex = new \RuntimeException(sprintf( + 'Unable to read stream contents: %s', + $errstr + )); + + return true; + }); + + try { + /** @var string|false $contents */ + $contents = stream_get_contents($stream); + + if ($contents === false) { + $ex = new \RuntimeException('Unable to read stream contents'); + } + } catch (\Throwable $e) { + $ex = new \RuntimeException(sprintf( + 'Unable to read stream contents: %s', + $e->getMessage() + ), 0, $e); + } + + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $contents; + } + /** * Returns a UriInterface for the given value. * diff --git a/vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json b/vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json deleted file mode 100644 index d69a683b..00000000 --- a/vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "require": { - "php": "^7.2.5 || ^8.0", - "friendsofphp/php-cs-fixer": "3.2.1" - }, - "config": { - "preferred-install": "dist" - } -} diff --git a/vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json b/vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json deleted file mode 100644 index bfbc7273..00000000 --- a/vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "require": { - "php": "^7.2.5 || ^8.0", - "phpstan/phpstan": "0.12.81", - "phpstan/phpstan-deprecation-rules": "0.12.6" - }, - "config": { - "preferred-install": "dist" - } -} diff --git a/vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json b/vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json deleted file mode 100644 index 535a0797..00000000 --- a/vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "require": { - "php": "^7.2.5 || ^8.0", - "psalm/phar": "4.6.2" - }, - "config": { - "preferred-install": "dist" - } -} diff --git a/vendor/knplabs/github-api/CHANGELOG-3.X.md b/vendor/knplabs/github-api/CHANGELOG-3.X.md index 8155111b..b8516f0b 100644 --- a/vendor/knplabs/github-api/CHANGELOG-3.X.md +++ b/vendor/knplabs/github-api/CHANGELOG-3.X.md @@ -1,5 +1,16 @@ # Changelog +## 3.6.0 + +### Added +- Include optional params parameter for Commits compare method ([mountiny](https://github.com/mountiny)) [#1053](https://github.com/KnpLabs/php-github-api/issues/1053) + +### Changed +- Update incorrect documentation ([pheeque1](https://github.com/pheeque1)) [#1058](https://github.com/KnpLabs/php-github-api/issues/1058) + +### Fixed +- fix(Apps): use /orgs/ORG/installation ([ellisio](https://github.com/ellisio)) [#1056](https://github.com/KnpLabs/php-github-api/issues/1056) + ## 3.5.1 ### Fixed diff --git a/vendor/knplabs/github-api/composer.json b/vendor/knplabs/github-api/composer.json index b54537bd..ce6d0072 100644 --- a/vendor/knplabs/github-api/composer.json +++ b/vendor/knplabs/github-api/composer.json @@ -57,7 +57,8 @@ }, "config": { "allow-plugins": { - "phpstan/extension-installer": true + "phpstan/extension-installer": true, + "composer/package-versions-deprecated": true } } } diff --git a/vendor/knplabs/github-api/lib/Github/Api/Apps.php b/vendor/knplabs/github-api/lib/Github/Api/Apps.php index 9e9a4b6a..62df3a3c 100644 --- a/vendor/knplabs/github-api/lib/Github/Api/Apps.php +++ b/vendor/knplabs/github-api/lib/Github/Api/Apps.php @@ -82,7 +82,7 @@ class Apps extends AbstractApi { $this->configurePreviewHeader(); - return $this->get('/org/'.rawurldecode($org).'/installation'); + return $this->get('/orgs/'.rawurldecode($org).'/installation'); } /** diff --git a/vendor/knplabs/github-api/lib/Github/Api/Repository/Commits.php b/vendor/knplabs/github-api/lib/Github/Api/Repository/Commits.php index 8195e4ba..383905d2 100644 --- a/vendor/knplabs/github-api/lib/Github/Api/Repository/Commits.php +++ b/vendor/knplabs/github-api/lib/Github/Api/Repository/Commits.php @@ -16,14 +16,14 @@ class Commits extends AbstractApi return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/commits', $params); } - public function compare($username, $repository, $base, $head, $mediaType = null) + public function compare($username, $repository, $base, $head, $mediaType = null, array $params = []) { $headers = []; if (null !== $mediaType) { $headers['Accept'] = $mediaType; } - return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/compare/'.rawurlencode($base).'...'.rawurlencode($head), [], $headers); + return $this->get('/repos/'.rawurlencode($username).'/'.rawurlencode($repository).'/compare/'.rawurlencode($base).'...'.rawurlencode($head), $params, $headers); } public function show($username, $repository, $sha) diff --git a/vendor/laravel/tinker/src/Console/TinkerCommand.php b/vendor/laravel/tinker/src/Console/TinkerCommand.php index c408993a..95d4c09f 100644 --- a/vendor/laravel/tinker/src/Console/TinkerCommand.php +++ b/vendor/laravel/tinker/src/Console/TinkerCommand.php @@ -102,7 +102,9 @@ class TinkerCommand extends Command $config = $this->getLaravel()->make('config'); foreach ($config->get('tinker.commands', []) as $command) { - $commands[] = $this->getApplication()->resolve($command); + $commands[] = $this->getApplication()->add( + $this->getLaravel()->make($command) + ); } return $commands; diff --git a/vendor/league/mime-type-detection/CHANGELOG.md b/vendor/league/mime-type-detection/CHANGELOG.md index 9f296f22..2264f7ad 100644 --- a/vendor/league/mime-type-detection/CHANGELOG.md +++ b/vendor/league/mime-type-detection/CHANGELOG.md @@ -1,12 +1,18 @@ # Changelog +## 1.10.0 - 2022-04-11 + +### Fixed + +- Added Flysystem v1 inconclusive mime-types and made it configurable as a constructor parameter. + ## 1.9.0 - 2021-11-21 ### Updated - Updated lookup -- ## 1.8.0 - 2021-09-25 +## 1.8.0 - 2021-09-25 ### Added diff --git a/vendor/league/mime-type-detection/LICENSE b/vendor/league/mime-type-detection/LICENSE index 7c1027d3..1f016521 100644 --- a/vendor/league/mime-type-detection/LICENSE +++ b/vendor/league/mime-type-detection/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2013-2020 Frank de Jonge +Copyright (c) 2013-2022 Frank de Jonge Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php b/vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php index e2f2e35e..ba91938f 100644 --- a/vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php +++ b/vendor/league/mime-type-detection/src/FinfoMimeTypeDetector.php @@ -11,7 +11,13 @@ use finfo; class FinfoMimeTypeDetector implements MimeTypeDetector { - private const INCONCLUSIVE_MIME_TYPES = ['application/x-empty', 'text/plain', 'text/x-asm']; + private const INCONCLUSIVE_MIME_TYPES = [ + 'application/x-empty', + 'text/plain', + 'text/x-asm', + 'application/octet-stream', + 'inode/x-empty', + ]; /** * @var finfo @@ -28,14 +34,21 @@ class FinfoMimeTypeDetector implements MimeTypeDetector */ private $bufferSampleSize; + /** + * @var array + */ + private $inconclusiveMimetypes; + public function __construct( string $magicFile = '', ExtensionToMimeTypeMap $extensionMap = null, - ?int $bufferSampleSize = null + ?int $bufferSampleSize = null, + array $inconclusiveMimetypes = self::INCONCLUSIVE_MIME_TYPES ) { $this->finfo = new finfo(FILEINFO_MIME_TYPE, $magicFile); $this->extensionMap = $extensionMap ?: new GeneratedExtensionToMimeTypeMap(); $this->bufferSampleSize = $bufferSampleSize; + $this->inconclusiveMimetypes = $inconclusiveMimetypes; } public function detectMimeType(string $path, $contents): ?string @@ -44,7 +57,7 @@ class FinfoMimeTypeDetector implements MimeTypeDetector ? (@$this->finfo->buffer($this->takeSample($contents)) ?: null) : null; - if ($mimeType !== null && ! in_array($mimeType, self::INCONCLUSIVE_MIME_TYPES)) { + if ($mimeType !== null && ! in_array($mimeType, $this->inconclusiveMimetypes)) { return $mimeType; } diff --git a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php b/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php index d1f714a9..f092388d 100644 --- a/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php +++ b/vendor/league/mime-type-detection/src/GeneratedExtensionToMimeTypeMap.php @@ -66,6 +66,8 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'atomsvc' => 'application/atomsvc+xml', 'atx' => 'application/vnd.antix.game-component', 'au' => 'audio/x-au', + 'avci' => 'image/avci', + 'avcs' => 'image/avcs', 'avi' => 'video/x-msvideo', 'avif' => 'image/avif', 'aw' => 'application/applixware', @@ -160,6 +162,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'com' => 'application/x-msdownload', 'conf' => 'text/plain', 'cpio' => 'application/x-cpio', + 'cpl' => 'application/cpl+xml', 'cpp' => 'text/x-c', 'cpt' => 'application/mac-compactpro', 'crd' => 'application/x-mscardfile', @@ -583,6 +586,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'mpd' => 'application/dash+xml', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', + 'mpf' => 'application/media-policy-dataset+xml', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'mpga' => 'audio/mpeg', @@ -726,6 +730,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'pgm' => 'image/x-portable-graymap', 'pgn' => 'application/x-chess-pgn', 'pgp' => 'application/pgp', + 'phar' => 'application/octet-stream', 'php' => 'application/x-httpd-php', 'php3' => 'application/x-httpd-php', 'php4' => 'application/x-httpd-php', @@ -760,7 +765,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'pptm' => 'application/vnd.ms-powerpoint.presentation.macroEnabled.12', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'pqa' => 'application/vnd.palm', - 'prc' => 'application/x-pilot', + 'prc' => 'model/prc', 'pre' => 'application/vnd.lotus-freelance', 'prf' => 'application/pics-rules', 'provx' => 'application/provenance+xml', @@ -1000,6 +1005,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'txd' => 'application/vnd.genomatix.tuxedo', 'txf' => 'application/vnd.mobius.txf', 'txt' => 'text/plain', + 'u3d' => 'model/u3d', 'u8dsn' => 'message/global-delivery-status', 'u8hdr' => 'message/global-headers', 'u8mdn' => 'message/global-disposition-notification', @@ -1096,6 +1102,7 @@ class GeneratedExtensionToMimeTypeMap implements ExtensionToMimeTypeMap 'webp' => 'image/webp', 'wg' => 'application/vnd.pmi.widget', 'wgt' => 'application/widget', + 'wif' => 'application/watcherinfo+xml', 'wks' => 'application/vnd.ms-works', 'wm' => 'video/x-ms-wm', 'wma' => 'audio/x-ms-wma', diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md index 121380fd..9ae89099 100644 --- a/vendor/monolog/monolog/CHANGELOG.md +++ b/vendor/monolog/monolog/CHANGELOG.md @@ -1,3 +1,40 @@ +### 2.7.0 (2022-06-09) + + * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682) + * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681) + * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670) + * Marked the reusable `Monolog\Test\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677) + * Fixed RotatingFileHandler issue when the date format contained slashes (#1671) + +### 2.6.0 (2022-05-10) + + * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead + * Added `SymfonyMailerHandler` (#1663) + * Added ElasticSearch 8.x support to the ElasticsearchHandler (#1662) + * Added a way to filter/modify stack traces in LineFormatter (#1665) + * Fixed UdpSocket not being able to reopen/reconnect after close() + * Fixed infinite loops if a Handler is triggering logging while handling log records + +### 2.5.0 (2022-04-08) + + * Added `callType` to IntrospectionProcessor (#1612) + * Fixed AsMonologProcessor syntax to be compatible with PHP 7.2 (#1651) + +### 2.4.0 (2022-03-14) + + * Added [`Monolog\LogRecord`](src/Monolog/LogRecord.php) interface that can be used to type-hint records like `array|\Monolog\LogRecord $record` to be forward compatible with the upcoming Monolog 3 changes + * Added `includeStacktraces` constructor params to LineFormatter & JsonFormatter (#1603) + * Added `persistent`, `timeout`, `writingTimeout`, `connectionTimeout`, `chunkSize` constructor params to SocketHandler and derivatives (#1600) + * Added `AsMonologProcessor` PHP attribute which can help autowiring / autoconfiguration of processors if frameworks / integrations decide to make use of it. This is useless when used purely with Monolog (#1637) + * Added support for keeping native BSON types as is in MongoDBFormatter (#1620) + * Added support for a `user_agent` key in WebProcessor, disabled by default but you can use it by configuring the $extraFields you want (#1613) + * Added support for username/userIcon in SlackWebhookHandler (#1617) + * Added extension points to BrowserConsoleHandler (#1593) + * Added record message/context/extra info to exceptions thrown when a StreamHandler cannot open its stream to avoid completely losing the data logged (#1630) + * Fixed error handler signature to accept a null $context which happens with internal PHP errors (#1614) + * Fixed a few setter methods not returning `self` (#1609) + * Fixed handling of records going over the max Telegram message length (#1616) + ### 2.3.5 (2021-10-01) * Fixed regression in StreamHandler since 2.3.3 on systems with the memory_limit set to >=20GB (#1592) diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md index e7104af7..bfcae0c0 100644 --- a/vendor/monolog/monolog/README.md +++ b/vendor/monolog/monolog/README.md @@ -93,6 +93,9 @@ Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/mono - [Yii 2](http://www.yiiframework.com/) is usable with Monolog via the [yii2-monolog](https://github.com/merorafael/yii2-monolog) or [yii2-psr-log-target](https://github.com/samdark/yii2-psr-log-target) plugins. - [Hawkbit Micro Framework](https://github.com/HawkBitPhp/hawkbit) comes out of the box with Monolog. - [SilverStripe 4](https://www.silverstripe.org/) comes out of the box with Monolog. +- [Drupal](https://www.drupal.org/) is usable with Monolog via the [monolog](https://www.drupal.org/project/monolog) module. +- [Aimeos ecommerce framework](https://aimeos.org/) is usable with Monolog via the [ai-monolog](https://github.com/aimeos/ai-monolog) extension. +- [Magento](https://magento.com/) comes out of the box with Monolog. ### Author diff --git a/vendor/monolog/monolog/composer.json b/vendor/monolog/monolog/composer.json index 020d278e..52cb35f6 100644 --- a/vendor/monolog/monolog/composer.json +++ b/vendor/monolog/monolog/composer.json @@ -17,20 +17,25 @@ "psr/log": "^1.0.1 || ^2.0 || ^3.0" }, "require-dev": { + "ext-json": "*", "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "elasticsearch/elasticsearch": "^7", - "mongodb/mongodb": "^1.8", + "elasticsearch/elasticsearch": "^7 || ^8", "graylog2/gelf-php": "^1.4.2", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "php-console/php-console": "^3.1.3", - "phpspec/prophecy": "^1.6.1", - "phpunit/phpunit": "^8.5", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5.14", "predis/predis": "^1.1", - "rollbar/rollbar": "^1.3", - "ruflin/elastica": ">=0.90@dev", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", "swiftmailer/swiftmailer": "^5.3|^6.0", - "phpstan/phpstan": "^0.12.91" + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" }, "suggest": { "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", @@ -64,12 +69,15 @@ } }, "scripts": { - "test": "vendor/bin/phpunit", - "phpstan": "vendor/bin/phpstan analyse" + "test": "@php vendor/bin/phpunit", + "phpstan": "@php vendor/bin/phpstan analyse" }, "config": { "lock": false, "sort-packages": true, - "platform-check": false + "platform-check": false, + "allow-plugins": { + "composer/package-versions-deprecated": true + } } } diff --git a/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php b/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php new file mode 100644 index 00000000..188bbb0d --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Attribute/AsMonologProcessor.php @@ -0,0 +1,46 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Attribute; + +/** + * A reusable attribute to help configure a class or a method as a processor. + * + * Using it offers no guarantee: it needs to be leveraged by a Monolog third-party consumer. + * + * Using it with the Monolog library only has no effect at all: processors should still be turned into a callable if + * needed and manually pushed to the loggers and to the processable handlers. + */ +#[\Attribute(\Attribute::TARGET_CLASS | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)] +class AsMonologProcessor +{ + /** @var string|null */ + public $channel = null; + /** @var string|null */ + public $handler = null; + /** @var string|null */ + public $method = null; + + /** + * @param string|null $channel The logging channel the processor should be pushed to. + * @param string|null $handler The handler the processor should be pushed to. + * @param string|null $method The method that processes the records (if the attribute is used at the class level). + */ + public function __construct( + ?string $channel = null, + ?string $handler = null, + ?string $method = null + ) { + $this->channel = $channel; + $this->handler = $handler; + $this->method = $method; + } +} diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php index e7d244bb..576f1713 100644 --- a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php +++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php @@ -46,8 +46,8 @@ class ErrorHandler private $fatalLevel = LogLevel::ALERT; /** @var ?string */ private $reservedMemory = null; - /** @var ?mixed */ - private $lastFatalTrace; + /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */ + private $lastFatalData = null; /** @var int[] */ private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR]; @@ -210,7 +210,7 @@ class ErrorHandler * * @param mixed[] $context */ - public function handleError(int $code, string $message, string $file = '', int $line = 0, array $context = []): bool + public function handleError(int $code, string $message, string $file = '', int $line = 0, ?array $context = []): bool { if ($this->handleOnlyReportedErrors && !(error_reporting() & $code)) { return false; @@ -223,7 +223,7 @@ class ErrorHandler } else { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_shift($trace); // Exclude handleError from trace - $this->lastFatalTrace = $trace; + $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace]; } if ($this->previousErrorHandler === true) { @@ -242,12 +242,18 @@ class ErrorHandler { $this->reservedMemory = ''; - $lastError = error_get_last(); + if (is_array($this->lastFatalData)) { + $lastError = $this->lastFatalData; + } else { + $lastError = error_get_last(); + } + if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) { + $trace = $lastError['trace'] ?? null; $this->logger->log( $this->fatalLevel, 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'], - ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace] + ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace] ); if ($this->logger instanceof Logger) { diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php index a563a1ea..a1a79372 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php @@ -67,6 +67,10 @@ class GelfMessageFormatter extends NormalizerFormatter public function __construct(?string $systemName = null, ?string $extraPrefix = null, string $contextPrefix = 'ctxt_', ?int $maxLength = null) { + if (!class_exists(Message::class)) { + throw new \RuntimeException('Composer package graylog2/gelf-php is required to use Monolog\'s GelfMessageFormatter'); + } + parent::__construct('U.u'); $this->systemName = (is_null($systemName) || $systemName === '') ? (string) gethostname() : $systemName; diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php index 46592ba9..42735a6b 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php @@ -39,11 +39,12 @@ class JsonFormatter extends NormalizerFormatter /** * @param self::BATCH_MODE_* $batchMode */ - public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false) + public function __construct(int $batchMode = self::BATCH_MODE_JSON, bool $appendNewline = true, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) { $this->batchMode = $batchMode; $this->appendNewline = $appendNewline; $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + $this->includeStacktraces = $includeStacktraces; parent::__construct(); } @@ -109,11 +110,13 @@ class JsonFormatter extends NormalizerFormatter } /** - * @return void + * @return self */ - public function includeStacktraces(bool $include = true) + public function includeStacktraces(bool $include = true): self { $this->includeStacktraces = $include; + + return $this; } /** diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php index 6ed817ab..d0b4de94 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php @@ -33,6 +33,8 @@ class LineFormatter extends NormalizerFormatter protected $ignoreEmptyContextAndExtra; /** @var bool */ protected $includeStacktraces; + /** @var ?callable */ + protected $stacktracesParser; /** * @param string|null $format The format of the message @@ -40,30 +42,38 @@ class LineFormatter extends NormalizerFormatter * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries * @param bool $ignoreEmptyContextAndExtra */ - public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false) + public function __construct(?string $format = null, ?string $dateFormat = null, bool $allowInlineLineBreaks = false, bool $ignoreEmptyContextAndExtra = false, bool $includeStacktraces = false) { $this->format = $format === null ? static::SIMPLE_FORMAT : $format; $this->allowInlineLineBreaks = $allowInlineLineBreaks; $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; + $this->includeStacktraces($includeStacktraces); parent::__construct($dateFormat); } - public function includeStacktraces(bool $include = true): void + public function includeStacktraces(bool $include = true, ?callable $parser = null): self { $this->includeStacktraces = $include; if ($this->includeStacktraces) { $this->allowInlineLineBreaks = true; + $this->stacktracesParser = $parser; } + + return $this; } - public function allowInlineLineBreaks(bool $allow = true): void + public function allowInlineLineBreaks(bool $allow = true): self { $this->allowInlineLineBreaks = $allow; + + return $this; } - public function ignoreEmptyContextAndExtra(bool $ignore = true): void + public function ignoreEmptyContextAndExtra(bool $ignore = true): self { $this->ignoreEmptyContextAndExtra = $ignore; + + return $this; } /** @@ -202,9 +212,25 @@ class LineFormatter extends NormalizerFormatter $str .= '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . ')'; if ($this->includeStacktraces) { - $str .= "\n[stacktrace]\n" . $e->getTraceAsString() . "\n"; + $str .= $this->stacktracesParser($e); } return $str; } + + private function stacktracesParser(\Throwable $e): string + { + $trace = $e->getTraceAsString(); + + if ($this->stacktracesParser) { + $trace = $this->stacktracesParserCustom($trace); + } + + return "\n[stacktrace]\n" . $trace . "\n"; + } + + private function stacktracesParserCustom(string $trace): string + { + return implode("\n", array_filter(array_map($this->stacktracesParser, explode("\n", $trace)))); + } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php index 202d30eb..fca69a89 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php @@ -11,6 +11,7 @@ namespace Monolog\Formatter; +use MongoDB\BSON\Type; use MongoDB\BSON\UTCDateTime; use Monolog\Utils; @@ -85,7 +86,7 @@ class MongoDBFormatter implements FormatterInterface $array[$name] = $this->formatException($value, $nestingLevel + 1); } elseif (is_array($value)) { $array[$name] = $this->formatArray($value, $nestingLevel + 1); - } elseif (is_object($value)) { + } elseif (is_object($value) && !$value instanceof Type) { $array[$name] = $this->formatObject($value, $nestingLevel + 1); } } diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php index 01f75a42..0c622715 100644 --- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php +++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php @@ -267,13 +267,17 @@ class NormalizerFormatter implements FormatterInterface return $date->format($this->dateFormat); } - public function addJsonEncodeOption(int $option): void + public function addJsonEncodeOption(int $option): self { $this->jsonEncodeOptions |= $option; + + return $this; } - public function removeJsonEncodeOption(int $option): void + public function removeJsonEncodeOption(int $option): self { $this->jsonEncodeOptions &= ~$option; + + return $this; } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php index 8d908b26..fa383f1c 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php @@ -11,10 +11,17 @@ namespace Monolog\Handler; -use Monolog\Formatter\LineFormatter; use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; use Monolog\Utils; +use function count; +use function headers_list; +use function stripos; +use function trigger_error; + +use const E_USER_DEPRECATED; + /** * Handler sending logs to browser's javascript console with no browser extension required * @@ -29,6 +36,10 @@ class BrowserConsoleHandler extends AbstractProcessingHandler /** @var FormattedRecord[] */ protected static $records = []; + protected const FORMAT_HTML = 'html'; + protected const FORMAT_JS = 'js'; + protected const FORMAT_UNKNOWN = 'unknown'; + /** * {@inheritDoc} * @@ -65,14 +76,14 @@ class BrowserConsoleHandler extends AbstractProcessingHandler public static function send(): void { $format = static::getResponseFormat(); - if ($format === 'unknown') { + if ($format === self::FORMAT_UNKNOWN) { return; } if (count(static::$records)) { - if ($format === 'html') { + if ($format === self::FORMAT_HTML) { static::writeOutput(''); - } elseif ($format === 'js') { + } elseif ($format === self::FORMAT_JS) { static::writeOutput(static::generateScript()); } static::resetStatic(); @@ -125,25 +136,37 @@ class BrowserConsoleHandler extends AbstractProcessingHandler * If Content-Type is anything else -> unknown * * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* */ protected static function getResponseFormat(): string { // Check content type foreach (headers_list() as $header) { if (stripos($header, 'content-type:') === 0) { - // This handler only works with HTML and javascript outputs - // text/javascript is obsolete in favour of application/javascript, but still used - if (stripos($header, 'application/javascript') !== false || stripos($header, 'text/javascript') !== false) { - return 'js'; - } - if (stripos($header, 'text/html') === false) { - return 'unknown'; - } - break; + return static::getResponseFormatFromContentType($header); } } - return 'html'; + return self::FORMAT_HTML; + } + + /** + * @return string One of 'js', 'html' or 'unknown' + * @phpstan-return self::FORMAT_* + */ + protected static function getResponseFormatFromContentType(string $contentType): string + { + // This handler only works with HTML and javascript outputs + // text/javascript is obsolete in favour of application/javascript, but still used + if (stripos($contentType, 'application/javascript') !== false || stripos($contentType, 'text/javascript') !== false) { + return self::FORMAT_JS; + } + + if (stripos($contentType, 'text/html') !== false) { + return self::FORMAT_HTML; + } + + return self::FORMAT_UNKNOWN; } private static function generateScript(): string diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php index b9d323d8..e88375c0 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php @@ -11,6 +11,7 @@ namespace Monolog\Handler; +use Elastic\Elasticsearch\Response\Elasticsearch; use Throwable; use RuntimeException; use Monolog\Logger; @@ -19,6 +20,8 @@ use Monolog\Formatter\ElasticsearchFormatter; use InvalidArgumentException; use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException; use Elasticsearch\Client; +use Elastic\Elasticsearch\Exception\InvalidArgumentException as ElasticInvalidArgumentException; +use Elastic\Elasticsearch\Client as Client8; /** * Elasticsearch handler @@ -44,7 +47,7 @@ use Elasticsearch\Client; class ElasticsearchHandler extends AbstractProcessingHandler { /** - * @var Client + * @var Client|Client8 */ protected $client; @@ -54,11 +57,20 @@ class ElasticsearchHandler extends AbstractProcessingHandler protected $options = []; /** - * @param Client $client Elasticsearch Client object - * @param mixed[] $options Handler configuration + * @var bool */ - public function __construct(Client $client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) + private $needsType; + + /** + * @param Client|Client8 $client Elasticsearch Client object + * @param mixed[] $options Handler configuration + */ + public function __construct($client, array $options = [], $level = Logger::DEBUG, bool $bubble = true) { + if (!$client instanceof Client && !$client instanceof Client8) { + throw new \TypeError('Elasticsearch\Client or Elastic\Elasticsearch\Client instance required'); + } + parent::__construct($level, $bubble); $this->client = $client; $this->options = array_merge( @@ -69,6 +81,14 @@ class ElasticsearchHandler extends AbstractProcessingHandler ], $options ); + + if ($client instanceof Client8 || $client::VERSION[0] === '7') { + $this->needsType = false; + // force the type to _doc for ES8/ES7 + $this->options['type'] = '_doc'; + } else { + $this->needsType = true; + } } /** @@ -133,9 +153,11 @@ class ElasticsearchHandler extends AbstractProcessingHandler foreach ($records as $record) { $params['body'][] = [ - 'index' => [ + 'index' => $this->needsType ? [ '_index' => $record['_index'], '_type' => $record['_type'], + ] : [ + '_index' => $record['_index'], ], ]; unset($record['_index'], $record['_type']); @@ -143,6 +165,7 @@ class ElasticsearchHandler extends AbstractProcessingHandler $params['body'][] = $record; } + /** @var Elasticsearch */ $responses = $this->client->bulk($params); if ($responses['errors'] === true) { @@ -160,9 +183,9 @@ class ElasticsearchHandler extends AbstractProcessingHandler * * Only the first error is converted into an exception. * - * @param mixed[] $responses returned by $this->client->bulk() + * @param mixed[]|Elasticsearch $responses returned by $this->client->bulk() */ - protected function createExceptionFromResponses(array $responses): ElasticsearchRuntimeException + protected function createExceptionFromResponses($responses): Throwable { foreach ($responses['items'] ?? [] as $item) { if (isset($item['index']['error'])) { @@ -170,6 +193,10 @@ class ElasticsearchHandler extends AbstractProcessingHandler } } + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException('Elasticsearch failed to index one or more records.'); + } + return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.'); } @@ -178,10 +205,14 @@ class ElasticsearchHandler extends AbstractProcessingHandler * * @param mixed[] $error */ - protected function createExceptionFromError(array $error): ElasticsearchRuntimeException + protected function createExceptionFromError(array $error): Throwable { $previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null; + if (class_exists(ElasticInvalidArgumentException::class)) { + return new ElasticInvalidArgumentException($error['type'] . ': ' . $error['reason'], 0, $previous); + } + return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous); } } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php index 6194283a..85c95b9d 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php @@ -45,8 +45,16 @@ class FleepHookHandler extends SocketHandler * @param string $token Webhook token * @throws MissingExtensionException */ - public function __construct(string $token, $level = Logger::DEBUG, bool $bubble = true) - { + public function __construct( + string $token, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); } @@ -54,7 +62,16 @@ class FleepHookHandler extends SocketHandler $this->token = $token; $connectionString = 'ssl://' . static::FLEEP_HOST . ':443'; - parent::__construct($connectionString, $level, $bubble); + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php index a632c862..b837bdb6 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php @@ -39,13 +39,30 @@ class FlowdockHandler extends SocketHandler /** * @throws MissingExtensionException if OpenSSL is missing */ - public function __construct(string $apiToken, $level = Logger::DEBUG, bool $bubble = true) - { + public function __construct( + string $apiToken, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); } - parent::__construct('ssl://api.flowdock.com:443', $level, $bubble); + parent::__construct( + 'ssl://api.flowdock.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->apiToken = $apiToken; } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php index c62dc24d..71f64a26 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php @@ -33,8 +33,18 @@ class InsightOpsHandler extends SocketHandler * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ - public function __construct(string $token, string $region = 'us', bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true) - { + public function __construct( + string $token, + string $region = 'us', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); } @@ -43,7 +53,16 @@ class InsightOpsHandler extends SocketHandler ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' : $region . '.data.logs.insight.rapid7.com:80'; - parent::__construct($endpoint, $level, $bubble); + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->logToken = $token; } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php index a0739cf0..25fcd159 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php @@ -30,14 +30,33 @@ class LogEntriesHandler extends SocketHandler * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ - public function __construct(string $token, bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true, string $host = 'data.logentries.com') - { + public function __construct( + string $token, + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + string $host = 'data.logentries.com', + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; - parent::__construct($endpoint, $level, $bubble); + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->logToken = $token; } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php index e7666eca..859a4690 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/LogmaticHandler.php @@ -43,8 +43,19 @@ class LogmaticHandler extends SocketHandler * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ - public function __construct(string $token, string $hostname = '', string $appname = '', bool $useSSL = true, $level = Logger::DEBUG, bool $bubble = true) - { + public function __construct( + string $token, + string $hostname = '', + string $appname = '', + bool $useSSL = true, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { if ($useSSL && !extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use SSL encrypted connection for LogmaticHandler'); } @@ -52,7 +63,16 @@ class LogmaticHandler extends SocketHandler $endpoint = $useSSL ? 'ssl://api.logmatic.io:10515' : 'api.logmatic.io:10514'; $endpoint .= '/v1/'; - parent::__construct($endpoint, $level, $bubble); + parent::__construct( + $endpoint, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->logToken = $token; $this->hostname = $hostname; diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php index 255af5c0..fed2303d 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php @@ -108,10 +108,24 @@ class PushoverHandler extends SocketHandler $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, int $retry = 30, - int $expire = 25200 + int $expire = 25200, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null ) { $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; - parent::__construct($connectionString, $level, $bubble); + parent::__construct( + $connectionString, + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->token = $token; $this->users = (array) $users; diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php index 2b7c4803..17745d22 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php @@ -191,7 +191,11 @@ class RotatingFileHandler extends StreamHandler $fileInfo = pathinfo($this->filename); $glob = str_replace( ['{filename}', '{date}'], - [$fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'], + [$fileInfo['filename'], str_replace( + ['Y', 'y', 'm', 'd'], + ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'], + $this->dateFormat) + ], $fileInfo['dirname'] . '/' . $this->filenameFormat ); if (isset($fileInfo['extension'])) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php old mode 100755 new mode 100644 index 13c3a102..71a41094 --- a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php @@ -146,12 +146,14 @@ class SlackRecord if ($this->useAttachment) { $attachment = array( - 'fallback' => $message, - 'text' => $message, - 'color' => $this->getAttachmentColor($record['level']), - 'fields' => array(), - 'mrkdwn_in' => array('fields'), - 'ts' => $record['datetime']->getTimestamp(), + 'fallback' => $message, + 'text' => $message, + 'color' => $this->getAttachmentColor($record['level']), + 'fields' => array(), + 'mrkdwn_in' => array('fields'), + 'ts' => $record['datetime']->getTimestamp(), + 'footer' => $this->username, + 'footer_icon' => $this->userIcon, ); if ($this->useShortAttachment) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php index 46d69a6d..a648513e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php @@ -59,13 +59,27 @@ class SlackHandler extends SocketHandler bool $bubble = true, bool $useShortAttachment = false, bool $includeContextAndExtra = false, - array $excludeFields = array() + array $excludeFields = array(), + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null ) { if (!extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); } - parent::__construct('ssl://slack.com:443', $level, $bubble); + parent::__construct( + 'ssl://slack.com:443', + $level, + $bubble, + $persistent, + $timeout, + $writingTimeout, + $connectionTimeout, + $chunkSize + ); $this->slackRecord = new SlackRecord( $channel, diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php index 4e1410ab..21701afa 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php @@ -31,15 +31,15 @@ class SocketHandler extends AbstractProcessingHandler /** @var resource|null */ private $resource; /** @var float */ - private $timeout = 0.0; + private $timeout; /** @var float */ - private $writingTimeout = 10.0; + private $writingTimeout; /** @var ?int */ private $lastSentBytes = null; /** @var ?int */ - private $chunkSize = null; + private $chunkSize; /** @var bool */ - private $persistent = false; + private $persistent; /** @var ?int */ private $errno = null; /** @var ?string */ @@ -48,13 +48,40 @@ class SocketHandler extends AbstractProcessingHandler private $lastWritingAt = null; /** - * @param string $connectionString Socket connection string + * @param string $connectionString Socket connection string + * @param bool $persistent Flag to enable/disable persistent connections + * @param float $timeout Socket timeout to wait until the request is being aborted + * @param float $writingTimeout Socket timeout to wait until the request should've been sent/written + * @param float|null $connectionTimeout Socket connect timeout to wait until the connection should've been + * established + * @param int|null $chunkSize Sets the chunk size. Only has effect during connection in the writing cycle + * + * @throws \InvalidArgumentException If an invalid timeout value (less than 0) is passed. */ - public function __construct(string $connectionString, $level = Logger::DEBUG, bool $bubble = true) - { + public function __construct( + string $connectionString, + $level = Logger::DEBUG, + bool $bubble = true, + bool $persistent = false, + float $timeout = 0.0, + float $writingTimeout = 10.0, + ?float $connectionTimeout = null, + ?int $chunkSize = null + ) { parent::__construct($level, $bubble); $this->connectionString = $connectionString; - $this->connectionTimeout = (float) ini_get('default_socket_timeout'); + + if ($connectionTimeout !== null) { + $this->validateTimeout($connectionTimeout); + } + + $this->connectionTimeout = $connectionTimeout ?? (float) ini_get('default_socket_timeout'); + $this->persistent = $persistent; + $this->validateTimeout($timeout); + $this->timeout = $timeout; + $this->validateTimeout($writingTimeout); + $this->writingTimeout = $writingTimeout; + $this->chunkSize = $chunkSize; } /** diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php index dc1dcb42..dcf282b4 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SqsHandler.php @@ -46,7 +46,7 @@ class SqsHandler extends AbstractProcessingHandler protected function write(array $record): void { if (!isset($record['formatted']) || 'string' !== gettype($record['formatted'])) { - throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string'); + throw new \InvalidArgumentException('SqsHandler accepts only formatted records as a string' . Utils::getRecordMessageForException($record)); } $messageBody = $record['formatted']; diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php index 2531d41b..e6c79569 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php @@ -130,7 +130,7 @@ class StreamHandler extends AbstractProcessingHandler if (!is_resource($this->stream)) { $url = $this->url; if (null === $url || '' === $url) { - throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); + throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().' . Utils::getRecordMessageForException($record)); } $this->createDir($url); $this->errorMessage = null; @@ -143,7 +143,7 @@ class StreamHandler extends AbstractProcessingHandler if (!is_resource($stream)) { $this->stream = null; - throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url)); + throw new \UnexpectedValueException(sprintf('The stream or file "%s" could not be opened in append mode: '.$this->errorMessage, $url) . Utils::getRecordMessageForException($record)); } stream_set_chunk_size($stream, $this->streamChunkSize); $this->stream = $stream; @@ -151,7 +151,7 @@ class StreamHandler extends AbstractProcessingHandler $stream = $this->stream; if (!is_resource($stream)) { - throw new \LogicException('No stream was opened yet'); + throw new \LogicException('No stream was opened yet' . Utils::getRecordMessageForException($record)); } if ($this->useLocking) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php index b3fedea5..fae92514 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; use Monolog\Formatter\FormatterInterface; use Monolog\Formatter\LineFormatter; use Swift_Message; @@ -23,6 +24,7 @@ use Swift; * @author Gyula Sallai * * @phpstan-import-type Record from \Monolog\Logger + * @deprecated Since Monolog 2.6. Use SymfonyMailerHandler instead. */ class SwiftMailerHandler extends MailHandler { @@ -41,6 +43,8 @@ class SwiftMailerHandler extends MailHandler { parent::__construct($level, $bubble); + @trigger_error('The SwiftMailerHandler is deprecated since Monolog 2.6. Use SymfonyMailerHandler instead.', E_USER_DEPRECATED); + $this->mailer = $mailer; $this->messageTemplate = $message; } @@ -83,7 +87,8 @@ class SwiftMailerHandler extends MailHandler } if (!$message instanceof Swift_Message) { - throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); } if ($records) { diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php new file mode 100644 index 00000000..130e6f1f --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/Handler/SymfonyMailerHandler.php @@ -0,0 +1,111 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Utils; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; +use Symfony\Component\Mailer\MailerInterface; +use Symfony\Component\Mailer\Transport\TransportInterface; +use Symfony\Component\Mime\Email; + +/** + * SymfonyMailerHandler uses Symfony's Mailer component to send the emails + * + * @author Jordi Boggiano + * + * @phpstan-import-type Record from \Monolog\Logger + */ +class SymfonyMailerHandler extends MailHandler +{ + /** @var MailerInterface|TransportInterface */ + protected $mailer; + /** @var Email|callable(string, Record[]): Email */ + private $emailTemplate; + + /** + * @psalm-param Email|callable(string, Record[]): Email $email + * + * @param MailerInterface|TransportInterface $mailer The mailer to use + * @param callable|Email $email An email template, the subject/body will be replaced + */ + public function __construct($mailer, $email, $level = Logger::ERROR, bool $bubble = true) + { + parent::__construct($level, $bubble); + + $this->mailer = $mailer; + $this->emailTemplate = $email; + } + + /** + * {@inheritDoc} + */ + protected function send(string $content, array $records): void + { + $this->mailer->send($this->buildMessage($content, $records)); + } + + /** + * Gets the formatter for the Swift_Message subject. + * + * @param string|null $format The format of the subject + */ + protected function getSubjectFormatter(?string $format): FormatterInterface + { + return new LineFormatter($format); + } + + /** + * Creates instance of Email to be sent + * + * @param string $content formatted email body to be sent + * @param array $records Log records that formed the content + * + * @phpstan-param Record[] $records + */ + protected function buildMessage(string $content, array $records): Email + { + $message = null; + if ($this->emailTemplate instanceof Email) { + $message = clone $this->emailTemplate; + } elseif (is_callable($this->emailTemplate)) { + $message = ($this->emailTemplate)($content, $records); + } + + if (!$message instanceof Email) { + $record = reset($records); + throw new \InvalidArgumentException('Could not resolve message as instance of Email or a callable returning it' . ($record ? Utils::getRecordMessageForException($record) : '')); + } + + if ($records) { + $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); + $message->subject($subjectFormatter->format($this->getHighestRecord($records))); + } + + if ($this->isHtmlBody($content)) { + if (null !== ($charset = $message->getHtmlCharset())) { + $message->html($content, $charset); + } else { + $message->html($content); + } + } else { + if (null !== ($charset = $message->getTextCharset())) { + $message->text($content, $charset); + } else { + $message->text($content); + } + } + + return $message->date(new \DateTimeImmutable()); + } +} diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php index 4951f66a..1d543b7e 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Logs to syslog service. @@ -60,7 +61,7 @@ class SyslogHandler extends AbstractSyslogHandler protected function write(array $record): void { if (!openlog($this->ident, $this->logopts, $this->facility)) { - throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"'); + throw new \LogicException('Can\'t open syslog for ident "'.$this->ident.'" and facility "'.$this->facility.'"' . Utils::getRecordMessageForException($record)); } syslog($this->logLevels[$record['level']], (string) $record['formatted']); } diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php index 30b5186b..dbd8ef69 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php @@ -23,20 +23,12 @@ class UdpSocket /** @var int */ protected $port; /** @var resource|Socket|null */ - protected $socket; + protected $socket = null; public function __construct(string $ip, int $port = 514) { $this->ip = $ip; $this->port = $port; - $domain = AF_INET; - $protocol = SOL_UDP; - // Check if we are using unix sockets. - if ($port === 0) { - $domain = AF_UNIX; - $protocol = IPPROTO_IP; - } - $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null; } /** @@ -57,12 +49,34 @@ class UdpSocket } } + /** + * @return resource|Socket + */ + protected function getSocket() + { + if (null !== $this->socket) { + return $this->socket; + } + + $domain = AF_INET; + $protocol = SOL_UDP; + // Check if we are using unix sockets. + if ($this->port === 0) { + $domain = AF_UNIX; + $protocol = IPPROTO_IP; + } + + $this->socket = socket_create($domain, SOCK_DGRAM, $protocol) ?: null; + if (null === $this->socket) { + throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' could not be opened via socket_create'); + } + + return $this->socket; + } + protected function send(string $chunk): void { - if (!is_resource($this->socket) && !$this->socket instanceof Socket) { - throw new \RuntimeException('The UdpSocket to '.$this->ip.':'.$this->port.' has been closed and can not be written to anymore'); - } - socket_sendto($this->socket, $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); + socket_sendto($this->getSocket(), $chunk, strlen($chunk), $flags = 0, $this->ip, $this->port); } protected function assembleMessage(string $line, string $header): string diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php index 9ea05737..8912eba5 100644 --- a/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php +++ b/vendor/monolog/monolog/src/Monolog/Handler/TelegramBotHandler.php @@ -13,6 +13,7 @@ namespace Monolog\Handler; use RuntimeException; use Monolog\Logger; +use Monolog\Utils; /** * Handler send logs to Telegram using Telegram Bot API. @@ -43,6 +44,11 @@ class TelegramBotHandler extends AbstractProcessingHandler 'Markdown', // legacy mode without underline and strikethrough, use MarkdownV2 instead ]; + /** + * The maximum number of characters allowed in a message according to the Telegram api documentation + */ + private const MAX_MESSAGE_LENGTH = 4096; + /** * Telegram bot access token provided by BotFather. * Create telegram bot with https://telegram.me/BotFather and use access token from it. @@ -78,18 +84,37 @@ class TelegramBotHandler extends AbstractProcessingHandler private $disableNotification; /** - * @param string $apiKey Telegram bot access token provided by BotFather + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @var bool + */ + private $splitLongMessages; + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @var bool + */ + private $delayBetweenMessages; + + /** + * @param string $apiKey Telegram bot access token provided by BotFather * @param string $channel Telegram channel name + * @param bool $splitLongMessages Split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages + * @param bool $delayBetweenMessages Adds delay between sending a split message according to Telegram API + * @throws MissingExtensionException */ public function __construct( string $apiKey, string $channel, - $level = Logger::DEBUG, - bool $bubble = true, + $level = Logger::DEBUG, + bool $bubble = true, string $parseMode = null, - bool $disableWebPagePreview = null, - bool $disableNotification = null - ) { + bool $disableWebPagePreview = null, + bool $disableNotification = null, + bool $splitLongMessages = false, + bool $delayBetweenMessages = false + ) + { if (!extension_loaded('curl')) { throw new MissingExtensionException('The curl extension is needed to use the TelegramBotHandler'); } @@ -101,6 +126,8 @@ class TelegramBotHandler extends AbstractProcessingHandler $this->setParseMode($parseMode); $this->disableWebPagePreview($disableWebPagePreview); $this->disableNotification($disableNotification); + $this->splitLongMessages($splitLongMessages); + $this->delayBetweenMessages($delayBetweenMessages); } public function setParseMode(string $parseMode = null): self @@ -128,6 +155,31 @@ class TelegramBotHandler extends AbstractProcessingHandler return $this; } + /** + * True - split a message longer than MAX_MESSAGE_LENGTH into parts and send in multiple messages. + * False - truncates a message that is too long. + * @param bool $splitLongMessages + * @return $this + */ + public function splitLongMessages(bool $splitLongMessages = false): self + { + $this->splitLongMessages = $splitLongMessages; + + return $this; + } + + /** + * Adds 1-second delay between sending a split message (according to Telegram API to avoid 429 Too Many Requests). + * @param bool $delayBetweenMessages + * @return $this + */ + public function delayBetweenMessages(bool $delayBetweenMessages = false): self + { + $this->delayBetweenMessages = $delayBetweenMessages; + + return $this; + } + /** * {@inheritDoc} */ @@ -150,7 +202,7 @@ class TelegramBotHandler extends AbstractProcessingHandler } if (!empty($messages)) { - $this->send((string) $this->getFormatter()->formatBatch($messages)); + $this->send((string)$this->getFormatter()->formatBatch($messages)); } } @@ -167,6 +219,19 @@ class TelegramBotHandler extends AbstractProcessingHandler * @param string $message */ protected function send(string $message): void + { + $messages = $this->handleMessageLength($message); + + foreach ($messages as $key => $msg) { + if ($this->delayBetweenMessages && $key > 0) { + sleep(1); + } + + $this->sendCurl($msg); + } + } + + protected function sendCurl(string $message): void { $ch = curl_init(); $url = self::BOT_API . $this->apiKey . '/SendMessage'; @@ -191,4 +256,19 @@ class TelegramBotHandler extends AbstractProcessingHandler throw new RuntimeException('Telegram API error. Description: ' . $result['description']); } } + + /** + * Handle a message that is too long: truncates or splits into several + * @param string $message + * @return string[] + */ + private function handleMessageLength(string $message): array + { + $truncatedMarker = ' (...truncated)'; + if (!$this->splitLongMessages && strlen($message) > self::MAX_MESSAGE_LENGTH) { + return [Utils::substr($message, 0, self::MAX_MESSAGE_LENGTH - strlen($truncatedMarker)) . $truncatedMarker]; + } + + return str_split($message, self::MAX_MESSAGE_LENGTH); + } } diff --git a/vendor/monolog/monolog/src/Monolog/LogRecord.php b/vendor/monolog/monolog/src/Monolog/LogRecord.php new file mode 100644 index 00000000..702807d7 --- /dev/null +++ b/vendor/monolog/monolog/src/Monolog/LogRecord.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog; + +use ArrayAccess; + +/** + * Monolog log record interface for forward compatibility with Monolog 3.0 + * + * This is just present in Monolog 2.4+ to allow interoperable code to be written against + * both versions by type-hinting arguments as `array|\Monolog\LogRecord $record` + * + * Do not rely on this interface for other purposes, and do not implement it. + * + * @author Jordi Boggiano + * @template-extends \ArrayAccess<'message'|'level'|'context'|'level_name'|'channel'|'datetime'|'extra'|'formatted', mixed> + * @phpstan-import-type Record from Logger + */ +interface LogRecord extends \ArrayAccess +{ + /** + * @phpstan-return Record + */ + public function toArray(): array; +} diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php index 9fbf2052..09918520 100644 --- a/vendor/monolog/monolog/src/Monolog/Logger.php +++ b/vendor/monolog/monolog/src/Monolog/Logger.php @@ -147,6 +147,18 @@ class Logger implements LoggerInterface, ResettableInterface */ protected $exceptionHandler; + /** + * @var int Keeps track of depth to prevent infinite logging loops + */ + private $logDepth = 0; + + /** + * @var bool Whether to detect infinite logging loops + * + * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this + */ + private $detectCycles = true; + /** * @psalm-param array $processors * @@ -272,48 +284,80 @@ class Logger implements LoggerInterface, ResettableInterface * * @param bool $micro True to use microtime() to create timestamps */ - public function useMicrosecondTimestamps(bool $micro): void + public function useMicrosecondTimestamps(bool $micro): self { $this->microsecondTimestamps = $micro; + + return $this; + } + + public function useLoggingLoopDetection(bool $detectCycles): self + { + $this->detectCycles = $detectCycles; + + return $this; } /** * Adds a log record. * - * @param int $level The logging level - * @param string $message The log message - * @param mixed[] $context The log context - * @return bool Whether the record has been processed + * @param int $level The logging level + * @param string $message The log message + * @param mixed[] $context The log context + * @param DateTimeImmutable $datetime Optional log date to log into the past or future + * @return bool Whether the record has been processed * * @phpstan-param Level $level */ - public function addRecord(int $level, string $message, array $context = []): bool + public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool { - $offset = 0; - $record = null; + if ($this->detectCycles) { + $this->logDepth += 1; + } + if ($this->logDepth === 3) { + $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.'); + return false; + } elseif ($this->logDepth >= 5) { // log depth 4 is let through so we can log the warning above + return false; + } - foreach ($this->handlers as $handler) { - if (null === $record) { - // skip creating the record as long as no handler is going to handle it - if (!$handler->isHandling(['level' => $level])) { - continue; + try { + $record = null; + + foreach ($this->handlers as $handler) { + if (null === $record) { + // skip creating the record as long as no handler is going to handle it + if (!$handler->isHandling(['level' => $level])) { + continue; + } + + $levelName = static::getLevelName($level); + + $record = [ + 'message' => $message, + 'context' => $context, + 'level' => $level, + 'level_name' => $levelName, + 'channel' => $this->name, + 'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), + 'extra' => [], + ]; + + try { + foreach ($this->processors as $processor) { + $record = $processor($record); + } + } catch (Throwable $e) { + $this->handleException($e, $record); + + return true; + } } - $levelName = static::getLevelName($level); - - $record = [ - 'message' => $message, - 'context' => $context, - 'level' => $level, - 'level_name' => $levelName, - 'channel' => $this->name, - 'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone), - 'extra' => [], - ]; - + // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted try { - foreach ($this->processors as $processor) { - $record = $processor($record); + if (true === $handler->handle($record)) { + break; } } catch (Throwable $e) { $this->handleException($e, $record); @@ -321,16 +365,9 @@ class Logger implements LoggerInterface, ResettableInterface return true; } } - - // once the record exists, send it to all handlers as long as the bubbling chain is not interrupted - try { - if (true === $handler->handle($record)) { - break; - } - } catch (Throwable $e) { - $this->handleException($e, $record); - - return true; + } finally { + if ($this->detectCycles) { + $this->logDepth--; } } diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php index 0823501b..a32e76b2 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php @@ -101,6 +101,7 @@ class IntrospectionProcessor implements ProcessorInterface 'file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, + 'callType' => isset($trace[$i]['type']) ? $trace[$i]['type'] : null, 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null, ] ); diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php index 64d251d7..51850e17 100644 --- a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php +++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php @@ -36,11 +36,12 @@ class WebProcessor implements ProcessorInterface 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER', + 'user_agent' => 'HTTP_USER_AGENT', ]; /** * @param array|\ArrayAccess|null $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data - * @param array|null $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer + * @param array|array|null $extraFields Field names and the related key inside $serverData to be added (or just a list of field names to use the default configured $serverData mapping). If not provided it defaults to: [url, ip, http_method, server, referrer] + unique_id if present in server data */ public function __construct($serverData = null, array $extraFields = null) { @@ -52,20 +53,23 @@ class WebProcessor implements ProcessorInterface throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); } + $defaultEnabled = ['url', 'ip', 'http_method', 'server', 'referrer']; if (isset($this->serverData['UNIQUE_ID'])) { $this->extraFields['unique_id'] = 'UNIQUE_ID'; + $defaultEnabled[] = 'unique_id'; } - if (null !== $extraFields) { - if (isset($extraFields[0])) { - foreach (array_keys($this->extraFields) as $fieldName) { - if (!in_array($fieldName, $extraFields)) { - unset($this->extraFields[$fieldName]); - } + if (null === $extraFields) { + $extraFields = $defaultEnabled; + } + if (isset($extraFields[0])) { + foreach (array_keys($this->extraFields) as $fieldName) { + if (!in_array($fieldName, $extraFields)) { + unset($this->extraFields[$fieldName]); } - } else { - $this->extraFields = $extraFields; } + } else { + $this->extraFields = $extraFields; } } diff --git a/vendor/monolog/monolog/src/Monolog/Test/TestCase.php b/vendor/monolog/monolog/src/Monolog/Test/TestCase.php index 1824fde4..bc0b425e 100644 --- a/vendor/monolog/monolog/src/Monolog/Test/TestCase.php +++ b/vendor/monolog/monolog/src/Monolog/Test/TestCase.php @@ -22,9 +22,20 @@ use Monolog\Formatter\FormatterInterface; * * @phpstan-import-type Record from \Monolog\Logger * @phpstan-import-type Level from \Monolog\Logger + * + * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677 */ class TestCase extends \PHPUnit\Framework\TestCase { + public function tearDown(): void + { + parent::tearDown(); + + if (isset($this->handler)) { + unset($this->handler); + } + } + /** * @param mixed[] $context * diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php index d3e7ad09..726c9819 100644 --- a/vendor/monolog/monolog/src/Monolog/Utils.php +++ b/vendor/monolog/monolog/src/Monolog/Utils.php @@ -260,4 +260,25 @@ final class Utils return $val; } + + /** + * @param array $record + */ + public static function getRecordMessageForException(array $record): string + { + $context = ''; + $extra = ''; + try { + if ($record['context']) { + $context = "\nContext: " . json_encode($record['context']); + } + if ($record['extra']) { + $extra = "\nExtra: " . json_encode($record['extra']); + } + } catch (\Throwable $e) { + // noop + } + + return "\nThe exception occurred while attempting to log: " . $record['message'] . $context . $extra; + } } diff --git a/vendor/nesbot/carbon/bin/carbon b/vendor/nesbot/carbon/bin/carbon old mode 100644 new mode 100755 diff --git a/vendor/nesbot/carbon/composer.json b/vendor/nesbot/carbon/composer.json index 84ec1361..cdbbc121 100644 --- a/vendor/nesbot/carbon/composer.json +++ b/vendor/nesbot/carbon/composer.json @@ -1,14 +1,13 @@ { "name": "nesbot/carbon", - "type": "library", "description": "An API extension for DateTime that supports 281 different languages.", + "license": "MIT", + "type": "library", "keywords": [ "date", "time", "DateTime" ], - "homepage": "https://carbon.nesbot.com", - "license": "MIT", "authors": [ { "name": "Brian Nesbitt", @@ -20,6 +19,26 @@ "homepage": "https://github.com/kylekatarnls" } ], + "homepage": "https://carbon.nesbot.com", + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon", + "docs": "https://carbon.nesbot.com/docs" + }, + "funding": [ + { + "url": "https://github.com/sponsors/kylekatarnls", + "type": "github" + }, + { + "url": "https://tidelift.com/subscription/pkg/packagist-nesbot-carbon?utm_source=packagist-nesbot-carbon&utm_medium=referral&utm_campaign=readme", + "type": "tidelift" + }, + { + "url": "https://opencollective.com/Carbon#sponsor", + "type": "opencollective" + } + ], "require": { "php": "^7.1.8 || ^8.0", "ext-json": "*", @@ -32,19 +51,40 @@ "doctrine/orm": "^2.7", "friendsofphp/php-cs-fixer": "^3.0", "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", "phpmd/phpmd": "^2.9", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.12.54 || ^1.0", - "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", "squizlabs/php_codesniffer": "^3.4" }, - "config": { - "process-timeout": 0, - "sort-packages": true, - "allow-plugins": { - "phpstan/extension-installer": true + "minimum-stability": "dev", + "prefer-stable": true, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" } }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + }, + "files": [ + "tests/Laravel/ServiceProvider.php" + ] + }, + "bin": [ + "bin/carbon" + ], + "config": { + "allow-plugins": { + "phpstan/extension-installer": true, + "composer/package-versions-deprecated": true + }, + "process-timeout": 0, + "sort-packages": true + }, "extra": { "branch-alias": { "dev-3.x": "3.x-dev", @@ -61,24 +101,6 @@ ] } }, - "autoload": { - "psr-4": { - "Carbon\\": "src/Carbon/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - }, - "files": [ - "tests/Laravel/ServiceProvider.php" - ] - }, - "minimum-stability": "dev", - "prefer-stable": true, - "bin": [ - "bin/carbon" - ], "scripts": { "phpcs": "php-cs-fixer fix -v --diff --dry-run", "phpdoc": "php phpdoc.php", @@ -94,10 +116,5 @@ "@phpunit", "@style-check" ] - }, - "support": { - "issues": "https://github.com/briannesbitt/Carbon/issues", - "source": "https://github.com/briannesbitt/Carbon", - "docs": "https://carbon.nesbot.com/docs" } } diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php new file mode 100644 index 00000000..1504b0ab --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroBuiltin.php @@ -0,0 +1,31 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use ReflectionMethod; + +if (!class_exists(AbstractReflectionMacro::class, false)) { + abstract class AbstractReflectionMacro extends AbstractMacro + { + /** + * {@inheritdoc} + */ + public function getReflection(): ?ReflectionMethod + { + return $this->reflectionFunction instanceof ReflectionMethod + ? $this->reflectionFunction + : null; + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php new file mode 100644 index 00000000..450dceb8 --- /dev/null +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/AbstractMacroStatic.php @@ -0,0 +1,41 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\PHPStan; + +use PHPStan\BetterReflection\Reflection; +use ReflectionMethod; + +if (!class_exists(AbstractReflectionMacro::class, false)) { + abstract class AbstractReflectionMacro extends AbstractMacro + { + /** + * {@inheritdoc} + */ + public function getReflection(): ?Reflection\Adapter\ReflectionMethod + { + if ($this->reflectionFunction instanceof Reflection\Adapter\ReflectionMethod) { + return $this->reflectionFunction; + } + + return $this->reflectionFunction instanceof ReflectionMethod + ? new Reflection\Adapter\ReflectionMethod( + Reflection\ReflectionMethod::createFromName( + $this->reflectionFunction->getDeclaringClass()->getName(), + $this->reflectionFunction->getName() + ) + ) + : null; + } + } +} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php index eacd9c1e..47002c47 100644 --- a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroStrongType.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Carbon\PHPStan; if (!class_exists(LazyMacro::class, false)) { - abstract class LazyMacro extends AbstractMacro + abstract class LazyMacro extends AbstractReflectionMacro { /** * {@inheritdoc} diff --git a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php index 3e9fcf4f..c47d70ed 100644 --- a/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php +++ b/vendor/nesbot/carbon/lazy/Carbon/PHPStan/MacroWeakType.php @@ -14,7 +14,7 @@ declare(strict_types=1); namespace Carbon\PHPStan; if (!class_exists(LazyMacro::class, false)) { - abstract class LazyMacro extends AbstractMacro + abstract class LazyMacro extends AbstractReflectionMacro { /** * {@inheritdoc} diff --git a/vendor/nesbot/carbon/readme.md b/vendor/nesbot/carbon/readme.md index 5d827219..100e60f2 100644 --- a/vendor/nesbot/carbon/readme.md +++ b/vendor/nesbot/carbon/readme.md @@ -126,6 +126,10 @@ Support this project by becoming a sponsor. Your logo will show up here with a l + + + + [[Become a sponsor](https://opencollective.com/Carbon#sponsor)] diff --git a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php index 48441e7c..4dc2e700 100644 --- a/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php +++ b/vendor/nesbot/carbon/src/Carbon/AbstractTranslator.php @@ -250,11 +250,7 @@ abstract class AbstractTranslator extends Translation\Translator */ protected function loadMessagesFromFile($locale) { - if (isset($this->messages[$locale])) { - return true; - } - - return $this->resetMessages($locale); + return isset($this->messages[$locale]) || $this->resetMessages($locale); } /** @@ -311,7 +307,7 @@ abstract class AbstractTranslator extends Translation\Translator */ public function setLocale($locale) { - $locale = preg_replace_callback('/[-_]([a-z]{2,}|[0-9]{2,})/', function ($matches) { + $locale = preg_replace_callback('/[-_]([a-z]{2,}|\d{2,})/', function ($matches) { // _2-letters or YUE is a region, _3+-letters is a variant $upper = strtoupper($matches[1]); @@ -359,13 +355,13 @@ abstract class AbstractTranslator extends Translation\Translator parent::setLocale($macroLocale); } - if ($this->loadMessagesFromFile($locale) || $this->initializing) { - parent::setLocale($locale); - - return true; + if (!$this->loadMessagesFromFile($locale) && !$this->initializing) { + return false; } - return false; + parent::setLocale($locale); + + return true; } /** diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php index 15e2061c..c3db8504 100644 --- a/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php +++ b/vendor/nesbot/carbon/src/Carbon/CarbonInterface.php @@ -586,6 +586,7 @@ interface CarbonInterface extends DateTimeInterface, JsonSerializable public const YEARS_PER_DECADE = 10; public const MONTHS_PER_YEAR = 12; public const MONTHS_PER_QUARTER = 3; + public const QUARTERS_PER_YEAR = 4; public const WEEKS_PER_YEAR = 52; public const WEEKS_PER_MONTH = 4; public const DAYS_PER_YEAR = 365; diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php b/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php index d465beac..5aca7422 100644 --- a/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php +++ b/vendor/nesbot/carbon/src/Carbon/CarbonInterval.php @@ -344,14 +344,14 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface /** * Create a new CarbonInterval instance. * - * @param int|null $years - * @param int|null $months - * @param int|null $weeks - * @param int|null $days - * @param int|null $hours - * @param int|null $minutes - * @param int|null $seconds - * @param int|null $microseconds + * @param Closure|DateInterval|string|int|null $years + * @param int|null $months + * @param int|null $weeks + * @param int|null $days + * @param int|null $hours + * @param int|null $minutes + * @param int|null $seconds + * @param int|null $microseconds * * @throws Exception when the interval_spec (passed as $years) cannot be parsed as an interval. */ @@ -372,7 +372,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface $spec = $years; - if (!\is_string($spec) || (float) $years || preg_match('/^[0-9.]/', $years)) { + if (!\is_string($spec) || (float) $years || preg_match('/^[\d.]/', $years)) { $spec = static::PERIOD_PREFIX; $spec .= $years > 0 ? $years.static::PERIOD_YEARS : ''; @@ -984,7 +984,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface { $interval = preg_replace('/\s+/', ' ', trim($interval)); - if (preg_match('/^P[T0-9]/', $interval)) { + if (preg_match('/^P[T\d]/', $interval)) { return new static($interval); } @@ -1435,11 +1435,9 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface ]; } - if ($altNumbers) { - if ($altNumbers !== true) { - $language = new Language($this->locale); - $altNumbers = \in_array($language->getCode(), (array) $altNumbers); - } + if ($altNumbers && $altNumbers !== true) { + $language = new Language($this->locale); + $altNumbers = \in_array($language->getCode(), (array) $altNumbers, true); } if (\is_array($join)) { @@ -1620,18 +1618,23 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface $unit = $short ? 's' : 'second'; $isFuture = $this->invert === 1; $transId = $relativeToNow ? ($isFuture ? 'from_now' : 'ago') : ($isFuture ? 'after' : 'before'); + $declensionMode = null; /** @var \Symfony\Component\Translation\Translator $translator */ $translator = $this->getLocalTranslator(); - $handleDeclensions = function ($unit, $count) use ($interpolations, $transId, $translator, $altNumbers, $absolute) { + $handleDeclensions = function ($unit, $count, $index = 0, $parts = 1) use ($interpolations, $transId, $translator, $altNumbers, $absolute, &$declensionMode) { if (!$absolute) { - // Some languages have special pluralization for past and future tense. - $key = $unit.'_'.$transId; - $result = $this->translate($key, $interpolations, $count, $translator, $altNumbers); + $declensionMode = $declensionMode ?? $this->translate($transId.'_mode'); - if ($result !== $key) { - return $result; + if ($this->needsDeclension($declensionMode, $index, $parts)) { + // Some languages have special pluralization for past and future tense. + $key = $unit.'_'.$transId; + $result = $this->translate($key, $interpolations, $count, $translator, $altNumbers); + + if ($result !== $key) { + return $result; + } } } @@ -1696,17 +1699,17 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface } } - $transChoice = function ($short, $unitData) use ($absolute, $handleDeclensions, $translator, $aUnit, $altNumbers, $interpolations) { + $transChoice = function ($short, $unitData, $index, $parts) use ($absolute, $handleDeclensions, $translator, $aUnit, $altNumbers, $interpolations) { $count = $unitData['value']; if ($short) { - $result = $handleDeclensions($unitData['unitShort'], $count); + $result = $handleDeclensions($unitData['unitShort'], $count, $index, $parts); if ($result !== null) { return $result; } } elseif ($aUnit) { - $result = $handleDeclensions('a_'.$unitData['unit'], $count); + $result = $handleDeclensions('a_'.$unitData['unit'], $count, $index, $parts); if ($result !== null) { return $result; @@ -1714,7 +1717,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface } if (!$absolute) { - return $handleDeclensions($unitData['unit'], $count); + return $handleDeclensions($unitData['unit'], $count, $index, $parts); } return $this->translate($unitData['unit'], $interpolations, $count, $translator, $altNumbers); @@ -1726,7 +1729,7 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface if ($diffIntervalData['value'] > 0) { $unit = $short ? $diffIntervalData['unitShort'] : $diffIntervalData['unit']; $count = $diffIntervalData['value']; - $interval[] = $transChoice($short, $diffIntervalData); + $interval[] = [$short, $diffIntervalData]; } elseif ($options & CarbonInterface::SEQUENTIAL_PARTS_ONLY && \count($interval) > 0) { break; } @@ -1737,13 +1740,19 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface } // break the loop after we have reached the minimum unit - if (\in_array($minimumUnit, [$diffIntervalData['unit'], $diffIntervalData['unitShort']])) { + if (\in_array($minimumUnit, [$diffIntervalData['unit'], $diffIntervalData['unitShort']], true)) { $fallbackUnit = [$diffIntervalData['unit'], $diffIntervalData['unitShort']]; break; } } + $actualParts = \count($interval); + + foreach ($interval as $index => &$item) { + $item = $transChoice($item[0], $item[1], $index, $actualParts); + } + if (\count($interval) === 0) { if ($relativeToNow && $options & CarbonInterface::JUST_NOW) { $key = 'diff_now'; @@ -1814,15 +1823,15 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface { $format = $this->localToStringFormat; - if ($format) { - if ($format instanceof Closure) { - return $format($this); - } - - return $this->format($format); + if (!$format) { + return $this->forHumans(); } - return $this->forHumans(); + if ($format instanceof Closure) { + return $format($this); + } + + return $this->format($format); } /** @@ -2752,4 +2761,14 @@ class CarbonInterval extends DateInterval implements CarbonConverterInterface { return $this->round($precision, 'ceil'); } + + private function needsDeclension(string $mode, int $index, int $parts): bool + { + switch ($mode) { + case 'last': + return $index === $parts - 1; + default: + return true; + } + } } diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php b/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php index 0e81e757..89921d3c 100644 --- a/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php +++ b/vendor/nesbot/carbon/src/Carbon/CarbonPeriod.php @@ -11,6 +11,7 @@ namespace Carbon; +use Carbon\Exceptions\EndLessPeriodException; use Carbon\Exceptions\InvalidCastException; use Carbon\Exceptions\InvalidIntervalException; use Carbon\Exceptions\InvalidPeriodDateException; @@ -377,7 +378,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable ); } - $class = \get_called_class(); + $class = static::class; $type = \gettype($period); throw new NotAPeriodException( @@ -484,7 +485,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable $end = null; foreach (explode('/', $iso) as $key => $part) { - if ($key === 0 && preg_match('/^R([0-9]*|INF)$/', $part, $match)) { + if ($key === 0 && preg_match('/^R(\d*|INF)$/', $part, $match)) { $parsed = \strlen($match[1]) ? (($match[1] !== 'INF') ? (int) $match[1] : INF) : null; } elseif ($interval === null && $parsed = CarbonInterval::make($part)) { $interval = $part; @@ -512,7 +513,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ protected static function addMissingParts($source, $target) { - $pattern = '/'.preg_replace('/[0-9]+/', '[0-9]+', preg_quote($target, '/')).'$/'; + $pattern = '/'.preg_replace('/\d+/', '[0-9]+', preg_quote($target, '/')).'$/'; $result = preg_replace($pattern, $target, $source, 1, $count); @@ -655,10 +656,10 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable $this->setTimezone($argument); } elseif ($this->dateInterval === null && ( - \is_string($argument) && preg_match( - '/^(-?\d(\d(?![\/-])|[^\d\/-]([\/-])?)*|P[T0-9].*|(?:\h*\d+(?:\.\d+)?\h*[a-z]+)+)$/i', + (\is_string($argument) && preg_match( + '/^(-?\d(\d(?![\/-])|[^\d\/-]([\/-])?)*|P[T\d].*|(?:\h*\d+(?:\.\d+)?\h*[a-z]+)+)$/i', $argument - ) || + )) || $argument instanceof DateInterval || $argument instanceof Closure ) && @@ -1235,7 +1236,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ public function setRecurrences($recurrences) { - if (!is_numeric($recurrences) && $recurrences !== null || $recurrences < 0) { + if ((!is_numeric($recurrences) && $recurrences !== null) || $recurrences < 0) { throw new InvalidPeriodParameterException('Invalid number of recurrences.'); } @@ -1266,7 +1267,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ public function setStartDate($date, $inclusive = null) { - if (!$date = ([$this->dateClass, 'make'])($date)) { + if (!$this->isInfiniteDate($date) && !($date = ([$this->dateClass, 'make'])($date))) { throw new InvalidPeriodDateException('Invalid start date.'); } @@ -1291,7 +1292,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ public function setEndDate($date, $inclusive = null) { - if ($date !== null && !$date = ([$this->dateClass, 'make'])($date)) { + if ($date !== null && !$this->isInfiniteDate($date) && !$date = ([$this->dateClass, 'make'])($date)) { throw new InvalidPeriodDateException('Invalid end date.'); } @@ -1461,7 +1462,7 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable $parts = []; - $format = !$this->startDate->isStartOfDay() || $this->endDate && !$this->endDate->isStartOfDay() + $format = !$this->startDate->isStartOfDay() || ($this->endDate && !$this->endDate->isStartOfDay()) ? 'Y-m-d H:i:s' : 'Y-m-d'; @@ -1534,6 +1535,39 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable return $this->cast(DatePeriod::class); } + /** + * Return `true` if the period has no custom filter and is guaranteed to be endless. + * + * Note that we can't check if a period is endless as soon as it has custom filters + * because filters can emit `CarbonPeriod::END_ITERATION` to stop the iteration in + * a way we can't predict without actually iterating the period. + */ + public function isUnfilteredAndEndLess(): bool + { + foreach ($this->filters as $filter) { + switch ($filter) { + case [static::RECURRENCES_FILTER, null]: + if ($this->recurrences !== null && is_finite($this->recurrences)) { + return false; + } + + break; + + case [static::END_DATE_FILTER, null]: + if ($this->endDate !== null && !$this->endDate->isEndOfTime()) { + return false; + } + + break; + + default: + return false; + } + } + + return true; + } + /** * Convert the date period into an array without changing current iteration state. * @@ -1541,6 +1575,10 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ public function toArray() { + if ($this->isUnfilteredAndEndLess()) { + throw new EndLessPeriodException("Endless period can't be converted to array nor counted."); + } + $state = [ $this->key, $this->current ? $this->current->avoidMutation() : null, @@ -1572,6 +1610,16 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable */ public function first() { + if ($this->isUnfilteredAndEndLess()) { + foreach ($this as $date) { + $this->rewind(); + + return $date; + } + + return null; + } + return ($this->toArray() ?: [])[0] ?? null; } @@ -2555,9 +2603,9 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable if (\is_string($value)) { $value = trim($value); - if (!preg_match('/^P[0-9T]/', $value) && - !preg_match('/^R[0-9]/', $value) && - preg_match('/[a-z0-9]/i', $value) + if (!preg_match('/^P[\dT]/', $value) && + !preg_match('/^R\d/', $value) && + preg_match('/[a-z\d]/i', $value) ) { return Carbon::parse($value, $this->tzName); } @@ -2565,4 +2613,9 @@ class CarbonPeriod implements Iterator, Countable, JsonSerializable return null; } + + private function isInfiniteDate($date): bool + { + return $date instanceof CarbonInterface && ($date->isEndOfTime() || $date->isStartOfTime()); + } } diff --git a/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php b/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php index b4d16ba9..9ecd3398 100644 --- a/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php +++ b/vendor/nesbot/carbon/src/Carbon/CarbonTimeZone.php @@ -30,7 +30,7 @@ class CarbonTimeZone extends DateTimeZone throw new InvalidTimeZoneException('Absolute timezone offset cannot be greater than 100.'); } - return ($timezone >= 0 ? '+' : '').$timezone.':00'; + return ($timezone >= 0 ? '+' : '').ltrim($timezone, '+').':00'; } protected static function getDateTimeZoneNameFromMixed($timezone) @@ -101,15 +101,15 @@ class CarbonTimeZone extends DateTimeZone $tz = static::getDateTimeZoneFromName($object); } - if ($tz === false) { - if (Carbon::isStrictModeEnabled()) { - throw new InvalidTimeZoneException('Unknown or bad timezone ('.($objectDump ?: $object).')'); - } - - return false; + if ($tz !== false) { + return new static($tz->getName()); } - return new static($tz->getName()); + if (Carbon::isStrictModeEnabled()) { + throw new InvalidTimeZoneException('Unknown or bad timezone ('.($objectDump ?: $object).')'); + } + + return false; } /** @@ -231,15 +231,15 @@ class CarbonTimeZone extends DateTimeZone { $tz = $this->toRegionName($date); - if ($tz === false) { - if (Carbon::isStrictModeEnabled()) { - throw new InvalidTimeZoneException('Unknown timezone for offset '.$this->getOffset($date ?: Carbon::now($this)).' seconds.'); - } - - return false; + if ($tz !== false) { + return new static($tz); } - return new static($tz); + if (Carbon::isStrictModeEnabled()) { + throw new InvalidTimeZoneException('Unknown timezone for offset '.$this->getOffset($date ?: Carbon::now($this)).' seconds.'); + } + + return false; } /** diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php index b3a08719..3ca8837d 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadComparisonUnitException.php @@ -11,19 +11,38 @@ namespace Carbon\Exceptions; -use Exception; +use Throwable; class BadComparisonUnitException extends UnitException { + /** + * The unit. + * + * @var string + */ + protected $unit; + /** * Constructor. * * @param string $unit * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($unit, $code = 0, Exception $previous = null) + public function __construct($unit, $code = 0, Throwable $previous = null) { + $this->unit = $unit; + parent::__construct("Bad comparison unit: '$unit'", $code, $previous); } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php index d5cd5564..2e222e54 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentConstructorException.php @@ -12,19 +12,38 @@ namespace Carbon\Exceptions; use BadMethodCallException as BaseBadMethodCallException; -use Exception; +use Throwable; class BadFluentConstructorException extends BaseBadMethodCallException implements BadMethodCallException { + /** + * The method. + * + * @var string + */ + protected $method; + /** * Constructor. * * @param string $method * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($method, $code = 0, Exception $previous = null) + public function __construct($method, $code = 0, Throwable $previous = null) { + $this->method = $method; + parent::__construct(sprintf("Unknown fluent constructor '%s'.", $method), $code, $previous); } + + /** + * Get the method. + * + * @return string + */ + public function getMethod(): string + { + return $this->method; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php index 1d7ec542..4ceaa2ef 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadFluentSetterException.php @@ -12,19 +12,38 @@ namespace Carbon\Exceptions; use BadMethodCallException as BaseBadMethodCallException; -use Exception; +use Throwable; class BadFluentSetterException extends BaseBadMethodCallException implements BadMethodCallException { + /** + * The setter. + * + * @var string + */ + protected $setter; + /** * Constructor. * - * @param string $method + * @param string $setter * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($method, $code = 0, Exception $previous = null) + public function __construct($setter, $code = 0, Throwable $previous = null) { - parent::__construct(sprintf("Unknown fluent setter '%s'", $method), $code, $previous); + $this->setter = $setter; + + parent::__construct(sprintf("Unknown fluent setter '%s'", $setter), $code, $previous); + } + + /** + * Get the setter. + * + * @return string + */ + public function getSetter(): string + { + return $this->setter; } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php index 73c2dd86..108206d3 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/BadMethodCallException.php @@ -13,4 +13,5 @@ namespace Carbon\Exceptions; interface BadMethodCallException extends Exception { + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php new file mode 100644 index 00000000..e1049269 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/EndLessPeriodException.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Carbon\Exceptions; + +use RuntimeException as BaseRuntimeException; + +final class EndLessPeriodException extends BaseRuntimeException implements RuntimeException +{ + // +} diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php index 3bbbd77d..8ad747e7 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/Exception.php @@ -13,4 +13,5 @@ namespace Carbon\Exceptions; interface Exception { + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php index a48d4f93..db334c6c 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/ImmutableException.php @@ -11,20 +11,38 @@ namespace Carbon\Exceptions; -use Exception; use RuntimeException as BaseRuntimeException; +use Throwable; class ImmutableException extends BaseRuntimeException implements RuntimeException { + /** + * The value. + * + * @var string + */ + protected $value; + /** * Constructor. * * @param string $value the immutable type/value * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($value, $code = 0, Exception $previous = null) + public function __construct($value, $code = 0, Throwable $previous = null) { + $this->value = $value; parent::__construct("$value is immutable.", $code, $previous); } + + /** + * Get the value. + * + * @return string + */ + public function getValue(): string + { + return $this->value; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php index 9739f4d1..5b013cd5 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidArgumentException.php @@ -13,4 +13,5 @@ namespace Carbon\Exceptions; interface InvalidArgumentException extends Exception { + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php index d2f37019..a421401f 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidCastException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidCastException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php index 99bb91c0..c9ecb6b0 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidDateException.php @@ -11,8 +11,8 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class InvalidDateException extends BaseInvalidArgumentException implements InvalidArgumentException { @@ -36,9 +36,9 @@ class InvalidDateException extends BaseInvalidArgumentException implements Inval * @param string $field * @param mixed $value * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($field, $value, $code = 0, Exception $previous = null) + public function __construct($field, $value, $code = 0, Throwable $previous = null) { $this->field = $field; $this->value = $value; diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php index 3341b49d..92d55fe3 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidFormatException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidFormatException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php index 5f9f142e..69cf4128 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidIntervalException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidIntervalException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php index a37e3f5e..9bd84a96 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodDateException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidPeriodDateException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php index ede47712..cf2c9024 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidPeriodParameterException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidPeriodParameterException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php index 892e16e8..f7259558 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTimeZoneException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidTimeZoneException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php index 3fbe3fc4..2c8ec9ba 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/InvalidTypeException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class InvalidTypeException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php index 2b4c48e3..7a87632c 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotACarbonClassException.php @@ -12,24 +12,39 @@ namespace Carbon\Exceptions; use Carbon\CarbonInterface; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class NotACarbonClassException extends BaseInvalidArgumentException implements InvalidArgumentException { + /** + * The className. + * + * @var string + */ + protected $className; + /** * Constructor. * * @param string $className * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($className, $code = 0, Exception $previous = null) + public function __construct($className, $code = 0, Throwable $previous = null) { - parent::__construct(sprintf( - 'Given class does not implement %s: %s', - CarbonInterface::class, - $className - ), $code, $previous); + $this->className = $className; + + parent::__construct(sprintf('Given class does not implement %s: %s', CarbonInterface::class, $className), $code, $previous); + } + + /** + * Get the className. + * + * @return string + */ + public function getClassName(): string + { + return $this->className; } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php index 41bb6290..4edd7a48 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotAPeriodException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class NotAPeriodException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php index adbc36cd..f2c54684 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/NotLocaleAwareException.php @@ -11,8 +11,8 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class NotLocaleAwareException extends BaseInvalidArgumentException implements InvalidArgumentException { @@ -21,9 +21,9 @@ class NotLocaleAwareException extends BaseInvalidArgumentException implements In * * @param mixed $object * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($object, $code = 0, Exception $previous = null) + public function __construct($object, $code = 0, Throwable $previous = null) { $dump = \is_object($object) ? \get_class($object) : \gettype($object); diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php index 54822d95..2c586d0b 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/OutOfRangeException.php @@ -11,8 +11,8 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; // This will extends OutOfRangeException instead of InvalidArgumentException since 3.0.0 // use OutOfRangeException as BaseOutOfRangeException; @@ -55,9 +55,9 @@ class OutOfRangeException extends BaseInvalidArgumentException implements Invali * @param mixed $max * @param mixed $value * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($unit, $min, $max, $value, $code = 0, Exception $previous = null) + public function __construct($unit, $min, $max, $value, $code = 0, Throwable $previous = null) { $this->unit = $unit; $this->min = $min; diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php index 0314c5d8..5416fd14 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/ParseErrorException.php @@ -11,23 +11,78 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class ParseErrorException extends BaseInvalidArgumentException implements InvalidArgumentException { + /** + * The expected. + * + * @var string + */ + protected $expected; + + /** + * The actual. + * + * @var string + */ + protected $actual; + + /** + * The help message. + * + * @var string + */ + protected $help; + /** * Constructor. * * @param string $expected * @param string $actual * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($expected, $actual, $help = '', $code = 0, Exception $previous = null) + public function __construct($expected, $actual, $help = '', $code = 0, Throwable $previous = null) { + $this->expected = $expected; + $this->actual = $actual; + $this->help = $help; + $actual = $actual === '' ? 'data is missing' : "get '$actual'"; parent::__construct(trim("Format expected $expected but $actual\n$help"), $code, $previous); } + + /** + * Get the expected. + * + * @return string + */ + public function getExpected(): string + { + return $this->expected; + } + + /** + * Get the actual. + * + * @return string + */ + public function getActual(): string + { + return $this->actual; + } + + /** + * Get the help message. + * + * @return string + */ + public function getHelp(): string + { + return $this->help; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php index 24bf5a68..ad196f79 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/RuntimeException.php @@ -13,4 +13,5 @@ namespace Carbon\Exceptions; interface RuntimeException extends Exception { + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php index 8bd8653e..ee99953b 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; class UnitException extends BaseInvalidArgumentException implements InvalidArgumentException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php index 39ee12c5..0e723056 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnitNotConfiguredException.php @@ -11,19 +11,38 @@ namespace Carbon\Exceptions; -use Exception; +use Throwable; class UnitNotConfiguredException extends UnitException { + /** + * The unit. + * + * @var string + */ + protected $unit; + /** * Constructor. * * @param string $unit * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($unit, $code = 0, Exception $previous = null) + public function __construct($unit, $code = 0, Throwable $previous = null) { + $this->unit = $unit; + parent::__construct("Unit $unit have no configuration to get total from other units.", $code, $previous); } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php index 6c8c01b6..5c504975 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownGetterException.php @@ -11,20 +11,39 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class UnknownGetterException extends BaseInvalidArgumentException implements InvalidArgumentException { + /** + * The getter. + * + * @var string + */ + protected $getter; + /** * Constructor. * - * @param string $name getter name + * @param string $getter getter name * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($name, $code = 0, Exception $previous = null) + public function __construct($getter, $code = 0, Throwable $previous = null) { - parent::__construct("Unknown getter '$name'", $code, $previous); + $this->getter = $getter; + + parent::__construct("Unknown getter '$getter'", $code, $previous); + } + + /** + * Get the getter. + * + * @return string + */ + public function getGetter(): string + { + return $this->getter; } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php index 901db986..75273a70 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownMethodException.php @@ -12,19 +12,38 @@ namespace Carbon\Exceptions; use BadMethodCallException as BaseBadMethodCallException; -use Exception; +use Throwable; class UnknownMethodException extends BaseBadMethodCallException implements BadMethodCallException { + /** + * The method. + * + * @var string + */ + protected $method; + /** * Constructor. * * @param string $method * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($method, $code = 0, Exception $previous = null) + public function __construct($method, $code = 0, Throwable $previous = null) { + $this->method = $method; + parent::__construct("Method $method does not exist.", $code, $previous); } + + /** + * Get the method. + * + * @return string + */ + public function getMethod(): string + { + return $this->method; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php index c9e9c9ff..a795f5d7 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownSetterException.php @@ -11,20 +11,39 @@ namespace Carbon\Exceptions; -use Exception; use InvalidArgumentException as BaseInvalidArgumentException; +use Throwable; class UnknownSetterException extends BaseInvalidArgumentException implements BadMethodCallException { + /** + * The setter. + * + * @var string + */ + protected $setter; + /** * Constructor. * - * @param string $name setter name + * @param string $setter setter name * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($name, $code = 0, Exception $previous = null) + public function __construct($setter, $code = 0, Throwable $previous = null) { - parent::__construct("Unknown setter '$name'", $code, $previous); + $this->setter = $setter; + + parent::__construct("Unknown setter '$setter'", $code, $previous); + } + + /** + * Get the setter. + * + * @return string + */ + public function getSetter(): string + { + return $this->setter; } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php index d965c82a..ecd7f7a5 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnknownUnitException.php @@ -11,19 +11,38 @@ namespace Carbon\Exceptions; -use Exception; +use Throwable; class UnknownUnitException extends UnitException { + /** + * The unit. + * + * @var string + */ + protected $unit; + /** * Constructor. * * @param string $unit * @param int $code - * @param Exception|null $previous + * @param Throwable|null $previous */ - public function __construct($unit, $code = 0, Exception $previous = null) + public function __construct($unit, $code = 0, Throwable $previous = null) { + $this->unit = $unit; + parent::__construct("Unknown unit '$unit'.", $code, $previous); } + + /** + * Get the unit. + * + * @return string + */ + public function getUnit(): string + { + return $this->unit; + } } diff --git a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php index 6f8b39f5..1654ab11 100644 --- a/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php +++ b/vendor/nesbot/carbon/src/Carbon/Exceptions/UnreachableException.php @@ -11,20 +11,9 @@ namespace Carbon\Exceptions; -use Exception; use RuntimeException as BaseRuntimeException; class UnreachableException extends BaseRuntimeException implements RuntimeException { - /** - * Constructor. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - */ - public function __construct($message, $code = 0, Exception $previous = null) - { - parent::__construct($message, $code, $previous); - } + // } diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php b/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php new file mode 100644 index 00000000..ad9a4490 --- /dev/null +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ckb.php @@ -0,0 +1,89 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Authors: + * - Swara Mohammed + */ +$months = [ + 'ڕێبەندان', + 'ڕەشەمە', + 'نەورۆز', + 'گوڵان', + 'جۆزەردان', + 'پوشپەڕ', + 'گەلاوێژ', + 'خەرمانان', + 'ڕەزبەر', + 'گەڵاڕێزان', + 'سەرماوەرز', + 'بەفرانبار', +]; + +return [ + 'year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵ', '{2}ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), + 'a_year' => implode('|', ['{0}:count ساڵێک', '{1}ساڵ', '{2}ساڵ', ']2,11[:count ساڵ', ']10,Inf[:count ساڵ']), + 'month' => implode('|', ['{0}:count مانگێک', '{1}مانگ', '{2}مانگين', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), + 'a_month' => implode('|', ['{0}:count مانگێک', '{1}مانگ', '{2}مانگين', ']2,11[:count مانگ', ']10,Inf[:count مانگ']), + 'week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتە', '{2}هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), + 'a_week' => implode('|', ['{0}:count هەفتەیەک', '{1}هەفتە', '{2}هەفتە', ']2,11[:count هەفتە', ']10,Inf[:count هەفتە']), + 'day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژ', '{2}ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), + 'a_day' => implode('|', ['{0}:count ڕۆژێک', '{1}ڕۆژ', '{2}ڕۆژ', ']2,11[:count ڕۆژ', ']10,Inf[:count ڕۆژ']), + 'hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێر', '{2}کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), + 'a_hour' => implode('|', ['{0}:count کاتژمێرێک', '{1}کاتژمێر', '{2}کاتژمێر', ']2,11[:count کاتژمێر', ']10,Inf[:count کاتژمێر']), + 'minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەک', '{2}خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), + 'a_minute' => implode('|', ['{0}:count خولەکێک', '{1}خولەک', '{2}خولەک', ']2,11[:count خولەک', ']10,Inf[:count خولەک']), + 'second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکە', '{2}چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), + 'a_second' => implode('|', ['{0}:count چرکەیەک', '{1}چرکە', '{2}چرکە', ']2,11[:count چرکە', ']10,Inf[:count چرکە']), + 'ago' => 'پێشتر :time', + 'from_now' => ':time لە ئێستاوە', + 'after' => 'دوای :time', + 'before' => 'پێش :time', + 'diff_now' => 'ئێستا', + 'diff_today' => 'ئەمڕۆ', + 'diff_today_regexp' => 'ڕۆژ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_yesterday' => 'دوێنێ', + 'diff_yesterday_regexp' => 'دوێنێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_tomorrow' => 'سبەینێ', + 'diff_tomorrow_regexp' => 'سبەینێ(?:\\s+لە)?(?:\\s+کاتژمێر)?', + 'diff_before_yesterday' => 'پێش دوێنێ', + 'diff_after_tomorrow' => 'دوای سبەینێ', + 'period_recurrences' => implode('|', ['{0}جار', '{1}جار', '{2}:count دووجار', ']2,11[:count جار', ']10,Inf[:count جار']), + 'period_interval' => 'هەموو :interval', + 'period_start_date' => 'لە :date', + 'period_end_date' => 'بۆ :date', + 'months' => $months, + 'months_short' => $months, + 'weekdays' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'weekdays_short' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'weekdays_min' => ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'هەینی', 'شەممە'], + 'list' => ['، ', ' و '], + 'first_day_of_week' => 6, + 'day_of_first_week_of_year' => 1, + 'formats' => [ + 'LT' => 'HH:mm', + 'LTS' => 'HH:mm:ss', + 'L' => 'D/M/YYYY', + 'LL' => 'D MMMM YYYY', + 'LLL' => 'D MMMM YYYY HH:mm', + 'LLLL' => 'dddd D MMMM YYYY HH:mm', + ], + 'calendar' => [ + 'sameDay' => '[ئەمڕۆ لە کاتژمێر] LT', + 'nextDay' => '[سبەینێ لە کاتژمێر] LT', + 'nextWeek' => 'dddd [لە کاتژمێر] LT', + 'lastDay' => '[دوێنێ لە کاتژمێر] LT', + 'lastWeek' => 'dddd [لە کاتژمێر] LT', + 'sameElse' => 'L', + ], + 'meridiem' => ['پ.ن', 'د.ن'], + 'weekend' => [5, 6], +]; diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php index 8cff9a01..c01e3ccc 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cs.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cs.php @@ -101,7 +101,8 @@ return [ 'after' => $za, 'first_day_of_week' => 1, 'day_of_first_week_of_year' => 4, - 'months' => ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], + 'months' => ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'], + 'months_standalone' => ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'], 'months_short' => ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'], 'weekdays' => ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'], 'weekdays_short' => ['ned', 'pon', 'úte', 'stř', 'čtv', 'pát', 'sob'], diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php index ab7c45a4..119274f0 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/cy.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/cy.php @@ -60,7 +60,7 @@ return [ 'ordinal' => function ($number) { return $number.( $number > 20 - ? (\in_array($number, [40, 50, 60, 80, 100]) ? 'fed' : 'ain') + ? (\in_array((int) $number, [40, 50, 60, 80, 100], true) ? 'fed' : 'ain') : ([ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed', // 11eg to 20fed diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/da.php b/vendor/nesbot/carbon/src/Carbon/Lang/da.php index 4e6640a6..322f91d5 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/da.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/da.php @@ -18,6 +18,7 @@ * - Jens Herlevsen * - Ulrik McArdle (mcardle) * - Frederik Sauer (FrittenKeeZ) + * - Janus Bahs Jacquet (kokoshneta) */ return [ 'year' => ':count år|:count år', @@ -41,7 +42,7 @@ return [ 'second' => ':count sekund|:count sekunder', 'a_second' => 'få sekunder|:count sekunder', 's' => ':count s.', - 'ago' => ':time siden', + 'ago' => 'for :time siden', 'from_now' => 'om :time', 'after' => ':time efter', 'before' => ':time før', @@ -70,9 +71,9 @@ return [ ], 'ordinal' => ':number.', 'months' => ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'], - 'months_short' => ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'], + 'months_short' => ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'], 'weekdays' => ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'], - 'weekdays_short' => ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'], + 'weekdays_short' => ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'], 'weekdays_min' => ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'], 'first_day_of_week' => 1, 'day_of_first_week_of_year' => 4, diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/en.php b/vendor/nesbot/carbon/src/Carbon/Lang/en.php index a8633fef..f81f617e 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/en.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/en.php @@ -72,7 +72,7 @@ return [ $lastDigit = $number % 10; return $number.( - (~~($number % 100 / 10) === 1) ? 'th' : ( + ((int) ($number % 100 / 10) === 1) ? 'th' : ( ($lastDigit === 1) ? 'st' : ( ($lastDigit === 2) ? 'nd' : ( ($lastDigit === 3) ? 'rd' : 'th' diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php index 73fe5e41..8c81ec65 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/fr.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/fr.php @@ -90,7 +90,7 @@ return [ 'weekdays_min' => ['di', 'lu', 'ma', 'me', 'je', 've', 'sa'], 'ordinal' => function ($number, $period) { switch ($period) { - // In french, only the first has be ordinal, other number remains cardinal + // In French, only the first has to be ordinal, other number remains cardinal // @link https://fr.wikihow.com/%C3%A9crire-la-date-en-fran%C3%A7ais case 'D': return $number.($number === 1 ? 'er' : ''); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/it.php b/vendor/nesbot/carbon/src/Carbon/Lang/it.php index 605bcbb5..30c0ffd5 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/it.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/it.php @@ -55,7 +55,7 @@ return [ 'µs' => ':countµs', 'ago' => ':time fa', 'from_now' => function ($time) { - return (preg_match('/^[0-9].+$/', $time) ? 'tra' : 'in')." $time"; + return (preg_match('/^\d.+$/', $time) ? 'tra' : 'in')." $time"; }, 'after' => ':time dopo', 'before' => ':time prima', diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php index 717d199b..38c6434d 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/mn.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/mn.php @@ -26,6 +26,7 @@ * - Nicolás Hock Isaza * - Ochirkhuyag * - Batmandakh + * - lucifer-crybaby */ return [ 'year' => ':count жил', @@ -43,38 +44,55 @@ return [ 'second' => ':count секунд', 's' => ':countс', - 'ago' => ':timeн өмнө', - 'year_ago' => ':count жилий', - 'month_ago' => ':count сары', - 'day_ago' => ':count хоногий', - 'hour_ago' => ':count цагий', - 'minute_ago' => ':count минуты', - 'second_ago' => ':count секунды', + 'ago_mode' => 'last', + 'ago' => ':time өмнө', + 'year_ago' => ':count жилийн', + 'y_ago' => ':count жилийн', + 'month_ago' => ':count сарын', + 'm_ago' => ':count сарын', + 'day_ago' => ':count хоногийн', + 'd_ago' => ':count хоногийн', + 'week_ago' => ':count долоо хоногийн', + 'w_ago' => ':count долоо хоногийн', + 'hour_ago' => ':count цагийн', + 'minute_ago' => ':count минутын', + 'second_ago' => ':count секундын', + 'from_now_mode' => 'last', 'from_now' => 'одоогоос :time', 'year_from_now' => ':count жилийн дараа', + 'y_from_now' => ':count жилийн дараа', 'month_from_now' => ':count сарын дараа', + 'm_from_now' => ':count сарын дараа', 'day_from_now' => ':count хоногийн дараа', + 'd_from_now' => ':count хоногийн дараа', 'hour_from_now' => ':count цагийн дараа', 'minute_from_now' => ':count минутын дараа', 'second_from_now' => ':count секундын дараа', - // Does it required to make translation for before, after as follows? hmm, I think we've made it with ago and from now keywords already. Anyway, I've included it just in case of undesired action... - 'after' => ':timeн дараа', - 'year_after' => ':count жилий', - 'month_after' => ':count сары', - 'day_after' => ':count хоногий', - 'hour_after' => ':count цагий', - 'minute_after' => ':count минуты', - 'second_after' => ':count секунды', + 'after_mode' => 'last', + 'after' => ':time дараа', + 'year_after' => ':count жилийн', + 'y_after' => ':count жилийн', + 'month_after' => ':count сарын', + 'm_after' => ':count сарын', + 'day_after' => ':count хоногийн', + 'd_after' => ':count хоногийн', + 'hour_after' => ':count цагийн', + 'minute_after' => ':count минутын', + 'second_after' => ':count секундын', - 'before' => ':timeн өмнө', - 'year_before' => ':count жилий', - 'month_before' => ':count сары', - 'day_before' => ':count хоногий', - 'hour_before' => ':count цагий', - 'minute_before' => ':count минуты', - 'second_before' => ':count секунды', + 'before_mode' => 'last', + 'before' => ':time өмнө', + 'year_before' => ':count жилийн', + 'y_before' => ':count жилийн', + 'month_before' => ':count сарын', + 'm_before' => ':count сарын', + 'day_before' => ':count хоногийн', + 'd_before' => ':count хоногийн', + 'hour_before' => ':count цагийн', + 'minute_before' => ':count минутын', + 'second_before' => ':count секундын', 'list' => ', ', 'diff_now' => 'одоо', diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php index fd0f6b3e..08af197c 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sk.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sk.php @@ -31,6 +31,7 @@ * - jofi * - Jakub ADAMEC * - Marek Adamický + * - AlterwebStudio */ return [ 'year' => 'rok|:count roky|:count rokov', @@ -46,11 +47,12 @@ return [ 'minute' => 'minútu|:count minúty|:count minút', 'min' => ':count min', 'second' => 'sekundu|:count sekundy|:count sekúnd', + 'a_second' => 'pár sekúnd|:count sekundy|:count sekúnd', 's' => ':count s', 'ago' => 'pred :time', - 'from_now' => 'za :time', - 'after' => 'o :time neskôr', - 'before' => ':time predtým', + 'from_now' => 'o :time', + 'after' => ':time po', + 'before' => ':time pred', 'year_ago' => 'rokom|:count rokmi|:count rokmi', 'month_ago' => 'mesiacom|:count mesiacmi|:count mesiacmi', 'week_ago' => 'týždňom|:count týždňami|:count týždňami', @@ -73,7 +75,7 @@ return [ 'LLLL' => 'dddd D. MMMM YYYY HH:mm', ], 'weekdays' => ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'], - 'weekdays_short' => ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'], + 'weekdays_short' => ['ned', 'pod', 'uto', 'str', 'štv', 'pia', 'sob'], 'weekdays_min' => ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'], 'months' => ['január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október', 'november', 'december'], 'months_short' => ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'], diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/ss.php b/vendor/nesbot/carbon/src/Carbon/Lang/ss.php index cd4b9190..1c52c9bf 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/ss.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/ss.php @@ -50,7 +50,7 @@ return [ $lastDigit = $number % 10; return $number.( - (~~($number % 100 / 10) === 1) ? 'e' : ( + ((int) ($number % 100 / 10) === 1) ? 'e' : ( ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' ) ); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php index ca33e1c4..1706c719 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/sv.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/sv.php @@ -70,7 +70,7 @@ return [ $lastDigit = $number % 10; return $number.( - (~~($number % 100 / 10) === 1) ? 'e' : ( + ((int) ($number % 100 / 10) === 1) ? 'e' : ( ($lastDigit === 1 || $lastDigit === 2) ? 'a' : 'e' ) ); diff --git a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php index b267b000..1d5ba703 100644 --- a/vendor/nesbot/carbon/src/Carbon/Lang/uk.php +++ b/vendor/nesbot/carbon/src/Carbon/Lang/uk.php @@ -193,6 +193,7 @@ return [ 'genitive' => ['неділі', 'понеділка', 'вівторка', 'середи', 'четверга', 'п’ятниці', 'суботи'], ]; + $format = $format ?? ''; $nounCase = preg_match('/(\[(В|в|У|у)\])\s+dddd/u', $format) ? 'accusative' : ( diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php index fc6fd2a7..0369e809 100644 --- a/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/AbstractMacro.php @@ -205,16 +205,6 @@ abstract class AbstractMacro implements BuiltinMethodReflection return $this; } - /** - * {@inheritdoc} - */ - public function getReflection(): ?ReflectionMethod - { - return $this->reflectionFunction instanceof ReflectionMethod - ? $this->reflectionFunction - : null; - } - public function getTentativeReturnType(): ?ReflectionType { return null; diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php index 83925873..de3e51f6 100644 --- a/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/Macro.php @@ -13,9 +13,16 @@ declare(strict_types=1); namespace Carbon\PHPStan; +use PHPStan\BetterReflection\Reflection\Adapter; use PHPStan\Reflection\Php\BuiltinMethodReflection; use ReflectionMethod; +$method = new ReflectionMethod(BuiltinMethodReflection::class, 'getReflection'); + +require $method->hasReturnType() && $method->getReturnType()->getName() === Adapter\ReflectionMethod::class + ? __DIR__.'/../../../lazy/Carbon/PHPStan/AbstractMacroStatic.php' + : __DIR__.'/../../../lazy/Carbon/PHPStan/AbstractMacroBuiltin.php'; + $method = new ReflectionMethod(BuiltinMethodReflection::class, 'getFileName'); require $method->hasReturnType() diff --git a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php index 8e2524c0..9fccf4d7 100644 --- a/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php +++ b/vendor/nesbot/carbon/src/Carbon/PHPStan/MacroExtension.php @@ -50,6 +50,11 @@ final class MacroExtension implements MethodsClassReflectionExtension */ public function hasMethod(ClassReflection $classReflection, string $methodName): bool { + var_dump($classReflection->getName(), $methodName, $this->scanner->hasMethod($classReflection->getName(), $methodName)); + echo "\n\n"; + +// echo (new \Exception())->getTraceAsString(); +// exit(); return $this->scanner->hasMethod($classReflection->getName(), $methodName); } diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php b/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php index a23e6ed0..5e30243a 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Comparison.php @@ -448,7 +448,7 @@ trait Comparison */ public function isWeekend() { - return \in_array($this->dayOfWeek, static::$weekendDays); + return \in_array($this->dayOfWeek, static::$weekendDays, true); } /** @@ -621,19 +621,19 @@ trait Comparison 'microsecond' => 'Y-m-d H:i:s.u', ]; - if (!isset($units[$unit])) { - if (isset($this->$unit)) { - return $this->resolveCarbon($date)->$unit === $this->$unit; - } - - if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { - throw new BadComparisonUnitException($unit); - } - - return false; + if (isset($units[$unit])) { + return $this->isSameAs($units[$unit], $date); } - return $this->isSameAs($units[$unit], $date); + if (isset($this->$unit)) { + return $this->resolveCarbon($date)->$unit === $this->$unit; + } + + if ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) { + throw new BadComparisonUnitException($unit); + } + + return false; } /** diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php b/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php index 8fe008a5..12689dc7 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Converter.php @@ -628,7 +628,7 @@ trait Converter $period->setDateInterval($interval); } - if (\is_int($end) || \is_string($end) && ctype_digit($end)) { + if (\is_int($end) || (\is_string($end) && ctype_digit($end))) { $period->setRecurrences($end); } elseif ($end) { $period->setEndDate($end); diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php b/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php index f2adee5f..96a168ac 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php @@ -368,7 +368,7 @@ trait Creator */ public static function create($year = 0, $month = 1, $day = 1, $hour = 0, $minute = 0, $second = 0, $tz = null) { - if (\is_string($year) && !is_numeric($year) || $year instanceof DateTimeInterface) { + if ((\is_string($year) && !is_numeric($year)) || $year instanceof DateTimeInterface) { return static::parse($year, $tz ?: (\is_string($month) || $month instanceof DateTimeZone ? $month : null)); } @@ -907,9 +907,9 @@ trait Creator if (\is_string($var)) { $var = trim($var); - if (!preg_match('/^P[0-9T]/', $var) && - !preg_match('/^R[0-9]/', $var) && - preg_match('/[a-z0-9]/i', $var) + if (!preg_match('/^P[\dT]/', $var) && + !preg_match('/^R\d/', $var) && + preg_match('/[a-z\d]/i', $var) ) { $date = static::parse($var); } diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Date.php b/vendor/nesbot/carbon/src/Carbon/Traits/Date.php index 8c8af6fb..c3a13a85 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Date.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Date.php @@ -643,7 +643,7 @@ trait Date * * @return array */ - protected static function getRangesByUnit() + protected static function getRangesByUnit(int $daysInMonth = 31): array { return [ // @call roundUnit @@ -651,7 +651,7 @@ trait Date // @call roundUnit 'month' => [1, static::MONTHS_PER_YEAR], // @call roundUnit - 'day' => [1, 31], + 'day' => [1, $daysInMonth], // @call roundUnit 'hour' => [0, static::HOURS_PER_DAY - 1], // @call roundUnit @@ -940,7 +940,7 @@ trait Date case $name === 'millisecond': // @property int case $name === 'milli': - return (int) floor($this->rawFormat('u') / 1000); + return (int) floor(((int) $this->rawFormat('u')) / 1000); // @property int 1 through 53 case $name === 'week': @@ -1250,7 +1250,7 @@ trait Date protected function getTranslatedFormByRegExp($baseKey, $keySuffix, $context, $subKey, $defaultValue) { $key = $baseKey.$keySuffix; - $standaloneKey = "${key}_standalone"; + $standaloneKey = "{$key}_standalone"; $baseTranslation = $this->getTranslationMessage($key); if ($baseTranslation instanceof Closure) { @@ -1259,7 +1259,7 @@ trait Date if ( $this->getTranslationMessage("$standaloneKey.$subKey") && - (!$context || ($regExp = $this->getTranslationMessage("${baseKey}_regexp")) && !preg_match($regExp, $context)) + (!$context || (($regExp = $this->getTranslationMessage("{$baseKey}_regexp")) && !preg_match($regExp, $context))) ) { $key = $standaloneKey; } @@ -1848,7 +1848,10 @@ trait Date $format = preg_replace('#(?toDateTimeString())); + $time = strtotime($this->toDateTimeString()); + $formatted = ($this->localStrictModeEnabled ?? static::isStrictModeEnabled()) + ? strftime($format, $time) + : @strftime($format, $time); return static::$utf8 ? utf8_encode($formatted) : $formatted; } @@ -2359,7 +2362,7 @@ trait Date $symbol = $second < 0 ? '-' : '+'; $minute = abs($second) / static::SECONDS_PER_MINUTE; $hour = str_pad((string) floor($minute / static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT); - $minute = str_pad((string) ($minute % static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT); + $minute = str_pad((string) (((int) $minute) % static::MINUTES_PER_HOUR), 2, '0', STR_PAD_LEFT); return "$symbol$hour$separator$minute"; } @@ -2479,7 +2482,7 @@ trait Date return 'millennia'; } - return "${unit}s"; + return "{$unit}s"; } protected function executeCallable($macro, ...$parameters) @@ -2566,7 +2569,7 @@ trait Date if (str_starts_with($unit, 'is')) { $word = substr($unit, 2); - if (\in_array($word, static::$days)) { + if (\in_array($word, static::$days, true)) { return $this->isDayOfWeek($word); } @@ -2594,7 +2597,7 @@ trait Date $unit = strtolower(substr($unit, 3)); } - if (\in_array($unit, static::$units)) { + if (\in_array($unit, static::$units, true)) { return $this->setUnit($unit, ...$parameters); } @@ -2604,7 +2607,7 @@ trait Date if (str_starts_with($unit, 'Real')) { $unit = static::singularUnit(substr($unit, 4)); - return $this->{"${action}RealUnit"}($unit, ...$parameters); + return $this->{"{$action}RealUnit"}($unit, ...$parameters); } if (preg_match('/^(Month|Quarter|Year|Decade|Century|Centurie|Millennium|Millennia)s?(No|With|Without|WithNo)Overflow$/', $unit, $match)) { @@ -2616,7 +2619,7 @@ trait Date } if (static::isModifiableUnit($unit)) { - return $this->{"${action}Unit"}($unit, $parameters[0] ?? 1, $overflow); + return $this->{"{$action}Unit"}($unit, $parameters[0] ?? 1, $overflow); } $sixFirstLetters = substr($unit, 0, 6); diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php b/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php index cce1d2c3..ed824661 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Difference.php @@ -472,7 +472,7 @@ trait Difference */ public function floatDiffInSeconds($date = null, $absolute = true) { - return $this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND; + return (float) ($this->diffInMicroseconds($date, $absolute) / static::MICROSECONDS_PER_SECOND); } /** diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php index ddd2b4e9..46392282 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Localization.php @@ -23,7 +23,9 @@ use Symfony\Component\Translation\TranslatorInterface; use Symfony\Contracts\Translation\LocaleAwareInterface; use Symfony\Contracts\Translation\TranslatorInterface as ContractsTranslatorInterface; -if (!interface_exists('Symfony\\Component\\Translation\\TranslatorInterface')) { +if (interface_exists('Symfony\\Contracts\\Translation\\TranslatorInterface') && + !interface_exists('Symfony\\Component\\Translation\\TranslatorInterface') +) { class_alias( 'Symfony\\Contracts\\Translation\\TranslatorInterface', 'Symfony\\Component\\Translation\\TranslatorInterface' @@ -454,7 +456,7 @@ trait Localization } } - $this->setLocalTranslator($translator); + $this->localTranslator = $translator; } return $this; @@ -555,17 +557,13 @@ trait Localization public static function localeHasShortUnits($locale) { return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) { - return $newLocale && - ( - ($y = static::translateWith($translator, 'y')) !== 'y' && - $y !== static::translateWith($translator, 'year') - ) || ( - ($y = static::translateWith($translator, 'd')) !== 'd' && + return ($newLocale && (($y = static::translateWith($translator, 'y')) !== 'y' && $y !== static::translateWith($translator, 'year'))) || ( + ($y = static::translateWith($translator, 'd')) !== 'd' && $y !== static::translateWith($translator, 'day') - ) || ( - ($y = static::translateWith($translator, 'h')) !== 'h' && + ) || ( + ($y = static::translateWith($translator, 'h')) !== 'h' && $y !== static::translateWith($translator, 'hour') - ); + ); }); } diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php b/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php index 33062397..c991a9b0 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Rounding.php @@ -52,7 +52,7 @@ trait Rounding 'millisecond' => [1000, 'microsecond'], ]; $normalizedUnit = static::singularUnit($unit); - $ranges = array_merge(static::getRangesByUnit(), [ + $ranges = array_merge(static::getRangesByUnit($this->daysInMonth), [ // @call roundUnit 'microsecond' => [0, 999999], ]); @@ -93,7 +93,7 @@ trait Rounding $delta = $maximum + 1 - $minimum; $factor /= $delta; $fraction *= $delta; - $arguments[0] += $this->$unit * $factor; + $arguments[0] += ($this->$unit - $minimum) * $factor; $changes[$unit] = round( $minimum + ($fraction ? $fraction * $function(($this->$unit - $minimum) / $fraction) : 0) ); diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php b/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php index eebc69bd..ee287bef 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Serialization.php @@ -142,7 +142,7 @@ trait Serialization #[ReturnTypeWillChange] public function __wakeup() { - if (get_parent_class() && method_exists(parent::class, '__wakeup')) { + if (parent::class && method_exists(parent::class, '__wakeup')) { // @codeCoverageIgnoreStart try { parent::__wakeup(); diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Test.php b/vendor/nesbot/carbon/src/Carbon/Traits/Test.php index c86faa74..e0c9e806 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Test.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Test.php @@ -28,7 +28,7 @@ trait Test /** * A test Carbon instance to be returned when now instances are created. * - * @var static + * @var Closure|static|null */ protected static $testNow; @@ -59,15 +59,13 @@ trait Test * * /!\ Use this method for unit tests only. * - * @param Closure|static|string|false|null $testNow real or mock Carbon instance + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance */ public static function setTestNow($testNow = null) { - if ($testNow === false) { - $testNow = null; - } - - static::$testNow = \is_string($testNow) ? static::parse($testNow) : $testNow; + static::$testNow = $testNow instanceof self || $testNow instanceof Closure + ? $testNow + : static::make($testNow); } /** @@ -87,7 +85,7 @@ trait Test * * /!\ Use this method for unit tests only. * - * @param Closure|static|string|false|null $testNow real or mock Carbon instance + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance */ public static function setTestNowAndTimezone($testNow = null, $tz = null) { @@ -121,16 +119,20 @@ trait Test * * /!\ Use this method for unit tests only. * - * @param Closure|static|string|false|null $testNow real or mock Carbon instance - * @param Closure|null $callback + * @param DateTimeInterface|Closure|static|string|false|null $testNow real or mock Carbon instance + * @param Closure|null $callback * * @return mixed */ public static function withTestNow($testNow = null, $callback = null) { static::setTestNow($testNow); - $result = $callback(); - static::setTestNow(); + + try { + $result = $callback(); + } finally { + static::setTestNow(); + } return $result; } diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php b/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php index 2cb5c48d..88a465c9 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Timestamp.php @@ -63,7 +63,7 @@ trait Timestamp public static function createFromTimestampMsUTC($timestamp) { [$milliseconds, $microseconds] = self::getIntegerAndDecimalParts($timestamp, 3); - $sign = $milliseconds < 0 || $milliseconds === 0.0 && $microseconds < 0 ? -1 : 1; + $sign = $milliseconds < 0 || ($milliseconds === 0.0 && $microseconds < 0) ? -1 : 1; $milliseconds = abs($milliseconds); $microseconds = $sign * abs($microseconds) + static::MICROSECONDS_PER_MILLISECOND * ($milliseconds % static::MILLISECONDS_PER_SECOND); $seconds = $sign * floor($milliseconds / static::MILLISECONDS_PER_SECOND); @@ -125,7 +125,7 @@ trait Timestamp */ public function getPreciseTimestamp($precision = 6) { - return round($this->rawFormat('Uu') / pow(10, 6 - $precision)); + return round(((float) $this->rawFormat('Uu')) / pow(10, 6 - $precision)); } /** @@ -182,7 +182,7 @@ trait Timestamp $integer = 0; $decimal = 0; - foreach (preg_split('`[^0-9.]+`', $numbers) as $chunk) { + foreach (preg_split('`[^\d.]+`', $numbers) as $chunk) { [$integerPart, $decimalPart] = explode('.', "$chunk."); $integer += (int) $integerPart; diff --git a/vendor/nesbot/carbon/src/Carbon/Traits/Units.php b/vendor/nesbot/carbon/src/Carbon/Traits/Units.php index 2902a8b1..4fc7d233 100644 --- a/vendor/nesbot/carbon/src/Carbon/Traits/Units.php +++ b/vendor/nesbot/carbon/src/Carbon/Traits/Units.php @@ -60,8 +60,6 @@ trait Units case 'millisecond': return $this->addRealUnit('microsecond', $value * static::MICROSECONDS_PER_MILLISECOND); - break; - // @call addRealUnit case 'second': break; @@ -167,7 +165,7 @@ trait Units 'weekday', ]; - return \in_array($unit, $modifiableUnits) || \in_array($unit, static::$units); + return \in_array($unit, $modifiableUnits, true) || \in_array($unit, static::$units, true); } /** @@ -264,7 +262,7 @@ trait Units /** @var static $date */ $date = $date->addDays($sign); - while (\in_array($date->dayOfWeek, $weekendDays)) { + while (\in_array($date->dayOfWeek, $weekendDays, true)) { $date = $date->addDays($sign); } } @@ -274,14 +272,14 @@ trait Units } $timeString = $date->toTimeString(); - } elseif ($canOverflow = \in_array($unit, [ + } elseif ($canOverflow = (\in_array($unit, [ 'month', 'year', ]) && ($overflow === false || ( $overflow === null && ($ucUnit = ucfirst($unit).'s') && !($this->{'local'.$ucUnit.'Overflow'} ?? static::{'shouldOverflow'.$ucUnit}()) - ))) { + )))) { $day = $date->day; } diff --git a/vendor/nikic/php-parser/README.md b/vendor/nikic/php-parser/README.md index e5b26bf5..708cdfcb 100644 --- a/vendor/nikic/php-parser/README.md +++ b/vendor/nikic/php-parser/README.md @@ -3,10 +3,10 @@ PHP Parser [![Coverage Status](https://coveralls.io/repos/github/nikic/PHP-Parser/badge.svg?branch=master)](https://coveralls.io/github/nikic/PHP-Parser?branch=master) -This is a PHP 5.2 to PHP 8.0 parser written in PHP. Its purpose is to simplify static code analysis and +This is a PHP 5.2 to PHP 8.1 parser written in PHP. Its purpose is to simplify static code analysis and manipulation. -[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.0). +[**Documentation for version 4.x**][doc_master] (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.1). [Documentation for version 3.x][doc_3_x] (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2). diff --git a/vendor/nikic/php-parser/grammar/php5.y b/vendor/nikic/php-parser/grammar/php5.y index f9e7e7dd..a62e9a31 100644 --- a/vendor/nikic/php-parser/grammar/php5.y +++ b/vendor/nikic/php-parser/grammar/php5.y @@ -689,9 +689,7 @@ array_expr: scalar_dereference: array_expr '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } - | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' - { $attrs = attributes(); $attrs['kind'] = strKind($1); - $$ = Expr\ArrayDimFetch[new Scalar\String_(Scalar\String_::parse($1), $attrs), $3]; } + | T_CONSTANT_ENCAPSED_STRING '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[Scalar\String_::fromString($1, attributes()), $3]; } | constant '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } | scalar_dereference '[' dim_offset ']' { $$ = Expr\ArrayDimFetch[$1, $3]; } /* alternative array syntax missing intentionally */ @@ -793,10 +791,8 @@ ctor_arguments: common_scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes(), true); } - | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } - | T_CONSTANT_ENCAPSED_STRING - { $attrs = attributes(); $attrs['kind'] = strKind($1); - $$ = new Scalar\String_(Scalar\String_::parse($1, false), $attrs); } + | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } + | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes(), false); } | T_LINE { $$ = Scalar\MagicConst\Line[]; } | T_FILE { $$ = Scalar\MagicConst\File[]; } | T_DIR { $$ = Scalar\MagicConst\Dir[]; } diff --git a/vendor/nikic/php-parser/grammar/php7.y b/vendor/nikic/php-parser/grammar/php7.y index eac68d09..087bc739 100644 --- a/vendor/nikic/php-parser/grammar/php7.y +++ b/vendor/nikic/php-parser/grammar/php7.y @@ -382,8 +382,18 @@ enum_case_expr: class_entry_type: T_CLASS { $$ = 0; } - | T_ABSTRACT T_CLASS { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } - | T_FINAL T_CLASS { $$ = Stmt\Class_::MODIFIER_FINAL; } + | class_modifiers T_CLASS { $$ = $1; } +; + +class_modifiers: + class_modifier { $$ = $1; } + | class_modifiers class_modifier { $this->checkClassModifier($1, $2, #2); $$ = $1 | $2; } +; + +class_modifier: + T_ABSTRACT { $$ = Stmt\Class_::MODIFIER_ABSTRACT; } + | T_FINAL { $$ = Stmt\Class_::MODIFIER_FINAL; } + | T_READONLY { $$ = Stmt\Class_::MODIFIER_READONLY; } ; extends_from: @@ -1014,9 +1024,7 @@ dereferencable_scalar: { $attrs = attributes(); $attrs['kind'] = Expr\Array_::KIND_LONG; $$ = new Expr\Array_($3, $attrs); } | array_short_syntax { $$ = $1; } - | T_CONSTANT_ENCAPSED_STRING - { $attrs = attributes(); $attrs['kind'] = strKind($1); - $$ = new Scalar\String_(Scalar\String_::parse($1), $attrs); } + | T_CONSTANT_ENCAPSED_STRING { $$ = Scalar\String_::fromString($1, attributes()); } | '"' encaps_list '"' { $attrs = attributes(); $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; parseEncapsed($2, '"', true); $$ = new Scalar\Encapsed($2, $attrs); } @@ -1024,7 +1032,7 @@ dereferencable_scalar: scalar: T_LNUMBER { $$ = $this->parseLNumber($1, attributes()); } - | T_DNUMBER { $$ = Scalar\DNumber[Scalar\DNumber::parse($1)]; } + | T_DNUMBER { $$ = Scalar\DNumber::fromString($1, attributes()); } | dereferencable_scalar { $$ = $1; } | constant { $$ = $1; } | class_constant { $$ = $1; } diff --git a/vendor/nikic/php-parser/grammar/phpyLang.php b/vendor/nikic/php-parser/grammar/phpyLang.php index 1a9808dc..663c2a14 100644 --- a/vendor/nikic/php-parser/grammar/phpyLang.php +++ b/vendor/nikic/php-parser/grammar/phpyLang.php @@ -128,14 +128,6 @@ function resolveMacros($code) { . ' else { ' . $args[0] . ' = null; }'; } - if ('strKind' === $name) { - assertArgs(1, $args, $name); - - return '(' . $args[0] . '[0] === "\'" || (' . $args[0] . '[1] === "\'" && ' - . '(' . $args[0] . '[0] === \'b\' || ' . $args[0] . '[0] === \'B\')) ' - . '? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED)'; - } - if ('prependLeadingComments' === $name) { assertArgs(1, $args, $name); diff --git a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php index 87e2901a..35b54d04 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Builder/Class_.php @@ -67,7 +67,7 @@ class Class_ extends Declaration * @return $this The builder instance (for fluid interface) */ public function makeAbstract() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_ABSTRACT); return $this; } @@ -78,7 +78,13 @@ class Class_ extends Declaration * @return $this The builder instance (for fluid interface) */ public function makeFinal() { - $this->flags = BuilderHelpers::addModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_FINAL); + + return $this; + } + + public function makeReadonly() { + $this->flags = BuilderHelpers::addClassModifier($this->flags, Stmt\Class_::MODIFIER_READONLY); return $this; } diff --git a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php index 2f0e9127..b8839db3 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php +++ b/vendor/nikic/php-parser/lib/PhpParser/BuilderHelpers.php @@ -310,4 +310,13 @@ final class BuilderHelpers Stmt\Class_::verifyModifier($modifiers, $modifier); return $modifiers | $modifier; } + + /** + * Adds a modifier and returns new modifier bitmask. + * @return int New modifiers + */ + public static function addClassModifier(int $existingModifiers, int $modifierToSet) : int { + Stmt\Class_::verifyClassModifier($existingModifiers, $modifierToSet); + return $existingModifiers | $modifierToSet; + } } diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php index b69eb16f..07a74df8 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Const_.php @@ -11,7 +11,7 @@ class Const_ extends NodeAbstract /** @var Expr Value */ public $value; - /** @var Name Namespaced name (if using NameResolver) */ + /** @var Name|null Namespaced name (if using NameResolver) */ public $namespacedName; /** @@ -30,7 +30,7 @@ class Const_ extends NodeAbstract public function getSubNodeNames() : array { return ['name', 'value']; } - + public function getType() : string { return 'Const'; } diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php index 29ce0dd4..d4796d65 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php @@ -24,6 +24,17 @@ class DNumber extends Scalar return ['value']; } + /** + * @param mixed[] $attributes + */ + public static function fromString(string $str, array $attributes = []): DNumber + { + $attributes['rawValue'] = $str; + $float = self::parse($str); + + return new DNumber($float, $attributes); + } + /** * @internal * @@ -63,7 +74,7 @@ class DNumber extends Scalar // dec return (float) $str; } - + public function getType() : string { return 'Scalar_DNumber'; } diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php index f17dd1f8..2cc2b22c 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/LNumber.php @@ -41,6 +41,8 @@ class LNumber extends Scalar * @return LNumber The constructed LNumber, including kind attribute */ public static function fromString(string $str, array $attributes = [], bool $allowInvalidOctal = false) : LNumber { + $attributes['rawValue'] = $str; + $str = str_replace('_', '', $str); if ('0' !== $str[0] || '0' === $str) { @@ -71,7 +73,7 @@ class LNumber extends Scalar $attributes['kind'] = LNumber::KIND_OCT; return new LNumber(intval($str, 8), $attributes); } - + public function getType() : string { return 'Scalar_LNumber'; } diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php index 8a6d93a4..6690a16b 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/String_.php @@ -42,6 +42,22 @@ class String_ extends Scalar return ['value']; } + /** + * @param bool $parseUnicodeEscape Whether to parse PHP 7 \u escapes + */ + public static function fromString(string $str, array $attributes = [], bool $parseUnicodeEscape = true): self + { + $attributes['kind'] = ($str[0] === "'" || ($str[1] === "'" && ($str[0] === 'b' || $str[0] === 'B'))) + ? Scalar\String_::KIND_SINGLE_QUOTED + : Scalar\String_::KIND_DOUBLE_QUOTED; + + $attributes['rawValue'] = $str; + + $string = self::parse($str, $parseUnicodeEscape); + + return new self($string, $attributes); + } + /** * @internal * diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php index 6c336917..2fa4e861 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/ClassLike.php @@ -13,7 +13,7 @@ abstract class ClassLike extends Node\Stmt /** @var Node\AttributeGroup[] PHP attribute groups */ public $attrGroups; - /** @var Node\Name Namespaced name (if using NameResolver) */ + /** @var Node\Name|null Namespaced name (if using NameResolver) */ public $namespacedName; /** diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php index b290aaf6..52ed6c6c 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Class_.php @@ -68,6 +68,10 @@ class Class_ extends ClassLike return (bool) ($this->flags & self::MODIFIER_FINAL); } + public function isReadonly() : bool { + return (bool) ($this->flags & self::MODIFIER_READONLY); + } + /** * Whether the class is anonymous. * @@ -77,6 +81,27 @@ class Class_ extends ClassLike return null === $this->name; } + /** + * @internal + */ + public static function verifyClassModifier($a, $b) { + if ($a & self::MODIFIER_ABSTRACT && $b & self::MODIFIER_ABSTRACT) { + throw new Error('Multiple abstract modifiers are not allowed'); + } + + if ($a & self::MODIFIER_FINAL && $b & self::MODIFIER_FINAL) { + throw new Error('Multiple final modifiers are not allowed'); + } + + if ($a & self::MODIFIER_READONLY && $b & self::MODIFIER_READONLY) { + throw new Error('Multiple readonly modifiers are not allowed'); + } + + if ($a & 48 && $b & 48) { + throw new Error('Cannot use the final modifier on an abstract class'); + } + } + /** * @internal */ diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php index abb7ee5c..c2ccae24 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Stmt/Function_.php @@ -20,7 +20,7 @@ class Function_ extends Node\Stmt implements FunctionLike /** @var Node\AttributeGroup[] PHP attribute groups */ public $attrGroups; - /** @var Node\Name Namespaced name (if using NameResolver) */ + /** @var Node\Name|null Namespaced name (if using NameResolver) */ public $namespacedName; /** diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php index c62adfd2..d9c8fe04 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php5.php @@ -2147,8 +2147,7 @@ class Php5 extends \PhpParser\ParserAbstract $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 392 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(4-1)][0] === "'" || ($this->semStack[$stackPos-(4-1)][1] === "'" && ($this->semStack[$stackPos-(4-1)][0] === 'b' || $this->semStack[$stackPos-(4-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $this->semValue = new Expr\ArrayDimFetch(new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(4-1)]), $attrs), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch(Scalar\String_::fromString($this->semStack[$stackPos-(4-1)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes), $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 393 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); @@ -2275,11 +2274,10 @@ class Php5 extends \PhpParser\ParserAbstract $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, true); }, 434 => function ($stackPos) { - $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 435 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)], false), $attrs); + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes, false); }, 436 => function ($stackPos) { $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); diff --git a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php index 7a0854b3..71ba0187 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php +++ b/vendor/nikic/php-parser/lib/PhpParser/Parser/Php7.php @@ -18,16 +18,16 @@ use PhpParser\Node\Stmt; class Php7 extends \PhpParser\ParserAbstract { protected $tokenToSymbolMapSize = 396; - protected $actionTableSize = 1196; - protected $gotoTableSize = 545; + protected $actionTableSize = 1189; + protected $gotoTableSize = 611; protected $invalidSymbol = 168; protected $errorSymbol = 1; protected $defaultAction = -32766; protected $unexpectedTokenRule = 32767; - protected $YY2TBLSTATE = 420; - protected $numNonLeafStates = 710; + protected $YY2TBLSTATE = 421; + protected $numNonLeafStates = 709; protected $symbolToName = array( "EOF", @@ -244,153 +244,152 @@ class Php7 extends \PhpParser\ParserAbstract ); protected $action = array( - 132, 133, 134, 569, 135, 136, 0, 722, 723, 724, - 137, 37, 834, 911, 835, 469,-32766,-32766,-32766,-32767, - -32767,-32767,-32767, 101, 102, 103, 104, 105, 1068, 1069, - 1070, 1067, 1066, 1065, 1071, 716, 715,-32766,-32766,-32766, + 132, 133, 134, 568, 135, 136, 0, 721, 722, 723, + 137, 37, 921, 448, 449, 450,-32766,-32766,-32766,-32767, + -32767,-32767,-32767, 101, 102, 103, 104, 105, 1071, 1072, + 1073, 1070, 1069, 1068, 1074, 715, 714,-32766,-32766,-32766, -32766,-32766,-32766,-32766,-32766,-32766,-32767,-32767,-32767,-32767, - -32767, 545, 546,-32766,-32766, 725,-32766,-32766,-32766, 998, - 999, 806, 922, 447, 448, 449, 370, 371, 2, 267, - 138, 396, 729, 730, 731, 732, 414,-32766, 420,-32766, - -32766,-32766,-32766,-32766, 990, 733, 734, 735, 736, 737, - 738, 739, 740, 741, 742, 743, 763, 570, 764, 765, - 766, 767, 755, 756, 336, 337, 758, 759, 744, 745, - 746, 748, 749, 750, 346, 790, 791, 792, 793, 794, - 795, 751, 752, 571, 572, 784, 775, 773, 774, 787, - 770, 771, 283, 420, 573, 574, 769, 575, 576, 577, - 578, 579, 580, 598, -575, 470, 14, 798, 772, 581, - 582, -575, 139,-32766,-32766,-32766, 132, 133, 134, 569, - 135, 136, 1017, 722, 723, 724, 137, 37, 1060,-32766, - -32766,-32766, 1303, 696,-32766, 1304,-32766,-32766,-32766,-32766, - -32766,-32766,-32766, 1068, 1069, 1070, 1067, 1066, 1065, 1071, - -32766, 716, 715, 372, 371, 1258,-32766,-32766,-32766, -572, - 106, 107, 108, 414, 270, 891, -572, 240, 1193, 1192, - 1194, 725,-32766,-32766,-32766, 1046, 109,-32766,-32766,-32766, - -32766, 986, 985, 984, 987, 267, 138, 396, 729, 730, - 731, 732, 12,-32766, 420,-32766,-32766,-32766,-32766, 998, - 999, 733, 734, 735, 736, 737, 738, 739, 740, 741, - 742, 743, 763, 570, 764, 765, 766, 767, 755, 756, - 336, 337, 758, 759, 744, 745, 746, 748, 749, 750, - 346, 790, 791, 792, 793, 794, 795, 751, 752, 571, - 572, 784, 775, 773, 774, 787, 770, 771, 881, 321, - 573, 574, 769, 575, 576, 577, 578, 579, 580,-32766, - 82, 83, 84, -575, 772, 581, 582, -575, 148, 747, - 717, 718, 719, 720, 721, 1278, 722, 723, 724, 760, - 761, 36, 1277, 85, 86, 87, 88, 89, 90, 91, + -32767, 371, 372, 240, 2, 724,-32766,-32766,-32766, 1001, + 1002, 415, 956,-32766,-32766,-32766, 373, 372, 12, 267, + 138, 397, 728, 729, 730, 731, 415,-32766, 421,-32766, + -32766,-32766,-32766,-32766,-32766, 732, 733, 734, 735, 736, + 737, 738, 739, 740, 741, 742, 762, 569, 763, 764, + 765, 766, 754, 755, 337, 338, 757, 758, 743, 744, + 745, 747, 748, 749, 347, 789, 790, 791, 792, 793, + 794, 750, 751, 570, 571, 783, 774, 772, 773, 786, + 769, 770, 284, 421, 572, 573, 768, 574, 575, 576, + 577, 578, 579, 597, -579,-32766,-32766, 797, 771, 580, + 581, -579, 139,-32766,-32766,-32766, 132, 133, 134, 568, + 135, 136, 1020, 721, 722, 723, 137, 37,-32766,-32766, + -32766, 542, 1306, 126,-32766, 1307,-32766,-32766,-32766,-32766, + -32766,-32766,-32766, 1071, 1072, 1073, 1070, 1069, 1068, 1074, + 957, 715, 714, -318, 993, 1261,-32766,-32766,-32766, -576, + 106, 107, 108, -268, 270, 890, -576, 910, 1196, 1195, + 1197, 724,-32766,-32766,-32766, 1049, 109,-32766,-32766,-32766, + -32766, 989, 988, 987, 990, 267, 138, 397, 728, 729, + 730, 731, 1233,-32766, 421,-32766,-32766,-32766,-32766, 1001, + 1002, 732, 733, 734, 735, 736, 737, 738, 739, 740, + 741, 742, 762, 569, 763, 764, 765, 766, 754, 755, + 337, 338, 757, 758, 743, 744, 745, 747, 748, 749, + 347, 789, 790, 791, 792, 793, 794, 750, 751, 570, + 571, 783, 774, 772, 773, 786, 769, 770, 880, 321, + 572, 573, 768, 574, 575, 576, 577, 578, 579,-32766, + 82, 83, 84, -579, 771, 580, 581, -579, 148, 746, + 716, 717, 718, 719, 720, 1281, 721, 722, 723, 759, + 760, 36, 1280, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 996, 270, 150, - -32766,-32766,-32766, 455, 456, 81, 34, -264, -572, 1016, - 109, 320, -572, 893, 725, 682, 803, 128, 998, 999, - 592,-32766, 1044,-32766,-32766,-32766, 809, 151, 726, 727, - 728, 729, 730, 731, 732, -88, 1198, 796, 278, -526, - 283,-32766,-32766,-32766, 733, 734, 735, 736, 737, 738, - 739, 740, 741, 742, 743, 763, 786, 764, 765, 766, - 767, 755, 756, 757, 785, 758, 759, 744, 745, 746, - 748, 749, 750, 789, 790, 791, 792, 793, 794, 795, - 751, 752, 753, 754, 784, 775, 773, 774, 787, 770, - 771, 144, 804, 762, 768, 769, 776, 777, 779, 778, - 780, 781, -314, -526, -526, -193, -192, 772, 783, 782, - 49, 50, 51, 500, 52, 53, 239, 807, -526, -86, - 54, 55, -111, 56, 996, 253,-32766, -111, 800, -111, - -526, 541, -532, -352, 300, -352, 304, -111, -111, -111, - -111, -111, -111, -111, -111, 998, 999, 998, 999, 153, - -32766,-32766,-32766, 1191, 807, 126, 306, 1293, 57, 58, - 103, 104, 105, -111, 59, 1218, 60, 246, 247, 61, - 62, 63, 64, 65, 66, 67, 68, -525, 27, 268, - 69, 436, 501, -328, 808, -86, 1224, 1225, 502, 1189, - 807, 1198, 1230, 293, 1222, 41, 24, 503, 74, 504, - 953, 505, 320, 506, 802, 154, 507, 508, 279, 684, - 280, 43, 44, 437, 367, 366, 891, 45, 509, 35, - 249, -16, -566, 358, 332, 318, -566, 1198, 1193, 1192, - 1194, -527, 510, 511, 512, 333, -524, 1274, 48, 716, - 715, -525, -525, 334, 513, 514, 807, 1212, 1213, 1214, - 1215, 1209, 1210, 292, 360, 284, -525, 285, -314, 1216, - 1211, -193, -192, 1193, 1192, 1194, 293, 891, -525, 364, - -531, 70, 807, 316, 317, 320, 31, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - -153, -153, -153, 638, 25, -527, -527, 687, 379, 881, - -524, -524, 296, 297, 891, -153, 432, -153, 807, -153, - -527, -153, 716, 715, 433, -524, 798, 363, -111, 1105, - 1107, 365, -527, 434, 891, 140, 435, -524, 954, 127, - -524, 320, -111, -111, 688, 813, 381, -529, 11, 834, - 155, 835, 867, -111, -111, -111, -111, 47, 293,-32766, - 881, 654, 655, 74, 689, 1191, 1045, 320, 708, 149, - 399, 157,-32766,-32766,-32766, 32,-32766, -79,-32766, 123, - -32766, 716, 715,-32766, 893, 891, 682, -153,-32766,-32766, - -32766, 716, 715, 891,-32766,-32766, 124, 881, 129, 74, - -32766, 411, 130, 320, -524, -524, 143, 141, -75,-32766, - 158, -529, -529, 320, 27, 691, 159, 881, 160, -524, - 161, 294, 295, 698, 368, 369, 807, -73,-32766, -72, - 1222, -524, 373, 374, 1191, 893, -71, 682, -529, 73, - -70,-32766,-32766,-32766, -69,-32766, -68,-32766, 125,-32766, - 630, 631,-32766, -67, -66, -47, -51,-32766,-32766,-32766, - -18, 147, 271,-32766,-32766, 277, 697, 700, 881,-32766, - 411, 890, 893, 146, 682, 282, 881, 907,-32766, 281, - 513, 514, 286, 1212, 1213, 1214, 1215, 1209, 1210, 326, - 131, 145, 939, 287, 682, 1216, 1211, 109, 270,-32766, - 798, 807,-32766, 662, 639, 1191, 657, 72, 675, 1075, - 317, 320,-32766,-32766,-32766, 1305,-32766, 301,-32766, 628, - -32766, 431, 543,-32766,-32766, 923, 555, 924,-32766,-32766, - -32766, 1229, 549,-32766,-32766,-32766, -4, 891, -490, 1191, - -32766, 411, 644, 893, 299, 682,-32766,-32766,-32766,-32766, - -32766, 893,-32766, 682,-32766, 13, 1231,-32766, 452, 480, - 645, 909,-32766,-32766,-32766,-32766, 658, -480,-32766,-32766, - 0, 1191, 0, 0,-32766, 411, 0, 298,-32766,-32766, - -32766, 305,-32766,-32766,-32766, 0,-32766, 0, 806,-32766, - 0, 0, 0, 475,-32766,-32766,-32766,-32766, 0, 7, - -32766,-32766, 16, 1191, 561, 596,-32766, 411, 1219, 891, - -32766,-32766,-32766, 362,-32766,-32766,-32766, 818,-32766, -267, - 881,-32766, 39, 293, 0, 0,-32766,-32766,-32766, 40, - 705, 706,-32766,-32766, 872, 963, 940, 947,-32766, 411, - 937, 948, 365, 870, 427, 891, 935,-32766, 1049, 291, - 1244, 1052, 1053, -111, -111, 1050, 1051, 1057, -560, 1262, - 1296, 633, 0, 826, -111, -111, -111, -111, 33, 315, - -32766, 361, 683, 686, 690, 692, 1191, 693, 694, 695, - 699, 685, 320,-32766,-32766,-32766, 9,-32766, 702,-32766, - 868,-32766, 881, 1300,-32766, 893, 1302, 682, -4,-32766, - -32766,-32766, 829, 828, 837,-32766,-32766, 916, -242, -242, - -242,-32766, 411, 955, 365, 27, 836, 1301, 915, 917, - -32766, 914, 1177, 900, 910, -111, -111, 807, 881, 898, - 945, 1222, 946, 1299, 1256, 867, -111, -111, -111, -111, - 1245, 1263, 1269, 1272, -241, -241, -241, -558, -532, -531, - 365, -530, 1, 28, 29, 38, 42, 46, 71, 0, - 75, -111, -111, 76, 77, 78, 79, 893, 80, 682, - -242, 867, -111, -111, -111, -111, 142, 152, 156, 245, - 322, 347, 514, 348, 1212, 1213, 1214, 1215, 1209, 1210, - 349, 350, 351, 352, 353, 354, 1216, 1211, 355, 356, - 357, 359, 428, 893, -265, 682, -241, -264, 72, 0, - 18, 317, 320, 19, 20, 21, 23, 398, 471, 472, - 479, 482, 483, 484, 485, 489, 490, 491, 498, 669, - 1202, 1145, 1220, 1019, 1018, 1181, -269, -103, 17, 22, - 26, 290, 397, 589, 593, 620, 674, 1149, 1197, 1146, - 1275, 0, -494, 1162, 0, 1223 + 102, 103, 104, 105, 106, 107, 108, 999, 270, -318, + -32766,-32766,-32766, 456, 457, 81, -193, 808, -576, 1019, + 109, 320, -576, 892, 724, 681, 802, 695, 1001, 1002, + 591,-32766, 1047,-32766,-32766,-32766, 715, 714, 725, 726, + 727, 728, 729, 730, 731, -192, -86, 795, 279, -530, + 284,-32766,-32766,-32766, 732, 733, 734, 735, 736, 737, + 738, 739, 740, 741, 742, 762, 785, 763, 764, 765, + 766, 754, 755, 756, 784, 757, 758, 743, 744, 745, + 747, 748, 749, 788, 789, 790, 791, 792, 793, 794, + 750, 751, 752, 753, 783, 774, 772, 773, 786, 769, + 770, 470, 803, 761, 767, 768, 775, 776, 778, 777, + 779, 780, -86, -530, -530, 637, 25, 771, 782, 781, + 49, 50, 51, 501, 52, 53, 239, 34, -530, 890, + 54, 55, -111, 56, 999, 128,-32766, -111, 1201, -111, + -530, -570, -536, 890, 300, -570, 144, -111, -111, -111, + -111, -111, -111, -111, -111, 1001, 1002, 1001, 1002, 686, + 1201, 925, 926, 1194, 806, 890, 927, 1296, 57, 58, + 799, 253, -193, 687, 59, 807, 60, 246, 247, 61, + 62, 63, 64, 65, 66, 67, 68, 304, 27, 268, + 69, 437, 502, -332, 306, 688, 1227, 1228, 503, 1192, + 806, -192, 318, 890, 1225, 41, 24, 504, 334, 505, + 14, 506, 880, 507, 653, 654, 508, 509, 280, 806, + 281, 43, 44, 438, 368, 367, 880, 45, 510, 35, + 249, 471, 1063, 359, 333, 103, 104, 105, 1196, 1195, + 1197, 806, 511, 512, 513, 335, 801, 1221, 880, 361, + 285, 683, 286, 365, 514, 515, 380, 1215, 1216, 1217, + 1218, 1212, 1213, 292, 433, -111, 715, 714, 434, 1219, + 1214, 149, 400, 1196, 1195, 1197, 293, -153, -153, -153, + -356, 70, -356, 316, 317, 320, 880, 892, -531, 681, + 435, 1048, -153, 707, -153, 293, -153, 1277, -153, 27, + 74, 892, 436, 681, 320, 369, 370, 833, 366, 834, + -529, 806, 382, 812, 11, 1225, 833, 150, 834, -111, + -111, 151, 74, 942, -111, 681, 320, 153, 806, 866, + -111, -111, -111, -111, 31, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 715, 714, + 374, 375, -531, -531, 890, 154, 805, 155, -4, 890, + 157, 892, -88, 681, -153, 514, 515, -531, 1215, 1216, + 1217, 1218, 1212, 1213, -529, -529, 797, 1108, 1110, -531, + 1219, 1214, 715, 714, 690,-32766, 629, 630, -528, -529, + 32, 1194, 72, 123, 124, 317, 320, 129,-32766,-32766, + -32766, -529,-32766, -535,-32766, 130,-32766, 140, 143,-32766, + 158, 159, 160, 320,-32766,-32766,-32766, 161, -528,-32766, + -32766,-32766, -79, 282, -75, 1194,-32766, 412, -73, 27, + -72, -71,-32766,-32766,-32766,-32766,-32766, 880,-32766, 287, + -32766, 806, 880,-32766, -70, 1225, -69, -68,-32766,-32766, + -32766, -67, -528, -528,-32766,-32766, -66, 141, -47, -18, + -32766, 412, 147, 320, 366, 73, 428, -528, 271,-32766, + 278, 291, -51, 696, 699, -111, -111, 1201, -533, -528, + -111, 889, -528, -528, 48, 825, -111, -111, -111, -111, + 146, 327, 283, 270, 288, 109, 515, -528, 1215, 1216, + 1217, 1218, 1212, 1213, 131, 906, 661, -16, 9, -528, + 1219, 1214, 892, 797, 681,-32766, 145, 892, 1308, 681, + -4, 1194, 72,-32766, 638, 317, 320, 806,-32766,-32766, + -32766, 1078,-32766, 544,-32766, 627,-32766, 13, 656,-32766, + 548, 298, -533, -533,-32766,-32766,-32766,-32766, 296, 297, + -32766,-32766, 674, 1194, 643, 890,-32766, 412, 806, 453, + -32766,-32766,-32766, 364,-32766,-32766,-32766, 481,-32766, -533, + -32766,-32766, 47, -494, 890, 127,-32766,-32766,-32766,-32766, + 644, 657,-32766,-32766, 305, 1194, 890, 805,-32766, 412, + 1222, 301,-32766,-32766,-32766, 0,-32766,-32766,-32766, 432, + -32766, 299, 922,-32766, -111, 293, 554, 476,-32766,-32766, + -32766,-32766, 1232, -484,-32766,-32766, 697, 1194, 560, 908, + -32766, 412, 595, 817,-32766,-32766,-32766, 7,-32766,-32766, + -32766, 1234,-32766, 16, 293,-32766, 294, 295, 880, 74, + -32766,-32766,-32766, 320, 363, 39,-32766,-32766, 40, 704, + 705, 871,-32766, 412, -246, -246, -246, 880, 966, 943, + 366,-32766, 950, 125, 1247, 940, 951, 869, 938, 880, + 1052, -111, -111, -245, -245, -245, -111, 1055, 1056, 366, + 1053, 866, -111, -111, -111, -111, 1054, 1060, 701, 1265, + -111, -111, 1299, 632, -564, -111, 33, 315, -271, 362, + 866, -111, -111, -111, -111, 682, 685, 689, 691, 692, + 693, 694,-32766, 892, 698, 681, -246, 684, 1194, 867, + 1303, 1305, 828, 827, 836,-32766,-32766,-32766, 915,-32766, + 958,-32766, 892,-32766, 681, -245,-32766, 835, 1304, 914, + 916,-32766,-32766,-32766, 892, 913, 681,-32766,-32766, 1180, + 899, 909, 897,-32766, 412, 948, 949, 1302, 1259, 1248, + 1266, 1272,-32766, 1275, -269, -562, -536, -535, -534, 1, + 28, 29, 38, 42, 46, 71, 75, 76, 77, 78, + 79, 80, 142, 152, 156, 245, 322, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 360, 429, + 0, -268, 0, 18, 19, 20, 21, 23, 399, 472, + 473, 480, 483, 484, 485, 486, 490, 491, 492, 499, + 668, 1205, 1148, 1223, 1022, 1021, 1184, -273, -103, 17, + 22, 26, 290, 398, 588, 592, 619, 673, 1152, 1200, + 1149, 1278, 0, -498, 1165, 0, 1226, 0, 320 ); protected $actionCheck = array( 2, 3, 4, 5, 6, 7, 0, 9, 10, 11, - 12, 13, 106, 1, 108, 31, 9, 10, 11, 44, + 12, 13, 128, 129, 130, 131, 9, 10, 11, 44, 45, 46, 47, 48, 49, 50, 51, 52, 116, 117, 118, 119, 120, 121, 122, 37, 38, 30, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 117, 118, 9, 10, 57, 9, 10, 11, 137, - 138, 155, 128, 129, 130, 131, 106, 107, 8, 71, + 43, 106, 107, 14, 8, 57, 9, 10, 11, 137, + 138, 116, 31, 9, 10, 11, 106, 107, 8, 71, 72, 73, 74, 75, 76, 77, 116, 30, 80, 32, - 33, 34, 35, 36, 1, 87, 88, 89, 90, 91, + 33, 34, 35, 36, 30, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 30, 80, 136, 137, 138, 139, 140, 141, - 142, 143, 144, 51, 1, 161, 101, 80, 150, 151, + 142, 143, 144, 51, 1, 9, 10, 80, 150, 151, 152, 8, 154, 9, 10, 11, 2, 3, 4, 5, - 6, 7, 164, 9, 10, 11, 12, 13, 123, 9, - 10, 11, 80, 161, 30, 83, 32, 33, 34, 35, + 6, 7, 164, 9, 10, 11, 12, 13, 9, 10, + 11, 85, 80, 14, 30, 83, 32, 33, 34, 35, 36, 37, 38, 116, 117, 118, 119, 120, 121, 122, - 30, 37, 38, 106, 107, 1, 9, 10, 11, 1, - 53, 54, 55, 116, 57, 1, 8, 14, 155, 156, + 159, 37, 38, 8, 1, 1, 9, 10, 11, 1, + 53, 54, 55, 164, 57, 1, 8, 1, 155, 156, 157, 57, 9, 10, 11, 162, 69, 30, 116, 32, 33, 119, 120, 121, 122, 71, 72, 73, 74, 75, - 76, 77, 8, 30, 80, 32, 33, 34, 35, 137, + 76, 77, 146, 30, 80, 32, 33, 34, 35, 137, 138, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, @@ -401,168 +400,167 @@ class Php7 extends \PhpParser\ParserAbstract 3, 4, 5, 6, 7, 1, 9, 10, 11, 12, 13, 30, 8, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 116, 57, 14, - 9, 10, 11, 134, 135, 161, 8, 164, 160, 1, - 69, 167, 164, 159, 57, 161, 80, 8, 137, 138, - 1, 30, 1, 32, 33, 34, 1, 14, 71, 72, - 73, 74, 75, 76, 77, 31, 1, 80, 30, 70, + 49, 50, 51, 52, 53, 54, 55, 116, 57, 164, + 9, 10, 11, 134, 135, 161, 8, 1, 160, 1, + 69, 167, 164, 159, 57, 161, 80, 161, 137, 138, + 1, 30, 1, 32, 33, 34, 37, 38, 71, 72, + 73, 74, 75, 76, 77, 8, 31, 80, 30, 70, 30, 9, 10, 11, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, - 133, 8, 156, 136, 137, 138, 139, 140, 141, 142, - 143, 144, 8, 134, 135, 8, 8, 150, 151, 152, - 2, 3, 4, 5, 6, 7, 97, 82, 149, 31, - 12, 13, 101, 15, 116, 8, 116, 106, 80, 108, - 161, 85, 163, 106, 113, 108, 8, 116, 117, 118, - 119, 120, 121, 122, 123, 137, 138, 137, 138, 14, - 9, 10, 11, 80, 82, 14, 8, 85, 50, 51, - 50, 51, 52, 128, 56, 1, 58, 59, 60, 61, - 62, 63, 64, 65, 66, 67, 68, 70, 70, 71, - 72, 73, 74, 162, 159, 97, 78, 79, 80, 116, - 82, 1, 146, 158, 86, 87, 88, 89, 163, 91, - 31, 93, 167, 95, 156, 14, 98, 99, 35, 161, - 37, 103, 104, 105, 106, 107, 1, 109, 110, 147, - 148, 31, 160, 115, 116, 8, 164, 1, 155, 156, - 157, 70, 124, 125, 126, 8, 70, 1, 70, 37, - 38, 134, 135, 8, 136, 137, 82, 139, 140, 141, - 142, 143, 144, 145, 8, 35, 149, 37, 164, 151, - 152, 164, 164, 155, 156, 157, 158, 1, 161, 8, - 163, 163, 82, 165, 166, 167, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, - 75, 76, 77, 75, 76, 134, 135, 31, 8, 84, - 134, 135, 134, 135, 1, 90, 8, 92, 82, 94, - 149, 96, 37, 38, 8, 149, 80, 149, 128, 59, - 60, 106, 161, 8, 1, 161, 8, 161, 159, 161, - 70, 167, 117, 118, 31, 8, 106, 70, 108, 106, - 14, 108, 127, 128, 129, 130, 131, 70, 158, 74, - 84, 75, 76, 163, 31, 80, 159, 167, 161, 101, - 102, 14, 87, 88, 89, 14, 91, 31, 93, 16, - 95, 37, 38, 98, 159, 1, 161, 162, 103, 104, - 105, 37, 38, 1, 109, 110, 16, 84, 16, 163, - 115, 116, 16, 167, 134, 135, 16, 161, 31, 124, - 16, 134, 135, 167, 70, 31, 16, 84, 16, 149, - 16, 134, 135, 31, 106, 107, 82, 31, 74, 31, - 86, 161, 106, 107, 80, 159, 31, 161, 161, 154, - 31, 87, 88, 89, 31, 91, 31, 93, 161, 95, - 111, 112, 98, 31, 31, 31, 31, 103, 104, 105, - 31, 31, 31, 109, 110, 31, 31, 31, 84, 115, - 116, 31, 159, 31, 161, 37, 84, 38, 124, 35, - 136, 137, 35, 139, 140, 141, 142, 143, 144, 35, - 31, 70, 159, 37, 161, 151, 152, 69, 57, 74, - 80, 82, 85, 77, 90, 80, 94, 163, 92, 82, - 166, 167, 87, 88, 89, 83, 91, 114, 93, 113, - 95, 128, 85, 98, 116, 128, 153, 128, 103, 104, - 105, 146, 89, 74, 109, 110, 0, 1, 149, 80, - 115, 116, 96, 159, 133, 161, 87, 88, 89, 124, - 91, 159, 93, 161, 95, 97, 146, 98, 97, 97, - 100, 154, 103, 104, 105, 74, 100, 149, 109, 110, - -1, 80, -1, -1, 115, 116, -1, 132, 87, 88, - 89, 132, 91, 124, 93, -1, 95, -1, 155, 98, - -1, -1, -1, 102, 103, 104, 105, 74, -1, 149, - 109, 110, 149, 80, 81, 153, 115, 116, 160, 1, - 87, 88, 89, 149, 91, 124, 93, 160, 95, 164, - 84, 98, 159, 158, -1, -1, 103, 104, 105, 159, - 159, 159, 109, 110, 159, 159, 159, 159, 115, 116, - 159, 159, 106, 159, 108, 1, 159, 124, 159, 113, - 160, 159, 159, 117, 118, 159, 159, 159, 163, 160, - 160, 160, -1, 127, 128, 129, 130, 131, 161, 161, - 74, 161, 161, 161, 161, 161, 80, 161, 161, 161, - 161, 161, 167, 87, 88, 89, 150, 91, 162, 93, - 162, 95, 84, 162, 98, 159, 162, 161, 162, 103, - 104, 105, 162, 162, 162, 109, 110, 162, 100, 101, - 102, 115, 116, 162, 106, 70, 162, 162, 162, 162, - 124, 162, 162, 162, 162, 117, 118, 82, 84, 162, - 162, 86, 162, 162, 162, 127, 128, 129, 130, 131, - 162, 162, 162, 162, 100, 101, 102, 163, 163, 163, - 106, 163, 163, 163, 163, 163, 163, 163, 163, -1, - 163, 117, 118, 163, 163, 163, 163, 159, 163, 161, - 162, 127, 128, 129, 130, 131, 163, 163, 163, 163, - 163, 163, 137, 163, 139, 140, 141, 142, 143, 144, - 163, 163, 163, 163, 163, 163, 151, 152, 163, 163, - 163, 163, 163, 159, 164, 161, 162, 164, 163, -1, - 164, 166, 167, 164, 164, 164, 164, 164, 164, 164, + 133, 31, 156, 136, 137, 138, 139, 140, 141, 142, + 143, 144, 97, 134, 135, 75, 76, 150, 151, 152, + 2, 3, 4, 5, 6, 7, 97, 8, 149, 1, + 12, 13, 101, 15, 116, 8, 116, 106, 1, 108, + 161, 160, 163, 1, 113, 164, 8, 116, 117, 118, + 119, 120, 121, 122, 123, 137, 138, 137, 138, 31, + 1, 117, 118, 80, 82, 1, 122, 85, 50, 51, + 80, 8, 164, 31, 56, 159, 58, 59, 60, 61, + 62, 63, 64, 65, 66, 67, 68, 8, 70, 71, + 72, 73, 74, 162, 8, 31, 78, 79, 80, 116, + 82, 164, 8, 1, 86, 87, 88, 89, 8, 91, + 101, 93, 84, 95, 75, 76, 98, 99, 35, 82, + 37, 103, 104, 105, 106, 107, 84, 109, 110, 147, + 148, 161, 123, 115, 116, 50, 51, 52, 155, 156, + 157, 82, 124, 125, 126, 8, 156, 1, 84, 8, + 35, 161, 37, 8, 136, 137, 8, 139, 140, 141, + 142, 143, 144, 145, 8, 128, 37, 38, 8, 151, + 152, 101, 102, 155, 156, 157, 158, 75, 76, 77, + 106, 163, 108, 165, 166, 167, 84, 159, 70, 161, + 8, 159, 90, 161, 92, 158, 94, 1, 96, 70, + 163, 159, 8, 161, 167, 106, 107, 106, 106, 108, + 70, 82, 106, 8, 108, 86, 106, 14, 108, 117, + 118, 14, 163, 159, 122, 161, 167, 14, 82, 127, + 128, 129, 130, 131, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 37, 38, + 106, 107, 134, 135, 1, 14, 155, 14, 0, 1, + 14, 159, 31, 161, 162, 136, 137, 149, 139, 140, + 141, 142, 143, 144, 134, 135, 80, 59, 60, 161, + 151, 152, 37, 38, 31, 74, 111, 112, 70, 149, + 14, 80, 163, 16, 16, 166, 167, 16, 87, 88, + 89, 161, 91, 163, 93, 16, 95, 161, 16, 98, + 16, 16, 16, 167, 103, 104, 105, 16, 70, 74, + 109, 110, 31, 35, 31, 80, 115, 116, 31, 70, + 31, 31, 87, 88, 89, 124, 91, 84, 93, 35, + 95, 82, 84, 98, 31, 86, 31, 31, 103, 104, + 105, 31, 134, 135, 109, 110, 31, 161, 31, 31, + 115, 116, 31, 167, 106, 154, 108, 149, 31, 124, + 31, 113, 31, 31, 31, 117, 118, 1, 70, 161, + 122, 31, 134, 135, 70, 127, 128, 129, 130, 131, + 31, 35, 37, 57, 37, 69, 137, 149, 139, 140, + 141, 142, 143, 144, 31, 38, 77, 31, 150, 161, + 151, 152, 159, 80, 161, 74, 70, 159, 83, 161, + 162, 80, 163, 85, 90, 166, 167, 82, 87, 88, + 89, 82, 91, 85, 93, 113, 95, 97, 94, 98, + 89, 132, 134, 135, 103, 104, 105, 74, 134, 135, + 109, 110, 92, 80, 96, 1, 115, 116, 82, 97, + 87, 88, 89, 149, 91, 124, 93, 97, 95, 161, + 116, 98, 70, 149, 1, 161, 103, 104, 105, 74, + 100, 100, 109, 110, 132, 80, 1, 155, 115, 116, + 160, 114, 87, 88, 89, -1, 91, 124, 93, 128, + 95, 133, 128, 98, 128, 158, 153, 102, 103, 104, + 105, 74, 146, 149, 109, 110, 31, 80, 81, 154, + 115, 116, 153, 160, 87, 88, 89, 149, 91, 124, + 93, 146, 95, 149, 158, 98, 134, 135, 84, 163, + 103, 104, 105, 167, 149, 159, 109, 110, 159, 159, + 159, 159, 115, 116, 100, 101, 102, 84, 159, 159, + 106, 124, 159, 161, 160, 159, 159, 159, 159, 84, + 159, 117, 118, 100, 101, 102, 122, 159, 159, 106, + 159, 127, 128, 129, 130, 131, 159, 159, 162, 160, + 117, 118, 160, 160, 163, 122, 161, 161, 164, 161, + 127, 128, 129, 130, 131, 161, 161, 161, 161, 161, + 161, 161, 74, 159, 161, 161, 162, 161, 80, 162, + 162, 162, 162, 162, 162, 87, 88, 89, 162, 91, + 162, 93, 159, 95, 161, 162, 98, 162, 162, 162, + 162, 103, 104, 105, 159, 162, 161, 109, 110, 162, + 162, 162, 162, 115, 116, 162, 162, 162, 162, 162, + 162, 162, 124, 162, 164, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + -1, 164, -1, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, - 164, -1, 165, 165, -1, 166 + 164, 164, -1, 165, 165, -1, 166, -1, 167 ); protected $actionBase = array( - 0, -2, 154, 565, 876, 948, 984, 514, 53, 398, - 837, 307, 307, 67, 307, 307, 307, 653, 724, 724, - 732, 724, 616, 673, 204, 204, 204, 625, 625, 625, - 625, 694, 694, 831, 831, 863, 799, 765, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 936, 936, 936, 936, 936, 936, 936, 936, - 936, 936, 375, 519, 369, 701, 1017, 1023, 1019, 1024, - 1015, 1014, 1018, 1020, 1025, 911, 912, 782, 918, 919, - 920, 921, 1021, 841, 1016, 1022, 291, 291, 291, 291, + 0, -2, 154, 542, 698, 894, 913, 586, 53, 430, + 867, 307, 307, 67, 307, 307, 307, 482, 693, 693, + 925, 693, 468, 504, 204, 204, 204, 651, 651, 651, + 651, 685, 685, 845, 845, 877, 813, 781, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 978, 978, 978, 978, 978, 978, 978, 978, + 978, 978, 356, 31, 369, 716, 1008, 1014, 1010, 1015, + 1006, 1005, 1009, 1011, 1016, 935, 936, 799, 937, 938, + 939, 941, 1012, 873, 1007, 1013, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 290, 491, 44, 382, 382, 382, 382, 382, + 291, 291, 290, 159, 136, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, - 382, 382, 382, 382, 382, 160, 160, 160, 187, 684, - 684, 341, 203, 610, 47, 985, 985, 985, 985, 985, - 985, 985, 985, 985, 985, 144, 144, 7, 7, 7, - 7, 7, 371, -25, -25, -25, -25, 540, 385, 102, - 576, 358, 45, 377, 460, 460, 360, 231, 231, 231, - 231, 231, 231, -78, -78, -78, -78, -78, -66, 319, - 457, -94, 396, 423, 586, 586, 586, 586, 423, 423, - 423, 423, 750, 1029, 423, 423, 423, 511, 516, 516, - 518, 147, 147, 147, 516, 583, 777, 422, 583, 422, - 194, 92, 748, -40, 87, 412, 748, 617, 627, 198, - 143, 773, 658, 773, 1013, 757, 764, 717, 838, 860, - 1026, 800, 908, 806, 910, 219, 686, 1012, 1012, 1012, - 1012, 1012, 1012, 1012, 1012, 1012, 1012, 1012, 855, 552, - 1013, 286, 855, 855, 855, 552, 552, 552, 552, 552, - 552, 552, 552, 552, 552, 679, 286, 568, 626, 286, - 794, 552, 375, 758, 375, 375, 375, 375, 958, 375, - 375, 375, 375, 375, 375, 970, 769, -16, 375, 519, - 12, 12, 547, 83, 12, 12, 12, 12, 375, 375, - 375, 658, 781, 713, 666, 792, 448, 781, 781, 781, - 438, 444, 193, 447, 570, 523, 580, 760, 760, 767, - 929, 929, 760, 759, 760, 767, 934, 760, 929, 805, - 359, 648, 577, 611, 656, 929, 478, 760, 760, 760, - 760, 665, 760, 467, 433, 760, 760, 785, 774, 789, - 60, 929, 929, 929, 789, 596, 751, 751, 751, 811, - 812, 746, 771, 567, 498, 677, 348, 779, 771, 771, - 760, 640, 746, 771, 746, 771, 747, 771, 771, 771, - 746, 771, 759, 585, 771, 734, 668, 224, 771, 6, - 935, 937, 354, 940, 932, 941, 979, 942, 943, 851, - 956, 933, 945, 931, 930, 780, 703, 720, 790, 729, - 928, 768, 768, 768, 925, 768, 768, 768, 768, 768, - 768, 768, 768, 703, 788, 804, 733, 783, 960, 722, - 726, 725, 868, 1027, 1028, 737, 739, 958, 1006, 953, - 803, 730, 992, 967, 866, 848, 968, 969, 993, 1007, - 1008, 871, 761, 874, 880, 797, 971, 852, 768, 935, - 943, 933, 945, 931, 930, 763, 762, 753, 755, 749, - 745, 736, 738, 770, 1009, 924, 835, 830, 970, 926, - 703, 839, 986, 847, 994, 995, 850, 801, 772, 840, - 881, 972, 975, 976, 853, 1010, 810, 989, 795, 996, - 802, 882, 997, 998, 999, 1000, 885, 854, 856, 857, - 815, 754, 980, 786, 891, 335, 787, 796, 978, 363, - 957, 858, 894, 895, 1001, 1002, 1003, 896, 954, 816, - 990, 752, 991, 983, 817, 818, 485, 784, 778, 541, - 676, 897, 899, 900, 955, 775, 766, 821, 822, 1011, - 901, 697, 824, 740, 902, 1005, 742, 744, 756, 859, - 793, 743, 798, 977, 776, 827, 907, 829, 832, 833, - 1004, 836, 0, 0, 0, 0, 0, 0, 0, 0, + 382, 382, 382, 382, 382, 54, 54, 54, 187, 569, + 569, 341, 203, 658, 47, 699, 699, 699, 699, 699, + 699, 699, 699, 699, 699, 144, 144, 7, 7, 7, + 7, 7, 371, -25, -25, -25, -25, 816, 477, 102, + 499, 358, 449, 514, 525, 525, 360, -116, 231, 231, + 231, 231, 231, 231, -78, -78, -78, -78, -78, 319, + 580, 541, 86, 423, 636, 636, 636, 636, 423, 423, + 423, 423, 825, 1020, 423, 423, 423, 558, 688, 688, + 754, 147, 147, 147, 688, 550, 788, 422, 550, 422, + 194, 92, 794, -55, -40, 321, 814, 794, 748, 842, + 198, 143, 772, 539, 772, 1004, 778, 767, 733, 868, + 896, 1017, 820, 933, 821, 934, 219, 731, 1003, 1003, + 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1003, 1021, + 339, 1004, 286, 1021, 1021, 1021, 339, 339, 339, 339, + 339, 339, 339, 339, 339, 339, 615, 286, 380, 479, + 286, 796, 339, 356, 804, 356, 356, 356, 356, 964, + 356, 356, 356, 356, 356, 356, 969, 768, 410, 356, + 31, 206, 206, 472, 193, 206, 206, 206, 206, 356, + 356, 356, 539, 776, 793, 584, 809, 377, 776, 776, + 776, 355, 185, 39, 348, 555, 523, 546, 773, 773, + 789, 946, 946, 773, 785, 773, 789, 951, 773, 946, + 787, 467, 596, 540, 585, 600, 946, 519, 773, 773, + 773, 773, 622, 773, 503, 478, 773, 773, 749, 779, + 792, 46, 946, 946, 946, 792, 581, 808, 808, 808, + 830, 831, 762, 777, 534, 526, 645, 459, 807, 777, + 777, 773, 588, 762, 777, 762, 777, 805, 777, 777, + 777, 762, 777, 785, 577, 777, 734, 634, 60, 777, + 6, 952, 953, 671, 954, 949, 955, 976, 956, 957, + 884, 962, 950, 958, 948, 947, 790, 717, 718, 818, + 764, 945, 766, 766, 766, 943, 766, 766, 766, 766, + 766, 766, 766, 766, 717, 770, 835, 811, 791, 965, + 721, 729, 806, 897, 1018, 1019, 964, 997, 959, 826, + 732, 983, 966, 866, 876, 967, 968, 984, 998, 999, + 898, 786, 899, 900, 803, 970, 885, 766, 952, 957, + 950, 958, 948, 947, 765, 760, 755, 756, 753, 740, + 737, 739, 771, 1000, 942, 871, 844, 969, 944, 717, + 869, 979, 875, 985, 986, 878, 802, 775, 872, 901, + 971, 972, 973, 886, 1001, 829, 980, 874, 987, 810, + 902, 988, 989, 990, 991, 906, 887, 888, 889, 832, + 774, 940, 798, 908, 643, 744, 797, 975, 647, 963, + 890, 915, 916, 992, 993, 994, 917, 960, 839, 981, + 784, 982, 977, 840, 843, 653, 728, 795, 681, 683, + 918, 923, 927, 961, 782, 769, 846, 847, 1002, 928, + 686, 848, 735, 929, 996, 736, 741, 800, 893, 824, + 817, 780, 974, 783, 849, 930, 851, 858, 859, 995, + 861, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 458, 458, 458, 458, 458, 458, 307, 307, 307, - 307, 0, 0, 307, 0, 0, 0, 458, 458, 458, + 458, 458, 458, 458, 458, 458, 307, 307, 307, 307, + 0, 0, 307, 0, 0, 0, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, @@ -577,41 +575,41 @@ class Php7 extends \PhpParser\ParserAbstract 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, 458, - 458, 458, 291, 291, 291, 291, 291, 291, 291, 291, + 458, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 0, 0, 0, 0, + 291, 291, 291, 291, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 291, 291, 291, 291, 291, 291, 291, 291, + 0, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 423, - 423, 291, 291, 0, 291, 423, 423, 423, 423, 423, - 423, 423, 423, 423, 423, 291, 291, 291, 291, 291, - 291, 291, 805, 147, 147, 147, 147, 423, 423, 423, - 423, 423, -88, -88, 147, 147, 423, 423, 423, 423, + 291, 291, 291, 291, 291, 291, 291, 291, 423, 423, + 291, 291, 0, 291, 423, 423, 423, 423, 423, 423, + 423, 423, 423, 423, 291, 291, 291, 291, 291, 291, + 291, 787, 147, 147, 147, 147, 423, 423, 423, 423, + 423, -88, -88, 147, 147, 423, 384, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 0, 0, - 0, 286, 422, 0, 759, 759, 759, 759, 0, 0, - 0, 0, 422, 422, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 286, 422, 0, 286, 0, - 759, 759, 423, 805, 805, 314, 423, 0, 0, 0, - 0, 286, 759, 286, 552, 422, 552, 552, 12, 375, - 314, 608, 608, 608, 608, 0, 658, 805, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 759, 0, - 805, 0, 759, 759, 759, 0, 0, 0, 0, 0, + 286, 422, 0, 785, 785, 785, 785, 0, 0, 0, + 0, 422, 422, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 286, 422, 0, 286, 0, 785, + 785, 423, 787, 787, 314, 384, 423, 0, 0, 0, + 0, 286, 785, 286, 339, 422, 339, 339, 206, 356, + 314, 510, 510, 510, 510, 0, 539, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 787, 787, 785, 0, + 787, 0, 785, 785, 785, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 759, 0, 0, 929, 0, 0, 0, 0, 760, 0, - 0, 0, 0, 0, 0, 760, 934, 0, 0, 0, - 0, 0, 0, 759, 0, 0, 0, 0, 0, 0, - 0, 0, 768, 801, 0, 801, 0, 768, 768, 768 + 785, 0, 0, 946, 0, 0, 0, 0, 773, 0, + 0, 0, 0, 0, 0, 773, 951, 0, 0, 0, + 0, 0, 0, 785, 0, 0, 0, 0, 0, 0, + 0, 0, 766, 802, 0, 802, 0, 766, 766, 766 ); protected $actionDefault = array( 3,32767, 103,32767,32767,32767,32767,32767,32767,32767, 32767,32767, 101,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 578, 578, 578, - 578,32767,32767, 246, 103,32767,32767, 454, 372, 372, - 372,32767,32767, 522, 522, 522, 522, 522, 522,32767, - 32767,32767,32767,32767,32767, 454,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 582, 582, 582, + 582,32767,32767, 250, 103,32767,32767, 458, 376, 376, + 376,32767,32767, 526, 526, 526, 526, 526, 526,32767, + 32767,32767,32767,32767,32767, 458,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, @@ -619,128 +617,135 @@ class Php7 extends \PhpParser\ParserAbstract 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767, 101,32767, - 32767,32767, 37, 7, 8, 10, 11, 50, 17, 310, + 32767,32767, 37, 7, 8, 10, 11, 50, 17, 314, 32767,32767,32767,32767, 103,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767, 571,32767,32767,32767,32767, + 32767,32767,32767,32767,32767, 575,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 458, 437, 438, 440, - 441, 371, 523, 577, 313, 574, 370, 146, 325, 315, - 234, 316, 250, 459, 251, 460, 463, 464, 211, 279, - 367, 150, 401, 455, 403, 453, 457, 402, 377, 382, - 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, - 393, 394, 375, 376, 456, 434, 433, 432, 399,32767, - 32767, 400, 404, 374, 407,32767,32767,32767,32767,32767, - 32767,32767,32767, 103,32767, 405, 406, 423, 424, 421, - 422, 425,32767, 426, 427, 428, 429,32767,32767, 302, - 32767,32767, 351, 349, 414, 415, 302,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767,32767, 516, - 431,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767, 103,32767, 101, 518, 396, 398, - 486, 409, 410, 408, 378,32767, 493,32767, 103, 495, - 32767,32767,32767, 112,32767,32767,32767, 517,32767, 524, - 524,32767, 479, 101, 194,32767, 194, 194,32767,32767, - 32767,32767,32767,32767,32767, 585, 479, 111, 111, 111, - 111, 111, 111, 111, 111, 111, 111, 111,32767, 194, - 111,32767,32767,32767, 101, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 189,32767, 260, 262, 103, - 539, 194,32767, 498,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767, 491,32767,32767,32767, + 32767,32767,32767,32767,32767,32767, 462, 441, 442, 444, + 445, 375, 527, 581, 317, 578, 374, 146, 329, 319, + 238, 320, 254, 463, 255, 464, 467, 468, 211, 283, + 371, 150, 405, 459, 407, 457, 461, 406, 381, 386, + 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, + 397, 398, 379, 380, 460, 438, 437, 436, 403,32767, + 32767, 404, 408, 378, 411,32767,32767,32767,32767,32767, + 32767,32767,32767, 103,32767, 409, 410, 427, 428, 425, + 426, 429,32767, 430, 431, 432, 433,32767,32767, 306, + 32767,32767, 355, 353, 418, 419, 306,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767, 520, + 435,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767, 103,32767, 101, 522, 400, 402, + 490, 413, 414, 412, 382,32767, 497,32767, 103, 499, + 32767,32767,32767, 112,32767,32767,32767,32767, 521,32767, + 528, 528,32767, 483, 101, 194,32767, 194, 194,32767, + 32767,32767,32767,32767,32767,32767, 589, 483, 111, 111, + 111, 111, 111, 111, 111, 111, 111, 111, 111,32767, + 194, 111,32767,32767,32767, 101, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 189,32767, 264, 266, + 103, 543, 194,32767, 502,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 495,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 479, 419, 139,32767, 139, 524, 411, 412, 413, - 481, 524, 524, 524, 298, 281,32767,32767,32767,32767, - 496, 496, 101, 101, 101, 101, 491,32767,32767, 112, - 100, 100, 100, 100, 100, 104, 102,32767,32767,32767, - 32767, 100,32767, 102, 102,32767,32767, 217, 208, 215, - 102,32767, 543, 544, 215, 102, 219, 219, 219, 239, - 239, 470, 304, 102, 100, 102, 102, 196, 304, 304, - 32767, 102, 470, 304, 470, 304, 198, 304, 304, 304, - 470, 304,32767, 102, 304, 210, 100, 100, 304,32767, - 32767,32767, 481,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767,32767,32767,32767,32767, 511,32767, 528, - 541, 417, 418, 420, 526, 442, 443, 444, 445, 446, - 447, 448, 450, 573,32767, 485,32767,32767,32767,32767, - 324, 583,32767, 583,32767,32767,32767,32767,32767,32767, + 32767,32767, 483, 423, 139,32767, 139, 528, 415, 416, + 417, 485, 528, 528, 528, 302, 285,32767,32767,32767, + 32767, 500, 500, 101, 101, 101, 101, 495,32767,32767, + 112, 100, 100, 100, 100, 100, 104, 102,32767,32767, + 32767,32767, 100,32767, 102, 102,32767,32767, 221, 208, + 219, 102,32767, 547, 548, 219, 102, 223, 223, 223, + 243, 243, 474, 308, 102, 100, 102, 102, 196, 308, + 308,32767, 102, 474, 308, 474, 308, 198, 308, 308, + 308, 474, 308,32767, 102, 308, 210, 100, 100, 308, + 32767,32767,32767, 485,32767,32767,32767,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767, 515,32767, + 532, 545, 421, 422, 424, 530, 446, 447, 448, 449, + 450, 451, 452, 454, 577,32767, 489,32767,32767,32767, + 32767, 328, 587,32767, 587,32767,32767,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767, 584,32767, 524,32767,32767,32767,32767, 416, 9, - 76, 43, 44, 52, 58, 502, 503, 504, 505, 499, - 500, 506, 501,32767,32767, 507, 549,32767,32767, 525, - 576,32767,32767,32767,32767,32767,32767, 139,32767,32767, - 32767,32767,32767,32767,32767,32767,32767,32767, 511,32767, - 137,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 524,32767,32767,32767, 300, 301,32767,32767, + 588,32767, 528,32767,32767,32767,32767, 420, 9, 76, + 43, 44, 52, 58, 506, 507, 508, 509, 503, 504, + 510, 505,32767,32767, 511, 553,32767,32767, 529, 580, + 32767,32767,32767,32767,32767,32767, 139,32767,32767,32767, + 32767,32767,32767,32767,32767,32767,32767, 515,32767, 137, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 524,32767,32767,32767, 283, 284,32767, + 32767, 528,32767,32767,32767, 304, 305,32767,32767,32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767,32767, 278,32767,32767, 366,32767,32767,32767, - 32767, 345,32767,32767,32767,32767,32767,32767,32767,32767, - 32767,32767, 152, 152, 3, 3, 327, 152, 152, 152, - 327, 152, 327, 327, 327, 152, 152, 152, 152, 152, - 152, 272, 184, 254, 257, 239, 239, 152, 337, 152 + 32767,32767, 528,32767,32767,32767, 287, 288,32767,32767, + 32767,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767,32767, 282,32767,32767, 370,32767,32767,32767,32767, + 349,32767,32767,32767,32767,32767,32767,32767,32767,32767, + 32767, 152, 152, 3, 3, 331, 152, 152, 152, 331, + 152, 331, 331, 331, 152, 152, 152, 152, 152, 152, + 276, 184, 258, 261, 243, 243, 152, 341, 152 ); protected $goto = array( - 194, 194, 670, 422, 643, 463, 1264, 1265, 1022, 416, - 308, 309, 329, 563, 314, 421, 330, 423, 622, 801, - 678, 637, 586, 651, 652, 653, 165, 165, 165, 165, + 194, 194, 669, 423, 642, 883, 839, 884, 1025, 417, + 308, 309, 330, 562, 314, 422, 331, 424, 621, 823, + 677, 851, 824, 585, 838, 857, 165, 165, 165, 165, 218, 195, 191, 191, 175, 177, 213, 191, 191, 191, 191, 191, 192, 192, 192, 192, 192, 192, 186, 187, - 188, 189, 190, 215, 213, 216, 521, 522, 412, 523, - 525, 526, 527, 528, 529, 530, 531, 532, 1091, 166, + 188, 189, 190, 215, 213, 216, 522, 523, 413, 524, + 526, 527, 528, 529, 530, 531, 532, 533, 1094, 166, 167, 168, 193, 169, 170, 171, 164, 172, 173, 174, 176, 212, 214, 217, 235, 238, 241, 242, 244, 255, 256, 257, 258, 259, 260, 261, 263, 264, 265, 266, - 274, 275, 311, 312, 313, 417, 418, 419, 568, 219, + 274, 275, 311, 312, 313, 418, 419, 420, 567, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 178, 234, 179, 196, 197, 198, - 236, 186, 187, 188, 189, 190, 215, 1091, 199, 180, + 236, 186, 187, 188, 189, 190, 215, 1094, 199, 180, 181, 182, 200, 196, 183, 237, 201, 199, 163, 202, 203, 184, 204, 205, 206, 185, 207, 208, 209, 210, - 211, 323, 323, 323, 323, 827, 608, 608, 824, 547, - 538, 342, 1221, 1221, 1221, 1221, 1221, 1221, 1221, 1221, - 1221, 1221, 1239, 1239, 288, 288, 288, 288, 1239, 1239, - 1239, 1239, 1239, 1239, 1239, 1239, 1239, 1239, 388, 538, - 547, 556, 557, 395, 566, 588, 602, 603, 832, 825, - 880, 875, 876, 889, 15, 833, 877, 830, 878, 879, - 831, 799, 251, 251, 883, 919, 992, 1000, 1004, 1001, - 1005, 1237, 1237, 938, 1043, 1039, 1040, 1237, 1237, 1237, - 1237, 1237, 1237, 1237, 1237, 1237, 1237, 858, 248, 248, - 248, 248, 250, 252, 533, 533, 533, 533, 487, 590, - 488, 1190, 1190, 997, 1190, 997, 494, 1290, 1290, 560, - 997, 997, 997, 997, 997, 997, 997, 997, 997, 997, - 997, 997, 1261, 1261, 1290, 1261, 340, 1190, 930, 402, - 677, 1279, 1190, 1190, 1190, 1190, 959, 345, 1190, 1190, - 1190, 1271, 1271, 1271, 1271, 606, 640, 345, 345, 1273, - 1273, 1273, 1273, 820, 820, 805, 896, 884, 840, 885, - 897, 345, 345, 5, 345, 6, 1306, 384, 535, 535, - 559, 535, 415, 852, 597, 1257, 839, 540, 524, 524, - 345, 1289, 1289, 642, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 524, 445, 805, 1140, 805, 1289, 932, - 932, 932, 932, 1063, 1064, 445, 926, 933, 386, 390, - 548, 587, 591, 1030, 1292, 331, 554, 1259, 1259, 1030, - 704, 621, 623, 823, 641, 1250, 319, 303, 660, 664, - 973, 668, 676, 969, 429, 553, 962, 936, 936, 934, - 936, 703, 601, 537, 971, 966, 343, 344, 663, 817, - 595, 609, 612, 613, 614, 615, 634, 635, 636, 680, - 439, 1186, 845, 454, 454, 439, 439, 1266, 1267, 820, - 901, 1079, 454, 394, 539, 551, 1183, 605, 540, 539, - 842, 551, 978, 272, 387, 618, 619, 981, 536, 536, - 844, 707, 646, 957, 567, 457, 458, 459, 838, 850, - 254, 254, 1297, 1298, 400, 401, 976, 976, 464, 649, - 1182, 650, 1028, 404, 405, 406, 1187, 661, 424, 1032, - 407, 564, 600, 815, 338, 424, 854, 848, 853, 841, - 1027, 1031, 1009, 1002, 1006, 1003, 1007, 1185, 941, 1188, - 1247, 1248, 943, 0, 1074, 439, 439, 439, 439, 439, - 439, 439, 439, 439, 439, 439, 0, 468, 439, 585, - 1056, 931, 681, 667, 667, 0, 495, 673, 1054, 1171, - 912, 0, 0, 1172, 1175, 913, 1176, 0, 0, 0, - 0, 0, 0, 1072, 857 + 211, 323, 323, 323, 323, 826, 607, 607, 800, 546, + 539, 1189, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1242, 1242, 343, 464, 1267, 1268, 1242, 1242, + 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 389, 539, + 546, 555, 556, 396, 565, 587, 601, 602, 831, 798, + 879, 874, 875, 888, 15, 832, 876, 829, 877, 878, + 830, 455, 455, 941, 882, 804, 1190, 251, 251, 559, + 455, 1240, 1240, 814, 1046, 1042, 1043, 1240, 1240, 1240, + 1240, 1240, 1240, 1240, 1240, 1240, 1240, 605, 639, 1191, + 1250, 1251, 341, 248, 248, 248, 248, 250, 252, 819, + 819, 1193, 1193, 1000, 1193, 1000, 804, 416, 804, 596, + 1000, 1282, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, + 1000, 1000, 1000, 1264, 1264, 962, 1264, 1193, 488, 5, + 489, 6, 1193, 1193, 1193, 1193, 495, 385, 1193, 1193, + 1193, 1274, 1274, 1274, 1274, 277, 277, 277, 277, 558, + 1276, 1276, 1276, 1276, 1066, 1067, 895, 346, 553, 319, + 303, 896, 703, 620, 622, 641, 640, 346, 346, 1143, + 659, 663, 976, 667, 675, 972, 1260, 430, 1292, 1292, + 332, 346, 346, 816, 346, 636, 1309, 650, 651, 652, + 844, 536, 536, 924, 536, 1292, 525, 525, 541, 1269, + 1270, 346, 525, 525, 525, 525, 525, 525, 525, 525, + 525, 525, 1295, 617, 618, 1033, 819, 446, 395, 1262, + 1262, 1033, 935, 935, 935, 935, 563, 599, 446, 929, + 936, 933, 403, 676, 822, 1186, 552, 534, 534, 534, + 534, 841, 589, 600, 984, 1031, 1253, 965, 939, 939, + 937, 939, 702, 465, 538, 974, 969, 344, 345, 706, + 440, 900, 1082, 853, 946, 440, 440, 1035, 604, 662, + 469, 1293, 1293, 981, 1077, 540, 550, 0, 0, 0, + 540, 843, 550, 645, 960, 388, 1174, 911, 1293, 837, + 1175, 1178, 912, 1179, 0, 566, 458, 459, 460, 541, + 849, 1185, 0, 1300, 1301, 254, 254, 401, 402, 0, + 0, 0, 648, 0, 649, 0, 405, 406, 407, 0, + 660, 0, 0, 408, 0, 0, 0, 339, 847, 594, + 608, 611, 612, 613, 614, 633, 634, 635, 679, 918, + 995, 1003, 1007, 1004, 1008, 0, 440, 440, 440, 440, + 440, 440, 440, 440, 440, 440, 440, 0, 1188, 440, + 852, 840, 1030, 1034, 584, 1059, 0, 680, 666, 666, + 944, 496, 672, 1057, 387, 391, 547, 586, 590, 425, + 0, 0, 0, 0, 0, 0, 425, 0, 0, 0, + 0, 0, 0, 934, 1012, 1005, 1009, 1006, 1010, 0, + 0, 0, 0, 0, 272, 0, 0, 0, 0, 537, + 537, 0, 0, 0, 0, 1075, 856, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 979, + 979 ); protected $gotoCheck = array( - 42, 42, 72, 65, 65, 166, 166, 166, 119, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 7, - 9, 84, 122, 84, 84, 84, 42, 42, 42, 42, + 42, 42, 72, 65, 65, 64, 35, 64, 121, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 26, + 9, 35, 27, 124, 35, 45, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, @@ -754,87 +759,94 @@ class Php7 extends \PhpParser\ParserAbstract 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 23, 23, 23, 23, 15, 104, 104, 26, 75, - 75, 93, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 160, 160, 24, 24, 24, 24, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 15, 27, + 42, 23, 23, 23, 23, 15, 106, 106, 7, 75, + 75, 20, 106, 106, 106, 106, 106, 106, 106, 106, + 106, 106, 162, 162, 95, 168, 168, 168, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 15, 6, 15, 15, 15, 15, 75, 15, 15, 15, 15, 15, - 15, 6, 5, 5, 15, 87, 87, 87, 87, 87, - 87, 161, 161, 49, 15, 15, 15, 161, 161, 161, - 161, 161, 161, 161, 161, 161, 161, 45, 5, 5, - 5, 5, 5, 5, 103, 103, 103, 103, 147, 103, - 147, 72, 72, 72, 72, 72, 147, 173, 173, 162, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 122, 122, 173, 122, 169, 72, 89, 89, - 89, 171, 72, 72, 72, 72, 99, 14, 72, 72, - 72, 9, 9, 9, 9, 55, 55, 14, 14, 122, - 122, 122, 122, 22, 22, 12, 72, 64, 35, 64, - 72, 14, 14, 46, 14, 46, 14, 61, 19, 19, - 100, 19, 13, 35, 13, 122, 35, 14, 163, 163, - 14, 172, 172, 63, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 163, 19, 12, 143, 12, 172, 19, - 19, 19, 19, 136, 136, 19, 19, 19, 58, 58, - 58, 58, 58, 122, 172, 29, 48, 122, 122, 122, - 48, 48, 48, 25, 48, 14, 159, 159, 48, 48, - 48, 48, 48, 48, 109, 9, 25, 25, 25, 25, - 25, 25, 9, 25, 25, 25, 93, 93, 14, 18, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 23, 20, 39, 141, 141, 23, 23, 168, 168, 22, - 17, 17, 141, 28, 9, 9, 152, 17, 14, 9, - 37, 9, 17, 24, 9, 83, 83, 106, 24, 24, - 17, 95, 17, 17, 9, 9, 9, 9, 17, 9, - 5, 5, 9, 9, 80, 80, 103, 103, 149, 80, - 17, 80, 121, 80, 80, 80, 20, 80, 113, 124, - 80, 2, 2, 20, 80, 113, 41, 9, 16, 16, - 16, 16, 113, 113, 113, 113, 113, 14, 16, 20, - 20, 20, 92, -1, 139, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, -1, 82, 23, 8, - 8, 16, 8, 8, 8, -1, 8, 8, 8, 78, - 78, -1, -1, 78, 78, 78, 78, -1, -1, -1, - -1, -1, -1, 16, 16 + 15, 143, 143, 49, 15, 12, 20, 5, 5, 164, + 143, 163, 163, 20, 15, 15, 15, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 55, 55, 20, + 20, 20, 171, 5, 5, 5, 5, 5, 5, 22, + 22, 72, 72, 72, 72, 72, 12, 13, 12, 13, + 72, 173, 72, 72, 72, 72, 72, 72, 72, 72, + 72, 72, 72, 124, 124, 101, 124, 72, 149, 46, + 149, 46, 72, 72, 72, 72, 149, 61, 72, 72, + 72, 9, 9, 9, 9, 24, 24, 24, 24, 102, + 124, 124, 124, 124, 138, 138, 72, 14, 48, 161, + 161, 72, 48, 48, 48, 63, 48, 14, 14, 145, + 48, 48, 48, 48, 48, 48, 124, 111, 174, 174, + 29, 14, 14, 18, 14, 84, 14, 84, 84, 84, + 39, 19, 19, 90, 19, 174, 165, 165, 14, 170, + 170, 14, 165, 165, 165, 165, 165, 165, 165, 165, + 165, 165, 174, 83, 83, 124, 22, 19, 28, 124, + 124, 124, 19, 19, 19, 19, 2, 2, 19, 19, + 19, 91, 91, 91, 25, 154, 9, 105, 105, 105, + 105, 37, 105, 9, 108, 123, 14, 25, 25, 25, + 25, 25, 25, 151, 25, 25, 25, 95, 95, 97, + 23, 17, 17, 41, 94, 23, 23, 126, 17, 14, + 82, 175, 175, 17, 141, 9, 9, -1, -1, -1, + 9, 17, 9, 17, 17, 9, 78, 78, 175, 17, + 78, 78, 78, 78, -1, 9, 9, 9, 9, 14, + 9, 17, -1, 9, 9, 5, 5, 80, 80, -1, + -1, -1, 80, -1, 80, -1, 80, 80, 80, -1, + 80, -1, -1, 80, -1, -1, -1, 80, 9, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 79, 87, + 87, 87, 87, 87, 87, -1, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 23, 23, -1, 14, 23, + 16, 16, 16, 16, 8, 8, -1, 8, 8, 8, + 16, 8, 8, 8, 58, 58, 58, 58, 58, 115, + -1, -1, -1, -1, -1, -1, 115, -1, -1, -1, + -1, -1, -1, 16, 115, 115, 115, 115, 115, -1, + -1, -1, -1, -1, 24, -1, -1, -1, -1, 24, + 24, -1, -1, -1, -1, 16, 16, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 105, + 105 ); protected $gotoBase = array( - 0, 0, -203, 0, 0, 221, 208, 10, 512, 7, - 0, 0, 24, 1, 5, -174, 47, -23, 105, 61, - 38, 0, -10, 158, 181, 379, 164, 205, 102, 84, - 0, 0, 0, 0, 0, -43, 0, 107, 0, 104, - 0, 54, -1, 0, 0, 235, -384, 0, -307, 210, - 0, 0, 0, 0, 0, 266, 0, 0, 324, 0, - 0, 286, 0, 103, 298, -236, 0, 0, 0, 0, - 0, 0, -6, 0, 0, -167, 0, 0, 129, 62, - -14, 0, 53, -22, -669, 0, 0, -52, 0, -11, - 0, 0, 68, -299, 0, 52, 0, 0, 0, 262, - 288, 0, 0, 227, -73, 0, 87, 0, 0, 118, - 0, 0, 0, 209, 0, 0, 0, 0, 0, 6, - 0, 108, 15, 0, 46, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 91, 0, 0, 69, - 0, 390, 0, 86, 0, 0, 0, -224, 0, 37, - 0, 0, 77, 0, 0, 0, 0, 0, 0, 70, - -57, -8, 241, 99, 0, 0, -290, 0, 65, 257, - 0, 261, 39, -35, 0, 0 + 0, 0, -297, 0, 0, 226, 196, 159, 517, 7, + 0, 0, -66, -65, 25, -175, 78, -33, 39, 84, + -213, 0, -64, 158, 302, 390, 15, 18, 46, 49, + 0, 0, 0, 0, 0, -356, 0, 67, 0, 32, + 0, -10, -1, 0, 0, 13, -417, 0, -364, 200, + 0, 0, 0, 0, 0, 208, 0, 0, 490, 0, + 0, 256, 0, 85, -14, -236, 0, 0, 0, 0, + 0, 0, -6, 0, 0, -168, 0, 0, 45, 140, + -12, 0, -35, -95, -344, 0, 0, 221, 0, 0, + 27, 92, 0, 0, -11, -287, 0, 19, 0, 0, + 0, 251, 267, 0, 0, 370, -73, 0, 43, 0, + 0, 61, 0, 0, 0, 270, 0, 0, 0, 0, + 0, 6, 0, 40, 16, 0, -7, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, + 0, -2, 0, 188, 0, 59, 0, 0, 0, -195, + 0, -19, 0, 0, 35, 0, 0, 0, 0, 0, + 0, 3, -57, -8, 201, 117, 0, 0, -110, 0, + -4, 223, 0, 241, 36, 129, 0, 0 ); protected $gotoDefault = array( - -32768, 499, 711, 4, 712, 905, 788, 797, 583, 515, - 679, 339, 610, 413, 1255, 882, 1078, 565, 816, 1199, - 1207, 446, 819, 324, 701, 864, 865, 866, 391, 376, - 382, 389, 632, 611, 481, 851, 442, 843, 473, 846, - 441, 855, 162, 410, 497, 859, 3, 861, 542, 892, - 377, 869, 378, 656, 871, 550, 873, 874, 385, 392, - 393, 1083, 558, 607, 886, 243, 552, 887, 375, 888, - 895, 380, 383, 665, 453, 492, 486, 403, 1058, 594, - 629, 450, 467, 617, 616, 604, 466, 425, 408, 928, - 474, 451, 942, 341, 950, 709, 1090, 624, 476, 958, - 625, 965, 968, 516, 517, 465, 980, 269, 983, 477, - 1015, 647, 648, 995, 626, 627, 1013, 460, 584, 1021, - 443, 1029, 1243, 444, 1033, 262, 1036, 276, 409, 426, - 1041, 1042, 8, 1048, 671, 672, 10, 273, 496, 1073, - 666, 440, 1089, 430, 1159, 1161, 544, 478, 1179, 1178, - 659, 493, 1184, 1246, 438, 518, 461, 310, 519, 302, - 327, 307, 534, 289, 328, 520, 462, 1252, 1260, 325, - 30, 1280, 1291, 335, 562, 599 + -32768, 500, 710, 4, 711, 904, 787, 796, 582, 516, + 678, 340, 609, 414, 1258, 881, 1081, 564, 815, 1202, + 1210, 447, 818, 324, 700, 863, 864, 865, 392, 377, + 383, 390, 631, 610, 482, 850, 443, 842, 474, 845, + 442, 854, 162, 411, 498, 858, 3, 860, 543, 891, + 378, 868, 379, 655, 870, 549, 872, 873, 386, 393, + 394, 1086, 557, 606, 885, 243, 551, 886, 376, 887, + 894, 381, 384, 664, 454, 493, 487, 404, 1061, 593, + 628, 451, 468, 616, 615, 603, 467, 426, 409, 326, + 923, 931, 475, 452, 945, 342, 953, 708, 1093, 623, + 477, 961, 624, 968, 971, 517, 518, 466, 983, 269, + 986, 478, 1018, 646, 647, 998, 625, 626, 1016, 461, + 583, 1024, 444, 1032, 1246, 445, 1036, 262, 1039, 276, + 410, 427, 1044, 1045, 8, 1051, 670, 671, 10, 273, + 497, 1076, 665, 441, 1092, 431, 1162, 1164, 545, 479, + 1182, 1181, 658, 494, 1187, 1249, 439, 519, 462, 310, + 520, 302, 328, 307, 535, 289, 329, 521, 463, 1255, + 1263, 325, 30, 1283, 1294, 336, 561, 598 ); protected $ruleToNonTerminal = array( @@ -859,23 +871,23 @@ class Php7 extends \PhpParser\ParserAbstract 49, 49, 25, 25, 68, 68, 71, 71, 70, 69, 69, 62, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 26, 26, 27, 27, 27, 27, 86, 86, - 88, 88, 81, 81, 81, 82, 82, 85, 85, 83, - 83, 89, 90, 90, 56, 56, 64, 64, 67, 67, - 67, 66, 91, 91, 92, 57, 57, 57, 57, 93, - 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, - 99, 99, 54, 54, 50, 50, 101, 52, 52, 102, - 51, 51, 53, 53, 63, 63, 63, 63, 79, 79, - 105, 105, 107, 107, 108, 108, 108, 108, 106, 106, - 106, 110, 110, 110, 110, 87, 87, 113, 113, 113, - 111, 111, 114, 114, 112, 112, 115, 115, 116, 116, - 116, 116, 109, 109, 80, 80, 80, 20, 20, 20, - 118, 117, 117, 119, 119, 119, 119, 59, 120, 120, - 121, 60, 123, 123, 124, 124, 125, 125, 84, 126, - 126, 126, 126, 126, 126, 131, 131, 132, 132, 133, - 133, 133, 133, 133, 134, 135, 135, 130, 130, 127, - 127, 129, 129, 137, 137, 136, 136, 136, 136, 136, - 136, 136, 128, 138, 138, 140, 139, 139, 61, 100, - 141, 141, 55, 55, 42, 42, 42, 42, 42, 42, + 88, 88, 81, 81, 89, 89, 90, 90, 90, 82, + 82, 85, 85, 83, 83, 91, 92, 92, 56, 56, + 64, 64, 67, 67, 67, 66, 93, 93, 94, 57, + 57, 57, 57, 95, 95, 96, 96, 97, 97, 98, + 99, 99, 100, 100, 101, 101, 54, 54, 50, 50, + 103, 52, 52, 104, 51, 51, 53, 53, 63, 63, + 63, 63, 79, 79, 107, 107, 109, 109, 110, 110, + 110, 110, 108, 108, 108, 112, 112, 112, 112, 87, + 87, 115, 115, 115, 113, 113, 116, 116, 114, 114, + 117, 117, 118, 118, 118, 118, 111, 111, 80, 80, + 80, 20, 20, 20, 120, 119, 119, 121, 121, 121, + 121, 59, 122, 122, 123, 60, 125, 125, 126, 126, + 127, 127, 84, 128, 128, 128, 128, 128, 128, 133, + 133, 134, 134, 135, 135, 135, 135, 135, 136, 137, + 137, 132, 132, 129, 129, 131, 131, 139, 139, 138, + 138, 138, 138, 138, 138, 138, 130, 140, 140, 142, + 141, 141, 61, 102, 143, 143, 55, 55, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, @@ -884,20 +896,21 @@ class Php7 extends \PhpParser\ParserAbstract 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 148, 142, 142, - 147, 147, 150, 151, 151, 152, 153, 153, 153, 19, - 19, 72, 72, 72, 72, 143, 143, 143, 143, 155, - 155, 144, 144, 146, 146, 146, 149, 149, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 161, 161, 104, - 163, 163, 163, 163, 145, 145, 145, 145, 145, 145, - 145, 145, 58, 58, 158, 158, 158, 158, 164, 164, - 154, 154, 154, 165, 165, 165, 165, 165, 165, 73, - 73, 65, 65, 65, 65, 122, 122, 122, 122, 168, - 167, 157, 157, 157, 157, 157, 157, 157, 156, 156, - 156, 166, 166, 166, 166, 103, 162, 170, 170, 169, - 169, 171, 171, 171, 171, 171, 171, 171, 171, 159, - 159, 159, 159, 173, 174, 172, 172, 172, 172, 172, - 172, 172, 172, 175, 175, 175, 175 + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 150, 144, 144, 149, 149, 152, 153, 153, 154, + 155, 155, 155, 19, 19, 72, 72, 72, 72, 145, + 145, 145, 145, 157, 157, 146, 146, 148, 148, 148, + 151, 151, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 163, 163, 106, 165, 165, 165, 165, 147, 147, + 147, 147, 147, 147, 147, 147, 58, 58, 160, 160, + 160, 160, 166, 166, 156, 156, 156, 167, 167, 167, + 167, 167, 167, 73, 73, 65, 65, 65, 65, 124, + 124, 124, 124, 170, 169, 159, 159, 159, 159, 159, + 159, 159, 158, 158, 158, 168, 168, 168, 168, 105, + 164, 172, 172, 171, 171, 173, 173, 173, 173, 173, + 173, 173, 173, 161, 161, 161, 161, 175, 176, 174, + 174, 174, 174, 174, 174, 174, 174, 177, 177, 177, + 177 ); protected $ruleToLength = array( @@ -922,45 +935,46 @@ class Php7 extends \PhpParser\ParserAbstract 2, 1, 1, 1, 0, 2, 1, 3, 8, 0, 4, 2, 1, 3, 0, 1, 0, 1, 0, 1, 3, 1, 8, 9, 8, 7, 6, 8, 0, 2, - 0, 2, 1, 2, 2, 0, 2, 0, 2, 0, - 2, 2, 1, 3, 1, 4, 1, 4, 1, 1, - 4, 2, 1, 3, 3, 3, 4, 4, 5, 0, - 2, 4, 3, 1, 1, 7, 0, 2, 1, 3, - 3, 4, 1, 4, 0, 2, 5, 0, 2, 6, - 0, 2, 0, 3, 1, 2, 1, 1, 2, 0, - 1, 3, 0, 2, 1, 1, 1, 1, 6, 8, - 6, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 3, 3, 3, 3, 3, 3, 3, 3, 1, 2, - 1, 1, 0, 1, 0, 2, 2, 2, 4, 3, - 1, 1, 3, 1, 2, 2, 3, 2, 3, 1, - 1, 2, 3, 1, 1, 3, 2, 0, 1, 5, - 5, 10, 3, 5, 1, 1, 3, 0, 2, 4, - 5, 4, 4, 4, 3, 1, 1, 1, 1, 1, - 1, 0, 1, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 3, 1, 1, 3, 2, 2, - 3, 1, 0, 1, 1, 3, 3, 3, 4, 1, - 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, 2, 2, 2, 3, + 0, 2, 1, 2, 1, 2, 1, 1, 1, 0, + 2, 0, 2, 0, 2, 2, 1, 3, 1, 4, + 1, 4, 1, 1, 4, 2, 1, 3, 3, 3, + 4, 4, 5, 0, 2, 4, 3, 1, 1, 7, + 0, 2, 1, 3, 3, 4, 1, 4, 0, 2, + 5, 0, 2, 6, 0, 2, 0, 3, 1, 2, + 1, 1, 2, 0, 1, 3, 0, 2, 1, 1, + 1, 1, 6, 8, 6, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, + 3, 3, 1, 2, 1, 1, 0, 1, 0, 2, + 2, 2, 4, 3, 1, 1, 3, 1, 2, 2, + 3, 2, 3, 1, 1, 2, 3, 1, 1, 3, + 2, 0, 1, 5, 5, 10, 3, 5, 1, 1, + 3, 0, 2, 4, 5, 4, 4, 4, 3, 1, + 1, 1, 1, 1, 1, 0, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 3, 1, + 1, 3, 2, 2, 3, 1, 0, 1, 1, 3, + 3, 3, 4, 1, 1, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 5, 4, 3, 4, 4, 2, 2, 4, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 1, 3, 2, 1, 2, 4, 2, 2, 8, - 9, 8, 9, 9, 10, 9, 10, 8, 3, 2, - 0, 4, 2, 1, 3, 2, 2, 2, 4, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, - 1, 0, 3, 0, 1, 1, 0, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, - 4, 1, 1, 3, 1, 1, 1, 1, 1, 3, - 2, 3, 0, 1, 1, 3, 1, 1, 1, 1, - 1, 3, 1, 1, 4, 4, 1, 4, 4, 0, - 1, 1, 1, 3, 3, 1, 4, 2, 2, 1, - 3, 1, 4, 4, 3, 3, 3, 3, 1, 3, - 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, - 1, 1, 2, 1, 3, 4, 3, 2, 0, 2, - 2, 1, 2, 1, 1, 1, 4, 3, 3, 3, - 3, 6, 3, 1, 1, 2, 1 + 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 5, 4, 3, 4, + 4, 2, 2, 4, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 2, 1, 2, + 4, 2, 2, 8, 9, 8, 9, 9, 10, 9, + 10, 8, 3, 2, 0, 4, 2, 1, 3, 2, + 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 1, 1, 1, 0, 3, 0, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 4, 1, 1, 3, 1, 1, + 1, 1, 1, 3, 2, 3, 0, 1, 1, 3, + 1, 1, 1, 1, 1, 3, 1, 1, 4, 4, + 1, 4, 4, 0, 1, 1, 1, 3, 3, 1, + 4, 2, 2, 1, 3, 1, 4, 4, 3, 3, + 3, 3, 1, 3, 1, 1, 3, 1, 1, 4, + 1, 1, 1, 3, 1, 1, 2, 1, 3, 4, + 3, 2, 0, 2, 2, 1, 2, 1, 1, 1, + 4, 3, 3, 3, 3, 6, 3, 1, 1, 2, + 1 ); protected function initReduceCallbacks() { @@ -1633,249 +1647,249 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = 0; }, 213 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 214 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 215 => function ($stackPos) { - $this->semValue = null; + $this->checkClassModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 216 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 217 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 218 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 219 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = null; }, 220 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 221 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = array(); }, 222 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 223 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = array(); }, 224 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 225 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 226 => function ($stackPos) { - $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 227 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 228 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, 229 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 230 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 231 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 232 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 233 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 234 => function ($stackPos) { - $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 235 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 236 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-3)]; - }, - 237 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; - }, - 238 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(5-3)]; - }, - 239 => function ($stackPos) { - $this->semValue = array(); - }, - 240 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 241 => function ($stackPos) { - $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 242 => function ($stackPos) { - $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 243 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 244 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 245 => function ($stackPos) { - $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); - }, - 246 => function ($stackPos) { - $this->semValue = []; - }, - 247 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 248 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 249 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 250 => function ($stackPos) { - $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 251 => function ($stackPos) { - $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 252 => function ($stackPos) { $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, - 253 => function ($stackPos) { + 231 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-2)]; }, - 254 => function ($stackPos) { - $this->semValue = array(); + 232 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); }, - 255 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 256 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); - }, - 257 => function ($stackPos) { - $this->semValue = array(); - }, - 258 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 259 => function ($stackPos) { - $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); - }, - 260 => function ($stackPos) { + 233 => function ($stackPos) { $this->semValue = null; }, - 261 => function ($stackPos) { - $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + 234 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, - 262 => function ($stackPos) { - $this->semValue = null; - }, - 263 => function ($stackPos) { - $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 264 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 265 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-2)], true); - }, - 266 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 267 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)], false); - }, - 268 => function ($stackPos) { + 235 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, - 269 => function ($stackPos) { - $this->semValue = array(); - }, - 270 => function ($stackPos) { + 236 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 271 => function ($stackPos) { + 237 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, + 238 => function ($stackPos) { + $this->semValue = new Stmt\DeclareDeclare($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 239 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 240 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-3)]; + }, + 241 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 242 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(5-3)]; + }, + 243 => function ($stackPos) { + $this->semValue = array(); + }, + 244 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 245 => function ($stackPos) { + $this->semValue = new Stmt\Case_($this->semStack[$stackPos-(4-2)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 246 => function ($stackPos) { + $this->semValue = new Stmt\Case_(null, $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 247 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 248 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 249 => function ($stackPos) { + $this->semValue = new Expr\Match_($this->semStack[$stackPos-(7-3)], $this->semStack[$stackPos-(7-6)], $this->startAttributeStack[$stackPos-(7-1)] + $this->endAttributes); + }, + 250 => function ($stackPos) { + $this->semValue = []; + }, + 251 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 252 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 253 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 254 => function ($stackPos) { + $this->semValue = new Node\MatchArm($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 255 => function ($stackPos) { + $this->semValue = new Node\MatchArm(null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 256 => function ($stackPos) { + $this->semValue = is_array($this->semStack[$stackPos-(1-1)]) ? $this->semStack[$stackPos-(1-1)] : array($this->semStack[$stackPos-(1-1)]); + }, + 257 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(4-2)]; + }, + 258 => function ($stackPos) { + $this->semValue = array(); + }, + 259 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 260 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(5-3)], is_array($this->semStack[$stackPos-(5-5)]) ? $this->semStack[$stackPos-(5-5)] : array($this->semStack[$stackPos-(5-5)]), $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + }, + 261 => function ($stackPos) { + $this->semValue = array(); + }, + 262 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 263 => function ($stackPos) { + $this->semValue = new Stmt\ElseIf_($this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-6)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + }, + 264 => function ($stackPos) { + $this->semValue = null; + }, + 265 => function ($stackPos) { + $this->semValue = new Stmt\Else_(is_array($this->semStack[$stackPos-(2-2)]) ? $this->semStack[$stackPos-(2-2)] : array($this->semStack[$stackPos-(2-2)]), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 266 => function ($stackPos) { + $this->semValue = null; + }, + 267 => function ($stackPos) { + $this->semValue = new Stmt\Else_($this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 268 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 269 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-2)], true); + }, + 270 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, + 271 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)], false); + }, 272 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 273 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + $this->semValue = array(); }, 274 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 275 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 276 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = 0; }, 277 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 278 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + }, + 279 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + }, + 280 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + }, + 281 => function ($stackPos) { + $this->semValue = Stmt\Class_::MODIFIER_READONLY; + }, + 282 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(6-6)], null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); $this->checkParam($this->semValue); }, - 279 => function ($stackPos) { + 283 => function ($stackPos) { $this->semValue = new Node\Param($this->semStack[$stackPos-(8-6)], $this->semStack[$stackPos-(8-8)], $this->semStack[$stackPos-(8-3)], $this->semStack[$stackPos-(8-4)], $this->semStack[$stackPos-(8-5)], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes, $this->semStack[$stackPos-(8-2)], $this->semStack[$stackPos-(8-1)]); $this->checkParam($this->semValue); }, - 280 => function ($stackPos) { - $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); - }, - 281 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 282 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 283 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, 284 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\Param(new Expr\Error($this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes), null, $this->semStack[$stackPos-(6-3)], $this->semStack[$stackPos-(6-4)], $this->semStack[$stackPos-(6-5)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes, $this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-1)]); }, 285 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 286 => function ($stackPos) { - $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 287 => function ($stackPos) { - $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 288 => function ($stackPos) { - $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 289 => function ($stackPos) { - $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 290 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = new Node\Name('static', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 291 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->handleBuiltinTypes($this->semStack[$stackPos-(1-1)]); }, 292 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = new Node\Identifier('array', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 293 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = new Node\Identifier('callable', $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 294 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); @@ -1890,73 +1904,73 @@ class Php7 extends \PhpParser\ParserAbstract $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 298 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 299 => function ($stackPos) { - $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 300 => function ($stackPos) { - $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 301 => function ($stackPos) { - $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 302 => function ($stackPos) { - $this->semValue = null; - }, - 303 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, + 303 => function ($stackPos) { + $this->semValue = new Node\NullableType($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, 304 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Node\UnionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 305 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-2)]; + $this->semValue = new Node\IntersectionType($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 306 => function ($stackPos) { $this->semValue = null; }, 307 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 308 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(4-2)]; + $this->semValue = null; }, 309 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-2)]); + $this->semValue = $this->semStack[$stackPos-(2-2)]; }, 310 => function ($stackPos) { - $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = null; }, 311 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = array(); }, 312 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = $this->semStack[$stackPos-(4-2)]; }, 313 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(3-2)]); }, 314 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Node\VariadicPlaceholder($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 315 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 316 => function ($stackPos) { - $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); - }, - 317 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 318 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 319 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, + 316 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 317 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(1-1)], false, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 318 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], true, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 319 => function ($stackPos) { + $this->semValue = new Node\Arg($this->semStack[$stackPos-(2-2)], false, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, 320 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Node\Arg($this->semStack[$stackPos-(3-3)], false, false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->semStack[$stackPos-(3-1)]); }, 321 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; @@ -1968,92 +1982,92 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 324 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 325 => function ($stackPos) { - $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 326 => function ($stackPos) { - if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 327 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 328 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 329 => function ($stackPos) { + $this->semValue = new Stmt\StaticVar($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 330 => function ($stackPos) { + if ($this->semStack[$stackPos-(2-2)] !== null) { $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; } + }, + 331 => function ($stackPos) { + $this->semValue = array(); + }, + 332 => function ($stackPos) { $startAttributes = $this->lookaheadStartAttributes; if (isset($startAttributes['comments'])) { $nop = new Stmt\Nop($this->createCommentNopAttributes($startAttributes['comments'])); } else { $nop = null; }; if ($nop !== null) { $this->semStack[$stackPos-(1-1)][] = $nop; } $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 329 => function ($stackPos) { + 333 => function ($stackPos) { $this->semValue = new Stmt\Property($this->semStack[$stackPos-(5-2)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-1)]); $this->checkProperty($this->semValue, $stackPos-(5-2)); }, - 330 => function ($stackPos) { + 334 => function ($stackPos) { $this->semValue = new Stmt\ClassConst($this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-2)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes, $this->semStack[$stackPos-(5-1)]); $this->checkClassConst($this->semValue, $stackPos-(5-2)); }, - 331 => function ($stackPos) { + 335 => function ($stackPos) { $this->semValue = new Stmt\ClassMethod($this->semStack[$stackPos-(10-5)], ['type' => $this->semStack[$stackPos-(10-2)], 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-7)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); $this->checkClassMethod($this->semValue, $stackPos-(10-2)); }, - 332 => function ($stackPos) { + 336 => function ($stackPos) { $this->semValue = new Stmt\TraitUse($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 333 => function ($stackPos) { + 337 => function ($stackPos) { $this->semValue = new Stmt\EnumCase($this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->semStack[$stackPos-(5-1)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, - 334 => function ($stackPos) { + 338 => function ($stackPos) { $this->semValue = null; /* will be skipped */ }, - 335 => function ($stackPos) { - $this->semValue = array(); - }, - 336 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 337 => function ($stackPos) { - $this->semValue = array(); - }, - 338 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, 339 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = array(); }, 340 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 341 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = array(); }, 342 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 343 => function ($stackPos) { - $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Stmt\TraitUseAdaptation\Precedence($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 344 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(5-1)][0], $this->semStack[$stackPos-(5-1)][1], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-4)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 345 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], $this->semStack[$stackPos-(4-3)], null, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 346 => function ($stackPos) { - $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 347 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Stmt\TraitUseAdaptation\Alias($this->semStack[$stackPos-(4-1)][0], $this->semStack[$stackPos-(4-1)][1], null, $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 348 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = array($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)]); }, 349 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 350 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = array(null, $this->semStack[$stackPos-(1-1)]); }, 351 => function ($stackPos) { - $this->semValue = 0; + $this->semValue = null; }, 352 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2062,414 +2076,414 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 354 => function ($stackPos) { - $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; + $this->semValue = 0; }, 355 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; + $this->semValue = 0; }, 356 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 357 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 358 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_STATIC; + $this->checkModifier($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $stackPos-(2-2)); $this->semValue = $this->semStack[$stackPos-(2-1)] | $this->semStack[$stackPos-(2-2)]; }, 359 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; + $this->semValue = Stmt\Class_::MODIFIER_PUBLIC; }, 360 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_FINAL; + $this->semValue = Stmt\Class_::MODIFIER_PROTECTED; }, 361 => function ($stackPos) { - $this->semValue = Stmt\Class_::MODIFIER_READONLY; + $this->semValue = Stmt\Class_::MODIFIER_PRIVATE; }, 362 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; + $this->semValue = Stmt\Class_::MODIFIER_STATIC; }, 363 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); + $this->semValue = Stmt\Class_::MODIFIER_ABSTRACT; }, 364 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + $this->semValue = Stmt\Class_::MODIFIER_FINAL; }, 365 => function ($stackPos) { - $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = Stmt\Class_::MODIFIER_READONLY; }, 366 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 367 => function ($stackPos) { - $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 368 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 369 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 370 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 371 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, + 368 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 369 => function ($stackPos) { + $this->semValue = new Node\VarLikeIdentifier(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 370 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(1-1)], null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 371 => function ($stackPos) { + $this->semValue = new Stmt\PropertyProperty($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, 372 => function ($stackPos) { - $this->semValue = array(); + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 373 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->semStack[$stackPos-(2-1)]; }, 374 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, 375 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, 376 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = array(); }, 377 => function ($stackPos) { - $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 378 => function ($stackPos) { - $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 379 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 380 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 381 => function ($stackPos) { - $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Assign($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 382 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignRef($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 383 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 384 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 385 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Clone_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 386 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 387 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 388 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 389 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 390 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 391 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 392 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 393 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 394 => function ($stackPos) { - $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 395 => function ($stackPos) { - $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 396 => function ($stackPos) { - $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 397 => function ($stackPos) { - $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 398 => function ($stackPos) { - $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\AssignOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 399 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PostInc($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 400 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PreInc($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 401 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PostDec($this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 402 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\PreDec($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 403 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 404 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BooleanAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 405 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 406 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 407 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\LogicalXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 408 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseOr($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 409 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 410 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseAnd($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 411 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\BitwiseXor($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 412 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Concat($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 413 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Plus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 414 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Minus($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 415 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mul($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 416 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Div($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 417 => function ($stackPos) { - $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Mod($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 418 => function ($stackPos) { - $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftLeft($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 419 => function ($stackPos) { - $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\ShiftRight($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 420 => function ($stackPos) { - $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Pow($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 421 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryPlus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 422 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\UnaryMinus($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 423 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BooleanNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 424 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BitwiseNot($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 425 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Identical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 426 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotIdentical($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 427 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Equal($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 428 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\NotEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 429 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Spaceship($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 430 => function ($stackPos) { - $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Smaller($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 431 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Expr\BinaryOp\SmallerOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 432 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Greater($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 433 => function ($stackPos) { - $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\GreaterOrEqual($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 434 => function ($stackPos) { - $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Instanceof_($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 435 => function ($stackPos) { - $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 436 => function ($stackPos) { - $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(5-1)], $this->semStack[$stackPos-(5-3)], $this->semStack[$stackPos-(5-5)], $this->startAttributeStack[$stackPos-(5-1)] + $this->endAttributes); }, 437 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Ternary($this->semStack[$stackPos-(4-1)], null, $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 438 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\BinaryOp\Coalesce($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 439 => function ($stackPos) { - $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Isset_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 440 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Empty_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 441 => function ($stackPos) { - $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 442 => function ($stackPos) { - $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_INCLUDE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 443 => function ($stackPos) { + $this->semValue = new Expr\Eval_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 444 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 445 => function ($stackPos) { + $this->semValue = new Expr\Include_($this->semStack[$stackPos-(2-2)], Expr\Include_::TYPE_REQUIRE_ONCE, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 446 => function ($stackPos) { + $this->semValue = new Expr\Cast\Int_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 447 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = $this->getFloatCastKind($this->semStack[$stackPos-(2-1)]); $this->semValue = new Expr\Cast\Double($this->semStack[$stackPos-(2-2)], $attrs); }, - 444 => function ($stackPos) { + 448 => function ($stackPos) { $this->semValue = new Expr\Cast\String_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 445 => function ($stackPos) { + 449 => function ($stackPos) { $this->semValue = new Expr\Cast\Array_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 446 => function ($stackPos) { + 450 => function ($stackPos) { $this->semValue = new Expr\Cast\Object_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 447 => function ($stackPos) { + 451 => function ($stackPos) { $this->semValue = new Expr\Cast\Bool_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 448 => function ($stackPos) { + 452 => function ($stackPos) { $this->semValue = new Expr\Cast\Unset_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 449 => function ($stackPos) { + 453 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes; $attrs['kind'] = strtolower($this->semStack[$stackPos-(2-1)]) === 'exit' ? Expr\Exit_::KIND_EXIT : Expr\Exit_::KIND_DIE; $this->semValue = new Expr\Exit_($this->semStack[$stackPos-(2-2)], $attrs); }, - 450 => function ($stackPos) { + 454 => function ($stackPos) { $this->semValue = new Expr\ErrorSuppress($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 451 => function ($stackPos) { + 455 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 452 => function ($stackPos) { + 456 => function ($stackPos) { $this->semValue = new Expr\ShellExec($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 453 => function ($stackPos) { + 457 => function ($stackPos) { $this->semValue = new Expr\Print_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 454 => function ($stackPos) { + 458 => function ($stackPos) { $this->semValue = new Expr\Yield_(null, null, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, - 455 => function ($stackPos) { + 459 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(2-2)], null, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 456 => function ($stackPos) { + 460 => function ($stackPos) { $this->semValue = new Expr\Yield_($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-2)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, - 457 => function ($stackPos) { + 461 => function ($stackPos) { $this->semValue = new Expr\YieldFrom($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 458 => function ($stackPos) { + 462 => function ($stackPos) { $this->semValue = new Expr\Throw_($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 459 => function ($stackPos) { + 463 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'returnType' => $this->semStack[$stackPos-(8-6)], 'expr' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, - 460 => function ($stackPos) { + 464 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 461 => function ($stackPos) { + 465 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(8-2)], 'params' => $this->semStack[$stackPos-(8-4)], 'uses' => $this->semStack[$stackPos-(8-6)], 'returnType' => $this->semStack[$stackPos-(8-7)], 'stmts' => $this->semStack[$stackPos-(8-8)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes); }, - 462 => function ($stackPos) { + 466 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => []], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 463 => function ($stackPos) { + 467 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'returnType' => $this->semStack[$stackPos-(9-7)], 'expr' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 464 => function ($stackPos) { + 468 => function ($stackPos) { $this->semValue = new Expr\ArrowFunction(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'returnType' => $this->semStack[$stackPos-(10-8)], 'expr' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, - 465 => function ($stackPos) { + 469 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => false, 'byRef' => $this->semStack[$stackPos-(9-3)], 'params' => $this->semStack[$stackPos-(9-5)], 'uses' => $this->semStack[$stackPos-(9-7)], 'returnType' => $this->semStack[$stackPos-(9-8)], 'stmts' => $this->semStack[$stackPos-(9-9)], 'attrGroups' => $this->semStack[$stackPos-(9-1)]], $this->startAttributeStack[$stackPos-(9-1)] + $this->endAttributes); }, - 466 => function ($stackPos) { + 470 => function ($stackPos) { $this->semValue = new Expr\Closure(['static' => true, 'byRef' => $this->semStack[$stackPos-(10-4)], 'params' => $this->semStack[$stackPos-(10-6)], 'uses' => $this->semStack[$stackPos-(10-8)], 'returnType' => $this->semStack[$stackPos-(10-9)], 'stmts' => $this->semStack[$stackPos-(10-10)], 'attrGroups' => $this->semStack[$stackPos-(10-1)]], $this->startAttributeStack[$stackPos-(10-1)] + $this->endAttributes); }, - 467 => function ($stackPos) { + 471 => function ($stackPos) { $this->semValue = array(new Stmt\Class_(null, ['type' => 0, 'extends' => $this->semStack[$stackPos-(8-4)], 'implements' => $this->semStack[$stackPos-(8-5)], 'stmts' => $this->semStack[$stackPos-(8-7)], 'attrGroups' => $this->semStack[$stackPos-(8-1)]], $this->startAttributeStack[$stackPos-(8-1)] + $this->endAttributes), $this->semStack[$stackPos-(8-3)]); $this->checkClass($this->semValue[0], -1); }, - 468 => function ($stackPos) { + 472 => function ($stackPos) { $this->semValue = new Expr\New_($this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 469 => function ($stackPos) { + 473 => function ($stackPos) { list($class, $ctorArgs) = $this->semStack[$stackPos-(2-2)]; $this->semValue = new Expr\New_($class, $ctorArgs, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 470 => function ($stackPos) { + 474 => function ($stackPos) { $this->semValue = array(); }, - 471 => function ($stackPos) { + 475 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(4-3)]; }, - 472 => function ($stackPos) { + 476 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(2-1)]; }, - 473 => function ($stackPos) { + 477 => function ($stackPos) { $this->semValue = array($this->semStack[$stackPos-(1-1)]); }, - 474 => function ($stackPos) { + 478 => function ($stackPos) { $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; }, - 475 => function ($stackPos) { + 479 => function ($stackPos) { $this->semValue = new Expr\ClosureUse($this->semStack[$stackPos-(2-2)], $this->semStack[$stackPos-(2-1)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, - 476 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 477 => function ($stackPos) { - $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 478 => function ($stackPos) { - $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 479 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, 480 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 481 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\FuncCall($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 482 => function ($stackPos) { - $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 483 => function ($stackPos) { - $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 484 => function ($stackPos) { - $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 485 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 486 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Name($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 487 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = new Name\FullyQualified(substr($this->semStack[$stackPos-(1-1)], 1), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 488 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Name\Relative(substr($this->semStack[$stackPos-(1-1)], 10), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 489 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2478,116 +2492,115 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 491 => function ($stackPos) { - $this->semValue = null; - }, - 492 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 492 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + }, 493 => function ($stackPos) { - $this->semValue = array(); - }, - 494 => function ($stackPos) { - $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); - }, - 495 => function ($stackPos) { - foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 496 => function ($stackPos) { - $this->semValue = array(); - }, - 497 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, + 494 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 495 => function ($stackPos) { + $this->semValue = null; + }, + 496 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 497 => function ($stackPos) { + $this->semValue = array(); + }, 498 => function ($stackPos) { - $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array(new Scalar\EncapsedStringPart(Scalar\String_::parseEscapeSequences($this->semStack[$stackPos-(1-1)], '`'), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes)); }, 499 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + foreach ($this->semStack[$stackPos-(1-1)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '`', true); } }; $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 500 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = array(); }, 501 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 502 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\ConstFetch($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 503 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Line($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 504 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\File($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 505 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Dir($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 506 => function ($stackPos) { - $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Class_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 507 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Scalar\MagicConst\Trait_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 508 => function ($stackPos) { - $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Scalar\MagicConst\Method($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 509 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Function_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 510 => function ($stackPos) { + $this->semValue = new Scalar\MagicConst\Namespace_($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 511 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 512 => function ($stackPos) { + $this->semValue = new Expr\ClassConstFetch($this->semStack[$stackPos-(3-1)], new Expr\Error($this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)]), $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); $this->errorState = 2; + }, + 513 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_SHORT; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(3-2)], $attrs); }, - 510 => function ($stackPos) { + 514 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes; $attrs['kind'] = Expr\Array_::KIND_LONG; $this->semValue = new Expr\Array_($this->semStack[$stackPos-(4-3)], $attrs); }, - 511 => function ($stackPos) { + 515 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 512 => function ($stackPos) { - $attrs = $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes; $attrs['kind'] = ($this->semStack[$stackPos-(1-1)][0] === "'" || ($this->semStack[$stackPos-(1-1)][1] === "'" && ($this->semStack[$stackPos-(1-1)][0] === 'b' || $this->semStack[$stackPos-(1-1)][0] === 'B')) ? Scalar\String_::KIND_SINGLE_QUOTED : Scalar\String_::KIND_DOUBLE_QUOTED); - $this->semValue = new Scalar\String_(Scalar\String_::parse($this->semStack[$stackPos-(1-1)]), $attrs); + 516 => function ($stackPos) { + $this->semValue = Scalar\String_::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, - 513 => function ($stackPos) { + 517 => function ($stackPos) { $attrs = $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes; $attrs['kind'] = Scalar\String_::KIND_DOUBLE_QUOTED; foreach ($this->semStack[$stackPos-(3-2)] as $s) { if ($s instanceof Node\Scalar\EncapsedStringPart) { $s->value = Node\Scalar\String_::parseEscapeSequences($s->value, '"', true); } }; $this->semValue = new Scalar\Encapsed($this->semStack[$stackPos-(3-2)], $attrs); }, - 514 => function ($stackPos) { + 518 => function ($stackPos) { $this->semValue = $this->parseLNumber($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, - 515 => function ($stackPos) { - $this->semValue = new Scalar\DNumber(Scalar\DNumber::parse($this->semStack[$stackPos-(1-1)]), $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 516 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 517 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 518 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, 519 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = Scalar\DNumber::fromString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); }, 520 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 521 => function ($stackPos) { - $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 522 => function ($stackPos) { - $this->semValue = null; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 523 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 524 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(2-1)], '', $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(2-2)] + $this->endAttributeStack[$stackPos-(2-2)], true); }, 525 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->parseDocString($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-2)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes, $this->startAttributeStack[$stackPos-(3-3)] + $this->endAttributeStack[$stackPos-(3-3)], true); }, 526 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = null; }, 527 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2596,13 +2609,13 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 529 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 530 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 531 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 532 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; @@ -2611,192 +2624,204 @@ class Php7 extends \PhpParser\ParserAbstract $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 534 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 535 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(3-2)]; }, 536 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 537 => function ($stackPos) { - $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 538 => function ($stackPos) { - $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 539 => function ($stackPos) { - $this->semValue = null; + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 540 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 541 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\MethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 542 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\NullsafeMethodCall($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->semStack[$stackPos-(4-4)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 543 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = null; }, 544 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 545 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 546 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 547 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 548 => function ($stackPos) { - $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 549 => function ($stackPos) { - $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 550 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, 551 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); }, 552 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable(new Expr\Error($this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes), $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); $this->errorState = 2; }, 553 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + $var = $this->semStack[$stackPos-(1-1)]->name; $this->semValue = \is_string($var) ? new Node\VarLikeIdentifier($var, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes) : $var; }, 554 => function ($stackPos) { - $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 555 => function ($stackPos) { - $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, 556 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 557 => function ($stackPos) { - $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 558 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 559 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 560 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 561 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 562 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(3-2)]; - }, - 563 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 564 => function ($stackPos) { - $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; - }, - 565 => function ($stackPos) { - $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 566 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); - }, - 567 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos]; - }, - 568 => function ($stackPos) { - /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ - }, - 569 => function ($stackPos) { - $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; - }, - 570 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 571 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 572 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 573 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 574 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 575 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); - }, - 576 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); - }, - 577 => function ($stackPos) { - $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); - }, - 578 => function ($stackPos) { - $this->semValue = null; - }, - 579 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 580 => function ($stackPos) { - $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; - }, - 581 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(1-1)]); - }, - 582 => function ($stackPos) { - $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); - }, - 583 => function ($stackPos) { - $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 584 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); - }, - 585 => function ($stackPos) { - $this->semValue = $this->semStack[$stackPos-(1-1)]; - }, - 586 => function ($stackPos) { $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); }, - 587 => function ($stackPos) { + 557 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 558 => function ($stackPos) { $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 588 => function ($stackPos) { + 559 => function ($stackPos) { $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 589 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + 560 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 590 => function ($stackPos) { - $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + 561 => function ($stackPos) { + $this->semValue = new Expr\StaticPropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, - 591 => function ($stackPos) { - $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); + 562 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; }, - 592 => function ($stackPos) { + 563 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(3-2)]; }, + 564 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 565 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 566 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 567 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 568 => function ($stackPos) { + $this->semValue = new Expr\Error($this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); $this->errorState = 2; + }, + 569 => function ($stackPos) { + $this->semValue = new Expr\List_($this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 570 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; $end = count($this->semValue)-1; if ($this->semValue[$end] === null) array_pop($this->semValue); + }, + 571 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos]; + }, + 572 => function ($stackPos) { + /* do nothing -- prevent default action of $$=$this->semStack[$1]. See $551. */ + }, + 573 => function ($stackPos) { + $this->semStack[$stackPos-(3-1)][] = $this->semStack[$stackPos-(3-3)]; $this->semValue = $this->semStack[$stackPos-(3-1)]; + }, + 574 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 575 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 576 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 577 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(1-1)], null, false, $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 578 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 579 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(4-4)], $this->semStack[$stackPos-(4-1)], true, $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 580 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(3-3)], $this->semStack[$stackPos-(3-1)], false, $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 581 => function ($stackPos) { + $this->semValue = new Expr\ArrayItem($this->semStack[$stackPos-(2-2)], null, false, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes, true, $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 582 => function ($stackPos) { + $this->semValue = null; + }, + 583 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 584 => function ($stackPos) { + $this->semStack[$stackPos-(2-1)][] = $this->semStack[$stackPos-(2-2)]; $this->semValue = $this->semStack[$stackPos-(2-1)]; + }, + 585 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(1-1)]); + }, + 586 => function ($stackPos) { + $this->semValue = array($this->semStack[$stackPos-(2-1)], $this->semStack[$stackPos-(2-2)]); + }, + 587 => function ($stackPos) { + $this->semValue = new Scalar\EncapsedStringPart($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 588 => function ($stackPos) { + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 589 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(1-1)]; + }, + 590 => function ($stackPos) { + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(4-1)], $this->semStack[$stackPos-(4-3)], $this->startAttributeStack[$stackPos-(4-1)] + $this->endAttributes); + }, + 591 => function ($stackPos) { + $this->semValue = new Expr\PropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, + 592 => function ($stackPos) { + $this->semValue = new Expr\NullsafePropertyFetch($this->semStack[$stackPos-(3-1)], $this->semStack[$stackPos-(3-3)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); + }, 593 => function ($stackPos) { - $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 594 => function ($stackPos) { - $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + $this->semValue = new Expr\Variable($this->semStack[$stackPos-(3-2)], $this->startAttributeStack[$stackPos-(3-1)] + $this->endAttributes); }, 595 => function ($stackPos) { - $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + $this->semValue = new Expr\ArrayDimFetch($this->semStack[$stackPos-(6-2)], $this->semStack[$stackPos-(6-4)], $this->startAttributeStack[$stackPos-(6-1)] + $this->endAttributes); }, 596 => function ($stackPos) { + $this->semValue = $this->semStack[$stackPos-(3-2)]; + }, + 597 => function ($stackPos) { + $this->semValue = new Scalar\String_($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 598 => function ($stackPos) { + $this->semValue = $this->parseNumString($this->semStack[$stackPos-(1-1)], $this->startAttributeStack[$stackPos-(1-1)] + $this->endAttributes); + }, + 599 => function ($stackPos) { + $this->semValue = $this->parseNumString('-' . $this->semStack[$stackPos-(2-2)], $this->startAttributeStack[$stackPos-(2-1)] + $this->endAttributes); + }, + 600 => function ($stackPos) { $this->semValue = $this->semStack[$stackPos-(1-1)]; }, ]; diff --git a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php index 5ee5a64b..d485d78d 100644 --- a/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php +++ b/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php @@ -875,6 +875,15 @@ abstract class ParserAbstract implements Parser return $attributes; } + protected function checkClassModifier($a, $b, $modifierPos) { + try { + Class_::verifyClassModifier($a, $b); + } catch (Error $error) { + $error->setAttributes($this->getAttributesAt($modifierPos)); + $this->emitError($error); + } + } + protected function checkModifier($a, $b, $modifierPos) { // Jumping through some hoops here because verifyModifier() is also used elsewhere try { diff --git a/vendor/php-http/discovery/.php-cs-fixer.php b/vendor/php-http/discovery/.php-cs-fixer.php new file mode 100644 index 00000000..83809c25 --- /dev/null +++ b/vendor/php-http/discovery/.php-cs-fixer.php @@ -0,0 +1,16 @@ +in(__DIR__.'/src') + ->name('*.php') +; + +$config = (new PhpCsFixer\Config()) + ->setRiskyAllowed(true) + ->setRules([ + '@Symfony' => true, + ]) + ->setFinder($finder) +; + +return $config; diff --git a/vendor/php-http/discovery/CHANGELOG.md b/vendor/php-http/discovery/CHANGELOG.md index f896866a..321929f3 100644 --- a/vendor/php-http/discovery/CHANGELOG.md +++ b/vendor/php-http/discovery/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 1.14.2 - 2022-05-25 + +- [#202](https://github.com/php-http/discovery/pull/202) - Avoid error when the Symfony PSR-18 client exists but its dependencies are not installed + ## 1.14.1 - 2021-09-18 - [#199](https://github.com/php-http/discovery/pull/199) - Fixes message factory discovery for `laminas-diactoros ^2.7` diff --git a/vendor/php-http/discovery/composer.json b/vendor/php-http/discovery/composer.json index 5ded29e1..42d62602 100644 --- a/vendor/php-http/discovery/composer.json +++ b/vendor/php-http/discovery/composer.json @@ -17,8 +17,7 @@ "graham-campbell/phpspec-skip-example-extension": "^5.0", "php-http/httplug": "^1.0 || ^2.0", "php-http/message-factory": "^1.0", - "phpspec/phpspec": "^5.1 || ^6.1", - "puli/composer-plugin": "1.0.0-beta10" + "phpspec/phpspec": "^5.1 || ^6.1" }, "suggest": { "php-http/message": "Allow to use Guzzle, Diactoros or Slim Framework factories" diff --git a/vendor/php-http/discovery/src/ClassDiscovery.php b/vendor/php-http/discovery/src/ClassDiscovery.php index 43529850..4f47f3c8 100644 --- a/vendor/php-http/discovery/src/ClassDiscovery.php +++ b/vendor/php-http/discovery/src/ClassDiscovery.php @@ -206,7 +206,7 @@ abstract class ClassDiscovery /** * Get an instance of the $class. * - * @param string|\Closure $class A FQCN of a class or a closure that instantiate the class. + * @param string|\Closure $class a FQCN of a class or a closure that instantiate the class * * @return object * diff --git a/vendor/php-http/discovery/src/Exception/NotFoundException.php b/vendor/php-http/discovery/src/Exception/NotFoundException.php index befbf488..ef8b9c58 100644 --- a/vendor/php-http/discovery/src/Exception/NotFoundException.php +++ b/vendor/php-http/discovery/src/Exception/NotFoundException.php @@ -11,6 +11,6 @@ use Http\Discovery\Exception; * * @author Márk Sági-Kazár */ -/*final */class NotFoundException extends \RuntimeException implements Exception +/* final */ class NotFoundException extends \RuntimeException implements Exception { } diff --git a/vendor/php-http/discovery/src/Psr18ClientDiscovery.php b/vendor/php-http/discovery/src/Psr18ClientDiscovery.php index 7fcdb17a..dfd2dd1e 100644 --- a/vendor/php-http/discovery/src/Psr18ClientDiscovery.php +++ b/vendor/php-http/discovery/src/Psr18ClientDiscovery.php @@ -24,7 +24,7 @@ final class Psr18ClientDiscovery extends ClassDiscovery try { $client = static::findOneByType(ClientInterface::class); } catch (DiscoveryFailedException $e) { - throw new \Http\Discovery\Exception\NotFoundException('No PSR-18 clients found. Make sure to install a package providing "psr/http-client-implementation". Example: "php-http/guzzle6-adapter".', 0, $e); + throw new \Http\Discovery\Exception\NotFoundException('No PSR-18 clients found. Make sure to install a package providing "psr/http-client-implementation". Example: "php-http/guzzle7-adapter".', 0, $e); } return static::instantiateClass($client); diff --git a/vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php b/vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php index e82bcb1d..8bddbe82 100644 --- a/vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php +++ b/vendor/php-http/discovery/src/Strategy/CommonClassesStrategy.php @@ -2,45 +2,46 @@ namespace Http\Discovery\Strategy; +use GuzzleHttp\Client as GuzzleHttp; use GuzzleHttp\Promise\Promise; use GuzzleHttp\Psr7\Request as GuzzleRequest; +use Http\Adapter\Artax\Client as Artax; +use Http\Adapter\Buzz\Client as Buzz; +use Http\Adapter\Cake\Client as Cake; +use Http\Adapter\Guzzle5\Client as Guzzle5; +use Http\Adapter\Guzzle6\Client as Guzzle6; +use Http\Adapter\Guzzle7\Client as Guzzle7; +use Http\Adapter\React\Client as React; +use Http\Adapter\Zend\Client as Zend; +use Http\Client\Curl\Client as Curl; use Http\Client\HttpAsyncClient; use Http\Client\HttpClient; +use Http\Client\Socket\Client as Socket; +use Http\Discovery\ClassDiscovery; use Http\Discovery\Exception\NotFoundException; use Http\Discovery\MessageFactoryDiscovery; use Http\Discovery\Psr17FactoryDiscovery; -use Http\Message\RequestFactory; -use Psr\Http\Message\RequestFactoryInterface as Psr17RequestFactory; use Http\Message\MessageFactory; -use Http\Message\MessageFactory\GuzzleMessageFactory; -use Http\Message\StreamFactory; -use Http\Message\StreamFactory\GuzzleStreamFactory; -use Http\Message\UriFactory; -use Http\Message\UriFactory\GuzzleUriFactory; use Http\Message\MessageFactory\DiactorosMessageFactory; -use Http\Message\StreamFactory\DiactorosStreamFactory; -use Http\Message\UriFactory\DiactorosUriFactory; -use Psr\Http\Client\ClientInterface as Psr18Client; -use Zend\Diactoros\Request as ZendDiactorosRequest; -use Laminas\Diactoros\Request as DiactorosRequest; +use Http\Message\MessageFactory\GuzzleMessageFactory; use Http\Message\MessageFactory\SlimMessageFactory; +use Http\Message\RequestFactory; +use Http\Message\StreamFactory; +use Http\Message\StreamFactory\DiactorosStreamFactory; +use Http\Message\StreamFactory\GuzzleStreamFactory; use Http\Message\StreamFactory\SlimStreamFactory; +use Http\Message\UriFactory; +use Http\Message\UriFactory\DiactorosUriFactory; +use Http\Message\UriFactory\GuzzleUriFactory; use Http\Message\UriFactory\SlimUriFactory; +use Laminas\Diactoros\Request as DiactorosRequest; +use Nyholm\Psr7\Factory\HttplugFactory as NyholmHttplugFactory; +use Psr\Http\Client\ClientInterface as Psr18Client; +use Psr\Http\Message\RequestFactoryInterface as Psr17RequestFactory; use Slim\Http\Request as SlimRequest; -use GuzzleHttp\Client as GuzzleHttp; -use Http\Adapter\Guzzle7\Client as Guzzle7; -use Http\Adapter\Guzzle6\Client as Guzzle6; -use Http\Adapter\Guzzle5\Client as Guzzle5; -use Http\Client\Curl\Client as Curl; -use Http\Client\Socket\Client as Socket; -use Http\Adapter\React\Client as React; -use Http\Adapter\Buzz\Client as Buzz; -use Http\Adapter\Cake\Client as Cake; -use Http\Adapter\Zend\Client as Zend; -use Http\Adapter\Artax\Client as Artax; use Symfony\Component\HttpClient\HttplugClient as SymfonyHttplug; use Symfony\Component\HttpClient\Psr18Client as SymfonyPsr18; -use Nyholm\Psr7\Factory\HttplugFactory as NyholmHttplugFactory; +use Zend\Diactoros\Request as ZendDiactorosRequest; /** * @internal @@ -136,8 +137,11 @@ final class CommonClassesStrategy implements DiscoveryStrategy // HTTPlug 2.0 clients implements PSR18Client too. foreach (self::$classes[HttpClient::class] as $c) { + if (!is_string($c['class'])) { + continue; + } try { - if (is_subclass_of($c['class'], Psr18Client::class)) { + if (ClassDiscovery::safeClassExists($c['class']) && is_subclass_of($c['class'], Psr18Client::class)) { $candidates[] = $c; } } catch (\Throwable $e) { diff --git a/vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php b/vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php index 641485a6..1eadb145 100644 --- a/vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php +++ b/vendor/php-http/discovery/src/Strategy/DiscoveryStrategy.php @@ -17,7 +17,7 @@ interface DiscoveryStrategy * @return array The return value is always an array with zero or more elements. Each * element is an array with two keys ['class' => string, 'condition' => mixed]. * - * @throws StrategyUnavailableException if we cannot use this strategy. + * @throws StrategyUnavailableException if we cannot use this strategy */ public static function getCandidates($type); } diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php index 0c9a73cb..ca360266 100644 --- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php +++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php @@ -550,7 +550,7 @@ final class TypeResolver ); } - if (!$minValue || !$maxValue || $tokenCounter > 4) { + if ($minValue === null || $maxValue === null || $tokenCounter > 4) { throw new RuntimeException( 'int has not the correct format' ); diff --git a/vendor/psy/psysh/composer.json b/vendor/psy/psysh/composer.json index 327acb6b..c076d041 100644 --- a/vendor/psy/psysh/composer.json +++ b/vendor/psy/psysh/composer.json @@ -21,15 +21,13 @@ "nikic/php-parser": "^4.0 || ^3.1" }, "require-dev": { - "hoa/console": "3.17.05.02", "bamarni/composer-bin-plugin": "^1.2" }, "suggest": { "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.", - "ext-pdo-sqlite": "The doc command requires SQLite to work.", - "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit." + "ext-pdo-sqlite": "The doc command requires SQLite to work." }, "autoload": { "files": ["src/functions.php"], diff --git a/vendor/psy/psysh/src/Command/Command.php b/vendor/psy/psysh/src/Command/Command.php index 56417408..ec219ecb 100644 --- a/vendor/psy/psysh/src/Command/Command.php +++ b/vendor/psy/psysh/src/Command/Command.php @@ -147,7 +147,7 @@ abstract class Command extends BaseCommand $description = \str_replace("\n", "\n".\str_pad('', $max + 2, ' '), $argument->getDescription()); - $messages[] = \sprintf(" %-${max}s %s%s", $argument->getName(), $description, $default); + $messages[] = \sprintf(" %-{$max}s %s%s", $argument->getName(), $description, $default); } $messages[] = ''; @@ -182,7 +182,7 @@ abstract class Command extends BaseCommand $optionMax = $max - \strlen($option->getName()) - 2; $messages[] = \sprintf( - " %s %-${optionMax}s%s%s%s", + " %s %-{$optionMax}s%s%s%s", '--'.$option->getName(), $option->getShortcut() ? \sprintf('(-%s) ', $option->getShortcut()) : '', $description, diff --git a/vendor/psy/psysh/src/Configuration.php b/vendor/psy/psysh/src/Configuration.php index 68d1cc0c..0107648f 100644 --- a/vendor/psy/psysh/src/Configuration.php +++ b/vendor/psy/psysh/src/Configuration.php @@ -816,11 +816,13 @@ class Configuration return Readline\GNUReadline::class; } elseif (Readline\Libedit::isSupported()) { return Readline\Libedit::class; - } elseif (Readline\HoaConsole::isSupported()) { - return Readline\HoaConsole::class; } } + if (Readline\Userland::isSupported()) { + return Readline\Userland::class; + } + return Readline\Transient::class; } @@ -1206,7 +1208,7 @@ class Configuration $this->pager = $pager; } elseif ($less = \exec('which less 2>/dev/null')) { // check for the presence of less... - $this->pager = $less.' -R -S -F -X'; + $this->pager = $less.' -R -F -X'; } } diff --git a/vendor/psy/psysh/src/Formatter/CodeFormatter.php b/vendor/psy/psysh/src/Formatter/CodeFormatter.php index cbc052bc..3d1f611f 100644 --- a/vendor/psy/psysh/src/Formatter/CodeFormatter.php +++ b/vendor/psy/psysh/src/Formatter/CodeFormatter.php @@ -302,7 +302,7 @@ class CodeFormatter implements ReflectorFormatter $mark = ($markLine === $lineNum) ? self::LINE_MARKER : self::NO_LINE_MARKER; } - yield \sprintf("%s: %s", $mark, $lineNum, $line); + yield \sprintf("%s: %s", $mark, $lineNum, $line); } } diff --git a/vendor/psy/psysh/src/Output/ProcOutputPager.php b/vendor/psy/psysh/src/Output/ProcOutputPager.php index cbeb0ff0..af13a61a 100644 --- a/vendor/psy/psysh/src/Output/ProcOutputPager.php +++ b/vendor/psy/psysh/src/Output/ProcOutputPager.php @@ -32,9 +32,9 @@ class ProcOutputPager extends StreamOutput implements OutputPager * Constructor. * * @param StreamOutput $output - * @param string $cmd Pager process command (default: 'less -R -S -F -X') + * @param string $cmd Pager process command (default: 'less -R -F -X') */ - public function __construct(StreamOutput $output, string $cmd = 'less -R -S -F -X') + public function __construct(StreamOutput $output, string $cmd = 'less -R -F -X') { $this->stream = $output->getStream(); $this->cmd = $cmd; diff --git a/vendor/psy/psysh/src/Readline/Hoa/Autocompleter.php b/vendor/psy/psysh/src/Readline/Hoa/Autocompleter.php new file mode 100644 index 00000000..6955de62 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Autocompleter.php @@ -0,0 +1,57 @@ +setAutocompleters($autocompleters); + + return; + } + + /** + * Complete a word. + * Returns null for no word, a full-word or an array of full-words. + */ + public function complete(&$prefix) + { + foreach ($this->getAutocompleters() as $autocompleter) { + $preg = \preg_match( + '#('.$autocompleter->getWordDefinition().')$#u', + $prefix, + $match + ); + + if (0 === $preg) { + continue; + } + + $_prefix = $match[0]; + + if (null === $out = $autocompleter->complete($_prefix)) { + continue; + } + + $prefix = $_prefix; + + return $out; + } + + return null; + } + + /** + * Set/initialize list of autocompleters. + */ + protected function setAutocompleters(array $autocompleters) + { + $old = $this->_autocompleters; + $this->_autocompleters = new \ArrayObject($autocompleters); + + return $old; + } + + /** + * Get list of autocompleters. + */ + public function getAutocompleters() + { + return $this->_autocompleters; + } + + /** + * Get definition of a word. + */ + public function getWordDefinition(): string + { + return '.*'; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/AutocompleterPath.php b/vendor/psy/psysh/src/Readline/Hoa/AutocompleterPath.php new file mode 100644 index 00000000..a922b789 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/AutocompleterPath.php @@ -0,0 +1,194 @@ +setRoot($root); + } + + if (null !== $iteratorFactory) { + $this->setIteratorFactory($iteratorFactory); + } + } + + /** + * Complete a word. + * Returns null for no word, a full-word or an array of full-words. + */ + public function complete(&$prefix) + { + $root = $this->getRoot(); + + if (static::PWD === $root) { + $root = \getcwd(); + } + + $path = $root.\DIRECTORY_SEPARATOR.$prefix; + + if (!\is_dir($path)) { + $path = \dirname($path).\DIRECTORY_SEPARATOR; + $prefix = \basename($prefix); + } else { + $prefix = null; + } + + $iteratorFactory = $this->getIteratorFactory() ?: + static::getDefaultIteratorFactory(); + + try { + $iterator = $iteratorFactory($path); + $out = []; + $length = \mb_strlen($prefix); + + foreach ($iterator as $fileinfo) { + $filename = $fileinfo->getFilename(); + + if (null === $prefix || + (\mb_substr($filename, 0, $length) === $prefix)) { + if ($fileinfo->isDir()) { + $out[] = $filename.'/'; + } else { + $out[] = $filename; + } + } + } + } catch (\Exception $e) { + return null; + } + + $count = \count($out); + + if (1 === $count) { + return $out[0]; + } + + if (0 === $count) { + return null; + } + + return $out; + } + + /** + * Get definition of a word. + */ + public function getWordDefinition(): string + { + return '/?[\w\d\\_\-\.]+(/[\w\d\\_\-\.]*)*'; + } + + /** + * Set root. + */ + public function setRoot(string $root) + { + $old = $this->_root; + $this->_root = $root; + + return $old; + } + + /** + * Get root. + */ + public function getRoot() + { + return $this->_root; + } + + /** + * Set iterator factory (a finder). + */ + public function setIteratorFactory(\Closure $iteratorFactory) + { + $old = $this->_iteratorFactory; + $this->_iteratorFactory = $iteratorFactory; + + return $old; + } + + /** + * Get iterator factory. + */ + public function getIteratorFactory() + { + return $this->_iteratorFactory; + } + + /** + * Get default iterator factory (based on \DirectoryIterator). + */ + public static function getDefaultIteratorFactory() + { + return function ($path) { + return new \DirectoryIterator($path); + }; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/AutocompleterWord.php b/vendor/psy/psysh/src/Readline/Hoa/AutocompleterWord.php new file mode 100644 index 00000000..c60823ea --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/AutocompleterWord.php @@ -0,0 +1,119 @@ +setWords($words); + } + + /** + * Complete a word. + * Returns null for no word, a full-word or an array of full-words. + * + * @param string &$prefix Prefix to autocomplete + * + * @return mixed + */ + public function complete(&$prefix) + { + $out = []; + $length = \mb_strlen($prefix); + + foreach ($this->getWords() as $word) { + if (\mb_substr($word, 0, $length) === $prefix) { + $out[] = $word; + } + } + + if (empty($out)) { + return null; + } + + if (1 === \count($out)) { + return $out[0]; + } + + return $out; + } + + /** + * Get definition of a word. + */ + public function getWordDefinition(): string + { + return '\b\w+'; + } + + /** + * Set list of words. + * + * @param array $words words + * + * @return array + */ + public function setWords(array $words) + { + $old = $this->_words; + $this->_words = $words; + + return $old; + } + + /** + * Get list of words. + */ + public function getWords(): array + { + return $this->_words; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Console.php b/vendor/psy/psysh/src/Readline/Hoa/Console.php new file mode 100644 index 00000000..17b1fecc --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Console.php @@ -0,0 +1,347 @@ + $repeat) { + return; + } elseif (1 === $repeat) { + $handle = \explode(' ', $steps); + } else { + $handle = \explode(' ', $steps, 1); + } + + $tput = Console::getTput(); + $output = Console::getOutput(); + + foreach ($handle as $step) { + switch ($step) { + case 'u': + case 'up': + case '↑': + $output->writeAll( + \str_replace( + '%p1%d', + $repeat, + $tput->get('parm_up_cursor') + ) + ); + + break; + + case 'U': + case 'UP': + static::moveTo(null, 1); + + break; + + case 'r': + case 'right': + case '→': + $output->writeAll( + \str_replace( + '%p1%d', + $repeat, + $tput->get('parm_right_cursor') + ) + ); + + break; + + case 'R': + case 'RIGHT': + static::moveTo(9999); + + break; + + case 'd': + case 'down': + case '↓': + $output->writeAll( + \str_replace( + '%p1%d', + $repeat, + $tput->get('parm_down_cursor') + ) + ); + + break; + + case 'D': + case 'DOWN': + static::moveTo(null, 9999); + + break; + + case 'l': + case 'left': + case '←': + $output->writeAll( + \str_replace( + '%p1%d', + $repeat, + $tput->get('parm_left_cursor') + ) + ); + + break; + + case 'L': + case 'LEFT': + static::moveTo(1); + + break; + } + } + } + + /** + * Move to the line X and the column Y. + * If null, use the current coordinate. + */ + public static function moveTo(int $x = null, int $y = null) + { + if (null === $x || null === $y) { + $position = static::getPosition(); + + if (null === $x) { + $x = $position['x']; + } + + if (null === $y) { + $y = $position['y']; + } + } + + Console::getOutput()->writeAll( + \str_replace( + ['%i%p1%d', '%p2%d'], + [$y, $x], + Console::getTput()->get('cursor_address') + ) + ); + } + + /** + * Get current position (x and y) of the cursor. + */ + public static function getPosition(): array + { + $tput = Console::getTput(); + $user7 = $tput->get('user7'); + + if (null === $user7) { + return [ + 'x' => 0, + 'y' => 0, + ]; + } + + Console::getOutput()->writeAll($user7); + + $input = Console::getInput(); + + // Read $tput->get('user6'). + $input->read(2); // skip \033 and [. + + $x = null; + $y = null; + $handle = &$y; + + while (true) { + $char = $input->readCharacter(); + + switch ($char) { + case ';': + $handle = &$x; + + break; + + case 'R': + break 2; + + default: + $handle .= $char; + } + } + + return [ + 'x' => (int) $x, + 'y' => (int) $y, + ]; + } + + /** + * Save current position. + */ + public static function save() + { + Console::getOutput()->writeAll( + Console::getTput()->get('save_cursor') + ); + } + + /** + * Restore cursor to the last saved position. + */ + public static function restore() + { + Console::getOutput()->writeAll( + Console::getTput()->get('restore_cursor') + ); + } + + /** + * Clear the screen. + * Part can be: + * • a, all, ↕ : clear entire screen and static::move(1, 1); + * • u, up, ↑ : clear from cursor to beginning of the screen; + * • r, right, → : clear from cursor to the end of the line; + * • d, down, ↓ : clear from cursor to end of the screen; + * • l, left, ← : clear from cursor to beginning of the screen; + * • line, ↔ : clear all the line and static::move(1). + * Parts can be concatenated by a single space. + */ + public static function clear(string $parts = 'all') + { + $tput = Console::getTput(); + $output = Console::getOutput(); + + foreach (\explode(' ', $parts) as $part) { + switch ($part) { + case 'a': + case 'all': + case '↕': + $output->writeAll($tput->get('clear_screen')); + static::moveTo(1, 1); + + break; + + case 'u': + case 'up': + case '↑': + $output->writeAll("\033[1J"); + + break; + + case 'r': + case 'right': + case '→': + $output->writeAll($tput->get('clr_eol')); + + break; + + case 'd': + case 'down': + case '↓': + $output->writeAll($tput->get('clr_eos')); + + break; + + case 'l': + case 'left': + case '←': + $output->writeAll($tput->get('clr_bol')); + + break; + + case 'line': + case '↔': + $output->writeAll("\r".$tput->get('clr_eol')); + + break; + } + } + } + + /** + * Hide the cursor. + */ + public static function hide() + { + Console::getOutput()->writeAll( + Console::getTput()->get('cursor_invisible') + ); + } + + /** + * Show the cursor. + */ + public static function show() + { + Console::getOutput()->writeAll( + Console::getTput()->get('cursor_visible') + ); + } + + /** + * Colorize cursor. + * Attributes can be: + * • n, normal : normal; + * • b, bold : bold; + * • u, underlined : underlined; + * • bl, blink : blink; + * • i, inverse : inverse; + * • !b, !bold : normal weight; + * • !u, !underlined : not underlined; + * • !bl, !blink : steady; + * • !i, !inverse : positive; + * • fg(color), foreground(color) : set foreground to “color”; + * • bg(color), background(color) : set background to “color”. + * “color” can be: + * • default; + * • black; + * • red; + * • green; + * • yellow; + * • blue; + * • magenta; + * • cyan; + * • white; + * • 0-256 (classic palette); + * • #hexa. + * Attributes can be concatenated by a single space. + */ + public static function colorize(string $attributes) + { + static $_rgbTo256 = null; + + if (null === $_rgbTo256) { + $_rgbTo256 = [ + '000000', '800000', '008000', '808000', '000080', '800080', + '008080', 'c0c0c0', '808080', 'ff0000', '00ff00', 'ffff00', + '0000ff', 'ff00ff', '00ffff', 'ffffff', '000000', '00005f', + '000087', '0000af', '0000d7', '0000ff', '005f00', '005f5f', + '005f87', '005faf', '005fd7', '005fff', '008700', '00875f', + '008787', '0087af', '0087d7', '0087ff', '00af00', '00af5f', + '00af87', '00afaf', '00afd7', '00afff', '00d700', '00d75f', + '00d787', '00d7af', '00d7d7', '00d7ff', '00ff00', '00ff5f', + '00ff87', '00ffaf', '00ffd7', '00ffff', '5f0000', '5f005f', + '5f0087', '5f00af', '5f00d7', '5f00ff', '5f5f00', '5f5f5f', + '5f5f87', '5f5faf', '5f5fd7', '5f5fff', '5f8700', '5f875f', + '5f8787', '5f87af', '5f87d7', '5f87ff', '5faf00', '5faf5f', + '5faf87', '5fafaf', '5fafd7', '5fafff', '5fd700', '5fd75f', + '5fd787', '5fd7af', '5fd7d7', '5fd7ff', '5fff00', '5fff5f', + '5fff87', '5fffaf', '5fffd7', '5fffff', '870000', '87005f', + '870087', '8700af', '8700d7', '8700ff', '875f00', '875f5f', + '875f87', '875faf', '875fd7', '875fff', '878700', '87875f', + '878787', '8787af', '8787d7', '8787ff', '87af00', '87af5f', + '87af87', '87afaf', '87afd7', '87afff', '87d700', '87d75f', + '87d787', '87d7af', '87d7d7', '87d7ff', '87ff00', '87ff5f', + '87ff87', '87ffaf', '87ffd7', '87ffff', 'af0000', 'af005f', + 'af0087', 'af00af', 'af00d7', 'af00ff', 'af5f00', 'af5f5f', + 'af5f87', 'af5faf', 'af5fd7', 'af5fff', 'af8700', 'af875f', + 'af8787', 'af87af', 'af87d7', 'af87ff', 'afaf00', 'afaf5f', + 'afaf87', 'afafaf', 'afafd7', 'afafff', 'afd700', 'afd75f', + 'afd787', 'afd7af', 'afd7d7', 'afd7ff', 'afff00', 'afff5f', + 'afff87', 'afffaf', 'afffd7', 'afffff', 'd70000', 'd7005f', + 'd70087', 'd700af', 'd700d7', 'd700ff', 'd75f00', 'd75f5f', + 'd75f87', 'd75faf', 'd75fd7', 'd75fff', 'd78700', 'd7875f', + 'd78787', 'd787af', 'd787d7', 'd787ff', 'd7af00', 'd7af5f', + 'd7af87', 'd7afaf', 'd7afd7', 'd7afff', 'd7d700', 'd7d75f', + 'd7d787', 'd7d7af', 'd7d7d7', 'd7d7ff', 'd7ff00', 'd7ff5f', + 'd7ff87', 'd7ffaf', 'd7ffd7', 'd7ffff', 'ff0000', 'ff005f', + 'ff0087', 'ff00af', 'ff00d7', 'ff00ff', 'ff5f00', 'ff5f5f', + 'ff5f87', 'ff5faf', 'ff5fd7', 'ff5fff', 'ff8700', 'ff875f', + 'ff8787', 'ff87af', 'ff87d7', 'ff87ff', 'ffaf00', 'ffaf5f', + 'ffaf87', 'ffafaf', 'ffafd7', 'ffafff', 'ffd700', 'ffd75f', + 'ffd787', 'ffd7af', 'ffd7d7', 'ffd7ff', 'ffff00', 'ffff5f', + 'ffff87', 'ffffaf', 'ffffd7', 'ffffff', '080808', '121212', + '1c1c1c', '262626', '303030', '3a3a3a', '444444', '4e4e4e', + '585858', '606060', '666666', '767676', '808080', '8a8a8a', + '949494', '9e9e9e', 'a8a8a8', 'b2b2b2', 'bcbcbc', 'c6c6c6', + 'd0d0d0', 'dadada', 'e4e4e4', 'eeeeee', + ]; + } + + $tput = Console::getTput(); + + if (1 >= $tput->count('max_colors')) { + return; + } + + $handle = []; + + foreach (\explode(' ', $attributes) as $attribute) { + switch ($attribute) { + case 'n': + case 'normal': + $handle[] = 0; + + break; + + case 'b': + case 'bold': + $handle[] = 1; + + break; + + case 'u': + case 'underlined': + $handle[] = 4; + + break; + + case 'bl': + case 'blink': + $handle[] = 5; + + break; + + case 'i': + case 'inverse': + $handle[] = 7; + + break; + + case '!b': + case '!bold': + $handle[] = 22; + + break; + + case '!u': + case '!underlined': + $handle[] = 24; + + break; + + case '!bl': + case '!blink': + $handle[] = 25; + + break; + + case '!i': + case '!inverse': + $handle[] = 27; + + break; + + default: + if (0 === \preg_match('#^([^\(]+)\(([^\)]+)\)$#', $attribute, $m)) { + break; + } + + $shift = 0; + + switch ($m[1]) { + case 'fg': + case 'foreground': + $shift = 0; + + break; + + case 'bg': + case 'background': + $shift = 10; + + break; + + default: + break 2; + } + + $_handle = 0; + $_keyword = true; + + switch ($m[2]) { + case 'black': + $_handle = 30; + + break; + + case 'red': + $_handle = 31; + + break; + + case 'green': + $_handle = 32; + + break; + + case 'yellow': + $_handle = 33; + + break; + + case 'blue': + $_handle = 34; + + break; + + case 'magenta': + $_handle = 35; + + break; + + case 'cyan': + $_handle = 36; + + break; + + case 'white': + $_handle = 37; + + break; + + case 'default': + $_handle = 39; + + break; + + default: + $_keyword = false; + + if (256 <= $tput->count('max_colors') && + '#' === $m[2][0]) { + $rgb = \hexdec(\substr($m[2], 1)); + $r = ($rgb >> 16) & 255; + $g = ($rgb >> 8) & 255; + $b = $rgb & 255; + $distance = null; + + foreach ($_rgbTo256 as $i => $_rgb) { + $_rgb = \hexdec($_rgb); + $_r = ($_rgb >> 16) & 255; + $_g = ($_rgb >> 8) & 255; + $_b = $_rgb & 255; + + $d = \sqrt( + ($_r - $r) ** 2 + + ($_g - $g) ** 2 + + ($_b - $b) ** 2 + ); + + if (null === $distance || + $d <= $distance) { + $distance = $d; + $_handle = $i; + } + } + } else { + $_handle = (int) ($m[2]); + } + } + + if (true === $_keyword) { + $handle[] = $_handle + $shift; + } else { + $handle[] = (38 + $shift).';5;'.$_handle; + } + } + } + + Console::getOutput()->writeAll("\033[".\implode(';', $handle).'m'); + + return; + } + + /** + * Change color number to a specific RGB color. + */ + public static function changeColor(int $fromCode, int $toColor) + { + $tput = Console::getTput(); + + if (true !== $tput->has('can_change')) { + return; + } + + $r = ($toColor >> 16) & 255; + $g = ($toColor >> 8) & 255; + $b = $toColor & 255; + + Console::getOutput()->writeAll( + \str_replace( + [ + '%p1%d', + 'rgb:', + '%p2%{255}%*%{1000}%/%2.2X/', + '%p3%{255}%*%{1000}%/%2.2X/', + '%p4%{255}%*%{1000}%/%2.2X', + ], + [ + $fromCode, + '', + \sprintf('%02x', $r), + \sprintf('%02x', $g), + \sprintf('%02x', $b), + ], + $tput->get('initialize_color') + ) + ); + + return; + } + + /** + * Set cursor style. + * Style can be: + * • b, block, ▋: block; + * • u, underline, _: underline; + * • v, vertical, |: vertical. + */ + public static function setStyle(string $style, bool $blink = true) + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + switch ($style) { + case 'b': + case 'block': + case '▋': + $_style = 1; + + break; + + case 'u': + case 'underline': + case '_': + $_style = 2; + + break; + + case 'v': + case 'vertical': + case '|': + $_style = 5; + + break; + } + + if (false === $blink) { + ++$_style; + } + + // Not sure what tput entry we can use here… + Console::getOutput()->writeAll("\033[".$_style.' q'); + + return; + } + + /** + * Make a stupid “bip”. + */ + public static function bip() + { + Console::getOutput()->writeAll( + Console::getTput()->get('bell') + ); + } +} + +/* + * Advanced interaction. + */ +Console::advancedInteraction(); diff --git a/vendor/psy/psysh/src/Readline/Hoa/ConsoleException.php b/vendor/psy/psysh/src/Readline/Hoa/ConsoleException.php new file mode 100644 index 00000000..17e6f607 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ConsoleException.php @@ -0,0 +1,46 @@ +_input = $input; + + return; + } + + /** + * Get underlying stream. + */ + public function getStream(): StreamIn + { + return $this->_input; + } + + /** + * Test for end-of-file. + */ + public function eof(): bool + { + return $this->_input->eof(); + } + + /** + * Read n characters. + */ + public function read(int $length) + { + return $this->_input->read($length); + } + + /** + * Alias of $this->read(). + */ + public function readString(int $length) + { + return $this->_input->readString($length); + } + + /** + * Read a character. + */ + public function readCharacter() + { + return $this->_input->readCharacter(); + } + + /** + * Read a boolean. + */ + public function readBoolean() + { + return $this->_input->readBoolean(); + } + + /** + * Read an integer. + */ + public function readInteger(int $length = 1) + { + return $this->_input->readInteger($length); + } + + /** + * Read a float. + */ + public function readFloat(int $length = 1) + { + return $this->_input->readFloat($length); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + */ + public function readArray($argument = null) + { + return $this->_input->readArray($argument); + } + + /** + * Read a line. + */ + public function readLine() + { + return $this->_input->readLine(); + } + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = 0) + { + return $this->_input->readAll($offset); + } + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format): array + { + return $this->_input->scanf($format); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ConsoleOutput.php b/vendor/psy/psysh/src/Readline/Hoa/ConsoleOutput.php new file mode 100644 index 00000000..ded5ec06 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ConsoleOutput.php @@ -0,0 +1,208 @@ +_output = $output; + + return; + } + + /** + * Get the real output stream. + */ + public function getStream(): StreamOut + { + return $this->_output; + } + + /** + * Write n characters. + */ + public function write(string $string, int $length) + { + if (0 > $length) { + throw new ConsoleException('Length must be greater than 0, given %d.', 0, $length); + } + + $out = \substr($string, 0, $length); + + if (true === $this->isMultiplexerConsidered()) { + if (true === Console::isTmuxRunning()) { + $out = + "\033Ptmux;". + \str_replace("\033", "\033\033", $out). + "\033\\"; + } + + $length = \strlen($out); + } + + if (null === $this->_output) { + echo $out; + } else { + $this->_output->write($out, $length); + } + } + + /** + * Write a string. + */ + public function writeString(string $string) + { + $string = (string) $string; + + return $this->write($string, \strlen($string)); + } + + /** + * Write a character. + */ + public function writeCharacter(string $character) + { + return $this->write((string) $character[0], 1); + } + + /** + * Write a boolean. + */ + public function writeBoolean(bool $boolean) + { + return $this->write(((bool) $boolean) ? '1' : '0', 1); + } + + /** + * Write an integer. + */ + public function writeInteger(int $integer) + { + $integer = (string) (int) $integer; + + return $this->write($integer, \strlen($integer)); + } + + /** + * Write a float. + */ + public function writeFloat(float $float) + { + $float = (string) (float) $float; + + return $this->write($float, \strlen($float)); + } + + /** + * Write an array. + */ + public function writeArray(array $array) + { + $array = \var_export($array, true); + + return $this->write($array, \strlen($array)); + } + + /** + * Write a line. + */ + public function writeLine(string $line) + { + if (false === $n = \strpos($line, "\n")) { + return $this->write($line."\n", \strlen($line) + 1); + } + + ++$n; + + return $this->write(\substr($line, 0, $n), $n); + } + + /** + * Write all, i.e. as much as possible. + */ + public function writeAll(string $string) + { + return $this->write($string ?: '', \strlen($string ?: '')); + } + + /** + * Truncate a stream to a given length. + */ + public function truncate(int $size): bool + { + return false; + } + + /** + * Consider the multiplexer (if running) while writing on the output. + */ + public function considerMultiplexer(bool $consider): bool + { + $old = $this->_considerMultiplexer; + $this->_considerMultiplexer = $consider; + + return $old; + } + + /** + * Check whether the multiplexer must be considered or not. + */ + public function isMultiplexerConsidered(): bool + { + return $this->_considerMultiplexer; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php b/vendor/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php new file mode 100644 index 00000000..69bf1ddb --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ConsoleProcessus.php @@ -0,0 +1,892 @@ + value, or input). + */ + protected $_options = []; + + /** + * Current working directory. + */ + protected $_cwd = null; + + /** + * Environment. + */ + protected $_environment = null; + + /** + * Timeout. + */ + protected $_timeout = 30; + + /** + * Descriptor. + */ + protected $_descriptors = [ + 0 => ['pipe', 'r'], + 1 => ['pipe', 'w'], + 2 => ['pipe', 'w'], + ]; + + /** + * Pipe descriptors of the processus. + */ + protected $_pipes = null; + + /** + * Seekability of pipes. + */ + protected $_seekable = []; + + /** + * Start a processus. + */ + public function __construct( + string $command, + array $options = null, + array $descriptors = null, + string $cwd = null, + array $environment = null, + int $timeout = 30 + ) { + $this->setCommand($command); + + if (null !== $options) { + $this->setOptions($options); + } + + if (null !== $descriptors) { + $this->_descriptors = []; + + foreach ($descriptors as $descriptor => $nature) { + if (isset($this->_descriptors[$descriptor])) { + throw new ConsoleException('Pipe descriptor %d already exists, cannot '.'redefine it.', 0, $descriptor); + } + + $this->_descriptors[$descriptor] = $nature; + } + } + + $this->setCwd($cwd ?: \getcwd()); + + if (null !== $environment) { + $this->setEnvironment($environment); + } + + $this->setTimeout($timeout); + parent::__construct($this->getCommandLine(), null, true); + $this->getListener()->addIds(['input', 'output', 'timeout', 'start', 'stop']); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + $out = @\proc_open( + $streamName, + $this->_descriptors, + $this->_pipes, + $this->getCwd(), + $this->getEnvironment() + ); + + if (false === $out) { + throw new ConsoleException('Something wrong happen when running %s.', 1, $streamName); + } + + return $out; + } + + /** + * Close the current stream. + */ + protected function _close(): bool + { + foreach ($this->_pipes as $pipe) { + @\fclose($pipe); + } + + return (bool) @\proc_close($this->getStream()); + } + + /** + * Run the process and fire events (amongst start, stop, input, output and + * timeout). + * If an event returns false, it will close the current pipe. + * For a simple run without firing events, use the $this->open() method. + */ + public function run() + { + if (false === $this->isOpened()) { + $this->open(); + } else { + $this->_close(); + $this->_setStream($this->_open( + $this->getStreamName(), + $this->getStreamContext() + )); + } + + $this->getListener()->fire('start', new EventBucket()); + + $_read = []; + $_write = []; + $_except = []; + + foreach ($this->_pipes as $p => $pipe) { + switch ($this->_descriptors[$p][1]) { + case 'r': + \stream_set_blocking($pipe, false); + $_write[] = $pipe; + + break; + + case 'w': + case 'a': + \stream_set_blocking($pipe, true); + $_read[] = $pipe; + + break; + } + } + + while (true) { + foreach ($_read as $i => $r) { + if (false === \is_resource($r)) { + unset($_read[$i]); + } + } + + foreach ($_write as $i => $w) { + if (false === \is_resource($w)) { + unset($_write[$i]); + } + } + + foreach ($_except as $i => $e) { + if (false === \is_resource($e)) { + unset($_except[$i]); + } + } + + if (empty($_read) && empty($_write) && empty($_except)) { + break; + } + + $read = $_read; + $write = $_write; + $except = $_except; + $select = \stream_select($read, $write, $except, $this->getTimeout()); + + if (0 === $select) { + $this->getListener()->fire('timeout', new EventBucket()); + + break; + } + + foreach ($read as $i => $_r) { + $pipe = \array_search($_r, $this->_pipes); + $line = $this->readLine($pipe); + + if (false === $line) { + $result = [false]; + } else { + $result = $this->getListener()->fire( + 'output', + new EventBucket([ + 'pipe' => $pipe, + 'line' => $line, + ]) + ); + } + + if (true === \feof($_r) || \in_array(false, $result, true)) { + \fclose($_r); + unset($_read[$i]); + + break; + } + } + + foreach ($write as $j => $_w) { + $result = $this->getListener()->fire( + 'input', + new EventBucket([ + 'pipe' => \array_search($_w, $this->_pipes), + ]) + ); + + if (true === \feof($_w) || \in_array(false, $result, true)) { + \fclose($_w); + unset($_write[$j]); + } + } + + if (empty($_read)) { + break; + } + } + + $this->getListener()->fire('stop', new EventBucket()); + + return; + } + + /** + * Get pipe resource. + */ + protected function getPipe(int $pipe) + { + if (!isset($this->_pipes[$pipe])) { + throw new ConsoleException('Pipe descriptor %d does not exist, cannot read from it.', 2, $pipe); + } + + return $this->_pipes[$pipe]; + } + + /** + * Check if a pipe is seekable or not. + */ + protected function isPipeSeekable(int $pipe): bool + { + if (!isset($this->_seekable[$pipe])) { + $_pipe = $this->getPipe($pipe); + $data = \stream_get_meta_data($_pipe); + $this->_seekable[$pipe] = $data['seekable']; + } + + return $this->_seekable[$pipe]; + } + + /** + * Test for end-of-file. + */ + public function eof(int $pipe = 1): bool + { + return \feof($this->getPipe($pipe)); + } + + /** + * Read n characters. + */ + public function read(int $length, int $pipe = 1) + { + if (0 > $length) { + throw new ConsoleException('Length must be greater than 0, given %d.', 3, $length); + } + + return \fread($this->getPipe($pipe), $length); + } + + /** + * Alias of $this->read(). + */ + public function readString(int $length, int $pipe = 1) + { + return $this->read($length, $pipe); + } + + /** + * Read a character. + */ + public function readCharacter(int $pipe = 1) + { + return \fgetc($this->getPipe($pipe)); + } + + /** + * Read a boolean. + */ + public function readBoolean(int $pipe = 1) + { + return (bool) $this->read(1, $pipe); + } + + /** + * Read an integer. + */ + public function readInteger(int $length = 1, int $pipe = 1) + { + return (int) $this->read($length, $pipe); + } + + /** + * Read a float. + */ + public function readFloat(int $length = 1, int $pipe = 1) + { + return (float) $this->read($length, $pipe); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + */ + public function readArray(string $format = null, int $pipe = 1) + { + return $this->scanf($format, $pipe); + } + + /** + * Read a line. + */ + public function readLine(int $pipe = 1) + { + return \stream_get_line($this->getPipe($pipe), 1 << 15, "\n"); + } + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = -1, int $pipe = 1) + { + $_pipe = $this->getPipe($pipe); + + if (true === $this->isPipeSeekable($pipe)) { + $offset += \ftell($_pipe); + } else { + $offset = -1; + } + + return \stream_get_contents($_pipe, -1, $offset); + } + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format, int $pipe = 1): array + { + return \fscanf($this->getPipe($pipe), $format); + } + + /** + * Write n characters. + */ + public function write(string $string, int $length, int $pipe = 0) + { + if (0 > $length) { + throw new ConsoleException('Length must be greater than 0, given %d.', 4, $length); + } + + return \fwrite($this->getPipe($pipe), $string, $length); + } + + /** + * Write a string. + */ + public function writeString(string $string, int $pipe = 0) + { + $string = (string) $string; + + return $this->write($string, \strlen($string), $pipe); + } + + /** + * Write a character. + */ + public function writeCharacter(string $char, int $pipe = 0) + { + return $this->write((string) $char[0], 1, $pipe); + } + + /** + * Write a boolean. + */ + public function writeBoolean(bool $boolean, int $pipe = 0) + { + return $this->write((string) (bool) $boolean, 1, $pipe); + } + + /** + * Write an integer. + */ + public function writeInteger(int $integer, int $pipe = 0) + { + $integer = (string) (int) $integer; + + return $this->write($integer, \strlen($integer), $pipe); + } + + /** + * Write a float. + */ + public function writeFloat(float $float, int $pipe = 0) + { + $float = (string) (float) $float; + + return $this->write($float, \strlen($float), $pipe); + } + + /** + * Write an array. + */ + public function writeArray(array $array, int $pipe = 0) + { + $array = \var_export($array, true); + + return $this->write($array, \strlen($array), $pipe); + } + + /** + * Write a line. + */ + public function writeLine(string $line, int $pipe = 0) + { + if (false === $n = \strpos($line, "\n")) { + return $this->write($line."\n", \strlen($line) + 1, $pipe); + } + + ++$n; + + return $this->write(\substr($line, 0, $n), $n, $pipe); + } + + /** + * Write all, i.e. as much as possible. + */ + public function writeAll(string $string, int $pipe = 0) + { + return $this->write($string, \strlen($string), $pipe); + } + + /** + * Truncate a file to a given length. + */ + public function truncate(int $size, int $pipe = 0): bool + { + return \ftruncate($this->getPipe($pipe), $size); + } + + /** + * Get filename component of path. + */ + public function getBasename(): string + { + return \basename($this->getCommand()); + } + + /** + * Get directory name component of path. + */ + public function getDirname(): string + { + return \dirname($this->getCommand()); + } + + /** + * Get status. + */ + public function getStatus(): array + { + return \proc_get_status($this->getStream()); + } + + /** + * Get exit code (alias of $this->getStatus()['exitcode']);. + */ + public function getExitCode(): int + { + $handle = $this->getStatus(); + + return $handle['exitcode']; + } + + /** + * Whether the processus have ended successfully. + * + * @return bool + */ + public function isSuccessful(): bool + { + return 0 === $this->getExitCode(); + } + + /** + * Terminate the process. + * + * Valid signals are self::SIGHUP, SIGINT, SIGQUIT, SIGABRT, SIGKILL, + * SIGALRM and SIGTERM. + */ + public function terminate(int $signal = self::SIGTERM): bool + { + return \proc_terminate($this->getStream(), $signal); + } + + /** + * Set command name. + */ + protected function setCommand(string $command) + { + $old = $this->_command; + $this->_command = \escapeshellcmd($command); + + return $old; + } + + /** + * Get command name. + */ + public function getCommand() + { + return $this->_command; + } + + /** + * Set command options. + */ + protected function setOptions(array $options): array + { + foreach ($options as &$option) { + $option = \escapeshellarg($option); + } + + $old = $this->_options; + $this->_options = $options; + + return $old; + } + + /** + * Get options. + */ + public function getOptions(): array + { + return $this->_options; + } + + /** + * Get command-line. + */ + public function getCommandLine(): string + { + $out = $this->getCommand(); + + foreach ($this->getOptions() as $key => $value) { + if (!\is_int($key)) { + $out .= ' '.$key.'='.$value; + } else { + $out .= ' '.$value; + } + } + + return $out; + } + + /** + * Set current working directory of the process. + */ + protected function setCwd(string $cwd) + { + $old = $this->_cwd; + $this->_cwd = $cwd; + + return $old; + } + + /** + * Get current working directory of the process. + */ + public function getCwd(): string + { + return $this->_cwd; + } + + /** + * Set environment of the process. + */ + protected function setEnvironment(array $environment) + { + $old = $this->_environment; + $this->_environment = $environment; + + return $old; + } + + /** + * Get environment of the process. + */ + public function getEnvironment() + { + return $this->_environment; + } + + /** + * Set timeout of the process. + */ + public function setTimeout(int $timeout) + { + $old = $this->_timeout; + $this->_timeout = $timeout; + + return $old; + } + + /** + * Get timeout of the process. + */ + public function getTimeout(): int + { + return $this->_timeout; + } + + /** + * Set process title. + */ + public static function setTitle(string $title) + { + \cli_set_process_title($title); + } + + /** + * Get process title. + */ + public static function getTitle() + { + return \cli_get_process_title(); + } + + /** + * Found the place of a binary. + */ + public static function locate(string $binary) + { + if (isset($_ENV['PATH'])) { + $separator = ':'; + $path = &$_ENV['PATH']; + } elseif (isset($_SERVER['PATH'])) { + $separator = ':'; + $path = &$_SERVER['PATH']; + } elseif (isset($_SERVER['Path'])) { + $separator = ';'; + $path = &$_SERVER['Path']; + } else { + return null; + } + + foreach (\explode($separator, $path) as $directory) { + if (true === \file_exists($out = $directory.\DIRECTORY_SEPARATOR.$binary)) { + return $out; + } + } + + return null; + } + + /** + * Quick process execution. + * Returns only the STDOUT. + */ + public static function execute(string $commandLine, bool $escape = true): string + { + if (true === $escape) { + $commandLine = \escapeshellcmd($commandLine); + } + + return \rtrim(\shell_exec($commandLine) ?? ''); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ConsoleTput.php b/vendor/psy/psysh/src/Readline/Hoa/ConsoleTput.php new file mode 100644 index 00000000..3e9da651 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ConsoleTput.php @@ -0,0 +1,805 @@ +parse($terminfo); + + return; + } + + /** + * Parse. + */ + protected function parse(string $terminfo): array + { + if (!\file_exists($terminfo)) { + throw new ConsoleException('Terminfo file %s does not exist.', 0, $terminfo); + } + + $data = \file_get_contents($terminfo); + $length = \strlen($data); + $out = ['file' => $terminfo]; + + $headers = [ + 'data_size' => $length, + 'header_size' => 12, + 'magic_number' => (\ord($data[1]) << 8) | \ord($data[0]), + 'names_size' => (\ord($data[3]) << 8) | \ord($data[2]), + 'bool_count' => (\ord($data[5]) << 8) | \ord($data[4]), + 'number_count' => (\ord($data[7]) << 8) | \ord($data[6]), + 'string_count' => (\ord($data[9]) << 8) | \ord($data[8]), + 'string_table_size' => (\ord($data[11]) << 8) | \ord($data[10]), + ]; + $out['headers'] = $headers; + + // Names. + $i = $headers['header_size']; + $nameAndDescription = \explode('|', \substr($data, $i, $headers['names_size'] - 1)); + $out['name'] = $nameAndDescription[0]; + $out['description'] = $nameAndDescription[1]; + + // Booleans. + $i += $headers['names_size']; + $booleans = []; + $booleanNames = &static::$_booleans; + + for ( + $e = 0, $max = $i + $headers['bool_count']; + $i < $max; + ++$e, ++$i + ) { + $booleans[$booleanNames[$e]] = 1 === \ord($data[$i]); + } + + $out['booleans'] = $booleans; + + // Numbers. + if (1 === ($i % 2)) { + ++$i; + } + + $numbers = []; + $numberNames = &static::$_numbers; + + for ( + $e = 0, $max = $i + $headers['number_count'] * 2; + $i < $max; + ++$e, $i += 2 + ) { + $name = $numberNames[$e]; + $data_i0 = \ord($data[$i]); + $data_i1 = \ord($data[$i + 1]); + + if ($data_i1 === 255 && $data_i0 === 255) { + $numbers[$name] = -1; + } else { + $numbers[$name] = ($data_i1 << 8) | $data_i0; + } + } + + $out['numbers'] = $numbers; + + // Strings. + $strings = []; + $stringNames = &static::$_strings; + $ii = $i + $headers['string_count'] * 2; + + for ( + $e = 0, $max = $ii; + $i < $max; + ++$e, $i += 2 + ) { + $name = $stringNames[$e]; + $data_i0 = \ord($data[$i]); + $data_i1 = \ord($data[$i + 1]); + + if ($data_i1 === 255 && $data_i0 === 255) { + continue; + } + + $a = ($data_i1 << 8) | $data_i0; + $strings[$name] = $a; + + if (65534 === $a) { + continue; + } + + $b = $ii + $a; + $c = $b; + + while ($c < $length && \ord($data[$c])) { + $c++; + } + + $value = \substr($data, $b, $c - $b); + $strings[$name] = false !== $value ? $value : null; + } + + $out['strings'] = $strings; + + return $this->_informations = $out; + } + + /** + * Get all informations. + */ + public function getInformations(): array + { + return $this->_informations; + } + + /** + * Get a boolean value. + */ + public function has(string $boolean): bool + { + if (!isset($this->_informations['booleans'][$boolean])) { + return false; + } + + return $this->_informations['booleans'][$boolean]; + } + + /** + * Get a number value. + */ + public function count(string $number): int + { + if (!isset($this->_informations['numbers'][$number])) { + return 0; + } + + return $this->_informations['numbers'][$number]; + } + + /** + * Get a string value. + */ + public function get(string $string) + { + if (!isset($this->_informations['strings'][$string])) { + return null; + } + + return $this->_informations['strings'][$string]; + } + + /** + * Get current term profile. + */ + public static function getTerm(): string + { + return + isset($_SERVER['TERM']) && !empty($_SERVER['TERM']) + ? $_SERVER['TERM'] + : (\defined('PHP_WINDOWS_VERSION_PLATFORM') ? 'windows-ansi' : 'xterm'); + } + + /** + * Get pathname to the current terminfo. + */ + public static function getTerminfo($term = null): string + { + $paths = []; + + if (isset($_SERVER['TERMINFO'])) { + $paths[] = $_SERVER['TERMINFO']; + } + + if (isset($_SERVER['HOME'])) { + $paths[] = $_SERVER['HOME'].\DIRECTORY_SEPARATOR.'.terminfo'; + } + + if (isset($_SERVER['TERMINFO_DIRS'])) { + foreach (\explode(':', $_SERVER['TERMINFO_DIRS']) as $path) { + $paths[] = $path; + } + } + + $paths[] = '/usr/share/terminfo'; + $paths[] = '/usr/share/lib/terminfo'; + $paths[] = '/lib/terminfo'; + $paths[] = '/usr/lib/terminfo'; + $paths[] = '/usr/local/share/terminfo'; + $paths[] = '/usr/local/share/lib/terminfo'; + $paths[] = '/usr/local/lib/terminfo'; + $paths[] = '/usr/local/ncurses/lib/terminfo'; + $paths[] = 'hoa://Library/Terminfo'; + + $term = $term ?: static::getTerm(); + $fileHexa = \dechex(\ord($term[0])).\DIRECTORY_SEPARATOR.$term; + $fileAlpha = $term[0].\DIRECTORY_SEPARATOR.$term; + $pathname = null; + + foreach ($paths as $path) { + if (\file_exists($_ = $path.\DIRECTORY_SEPARATOR.$fileHexa) || + \file_exists($_ = $path.\DIRECTORY_SEPARATOR.$fileAlpha)) { + $pathname = $_; + + break; + } + } + + if (null === $pathname && 'xterm' !== $term) { + return static::getTerminfo('xterm'); + } + + return $pathname ?? ''; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ConsoleWindow.php b/vendor/psy/psysh/src/Readline/Hoa/ConsoleWindow.php new file mode 100644 index 00000000..4ebd5cbe --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ConsoleWindow.php @@ -0,0 +1,529 @@ +writeAll("\033[8;".$y.';'.$x.'t'); + + return; + } + + /** + * Get current size (x and y) of the window. + */ + public static function getSize(): array + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + $modecon = \explode("\n", \ltrim(ConsoleProcessus::execute('mode con'))); + + $_y = \trim($modecon[2]); + \preg_match('#[^:]+:\s*([0-9]+)#', $_y, $matches); + $y = (int) $matches[1]; + + $_x = \trim($modecon[3]); + \preg_match('#[^:]+:\s*([0-9]+)#', $_x, $matches); + $x = (int) $matches[1]; + + return [ + 'x' => $x, + 'y' => $y, + ]; + } + + $term = ''; + + if (isset($_SERVER['TERM'])) { + $term = 'TERM="'.$_SERVER['TERM'].'" '; + } + + $command = $term.'tput cols && '.$term.'tput lines'; + $tput = Processus::execute($command, false); + + if (!empty($tput)) { + list($x, $y) = \explode("\n", $tput); + + return [ + 'x' => (int) $x, + 'y' => (int) $y, + ]; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[18t"); + + $input = Console::getInput(); + + // Read \033[8;y;xt. + $input->read(4); // skip \033, [, 8 and ;. + + $x = null; + $y = null; + $handle = &$y; + + while (true) { + $char = $input->readCharacter(); + + switch ($char) { + case ';': + $handle = &$x; + + break; + + case 't': + break 2; + + default: + if (false === \ctype_digit($char)) { + break 2; + } + + $handle .= $char; + } + } + + if (null === $x || null === $y) { + return [ + 'x' => 0, + 'y' => 0, + ]; + } + + return [ + 'x' => (int) $x, + 'y' => (int) $y, + ]; + } + + /** + * Move to X and Y (in pixels). + */ + public static function moveTo(int $x, int $y) + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[3;".$x.';'.$y.'t'); + + return; + } + + /** + * Get current position (x and y) of the window (in pixels). + */ + public static function getPosition(): array + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return ['x' => 0, 'y' => 0]; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[13t"); + + $input = Console::getInput(); + + // Read \033[3;x;yt. + $input->read(4); // skip \033, [, 3 and ;. + + $x = null; + $y = null; + $handle = &$x; + + while (true) { + $char = $input->readCharacter(); + + switch ($char) { + case ';': + $handle = &$y; + + break; + + case 't': + break 2; + + default: + $handle .= $char; + } + } + + return [ + 'x' => (int) $x, + 'y' => (int) $y, + ]; + } + + /** + * Scroll whole page. + * Directions can be: + * • u, up, ↑ : scroll whole page up; + * • d, down, ↓ : scroll whole page down. + * Directions can be concatenated by a single space. + */ + public static function scroll(string $directions, int $repeat = 1) + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + if (1 > $repeat) { + return; + } elseif (1 === $repeat) { + $handle = \explode(' ', $directions); + } else { + $handle = \explode(' ', $directions, 1); + } + + $tput = Console::getTput(); + $count = ['up' => 0, 'down' => 0]; + + foreach ($handle as $direction) { + switch ($direction) { + case 'u': + case 'up': + case '↑': + ++$count['up']; + + break; + + case 'd': + case 'down': + case '↓': + ++$count['down']; + + break; + } + } + + $output = Console::getOutput(); + + if (0 < $count['up']) { + $output->writeAll( + \str_replace( + '%p1%d', + $count['up'] * $repeat, + $tput->get('parm_index') + ) + ); + } + + if (0 < $count['down']) { + $output->writeAll( + \str_replace( + '%p1%d', + $count['down'] * $repeat, + $tput->get('parm_rindex') + ) + ); + } + + return; + } + + /** + * Minimize the window. + */ + public static function minimize() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[2t"); + + return; + } + + /** + * Restore the window (de-minimize). + */ + public static function restore() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + Console::getOutput()->writeAll("\033[1t"); + + return; + } + + /** + * Raise the window to the front of the stacking order. + */ + public static function raise() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + Console::getOutput()->writeAll("\033[5t"); + + return; + } + + /** + * Lower the window to the bottom of the stacking order. + */ + public static function lower() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + Console::getOutput()->writeAll("\033[6t"); + + return; + } + + /** + * Set title. + */ + public static function setTitle(string $title) + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033]0;".$title."\033\\"); + + return; + } + + /** + * Get title. + */ + public static function getTitle() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return null; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[21t"); + + $input = Console::getInput(); + $read = [$input->getStream()->getStream()]; + $write = []; + $except = []; + $out = null; + + if (0 === \stream_select($read, $write, $except, 0, 50000)) { + return $out; + } + + // Read \033]l\033\ + $input->read(3); // skip \033, ] and l. + + while (true) { + $char = $input->readCharacter(); + + if ("\033" === $char) { + $chaar = $input->readCharacter(); + + if ('\\' === $chaar) { + break; + } + + $char .= $chaar; + } + + $out .= $char; + } + + return $out; + } + + /** + * Get label. + */ + public static function getLabel() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return null; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[20t"); + + $input = Console::getInput(); + $read = [$input->getStream()->getStream()]; + $write = []; + $except = []; + $out = null; + + if (0 === \stream_select($read, $write, $except, 0, 50000)) { + return $out; + } + + // Read \033]L<label>\033\ + $input->read(3); // skip \033, ] and L. + + while (true) { + $char = $input->readCharacter(); + + if ("\033" === $char) { + $chaar = $input->readCharacter(); + + if ('\\' === $chaar) { + break; + } + + $char .= $chaar; + } + + $out .= $char; + } + + return $out; + } + + /** + * Refresh the window. + */ + public static function refresh() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + // DECSLPP. + Console::getOutput()->writeAll("\033[7t"); + + return; + } + + /** + * Set clipboard value. + */ + public static function copy(string $data) + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + $out = "\033]52;;".\base64_encode($data)."\033\\"; + $output = Console::getOutput(); + $considerMultiplexer = $output->considerMultiplexer(true); + + $output->writeAll($out); + $output->considerMultiplexer($considerMultiplexer); + + return; + } +} + +/* + * Advanced interaction. + */ +Console::advancedInteraction(); + +/* + * Event. + */ +if (\function_exists('pcntl_signal')) { + ConsoleWindow::getInstance(); + \pcntl_signal( + \SIGWINCH, + function () { + static $_window = null; + + if (null === $_window) { + $_window = ConsoleWindow::getInstance(); + } + + Event::notify( + 'hoa://Event/Console/Window:resize', + $_window, + new EventBucket([ + 'size' => ConsoleWindow::getSize(), + ]) + ); + } + ); +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Event.php b/vendor/psy/psysh/src/Readline/Hoa/Event.php new file mode 100644 index 00000000..bb08f328 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Event.php @@ -0,0 +1,193 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Events are asynchronous at registration, anonymous at use (until we + * receive a bucket) and useful to largely spread data through components + * without any known connection between them. + */ +class Event +{ + /** + * Event ID key. + */ + const KEY_EVENT = 0; + + /** + * Source object key. + */ + const KEY_SOURCE = 1; + + /** + * Static register of all observable objects, i.e. `Hoa\Event\Source` + * object, i.e. object that can send event. + */ + private static $_register = []; + + /** + * Collection of callables, i.e. observer objects. + */ + protected $_callable = []; + + /** + * Privatize the constructor. + */ + private function __construct() + { + return; + } + + /** + * Manage multiton of events, with the principle of asynchronous + * attachments. + */ + public static function getEvent(string $eventId): self + { + if (!isset(self::$_register[$eventId][self::KEY_EVENT])) { + self::$_register[$eventId] = [ + self::KEY_EVENT => new self(), + self::KEY_SOURCE => null, + ]; + } + + return self::$_register[$eventId][self::KEY_EVENT]; + } + + /** + * Declares a new object in the observable collection. + * Note: Hoa's libraries use `hoa://Event/anID` for their observable objects. + */ + public static function register(string $eventId, /* Source|string */ $source) + { + if (true === self::eventExists($eventId)) { + throw new EventException('Cannot redeclare an event with the same ID, i.e. the event '.'ID %s already exists.', 0, $eventId); + } + + if (\is_object($source) && !($source instanceof EventSource)) { + throw new EventException('The source must implement \Hoa\Event\Source '.'interface; given %s.', 1, \get_class($source)); + } else { + $reflection = new \ReflectionClass($source); + + if (false === $reflection->implementsInterface('\Psy\Readline\Hoa\EventSource')) { + throw new EventException('The source must implement \Hoa\Event\Source '.'interface; given %s.', 2, $source); + } + } + + if (!isset(self::$_register[$eventId][self::KEY_EVENT])) { + self::$_register[$eventId][self::KEY_EVENT] = new self(); + } + + self::$_register[$eventId][self::KEY_SOURCE] = $source; + } + + /** + * Undeclares an object in the observable collection. + * + * If `$hard` is set to `true, then the source and its attached callables + * will be deleted. + */ + public static function unregister(string $eventId, bool $hard = false) + { + if (false !== $hard) { + unset(self::$_register[$eventId]); + } else { + self::$_register[$eventId][self::KEY_SOURCE] = null; + } + } + + /** + * Attach an object to an event. + * + * It can be a callable or an accepted callable form (please, see the + * `Hoa\Consistency\Xcallable` class). + */ + public function attach($callable): self + { + $callable = Xcallable::from($callable); + $this->_callable[$callable->getHash()] = $callable; + + return $this; + } + + /** + * Detaches an object to an event. + * + * Please see `self::attach` method. + */ + public function detach($callable): self + { + unset($this->_callable[Xcallable::from($callable)->getHash()]); + + return $this; + } + + /** + * Checks if at least one callable is attached to an event. + */ + public function isListened(): bool + { + return !empty($this->_callable); + } + + /** + * Notifies, i.e. send data to observers. + */ + public static function notify(string $eventId, EventSource $source, EventBucket $data) + { + if (false === self::eventExists($eventId)) { + throw new EventException('Event ID %s does not exist, cannot send notification.', 3, $eventId); + } + + $data->setSource($source); + $event = self::getEvent($eventId); + + foreach ($event->_callable as $callable) { + $callable($data); + } + } + + /** + * Checks whether an event exists. + */ + public static function eventExists(string $eventId): bool + { + return + \array_key_exists($eventId, self::$_register) && + self::$_register[$eventId][self::KEY_SOURCE] !== null; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventBucket.php b/vendor/psy/psysh/src/Readline/Hoa/EventBucket.php new file mode 100644 index 00000000..37d3ca15 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventBucket.php @@ -0,0 +1,109 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * This class is the object which is transmit through event channels. + */ +class EventBucket +{ + /** + * The source object (must be of kind `Hoa\Event\Source`). + */ + protected $_source = null; + + /** + * Data attached to the bucket. + */ + protected $_data = null; + + /** + * Allocates a new bucket with various data attached to it. + */ + public function __construct($data = null) + { + $this->setData($data); + + return; + } + + /** + * Sends this object on the event channel. + */ + public function send(string $eventId, EventSource $source) + { + return Event::notify($eventId, $source, $this); + } + + /** + * Sets a new source. + */ + public function setSource(EventSource $source) + { + $old = $this->_source; + $this->_source = $source; + + return $old; + } + + /** + * Returns the source. + */ + public function getSource() + { + return $this->_source; + } + + /** + * Sets new data. + */ + public function setData($data) + { + $old = $this->_data; + $this->_data = $data; + + return $old; + } + + /** + * Returns the data. + */ + public function getData() + { + return $this->_data; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventException.php b/vendor/psy/psysh/src/Readline/Hoa/EventException.php new file mode 100644 index 00000000..9517d9c9 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventException.php @@ -0,0 +1,44 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Extending the `Hoa\Exception\Exception` class. + */ +class EventException extends Exception +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventListenable.php b/vendor/psy/psysh/src/Readline/Hoa/EventListenable.php new file mode 100644 index 00000000..cefd3e6a --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventListenable.php @@ -0,0 +1,48 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Each object which is listenable must implement this interface. + */ +interface EventListenable extends EventSource +{ + /** + * Attaches a callable to a listenable component. + */ + public function on(string $listenerId, $callable): self; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventListener.php b/vendor/psy/psysh/src/Readline/Hoa/EventListener.php new file mode 100644 index 00000000..8e877e61 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventListener.php @@ -0,0 +1,137 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * A contrario of events, listeners are synchronous, identified at use and + * useful for close interactions between one or some components. + */ +class EventListener +{ + /** + * Source of listener (for `Hoa\Event\Bucket`). + */ + protected $_source = null; + + /** + * All listener IDs and associated listeners. + */ + protected $_callables = []; + + /** + * Build a listener. + */ + public function __construct(EventListenable $source, array $ids) + { + $this->_source = $source; + $this->addIds($ids); + + return; + } + + /** + * Adds acceptable ID (or reset). + */ + public function addIds(array $ids) + { + foreach ($ids as $id) { + $this->_callables[$id] = []; + } + } + + /** + * Attaches a callable to a listenable component. + */ + public function attach(string $listenerId, $callable): self + { + if (false === $this->listenerExists($listenerId)) { + throw new EventException('Cannot listen %s because it is not defined.', 0, $listenerId); + } + + $callable = Xcallable::from($callable); + $this->_callables[$listenerId][$callable->getHash()] = $callable; + + return $this; + } + + /** + * Detaches a callable from a listenable component. + */ + public function detach(string $listenerId, $callable): self + { + unset($this->_callables[$listenerId][Xcallable::from($callable)->getHash()]); + + return $this; + } + + /** + * Detaches all callables from a listenable component. + */ + public function detachAll(string $listenerId): self + { + unset($this->_callables[$listenerId]); + + return $this; + } + + /** + * Checks if a listener exists. + */ + public function listenerExists(string $listenerId): bool + { + return \array_key_exists($listenerId, $this->_callables); + } + + /** + * Sends/fires a bucket to a listener. + */ + public function fire(string $listenerId, EventBucket $data): array + { + if (false === $this->listenerExists($listenerId)) { + throw new EventException('Cannot fire on %s because it is not defined.', 1, $listenerId); + } + + $data->setSource($this->_source); + $out = []; + + foreach ($this->_callables[$listenerId] as $callable) { + $out[] = $callable($data); + } + + return $out; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventListens.php b/vendor/psy/psysh/src/Readline/Hoa/EventListens.php new file mode 100644 index 00000000..41f1172b --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventListens.php @@ -0,0 +1,83 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Implementation of a listener. + */ +trait EventListens +{ + /** + * Listener instance of type `Hoa\Event\Listener`. + */ + protected $_listener = null; + + /** + * Attaches a callable to a listenable component. + */ + public function on(string $listenerId, $callable): EventListenable + { + $listener = $this->getListener(); + + if (null === $listener) { + throw new EventException('Cannot attach a callable to the listener %s because '.'it has not been initialized yet.', 0, static::class); + } + + $listener->attach($listenerId, $callable); + + return $this; + } + + /** + * Sets a new listener. + */ + protected function setListener(EventListener $listener) + { + $old = $this->_listener; + $this->_listener = $listener; + + return $old; + } + + /** + * Returns the listener. + */ + protected function getListener() + { + return $this->_listener; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/EventSource.php b/vendor/psy/psysh/src/Readline/Hoa/EventSource.php new file mode 100644 index 00000000..3a495d4b --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/EventSource.php @@ -0,0 +1,44 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Each object which is listenable must implement this interface. + */ +interface EventSource +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Exception.php b/vendor/psy/psysh/src/Readline/Hoa/Exception.php new file mode 100644 index 00000000..e0b8bc8c --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Exception.php @@ -0,0 +1,79 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Each exception must extend `Hoa\Exception\Exception`. + */ +class Exception extends ExceptionIdle implements EventSource +{ + /** + * Allocates a new exception. + * + * An exception is built with a formatted message, a code (an ID), and an + * array that contains the list of formatted string for the message. If + * chaining, a previous exception can be added. + */ + public function __construct( + string $message, + int $code = 0, + $arguments = [], + \Throwable $previous = null + ) { + parent::__construct($message, $code, $arguments, $previous); + + if (false === Event::eventExists('hoa://Event/Exception')) { + Event::register('hoa://Event/Exception', __CLASS__); + } + + $this->send(); + + return; + } + + /** + * Sends the exception on `hoa://Event/Exception`. + */ + public function send() + { + Event::notify( + 'hoa://Event/Exception', + $this, + new EventBucket($this) + ); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ExceptionIdle.php b/vendor/psy/psysh/src/Readline/Hoa/ExceptionIdle.php new file mode 100644 index 00000000..1d44c435 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ExceptionIdle.php @@ -0,0 +1,267 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * `Hoa\Exception\Idle` is the mother exception class of libraries. The only + * difference between `Hoa\Exception\Idle` and its direct children + * `Hoa\Exception` is that the latter fires events after beeing constructed. + */ +class ExceptionIdle extends \Exception +{ + /** + * Delay processing on arguments. + */ + protected $_tmpArguments = null; + + /** + * List of arguments to format message. + */ + protected $_arguments = null; + + /** + * Backtrace. + */ + protected $_trace = null; + + /** + * Previous exception if any. + */ + protected $_previous = null; + + /** + * Original exception message. + */ + protected $_rawMessage = null; + + /** + * Allocates a new exception. + * + * An exception is built with a formatted message, a code (an ID) and an + * array that contains the list of formatted strings for the message. If + * chaining, we can add a previous exception. + */ + public function __construct( + string $message, + int $code = 0, + $arguments = [], + \Exception $previous = null + ) { + $this->_tmpArguments = $arguments; + parent::__construct($message, $code, $previous); + $this->_rawMessage = $message; + $this->message = @\vsprintf($message, $this->getArguments()); + + return; + } + + /** + * Returns the backtrace. + * + * Do not use `Exception::getTrace` any more. + */ + public function getBacktrace() + { + if (null === $this->_trace) { + $this->_trace = $this->getTrace(); + } + + return $this->_trace; + } + + /** + * Returns the previous exception if any. + * + * Do not use `Exception::getPrevious` any more. + */ + public function getPreviousThrow() + { + if (null === $this->_previous) { + $this->_previous = $this->getPrevious(); + } + + return $this->_previous; + } + + /** + * Returns the arguments of the message. + */ + public function getArguments() + { + if (null === $this->_arguments) { + $arguments = $this->_tmpArguments; + + if (!\is_array($arguments)) { + $arguments = [$arguments]; + } + + foreach ($arguments as &$value) { + if (null === $value) { + $value = '(null)'; + } + } + + $this->_arguments = $arguments; + unset($this->_tmpArguments); + } + + return $this->_arguments; + } + + /** + * Returns the raw message. + */ + public function getRawMessage(): string + { + return $this->_rawMessage; + } + + /** + * Returns the message already formatted. + */ + public function getFormattedMessage(): string + { + return $this->getMessage(); + } + + /** + * Returns the source of the exception (class, method, function, main etc.). + */ + public function getFrom(): string + { + $trace = $this->getBacktrace(); + $from = '{main}'; + + if (!empty($trace)) { + $t = $trace[0]; + $from = ''; + + if (isset($t['class'])) { + $from .= $t['class'].'::'; + } + + if (isset($t['function'])) { + $from .= $t['function'].'()'; + } + } + + return $from; + } + + /** + * Raises an exception as a string. + */ + public function raise(bool $includePrevious = false): string + { + $message = $this->getFormattedMessage(); + $trace = $this->getBacktrace(); + $file = '/dev/null'; + $line = -1; + $pre = $this->getFrom(); + + if (!empty($trace)) { + $file = $trace['file'] ?? null; + $line = $trace['line'] ?? null; + } + + $pre .= ': '; + + try { + $out = + $pre.'('.$this->getCode().') '.$message."\n". + 'in '.$this->getFile().' at line '. + $this->getLine().'.'; + } catch (\Exception $e) { + $out = + $pre.'('.$this->getCode().') '.$message."\n". + 'in '.$file.' around line '.$line.'.'; + } + + if (true === $includePrevious && + null !== $previous = $this->getPreviousThrow()) { + $out .= + "\n\n".' ⬇'."\n\n". + 'Nested exception ('.\get_class($previous).'):'."\n". + ($previous instanceof self + ? $previous->raise(true) + : $previous->getMessage()); + } + + return $out; + } + + /** + * Catches uncaught exception (only `Hoa\Exception\Idle` and children). + */ + public static function uncaught(\Throwable $exception) + { + if (!($exception instanceof self)) { + throw $exception; + } + + while (0 < \ob_get_level()) { + \ob_end_flush(); + } + + echo 'Uncaught exception ('.\get_class($exception).'):'."\n". + $exception->raise(true); + } + + /** + * String representation of object. + */ + public function __toString(): string + { + return $this->raise(); + } + + /** + * Enables uncaught exception handler. + * + * This is restricted to Hoa's exceptions only. + */ + public static function enableUncaughtHandler(bool $enable = true) + { + if (false === $enable) { + return \restore_exception_handler(); + } + + return \set_exception_handler(function ($exception) { + return self::uncaught($exception); + }); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/File.php b/vendor/psy/psysh/src/Readline/Hoa/File.php new file mode 100644 index 00000000..bdfd9478 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/File.php @@ -0,0 +1,278 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File. + * + * File handler. + */ +abstract class File extends FileGeneric implements StreamBufferable, StreamLockable, StreamPointable +{ + /** + * Open for reading only; place the file pointer at the beginning of the + * file. + */ + const MODE_READ = 'rb'; + + /** + * Open for reading and writing; place the file pointer at the beginning of + * the file. + */ + const MODE_READ_WRITE = 'r+b'; + + /** + * Open for writing only; place the file pointer at the beginning of the + * file and truncate the file to zero length. If the file does not exist, + * attempt to create it. + */ + const MODE_TRUNCATE_WRITE = 'wb'; + + /** + * Open for reading and writing; place the file pointer at the beginning of + * the file and truncate the file to zero length. If the file does not + * exist, attempt to create it. + */ + const MODE_TRUNCATE_READ_WRITE = 'w+b'; + + /** + * Open for writing only; place the file pointer at the end of the file. If + * the file does not exist, attempt to create it. + */ + const MODE_APPEND_WRITE = 'ab'; + + /** + * Open for reading and writing; place the file pointer at the end of the + * file. If the file does not exist, attempt to create it. + */ + const MODE_APPEND_READ_WRITE = 'a+b'; + + /** + * Create and open for writing only; place the file pointer at the beginning + * of the file. If the file already exits, the fopen() call with fail by + * returning false and generating an error of level E_WARNING. If the file + * does not exist, attempt to create it. This is equivalent to specifying + * O_EXCL | O_CREAT flags for the underlying open(2) system call. + */ + const MODE_CREATE_WRITE = 'xb'; + + /** + * Create and open for reading and writing; place the file pointer at the + * beginning of the file. If the file already exists, the fopen() call with + * fail by returning false and generating an error of level E_WARNING. If + * the file does not exist, attempt to create it. This is equivalent to + * specifying O_EXCL | O_CREAT flags for the underlying open(2) system call. + */ + const MODE_CREATE_READ_WRITE = 'x+b'; + + /** + * Open a file. + */ + public function __construct( + string $streamName, + string $mode, + string $context = null, + bool $wait = false + ) { + $this->setMode($mode); + + switch ($streamName) { + case '0': + $streamName = 'php://stdin'; + + break; + + case '1': + $streamName = 'php://stdout'; + + break; + + case '2': + $streamName = 'php://stderr'; + + break; + + default: + if (true === \ctype_digit($streamName)) { + if (\PHP_VERSION_ID >= 50306) { + $streamName = 'php://fd/'.$streamName; + } else { + throw new FileException('You need PHP5.3.6 to use a file descriptor '.'other than 0, 1 or 2 (tried %d with PHP%s).', 0, [$streamName, \PHP_VERSION]); + } + } + } + + parent::__construct($streamName, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + if (\substr($streamName, 0, 4) === 'file' && + false === \is_dir(\dirname($streamName))) { + throw new FileException('Directory %s does not exist. Could not open file %s.', 1, [\dirname($streamName), \basename($streamName)]); + } + + if (null === $context) { + if (false === $out = @\fopen($streamName, $this->getMode(), true)) { + throw new FileException('Failed to open stream %s.', 2, $streamName); + } + + return $out; + } + + $out = @\fopen( + $streamName, + $this->getMode(), + true, + $context->getContext() + ); + + if (false === $out) { + throw new FileException('Failed to open stream %s.', 3, $streamName); + } + + return $out; + } + + /** + * Close the current stream. + */ + protected function _close(): bool + { + return @\fclose($this->getStream()); + } + + /** + * Start a new buffer. + * The callable acts like a light filter. + */ + public function newBuffer($callable = null, int $size = null): int + { + $this->setStreamBuffer($size); + + // @TODO manage $callable as a filter? + + return 1; + } + + /** + * Flush the output to a stream. + */ + public function flush(): bool + { + return \fflush($this->getStream()); + } + + /** + * Delete buffer. + */ + public function deleteBuffer(): bool + { + return $this->disableStreamBuffer(); + } + + /** + * Get bufffer level. + */ + public function getBufferLevel(): int + { + return 1; + } + + /** + * Get buffer size. + */ + public function getBufferSize(): int + { + return $this->getStreamBufferSize(); + } + + /** + * Portable advisory locking. + */ + public function lock(int $operation): bool + { + return \flock($this->getStream(), $operation); + } + + /** + * Rewind the position of a stream pointer. + */ + public function rewind(): bool + { + return \rewind($this->getStream()); + } + + /** + * Seek on a stream pointer. + */ + public function seek(int $offset, int $whence = StreamPointable::SEEK_SET): int + { + return \fseek($this->getStream(), $offset, $whence); + } + + /** + * Get the current position of the stream pointer. + */ + public function tell(): int + { + $stream = $this->getStream(); + + if (null === $stream) { + return 0; + } + + return \ftell($stream); + } + + /** + * Create a file. + */ + public static function create(string $name) + { + if (\file_exists($name)) { + return true; + } + + return \touch($name); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileDirectory.php b/vendor/psy/psysh/src/Readline/Hoa/FileDirectory.php new file mode 100644 index 00000000..e7191410 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileDirectory.php @@ -0,0 +1,221 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Directory. + * + * Directory handler. + */ +class FileDirectory extends FileGeneric +{ + /** + * Open for reading. + */ + const MODE_READ = 'rb'; + + /** + * Open for reading and writing. If the directory does not exist, attempt to + * create it. + */ + const MODE_CREATE = 'xb'; + + /** + * Open for reading and writing. If the directory does not exist, attempt to + * create it recursively. + */ + const MODE_CREATE_RECURSIVE = 'xrb'; + + /** + * Open a directory. + */ + public function __construct( + string $streamName, + string $mode = self::MODE_READ, + string $context = null, + bool $wait = false + ) { + $this->setMode($mode); + parent::__construct($streamName, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + if (false === \is_dir($streamName)) { + if ($this->getMode() === self::MODE_READ) { + throw new FileDoesNotExistException('Directory %s does not exist.', 0, $streamName); + } else { + self::create( + $streamName, + $this->getMode(), + null !== $context + ? $context->getContext() + : null + ); + } + } + + $out = null; + + return $out; + } + + /** + * Close the current stream. + */ + protected function _close(): bool + { + return true; + } + + /** + * Recursive copy of a directory. + */ + public function copy(string $to, bool $force = StreamTouchable::DO_NOT_OVERWRITE): bool + { + if (empty($to)) { + throw new FileException('The destination path (to copy) is empty.', 1); + } + + $from = $this->getStreamName(); + $fromLength = \strlen($from) + 1; + $finder = new FileFinder(); + $finder->in($from); + + self::create($to, self::MODE_CREATE_RECURSIVE); + + foreach ($finder as $file) { + $relative = \substr($file->getPathname(), $fromLength); + $_to = $to.\DIRECTORY_SEPARATOR.$relative; + + if (true === $file->isDir()) { + self::create($_to, self::MODE_CREATE); + + continue; + } + + // This is not possible to do `$file->open()->copy(); + // $file->close();` because the file will be opened in read and + // write mode. In a PHAR for instance, this operation is + // forbidden. So a special care must be taken to open file in read + // only mode. + $handle = null; + + if (true === $file->isFile()) { + $handle = new FileRead($file->getPathname()); + } elseif (true === $file->isDir()) { + $handle = new self($file->getPathName()); + } elseif (true === $file->isLink()) { + $handle = new FileLinkRead($file->getPathName()); + } + + if (null !== $handle) { + $handle->copy($_to, $force); + $handle->close(); + } + } + + return true; + } + + /** + * Delete a directory. + */ + public function delete(): bool + { + $from = $this->getStreamName(); + $finder = new FileFinder(); + $finder->in($from) + ->childFirst(); + + foreach ($finder as $file) { + $file->open()->delete(); + $file->close(); + } + + if (null === $this->getStreamContext()) { + return @\rmdir($from); + } + + return @\rmdir($from, $this->getStreamContext()->getContext()); + } + + /** + * Create a directory. + */ + public static function create( + string $name, + string $mode = self::MODE_CREATE_RECURSIVE, + string $context = null + ): bool { + if (true === \is_dir($name)) { + return true; + } + + if (empty($name)) { + return false; + } + + if (null !== $context) { + if (false === StreamContext::contextExists($context)) { + throw new FileException('Context %s was not previously declared, cannot retrieve '.'this context.', 2, $context); + } else { + $context = StreamContext::getInstance($context); + } + } + + if (null === $context) { + return @\mkdir( + $name, + 0755, + self::MODE_CREATE_RECURSIVE === $mode + ); + } + + return @\mkdir( + $name, + 0755, + self::MODE_CREATE_RECURSIVE === $mode, + $context->getContext() + ); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php b/vendor/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php new file mode 100644 index 00000000..81599a5d --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileDoesNotExistException.php @@ -0,0 +1,48 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Exception\FileDoesNotExist. + * + * Extending the \Hoa\File\Exception class. + * + * @license New BSD License + */ +class FileDoesNotExistException extends FileException +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileException.php b/vendor/psy/psysh/src/Readline/Hoa/FileException.php new file mode 100644 index 00000000..0e224c25 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileException.php @@ -0,0 +1,48 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Exception. + * + * Extending the \Hoa\Exception\Exception class. + * + * @license New BSD License + */ +class FileException extends Exception +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileFinder.php b/vendor/psy/psysh/src/Readline/Hoa/FileFinder.php new file mode 100644 index 00000000..4e7677d7 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileFinder.php @@ -0,0 +1,658 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Finder. + * + * This class allows to find files easily by using filters and flags. + */ +class FileFinder implements \IteratorAggregate +{ + /** + * SplFileInfo classname. + */ + protected $_splFileInfo = SplFileInfo::class; + + /** + * Paths where to look for. + */ + protected $_paths = []; + + /** + * Max depth in recursion. + */ + protected $_maxDepth = -1; + + /** + * Filters. + */ + protected $_filters = []; + + /** + * Flags. + */ + protected $_flags = -1; + + /** + * Types of files to handle. + */ + protected $_types = []; + + /** + * What comes first: parent or child? + */ + protected $_first = -1; + + /** + * Sorts. + */ + protected $_sorts = []; + + /** + * Initialize. + */ + public function __construct() + { + $this->_flags = IteratorFileSystem::KEY_AS_PATHNAME + | IteratorFileSystem::CURRENT_AS_FILEINFO + | IteratorFileSystem::SKIP_DOTS; + $this->_first = \RecursiveIteratorIterator::SELF_FIRST; + + return; + } + + /** + * Select a directory to scan. + */ + public function in($paths): self + { + if (!\is_array($paths)) { + $paths = [$paths]; + } + + foreach ($paths as $path) { + if (1 === \preg_match('/[\*\?\[\]]/', $path)) { + $iterator = new \CallbackFilterIterator( + new \GlobIterator(\rtrim($path, \DIRECTORY_SEPARATOR)), + function ($current) { + return $current->isDir(); + } + ); + + foreach ($iterator as $fileInfo) { + $this->_paths[] = $fileInfo->getPathname(); + } + } else { + $this->_paths[] = $path; + } + } + + return $this; + } + + /** + * Set max depth for recursion. + */ + public function maxDepth(int $depth): self + { + $this->_maxDepth = $depth; + + return $this; + } + + /** + * Include files in the result. + */ + public function files(): self + { + $this->_types[] = 'file'; + + return $this; + } + + /** + * Include directories in the result. + */ + public function directories(): self + { + $this->_types[] = 'dir'; + + return $this; + } + + /** + * Include links in the result. + */ + public function links(): self + { + $this->_types[] = 'link'; + + return $this; + } + + /** + * Follow symbolink links. + */ + public function followSymlinks(bool $flag = true): self + { + if (true === $flag) { + $this->_flags ^= IteratorFileSystem::FOLLOW_SYMLINKS; + } else { + $this->_flags |= IteratorFileSystem::FOLLOW_SYMLINKS; + } + + return $this; + } + + /** + * Include files that match a regex. + * Example: + * $this->name('#\.php$#');. + */ + public function name(string $regex): self + { + $this->_filters[] = function (\SplFileInfo $current) use ($regex) { + return 0 !== \preg_match($regex, $current->getBasename()); + }; + + return $this; + } + + /** + * Exclude directories that match a regex. + * Example: + * $this->notIn('#^\.(git|hg)$#');. + */ + public function notIn(string $regex): self + { + $this->_filters[] = function (\SplFileInfo $current) use ($regex) { + foreach (\explode(\DIRECTORY_SEPARATOR, $current->getPathname()) as $part) { + if (0 !== \preg_match($regex, $part)) { + return false; + } + } + + return true; + }; + + return $this; + } + + /** + * Include files that respect a certain size. + * The size is a string of the form: + * operator number unit + * where + * • operator could be: <, <=, >, >= or =; + * • number is a positive integer; + * • unit could be: b (default), Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb. + * Example: + * $this->size('>= 12Kb');. + */ + public function size(string $size): self + { + if (0 === \preg_match('#^(<|<=|>|>=|=)\s*(\d+)\s*((?:[KMGTPEZY])b)?$#', $size, $matches)) { + return $this; + } + + $number = (float) ($matches[2]); + $unit = $matches[3] ?? 'b'; + $operator = $matches[1]; + + switch ($unit) { + case 'b': + break; + + // kilo + case 'Kb': + $number <<= 10; + + break; + + // mega. + case 'Mb': + $number <<= 20; + + break; + + // giga. + case 'Gb': + $number <<= 30; + + break; + + // tera. + case 'Tb': + $number *= 1099511627776; + + break; + + // peta. + case 'Pb': + $number *= 1024 ** 5; + + break; + + // exa. + case 'Eb': + $number *= 1024 ** 6; + + break; + + // zetta. + case 'Zb': + $number *= 1024 ** 7; + + break; + + // yota. + case 'Yb': + $number *= 1024 ** 8; + + break; + } + + $filter = null; + + switch ($operator) { + case '<': + $filter = function (\SplFileInfo $current) use ($number) { + return $current->getSize() < $number; + }; + + break; + + case '<=': + $filter = function (\SplFileInfo $current) use ($number) { + return $current->getSize() <= $number; + }; + + break; + + case '>': + $filter = function (\SplFileInfo $current) use ($number) { + return $current->getSize() > $number; + }; + + break; + + case '>=': + $filter = function (\SplFileInfo $current) use ($number) { + return $current->getSize() >= $number; + }; + + break; + + case '=': + $filter = function (\SplFileInfo $current) use ($number) { + return $current->getSize() === $number; + }; + + break; + } + + $this->_filters[] = $filter; + + return $this; + } + + /** + * Whether we should include dots or not (respectively . and ..). + */ + public function dots(bool $flag = true): self + { + if (true === $flag) { + $this->_flags ^= IteratorFileSystem::SKIP_DOTS; + } else { + $this->_flags |= IteratorFileSystem::SKIP_DOTS; + } + + return $this; + } + + /** + * Include files that are owned by a certain owner. + */ + public function owner(int $owner): self + { + $this->_filters[] = function (\SplFileInfo $current) use ($owner) { + return $current->getOwner() === $owner; + }; + + return $this; + } + + /** + * Format date. + * Date can have the following syntax: + * date + * since date + * until date + * If the date does not have the “ago” keyword, it will be added. + * Example: “42 hours” is equivalent to “since 42 hours” which is equivalent + * to “since 42 hours ago”. + */ + protected function formatDate(string $date, &$operator): int + { + $operator = -1; + + if (0 === \preg_match('#\bago\b#', $date)) { + $date .= ' ago'; + } + + if (0 !== \preg_match('#^(since|until)\b(.+)$#', $date, $matches)) { + $time = \strtotime($matches[2]); + + if ('until' === $matches[1]) { + $operator = 1; + } + } else { + $time = \strtotime($date); + } + + return $time; + } + + /** + * Include files that have been changed from a certain date. + * Example: + * $this->changed('since 13 days');. + */ + public function changed(string $date): self + { + $time = $this->formatDate($date, $operator); + + if (-1 === $operator) { + $this->_filters[] = function (\SplFileInfo $current) use ($time) { + return $current->getCTime() >= $time; + }; + } else { + $this->_filters[] = function (\SplFileInfo $current) use ($time) { + return $current->getCTime() < $time; + }; + } + + return $this; + } + + /** + * Include files that have been modified from a certain date. + * Example: + * $this->modified('since 13 days');. + */ + public function modified(string $date): self + { + $time = $this->formatDate($date, $operator); + + if (-1 === $operator) { + $this->_filters[] = function (\SplFileInfo $current) use ($time) { + return $current->getMTime() >= $time; + }; + } else { + $this->_filters[] = function (\SplFileInfo $current) use ($time) { + return $current->getMTime() < $time; + }; + } + + return $this; + } + + /** + * Add your own filter. + * The callback will receive 3 arguments: $current, $key and $iterator. It + * must return a boolean: true to include the file, false to exclude it. + * Example: + * // Include files that are readable + * $this->filter(function ($current) { + * return $current->isReadable(); + * });. + */ + public function filter($callback): self + { + $this->_filters[] = $callback; + + return $this; + } + + /** + * Sort result by name. + * If \Collator exists (from ext/intl), the $locale argument will be used + * for its constructor. Else, strcmp() will be used. + * Example: + * $this->sortByName('fr_FR');. + */ + public function sortByName(string $locale = 'root'): self + { + if (true === \class_exists('Collator', false)) { + $collator = new \Collator($locale); + + $this->_sorts[] = function (\SplFileInfo $a, \SplFileInfo $b) use ($collator) { + return $collator->compare($a->getPathname(), $b->getPathname()); + }; + } else { + $this->_sorts[] = function (\SplFileInfo $a, \SplFileInfo $b) { + return \strcmp($a->getPathname(), $b->getPathname()); + }; + } + + return $this; + } + + /** + * Sort result by size. + * Example: + * $this->sortBySize();. + */ + public function sortBySize(): self + { + $this->_sorts[] = function (\SplFileInfo $a, \SplFileInfo $b) { + return $a->getSize() < $b->getSize(); + }; + + return $this; + } + + /** + * Add your own sort. + * The callback will receive 2 arguments: $a and $b. Please see the uasort() + * function. + * Example: + * // Sort files by their modified time. + * $this->sort(function ($a, $b) { + * return $a->getMTime() < $b->getMTime(); + * });. + */ + public function sort($callable): self + { + $this->_sorts[] = $callable; + + return $this; + } + + /** + * Child comes first when iterating. + */ + public function childFirst(): self + { + $this->_first = \RecursiveIteratorIterator::CHILD_FIRST; + + return $this; + } + + /** + * Get the iterator. + */ + public function getIterator() + { + $_iterator = new \AppendIterator(); + $types = $this->getTypes(); + + if (!empty($types)) { + $this->_filters[] = function (\SplFileInfo $current) use ($types) { + return \in_array($current->getType(), $types); + }; + } + + $maxDepth = $this->getMaxDepth(); + $splFileInfo = $this->getSplFileInfo(); + + foreach ($this->getPaths() as $path) { + if (1 === $maxDepth) { + $iterator = new \IteratorIterator( + new IteratorRecursiveDirectory( + $path, + $this->getFlags(), + $splFileInfo + ), + $this->getFirst() + ); + } else { + $iterator = new \RecursiveIteratorIterator( + new IteratorRecursiveDirectory( + $path, + $this->getFlags(), + $splFileInfo + ), + $this->getFirst() + ); + + if (1 < $maxDepth) { + $iterator->setMaxDepth($maxDepth - 1); + } + } + + $_iterator->append($iterator); + } + + foreach ($this->getFilters() as $filter) { + $_iterator = new \CallbackFilterIterator( + $_iterator, + $filter + ); + } + + $sorts = $this->getSorts(); + + if (empty($sorts)) { + return $_iterator; + } + + $array = \iterator_to_array($_iterator); + + foreach ($sorts as $sort) { + \uasort($array, $sort); + } + + return new \ArrayIterator($array); + } + + /** + * Set SplFileInfo classname. + */ + public function setSplFileInfo(string $splFileInfo): string + { + $old = $this->_splFileInfo; + $this->_splFileInfo = $splFileInfo; + + return $old; + } + + /** + * Get SplFileInfo classname. + */ + public function getSplFileInfo(): string + { + return $this->_splFileInfo; + } + + /** + * Get all paths. + */ + protected function getPaths(): array + { + return $this->_paths; + } + + /** + * Get max depth. + */ + public function getMaxDepth(): int + { + return $this->_maxDepth; + } + + /** + * Get types. + */ + public function getTypes(): array + { + return $this->_types; + } + + /** + * Get filters. + */ + protected function getFilters(): array + { + return $this->_filters; + } + + /** + * Get sorts. + */ + protected function getSorts(): array + { + return $this->_sorts; + } + + /** + * Get flags. + */ + public function getFlags(): int + { + return $this->_flags; + } + + /** + * Get first. + */ + public function getFirst(): int + { + return $this->_first; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileGeneric.php b/vendor/psy/psysh/src/Readline/Hoa/FileGeneric.php new file mode 100644 index 00000000..0aa2af74 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileGeneric.php @@ -0,0 +1,487 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Generic. + * + * Describe a super-file. + */ +abstract class FileGeneric extends Stream implements StreamPathable, StreamStatable, StreamTouchable +{ + /** + * Mode. + */ + protected $_mode = null; + + /** + * Get filename component of path. + */ + public function getBasename(): string + { + return \basename($this->getStreamName()); + } + + /** + * Get directory name component of path. + */ + public function getDirname(): string + { + return \dirname($this->getStreamName()); + } + + /** + * Get size. + */ + public function getSize(): int + { + if (false === $this->getStatistic()) { + return false; + } + + return \filesize($this->getStreamName()); + } + + /** + * Get informations about a file. + */ + public function getStatistic(): array + { + return \fstat($this->getStream()); + } + + /** + * Get last access time of file. + */ + public function getATime(): int + { + return \fileatime($this->getStreamName()); + } + + /** + * Get inode change time of file. + */ + public function getCTime(): int + { + return \filectime($this->getStreamName()); + } + + /** + * Get file modification time. + */ + public function getMTime(): int + { + return \filemtime($this->getStreamName()); + } + + /** + * Get file group. + */ + public function getGroup(): int + { + return \filegroup($this->getStreamName()); + } + + /** + * Get file owner. + */ + public function getOwner(): int + { + return \fileowner($this->getStreamName()); + } + + /** + * Get file permissions. + */ + public function getPermissions(): int + { + return \fileperms($this->getStreamName()); + } + + /** + * Get file permissions as a string. + * Result sould be interpreted like this: + * * s: socket; + * * l: symbolic link; + * * -: regular; + * * b: block special; + * * d: directory; + * * c: character special; + * * p: FIFO pipe; + * * u: unknown. + */ + public function getReadablePermissions(): string + { + $p = $this->getPermissions(); + + if (($p & 0xC000) === 0xC000) { + $out = 's'; + } elseif (($p & 0xA000) === 0xA000) { + $out = 'l'; + } elseif (($p & 0x8000) === 0x8000) { + $out = '-'; + } elseif (($p & 0x6000) === 0x6000) { + $out = 'b'; + } elseif (($p & 0x4000) === 0x4000) { + $out = 'd'; + } elseif (($p & 0x2000) === 0x2000) { + $out = 'c'; + } elseif (($p & 0x1000) === 0x1000) { + $out = 'p'; + } else { + $out = 'u'; + } + + $out .= + (($p & 0x0100) ? 'r' : '-'). + (($p & 0x0080) ? 'w' : '-'). + (($p & 0x0040) ? + (($p & 0x0800) ? 's' : 'x') : + (($p & 0x0800) ? 'S' : '-')). + (($p & 0x0020) ? 'r' : '-'). + (($p & 0x0010) ? 'w' : '-'). + (($p & 0x0008) ? + (($p & 0x0400) ? 's' : 'x') : + (($p & 0x0400) ? 'S' : '-')). + (($p & 0x0004) ? 'r' : '-'). + (($p & 0x0002) ? 'w' : '-'). + (($p & 0x0001) ? + (($p & 0x0200) ? 't' : 'x') : + (($p & 0x0200) ? 'T' : '-')); + + return $out; + } + + /** + * Check if the file is readable. + */ + public function isReadable(): bool + { + return \is_readable($this->getStreamName()); + } + + /** + * Check if the file is writable. + */ + public function isWritable(): bool + { + return \is_writable($this->getStreamName()); + } + + /** + * Check if the file is executable. + */ + public function isExecutable(): bool + { + return \is_executable($this->getStreamName()); + } + + /** + * Clear file status cache. + */ + public function clearStatisticCache() + { + \clearstatcache(true, $this->getStreamName()); + } + + /** + * Clear all files status cache. + */ + public static function clearAllStatisticCaches() + { + \clearstatcache(); + } + + /** + * Set access and modification time of file. + */ + public function touch(int $time = null, int $atime = null): bool + { + if (null === $time) { + $time = \time(); + } + + if (null === $atime) { + $atime = $time; + } + + return \touch($this->getStreamName(), $time, $atime); + } + + /** + * Copy file. + * Return the destination file path if succeed, false otherwise. + */ + public function copy(string $to, bool $force = StreamTouchable::DO_NOT_OVERWRITE): bool + { + $from = $this->getStreamName(); + + if ($force === StreamTouchable::DO_NOT_OVERWRITE && + true === \file_exists($to)) { + return true; + } + + if (null === $this->getStreamContext()) { + return @\copy($from, $to); + } + + return @\copy($from, $to, $this->getStreamContext()->getContext()); + } + + /** + * Move a file. + */ + public function move( + string $name, + bool $force = StreamTouchable::DO_NOT_OVERWRITE, + bool $mkdir = StreamTouchable::DO_NOT_MAKE_DIRECTORY + ): bool { + $from = $this->getStreamName(); + + if ($force === StreamTouchable::DO_NOT_OVERWRITE && + true === \file_exists($name)) { + return false; + } + + if (StreamTouchable::MAKE_DIRECTORY === $mkdir) { + Directory::create( + \dirname($name), + Directory::MODE_CREATE_RECURSIVE + ); + } + + if (null === $this->getStreamContext()) { + return @\rename($from, $name); + } + + return @\rename($from, $name, $this->getStreamContext()->getContext()); + } + + /** + * Delete a file. + */ + public function delete(): bool + { + if (null === $this->getStreamContext()) { + return @\unlink($this->getStreamName()); + } + + return @\unlink( + $this->getStreamName(), + $this->getStreamContext()->getContext() + ); + } + + /** + * Change file group. + */ + public function changeGroup($group): bool + { + return \chgrp($this->getStreamName(), $group); + } + + /** + * Change file mode. + */ + public function changeMode(int $mode): bool + { + return \chmod($this->getStreamName(), $mode); + } + + /** + * Change file owner. + */ + public function changeOwner($user): bool + { + return \chown($this->getStreamName(), $user); + } + + /** + * Change the current umask. + */ + public static function umask(int $umask = null): int + { + if (null === $umask) { + return \umask(); + } + + return \umask($umask); + } + + /** + * Check if it is a file. + */ + public function isFile(): bool + { + return \is_file($this->getStreamName()); + } + + /** + * Check if it is a link. + */ + public function isLink(): bool + { + return \is_link($this->getStreamName()); + } + + /** + * Check if it is a directory. + */ + public function isDirectory(): bool + { + return \is_dir($this->getStreamName()); + } + + /** + * Check if it is a socket. + */ + public function isSocket(): bool + { + return \filetype($this->getStreamName()) === 'socket'; + } + + /** + * Check if it is a FIFO pipe. + */ + public function isFIFOPipe(): bool + { + return \filetype($this->getStreamName()) === 'fifo'; + } + + /** + * Check if it is character special file. + */ + public function isCharacterSpecial(): bool + { + return \filetype($this->getStreamName()) === 'char'; + } + + /** + * Check if it is block special. + */ + public function isBlockSpecial(): bool + { + return \filetype($this->getStreamName()) === 'block'; + } + + /** + * Check if it is an unknown type. + */ + public function isUnknown(): bool + { + return \filetype($this->getStreamName()) === 'unknown'; + } + + /** + * Set the open mode. + */ + protected function setMode(string $mode) + { + $old = $this->_mode; + $this->_mode = $mode; + + return $old; + } + + /** + * Get the open mode. + */ + public function getMode() + { + return $this->_mode; + } + + /** + * Get inode. + */ + public function getINode(): int + { + return \fileinode($this->getStreamName()); + } + + /** + * Check if the system is case sensitive or not. + */ + public static function isCaseSensitive(): bool + { + return !( + \file_exists(\mb_strtolower(__FILE__)) && + \file_exists(\mb_strtoupper(__FILE__)) + ); + } + + /** + * Get a canonicalized absolute pathname. + */ + public function getRealPath(): string + { + if (false === $out = \realpath($this->getStreamName())) { + return $this->getStreamName(); + } + + return $out; + } + + /** + * Get file extension (if exists). + */ + public function getExtension(): string + { + return \pathinfo( + $this->getStreamName(), + \PATHINFO_EXTENSION + ); + } + + /** + * Get filename without extension. + */ + public function getFilename(): string + { + $file = \basename($this->getStreamName()); + + if (\defined('PATHINFO_FILENAME')) { + return \pathinfo($file, \PATHINFO_FILENAME); + } + + if (\strstr($file, '.')) { + return \substr($file, 0, \strrpos($file, '.')); + } + + return $file; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileLink.php b/vendor/psy/psysh/src/Readline/Hoa/FileLink.php new file mode 100644 index 00000000..21a4485f --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileLink.php @@ -0,0 +1,149 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Link. + * + * Link handler. + */ +class FileLink extends File +{ + /** + * Open a link. + */ + public function __construct( + string $streamName, + string $mode, + string $context = null, + bool $wait = false + ) { + if (!\is_link($streamName)) { + throw new FileException('File %s is not a link.', 0, $streamName); + } + + parent::__construct($streamName, $mode, $context, $wait); + + return; + } + + /** + * Get informations about a link. + */ + public function getStatistic(): array + { + return \lstat($this->getStreamName()); + } + + /** + * Change file group. + */ + public function changeGroup($group): bool + { + return \lchgrp($this->getStreamName(), $group); + } + + /** + * Change file owner. + */ + public function changeOwner($user): bool + { + return \lchown($this->getStreamName(), $user); + } + + /** + * Get file permissions. + */ + public function getPermissions(): int + { + return 41453; // i.e. lrwxr-xr-x + } + + /** + * Get the target of a symbolic link. + */ + public function getTarget(): FileGeneric + { + $target = \dirname($this->getStreamName()).\DIRECTORY_SEPARATOR. + $this->getTargetName(); + $context = null !== $this->getStreamContext() + ? $this->getStreamContext()->getCurrentId() + : null; + + if (true === \is_link($target)) { + return new FileLinkReadWrite( + $target, + File::MODE_APPEND_READ_WRITE, + $context + ); + } elseif (true === \is_file($target)) { + return new FileReadWrite( + $target, + File::MODE_APPEND_READ_WRITE, + $context + ); + } elseif (true === \is_dir($target)) { + return new FileDirectory( + $target, + File::MODE_READ, + $context + ); + } + + throw new FileException('Cannot find an appropriated object that matches with '.'path %s when defining it.', 1, $target); + } + + /** + * Get the target name of a symbolic link. + */ + public function getTargetName(): string + { + return \readlink($this->getStreamName()); + } + + /** + * Create a link. + */ + public static function create(string $name, string $target): bool + { + if (false !== \linkinfo($name)) { + return true; + } + + return \symlink($target, $name); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileLinkRead.php b/vendor/psy/psysh/src/Readline/Hoa/FileLinkRead.php new file mode 100644 index 00000000..37bb514c --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileLinkRead.php @@ -0,0 +1,231 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Link\Read. + * + * File handler. + * + * @license New BSD License + */ +class FileLinkRead extends FileLink implements StreamIn +{ + /** + * Open a file. + * + * @param string $streamName stream name + * @param string $mode open mode, see the parent::MODE_* constants + * @param string $context context ID (please, see the + * \Hoa\Stream\Context class) + * @param bool $wait differ opening or not + */ + public function __construct( + string $streamName, + string $mode = parent::MODE_READ, + string $context = null, + bool $wait = false + ) { + parent::__construct($streamName, $mode, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + * + * @param string $streamName Stream name (e.g. path or URL). + * @param \Hoa\Stream\Context $context context + * + * @return resource + * + * @throws \Hoa\File\Exception\FileDoesNotExist + * @throws \Hoa\File\Exception + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + static $createModes = [ + parent::MODE_READ, + ]; + + if (!\in_array($this->getMode(), $createModes)) { + throw new FileException('Open mode are not supported; given %d. Only %s are supported.', 0, [$this->getMode(), \implode(', ', $createModes)]); + } + + \preg_match('#^(\w+)://#', $streamName, $match); + + if (((isset($match[1]) && $match[1] === 'file') || !isset($match[1])) && + !\file_exists($streamName)) { + throw new FileDoesNotExistException('File %s does not exist.', 1, $streamName); + } + + $out = parent::_open($streamName, $context); + + return $out; + } + + /** + * Test for end-of-file. + * + * @return bool + */ + public function eof(): bool + { + return \feof($this->getStream()); + } + + /** + * Read n characters. + * + * @param int $length length + * + * @return string + * + * @throws \Hoa\File\Exception + */ + public function read(int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 2, $length); + } + + return \fread($this->getStream(), $length); + } + + /** + * Alias of $this->read(). + * + * @param int $length length + * + * @return string + */ + public function readString(int $length) + { + return $this->read($length); + } + + /** + * Read a character. + * + * @return string + */ + public function readCharacter() + { + return \fgetc($this->getStream()); + } + + /** + * Read a boolean. + * + * @return bool + */ + public function readBoolean() + { + return (bool) $this->read(1); + } + + /** + * Read an integer. + * + * @param int $length length + * + * @return int + */ + public function readInteger(int $length = 1) + { + return (int) $this->read($length); + } + + /** + * Read a float. + * + * @param int $length length + * + * @return float + */ + public function readFloat(int $length = 1) + { + return (float) $this->read($length); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + * + * @param string $format format (see printf's formats) + * + * @return array + */ + public function readArray(string $format = null) + { + return $this->scanf($format); + } + + /** + * Read a line. + * + * @return string + */ + public function readLine() + { + return \fgets($this->getStream()); + } + + /** + * Read all, i.e. read as much as possible. + * + * @param int $offset offset + * + * @return string + */ + public function readAll(int $offset = 0) + { + return \stream_get_contents($this->getStream(), -1, $offset); + } + + /** + * Parse input from a stream according to a format. + * + * @param string $format format (see printf's formats) + * + * @return array + */ + public function scanf(string $format): array + { + return \fscanf($this->getStream(), $format); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php b/vendor/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php new file mode 100644 index 00000000..0d16585c --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileLinkReadWrite.php @@ -0,0 +1,279 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Link\ReadWrite. + * + * File handler. + */ +class FileLinkReadWrite extends FileLink implements StreamIn, StreamOut +{ + /** + * Open a file. + */ + public function __construct( + string $streamName, + string $mode = parent::MODE_APPEND_READ_WRITE, + string $context = null, + bool $wait = false + ) { + parent::__construct($streamName, $mode, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + static $createModes = [ + parent::MODE_READ_WRITE, + parent::MODE_TRUNCATE_READ_WRITE, + parent::MODE_APPEND_READ_WRITE, + parent::MODE_CREATE_READ_WRITE, + ]; + + if (!\in_array($this->getMode(), $createModes)) { + throw new FileException('Open mode are not supported; given %d. Only %s are supported.', 0, [$this->getMode(), \implode(', ', $createModes)]); + } + + \preg_match('#^(\w+)://#', $streamName, $match); + + if (((isset($match[1]) && $match[1] === 'file') || !isset($match[1])) && + !\file_exists($streamName) && + parent::MODE_READ_WRITE === $this->getMode()) { + throw new FileDoesNotExistException('File %s does not exist.', 1, $streamName); + } + + $out = parent::_open($streamName, $context); + + return $out; + } + + /** + * Test for end-of-file. + */ + public function eof(): bool + { + return \feof($this->getStream()); + } + + /** + * Read n characters. + */ + public function read(int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 2, $length); + } + + return \fread($this->getStream(), $length); + } + + /** + * Alias of $this->read(). + */ + public function readString(int $length) + { + return $this->read($length); + } + + /** + * Read a character. + */ + public function readCharacter() + { + return \fgetc($this->getStream()); + } + + /** + * Read a boolean. + */ + public function readBoolean() + { + return (bool) $this->read(1); + } + + /** + * Read an integer. + */ + public function readInteger(int $length = 1) + { + return (int) $this->read($length); + } + + /** + * Read a float. + */ + public function readFloat(int $length = 1) + { + return (float) $this->read($length); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + */ + public function readArray(string $format = null) + { + return $this->scanf($format); + } + + /** + * Read a line. + */ + public function readLine() + { + return \fgets($this->getStream()); + } + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = 0) + { + return \stream_get_contents($this->getStream(), -1, $offset); + } + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format): array + { + return \fscanf($this->getStream(), $format); + } + + /** + * Write n characters. + */ + public function write(string $string, int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 3, $length); + } + + return \fwrite($this->getStream(), $string, $length); + } + + /** + * Write a string. + */ + public function writeString(string $string) + { + $string = (string) $string; + + return $this->write($string, \strlen($string)); + } + + /** + * Write a character. + */ + public function writeCharacter(string $char) + { + return $this->write((string) $char[0], 1); + } + + /** + * Write a boolean. + */ + public function writeBoolean(bool $boolean) + { + return $this->write((string) (bool) $boolean, 1); + } + + /** + * Write an integer. + */ + public function writeInteger(int $integer) + { + $integer = (string) (int) $integer; + + return $this->write($integer, \strlen($integer)); + } + + /** + * Write a float. + */ + public function writeFloat(float $float) + { + $float = (string) (float) $float; + + return $this->write($float, \strlen($float)); + } + + /** + * Write an array. + */ + public function writeArray(array $array) + { + $array = \var_export($array, true); + + return $this->write($array, \strlen($array)); + } + + /** + * Write a line. + */ + public function writeLine(string $line) + { + if (false === $n = \strpos($line, "\n")) { + return $this->write($line."\n", \strlen($line) + 1); + } + + ++$n; + + return $this->write(\substr($line, 0, $n), $n); + } + + /** + * Write all, i.e. as much as possible. + */ + public function writeAll(string $string) + { + return $this->write($string, \strlen($string)); + } + + /** + * Truncate a file to a given length. + */ + public function truncate(int $size): bool + { + return \ftruncate($this->getStream(), $size); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileRead.php b/vendor/psy/psysh/src/Readline/Hoa/FileRead.php new file mode 100644 index 00000000..9e10fe69 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileRead.php @@ -0,0 +1,177 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\Read. + * + * File handler. + */ +class FileRead extends File implements StreamIn +{ + /** + * Open a file. + */ + public function __construct( + string $streamName, + string $mode = parent::MODE_READ, + string $context = null, + bool $wait = false + ) { + parent::__construct($streamName, $mode, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + static $createModes = [ + parent::MODE_READ, + ]; + + if (!\in_array($this->getMode(), $createModes)) { + throw new FileException('Open mode are not supported; given %d. Only %s are supported.', 0, [$this->getMode(), \implode(', ', $createModes)]); + } + + \preg_match('#^(\w+)://#', $streamName, $match); + + if (((isset($match[1]) && $match[1] === 'file') || !isset($match[1])) && + !\file_exists($streamName)) { + throw new FileDoesNotExistException('File %s does not exist.', 1, $streamName); + } + + $out = parent::_open($streamName, $context); + + return $out; + } + + /** + * Test for end-of-file. + */ + public function eof(): bool + { + return \feof($this->getStream()); + } + + /** + * Read n characters. + */ + public function read(int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 2, $length); + } + + return \fread($this->getStream(), $length); + } + + /** + * Alias of $this->read(). + */ + public function readString(int $length) + { + return $this->read($length); + } + + /** + * Read a character. + */ + public function readCharacter() + { + return \fgetc($this->getStream()); + } + + /** + * Read a boolean. + */ + public function readBoolean() + { + return (bool) $this->read(1); + } + + /** + * Read an integer. + */ + public function readInteger(int $length = 1) + { + return (int) $this->read($length); + } + + /** + * Read a float. + */ + public function readFloat(int $length = 1) + { + return (float) $this->read($length); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + */ + public function readArray(string $format = null) + { + return $this->scanf($format); + } + + /** + * Read a line. + */ + public function readLine() + { + return \fgets($this->getStream()); + } + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = 0) + { + return \stream_get_contents($this->getStream(), -1, $offset); + } + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format): array + { + return \fscanf($this->getStream(), $format); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/FileReadWrite.php b/vendor/psy/psysh/src/Readline/Hoa/FileReadWrite.php new file mode 100644 index 00000000..406b6aa7 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/FileReadWrite.php @@ -0,0 +1,279 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\File\ReadWrite. + * + * File handler. + */ +class FileReadWrite extends File implements StreamIn, StreamOut +{ + /** + * Open a file. + */ + public function __construct( + string $streamName, + string $mode = parent::MODE_APPEND_READ_WRITE, + string $context = null, + bool $wait = false + ) { + parent::__construct($streamName, $mode, $context, $wait); + + return; + } + + /** + * Open the stream and return the associated resource. + */ + protected function &_open(string $streamName, StreamContext $context = null) + { + static $createModes = [ + parent::MODE_READ_WRITE, + parent::MODE_TRUNCATE_READ_WRITE, + parent::MODE_APPEND_READ_WRITE, + parent::MODE_CREATE_READ_WRITE, + ]; + + if (!\in_array($this->getMode(), $createModes)) { + throw new FileException('Open mode are not supported; given %d. Only %s are supported.', 0, [$this->getMode(), \implode(', ', $createModes)]); + } + + \preg_match('#^(\w+)://#', $streamName, $match); + + if (((isset($match[1]) && $match[1] === 'file') || !isset($match[1])) && + !\file_exists($streamName) && + parent::MODE_READ_WRITE === $this->getMode()) { + throw new FileDoesNotExistException('File %s does not exist.', 1, $streamName); + } + + $out = parent::_open($streamName, $context); + + return $out; + } + + /** + * Test for end-of-file. + */ + public function eof(): bool + { + return \feof($this->getStream()); + } + + /** + * Read n characters. + */ + public function read(int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 2, $length); + } + + return \fread($this->getStream(), $length); + } + + /** + * Alias of $this->read(). + */ + public function readString(int $length) + { + return $this->read($length); + } + + /** + * Read a character. + */ + public function readCharacter() + { + return \fgetc($this->getStream()); + } + + /** + * Read a boolean. + */ + public function readBoolean() + { + return (bool) $this->read(1); + } + + /** + * Read an integer. + */ + public function readInteger(int $length = 1) + { + return (int) $this->read($length); + } + + /** + * Read a float. + */ + public function readFloat(int $length = 1) + { + return (float) $this->read($length); + } + + /** + * Read an array. + * Alias of the $this->scanf() method. + */ + public function readArray(string $format = null) + { + return $this->scanf($format); + } + + /** + * Read a line. + */ + public function readLine() + { + return \fgets($this->getStream()); + } + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = 0) + { + return \stream_get_contents($this->getStream(), -1, $offset); + } + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format): array + { + return \fscanf($this->getStream(), $format); + } + + /** + * Write n characters. + */ + public function write(string $string, int $length) + { + if (0 > $length) { + throw new FileException('Length must be greater than 0, given %d.', 3, $length); + } + + return \fwrite($this->getStream(), $string, $length); + } + + /** + * Write a string. + */ + public function writeString(string $string) + { + $string = (string) $string; + + return $this->write($string, \strlen($string)); + } + + /** + * Write a character. + */ + public function writeCharacter(string $char) + { + return $this->write((string) $char[0], 1); + } + + /** + * Write a boolean. + */ + public function writeBoolean(bool $boolean) + { + return $this->write((string) (bool) $boolean, 1); + } + + /** + * Write an integer. + */ + public function writeInteger(int $integer) + { + $integer = (string) (int) $integer; + + return $this->write($integer, \strlen($integer)); + } + + /** + * Write a float. + */ + public function writeFloat(float $float) + { + $float = (string) (float) $float; + + return $this->write($float, \strlen($float)); + } + + /** + * Write an array. + */ + public function writeArray(array $array) + { + $array = \var_export($array, true); + + return $this->write($array, \strlen($array)); + } + + /** + * Write a line. + */ + public function writeLine(string $line) + { + if (false === $n = \strpos($line, "\n")) { + return $this->write($line."\n", \strlen($line) + 1); + } + + ++$n; + + return $this->write(\substr($line, 0, $n), $n); + } + + /** + * Write all, i.e. as much as possible. + */ + public function writeAll(string $string) + { + return $this->write($string, \strlen($string)); + } + + /** + * Truncate a file to a given length. + */ + public function truncate(int $size): bool + { + return \ftruncate($this->getStream(), $size); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/IStream.php b/vendor/psy/psysh/src/Readline/Hoa/IStream.php new file mode 100644 index 00000000..9b9949a2 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/IStream.php @@ -0,0 +1,50 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Stream. + * + * Interface for all streams. + */ +interface IStream +{ + /** + * Get the current stream. + */ + public function getStream(); +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php b/vendor/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php new file mode 100644 index 00000000..f0fc5c57 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/IteratorFileSystem.php @@ -0,0 +1,86 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Iterator\FileSystem. + * + * Extending the SPL FileSystemIterator class. + */ +class IteratorFileSystem extends \FilesystemIterator +{ + /** + * SplFileInfo classname. + */ + protected $_splFileInfoClass = null; + + /** + * Constructor. + * Please, see \FileSystemIterator::__construct() method. + * We add the $splFileInfoClass parameter. + */ + public function __construct(string $path, int $flags = null, string $splFileInfoClass = null) + { + $this->_splFileInfoClass = $splFileInfoClass; + + if (null === $flags) { + parent::__construct($path); + } else { + parent::__construct($path, $flags); + } + + return; + } + + /** + * Current. + * Please, see \FileSystemIterator::current() method. + */ + #[\ReturnTypeWillChange] + public function current() + { + $out = parent::current(); + + if (null !== $this->_splFileInfoClass && + $out instanceof \SplFileInfo) { + $out->setInfoClass($this->_splFileInfoClass); + $out = $out->getFileInfo(); + } + + return $out; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php b/vendor/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php new file mode 100644 index 00000000..ad695123 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/IteratorRecursiveDirectory.php @@ -0,0 +1,126 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Iterator\Recursive\Directory. + * + * Extending the SPL RecursiveDirectoryIterator class. + */ +class IteratorRecursiveDirectory extends \RecursiveDirectoryIterator +{ + /** + * SplFileInfo classname. + */ + protected $_splFileInfoClass = null; + + /** + * Relative path. + */ + protected $_relativePath = null; + + /** + * Constructor. + * Please, see \RecursiveDirectoryIterator::__construct() method. + * We add the $splFileInfoClass parameter. + */ + public function __construct(string $path, int $flags = null, string $splFileInfoClass = null) + { + if (null === $flags) { + parent::__construct($path); + } else { + parent::__construct($path, $flags); + } + + $this->_relativePath = $path; + $this->setSplFileInfoClass($splFileInfoClass); + + return; + } + + /** + * Current. + * Please, see \RecursiveDirectoryIterator::current() method. + */ + #[\ReturnTypeWillChange] + public function current() + { + $out = parent::current(); + + if (null !== $this->_splFileInfoClass && + $out instanceof \SplFileInfo) { + $out->setInfoClass($this->_splFileInfoClass); + $out = $out->getFileInfo(); + + if ($out instanceof IteratorSplFileInfo) { + $out->setRelativePath($this->getRelativePath()); + } + } + + return $out; + } + + /** + * Get children. + * Please, see \RecursiveDirectoryIterator::getChildren() method. + */ + #[\ReturnTypeWillChange] + public function getChildren() + { + $out = parent::getChildren(); + $out->_relativePath = $this->getRelativePath(); + $out->setSplFileInfoClass($this->_splFileInfoClass); + + return $out; + } + + /** + * Set SplFileInfo classname. + */ + public function setSplFileInfoClass($splFileInfoClass) + { + $this->_splFileInfoClass = $splFileInfoClass; + } + + /** + * Get relative path (if given). + */ + public function getRelativePath(): string + { + return $this->_relativePath; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php b/vendor/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php new file mode 100644 index 00000000..3cf54b84 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/IteratorSplFileInfo.php @@ -0,0 +1,122 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Iterator\SplFileInfo. + * + * Enhance SplFileInfo implementation. + */ +class IteratorSplFileInfo extends \SplFileInfo +{ + /** + * Hash. + */ + protected $_hash = null; + + /** + * Relative path. + */ + protected $_relativePath = null; + + /** + * Construct. + */ + public function __construct(string $filename, string $relativePath = null) + { + parent::__construct($filename); + + if (-1 !== $mtime = $this->getMTime()) { + $this->_hash = \md5($this->getPathname().$mtime); + } + + $this->_relativePath = $relativePath; + + return; + } + + /** + * Get the hash. + */ + public function getHash(): string + { + return $this->_hash; + } + + /** + * Get the MTime. + */ + public function getMTime(): int + { + try { + return parent::getMTime(); + } catch (\RuntimeException $e) { + return -1; + } + } + + /** + * Set relative path. + */ + public function setRelativePath(string $relativePath) + { + $old = $this->_relativePath; + $this->_relativePath = $relativePath; + + return $old; + } + + /** + * Get relative path (if given). + */ + public function getRelativePath() + { + return $this->_relativePath; + } + + /** + * Get relative pathname (if possible). + */ + public function getRelativePathname(): string + { + if (null === $relative = $this->getRelativePath()) { + return $this->getPathname(); + } + + return \substr($this->getPathname(), \strlen($relative)); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Protocol.php b/vendor/psy/psysh/src/Readline/Hoa/Protocol.php new file mode 100644 index 00000000..45a2ddad --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Protocol.php @@ -0,0 +1,223 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Root of the `hoa://` protocol. + */ +class Protocol extends ProtocolNode +{ + /** + * No resolution value. + * + * @const string + */ + const NO_RESOLUTION = '/hoa/flatland'; + + /** + * Singleton. + */ + private static $_instance = null; + + /** + * Cache of resolver. + */ + private static $_cache = []; + + /** + * Initialize the protocol. + */ + public function __construct() + { + $this->initialize(); + + return; + } + + /** + * Singleton. + * To use the `hoa://` protocol shared by everyone. + */ + public static function getInstance(): self + { + if (null === static::$_instance) { + static::$_instance = new static(); + } + + return static::$_instance; + } + + /** + * Initialize the protocol. + */ + protected function initialize() + { + $root = \dirname(__DIR__, 3); + $argv0 = \realpath($_SERVER['argv'][0]); + + $cwd = + 'cli' === \PHP_SAPI + ? false !== $argv0 ? \dirname($argv0) : '' + : \getcwd(); + + $this[] = new ProtocolNode( + 'Application', + $cwd.\DIRECTORY_SEPARATOR, + [ + new ProtocolNode('Public', 'Public'.\DIRECTORY_SEPARATOR), + ] + ); + + $this[] = new ProtocolNode( + 'Data', + \dirname($cwd).\DIRECTORY_SEPARATOR, + [ + new ProtocolNode( + 'Etc', + 'Etc'.\DIRECTORY_SEPARATOR, + [ + new ProtocolNode('Configuration', 'Configuration'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Locale', 'Locale'.\DIRECTORY_SEPARATOR), + ] + ), + new ProtocolNode('Lost+found', 'Lost+found'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Temporary', 'Temporary'.\DIRECTORY_SEPARATOR), + new ProtocolNode( + 'Variable', + 'Variable'.\DIRECTORY_SEPARATOR, + [ + new ProtocolNode('Cache', 'Cache'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Database', 'Database'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Log', 'Log'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Private', 'Private'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Run', 'Run'.\DIRECTORY_SEPARATOR), + new ProtocolNode('Test', 'Test'.\DIRECTORY_SEPARATOR), + ] + ), + ] + ); + + $this[] = new ProtocolNodeLibrary( + 'Library', + $root.\DIRECTORY_SEPARATOR.'Hoathis'.\DIRECTORY_SEPARATOR.';'. + $root.\DIRECTORY_SEPARATOR.'Hoa'.\DIRECTORY_SEPARATOR + ); + } + + /** + * Resolve (unfold) an `hoa://` path to its real resource. + * + * If `$exists` is set to `true`, try to find the first that exists, + * otherwise returns the first solution. If `$unfold` is set to `true`, + * it returns all the paths. + */ + public function resolve(string $path, bool $exists = true, bool $unfold = false) + { + if (\substr($path, 0, 6) !== 'hoa://') { + if (true === \is_dir($path)) { + $path = \rtrim($path, '/\\'); + + if ('' === $path) { + $path = '/'; + } + } + + return $path; + } + + if (isset(self::$_cache[$path])) { + $handle = self::$_cache[$path]; + } else { + $out = $this->_resolve($path, $handle); + + // Not a path but a resource. + if (!\is_array($handle)) { + return $out; + } + + $handle = \array_values(\array_unique($handle, \SORT_REGULAR)); + + foreach ($handle as &$entry) { + if (true === \is_dir($entry)) { + $entry = \rtrim($entry, '/\\'); + + if ('' === $entry) { + $entry = '/'; + } + } + } + + self::$_cache[$path] = $handle; + } + + if (true === $unfold) { + if (true !== $exists) { + return $handle; + } + + $out = []; + + foreach ($handle as $solution) { + if (\file_exists($solution)) { + $out[] = $solution; + } + } + + return $out; + } + + if (true !== $exists) { + return $handle[0]; + } + + foreach ($handle as $solution) { + if (\file_exists($solution)) { + return $solution; + } + } + + return static::NO_RESOLUTION; + } + + /** + * Clear the cache. + */ + public static function clearCache() + { + self::$_cache = []; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ProtocolException.php b/vendor/psy/psysh/src/Readline/Hoa/ProtocolException.php new file mode 100644 index 00000000..6b624bb9 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ProtocolException.php @@ -0,0 +1,44 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Extends the `Hoa\Exception\Exception` class. + */ +class ProtocolException extends Exception +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ProtocolNode.php b/vendor/psy/psysh/src/Readline/Hoa/ProtocolNode.php new file mode 100644 index 00000000..78812d7e --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ProtocolNode.php @@ -0,0 +1,323 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Abstract class for all `hoa://`'s nodes. + */ +class ProtocolNode implements \ArrayAccess, \IteratorAggregate +{ + /** + * Node's name. + */ + protected $_name = null; + + /** + * Path for the `reach` method. + */ + protected $_reach = null; + + /** + * Children of the node. + */ + private $_children = []; + + /** + * Construct a protocol's node. + * If it is not a data object (i.e. if it does not extend this class to + * overload the `$_name` attribute), we can set the `$_name` attribute + * dynamically. This is useful to create a node on-the-fly. + */ + public function __construct(string $name = null, string $reach = null, array $children = []) + { + if (null !== $name) { + $this->_name = $name; + } + + if (null !== $reach) { + $this->_reach = $reach; + } + + foreach ($children as $child) { + $this[] = $child; + } + + return; + } + + /** + * Add a node. + */ + #[\ReturnTypeWillChange] + public function offsetSet($name, $node) + { + if (!($node instanceof self)) { + throw new ProtocolException('Protocol node must extend %s.', 0, __CLASS__); + } + + if (empty($name)) { + $name = $node->getName(); + } + + if (empty($name)) { + throw new ProtocolException('Cannot add a node to the `hoa://` protocol without a name.', 1); + } + + $this->_children[$name] = $node; + } + + /** + * Get a specific node. + */ + public function offsetGet($name): self + { + if (!isset($this[$name])) { + throw new ProtocolException('Node %s does not exist.', 2, $name); + } + + return $this->_children[$name]; + } + + /** + * Check if a node exists. + */ + public function offsetExists($name): bool + { + return true === \array_key_exists($name, $this->_children); + } + + /** + * Remove a node. + */ + #[\ReturnTypeWillChange] + public function offsetUnset($name) + { + unset($this->_children[$name]); + } + + /** + * Resolve a path, i.e. iterate the nodes tree and reach the queue of + * the path. + */ + protected function _resolve(string $path, &$accumulator, string $id = null) + { + if (\substr($path, 0, 6) === 'hoa://') { + $path = \substr($path, 6); + } + + if (empty($path)) { + return null; + } + + if (null === $accumulator) { + $accumulator = []; + $posId = \strpos($path, '#'); + + if (false !== $posId) { + $id = \substr($path, $posId + 1); + $path = \substr($path, 0, $posId); + } else { + $id = null; + } + } + + $path = \trim($path, '/'); + $pos = \strpos($path, '/'); + + if (false !== $pos) { + $next = \substr($path, 0, $pos); + } else { + $next = $path; + } + + if (isset($this[$next])) { + if (false === $pos) { + if (null === $id) { + $this->_resolveChoice($this[$next]->reach(), $accumulator); + + return true; + } + + $accumulator = null; + + return $this[$next]->reachId($id); + } + + $tnext = $this[$next]; + $this->_resolveChoice($tnext->reach(), $accumulator); + + return $tnext->_resolve(\substr($path, $pos + 1), $accumulator, $id); + } + + $this->_resolveChoice($this->reach($path), $accumulator); + + return true; + } + + /** + * Resolve choices, i.e. a reach value has a “;”. + */ + protected function _resolveChoice($reach, &$accumulator) + { + if (null === $reach) { + $reach = ''; + } + + if (empty($accumulator)) { + $accumulator = \explode(';', $reach); + + return; + } + + if (false === \strpos($reach, ';')) { + if (false !== $pos = \strrpos($reach, "\r")) { + $reach = \substr($reach, $pos + 1); + + foreach ($accumulator as &$entry) { + $entry = null; + } + } + + foreach ($accumulator as &$entry) { + $entry .= $reach; + } + + return; + } + + $choices = \explode(';', $reach); + $ref = $accumulator; + $accumulator = []; + + foreach ($choices as $choice) { + if (false !== $pos = \strrpos($choice, "\r")) { + $choice = \substr($choice, $pos + 1); + + foreach ($ref as $entry) { + $accumulator[] = $choice; + } + } else { + foreach ($ref as $entry) { + $accumulator[] = $entry.$choice; + } + } + } + + unset($ref); + + return; + } + + /** + * Queue of the node. + * Generic one. Must be overrided in children classes. + */ + public function reach(string $queue = null) + { + return empty($queue) ? $this->_reach : $queue; + } + + /** + * ID of the component. + * Generic one. Should be overrided in children classes. + */ + public function reachId(string $id) + { + throw new ProtocolException('The node %s has no ID support (tried to reach #%s).', 4, [$this->getName(), $id]); + } + + /** + * Set a new reach value. + */ + public function setReach(string $reach) + { + $old = $this->_reach; + $this->_reach = $reach; + + return $old; + } + + /** + * Get node's name. + */ + public function getName() + { + return $this->_name; + } + + /** + * Get reach's root. + */ + protected function getReach() + { + return $this->_reach; + } + + /** + * Get an iterator. + */ + public function getIterator(): \ArrayIterator + { + return new \ArrayIterator($this->_children); + } + + /** + * Get root the protocol. + */ + public static function getRoot(): Protocol + { + return Protocol::getInstance(); + } + + /** + * Print a tree of component. + */ + public function __toString(): string + { + static $i = 0; + + $out = \str_repeat(' ', $i).$this->getName()."\n"; + + foreach ($this as $node) { + ++$i; + $out .= $node; + --$i; + } + + return $out; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php b/vendor/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php new file mode 100644 index 00000000..dfb0cb20 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ProtocolNodeLibrary.php @@ -0,0 +1,90 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * The `hoa://Library/` node. + */ +class ProtocolNodeLibrary extends ProtocolNode +{ + /** + * Queue of the component. + */ + public function reach(string $queue = null) + { + $withComposer = \class_exists('Composer\Autoload\ClassLoader', false) || + ('cli' === \PHP_SAPI && \file_exists(__DIR__.DS.'..'.DS.'..'.DS.'..'.DS.'..'.DS.'autoload.php')); + + if ($withComposer) { + return parent::reach($queue); + } + + if (!empty($queue)) { + $head = $queue; + + if (false !== $pos = \strpos($queue, '/')) { + $head = \substr($head, 0, $pos); + $queue = \DIRECTORY_SEPARATOR.\substr($queue, $pos + 1); + } else { + $queue = null; + } + + $out = []; + + foreach (\explode(';', $this->_reach) as $part) { + $out[] = "\r".$part.\strtolower($head).$queue; + } + + $out[] = "\r".\dirname(__DIR__, 5).$queue; + + return \implode(';', $out); + } + + $out = []; + + foreach (\explode(';', $this->_reach) as $part) { + $pos = \strrpos(\rtrim($part, \DIRECTORY_SEPARATOR), \DIRECTORY_SEPARATOR) + 1; + $head = \substr($part, 0, $pos); + $tail = \substr($part, $pos); + $out[] = $head.\strtolower($tail); + } + + $this->_reach = \implode(';', $out); + + return parent::reach($queue); + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php b/vendor/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php new file mode 100644 index 00000000..8d525e7e --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/ProtocolWrapper.php @@ -0,0 +1,473 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Stream wrapper for the `hoa://` protocol. + */ +class ProtocolWrapper +{ + /** + * Opened stream as a resource. + */ + private $_stream = null; + + /** + * Stream name (filename). + */ + private $_streamName = null; + + /** + * Stream context (given by the streamWrapper class) as a resource. + */ + public $context = null; + + /** + * Get the real path of the given URL. + * Could return false if the path cannot be reached. + */ + public static function realPath(string $path, bool $exists = true) + { + return ProtocolNode::getRoot()->resolve($path, $exists); + } + + /** + * Retrieve the underlying resource. + * + * `$castAs` can be `STREAM_CAST_FOR_SELECT` when `stream_select` is + * calling `stream_cast` or `STREAM_CAST_AS_STREAM` when `stream_cast` is + * called for other uses. + */ + public function stream_cast(int $castAs) + { + return null; + } + + /** + * Closes a resource. + * This method is called in response to `fclose`. + * All resources that were locked, or allocated, by the wrapper should be + * released. + */ + public function stream_close() + { + if (true === @\fclose($this->getStream())) { + $this->_stream = null; + $this->_streamName = null; + } + } + + /** + * Tests for end-of-file on a file pointer. + * This method is called in response to feof(). + */ + public function stream_eof(): bool + { + return \feof($this->getStream()); + } + + /** + * Flush the output. + * This method is called in respond to fflush(). + * If we have cached data in our stream but not yet stored it into the + * underlying storage, we should do so now. + */ + public function stream_flush(): bool + { + return \fflush($this->getStream()); + } + + /** + * Advisory file locking. + * This method is called in response to flock(), when file_put_contents() + * (when flags contains LOCK_EX), stream_set_blocking() and when closing the + * stream (LOCK_UN). + * + * Operation is one the following: + * * LOCK_SH to acquire a shared lock (reader) ; + * * LOCK_EX to acquire an exclusive lock (writer) ; + * * LOCK_UN to release a lock (shared or exclusive) ; + * * LOCK_NB if we don't want flock() to + * block while locking (not supported on + * Windows). + */ + public function stream_lock(int $operation): bool + { + return \flock($this->getStream(), $operation); + } + + /** + * Change stream options. + * This method is called to set metadata on the stream. It is called when + * one of the following functions is called on a stream URL: touch, chmod, + * chown or chgrp. + * + * Option must be one of the following constant: + * * STREAM_META_TOUCH, + * * STREAM_META_OWNER_NAME, + * * STREAM_META_OWNER, + * * STREAM_META_GROUP_NAME, + * * STREAM_META_GROUP, + * * STREAM_META_ACCESS. + * + * Values are arguments of `touch`, `chmod`, `chown`, and `chgrp`. + */ + public function stream_metadata(string $path, int $option, $values): bool + { + $path = static::realPath($path, false); + + switch ($option) { + case \STREAM_META_TOUCH: + $arity = \count($values); + + if (0 === $arity) { + $out = \touch($path); + } elseif (1 === $arity) { + $out = \touch($path, $values[0]); + } else { + $out = \touch($path, $values[0], $values[1]); + } + + break; + + case \STREAM_META_OWNER_NAME: + case \STREAM_META_OWNER: + $out = \chown($path, $values); + + break; + + case \STREAM_META_GROUP_NAME: + case \STREAM_META_GROUP: + $out = \chgrp($path, $values); + + break; + + case \STREAM_META_ACCESS: + $out = \chmod($path, $values); + + break; + + default: + $out = false; + } + + return $out; + } + + /** + * Open file or URL. + * This method is called immediately after the wrapper is initialized (f.e. + * by fopen() and file_get_contents()). + */ + public function stream_open(string $path, string $mode, int $options, &$openedPath): bool + { + $path = static::realPath($path, 'r' === $mode[0]); + + if (Protocol::NO_RESOLUTION === $path) { + return false; + } + + if (null === $this->context) { + $openedPath = \fopen($path, $mode, $options & \STREAM_USE_PATH); + } else { + $openedPath = \fopen( + $path, + $mode, + (bool) ($options & \STREAM_USE_PATH), + $this->context + ); + } + + if (false === \is_resource($openedPath)) { + return false; + } + + $this->_stream = $openedPath; + $this->_streamName = $path; + + return true; + } + + /** + * Read from stream. + * This method is called in response to fread() and fgets(). + */ + public function stream_read(int $size): string + { + return \fread($this->getStream(), $size); + } + + /** + * Seek to specific location in a stream. + * This method is called in response to fseek(). + * The read/write position of the stream should be updated according to the + * $offset and $whence. + * + * The possible values for `$whence` are: + * * SEEK_SET to set position equal to $offset bytes, + * * SEEK_CUR to set position to current location plus `$offset`, + * * SEEK_END to set position to end-of-file plus `$offset`. + */ + public function stream_seek(int $offset, int $whence = \SEEK_SET): bool + { + return 0 === \fseek($this->getStream(), $offset, $whence); + } + + /** + * Retrieve information about a file resource. + * This method is called in response to fstat(). + */ + public function stream_stat(): array + { + return \fstat($this->getStream()); + } + + /** + * Retrieve the current position of a stream. + * This method is called in response to ftell(). + */ + public function stream_tell(): int + { + return \ftell($this->getStream()); + } + + /** + * Truncate a stream to a given length. + */ + public function stream_truncate(int $size): bool + { + return \ftruncate($this->getStream(), $size); + } + + /** + * Write to stream. + * This method is called in response to fwrite(). + */ + public function stream_write(string $data): int + { + return \fwrite($this->getStream(), $data); + } + + /** + * Close directory handle. + * This method is called in to closedir(). + * Any resources which were locked, or allocated, during opening and use of + * the directory stream should be released. + */ + public function dir_closedir() + { + \closedir($this->getStream()); + $this->_stream = null; + $this->_streamName = null; + } + + /** + * Open directory handle. + * This method is called in response to opendir(). + * + * The `$options` input represents whether or not to enforce safe_mode + * (0x04). It is not used here. + */ + public function dir_opendir(string $path, int $options): bool + { + $path = static::realPath($path); + $handle = null; + + if (null === $this->context) { + $handle = @\opendir($path); + } else { + $handle = @\opendir($path, $this->context); + } + + if (false === $handle) { + return false; + } + + $this->_stream = $handle; + $this->_streamName = $path; + + return true; + } + + /** + * Read entry from directory handle. + * This method is called in response to readdir(). + * + * @return mixed + */ + public function dir_readdir() + { + return \readdir($this->getStream()); + } + + /** + * Rewind directory handle. + * This method is called in response to rewinddir(). + * Should reset the output generated by self::dir_readdir, i.e. the next + * call to self::dir_readdir should return the first entry in the location + * returned by self::dir_opendir. + */ + public function dir_rewinddir() + { + \rewinddir($this->getStream()); + } + + /** + * Create a directory. + * This method is called in response to mkdir(). + */ + public function mkdir(string $path, int $mode, int $options): bool + { + if (null === $this->context) { + return \mkdir( + static::realPath($path, false), + $mode, + $options | \STREAM_MKDIR_RECURSIVE + ); + } + + return \mkdir( + static::realPath($path, false), + $mode, + (bool) ($options | \STREAM_MKDIR_RECURSIVE), + $this->context + ); + } + + /** + * Rename a file or directory. + * This method is called in response to rename(). + * Should attempt to rename $from to $to. + */ + public function rename(string $from, string $to): bool + { + if (null === $this->context) { + return \rename(static::realPath($from), static::realPath($to, false)); + } + + return \rename( + static::realPath($from), + static::realPath($to, false), + $this->context + ); + } + + /** + * Remove a directory. + * This method is called in response to rmdir(). + * The `$options` input is a bitwise mask of values. It is not used here. + */ + public function rmdir(string $path, int $options): bool + { + if (null === $this->context) { + return \rmdir(static::realPath($path)); + } + + return \rmdir(static::realPath($path), $this->context); + } + + /** + * Delete a file. + * This method is called in response to unlink(). + */ + public function unlink(string $path): bool + { + if (null === $this->context) { + return \unlink(static::realPath($path)); + } + + return \unlink(static::realPath($path), $this->context); + } + + /** + * Retrieve information about a file. + * This method is called in response to all stat() related functions. + * The `$flags` input holds additional flags set by the streams API. It + * can hold one or more of the following values OR'd together. + * STREAM_URL_STAT_LINK: for resource with the ability to link to other + * resource (such as an HTTP location: forward, or a filesystem + * symlink). This flag specified that only information about the link + * itself should be returned, not the resource pointed to by the + * link. This flag is set in response to calls to lstat(), is_link(), or + * filetype(). STREAM_URL_STAT_QUIET: if this flag is set, our wrapper + * should not raise any errors. If this flag is not set, we are + * responsible for reporting errors using the trigger_error() function + * during stating of the path. + */ + public function url_stat(string $path, int $flags) + { + $path = static::realPath($path); + + if (Protocol::NO_RESOLUTION === $path) { + if ($flags & \STREAM_URL_STAT_QUIET) { + return 0; + } else { + return \trigger_error( + 'Path '.$path.' cannot be resolved.', + \E_WARNING + ); + } + } + + if ($flags & \STREAM_URL_STAT_LINK) { + return @\lstat($path); + } + + return @\stat($path); + } + + /** + * Get stream resource. + */ + public function getStream() + { + return $this->_stream; + } + + /** + * Get stream name. + */ + public function getStreamName() + { + return $this->_streamName; + } +} + +/* + * Register the `hoa://` protocol. + */ +\stream_wrapper_register('hoa', ProtocolWrapper::class); diff --git a/vendor/psy/psysh/src/Readline/Hoa/Readline.php b/vendor/psy/psysh/src/Readline/Hoa/Readline.php new file mode 100644 index 00000000..8439f9f0 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Readline.php @@ -0,0 +1,1028 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Console\Readline. + * + * Read, edit, bind… a line from the input. + */ +class Readline +{ + /** + * State: continue to read. + */ + const STATE_CONTINUE = 1; + + /** + * State: stop to read. + */ + const STATE_BREAK = 2; + + /** + * State: no output the current buffer. + */ + const STATE_NO_ECHO = 4; + + /** + * Current editing line. + */ + protected $_line = null; + + /** + * Current editing line seek. + */ + protected $_lineCurrent = 0; + + /** + * Current editing line length. + */ + protected $_lineLength = 0; + + /** + * Current buffer (most of the time, a char). + */ + protected $_buffer = null; + + /** + * Mapping. + */ + protected $_mapping = []; + + /** + * History. + */ + protected $_history = []; + + /** + * History current position. + */ + protected $_historyCurrent = 0; + + /** + * History size. + */ + protected $_historySize = 0; + + /** + * Prefix. + */ + protected $_prefix = null; + + /** + * Autocompleter. + */ + protected $_autocompleter = null; + + /** + * Initialize the readline editor. + */ + public function __construct() + { + if (\defined('PHP_WINDOWS_VERSION_PLATFORM')) { + return; + } + + $this->_mapping["\033[A"] = [$this, '_bindArrowUp']; + $this->_mapping["\033[B"] = [$this, '_bindArrowDown']; + $this->_mapping["\033[C"] = [$this, '_bindArrowRight']; + $this->_mapping["\033[D"] = [$this, '_bindArrowLeft']; + $this->_mapping["\001"] = [$this, '_bindControlA']; + $this->_mapping["\002"] = [$this, '_bindControlB']; + $this->_mapping["\005"] = [$this, '_bindControlE']; + $this->_mapping["\006"] = [$this, '_bindControlF']; + $this->_mapping["\010"] = + $this->_mapping["\177"] = [$this, '_bindBackspace']; + $this->_mapping["\027"] = [$this, '_bindControlW']; + $this->_mapping["\n"] = [$this, '_bindNewline']; + $this->_mapping["\t"] = [$this, '_bindTab']; + + return; + } + + /** + * Read a line from the input. + */ + public function readLine(string $prefix = null) + { + $input = Console::getInput(); + + if (true === $input->eof()) { + return false; + } + + $direct = Console::isDirect($input->getStream()->getStream()); + $output = Console::getOutput(); + + if (false === $direct || \defined('PHP_WINDOWS_VERSION_PLATFORM')) { + $out = $input->readLine(); + + if (false === $out) { + return false; + } + + $out = \substr($out, 0, -1); + + if (true === $direct) { + $output->writeAll($prefix); + } else { + $output->writeAll($prefix.$out."\n"); + } + + return $out; + } + + $this->resetLine(); + $this->setPrefix($prefix); + $read = [$input->getStream()->getStream()]; + $output->writeAll($prefix); + + while (true) { + @\stream_select($read, $write, $except, 30, 0); + + if (empty($read)) { + $read = [$input->getStream()->getStream()]; + + continue; + } + + $char = $this->_read(); + $this->_buffer = $char; + $return = $this->_readLine($char); + + if (0 === ($return & self::STATE_NO_ECHO)) { + $output->writeAll($this->_buffer); + } + + if (0 !== ($return & self::STATE_BREAK)) { + break; + } + } + + return $this->getLine(); + } + + /** + * Readline core. + */ + public function _readLine(string $char) + { + if (isset($this->_mapping[$char]) && + \is_callable($this->_mapping[$char])) { + $mapping = $this->_mapping[$char]; + + return $mapping($this); + } + + if (isset($this->_mapping[$char])) { + $this->_buffer = $this->_mapping[$char]; + } elseif (false === Ustring::isCharPrintable($char)) { + ConsoleCursor::bip(); + + return static::STATE_CONTINUE | static::STATE_NO_ECHO; + } + + if ($this->getLineLength() === $this->getLineCurrent()) { + $this->appendLine($this->_buffer); + + return static::STATE_CONTINUE; + } + + $this->insertLine($this->_buffer); + $tail = \mb_substr( + $this->getLine(), + $this->getLineCurrent() - 1 + ); + $this->_buffer = "\033[K".$tail.\str_repeat( + "\033[D", + \mb_strlen($tail) - 1 + ); + + return static::STATE_CONTINUE; + } + + /** + * Add mappings. + */ + public function addMappings(array $mappings) + { + foreach ($mappings as $key => $mapping) { + $this->addMapping($key, $mapping); + } + } + + /** + * Add a mapping. + * Supported key: + * • \e[… for \033[…; + * • \C-… for Ctrl-…; + * • abc for a simple mapping. + * A mapping is a callable that has only one parameter of type + * Hoa\Console\Readline and that returns a self::STATE_* constant. + */ + public function addMapping(string $key, $mapping) + { + if ('\e[' === \substr($key, 0, 3)) { + $this->_mapping["\033[".\substr($key, 3)] = $mapping; + } elseif ('\C-' === \substr($key, 0, 3)) { + $_key = \ord(\strtolower(\substr($key, 3))) - 96; + $this->_mapping[\chr($_key)] = $mapping; + } else { + $this->_mapping[$key] = $mapping; + } + } + + /** + * Add an entry in the history. + */ + public function addHistory(string $line = null) + { + if (empty($line)) { + return; + } + + $this->_history[] = $line; + $this->_historyCurrent = $this->_historySize++; + } + + /** + * Clear history. + */ + public function clearHistory() + { + unset($this->_history); + $this->_history = []; + $this->_historyCurrent = 0; + $this->_historySize = 1; + } + + /** + * Get an entry in the history. + */ + public function getHistory(int $i = null) + { + if (null === $i) { + $i = $this->_historyCurrent; + } + + if (!isset($this->_history[$i])) { + return null; + } + + return $this->_history[$i]; + } + + /** + * Go backward in the history. + */ + public function previousHistory() + { + if (0 >= $this->_historyCurrent) { + return $this->getHistory(0); + } + + return $this->getHistory($this->_historyCurrent--); + } + + /** + * Go forward in the history. + */ + public function nextHistory() + { + if ($this->_historyCurrent + 1 >= $this->_historySize) { + return $this->getLine(); + } + + return $this->getHistory(++$this->_historyCurrent); + } + + /** + * Get current line. + */ + public function getLine() + { + return $this->_line; + } + + /** + * Append to current line. + */ + public function appendLine(string $append) + { + $this->_line .= $append; + $this->_lineLength = \mb_strlen($this->_line); + $this->_lineCurrent = $this->_lineLength; + } + + /** + * Insert into current line at the current seek. + */ + public function insertLine(string $insert) + { + if ($this->_lineLength === $this->_lineCurrent) { + return $this->appendLine($insert); + } + + $this->_line = \mb_substr($this->_line, 0, $this->_lineCurrent). + $insert. + \mb_substr($this->_line, $this->_lineCurrent); + $this->_lineLength = \mb_strlen($this->_line); + $this->_lineCurrent += \mb_strlen($insert); + + return; + } + + /** + * Reset current line. + */ + protected function resetLine() + { + $this->_line = null; + $this->_lineCurrent = 0; + $this->_lineLength = 0; + } + + /** + * Get current line seek. + */ + public function getLineCurrent(): int + { + return $this->_lineCurrent; + } + + /** + * Get current line length. + * + * @return int + */ + public function getLineLength(): int + { + return $this->_lineLength; + } + + /** + * Set prefix. + */ + public function setPrefix(string $prefix) + { + $this->_prefix = $prefix; + } + + /** + * Get prefix. + */ + public function getPrefix() + { + return $this->_prefix; + } + + /** + * Get buffer. Not for user. + */ + public function getBuffer() + { + return $this->_buffer; + } + + /** + * Set an autocompleter. + */ + public function setAutocompleter(Autocompleter $autocompleter) + { + $old = $this->_autocompleter; + $this->_autocompleter = $autocompleter; + + return $old; + } + + /** + * Get the autocompleter. + */ + public function getAutocompleter(): Autocompleter + { + return $this->_autocompleter; + } + + /** + * Read on input. Not for user. + */ + public function _read(int $length = 512): string + { + return Console::getInput()->read($length); + } + + /** + * Set current line. Not for user. + */ + public function setLine(string $line) + { + $this->_line = $line; + $this->_lineLength = \mb_strlen($this->_line ?: ''); + $this->_lineCurrent = $this->_lineLength; + } + + /** + * Set current line seek. Not for user. + */ + public function setLineCurrent(int $current) + { + $this->_lineCurrent = $current; + } + + /** + * Set line length. Not for user. + */ + public function setLineLength(int $length) + { + $this->_lineLength = $length; + } + + /** + * Set buffer. Not for user. + */ + public function setBuffer(string $buffer) + { + $this->_buffer = $buffer; + } + + /** + * Up arrow binding. + * Go backward in the history. + */ + public function _bindArrowUp(self $self): int + { + if (0 === (static::STATE_CONTINUE & static::STATE_NO_ECHO)) { + ConsoleCursor::clear('↔'); + Console::getOutput()->writeAll($self->getPrefix()); + } + $buffer = $self->previousHistory() ?? ''; + $self->setBuffer($buffer); + $self->setLine($buffer); + + return static::STATE_CONTINUE; + } + + /** + * Down arrow binding. + * Go forward in the history. + */ + public function _bindArrowDown(self $self): int + { + if (0 === (static::STATE_CONTINUE & static::STATE_NO_ECHO)) { + ConsoleCursor::clear('↔'); + Console::getOutput()->writeAll($self->getPrefix()); + } + + $self->setBuffer($buffer = $self->nextHistory()); + $self->setLine($buffer); + + return static::STATE_CONTINUE; + } + + /** + * Right arrow binding. + * Move cursor to the right. + */ + public function _bindArrowRight(self $self): int + { + if ($self->getLineLength() > $self->getLineCurrent()) { + if (0 === (static::STATE_CONTINUE & static::STATE_NO_ECHO)) { + ConsoleCursor::move('→'); + } + + $self->setLineCurrent($self->getLineCurrent() + 1); + } + + $self->setBuffer(''); + + return static::STATE_CONTINUE; + } + + /** + * Left arrow binding. + * Move cursor to the left. + */ + public function _bindArrowLeft(self $self): int + { + if (0 < $self->getLineCurrent()) { + if (0 === (static::STATE_CONTINUE & static::STATE_NO_ECHO)) { + ConsoleCursor::move('←'); + } + + $self->setLineCurrent($self->getLineCurrent() - 1); + } + + $self->setBuffer(''); + + return static::STATE_CONTINUE; + } + + /** + * Backspace and Control-H binding. + * Delete the first character at the right of the cursor. + */ + public function _bindBackspace(self $self): int + { + $buffer = ''; + + if (0 < $self->getLineCurrent()) { + if (0 === (static::STATE_CONTINUE & static::STATE_NO_ECHO)) { + ConsoleCursor::move('←'); + ConsoleCursor::clear('→'); + } + + if ($self->getLineLength() === $current = $self->getLineCurrent()) { + $self->setLine(\mb_substr($self->getLine(), 0, -1)); + } else { + $line = $self->getLine(); + $current = $self->getLineCurrent(); + $tail = \mb_substr($line, $current); + $buffer = $tail.\str_repeat("\033[D", \mb_strlen($tail)); + $self->setLine(\mb_substr($line, 0, $current - 1).$tail); + $self->setLineCurrent($current - 1); + } + } + + $self->setBuffer($buffer); + + return static::STATE_CONTINUE; + } + + /** + * Control-A binding. + * Move cursor to beginning of line. + */ + public function _bindControlA(self $self): int + { + for ($i = $self->getLineCurrent() - 1; 0 <= $i; --$i) { + $self->_bindArrowLeft($self); + } + + return static::STATE_CONTINUE; + } + + /** + * Control-B binding. + * Move cursor backward one word. + */ + public function _bindControlB(self $self): int + { + $current = $self->getLineCurrent(); + + if (0 === $current) { + return static::STATE_CONTINUE; + } + + $words = \preg_split( + '#\b#u', + $self->getLine(), + -1, + \PREG_SPLIT_OFFSET_CAPTURE | \PREG_SPLIT_NO_EMPTY + ); + + for ( + $i = 0, $max = \count($words) - 1; + $i < $max && $words[$i + 1][1] < $current; + ++$i + ) { + } + + for ($j = $words[$i][1] + 1; $current >= $j; ++$j) { + $self->_bindArrowLeft($self); + } + + return static::STATE_CONTINUE; + } + + /** + * Control-E binding. + * Move cursor to end of line. + */ + public function _bindControlE(self $self): int + { + for ( + $i = $self->getLineCurrent(), $max = $self->getLineLength(); + $i < $max; + ++$i + ) { + $self->_bindArrowRight($self); + } + + return static::STATE_CONTINUE; + } + + /** + * Control-F binding. + * Move cursor forward one word. + */ + public function _bindControlF(self $self): int + { + $current = $self->getLineCurrent(); + + if ($self->getLineLength() === $current) { + return static::STATE_CONTINUE; + } + + $words = \preg_split( + '#\b#u', + $self->getLine(), + -1, + \PREG_SPLIT_OFFSET_CAPTURE | \PREG_SPLIT_NO_EMPTY + ); + + for ( + $i = 0, $max = \count($words) - 1; + $i < $max && $words[$i][1] < $current; + ++$i + ) { + } + + if (!isset($words[$i + 1])) { + $words[$i + 1] = [1 => $self->getLineLength()]; + } + + for ($j = $words[$i + 1][1]; $j > $current; --$j) { + $self->_bindArrowRight($self); + } + + return static::STATE_CONTINUE; + } + + /** + * Control-W binding. + * Delete first backward word. + */ + public function _bindControlW(self $self): int + { + $current = $self->getLineCurrent(); + + if (0 === $current) { + return static::STATE_CONTINUE; + } + + $words = \preg_split( + '#\b#u', + $self->getLine(), + -1, + \PREG_SPLIT_OFFSET_CAPTURE | \PREG_SPLIT_NO_EMPTY + ); + + for ( + $i = 0, $max = \count($words) - 1; + $i < $max && $words[$i + 1][1] < $current; + ++$i + ) { + } + + for ($j = $words[$i][1] + 1; $current >= $j; ++$j) { + $self->_bindBackspace($self); + } + + return static::STATE_CONTINUE; + } + + /** + * Newline binding. + */ + public function _bindNewline(self $self): int + { + $self->addHistory($self->getLine()); + + return static::STATE_BREAK; + } + + /** + * Tab binding. + */ + public function _bindTab(self $self): int + { + $output = Console::getOutput(); + $autocompleter = $self->getAutocompleter(); + $state = static::STATE_CONTINUE | static::STATE_NO_ECHO; + + if (null === $autocompleter) { + return $state; + } + + $current = $self->getLineCurrent(); + $line = $self->getLine(); + + if (0 === $current) { + return $state; + } + + $matches = \preg_match_all( + '#'.$autocompleter->getWordDefinition().'$#u', + \mb_substr($line, 0, $current), + $words + ); + + if (0 === $matches) { + return $state; + } + + $word = $words[0][0]; + + if ('' === \trim($word)) { + return $state; + } + + $solution = $autocompleter->complete($word); + $length = \mb_strlen($word); + + if (null === $solution) { + return $state; + } + + if (\is_array($solution)) { + $_solution = $solution; + $count = \count($_solution) - 1; + $cWidth = 0; + $window = ConsoleWindow::getSize(); + $wWidth = $window['x']; + $cursor = ConsoleCursor::getPosition(); + + \array_walk($_solution, function (&$value) use (&$cWidth) { + $handle = \mb_strlen($value); + + if ($handle > $cWidth) { + $cWidth = $handle; + } + + return; + }); + \array_walk($_solution, function (&$value) use (&$cWidth) { + $handle = \mb_strlen($value); + + if ($handle >= $cWidth) { + return; + } + + $value .= \str_repeat(' ', $cWidth - $handle); + + return; + }); + + $mColumns = (int) \floor($wWidth / ($cWidth + 2)); + $mLines = (int) \ceil(($count + 1) / $mColumns); + --$mColumns; + $i = 0; + + if (0 > $window['y'] - $cursor['y'] - $mLines) { + ConsoleWindow::scroll('↑', $mLines); + ConsoleCursor::move('↑', $mLines); + } + + ConsoleCursor::save(); + ConsoleCursor::hide(); + ConsoleCursor::move('↓ LEFT'); + ConsoleCursor::clear('↓'); + + foreach ($_solution as $j => $s) { + $output->writeAll("\033[0m".$s."\033[0m"); + + if ($i++ < $mColumns) { + $output->writeAll(' '); + } else { + $i = 0; + + if (isset($_solution[$j + 1])) { + $output->writeAll("\n"); + } + } + } + + ConsoleCursor::restore(); + ConsoleCursor::show(); + + ++$mColumns; + $input = Console::getInput(); + $read = [$input->getStream()->getStream()]; + $mColumn = -1; + $mLine = -1; + $coord = -1; + $unselect = function () use ( + &$mColumn, + &$mLine, + &$coord, + &$_solution, + &$cWidth, + $output + ) { + ConsoleCursor::save(); + ConsoleCursor::hide(); + ConsoleCursor::move('↓ LEFT'); + ConsoleCursor::move('→', $mColumn * ($cWidth + 2)); + ConsoleCursor::move('↓', $mLine); + $output->writeAll("\033[0m".$_solution[$coord]."\033[0m"); + ConsoleCursor::restore(); + ConsoleCursor::show(); + + return; + }; + $select = function () use ( + &$mColumn, + &$mLine, + &$coord, + &$_solution, + &$cWidth, + $output + ) { + ConsoleCursor::save(); + ConsoleCursor::hide(); + ConsoleCursor::move('↓ LEFT'); + ConsoleCursor::move('→', $mColumn * ($cWidth + 2)); + ConsoleCursor::move('↓', $mLine); + $output->writeAll("\033[7m".$_solution[$coord]."\033[0m"); + ConsoleCursor::restore(); + ConsoleCursor::show(); + + return; + }; + $init = function () use ( + &$mColumn, + &$mLine, + &$coord, + &$select + ) { + $mColumn = 0; + $mLine = 0; + $coord = 0; + $select(); + + return; + }; + + while (true) { + @\stream_select($read, $write, $except, 30, 0); + + if (empty($read)) { + $read = [$input->getStream()->getStream()]; + + continue; + } + + switch ($char = $self->_read()) { + case "\033[A": + if (-1 === $mColumn && -1 === $mLine) { + $init(); + + break; + } + + $unselect(); + $coord = \max(0, $coord - $mColumns); + $mLine = (int) \floor($coord / $mColumns); + $mColumn = $coord % $mColumns; + $select(); + + break; + + case "\033[B": + if (-1 === $mColumn && -1 === $mLine) { + $init(); + + break; + } + + $unselect(); + $coord = \min($count, $coord + $mColumns); + $mLine = (int) \floor($coord / $mColumns); + $mColumn = $coord % $mColumns; + $select(); + + break; + + case "\t": + case "\033[C": + if (-1 === $mColumn && -1 === $mLine) { + $init(); + + break; + } + + $unselect(); + $coord = \min($count, $coord + 1); + $mLine = (int) \floor($coord / $mColumns); + $mColumn = $coord % $mColumns; + $select(); + + break; + + case "\033[D": + if (-1 === $mColumn && -1 === $mLine) { + $init(); + + break; + } + + $unselect(); + $coord = \max(0, $coord - 1); + $mLine = (int) \floor($coord / $mColumns); + $mColumn = $coord % $mColumns; + $select(); + + break; + + case "\n": + if (-1 !== $mColumn && -1 !== $mLine) { + $tail = \mb_substr($line, $current); + $current -= $length; + $self->setLine( + \mb_substr($line, 0, $current). + $solution[$coord]. + $tail + ); + $self->setLineCurrent( + $current + \mb_strlen($solution[$coord]) + ); + + ConsoleCursor::move('←', $length); + $output->writeAll($solution[$coord]); + ConsoleCursor::clear('→'); + $output->writeAll($tail); + ConsoleCursor::move('←', \mb_strlen($tail)); + } + + // no break + default: + $mColumn = -1; + $mLine = -1; + $coord = -1; + ConsoleCursor::save(); + ConsoleCursor::move('↓ LEFT'); + ConsoleCursor::clear('↓'); + ConsoleCursor::restore(); + + if ("\033" !== $char && "\n" !== $char) { + $self->setBuffer($char); + + return $self->_readLine($char); + } + + break 2; + } + } + + return $state; + } + + $tail = \mb_substr($line, $current); + $current -= $length; + $self->setLine( + \mb_substr($line, 0, $current). + $solution. + $tail + ); + $self->setLineCurrent( + $current + \mb_strlen($solution) + ); + + ConsoleCursor::move('←', $length); + $output->writeAll($solution); + ConsoleCursor::clear('→'); + $output->writeAll($tail); + ConsoleCursor::move('←', \mb_strlen($tail)); + + return $state; + } +} + +/* + * Advanced interaction. + */ +Console::advancedInteraction(); diff --git a/vendor/psy/psysh/src/Readline/Hoa/Stream.php b/vendor/psy/psysh/src/Readline/Hoa/Stream.php new file mode 100644 index 00000000..62e56ce3 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Stream.php @@ -0,0 +1,571 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Stream. + * + * Static register for all streams (files, sockets etc.). + */ +abstract class Stream implements IStream, EventListenable +{ + use EventListens; + + /** + * Name index in the stream bucket. + */ + const NAME = 0; + + /** + * Handler index in the stream bucket. + */ + const HANDLER = 1; + + /** + * Resource index in the stream bucket. + */ + const RESOURCE = 2; + + /** + * Context index in the stream bucket. + */ + const CONTEXT = 3; + + /** + * Default buffer size. + */ + const DEFAULT_BUFFER_SIZE = 8192; + + /** + * Current stream bucket. + */ + protected $_bucket = []; + + /** + * Static stream register. + */ + private static $_register = []; + + /** + * Buffer size (default is 8Ko). + */ + protected $_bufferSize = self::DEFAULT_BUFFER_SIZE; + + /** + * Original stream name, given to the stream constructor. + */ + protected $_streamName = null; + + /** + * Context name. + */ + protected $_context = null; + + /** + * Whether the opening has been deferred. + */ + protected $_hasBeenDeferred = false; + + /** + * Whether this stream is already opened by another handler. + */ + protected $_borrowing = false; + + /** + * Set the current stream. + * If not exists in the register, try to call the + * `$this->_open()` method. Please, see the `self::_getStream()` method. + */ + public function __construct(string $streamName, string $context = null, bool $wait = false) + { + $this->_streamName = $streamName; + $this->_context = $context; + $this->_hasBeenDeferred = $wait; + $this->setListener( + new EventListener( + $this, + [ + 'authrequire', + 'authresult', + 'complete', + 'connect', + 'failure', + 'mimetype', + 'progress', + 'redirect', + 'resolve', + 'size', + ] + ) + ); + + if (true === $wait) { + return; + } + + $this->open(); + + return; + } + + /** + * Get a stream in the register. + * If the stream does not exist, try to open it by calling the + * $handler->_open() method. + */ + private static function &_getStream( + string $streamName, + self $handler, + string $context = null + ): array { + $name = \md5($streamName); + + if (null !== $context) { + if (false === StreamContext::contextExists($context)) { + throw new StreamException('Context %s was not previously declared, cannot retrieve '.'this context.', 0, $context); + } + + $context = StreamContext::getInstance($context); + } + + if (!isset(self::$_register[$name])) { + self::$_register[$name] = [ + self::NAME => $streamName, + self::HANDLER => $handler, + self::RESOURCE => $handler->_open($streamName, $context), + self::CONTEXT => $context, + ]; + Event::register( + 'hoa://Event/Stream/'.$streamName, + $handler + ); + // Add :open-ready? + Event::register( + 'hoa://Event/Stream/'.$streamName.':close-before', + $handler + ); + } else { + $handler->_borrowing = true; + } + + if (null === self::$_register[$name][self::RESOURCE]) { + self::$_register[$name][self::RESOURCE] + = $handler->_open($streamName, $context); + } + + return self::$_register[$name]; + } + + /** + * Open the stream and return the associated resource. + * Note: This method is protected, but do not forget that it could be + * overloaded into a public context. + */ + abstract protected function &_open(string $streamName, StreamContext $context = null); + + /** + * Close the current stream. + * Note: this method is protected, but do not forget that it could be + * overloaded into a public context. + */ + abstract protected function _close(): bool; + + /** + * Open the stream. + */ + final public function open(): self + { + $context = $this->_context; + + if (true === $this->hasBeenDeferred()) { + if (null === $context) { + $handle = StreamContext::getInstance(\uniqid()); + $handle->setParameters([ + 'notification' => [$this, '_notify'], + ]); + $context = $handle->getId(); + } elseif (true === StreamContext::contextExists($context)) { + $handle = StreamContext::getInstance($context); + $parameters = $handle->getParameters(); + + if (!isset($parameters['notification'])) { + $handle->setParameters([ + 'notification' => [$this, '_notify'], + ]); + } + } + } + + $this->_bufferSize = self::DEFAULT_BUFFER_SIZE; + $this->_bucket = self::_getStream( + $this->_streamName, + $this, + $context + ); + + return $this; + } + + /** + * Close the current stream. + */ + final public function close() + { + $streamName = $this->getStreamName(); + + if (null === $streamName) { + return; + } + + $name = \md5($streamName); + + if (!isset(self::$_register[$name])) { + return; + } + + Event::notify( + 'hoa://Event/Stream/'.$streamName.':close-before', + $this, + new EventBucket() + ); + + if (false === $this->_close()) { + return; + } + + unset(self::$_register[$name]); + $this->_bucket[self::HANDLER] = null; + Event::unregister( + 'hoa://Event/Stream/'.$streamName + ); + Event::unregister( + 'hoa://Event/Stream/'.$streamName.':close-before' + ); + + return; + } + + /** + * Get the current stream name. + */ + public function getStreamName() + { + if (empty($this->_bucket)) { + return null; + } + + return $this->_bucket[self::NAME]; + } + + /** + * Get the current stream. + */ + public function getStream() + { + if (empty($this->_bucket)) { + return null; + } + + return $this->_bucket[self::RESOURCE]; + } + + /** + * Get the current stream context. + */ + public function getStreamContext() + { + if (empty($this->_bucket)) { + return null; + } + + return $this->_bucket[self::CONTEXT]; + } + + /** + * Get stream handler according to its name. + */ + public static function getStreamHandler(string $streamName) + { + $name = \md5($streamName); + + if (!isset(self::$_register[$name])) { + return null; + } + + return self::$_register[$name][self::HANDLER]; + } + + /** + * Set the current stream. Useful to manage a stack of streams (e.g. socket + * and select). Notice that it could be unsafe to use this method without + * taking time to think about it two minutes. Resource of type “Unknown” is + * considered as valid. + */ + public function _setStream($stream) + { + if (false === \is_resource($stream) && + ('resource' !== \gettype($stream) || + 'Unknown' !== \get_resource_type($stream))) { + throw new StreamException('Try to change the stream resource with an invalid one; '.'given %s.', 1, \gettype($stream)); + } + + $old = $this->_bucket[self::RESOURCE]; + $this->_bucket[self::RESOURCE] = $stream; + + return $old; + } + + /** + * Check if the stream is opened. + */ + public function isOpened(): bool + { + return \is_resource($this->getStream()); + } + + /** + * Set the timeout period. + */ + public function setStreamTimeout(int $seconds, int $microseconds = 0): bool + { + return \stream_set_timeout($this->getStream(), $seconds, $microseconds); + } + + /** + * Whether the opening of the stream has been deferred. + */ + protected function hasBeenDeferred() + { + return $this->_hasBeenDeferred; + } + + /** + * Check whether the connection has timed out or not. + * This is basically a shortcut of `getStreamMetaData` + the `timed_out` + * index, but the resulting code is more readable. + */ + public function hasTimedOut(): bool + { + $metaData = $this->getStreamMetaData(); + + return true === $metaData['timed_out']; + } + + /** + * Set blocking/non-blocking mode. + */ + public function setStreamBlocking(bool $mode): bool + { + return \stream_set_blocking($this->getStream(), $mode); + } + + /** + * Set stream buffer. + * Output using fwrite() (or similar function) is normally buffered at 8 Ko. + * This means that if there are two processes wanting to write to the same + * output stream, each is paused after 8 Ko of data to allow the other to + * write. + */ + public function setStreamBuffer(int $buffer): bool + { + // Zero means success. + $out = 0 === \stream_set_write_buffer($this->getStream(), $buffer); + + if (true === $out) { + $this->_bufferSize = $buffer; + } + + return $out; + } + + /** + * Disable stream buffering. + * Alias of $this->setBuffer(0). + */ + public function disableStreamBuffer(): bool + { + return $this->setStreamBuffer(0); + } + + /** + * Get stream buffer size. + */ + public function getStreamBufferSize(): int + { + return $this->_bufferSize; + } + + /** + * Get stream wrapper name. + */ + public function getStreamWrapperName(): string + { + if (false === $pos = \strpos($this->getStreamName(), '://')) { + return 'file'; + } + + return \substr($this->getStreamName(), 0, $pos); + } + + /** + * Get stream meta data. + */ + public function getStreamMetaData(): array + { + return \stream_get_meta_data($this->getStream()); + } + + /** + * Whether this stream is already opened by another handler. + */ + public function isBorrowing(): bool + { + return $this->_borrowing; + } + + /** + * Notification callback. + */ + public function _notify( + int $ncode, + int $severity, + $message, + $code, + $transferred, + $max + ) { + static $_map = [ + \STREAM_NOTIFY_AUTH_REQUIRED => 'authrequire', + \STREAM_NOTIFY_AUTH_RESULT => 'authresult', + \STREAM_NOTIFY_COMPLETED => 'complete', + \STREAM_NOTIFY_CONNECT => 'connect', + \STREAM_NOTIFY_FAILURE => 'failure', + \STREAM_NOTIFY_MIME_TYPE_IS => 'mimetype', + \STREAM_NOTIFY_PROGRESS => 'progress', + \STREAM_NOTIFY_REDIRECTED => 'redirect', + \STREAM_NOTIFY_RESOLVE => 'resolve', + \STREAM_NOTIFY_FILE_SIZE_IS => 'size', + ]; + + $this->getListener()->fire($_map[$ncode], new EventBucket([ + 'code' => $code, + 'severity' => $severity, + 'message' => $message, + 'transferred' => $transferred, + 'max' => $max, + ])); + } + + /** + * Call the $handler->close() method on each stream in the static stream + * register. + * This method does not check the return value of $handler->close(). Thus, + * if a stream is persistent, the $handler->close() should do anything. It + * is a very generic method. + */ + final public static function _Hoa_Stream() + { + foreach (self::$_register as $entry) { + $entry[self::HANDLER]->close(); + } + + return; + } + + /** + * Transform object to string. + */ + public function __toString(): string + { + return $this->getStreamName(); + } + + /** + * Close the stream when destructing. + */ + public function __destruct() + { + if (false === $this->isOpened()) { + return; + } + + $this->close(); + + return; + } +} + +/** + * Class \Hoa\Stream\_Protocol. + * + * The `hoa://Library/Stream` node. + * + * @license New BSD License + */ +class _Protocol extends ProtocolNode +{ + /** + * Component's name. + * + * @var string + */ + protected $_name = 'Stream'; + + /** + * ID of the component. + * + * @param string $id ID of the component + * + * @return mixed + */ + public function reachId(string $id) + { + return Stream::getStreamHandler($id); + } +} + +/* + * Shutdown method. + */ +\register_shutdown_function([Stream::class, '_Hoa_Stream']); + +/** + * Add the `hoa://Library/Stream` node. Should be use to reach/get an entry + * in the stream register. + */ +$protocol = Protocol::getInstance(); +$protocol['Library'][] = new _Protocol(); diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamBufferable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamBufferable.php new file mode 100644 index 00000000..e431021a --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamBufferable.php @@ -0,0 +1,73 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Bufferable. + * + * Interface for bufferable streams. It's complementary to native buffer support + * of Hoa\Stream (please, see *StreamBuffer*() methods). Classes implementing + * this interface are able to create nested buffers, flush them etc. + */ +interface StreamBufferable extends IStream +{ + /** + * Start a new buffer. + * The callable acts like a light filter. + */ + public function newBuffer($callable = null, int $size = null): int; + + /** + * Flush the buffer. + */ + public function flush(); + + /** + * Delete buffer. + */ + public function deleteBuffer(): bool; + + /** + * Get bufffer level. + */ + public function getBufferLevel(): int; + + /** + * Get buffer size. + */ + public function getBufferSize(): int; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamContext.php b/vendor/psy/psysh/src/Readline/Hoa/StreamContext.php new file mode 100644 index 00000000..7e36e9b0 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamContext.php @@ -0,0 +1,136 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Stream\Context. + * + * Make a multiton of stream contexts. + */ +class StreamContext +{ + /** + * Context ID. + */ + protected $_id = null; + + /** + * Multiton. + */ + protected static $_instances = []; + + /** + * Construct a context. + */ + protected function __construct($id) + { + $this->_id = $id; + $this->_context = \stream_context_create(); + + return; + } + + /** + * Multiton. + */ + public static function getInstance(string $id): self + { + if (false === static::contextExists($id)) { + static::$_instances[$id] = new static($id); + } + + return static::$_instances[$id]; + } + + /** + * Get context ID. + */ + public function getId(): string + { + return $this->_id; + } + + /** + * Check if a context exists. + */ + public static function contextExists(string $id): bool + { + return \array_key_exists($id, static::$_instances); + } + + /** + * Set options. + * Please, see http://php.net/context. + */ + public function setOptions(array $options): bool + { + return \stream_context_set_option($this->getContext(), $options); + } + + /** + * Set parameters. + * Please, see http://php.net/context.params. + */ + public function setParameters(array $parameters): bool + { + return \stream_context_set_params($this->getContext(), $parameters); + } + + /** + * Get options. + */ + public function getOptions(): array + { + return \stream_context_get_options($this->getContext()); + } + + /** + * Get parameters. + */ + public function getParameters(): array + { + return \stream_context_get_params($this->getContext()); + } + + /** + * Get context as a resource. + */ + public function getContext() + { + return $this->_context; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamException.php b/vendor/psy/psysh/src/Readline/Hoa/StreamException.php new file mode 100644 index 00000000..21da03cf --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamException.php @@ -0,0 +1,46 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Class \Hoa\Stream\Exception. + * + * Extending the \Hoa\Exception\Exception class. + */ +class StreamException extends Exception +{ +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamIn.php b/vendor/psy/psysh/src/Readline/Hoa/StreamIn.php new file mode 100644 index 00000000..1ced9135 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamIn.php @@ -0,0 +1,102 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\In. + * + * Interface for input. + */ +interface StreamIn extends IStream +{ + /** + * Test for end-of-stream. + */ + public function eof(): bool; + + /** + * Read n characters. + */ + public function read(int $length); + + /** + * Alias of $this->read(). + */ + public function readString(int $length); + + /** + * Read a character. + * It could be equivalent to $this->read(1). + */ + public function readCharacter(); + + /** + * Read a boolean. + */ + public function readBoolean(); + + /** + * Read an integer. + */ + public function readInteger(int $length = 1); + + /** + * Read a float. + */ + public function readFloat(int $length = 1); + + /** + * Read an array. + * In most cases, it could be an alias to the $this->scanf() method. + */ + public function readArray(); + + /** + * Read a line. + */ + public function readLine(); + + /** + * Read all, i.e. read as much as possible. + */ + public function readAll(int $offset = 0); + + /** + * Parse input from a stream according to a format. + */ + public function scanf(string $format): array; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamLockable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamLockable.php new file mode 100644 index 00000000..c19c4dba --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamLockable.php @@ -0,0 +1,85 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Lockable. + * + * Interface for lockable input/output. + * + * @license New BSD License + */ +interface StreamLockable extends IStream +{ + /** + * Acquire a shared lock (reader). + * + * @const int + */ + const LOCK_SHARED = \LOCK_SH; + + /** + * Acquire an exclusive lock (writer). + * + * @const int + */ + const LOCK_EXCLUSIVE = \LOCK_EX; + + /** + * Release a lock (shared or exclusive). + * + * @const int + */ + const LOCK_RELEASE = \LOCK_UN; + + /** + * If we do not want $this->lock() to block while locking. + * + * @const int + */ + const LOCK_NO_BLOCK = \LOCK_NB; + + /** + * Portable advisory locking. + * Should take a look at stream_supports_lock(). + * + * @param int $operation operation, use the self::LOCK_* constants + * + * @return bool + */ + public function lock(int $operation): bool; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamOut.php b/vendor/psy/psysh/src/Readline/Hoa/StreamOut.php new file mode 100644 index 00000000..e4bb925e --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamOut.php @@ -0,0 +1,95 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Out. + * + * Interface for output. + */ +interface StreamOut extends IStream +{ + /** + * Write n characters. + */ + public function write(string $string, int $length); + + /** + * Write a string. + */ + public function writeString(string $string); + + /** + * Write a character. + */ + public function writeCharacter(string $character); + + /** + * Write a boolean. + */ + public function writeBoolean(bool $boolean); + + /** + * Write an integer. + */ + public function writeInteger(int $integer); + + /** + * Write a float. + */ + public function writeFloat(float $float); + + /** + * Write an array. + */ + public function writeArray(array $array); + + /** + * Write a line. + */ + public function writeLine(string $line); + + /** + * Write all, i.e. as much as possible. + */ + public function writeAll(string $string); + + /** + * Truncate a stream to a given length. + */ + public function truncate(int $size): bool; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamPathable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamPathable.php new file mode 100644 index 00000000..558684ae --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamPathable.php @@ -0,0 +1,55 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Pathable. + * + * Interface for pathable input/output. + */ +interface StreamPathable extends IStream +{ + /** + * Get filename component of path. + */ + public function getBasename(): string; + + /** + * Get directory name component of path. + */ + public function getDirname(): string; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamPointable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamPointable.php new file mode 100644 index 00000000..4030acbd --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamPointable.php @@ -0,0 +1,75 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Pointable. + * + * Interface for pointable input/output. + */ +interface StreamPointable extends IStream +{ + /** + * Set position equal to $offset bytes. + */ + const SEEK_SET = \SEEK_SET; + + /** + * Set position to current location plus $offset. + */ + const SEEK_CURRENT = \SEEK_CUR; + + /** + * Set position to end-of-file plus $offset. + */ + const SEEK_END = \SEEK_END; + + /** + * Rewind the position of a stream pointer. + */ + public function rewind(): bool; + + /** + * Seek on a stream pointer. + */ + public function seek(int $offset, int $whence = self::SEEK_SET): int; + + /** + * Get the current position of the stream pointer. + */ + public function tell(): int; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamStatable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamStatable.php new file mode 100644 index 00000000..9b83696d --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamStatable.php @@ -0,0 +1,115 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Statable. + * + * Interface for statable input/output. + */ +interface StreamStatable extends IStream +{ + /** + * Size is undefined. + */ + const SIZE_UNDEFINED = -1; + + /** + * Get size. + */ + public function getSize(): int; + + /** + * Get informations about a file. + */ + public function getStatistic(): array; + + /** + * Get last access time of file. + */ + public function getATime(): int; + + /** + * Get inode change time of file. + */ + public function getCTime(): int; + + /** + * Get file modification time. + */ + public function getMTime(): int; + + /** + * Get file group. + */ + public function getGroup(): int; + + /** + * Get file owner. + */ + public function getOwner(): int; + + /** + * Get file permissions. + */ + public function getPermissions(): int; + + /** + * Check if the file is readable. + */ + public function isReadable(): bool; + + /** + * Check if the file is writable. + */ + public function isWritable(): bool; + + /** + * Check if the file is executable. + */ + public function isExecutable(): bool; + + /** + * Clear file status cache. + */ + public function clearStatisticCache(); + + /** + * Clear all files status cache. + */ + public static function clearAllStatisticCaches(); +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/StreamTouchable.php b/vendor/psy/psysh/src/Readline/Hoa/StreamTouchable.php new file mode 100644 index 00000000..08b75255 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/StreamTouchable.php @@ -0,0 +1,110 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Interface \Hoa\Stream\IStream\Touchable. + * + * Interface for touchable input/output. + */ +interface StreamTouchable extends IStream +{ + /** + * Overwrite file if already exists. + */ + const OVERWRITE = true; + + /** + * Do not overwrite file if already exists. + */ + const DO_NOT_OVERWRITE = false; + + /** + * Make directory if does not exist. + */ + const MAKE_DIRECTORY = true; + + /** + * Do not make directory if does not exist. + */ + const DO_NOT_MAKE_DIRECTORY = false; + + /** + * Set access and modification time of file. + */ + public function touch(int $time = -1, int $atime = -1): bool; + + /** + * Copy file. + * Return the destination file path if succeed, false otherwise. + */ + public function copy(string $to, bool $force = self::DO_NOT_OVERWRITE): bool; + + /** + * Move a file. + */ + public function move( + string $name, + bool $force = self::DO_NOT_OVERWRITE, + bool $mkdir = self::DO_NOT_MAKE_DIRECTORY + ): bool; + + /** + * Delete a file. + */ + public function delete(): bool; + + /** + * Change file group. + */ + public function changeGroup($group): bool; + + /** + * Change file mode. + */ + public function changeMode(int $mode): bool; + + /** + * Change file owner. + */ + public function changeOwner($user): bool; + + /** + * Change the current umask. + */ + public static function umask(int $umask = null): int; +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Terminfo/77/windows-ansi b/vendor/psy/psysh/src/Readline/Hoa/Terminfo/77/windows-ansi new file mode 100644 index 0000000000000000000000000000000000000000..50864235f466bd89a7022f880fb565e26ca7e298 GIT binary patch literal 1481 zcmds%O=uHQ5Xa}O#Rf~ELJzHx(#vYJjb@Y07po@KfK^in+CyoOnr4e#ZPJ)TTWwSD z<k5qOg7x4*!GmB?FJAm;y?GVXf*uq+`gzcc@jv^K&A|$u1Q-4@zc({)-rM(*-6VXp zg*vDvQc|v1G3MFqEam;xiE^PgKV2y0s>b-#MDL7Ioy2%*x=bX<eS|Y`yqyvm@=zDm zfAe@KN$XJ7LhF(DP&;*^ax-`<#b_6N(wvuq9fZ=9F~`F+N@FH*QypYbkt#Gx=jnnS zzetxF70%LE5V_VAz23x5jq7jFP2_LeHFs>k^v5~%`UB)2(lR}#7xacc&?ovql4ui7 z-%imjdK#m8JqX?nCB$Xet4$ea2Kz<CSJ%ij*Zp7o_AlS~z4$1;iB_pi`giBhDfQT^ z`=ov;AgOEYB_{2WyxCD|#joC*4IYOX^kxsj9fH`)hFnr)eZPyETnftiAOd?K_9<u| zGyr9wAxKdQuwgbP#h9WEqcWMDN4O%u!+>UaW>y-1S$B~%*j=dIn>~Vn*@2fdVaNgA zm>Eer&?x3MW{P{6z&kf#*a3bI)qn{b#F;!71m!uUCi`W5oXf0J(P;w)yl*+dg;gyo zYm7mlYGKHYs=%-njQ|x3qrjMjagHL4x94*`Kz$wk8~t57x&y1nT5?ObzWYB<-aYZ^ z<fEzAg~!Eb(+j1QQ!C|_%2;*z^!+nWW}eR8JNxzAm$`TIFKdenKha_oQur>hV_lQ= z!@x)pCLw3FfD#O;;Yc(VKbl8~6^d(WoDV-_9to4`kPpYY4cZR%LG~T<rCDEFf$u2O HzzF>Ui1R$S literal 0 HcmV?d00001 diff --git a/vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm b/vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm new file mode 100644 index 0000000000000000000000000000000000000000..fec988defd5735515fd25e59255bdc6cb14f33c8 GIT binary patch literal 3258 zcmcguYlu}<6khx8GiimDl~mryu{vr(Hs^gW$GZ8RN$1XObaL`WIXUAv&Yedy<9kNJ zis(TQ21Vr$6U2}(2rH3(Sb>m8P!I(@{E_%W=mjA`ar@R@``$q+5Q;9dzi;jJt-aPh zd+&2*&s0q`hpwi5s?xB1tY>6k++ZV{eS=+<#-4#Km9DX&k;ZwQjcfY`yN9+luHG>^ z)-!MikurZwFbuL$`(rQc5>2HWsrom+sdO&_9J&k<H_<Ja$9!6V$UNOgtEfb4VLwP4 zftzWNw$r%D@;E(7&(I6Tewkhe@27)wnBJyi^Z|X0{%QJ*zNBwWM78>p<&3IUFGJ(s zRPZ!wSF6+243$;0)NN|6x>E%zuL^3JYJpxvYgcR4Lu$S1g*~W7)Xw@i$yLKW>N%sl zr1q(U>WF$@olu{s&(+uJtR3-#`bAxU{ky6f&-BdonOT`zGq-2vW_Dz%)p4}R-|l*E z53Ki0?|9}!-8&h{*2&DNe^4%tySVqM8S_Pb<Tsh`Gv`h37vOK!PkM6H6g^E}r)TQf zdY-;ZC%T|l=r+ApKcai}klv~%^ppBIy;r}c59q`C9erGXq)+M3^jG?fKBs@w7j#um zajtf5aArAkodr(hEOeGQE1lI&+1cRqJEP7n=LzRo=SAlgXR_+0So@qq&Rfn==U9E* zhtAZ7OBwm^V~Vy;d&5KjOT~>1eGS?2I+{Y$C|h>>++ok{PTgVO?H++6=mj)q%l>`f zm1xX1YQ>}}1DfdyxSG)lepJD$2*dL$rn?E9C1{JpnfeiXN@%T=o!1181^^yI!D|Zh zEQbs^b|rNP*)p^2#K6VevgP`y3Xfv&%?RH_7ottKFZ7z4?z#uLF|llU_Asm<4KX*g zd*E4RrW@?0Y#Va6@x*+Od-tQYqpgO=i{L4HiNTz~Jfq(PY-?tVjioSR_H%d}Ked<o z$jXH0Z<95Ux&?1j_HIac=D<wc82sGk8F?PYXssEX$9V3o89X!NSyeN50>;C&jj^U? zaP2;{kRbwW0RLq<a&X#R?xt+Q``Suw!5z-KW7sXX2dnO;*>V&6Vs|X{+>}ipW+<lT z4hQZy`ib;In30$X%$%EI)0*jWtj981zrL$$<Hp|JzP`<y`}-@Efq}unp`qd7#~vFQ z866!P+p=Zr)@|FiZ{M+F=gwWb#>XcncJunKLn|b_ScL@J+O`~x7b-}3A9%UpVKQ4& zcbff?UQ~DTQu)09Wk0lodGRqACx8iufJx4Q9hO+mS<ValO_mXFGTI6Gp^Zx;$sI}V zNODIuw>@R4aL#gG7`ct#_bdmNLt!tCC3h^jW62%c+~!<*Nh+MPoEJuJ<411cz;Y<; zrGexQBzGXW1Do5d9&!ukEa!!hTUHlI?3xINHZBb%cPP0-lbb&|IEeTnb#p%+1Qf8U zd}_G``83S)+aK`p^W0tDgnPF;7P>vA7nojbd!gxhwilaTAiZvL9LwQ<lEoZB^V;#u z!kUE>I$&-%c^aiRG77f|!gu#7nn5?yZMd;`l%oPIr&d}+WqOqQXqdLqZhDHIr@izl z?WaR@gx)oGlT)~vd_`yI9Q{DQ((k0z6>7S=5qFO{xOs#sRf}=&DB;HOu<Eh52Ck=Z zN4k=(LCu*o3svXQo#azO3u!SmQxTQd(R$pJDl~$7(gf|Hr&0YydYSgo0eTblkJ52E zK_}@neU2G?M`!6g{Y)3=56t0mHBDWsZcsO?*_g+CwLtlbUq`dk_}=oy+w*FVR*=fq zwDy4v<U1J(MMAMqA{59=9STK4u}~ru@C)yyp-?0g3nfgxJ%lnP-@ZcjwAZE-@P`6f zgd(9>C}D~vODtJp$r4MJSh7SC5=lrTA(4bc^+NpdK_Q_?C>BbD_#X#C0-;bS5{iYA zMYO1sI$NoK>5_mUWQZ7Ih6GUL#$u7hB8x>9ix8I;mqGzT0zv~q1VU|YYlRAg3WN%T z3WVCi6<fGs3s-F6iY;7m)$%n^fRKRDfDnODi=C_jp#q@-p#q_n+8=-lgbIWTgbIY( q-oj&nP=Qc^P=Qc8O5708QG(u4g4|Jp+EIeo<x~Ho9vbuwKK%&`scDx0 literal 0 HcmV?d00001 diff --git a/vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm-256color b/vendor/psy/psysh/src/Readline/Hoa/Terminfo/78/xterm-256color new file mode 100644 index 0000000000000000000000000000000000000000..d3be7ef31385b9ca2fc4ec194dbba933ee99a17f GIT binary patch literal 3322 zcmbtWYlu}<6khx8GpUh@m}TC|$vj$;de8gbj&<`rQ_h{6I%(b>>dZKf^K6`a&7)9* z$_jcwQTZbTQ6vh&N~9lFAS4nfL_rUKB>oV32qA%S`_^9P-a%3^y3GE*wb!@S+WYLY z&z?P5*)*NT(H?c6W@~?IU)L-*2%CF4d-?`Vw{}Z=|At!lYK?OfkurZwFbuN6f7KrB zB8{d=RKCoQRQXvVi>^b&t#k)QpGmV3nWKkjDe_jrevH-wH&Qokr9o5WIod@p(yPXP zi{1mjPy6T~eME=pbNUMX6LgZkqn}Jfx%_*=DOE0ChsM9r;IWBaE{|6eRa#9^cc~d_ zmhx0i<<%lp550i4Os!Opt2L?(cDL$N+pBp}tAab!Zlk=Z_Naa8L-m<Ds=ijI)DP-R zlJToLuP(s8sLIAOK6O)SN@{9qT53jWTdG_hL>u`HS9?2PeQJ6~Qb()akw~_VrH)@g zxis$5-Zv)a+iK>Isb5m(Oz%AKuf$J!Bx{r&t0(Bm`c8efo}(k3*GqJxUa6nbZMsKq z)<b%i-mTxz@9Mq!p#E4N(O>H0`lS9|pVnvfZ~B5R>rvJ?>lSN@HN%>11=d_^f%UMp z+$vekR)@988nAX+FIlfyZ(AdyUW>KI+HZYe9kLE1?~DJKdoA^^7E@az>a?2X#JXDa z|JU}`?5jzaR?{dNOX-r`ZudHNOKkVLc1s@|UK^k;U2-1+Ka9qlL@gOHC83V4hpP@P z?*^Ut6k#}Sr|E7$X93zgamH@Io+4TUrSHywgD!x>kaseEj%A-A%dV&jK3is%tB^RK zTe?)u>f|g2*JQXRIv;G9HrL5y<~)Gfm{_`WXD=)-_AxiK2jE$1rt1w;x)C)Sd19`^ zy+_cNp)H5U3E(L?k-@CN9HW~7HrBDl#zGh&`#HRkpW2CCRAs{RH_95wxOrzo`hG}w zX3tFA82sGk8F?PYXs8%m$9NvB7(6rMSz0l80>;B*8)HSq;IZ4$e1-tf4F1=0WZ_KS zatoy+ey<H==k4B{-H*3rw_?@pI9<xHFSPq($Bx-_Vftb^cCTj-q8~}$hZ%?&!OYq* zURoWE!FnvBHEY(cUBAAqt-XEY#*U88&aSTR?w+3B-lw1L>)W)czyFzMHgDdtW$V^$ z+qQ2X7#JKJ8XD&HU5%EHc(L*kUTfoGG+rn#=J&wM4G)ufHC3m1Khg`TPF^aP-+#&V zlVo0eBx46KVG}UPK1kA{gtH0fgxyTSh&L6J3Aug}7Y9;1klKON4wBl*E{lb;3Fm}S z+xT54VJ~4{*oi}_9ZKy`YKKW}voD<}7S1M|6Gm<0M{Qv*VPDvZJ*n+UZBJ@@No})w zs4bjLI46wSvbrdetckFn#KpeU_NBIOYV(nUjffMeh5KPQAdgk$UCYhO#eNPO=?OnJ z`#kPzTX!Gt!vQx4hU}U40KWUokUhtCXS=KB@SePq;$L1#KaOF{*N6S>*aO)id#>H@ znbGW4<8ngd%T@GQc8lHW;l0V6%uX-y=TS}fFO%+MDgh?nzce4)yNf7=YtenQnf9lY zxr-3a?Hg$#-9~re#^X?y^0b&5Xa$vM9ko+0ZJ}X$o?fOm=pA~W_S1*-iMiVx$Ia$@ zI!$NkSNfAKl2+HN@oEz8F4J*y@l~wm<K9xljpa$zn%p|dWg?9`))=~h#?#G|rdqP; z9^AA%jC?=Mr#dQN?A5decdbt9!%b_LcG3&<3cXHm(H`1M2QY&}bcBx5F*-q~Fo&P% z44tDt=mPzXS&UKR)CA1qb~P1usC!igbIB_Hq|I)@na!Ig+4ITv^kO-YD~GHnXRR+3 z2!%qCkS7O&FBAxcLXnWihlUgTLV-{y6fwEUMwThL$!C~+F_kHKeAu9hP#_cvMNFYo z38hLXRYIu}N|iuD0tpEuB#@AxIuIXV7)U4(3WXve{^x@bPskSvghHWc9?e@tOER=5 zL(4PNv2cOM;4=gaAwvWxaAUE+Vu8g1iv@^_3JakCApxNQAp)V+H8wy6LIpwvLIpyt z=Mn39#CjgFo=2?b5tlAr0R;#N2n`4k2(_?^RUlL#R3KC!)Z(&7p#q@-p#q@-p)RZE oTp&~+R3KC!)TSag1T+<)Hx(f_6`?j2A+B|)W1WKrz1gLI0AtO0NdN!< literal 0 HcmV?d00001 diff --git a/vendor/psy/psysh/src/Readline/Hoa/Ustring.php b/vendor/psy/psysh/src/Readline/Hoa/Ustring.php new file mode 100644 index 00000000..8d7312b9 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Ustring.php @@ -0,0 +1,143 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * This class represents a UTF-8 string. + * Please, see: + * * http://www.ietf.org/rfc/rfc3454.txt, + * * http://unicode.org/reports/tr9/, + * * http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt. + */ +class Ustring +{ + /** + * Check if ext/mbstring is available. + */ + public static function checkMbString(): bool + { + return \function_exists('mb_substr'); + } + + /** + * Get the number of column positions of a wide-character. + * + * This is a PHP implementation of wcwidth() and wcswidth() (defined in IEEE + * Std 1002.1-2001) for Unicode, by Markus Kuhn. Please, see + * http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c. + * + * The wcwidth(wc) function shall either return 0 (if wc is a null + * wide-character code), or return the number of column positions to be + * occupied by the wide-character code wc, or return -1 (if wc does not + * correspond to a printable wide-character code). + */ + public static function getCharWidth(string $char): int + { + $char = (string) $char; + $c = static::toCode($char); + + // Test for 8-bit control characters. + if (0x0 === $c) { + return 0; + } + + if (0x20 > $c || (0x7F <= $c && $c < 0xA0)) { + return -1; + } + + // Non-spacing characters. + if (0xAD !== $c && + 0 !== \preg_match('#^[\p{Mn}\p{Me}\p{Cf}\x{1160}-\x{11ff}\x{200b}]#u', $char)) { + return 0; + } + + // If we arrive here, $c is not a combining C0/C1 control character. + return 1 + + (0x1100 <= $c && + (0x115F >= $c || // Hangul Jamo init. consonants + 0x2329 === $c || 0x232A === $c || + (0x2E80 <= $c && 0xA4CF >= $c && + 0x303F !== $c) || // CJK…Yi + (0xAC00 <= $c && 0xD7A3 >= $c) || // Hangul Syllables + (0xF900 <= $c && 0xFAFF >= $c) || // CJK Compatibility Ideographs + (0xFE10 <= $c && 0xFE19 >= $c) || // Vertical forms + (0xFE30 <= $c && 0xFE6F >= $c) || // CJK Compatibility Forms + (0xFF00 <= $c && 0xFF60 >= $c) || // Fullwidth Forms + (0xFFE0 <= $c && 0xFFE6 >= $c) || + (0x20000 <= $c && 0x2FFFD >= $c) || + (0x30000 <= $c && 0x3FFFD >= $c))); + } + + /** + * Check whether the character is printable or not. + */ + public static function isCharPrintable(string $char): bool + { + return 1 <= static::getCharWidth($char); + } + + /** + * Get a decimal code representation of a specific character. + */ + public static function toCode(string $char): int + { + $char = (string) $char; + $code = \ord($char[0]); + $bytes = 1; + + if (!($code & 0x80)) { // 0xxxxxxx + return $code; + } + + if (($code & 0xE0) === 0xC0) { // 110xxxxx + $bytes = 2; + $code = $code & ~0xC0; + } elseif (($code & 0xF0) === 0xE0) { // 1110xxxx + $bytes = 3; + $code = $code & ~0xE0; + } elseif (($code & 0xF8) === 0xF0) { // 11110xxx + $bytes = 4; + $code = $code & ~0xF0; + } + + for ($i = 2; $i <= $bytes; $i++) { // 10xxxxxx + $code = ($code << 6) + (\ord($char[$i - 1]) & ~0x80); + } + + return $code; + } +} diff --git a/vendor/psy/psysh/src/Readline/Hoa/Xcallable.php b/vendor/psy/psysh/src/Readline/Hoa/Xcallable.php new file mode 100644 index 00000000..fa7bc470 --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Hoa/Xcallable.php @@ -0,0 +1,254 @@ +<?php + +/** + * Hoa + * + * + * @license + * + * New BSD License + * + * Copyright © 2007-2017, Hoa community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Hoa nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +namespace Psy\Readline\Hoa; + +/** + * Build a callable object, i.e. `function`, `class::method`, `object->method` or + * closure. They all have the same behaviour. This callable is an extension of + * native PHP callable (aka callback) to integrate Hoa's structures. + */ +class Xcallable +{ + /** + * Callback with the PHP format. + */ + protected $_callback = null; + + /** + * Callable hash. + */ + protected $_hash = null; + + /** + * Allocates a xcallable based on a callback. + * + * Accepted forms: + * * `'function'`, + * * `'class::method'`, + * * `'class', 'method'`, + * * `$object, 'method'`, + * * `$object, ''`, + * * `function (…) { … }`, + * * `['class', 'method']`, + * * `[$object, 'method']`. + * + * # Examples + * + * ```php + * $toUpper = new Hoa\Consistency\Xcallable('strtoupper'); + * assert('FOO' === $toUpper('foo')); + * ``` + * + * # Exceptions + * + * A `Hoa\Consistency\Exception` exception is thrown if the callback form + * is invalid. + * + * ```php,must_throw(Hoa\Consistency\Exception) + * new Hoa\Consistency\Xcallable('Foo:'); + * ``` + */ + public function __construct($call, $able = '') + { + if ($call instanceof \Closure) { + $this->_callback = $call; + + return; + } + + if (!\is_string($able)) { + throw new Exception('Bad callback form; the able part must be a string.', 0); + } + + if ('' === $able) { + if (\is_string($call)) { + if (false === \strpos($call, '::')) { + if (!\function_exists($call)) { + throw new Exception('Bad callback form; function %s does not exist.', 1, $call); + } + + $this->_callback = $call; + + return; + } + + list($call, $able) = \explode('::', $call); + } elseif (\is_object($call)) { + if ($call instanceof StreamOut) { + $able = null; + } elseif (\method_exists($call, '__invoke')) { + $able = '__invoke'; + } else { + throw new Exception('Bad callback form; an object but without a known '.'method.', 2); + } + } elseif (\is_array($call) && isset($call[0])) { + if (!isset($call[1])) { + return $this->__construct($call[0]); + } + + return $this->__construct($call[0], $call[1]); + } else { + throw new Exception('Bad callback form.', 3); + } + } + + $this->_callback = [$call, $able]; + + return; + } + + /** + * Calls the callable. + */ + public function __invoke(...$arguments) + { + $callback = $this->getValidCallback($arguments); + + return $callback(...$arguments); + } + + /** + * Returns a valid PHP callback. + */ + public function getValidCallback(array &$arguments = []) + { + $callback = $this->_callback; + $head = null; + + if (isset($arguments[0])) { + $head = &$arguments[0]; + } + + // If method is undetermined, we find it (we understand event bucket and + // stream). + if (null !== $head && + \is_array($callback) && + null === $callback[1]) { + if ($head instanceof EventBucket) { + $head = $head->getData(); + } + + switch ($type = \gettype($head)) { + case 'string': + if (1 === \strlen($head)) { + $method = 'writeCharacter'; + } else { + $method = 'writeString'; + } + + break; + + case 'boolean': + case 'integer': + case 'array': + $method = 'write'.\ucfirst($type); + + break; + + case 'double': + $method = 'writeFloat'; + + break; + + default: + $method = 'writeAll'; + $head = $head."\n"; + } + + $callback[1] = $method; + } + + return $callback; + } + + /** + * Computes the hash of this callable. + * + * Will produce: + * * `function#…`, + * * `class#…::…`, + * * `object(…)#…::…`, + * * `closure(…)`. + */ + public function getHash(): string + { + if (null !== $this->_hash) { + return $this->_hash; + } + + $_ = &$this->_callback; + + if (\is_string($_)) { + return $this->_hash = 'function#'.$_; + } + + if (\is_array($_)) { + return + $this->_hash = + (\is_object($_[0]) + ? 'object('.\spl_object_hash($_[0]).')'. + '#'.\get_class($_[0]) + : 'class#'.$_[0]). + '::'. + (null !== $_[1] + ? $_[1] + : '???'); + } + + return $this->_hash = 'closure('.\spl_object_hash($_).')'; + } + + /** + * The string representation of a callable is its hash. + */ + public function __toString(): string + { + return $this->getHash(); + } + + /** + * Hoa's xcallable() helper. + */ + public static function from($call, $able = '') + { + if ($call instanceof self) { + return $call; + } + + return new self($call, $able); + } +} diff --git a/vendor/psy/psysh/src/Readline/HoaConsole.php b/vendor/psy/psysh/src/Readline/HoaConsole.php index 99011759..db0a07d0 100644 --- a/vendor/psy/psysh/src/Readline/HoaConsole.php +++ b/vendor/psy/psysh/src/Readline/HoaConsole.php @@ -11,119 +11,11 @@ namespace Psy\Readline; -use Hoa\Console\Console; -use Hoa\Console\Cursor; -use Hoa\Console\Readline\Readline as HoaReadline; -use Psy\Exception\BreakException; - /** * Hoa\Console Readline implementation. + * + * @deprecated, use Userland readline */ -class HoaConsole implements Readline +class HoaConsole extends Userland { - /** @var HoaReadline */ - private $hoaReadline; - - /** @var string|null */ - private $lastPrompt; - - /** - * @return bool - */ - public static function isSupported(): bool - { - return \class_exists(Console::class, true); - } - - /** - * {@inheritdoc} - */ - public static function supportsBracketedPaste(): bool - { - return false; - } - - public function __construct() - { - $this->hoaReadline = new HoaReadline(); - $this->hoaReadline->addMapping('\C-l', function () { - $this->redisplay(); - - return HoaReadline::STATE_NO_ECHO; - }); - } - - /** - * {@inheritdoc} - */ - public function addHistory(string $line): bool - { - $this->hoaReadline->addHistory($line); - - return true; - } - - /** - * {@inheritdoc} - */ - public function clearHistory(): bool - { - $this->hoaReadline->clearHistory(); - - return true; - } - - /** - * {@inheritdoc} - */ - public function listHistory(): array - { - $i = 0; - $list = []; - while (($item = $this->hoaReadline->getHistory($i++)) !== null) { - $list[] = $item; - } - - return $list; - } - - /** - * {@inheritdoc} - */ - public function readHistory(): bool - { - return true; - } - - /** - * {@inheritdoc} - * - * @throws BreakException if user hits Ctrl+D - * - * @return false|string - */ - public function readline(string $prompt = null) - { - $this->lastPrompt = $prompt; - - return $this->hoaReadline->readLine($prompt); - } - - /** - * {@inheritdoc} - */ - public function redisplay() - { - $currentLine = $this->hoaReadline->getLine(); - Cursor::clear('all'); - echo $this->lastPrompt, $currentLine; - } - - /** - * {@inheritdoc} - */ - public function writeHistory(): bool - { - return true; - } } diff --git a/vendor/psy/psysh/src/Readline/Userland.php b/vendor/psy/psysh/src/Readline/Userland.php new file mode 100644 index 00000000..00e1070e --- /dev/null +++ b/vendor/psy/psysh/src/Readline/Userland.php @@ -0,0 +1,161 @@ +<?php + +/* + * This file is part of Psy Shell. + * + * (c) 2012-2022 Justin Hileman + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Psy\Readline; + +use Psy\Exception\BreakException; +use Psy\Readline\Hoa\Console as HoaConsole; +use Psy\Readline\Hoa\ConsoleCursor as HoaConsoleCursor; +use Psy\Readline\Hoa\ConsoleInput as HoaConsoleInput; +use Psy\Readline\Hoa\ConsoleOutput as HoaConsoleOutput; +use Psy\Readline\Hoa\ConsoleTput as HoaConsoleTput; +use Psy\Readline\Hoa\Readline as HoaReadline; +use Psy\Readline\Hoa\Ustring as HoaUstring; + +/** + * Userland Readline implementation. + */ +class Userland implements Readline +{ + /** @var HoaReadline */ + private $hoaReadline; + + /** @var string|null */ + private $lastPrompt; + + private $tput; + private $input; + private $output; + + /** + * @return bool + */ + public static function isSupported(): bool + { + return HoaUstring::checkMbString(); + } + + /** + * {@inheritdoc} + */ + public static function supportsBracketedPaste(): bool + { + return false; + } + + /** + * Doesn't (currently) support history file, size or erase dupes configs. + */ + public function __construct($historyFile = null, $historySize = 0, $eraseDups = false) + { + static::bootstrapHoa(); + + $this->hoaReadline = new HoaReadline(); + $this->hoaReadline->addMapping('\C-l', function () { + $this->redisplay(); + + return HoaReadline::STATE_NO_ECHO; + }); + + $this->tput = new HoaConsoleTput(); + HoaConsole::setTput($this->tput); + + $this->input = new HoaConsoleInput(); + HoaConsole::setInput($this->input); + + $this->output = new HoaConsoleOutput(); + HoaConsole::setOutput($this->output); + } + + /** + * Bootstrap some things that Hoa used to do itself. + */ + public static function bootstrapHoa() + { + \class_exists('Psy\Readline\Hoa\ProtocolWrapper'); // A side effect registers hoa:// stream wrapper + \class_exists('Psy\Readline\Hoa\Stream'); // A side effect registers hoa://Library/Stream + \class_exists('Psy\Readline\Hoa\ConsoleWindow'); // A side effect binds terminal resize + } + + /** + * {@inheritdoc} + */ + public function addHistory(string $line): bool + { + $this->hoaReadline->addHistory($line); + + return true; + } + + /** + * {@inheritdoc} + */ + public function clearHistory(): bool + { + $this->hoaReadline->clearHistory(); + + return true; + } + + /** + * {@inheritdoc} + */ + public function listHistory(): array + { + $i = 0; + $list = []; + while (($item = $this->hoaReadline->getHistory($i++)) !== null) { + $list[] = $item; + } + + return $list; + } + + /** + * {@inheritdoc} + */ + public function readHistory(): bool + { + return true; + } + + /** + * {@inheritdoc} + * + * @throws BreakException if user hits Ctrl+D + * + * @return string + */ + public function readline(string $prompt = null) + { + $this->lastPrompt = $prompt; + + return $this->hoaReadline->readLine($prompt); + } + + /** + * {@inheritdoc} + */ + public function redisplay() + { + $currentLine = $this->hoaReadline->getLine(); + HoaConsoleCursor::clear('all'); + echo $this->lastPrompt, $currentLine; + } + + /** + * {@inheritdoc} + */ + public function writeHistory(): bool + { + return true; + } +} diff --git a/vendor/psy/psysh/src/Shell.php b/vendor/psy/psysh/src/Shell.php index a647c01a..0cd29da5 100644 --- a/vendor/psy/psysh/src/Shell.php +++ b/vendor/psy/psysh/src/Shell.php @@ -22,6 +22,7 @@ use Psy\ExecutionLoop\RunkitReloader; use Psy\Formatter\TraceFormatter; use Psy\Input\ShellInput; use Psy\Input\SilentInput; +use Psy\Output\ShellOutput; use Psy\TabCompletion\Matcher; use Psy\VarDumper\PresenterAware; use Symfony\Component\Console\Application; @@ -48,7 +49,7 @@ use Symfony\Component\Console\Output\OutputInterface; */ class Shell extends Application { - const VERSION = 'v0.11.2'; + const VERSION = 'v0.11.5'; const PROMPT = '>>> '; const BUFF_PROMPT = '... '; @@ -1058,6 +1059,12 @@ class Shell extends Application */ public function writeStdout(string $out, int $phase = \PHP_OUTPUT_HANDLER_END) { + if ($phase & \PHP_OUTPUT_HANDLER_START) { + if ($this->output instanceof ShellOutput) { + $this->output->startPaging(); + } + } + $isCleaning = $phase & \PHP_OUTPUT_HANDLER_CLEAN; // Incremental flush @@ -1084,6 +1091,10 @@ class Shell extends Application $this->context->setLastStdout($this->stdoutBuffer); $this->stdoutBuffer = ''; } + + if ($this->output instanceof ShellOutput) { + $this->output->stopPaging(); + } } } @@ -1116,7 +1127,11 @@ class Shell extends Application $formatted = static::RETVAL.\str_replace(\PHP_EOL, \PHP_EOL.$indent, $formatted); } - $this->output->writeln($formatted); + if ($this->output instanceof ShellOutput) { + $this->output->page($formatted.\PHP_EOL); + } else { + $this->output->writeln($formatted); + } } /** diff --git a/vendor/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php b/vendor/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php index 46d261e8..702109dd 100644 --- a/vendor/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php +++ b/vendor/psy/psysh/src/TabCompletion/Matcher/AbstractDefaultParametersMatcher.php @@ -29,7 +29,7 @@ abstract class AbstractDefaultParametersMatcher extends AbstractContextAwareMatc $defaultValue = $this->valueToShortString($parameter->getDefaultValue()); - $parametersProcessed[] = "\${$parameter->getName()} = $defaultValue"; + $parametersProcessed[] = \sprintf('$%s = %s', $parameter->getName(), $defaultValue); } if (empty($parametersProcessed)) { diff --git a/vendor/psy/psysh/src/VersionUpdater/GitHubChecker.php b/vendor/psy/psysh/src/VersionUpdater/GitHubChecker.php index 4093b6f8..726a3382 100644 --- a/vendor/psy/psysh/src/VersionUpdater/GitHubChecker.php +++ b/vendor/psy/psysh/src/VersionUpdater/GitHubChecker.php @@ -75,7 +75,7 @@ class GitHubChecker implements Checker $context = \stream_context_create([ 'http' => [ 'user_agent' => 'PsySH/'.Shell::VERSION, - 'timeout' => 3, + 'timeout' => 1.0, ], ]); diff --git a/vendor/psy/psysh/src/functions.php b/vendor/psy/psysh/src/functions.php index 2ca1ec5d..439a720b 100644 --- a/vendor/psy/psysh/src/functions.php +++ b/vendor/psy/psysh/src/functions.php @@ -225,6 +225,7 @@ if (!\function_exists('Psy\\info')) { 'color mode' => $config->colorMode(), 'output decorated' => $config->getOutputDecorated(), 'output verbosity' => $config->verbosity(), + 'output pager' => $config->getPager(), ]; $pcntl = [ diff --git a/vendor/symfony/cache-contracts/LICENSE b/vendor/symfony/cache-contracts/LICENSE index 23584145..74cdc2db 100644 --- a/vendor/symfony/cache-contracts/LICENSE +++ b/vendor/symfony/cache-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2021 Fabien Potencier +Copyright (c) 2018-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/cache/Adapter/ArrayAdapter.php b/vendor/symfony/cache/Adapter/ArrayAdapter.php index bd5ec9ec..783c20d9 100644 --- a/vendor/symfony/cache/Adapter/ArrayAdapter.php +++ b/vendor/symfony/cache/Adapter/ArrayAdapter.php @@ -81,7 +81,10 @@ class ArrayAdapter implements AdapterInterface, CacheInterface, LoggerAwareInter // ArrayAdapter works in memory, we don't care about stampede protection if (\INF === $beta || !$item->isHit()) { $save = true; - $this->save($item->set($callback($item, $save))); + $item->set($callback($item, $save)); + if ($save) { + $this->save($item); + } } return $item->get(); diff --git a/vendor/symfony/cache/Adapter/ChainAdapter.php b/vendor/symfony/cache/Adapter/ChainAdapter.php index 56806976..7db068a5 100644 --- a/vendor/symfony/cache/Adapter/ChainAdapter.php +++ b/vendor/symfony/cache/Adapter/ChainAdapter.php @@ -94,9 +94,17 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa */ public function get(string $key, callable $callback, float $beta = null, array &$metadata = null) { + $doSave = true; + $callback = static function (CacheItem $item, bool &$save) use ($callback, &$doSave) { + $value = $callback($item, $save); + $doSave = $save; + + return $value; + }; + $lastItem = null; $i = 0; - $wrap = function (CacheItem $item = null) use ($key, $callback, $beta, &$wrap, &$i, &$lastItem, &$metadata) { + $wrap = function (CacheItem $item = null, bool &$save = true) use ($key, $callback, $beta, &$wrap, &$i, &$doSave, &$lastItem, &$metadata) { $adapter = $this->adapters[$i]; if (isset($this->adapters[++$i])) { $callback = $wrap; @@ -110,6 +118,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa if (null !== $item) { (self::$syncItem)($lastItem = $lastItem ?? $item, $item, $this->defaultLifetime, $metadata); } + $save = $doSave; return $value; }; diff --git a/vendor/symfony/cache/DoctrineProvider.php b/vendor/symfony/cache/DoctrineProvider.php index 2c9d7570..7b55aae2 100644 --- a/vendor/symfony/cache/DoctrineProvider.php +++ b/vendor/symfony/cache/DoctrineProvider.php @@ -15,6 +15,10 @@ use Doctrine\Common\Cache\CacheProvider; use Psr\Cache\CacheItemPoolInterface; use Symfony\Contracts\Service\ResetInterface; +if (!class_exists(CacheProvider::class)) { + return; +} + /** * @author Nicolas Grekas <p@tchwork.com> * diff --git a/vendor/symfony/cache/LockRegistry.php b/vendor/symfony/cache/LockRegistry.php index 23e5b4eb..65f20bb7 100644 --- a/vendor/symfony/cache/LockRegistry.php +++ b/vendor/symfony/cache/LockRegistry.php @@ -28,6 +28,8 @@ final class LockRegistry { private static $openedFiles = []; private static $lockedFiles; + private static $signalingException; + private static $signalingCallback; /** * The number of items in this list controls the max number of concurrent processes. @@ -95,6 +97,9 @@ final class LockRegistry return $callback($item, $save); } + self::$signalingException ?? self::$signalingException = unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); + self::$signalingCallback ?? self::$signalingCallback = function () { throw self::$signalingException; }; + while (true) { try { $locked = false; @@ -125,18 +130,15 @@ final class LockRegistry flock($lock, \LOCK_UN); unset(self::$lockedFiles[$key]); } - static $signalingException, $signalingCallback; - $signalingException = $signalingException ?? unserialize("O:9:\"Exception\":1:{s:16:\"\0Exception\0trace\";a:0:{}}"); - $signalingCallback = $signalingCallback ?? function () use ($signalingException) { throw $signalingException; }; try { - $value = $pool->get($item->getKey(), $signalingCallback, 0); + $value = $pool->get($item->getKey(), self::$signalingCallback, 0); $logger && $logger->info('Item "{key}" retrieved after lock was released', ['key' => $item->getKey()]); $save = false; return $value; } catch (\Exception $e) { - if ($signalingException !== $e) { + if (self::$signalingException !== $e) { throw $e; } $logger && $logger->info('Item "{key}" not found while lock was released, now retrying', ['key' => $item->getKey()]); diff --git a/vendor/symfony/cache/Traits/ContractsTrait.php b/vendor/symfony/cache/Traits/ContractsTrait.php index 9fdb9319..e4d48797 100644 --- a/vendor/symfony/cache/Traits/ContractsTrait.php +++ b/vendor/symfony/cache/Traits/ContractsTrait.php @@ -42,7 +42,7 @@ trait ContractsTrait public function setCallbackWrapper(?callable $callbackWrapper): callable { if (!isset($this->callbackWrapper)) { - $this->callbackWrapper = [LockRegistry::class, 'compute']; + $this->callbackWrapper = \Closure::fromCallable([LockRegistry::class, 'compute']);; if (\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) { $this->setCallbackWrapper(null); diff --git a/vendor/symfony/cache/Traits/RedisTrait.php b/vendor/symfony/cache/Traits/RedisTrait.php index 149c9d4c..dfb58982 100644 --- a/vendor/symfony/cache/Traits/RedisTrait.php +++ b/vendor/symfony/cache/Traits/RedisTrait.php @@ -182,6 +182,10 @@ trait RedisTrait $class = $params['redis_cluster'] ? \RedisCluster::class : (1 < \count($hosts) ? \RedisArray::class : \Redis::class); } else { $class = $params['class'] ?? \Predis\Client::class; + + if (isset($params['redis_sentinel']) && !is_a($class, \Predis\Client::class, true) && !class_exists(\RedisSentinel::class)) { + throw new CacheException(sprintf('Cannot use Redis Sentinel: class "%s" does not extend "Predis\Client" and ext-redis >= 5.2 not found: "%s".', $class, $dsn)); + } } if (is_a($class, \Redis::class, true)) { @@ -383,7 +387,7 @@ trait RedisTrait { if ($this->redis instanceof \Predis\ClientInterface) { $prefix = $this->redis->getOptions()->prefix ? $this->redis->getOptions()->prefix->getPrefix() : ''; - $prefixLen = \strlen($prefix); + $prefixLen = \strlen($prefix ?? ''); } $cleared = true; diff --git a/vendor/symfony/console/Application.php b/vendor/symfony/console/Application.php index a81cfdcb..366d6120 100644 --- a/vendor/symfony/console/Application.php +++ b/vendor/symfony/console/Application.php @@ -179,7 +179,7 @@ class Application implements ResetInterface $exitCode = $e->getCode(); if (is_numeric($exitCode)) { $exitCode = (int) $exitCode; - if (0 === $exitCode) { + if ($exitCode <= 0) { $exitCode = 1; } } else { @@ -363,9 +363,18 @@ class Application implements ResetInterface CompletionInput::TYPE_ARGUMENT_VALUE === $input->getCompletionType() && 'command' === $input->getCompletionName() ) { - $suggestions->suggestValues(array_filter(array_map(function (Command $command) { - return $command->isHidden() ? null : $command->getName(); - }, $this->all()))); + $commandNames = []; + foreach ($this->all() as $name => $command) { + // skip hidden commands and aliased commands as they already get added below + if ($command->isHidden() || $command->getName() !== $name) { + continue; + } + $commandNames[] = $command->getName(); + foreach ($command->getAliases() as $name) { + $commandNames[] = $name; + } + } + $suggestions->suggestValues(array_filter($commandNames)); return; } diff --git a/vendor/symfony/console/Command/CompleteCommand.php b/vendor/symfony/console/Command/CompleteCommand.php index 97357d67..a94021ce 100644 --- a/vendor/symfony/console/Command/CompleteCommand.php +++ b/vendor/symfony/console/Command/CompleteCommand.php @@ -105,11 +105,12 @@ final class CompleteCommand extends Command } elseif ( $completionInput->mustSuggestArgumentValuesFor('command') && $command->getName() !== $completionInput->getCompletionValue() + && !\in_array($completionInput->getCompletionValue(), $command->getAliases(), true) ) { $this->log(' No command found, completing using the Application class.'); // expand shortcut names ("cache:cl<TAB>") into their full name ("cache:clear") - $suggestions->suggestValue($command->getName()); + $suggestions->suggestValues(array_filter(array_merge([$command->getName()], $command->getAliases()))); } else { $command->mergeApplicationDefinition(); $completionInput->bind($command->getDefinition()); diff --git a/vendor/symfony/console/Command/DumpCompletionCommand.php b/vendor/symfony/console/Command/DumpCompletionCommand.php index 64a80053..dc0cfaef 100644 --- a/vendor/symfony/console/Command/DumpCompletionCommand.php +++ b/vendor/symfony/console/Command/DumpCompletionCommand.php @@ -41,7 +41,7 @@ final class DumpCompletionCommand extends Command { $fullCommand = $_SERVER['PHP_SELF']; $commandName = basename($fullCommand); - $fullCommand = realpath($fullCommand) ?: $fullCommand; + $fullCommand = @realpath($fullCommand) ?: $fullCommand; $this ->setHelp(<<<EOH @@ -53,7 +53,7 @@ to use shell autocompletion (currently only bash completion is supported). Dump the script to a global completion file and restart your shell: - <info>%command.full_name% bash | sudo tee /etc/bash_completion.d/${commandName}</> + <info>%command.full_name% bash | sudo tee /etc/bash_completion.d/{$commandName}</> Or dump the script to a local file and source it: @@ -70,7 +70,7 @@ Or dump the script to a local file and source it: Add this to the end of your shell configuration file (e.g. <info>"~/.bashrc"</>): - <info>eval "$(${fullCommand} completion bash)"</> + <info>eval "$({$fullCommand} completion bash)"</> EOH ) ->addArgument('shell', InputArgument::OPTIONAL, 'The shell type (e.g. "bash"), the value of the "$SHELL" env var will be used if this is not given') diff --git a/vendor/symfony/console/Completion/Output/BashCompletionOutput.php b/vendor/symfony/console/Completion/Output/BashCompletionOutput.php index 8d5ffa6b..c6f76eb8 100644 --- a/vendor/symfony/console/Completion/Output/BashCompletionOutput.php +++ b/vendor/symfony/console/Completion/Output/BashCompletionOutput.php @@ -24,6 +24,9 @@ class BashCompletionOutput implements CompletionOutputInterface $values = $suggestions->getValueSuggestions(); foreach ($suggestions->getOptionSuggestions() as $option) { $values[] = '--'.$option->getName(); + if ($option->isNegatable()) { + $values[] = '--no-'.$option->getName(); + } } $output->writeln(implode("\n", $values)); } diff --git a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php index 743e306d..1fbb212e 100644 --- a/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php +++ b/vendor/symfony/console/DependencyInjection/AddConsoleCommandPass.php @@ -67,7 +67,7 @@ class AddConsoleCommandPass implements CompilerPassInterface if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $aliases = $class::getDefaultName(); + $aliases = str_replace('%', '%%', $class::getDefaultName() ?? ''); } $aliases = explode('|', $aliases ?? ''); @@ -124,7 +124,7 @@ class AddConsoleCommandPass implements CompilerPassInterface if (!$r->isSubclassOf(Command::class)) { throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); } - $description = $class::getDefaultDescription(); + $description = str_replace('%', '%%', $class::getDefaultDescription() ?? ''); } if ($description) { diff --git a/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php index bfd0afed..9232510f 100644 --- a/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php +++ b/vendor/symfony/console/Formatter/NullOutputFormatterStyle.php @@ -1,4 +1,5 @@ <?php + /* * This file is part of the Symfony package. * diff --git a/vendor/symfony/console/Helper/Table.php b/vendor/symfony/console/Helper/Table.php index 6ade1360..794c87b0 100644 --- a/vendor/symfony/console/Helper/Table.php +++ b/vendor/symfony/console/Helper/Table.php @@ -383,41 +383,59 @@ class Table $this->calculateNumberOfColumns($rows); - $rows = $this->buildTableRows($rows); - $this->calculateColumnsWidth($rows); + $rowGroups = $this->buildTableRows($rows); + $this->calculateColumnsWidth($rowGroups); $isHeader = !$this->horizontal; $isFirstRow = $this->horizontal; $hasTitle = (bool) $this->headerTitle; - foreach ($rows as $row) { - if ($divider === $row) { - $isHeader = false; - $isFirstRow = true; - continue; - } - if ($row instanceof TableSeparator) { - $this->renderRowSeparator(); + foreach ($rowGroups as $rowGroup) { + $isHeaderSeparatorRendered = false; - continue; - } - if (!$row) { - continue; - } + foreach ($rowGroup as $row) { + if ($divider === $row) { + $isHeader = false; + $isFirstRow = true; - if ($isHeader || $isFirstRow) { - $this->renderRowSeparator( - $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, - $hasTitle ? $this->headerTitle : null, - $hasTitle ? $this->style->getHeaderTitleFormat() : null - ); - $isFirstRow = false; - $hasTitle = false; - } - if ($this->horizontal) { - $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); - } else { - $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); + continue; + } + + if ($row instanceof TableSeparator) { + $this->renderRowSeparator(); + + continue; + } + + if (!$row) { + continue; + } + + if ($isHeader && !$isHeaderSeparatorRendered) { + $this->renderRowSeparator( + $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, + $hasTitle ? $this->headerTitle : null, + $hasTitle ? $this->style->getHeaderTitleFormat() : null + ); + $hasTitle = false; + $isHeaderSeparatorRendered = true; + } + + if ($isFirstRow) { + $this->renderRowSeparator( + $isHeader ? self::SEPARATOR_TOP : self::SEPARATOR_TOP_BOTTOM, + $hasTitle ? $this->headerTitle : null, + $hasTitle ? $this->style->getHeaderTitleFormat() : null + ); + $isFirstRow = false; + $hasTitle = false; + } + + if ($this->horizontal) { + $this->renderRow($row, $this->style->getCellRowFormat(), $this->style->getCellHeaderFormat()); + } else { + $this->renderRow($row, $isHeader ? $this->style->getCellHeaderFormat() : $this->style->getCellRowFormat()); + } } } $this->renderRowSeparator(self::SEPARATOR_BOTTOM, $this->footerTitle, $this->style->getFooterTitleFormat()); @@ -605,7 +623,7 @@ class Table } $escaped = implode("\n", array_map([OutputFormatter::class, 'escapeTrailingBackslash'], explode("\n", $cell))); $cell = $cell instanceof TableCell ? new TableCell($escaped, ['colspan' => $cell->getColspan()]) : $escaped; - $lines = explode("\n", str_replace("\n", "<fg=default;bg=default>\n</>", $cell)); + $lines = explode("\n", str_replace("\n", "<fg=default;bg=default></>\n", $cell)); foreach ($lines as $lineKey => $line) { if ($colspan > 1) { $line = new TableCell($line, ['colspan' => $colspan]); @@ -624,13 +642,14 @@ class Table return new TableRows(function () use ($rows, $unmergedRows): \Traversable { foreach ($rows as $rowKey => $row) { - yield $row instanceof TableSeparator ? $row : $this->fillCells($row); + $rowGroup = [$row instanceof TableSeparator ? $row : $this->fillCells($row)]; if (isset($unmergedRows[$rowKey])) { foreach ($unmergedRows[$rowKey] as $row) { - yield $row instanceof TableSeparator ? $row : $this->fillCells($row); + $rowGroup[] = $row instanceof TableSeparator ? $row : $this->fillCells($row); } } + yield $rowGroup; } }); } @@ -771,29 +790,31 @@ class Table /** * Calculates columns widths. */ - private function calculateColumnsWidth(iterable $rows) + private function calculateColumnsWidth(iterable $groups) { for ($column = 0; $column < $this->numberOfColumns; ++$column) { $lengths = []; - foreach ($rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } + foreach ($groups as $group) { + foreach ($group as $row) { + if ($row instanceof TableSeparator) { + continue; + } - foreach ($row as $i => $cell) { - if ($cell instanceof TableCell) { - $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); - $textLength = Helper::width($textContent); - if ($textLength > 0) { - $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); - foreach ($contentColumns as $position => $content) { - $row[$i + $position] = $content; + foreach ($row as $i => $cell) { + if ($cell instanceof TableCell) { + $textContent = Helper::removeDecoration($this->output->getFormatter(), $cell); + $textLength = Helper::width($textContent); + if ($textLength > 0) { + $contentColumns = str_split($textContent, ceil($textLength / $cell->getColspan())); + foreach ($contentColumns as $position => $content) { + $row[$i + $position] = $content; + } } } } - } - $lengths[] = $this->getCellWidth($row, $column); + $lengths[] = $this->getCellWidth($row, $column); + } } $this->effectiveColumnWidths[$column] = max($lengths) + Helper::width($this->style->getCellRowContentFormat()) - 2; @@ -844,9 +865,9 @@ class Table $compact = new TableStyle(); $compact ->setHorizontalBorderChars('') - ->setVerticalBorderChars(' ') + ->setVerticalBorderChars('') ->setDefaultCrossingChar('') - ->setCellRowContentFormat('%s') + ->setCellRowContentFormat('%s ') ; $styleGuide = new TableStyle(); diff --git a/vendor/symfony/console/Input/InputArgument.php b/vendor/symfony/console/Input/InputArgument.php index e891b944..ecfcdad5 100644 --- a/vendor/symfony/console/Input/InputArgument.php +++ b/vendor/symfony/console/Input/InputArgument.php @@ -92,7 +92,7 @@ class InputArgument */ public function setDefault($default = null) { - if (self::REQUIRED === $this->mode && null !== $default) { + if ($this->isRequired() && null !== $default) { throw new LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); } diff --git a/vendor/symfony/console/Tester/ApplicationTester.php b/vendor/symfony/console/Tester/ApplicationTester.php index 19a95c8e..3a262e81 100644 --- a/vendor/symfony/console/Tester/ApplicationTester.php +++ b/vendor/symfony/console/Tester/ApplicationTester.php @@ -49,17 +49,37 @@ class ApplicationTester */ public function run(array $input, array $options = []) { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); + $prevShellVerbosity = getenv('SHELL_VERBOSITY'); + + try { + $this->input = new ArrayInput($input); + if (isset($options['interactive'])) { + $this->input->setInteractive($options['interactive']); + } + + if ($this->inputs) { + $this->input->setStream(self::createStream($this->inputs)); + } + + $this->initOutput($options); + + return $this->statusCode = $this->application->run($this->input, $this->output); + } finally { + // SHELL_VERBOSITY is set by Application::configureIO so we need to unset/reset it + // to its previous value to avoid one test's verbosity to spread to the following tests + if (false === $prevShellVerbosity) { + if (\function_exists('putenv')) { + @putenv('SHELL_VERBOSITY'); + } + unset($_ENV['SHELL_VERBOSITY']); + unset($_SERVER['SHELL_VERBOSITY']); + } else { + if (\function_exists('putenv')) { + @putenv('SHELL_VERBOSITY='.$prevShellVerbosity); + } + $_ENV['SHELL_VERBOSITY'] = $prevShellVerbosity; + $_SERVER['SHELL_VERBOSITY'] = $prevShellVerbosity; + } } - - if ($this->inputs) { - $this->input->setStream(self::createStream($this->inputs)); - } - - $this->initOutput($options); - - return $this->statusCode = $this->application->run($this->input, $this->output); } } diff --git a/vendor/symfony/deprecation-contracts/LICENSE b/vendor/symfony/deprecation-contracts/LICENSE index ad85e173..406242ff 100644 --- a/vendor/symfony/deprecation-contracts/LICENSE +++ b/vendor/symfony/deprecation-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020-2021 Fabien Potencier +Copyright (c) 2020-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/error-handler/DebugClassLoader.php b/vendor/symfony/error-handler/DebugClassLoader.php index ab6fb5f7..e4388fed 100644 --- a/vendor/symfony/error-handler/DebugClassLoader.php +++ b/vendor/symfony/error-handler/DebugClassLoader.php @@ -368,9 +368,12 @@ class DebugClassLoader $parent = get_parent_class($class) ?: null; self::$returnTypes[$class] = []; + $classIsTemplate = false; // Detect annotations on the class if ($doc = $this->parsePhpDoc($refl)) { + $classIsTemplate = isset($doc['template']); + foreach (['final', 'deprecated', 'internal'] as $annotation) { if (null !== $description = $doc[$annotation][0] ?? null) { self::${$annotation}[$class] = '' !== $description ? ' '.$description.(preg_match('/[.!]$/', $description) ? '' : '.') : '.'; @@ -514,6 +517,10 @@ class DebugClassLoader // To read method annotations $doc = $this->parsePhpDoc($method); + if (($classIsTemplate || isset($doc['template'])) && $method->hasReturnType()) { + unset($doc['return']); + } + if (isset(self::$annotatedParameters[$class][$method->name])) { $definedParameters = []; foreach ($method->getParameters() as $parameter) { diff --git a/vendor/symfony/error-handler/Internal/TentativeTypes.php b/vendor/symfony/error-handler/Internal/TentativeTypes.php index 5707a835..2168a1c0 100644 --- a/vendor/symfony/error-handler/Internal/TentativeTypes.php +++ b/vendor/symfony/error-handler/Internal/TentativeTypes.php @@ -37,7 +37,7 @@ class TentativeTypes 'DateTime' => [ '__wakeup' => 'void', '__set_state' => 'DateTime', - 'createFromImmutable' => 'DateTime', + 'createFromImmutable' => 'static', 'createFromFormat' => 'DateTime|false', 'getLastErrors' => 'array|false', 'format' => 'string', @@ -72,7 +72,7 @@ class TentativeTypes 'setDate' => 'DateTimeImmutable', 'setISODate' => 'DateTimeImmutable', 'setTimestamp' => 'DateTimeImmutable', - 'createFromMutable' => 'DateTimeImmutable', + 'createFromMutable' => 'static', ], 'DateTimeZone' => [ 'getName' => 'string', @@ -1102,6 +1102,8 @@ class TentativeTypes 'isDot' => 'bool', 'rewind' => 'void', 'valid' => 'bool', + 'key' => 'mixed', + 'current' => 'mixed', 'next' => 'void', 'seek' => 'void', ], @@ -1148,8 +1150,8 @@ class TentativeTypes 'getFlags' => 'int', 'setMaxLineLen' => 'void', 'getMaxLineLen' => 'int', - 'hasChildren' => 'bool', - 'getChildren' => '?RecursiveIterator', + 'hasChildren' => 'false', + 'getChildren' => 'null', 'seek' => 'void', 'getCurrentLine' => 'string', ], @@ -1238,7 +1240,7 @@ class TentativeTypes 'current' => 'never', 'next' => 'void', 'key' => 'never', - 'valid' => 'bool', + 'valid' => 'false', 'rewind' => 'void', ], 'CallbackFilterIterator' => [ diff --git a/vendor/symfony/error-handler/Resources/assets/css/exception.css b/vendor/symfony/error-handler/Resources/assets/css/exception.css index a6e23cb6..7cb3206d 100644 --- a/vendor/symfony/error-handler/Resources/assets/css/exception.css +++ b/vendor/symfony/error-handler/Resources/assets/css/exception.css @@ -225,7 +225,7 @@ header .container { display: flex; justify-content: space-between; } .trace-line + .trace-line { border-top: var(--border); } .trace-line:hover { background: var(--base-1); } .trace-line a { color: var(--base-6); } -.trace-line .icon { opacity: .4; position: absolute; left: 10px; top: 11px; } +.trace-line .icon { opacity: .4; position: absolute; left: 10px; } .trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; } .trace-line .icon.icon-copy { left: auto; top: auto; padding-left: 5px; display: none } .trace-line:hover .icon.icon-copy:not(.hidden) { display: inline-block } diff --git a/vendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.php b/vendor/symfony/error-handler/Resources/bin/extract-tentative-return-types.php old mode 100644 new mode 100755 diff --git a/vendor/symfony/error-handler/Resources/bin/patch-type-declarations b/vendor/symfony/error-handler/Resources/bin/patch-type-declarations old mode 100644 new mode 100755 diff --git a/vendor/symfony/event-dispatcher-contracts/LICENSE b/vendor/symfony/event-dispatcher-contracts/LICENSE index 23584145..74cdc2db 100644 --- a/vendor/symfony/event-dispatcher-contracts/LICENSE +++ b/vendor/symfony/event-dispatcher-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2021 Fabien Potencier +Copyright (c) 2018-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php index e1d2007f..acfbf619 100644 --- a/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php +++ b/vendor/symfony/event-dispatcher/Debug/TraceableEventDispatcher.php @@ -75,7 +75,7 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa { if (isset($this->wrappedListeners[$eventName])) { foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { + if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { $listener = $wrappedListener; unset($this->wrappedListeners[$eventName][$index]); break; @@ -110,8 +110,8 @@ class TraceableEventDispatcher implements EventDispatcherInterface, ResetInterfa // we might have wrapped listeners for the event (if called while dispatching) // in that case get the priority by wrapper if (isset($this->wrappedListeners[$eventName])) { - foreach ($this->wrappedListeners[$eventName] as $index => $wrappedListener) { - if ($wrappedListener->getWrappedListener() === $listener) { + foreach ($this->wrappedListeners[$eventName] as $wrappedListener) { + if ($wrappedListener->getWrappedListener() === $listener || ($listener instanceof \Closure && $wrappedListener->getWrappedListener() == $listener)) { return $this->dispatcher->getListenerPriority($eventName, $wrappedListener); } } diff --git a/vendor/symfony/event-dispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/EventDispatcher.php index c479a754..8fe8fb5c 100644 --- a/vendor/symfony/event-dispatcher/EventDispatcher.php +++ b/vendor/symfony/event-dispatcher/EventDispatcher.php @@ -108,7 +108,7 @@ class EventDispatcher implements EventDispatcherInterface $v[0] = $v[0](); $v[1] = $v[1] ?? '__invoke'; } - if ($v === $listener) { + if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { return $priority; } } @@ -164,7 +164,7 @@ class EventDispatcher implements EventDispatcherInterface $v[0] = $v[0](); $v[1] = $v[1] ?? '__invoke'; } - if ($v === $listener) { + if ($v === $listener || ($listener instanceof \Closure && $v == $listener)) { unset($listeners[$k], $this->sorted[$eventName], $this->optimized[$eventName]); } } diff --git a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php index 99051724..564765d8 100644 --- a/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php +++ b/vendor/symfony/finder/Iterator/MultiplePcreFilterIterator.php @@ -84,7 +84,13 @@ abstract class MultiplePcreFilterIterator extends \FilterIterator */ protected function isRegex(string $str) { - if (preg_match('/^(.{3,}?)[imsxuADU]*$/', $str, $m)) { + $availableModifiers = 'imsxuADU'; + + if (\PHP_VERSION_ID >= 80200) { + $availableModifiers .= 'n'; + } + + if (preg_match('/^(.{3,}?)['.$availableModifiers.']*$/', $str, $m)) { $start = substr($m[1], 0, 1); $end = substr($m[1], -1); diff --git a/vendor/symfony/http-foundation/File/UploadedFile.php b/vendor/symfony/http-foundation/File/UploadedFile.php index 5cfe8c4c..cf50a02c 100644 --- a/vendor/symfony/http-foundation/File/UploadedFile.php +++ b/vendor/symfony/http-foundation/File/UploadedFile.php @@ -253,11 +253,8 @@ class UploadedFile extends File switch (substr($size, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php index 02467da9..4440dccc 100644 --- a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php +++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php @@ -145,6 +145,12 @@ class NativeSessionStorage implements SessionStorageInterface throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line)); } + $sessionId = $_COOKIE[session_name()] ?? null; + if ($sessionId && $this->saveHandler instanceof AbstractProxy && 'files' === $this->saveHandler->getSaveHandlerName() && !preg_match('/^[a-zA-Z0-9,-]{22,}$/', $sessionId)) { + // the session ID in the header is invalid, create a new one + session_id(session_create_id()); + } + // ok to try and start the session if (!session_start()) { throw new \RuntimeException('Failed to start the session.'); diff --git a/vendor/symfony/http-kernel/CHANGELOG.md b/vendor/symfony/http-kernel/CHANGELOG.md index 129201e3..d0dc2076 100644 --- a/vendor/symfony/http-kernel/CHANGELOG.md +++ b/vendor/symfony/http-kernel/CHANGELOG.md @@ -5,7 +5,7 @@ CHANGELOG --- * Add the ability to enable the profiler using a request query parameter, body parameter or attribute - * Deprecate `AbstractTestSessionListener::getSession` inject a session in the request instead + * Deprecate `AbstractTestSessionListener` and `TestSessionListener`, use `AbstractSessionListener` and `SessionListener` instead * Deprecate the `fileLinkFormat` parameter of `DebugHandlersListener` * Add support for configuring log level, and status code by exception class * Allow ignoring "kernel.reset" methods that don't exist with "on_invalid" attribute diff --git a/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php b/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php index 4b64a573..e749ed11 100644 --- a/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php +++ b/vendor/symfony/http-kernel/DataCollector/MemoryDataCollector.php @@ -100,11 +100,8 @@ class MemoryDataCollector extends DataCollector implements LateDataCollectorInte switch (substr($memoryLimit, -1)) { case 't': $max *= 1024; - // no break case 'g': $max *= 1024; - // no break case 'm': $max *= 1024; - // no break case 'k': $max *= 1024; } diff --git a/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php index b1c24d5b..8fd1f553 100644 --- a/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php +++ b/vendor/symfony/http-kernel/DependencyInjection/RegisterControllerArgumentLocatorsPass.php @@ -192,7 +192,7 @@ class RegisterControllerArgumentLocatorsPass implements CompilerPassInterface $args[$p->name] = new Reference($erroredId, ContainerInterface::RUNTIME_EXCEPTION_ON_INVALID_REFERENCE); } else { $target = ltrim($target, '\\'); - $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, $p->name) : new Reference($target, $invalidBehavior); + $args[$p->name] = $type ? new TypedReference($target, $type, $invalidBehavior, Target::parseName($p)) : new Reference($target, $invalidBehavior); } } // register the maps as a per-method service-locators diff --git a/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php index 7c0c1aee..d0e8f45d 100644 --- a/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/AbstractSessionListener.php @@ -72,17 +72,17 @@ abstract class AbstractSessionListener implements EventSubscriberInterface, Rese $request->setSessionFactory(function () use (&$sess, $request) { if (!$sess) { $sess = $this->getSession(); - } - /* - * For supporting sessions in php runtime with runners like roadrunner or swoole, the session - * cookie needs to be read from the cookie bag and set on the session storage. - * - * Do not set it when a native php session is active. - */ - if ($sess && !$sess->isStarted() && \PHP_SESSION_ACTIVE !== session_status()) { - $sessionId = $request->cookies->get($sess->getName(), ''); - $sess->setId($sessionId); + /* + * For supporting sessions in php runtime with runners like roadrunner or swoole, the session + * cookie needs to be read from the cookie bag and set on the session storage. + * + * Do not set it when a native php session is active. + */ + if ($sess && !$sess->isStarted() && \PHP_SESSION_ACTIVE !== session_status()) { + $sessionId = $sess->getId() ?: $request->cookies->get($sess->getName(), ''); + $sess->setId($sessionId); + } } return $sess; @@ -104,7 +104,7 @@ abstract class AbstractSessionListener implements EventSubscriberInterface, Rese // Always remove the internal header if present $response->headers->remove(self::NO_AUTO_CACHE_CONTROL_HEADER); - if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : $event->getRequest()->getSession()) { + if (!$session = $this->container && $this->container->has('initialized_session') ? $this->container->get('initialized_session') : ($event->getRequest()->hasSession() ? $event->getRequest()->getSession() : null)) { return; } @@ -148,42 +148,45 @@ abstract class AbstractSessionListener implements EventSubscriberInterface, Rese $sessionCookieSecure = $sessionOptions['cookie_secure'] ?? false; $sessionCookieHttpOnly = $sessionOptions['cookie_httponly'] ?? true; $sessionCookieSameSite = $sessionOptions['cookie_samesite'] ?? Cookie::SAMESITE_LAX; + $sessionUseCookies = $sessionOptions['use_cookies'] ?? true; SessionUtils::popSessionCookie($sessionName, $sessionId); - $request = $event->getRequest(); - $requestSessionCookieId = $request->cookies->get($sessionName); + if ($sessionUseCookies) { + $request = $event->getRequest(); + $requestSessionCookieId = $request->cookies->get($sessionName); - $isSessionEmpty = $session->isEmpty() && empty($_SESSION); // checking $_SESSION to keep compatibility with native sessions - if ($requestSessionCookieId && $isSessionEmpty) { - $response->headers->clearCookie( - $sessionName, - $sessionCookiePath, - $sessionCookieDomain, - $sessionCookieSecure, - $sessionCookieHttpOnly, - $sessionCookieSameSite - ); - } elseif ($sessionId !== $requestSessionCookieId && !$isSessionEmpty) { - $expire = 0; - $lifetime = $sessionOptions['cookie_lifetime'] ?? null; - if ($lifetime) { - $expire = time() + $lifetime; - } - - $response->headers->setCookie( - Cookie::create( + $isSessionEmpty = $session->isEmpty() && empty($_SESSION); // checking $_SESSION to keep compatibility with native sessions + if ($requestSessionCookieId && $isSessionEmpty) { + $response->headers->clearCookie( $sessionName, - $sessionId, - $expire, $sessionCookiePath, $sessionCookieDomain, $sessionCookieSecure, $sessionCookieHttpOnly, - false, $sessionCookieSameSite - ) - ); + ); + } elseif ($sessionId !== $requestSessionCookieId && !$isSessionEmpty) { + $expire = 0; + $lifetime = $sessionOptions['cookie_lifetime'] ?? null; + if ($lifetime) { + $expire = time() + $lifetime; + } + + $response->headers->setCookie( + Cookie::create( + $sessionName, + $sessionId, + $expire, + $sessionCookiePath, + $sessionCookieDomain, + $sessionCookieSecure, + $sessionCookieHttpOnly, + false, + $sessionCookieSameSite + ) + ); + } } } diff --git a/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php index 157d50a1..838c2944 100644 --- a/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php @@ -19,6 +19,8 @@ use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; +trigger_deprecation('symfony/http-kernel', '5.4', '"%s" is deprecated use "%s" instead.', AbstractTestSessionListener::class, AbstractSessionListener::class); + /** * TestSessionListener. * @@ -29,7 +31,7 @@ use Symfony\Component\HttpKernel\KernelEvents; * * @internal * - * @deprecated the TestSessionListener use the default SessionListener instead + * @deprecated since Symfony 5.4, use AbstractSessionListener instead */ abstract class AbstractTestSessionListener implements EventSubscriberInterface { @@ -39,8 +41,6 @@ abstract class AbstractTestSessionListener implements EventSubscriberInterface public function __construct(array $sessionOptions = []) { $this->sessionOptions = $sessionOptions; - - trigger_deprecation('symfony/http-kernel', '5.4', 'The %s is deprecated use the %s instead.', __CLASS__, AbstractSessionListener::class); } public function onKernelRequest(RequestEvent $event) @@ -114,8 +114,6 @@ abstract class AbstractTestSessionListener implements EventSubscriberInterface /** * Gets the session object. * - * @deprecated since Symfony 5.4, will be removed in 6.0. - * * @return SessionInterface|null */ abstract protected function getSession(); diff --git a/vendor/symfony/http-kernel/EventListener/ProfilerListener.php b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php index 85525249..adbafe62 100644 --- a/vendor/symfony/http-kernel/EventListener/ProfilerListener.php +++ b/vendor/symfony/http-kernel/EventListener/ProfilerListener.php @@ -15,6 +15,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestMatcherInterface; use Symfony\Component\HttpFoundation\RequestStack; +use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpKernel\Event\ExceptionEvent; use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\Event\TerminateEvent; @@ -96,8 +97,21 @@ class ProfilerListener implements EventSubscriberInterface return; } - if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { - return; + $session = $request->hasPreviousSession() && $request->hasSession() ? $request->getSession() : null; + + if ($session instanceof Session) { + $usageIndexValue = $usageIndexReference = &$session->getUsageIndex(); + $usageIndexReference = \PHP_INT_MIN; + } + + try { + if (!$profile = $this->profiler->collect($request, $event->getResponse(), $exception)) { + return; + } + } finally { + if ($session instanceof Session) { + $usageIndexReference = $usageIndexValue; + } } $this->profiles[$request] = $profile; diff --git a/vendor/symfony/http-kernel/EventListener/TestSessionListener.php b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php index c5308269..45fa312b 100644 --- a/vendor/symfony/http-kernel/EventListener/TestSessionListener.php +++ b/vendor/symfony/http-kernel/EventListener/TestSessionListener.php @@ -14,6 +14,8 @@ namespace Symfony\Component\HttpKernel\EventListener; use Psr\Container\ContainerInterface; use Symfony\Component\HttpFoundation\Session\SessionInterface; +trigger_deprecation('symfony/http-kernel', '5.4', '"%s" is deprecated, use "%s" instead.', TestSessionListener::class, SessionListener::class); + /** * Sets the session in the request. * @@ -21,7 +23,7 @@ use Symfony\Component\HttpFoundation\Session\SessionInterface; * * @final * - * @deprecated the TestSessionListener use the default SessionListener instead + * @deprecated since Symfony 5.4, use SessionListener instead */ class TestSessionListener extends AbstractTestSessionListener { @@ -33,13 +35,8 @@ class TestSessionListener extends AbstractTestSessionListener parent::__construct($sessionOptions); } - /** - * @deprecated since Symfony 5.4, will be removed in 6.0. - */ protected function getSession(): ?SessionInterface { - trigger_deprecation('symfony/http-kernel', '5.4', '"%s" is deprecated and will be removed in 6.0, inject a session in the request instead.', __METHOD__); - if ($this->container->has('session')) { return $this->container->get('session'); } diff --git a/vendor/symfony/http-kernel/HttpCache/HttpCache.php b/vendor/symfony/http-kernel/HttpCache/HttpCache.php index bf93171f..28be364c 100644 --- a/vendor/symfony/http-kernel/HttpCache/HttpCache.php +++ b/vendor/symfony/http-kernel/HttpCache/HttpCache.php @@ -718,7 +718,7 @@ class HttpCache implements HttpKernelInterface, TerminableInterface $timeout = $this->options['stale_while_revalidate']; } - return abs($entry->getTtl()) < $timeout; + return abs($entry->getTtl() ?? 0) < $timeout; } /** diff --git a/vendor/symfony/http-kernel/Kernel.php b/vendor/symfony/http-kernel/Kernel.php index 0c87dbd5..f4e34ce0 100644 --- a/vendor/symfony/http-kernel/Kernel.php +++ b/vendor/symfony/http-kernel/Kernel.php @@ -78,11 +78,11 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl */ private static $freshCache = []; - public const VERSION = '5.4.6'; - public const VERSION_ID = 50406; + public const VERSION = '5.4.10'; + public const VERSION_ID = 50410; public const MAJOR_VERSION = 5; public const MINOR_VERSION = 4; - public const RELEASE_VERSION = 6; + public const RELEASE_VERSION = 10; public const EXTRA_VERSION = ''; public const END_OF_MAINTENANCE = '11/2024'; @@ -468,9 +468,7 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl is_dir($buildDir) ?: mkdir($buildDir, 0777, true); if ($lock = fopen($cachePath.'.lock', 'w')) { - flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock); - - if (!flock($lock, $wouldBlock ? \LOCK_SH : \LOCK_EX)) { + if (!flock($lock, \LOCK_EX | \LOCK_NB, $wouldBlock) && !flock($lock, $wouldBlock ? \LOCK_SH : \LOCK_EX)) { fclose($lock); $lock = null; } elseif (!is_file($cachePath) || !\is_object($this->container = include $cachePath)) { diff --git a/vendor/symfony/mime/Crypto/DkimOptions.php b/vendor/symfony/mime/Crypto/DkimOptions.php index 4c51d661..171bb258 100644 --- a/vendor/symfony/mime/Crypto/DkimOptions.php +++ b/vendor/symfony/mime/Crypto/DkimOptions.php @@ -28,7 +28,7 @@ final class DkimOptions /** * @return $this */ - public function algorithm(int $algo): self + public function algorithm(string $algo): self { $this->options['algorithm'] = $algo; diff --git a/vendor/symfony/mime/Email.php b/vendor/symfony/mime/Email.php index 44efe7b3..bba99ee1 100644 --- a/vendor/symfony/mime/Email.php +++ b/vendor/symfony/mime/Email.php @@ -272,12 +272,16 @@ class Email extends Message } /** - * @param resource|string $body + * @param resource|string|null $body * * @return $this */ public function text($body, string $charset = 'utf-8') { + if (null !== $body && !\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string, a resource or null (got "%s").', get_debug_type($body))); + } + $this->text = $body; $this->textCharset = $charset; @@ -304,6 +308,10 @@ class Email extends Message */ public function html($body, string $charset = 'utf-8') { + if (null !== $body && !\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string, a resource or null (got "%s").', get_debug_type($body))); + } + $this->html = $body; $this->htmlCharset = $charset; @@ -330,6 +338,10 @@ class Email extends Message */ public function attach($body, string $name = null, string $contentType = null) { + if (!\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); + } + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => false]; return $this; @@ -352,6 +364,10 @@ class Email extends Message */ public function embed($body, string $name = null, string $contentType = null) { + if (!\is_string($body) && !\is_resource($body)) { + throw new \TypeError(sprintf('The body must be a string or a resource (got "%s").', get_debug_type($body))); + } + $this->attachments[] = ['body' => $body, 'name' => $name, 'content-type' => $contentType, 'inline' => true]; return $this; @@ -463,7 +479,7 @@ class Email extends Message $names = []; $htmlPart = null; $html = $this->html; - if (null !== $this->html) { + if (null !== $html) { $htmlPart = new TextPart($html, $this->htmlCharset, 'html'); $html = $htmlPart->getBody(); preg_match_all('(<img\s+[^>]*src\s*=\s*(?:([\'"])cid:([^"]+)\\1|cid:([^>\s]+)))i', $html, $names); diff --git a/vendor/symfony/mime/Part/DataPart.php b/vendor/symfony/mime/Part/DataPart.php index 75bcb64a..4247ce79 100644 --- a/vendor/symfony/mime/Part/DataPart.php +++ b/vendor/symfony/mime/Part/DataPart.php @@ -61,13 +61,20 @@ class DataPart extends TextPart $contentType = self::$mimeTypes->getMimeTypes($ext)[0] ?? 'application/octet-stream'; } - if (false === is_readable($path)) { + if ((is_file($path) && !is_readable($path)) || is_dir($path)) { throw new InvalidArgumentException(sprintf('Path "%s" is not readable.', $path)); } if (false === $handle = @fopen($path, 'r', false)) { throw new InvalidArgumentException(sprintf('Unable to open path "%s".', $path)); } + + if (!is_file($path)) { + $cache = fopen('php://temp', 'r+'); + stream_copy_to_stream($handle, $cache); + $handle = $cache; + } + $p = new self($handle, $name ?: basename($path), $contentType); $p->handle = $handle; diff --git a/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php b/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php index 74bdc63c..74b41218 100644 --- a/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php +++ b/vendor/symfony/mime/Test/Constraint/EmailHeaderSame.php @@ -55,12 +55,14 @@ final class EmailHeaderSame extends Constraint */ protected function failureDescription($message): string { - return sprintf('the Email %s (value is %s)', $this->toString(), $this->getHeaderValue($message)); + return sprintf('the Email %s (value is %s)', $this->toString(), $this->getHeaderValue($message) ?? 'null'); } - private function getHeaderValue($message): string + private function getHeaderValue($message): ?string { - $header = $message->getHeaders()->get($this->headerName); + if (null === $header = $message->getHeaders()->get($this->headerName)) { + return null; + } return $header instanceof UnstructuredHeader ? $header->getValue() : $header->getBodyAsString(); } diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md index 8add1ab0..b144d03c 100644 --- a/vendor/symfony/polyfill-ctype/README.md +++ b/vendor/symfony/polyfill-ctype/README.md @@ -4,7 +4,7 @@ Symfony Polyfill / Ctype This component provides `ctype_*` functions to users who run php versions without the ctype extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json index ccb8e570..ee5c931c 100644 --- a/vendor/symfony/polyfill-ctype/composer.json +++ b/vendor/symfony/polyfill-ctype/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-iconv/README.md b/vendor/symfony/polyfill-iconv/README.md index b0c8984c..b089088b 100644 --- a/vendor/symfony/polyfill-iconv/README.md +++ b/vendor/symfony/polyfill-iconv/README.md @@ -6,7 +6,7 @@ This component provides a native PHP implementation of the (short of [`ob_iconv_handler`](https://php.net/ob-iconv-handler)). More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-iconv/composer.json b/vendor/symfony/polyfill-iconv/composer.json index a1bd3a0c..1f257672 100644 --- a/vendor/symfony/polyfill-iconv/composer.json +++ b/vendor/symfony/polyfill-iconv/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-intl-grapheme/README.md b/vendor/symfony/polyfill-intl-grapheme/README.md index 77523ea2..f55d92c5 100644 --- a/vendor/symfony/polyfill-intl-grapheme/README.md +++ b/vendor/symfony/polyfill-intl-grapheme/README.md @@ -23,7 +23,7 @@ This component provides a partial, native PHP implementation of the - [`grapheme_substr`](https://php.net/grapheme_substr): Return part of a string More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-intl-grapheme/composer.json b/vendor/symfony/polyfill-intl-grapheme/composer.json index 02c98ee3..824c96f9 100644 --- a/vendor/symfony/polyfill-intl-grapheme/composer.json +++ b/vendor/symfony/polyfill-intl-grapheme/composer.json @@ -28,7 +28,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-intl-idn/README.md b/vendor/symfony/polyfill-intl-idn/README.md index 2e75f2e5..cae55170 100644 --- a/vendor/symfony/polyfill-intl-idn/README.md +++ b/vendor/symfony/polyfill-intl-idn/README.md @@ -4,7 +4,7 @@ Symfony Polyfill / Intl: Idn This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-intl-idn/composer.json b/vendor/symfony/polyfill-intl-idn/composer.json index c5a2a462..71030a2e 100644 --- a/vendor/symfony/polyfill-intl-idn/composer.json +++ b/vendor/symfony/polyfill-intl-idn/composer.json @@ -34,7 +34,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-intl-normalizer/README.md b/vendor/symfony/polyfill-intl-normalizer/README.md index 15060c5f..b9b762e8 100644 --- a/vendor/symfony/polyfill-intl-normalizer/README.md +++ b/vendor/symfony/polyfill-intl-normalizer/README.md @@ -6,7 +6,7 @@ This component provides a fallback implementation for the by the [Intl](https://php.net/intl) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-intl-normalizer/composer.json b/vendor/symfony/polyfill-intl-normalizer/composer.json index 393edf70..eb452bfd 100644 --- a/vendor/symfony/polyfill-intl-normalizer/composer.json +++ b/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -29,7 +29,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php index b65c54a6..693749f2 100644 --- a/vendor/symfony/polyfill-mbstring/Mbstring.php +++ b/vendor/symfony/polyfill-mbstring/Mbstring.php @@ -568,7 +568,7 @@ final class Mbstring } $rx .= '.{'.$split_length.'})/us'; - return preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); + return preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = []; diff --git a/vendor/symfony/polyfill-mbstring/README.md b/vendor/symfony/polyfill-mbstring/README.md index 4efb599d..478b40da 100644 --- a/vendor/symfony/polyfill-mbstring/README.md +++ b/vendor/symfony/polyfill-mbstring/README.md @@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the [Mbstring](https://php.net/mbstring) extension. More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json index 1fa21ca1..9cd2e924 100644 --- a/vendor/symfony/polyfill-mbstring/composer.json +++ b/vendor/symfony/polyfill-mbstring/composer.json @@ -31,7 +31,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md index 59dec8a2..ed190505 100644 --- a/vendor/symfony/polyfill-php72/README.md +++ b/vendor/symfony/polyfill-php72/README.md @@ -6,6 +6,12 @@ This component provides functions added to PHP 7.2 core: - [`spl_object_id`](https://php.net/spl_object_id) - [`stream_isatty`](https://php.net/stream_isatty) +And also functions added to PHP 7.2 mbstring: + +- [`mb_ord`](https://php.net/mb_ord) +- [`mb_chr`](https://php.net/mb_chr) +- [`mb_scrub`](https://php.net/mb_scrub) + On Windows only: - [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) @@ -16,11 +22,12 @@ Moved to core since 7.2 (was in the optional XML extension earlier): - [`utf8_decode`](https://php.net/utf8_decode) Also, it provides constants added to PHP 7.2: + - [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) - [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json index c96c8447..4eac690e 100644 --- a/vendor/symfony/polyfill-php72/composer.json +++ b/vendor/symfony/polyfill-php72/composer.json @@ -25,7 +25,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-php73/README.md b/vendor/symfony/polyfill-php73/README.md index b3ebbce5..032fafbd 100644 --- a/vendor/symfony/polyfill-php73/README.md +++ b/vendor/symfony/polyfill-php73/README.md @@ -10,7 +10,7 @@ This component provides functions added to PHP 7.3 core: - [`JsonException`](https://php.net/JsonException) More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-php73/composer.json b/vendor/symfony/polyfill-php73/composer.json index a7fe4787..af0cf42d 100644 --- a/vendor/symfony/polyfill-php73/composer.json +++ b/vendor/symfony/polyfill-php73/composer.json @@ -26,7 +26,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-php80/README.md b/vendor/symfony/polyfill-php80/README.md index 10b8ee49..3816c559 100644 --- a/vendor/symfony/polyfill-php80/README.md +++ b/vendor/symfony/polyfill-php80/README.md @@ -3,12 +3,13 @@ Symfony Polyfill / Php80 This component provides features added to PHP 8.0 core: -- `Stringable` interface +- [`Stringable`](https://php.net/stringable) interface - [`fdiv`](https://php.net/fdiv) -- `ValueError` class -- `UnhandledMatchError` class +- [`ValueError`](https://php.net/valueerror) class +- [`UnhandledMatchError`](https://php.net/unhandledmatcherror) class - `FILTER_VALIDATE_BOOL` constant - [`get_debug_type`](https://php.net/get_debug_type) +- [`PhpToken`](https://php.net/phptoken) class - [`preg_last_error_msg`](https://php.net/preg_last_error_msg) - [`str_contains`](https://php.net/str_contains) - [`str_starts_with`](https://php.net/str_starts_with) diff --git a/vendor/symfony/polyfill-php80/composer.json b/vendor/symfony/polyfill-php80/composer.json index 5fe679db..cd3e9b65 100644 --- a/vendor/symfony/polyfill-php80/composer.json +++ b/vendor/symfony/polyfill-php80/composer.json @@ -30,7 +30,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/polyfill-php81/README.md b/vendor/symfony/polyfill-php81/README.md index 5ef61be6..7d8dd190 100644 --- a/vendor/symfony/polyfill-php81/README.md +++ b/vendor/symfony/polyfill-php81/README.md @@ -4,11 +4,12 @@ Symfony Polyfill / Php81 This component provides features added to PHP 8.1 core: - [`array_is_list`](https://php.net/array_is_list) -- [`MYSQLI_REFRESH_REPLICA`](https://www.php.net/manual/en/mysqli.constants.php#constantmysqli-refresh-replica) constant +- [`enum_exists`](https://php.net/enum-exists) +- [`MYSQLI_REFRESH_REPLICA`](https://php.net/mysqli.constants#constantmysqli-refresh-replica) constant - [`ReturnTypeWillChange`](https://wiki.php.net/rfc/internal_method_return_types) More information can be found in the -[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). +[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md). License ======= diff --git a/vendor/symfony/polyfill-php81/composer.json b/vendor/symfony/polyfill-php81/composer.json index c39ccf47..014da788 100644 --- a/vendor/symfony/polyfill-php81/composer.json +++ b/vendor/symfony/polyfill-php81/composer.json @@ -26,7 +26,7 @@ "minimum-stability": "dev", "extra": { "branch-alias": { - "dev-main": "1.23-dev" + "dev-main": "1.26-dev" }, "thanks": { "name": "symfony/polyfill", diff --git a/vendor/symfony/process/PhpExecutableFinder.php b/vendor/symfony/process/PhpExecutableFinder.php index ec24f911..998808b6 100644 --- a/vendor/symfony/process/PhpExecutableFinder.php +++ b/vendor/symfony/process/PhpExecutableFinder.php @@ -45,6 +45,10 @@ class PhpExecutableFinder } } + if (@is_dir($php)) { + return false; + } + return $php; } @@ -57,7 +61,7 @@ class PhpExecutableFinder } if ($php = getenv('PHP_PATH')) { - if (!@is_executable($php)) { + if (!@is_executable($php) || @is_dir($php)) { return false; } @@ -65,12 +69,12 @@ class PhpExecutableFinder } if ($php = getenv('PHP_PEAR_PHP_BIN')) { - if (@is_executable($php)) { + if (@is_executable($php) && !@is_dir($php)) { return $php; } } - if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php'))) { + if (@is_executable($php = \PHP_BINDIR.('\\' === \DIRECTORY_SEPARATOR ? '\\php.exe' : '/php')) && !@is_dir($php)) { return $php; } diff --git a/vendor/symfony/process/Process.php b/vendor/symfony/process/Process.php index 92771594..14e17774 100644 --- a/vendor/symfony/process/Process.php +++ b/vendor/symfony/process/Process.php @@ -55,7 +55,7 @@ class Process implements \IteratorAggregate private $hasCallback = false; private $commandline; private $cwd; - private $env; + private $env = []; private $input; private $starttime; private $lastOutputTime; diff --git a/vendor/symfony/routing/RequestContext.php b/vendor/symfony/routing/RequestContext.php index 8994b266..f54c430e 100644 --- a/vendor/symfony/routing/RequestContext.php +++ b/vendor/symfony/routing/RequestContext.php @@ -98,7 +98,7 @@ class RequestContext */ public function setBaseUrl(string $baseUrl) { - $this->baseUrl = $baseUrl; + $this->baseUrl = rtrim($baseUrl, '/'); return $this; } diff --git a/vendor/symfony/service-contracts/LICENSE b/vendor/symfony/service-contracts/LICENSE index 23584145..74cdc2db 100644 --- a/vendor/symfony/service-contracts/LICENSE +++ b/vendor/symfony/service-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2021 Fabien Potencier +Copyright (c) 2018-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php index 46cd007b..16e3eb2c 100644 --- a/vendor/symfony/service-contracts/ServiceSubscriberTrait.php +++ b/vendor/symfony/service-contracts/ServiceSubscriberTrait.php @@ -30,13 +30,7 @@ trait ServiceSubscriberTrait */ public static function getSubscribedServices(): array { - static $services; - - if (null !== $services) { - return $services; - } - - $services = \is_callable(['parent', __FUNCTION__]) ? parent::getSubscribedServices() : []; + $services = method_exists(get_parent_class(self::class) ?: '', __FUNCTION__) ? parent::getSubscribedServices() : []; $attributeOptIn = false; if (\PHP_VERSION_ID >= 80000) { @@ -106,7 +100,7 @@ trait ServiceSubscriberTrait { $this->container = $container; - if (\is_callable(['parent', __FUNCTION__])) { + if (method_exists(get_parent_class(self::class) ?: '', __FUNCTION__)) { return parent::setContainer($container); } diff --git a/vendor/symfony/service-contracts/composer.json b/vendor/symfony/service-contracts/composer.json index e680798d..f0586370 100644 --- a/vendor/symfony/service-contracts/composer.json +++ b/vendor/symfony/service-contracts/composer.json @@ -18,7 +18,7 @@ "require": { "php": ">=7.2.5", "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" + "symfony/deprecation-contracts": "^2.1|^3" }, "conflict": { "ext-psr": "<1.1|>=2" diff --git a/vendor/symfony/string/AbstractUnicodeString.php b/vendor/symfony/string/AbstractUnicodeString.php index db810cb6..767f6232 100644 --- a/vendor/symfony/string/AbstractUnicodeString.php +++ b/vendor/symfony/string/AbstractUnicodeString.php @@ -492,7 +492,7 @@ abstract class AbstractUnicodeString extends AbstractString foreach (explode("\n", $s) as $s) { if ($ignoreAnsiDecoration) { $s = preg_replace('/(?:\x1B(?: - \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [0x40-\x7E] + \[ [\x30-\x3F]*+ [\x20-\x2F]*+ [\x40-\x7E] | [P\]X^_] .*? \x1B\\\\ | [\x41-\x7E] )|[\p{Cc}\x7F]++)/xu', '', $s); diff --git a/vendor/symfony/string/Inflector/FrenchInflector.php b/vendor/symfony/string/Inflector/FrenchInflector.php index 42f6125a..f58f7c0c 100644 --- a/vendor/symfony/string/Inflector/FrenchInflector.php +++ b/vendor/symfony/string/Inflector/FrenchInflector.php @@ -108,7 +108,7 @@ final class FrenchInflector implements InflectorInterface * A list of words which should not be inflected. * This list is only used by singularize. */ - private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; + private const UNINFLECTED = '/^(abcès|accès|abus|albatros|anchois|anglais|autobus|bois|brebis|carquois|cas|chas|colis|concours|corps|cours|cyprès|décès|devis|discours|dos|embarras|engrais|entrelacs|excès|fils|fois|gâchis|gars|glas|héros|intrus|jars|jus|kermès|lacis|legs|lilas|marais|mars|matelas|mépris|mets|mois|mors|obus|os|palais|paradis|parcours|pardessus|pays|plusieurs|poids|pois|pouls|printemps|processus|progrès|puits|pus|rabais|radis|recors|recours|refus|relais|remords|remous|rictus|rhinocéros|repas|rubis|sans|sas|secours|sens|souris|succès|talus|tapis|tas|taudis|temps|tiers|univers|velours|verglas|vernis|virus)$/i'; /** * {@inheritdoc} diff --git a/vendor/symfony/translation-contracts/LICENSE b/vendor/symfony/translation-contracts/LICENSE index 23584145..74cdc2db 100644 --- a/vendor/symfony/translation-contracts/LICENSE +++ b/vendor/symfony/translation-contracts/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2018-2021 Fabien Potencier +Copyright (c) 2018-2022 Fabien Potencier Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/symfony/translation-contracts/Test/TranslatorTest.php b/vendor/symfony/translation-contracts/Test/TranslatorTest.php index 89036765..a3e9b20a 100644 --- a/vendor/symfony/translation-contracts/Test/TranslatorTest.php +++ b/vendor/symfony/translation-contracts/Test/TranslatorTest.php @@ -362,7 +362,7 @@ class TranslatorTest extends TestCase foreach ($matrix as $langCode => $data) { $indexes = array_flip($data); if ($expectSuccess) { - $this->assertEquals($nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); + $this->assertCount($nplural, $indexes, "Langcode '$langCode' has '$nplural' plural forms."); } else { $this->assertNotEquals((int) $nplural, \count($indexes), "Langcode '$langCode' has '$nplural' plural forms."); } diff --git a/vendor/symfony/translation/Command/TranslationPushCommand.php b/vendor/symfony/translation/Command/TranslationPushCommand.php index 56c6f5b1..bf6e8c94 100644 --- a/vendor/symfony/translation/Command/TranslationPushCommand.php +++ b/vendor/symfony/translation/Command/TranslationPushCommand.php @@ -20,6 +20,7 @@ use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; +use Symfony\Component\Translation\Provider\FilteringProvider; use Symfony\Component\Translation\Provider\TranslationProviderCollection; use Symfony\Component\Translation\Reader\TranslationReaderInterface; use Symfony\Component\Translation\TranslatorBag; @@ -130,6 +131,12 @@ EOF $force = $input->getOption('force'); $deleteMissing = $input->getOption('delete-missing'); + if (!$domains && $provider instanceof FilteringProvider) { + $domains = $provider->getDomains(); + } + + // Reading local translations must be done after retrieving the domains from the provider + // in order to manage only translations from configured domains $localTranslations = $this->readLocalTranslations($locales, $domains, $this->transPaths); if (!$domains) { diff --git a/vendor/symfony/translation/DataCollector/TranslationDataCollector.php b/vendor/symfony/translation/DataCollector/TranslationDataCollector.php old mode 100755 new mode 100644 diff --git a/vendor/symfony/translation/Resources/data/parents.json b/vendor/symfony/translation/Resources/data/parents.json index 288f1630..32a33cda 100644 --- a/vendor/symfony/translation/Resources/data/parents.json +++ b/vendor/symfony/translation/Resources/data/parents.json @@ -54,6 +54,7 @@ "en_MS": "en_001", "en_MT": "en_001", "en_MU": "en_001", + "en_MV": "en_001", "en_MW": "en_001", "en_MY": "en_001", "en_NA": "en_001", @@ -116,6 +117,8 @@ "es_UY": "es_419", "es_VE": "es_419", "ff_Adlm": "root", + "hi_Latn": "en_IN", + "ks_Deva": "root", "nb": "no", "nn": "no", "pa_Arab": "root", diff --git a/vendor/symfony/translation/TranslatorBag.php b/vendor/symfony/translation/TranslatorBag.php index 6d98455e..555a9e81 100644 --- a/vendor/symfony/translation/TranslatorBag.php +++ b/vendor/symfony/translation/TranslatorBag.php @@ -94,7 +94,10 @@ final class TranslatorBag implements TranslatorBagInterface $obsoleteCatalogue = new MessageCatalogue($locale); foreach ($operation->getDomains() as $domain) { - $obsoleteCatalogue->add($operation->getObsoleteMessages($domain), $domain); + $obsoleteCatalogue->add( + array_diff($operation->getMessages($domain), $operation->getNewMessages($domain)), + $domain + ); } $diff->addCatalogue($obsoleteCatalogue); diff --git a/vendor/symfony/var-dumper/Caster/DateCaster.php b/vendor/symfony/var-dumper/Caster/DateCaster.php index 99f53849..18641fbc 100644 --- a/vendor/symfony/var-dumper/Caster/DateCaster.php +++ b/vendor/symfony/var-dumper/Caster/DateCaster.php @@ -103,11 +103,11 @@ class DateCaster } $period = sprintf( - 'every %s, from %s (%s) %s', + 'every %s, from %s%s %s', self::formatInterval($p->getDateInterval()), + $p->include_start_date ? '[' : ']', self::formatDateTime($p->getStartDate()), - $p->include_start_date ? 'included' : 'excluded', - ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s' + ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end).(\PHP_VERSION_ID >= 80200 && $p->include_end_date ? ']' : '[') : 'recurring '.$p->recurrences.' time/s' ); $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))]; diff --git a/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php index 721513c5..5b455651 100644 --- a/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php +++ b/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php @@ -1,4 +1,5 @@ <?php + /* * This file is part of the Symfony package. * diff --git a/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/vendor/symfony/var-dumper/Dumper/AbstractDumper.php index 3a2884a8..0f4de086 100644 --- a/vendor/symfony/var-dumper/Dumper/AbstractDumper.php +++ b/vendor/symfony/var-dumper/Dumper/AbstractDumper.php @@ -46,8 +46,7 @@ abstract class AbstractDumper implements DataDumperInterface, DumperInterface { $this->flags = $flags; $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8'); - $this->decimalPoint = localeconv(); - $this->decimalPoint = $this->decimalPoint['decimal_point']; + $this->decimalPoint = \PHP_VERSION_ID >= 80000 ? '.' : localeconv()['decimal_point']; $this->setOutput($output ?: static::$defaultOutput); if (!$output && \is_string(static::$defaultOutput)) { static::$defaultOutput = $this->outputStream; @@ -120,8 +119,7 @@ abstract class AbstractDumper implements DataDumperInterface, DumperInterface */ public function dump(Data $data, $output = null) { - $this->decimalPoint = localeconv(); - $this->decimalPoint = $this->decimalPoint['decimal_point']; + $this->decimalPoint = \PHP_VERSION_ID >= 80000 ? '.' : localeconv()['decimal_point']; if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(\LC_NUMERIC, 0) : null) { setlocale(\LC_NUMERIC, 'C'); diff --git a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php index 2a50ca03..4dbab6d0 100644 --- a/vendor/symfony/var-dumper/Dumper/HtmlDumper.php +++ b/vendor/symfony/var-dumper/Dumper/HtmlDumper.php @@ -369,7 +369,7 @@ return function (root, x) { if (/\bsf-dump-toggle\b/.test(a.className)) { e.preventDefault(); if (!toggle(a, isCtrlKey(e))) { - var r = doc.getElementById(a.getAttribute('href').substr(1)), + var r = doc.getElementById(a.getAttribute('href').slice(1)), s = r.previousSibling, f = r.parentNode, t = a.parentNode; @@ -430,7 +430,7 @@ return function (root, x) { x += elt.parentNode.getAttribute('data-depth')/1; } } else if (/\bsf-dump-ref\b/.test(elt.className) && (a = elt.getAttribute('href'))) { - a = a.substr(1); + a = a.slice(1); elt.className += ' '+a; if (/[\[{]$/.test(elt.previousSibling.nodeValue)) { @@ -960,7 +960,7 @@ EOHTML } $this->lastDepth = $depth; - $this->line = mb_encode_numericentity($this->line, [0x80, 0xFFFF, 0, 0xFFFF], 'UTF-8'); + $this->line = mb_encode_numericentity($this->line, [0x80, 0x10FFFF, 0, 0x1FFFFF], 'UTF-8'); if (-1 === $depth) { AbstractDumper::dumpLine(0); diff --git a/vendor/symfony/var-exporter/Instantiator.php b/vendor/symfony/var-exporter/Instantiator.php index 9e33ea7d..368c769a 100644 --- a/vendor/symfony/var-exporter/Instantiator.php +++ b/vendor/symfony/var-exporter/Instantiator.php @@ -39,10 +39,10 @@ final class Instantiator * Bar::class => ['privateBarProperty' => $propertyValue], * ]); * - * Instances of ArrayObject, ArrayIterator and SplObjectHash can be created + * Instances of ArrayObject, ArrayIterator and SplObjectStorage can be created * by using the special "\0" property name to define their internal value: * - * // creates an SplObjectHash where $info1 is attached to $obj1, etc. + * // creates an SplObjectStorage where $info1 is attached to $obj1, etc. * Instantiator::instantiate(SplObjectStorage::class, ["\0" => [$obj1, $info1, $obj2, $info2...]]); * * // creates an ArrayObject populated with $inputArray diff --git a/vendor/symfony/var-exporter/Internal/Exporter.php b/vendor/symfony/var-exporter/Internal/Exporter.php index 95f6d79d..a034dddb 100644 --- a/vendor/symfony/var-exporter/Internal/Exporter.php +++ b/vendor/symfony/var-exporter/Internal/Exporter.php @@ -108,12 +108,7 @@ class Exporter $arrayValue = (array) $value; } elseif ($value instanceof \Serializable || $value instanceof \__PHP_Incomplete_Class - || $value instanceof \DatePeriod - || (\PHP_VERSION_ID >= 80200 && ( - $value instanceof \DateTimeInterface - || $value instanceof \DateTimeZone - || $value instanceof \DateInterval - )) + || \PHP_VERSION_ID < 80200 && $value instanceof \DatePeriod ) { ++$objectsCount; $objectsPool[$value] = [$id = \count($objectsPool), serialize($value), [], 0]; @@ -138,7 +133,7 @@ class Exporter $i = 0; $n = (string) $name; if ('' === $n || "\0" !== $n[0]) { - $c = 'stdClass'; + $c = \PHP_VERSION_ID >= 80100 && $reflector->hasProperty($n) && ($p = $reflector->getProperty($n))->isReadOnly() ? $p->class : 'stdClass'; } elseif ('*' === $n[1]) { $n = substr($n, 3); $c = $reflector->getProperty($n)->class; @@ -193,12 +188,13 @@ class Exporter public static function export($value, string $indent = '') { switch (true) { - case \is_int($value) || \is_float($value) || $value instanceof \UnitEnum: return var_export($value, true); + case \is_int($value) || \is_float($value): return var_export($value, true); case [] === $value: return '[]'; case false === $value: return 'false'; case true === $value: return 'true'; case null === $value: return 'null'; case '' === $value: return "''"; + case $value instanceof \UnitEnum: return ltrim(var_export($value, true), '\\'); } if ($value instanceof Reference) { diff --git a/vendor/webmozart/assert/.editorconfig b/vendor/webmozart/assert/.editorconfig deleted file mode 100644 index 384453bf..00000000 --- a/vendor/webmozart/assert/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -charset=utf-8 -end_of_line=lf -trim_trailing_whitespace=true -insert_final_newline=true -indent_style=space -indent_size=4 - -[*.yml] -indent_size=2 diff --git a/vendor/webmozart/assert/.github/workflows/ci.yaml b/vendor/webmozart/assert/.github/workflows/ci.yaml deleted file mode 100644 index 636fc5ab..00000000 --- a/vendor/webmozart/assert/.github/workflows/ci.yaml +++ /dev/null @@ -1,120 +0,0 @@ -# https://docs.github.com/en/actions - -name: "CI" - -on: - pull_request: ~ - push: - branches: - - "master" - -env: - COMPOSER_ROOT_VERSION: 1.99 - -jobs: - coding-standards: - name: "Coding Standards" - - runs-on: "ubuntu-latest" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2.3.4" - - - name: "Install PHP" - uses: "shivammathur/setup-php@2.9.0" - with: - coverage: "none" - extensions: "mbstring" - php-version: "7.4" - tools: "composer-normalize" - - - name: "Validate composer.json" - run: "composer validate --strict" - - - name: "Normalize composer.json" - run: "composer-normalize --dry-run" - - - name: "PHP-CS-Fixer" - uses: "docker://oskarstark/php-cs-fixer-ga:2.18.0" - with: - args: "--dry-run --diff-format udiff" - - static-code-analysis: - name: "Static Code Analysis" - - runs-on: "ubuntu-latest" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2.3.4" - - - name: "Install PHP" - uses: "shivammathur/setup-php@2.9.0" - with: - coverage: "none" - extensions: "mbstring" - php-version: "7.4" - - - name: "Install dependencies with composer" - run: "composer update --no-interaction --no-progress && composer i --working-dir=ci" - - - name: "Run vimeo/psalm" - run: "ci/vendor/bin/psalm --threads=4" - - tests: - name: "Tests" - - runs-on: "ubuntu-latest" - - strategy: - matrix: - php-version: - - "7.2" - - "7.3" - - "7.4" - - "8.0" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2.3.4" - - - name: "Install PHP" - uses: "shivammathur/setup-php@2.9.0" - with: - coverage: "none" - extensions: "mbstring" - php-version: "${{ matrix.php-version }}" - - - name: "Install dependencies with composer" - run: "composer update --no-interaction --no-progress" - - - name: "Run unit tests" - run: "vendor/bin/phpunit" - - windows-tests: - name: "Windows tests" - - runs-on: "windows-latest" - - strategy: - matrix: - php-version: - - "7.4" - - steps: - - name: "Checkout" - uses: "actions/checkout@v2.3.4" - - - name: "Install PHP" - uses: "shivammathur/setup-php@2.9.0" - with: - coverage: "none" - extensions: "mbstring" - php-version: "${{ matrix.php-version }}" - - - name: "Install dependencies with composer" - run: "composer update --no-interaction --no-progress" - - - name: "Run unit tests" - run: "vendor/bin/phpunit tests/AssertTest.php" diff --git a/vendor/webmozart/assert/.php_cs b/vendor/webmozart/assert/.php_cs deleted file mode 100644 index f7afd3ed..00000000 --- a/vendor/webmozart/assert/.php_cs +++ /dev/null @@ -1,24 +0,0 @@ -<?php - -$finder = PhpCsFixer\Finder::create() - ->in(__DIR__.'/src') - ->in(__DIR__.'/tests') -; - -return PhpCsFixer\Config::create() - ->setRiskyAllowed(true) - ->setRules([ - '@PSR2' => true, - '@Symfony' => true, - 'ordered_imports' => true, - 'array_syntax' => ['syntax' => 'long'], - 'no_superfluous_phpdoc_tags' => false, - 'phpdoc_annotation_without_dot' => false, - 'phpdoc_types_order' => false, - 'phpdoc_summary' => false, - 'phpdoc_to_comment' => false, - 'phpdoc_align' => false, - 'yoda_style' => false, - ]) - ->setFinder($finder) -; diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md index 8629248b..56c8011d 100644 --- a/vendor/webmozart/assert/CHANGELOG.md +++ b/vendor/webmozart/assert/CHANGELOG.md @@ -3,6 +3,23 @@ Changelog ## UNRELEASED +## 1.11.0 + +### Added + +* Added explicit (non magic) `allNullOr*` methods, with `@psalm-assert` annotations, for better Psalm support. + +### Changed + +* Trait methods will now check the assertion themselves, instead of using `__callStatic` +* `isList` will now deal correctly with (modified) lists that contain `NaN` +* `reportInvalidArgument` now has a return type of `never`. + +### Removed + +* Removed `symfony/polyfill-ctype` as a dependency, and require `ext-cytpe` instead. + * You can still require the `symfony/polyfill-ctype` in your project if you need it, as it provides `ext-ctype` + ## 1.10.0 ### Added diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md index b85d5981..3b2397a1 100644 --- a/vendor/webmozart/assert/README.md +++ b/vendor/webmozart/assert/README.md @@ -43,8 +43,8 @@ Installation Use [Composer] to install the package: -``` -$ composer require webmozart/assert +```bash +composer require webmozart/assert ``` Example diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json index cfae60e5..b340452c 100644 --- a/vendor/webmozart/assert/composer.json +++ b/vendor/webmozart/assert/composer.json @@ -1,12 +1,12 @@ { "name": "webmozart/assert", "description": "Assertions to validate method input/output with nice error messages.", + "license": "MIT", "keywords": [ "assert", "check", "validate" ], - "license": "MIT", "authors": [ { "name": "Bernhard Schussek", @@ -15,19 +15,14 @@ ], "require": { "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" + "ext-ctype": "*" }, "require-dev": { "phpunit/phpunit": "^8.5.13" }, - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" }, "autoload": { "psr-4": { @@ -39,5 +34,10 @@ "Webmozart\\Assert\\Tests\\": "tests/", "Webmozart\\Assert\\Bin\\": "bin/src" } + }, + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } } } diff --git a/vendor/webmozart/assert/psalm.xml b/vendor/webmozart/assert/psalm.xml deleted file mode 100644 index 9a430081..00000000 --- a/vendor/webmozart/assert/psalm.xml +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0"?> -<psalm - totallyTyped="true" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns="https://getpsalm.org/schema/config" - xsi:schemaLocation="https://getpsalm.org/schema/config ci/vendor/vimeo/psalm/config.xsd" - phpVersion="7.3" -> - <projectFiles> - <directory name="bin" /> - <directory name="tests/static-analysis" /> - </projectFiles> - -</psalm> diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php index e0fbabc8..db1f3a51 100644 --- a/vendor/webmozart/assert/src/Assert.php +++ b/vendor/webmozart/assert/src/Assert.php @@ -463,7 +463,7 @@ class Assert static::reportInvalidArgument(\sprintf( $message ?: 'Expected an instance of any of %2$s. Got: %s', static::typeToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + \implode(', ', \array_map(array(static::class, 'valueToString'), $classes)) )); } @@ -485,8 +485,8 @@ class Assert if (!\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s', - static::typeToString($value), + $message ?: 'Expected an instance of this class or to this class among its parents "%2$s". Got: %s', + static::valueToString($value), $class )); } @@ -511,8 +511,8 @@ class Assert if (\is_a($value, $class, \is_string($value))) { static::reportInvalidArgument(sprintf( - $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s', - static::typeToString($value), + $message ?: 'Expected an instance of this class or to this class among its parents other than "%2$s". Got: %s', + static::valueToString($value), $class )); } @@ -539,9 +539,9 @@ class Assert } static::reportInvalidArgument(sprintf( - $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s', - static::typeToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $classes)) + $message ?: 'Expected an instance of any of this classes or any of those classes among their parents "%2$s". Got: %s', + static::valueToString($value), + \implode(', ', $classes) )); } @@ -975,7 +975,7 @@ class Assert static::reportInvalidArgument(\sprintf( $message ?: 'Expected one of: %2$s. Got: %s', static::valueToString($value), - \implode(', ', \array_map(array('static', 'valueToString'), $values)) + \implode(', ', \array_map(array(static::class, 'valueToString'), $values)) )); } } @@ -1822,11 +1822,24 @@ class Assert */ public static function isList($array, $message = '') { - if (!\is_array($array) || $array !== \array_values($array)) { + if (!\is_array($array)) { static::reportInvalidArgument( $message ?: 'Expected list - non-associative array.' ); } + + if ($array === \array_values($array)) { + return; + } + + $nextKey = -1; + foreach ($array as $k => $v) { + if ($k !== ++$nextKey) { + static::reportInvalidArgument( + $message ?: 'Expected list - non-associative array.' + ); + } + } } /** @@ -1955,7 +1968,7 @@ class Assert if ('nullOr' === \substr($name, 0, 6)) { if (null !== $arguments[0]) { $method = \lcfirst(\substr($name, 6)); - \call_user_func_array(array('static', $method), $arguments); + \call_user_func_array(array(static::class, $method), $arguments); } return; @@ -1970,7 +1983,7 @@ class Assert foreach ($arguments[0] as $entry) { $args[0] = $entry; - \call_user_func_array(array('static', $method), $args); + \call_user_func_array(array(static::class, $method), $args); } return; @@ -2054,6 +2067,7 @@ class Assert * @throws InvalidArgumentException * * @psalm-pure this method is not supposed to perform side-effects + * @psalm-return never */ protected static function reportInvalidArgument($message) { diff --git a/vendor/webmozart/assert/src/Mixin.php b/vendor/webmozart/assert/src/Mixin.php index 5e98823d..0f0a75e3 100644 --- a/vendor/webmozart/assert/src/Mixin.php +++ b/vendor/webmozart/assert/src/Mixin.php @@ -1,9 +1,5 @@ <?php -/** - * provides type inference and auto-completion for magic static methods of Assert. - */ - namespace Webmozart\Assert; use ArrayAccess; @@ -12,7 +8,7 @@ use Countable; use Throwable; /** - * This trait aids static analysis tooling in introspecting assertion magic methods. + * This trait provides nurllOr*, all* and allNullOr* variants of assertion base methods. * Do not use this trait directly: it will change, and is not designed for reuse. */ trait Mixin @@ -30,7 +26,7 @@ trait Mixin */ public static function nullOrString($value, $message = '') { - static::__callStatic('nullOrString', array($value, $message)); + null === $value || static::string($value, $message); } /** @@ -46,7 +42,31 @@ trait Mixin */ public static function allString($value, $message = '') { - static::__callStatic('allString', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::string($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<string|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrString($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::string($entry, $message); + } } /** @@ -62,7 +82,7 @@ trait Mixin */ public static function nullOrStringNotEmpty($value, $message = '') { - static::__callStatic('nullOrStringNotEmpty', array($value, $message)); + null === $value || static::stringNotEmpty($value, $message); } /** @@ -78,7 +98,31 @@ trait Mixin */ public static function allStringNotEmpty($value, $message = '') { - static::__callStatic('allStringNotEmpty', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::stringNotEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<non-empty-string|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStringNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::stringNotEmpty($entry, $message); + } } /** @@ -94,7 +138,7 @@ trait Mixin */ public static function nullOrInteger($value, $message = '') { - static::__callStatic('nullOrInteger', array($value, $message)); + null === $value || static::integer($value, $message); } /** @@ -110,7 +154,31 @@ trait Mixin */ public static function allInteger($value, $message = '') { - static::__callStatic('allInteger', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::integer($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<int|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::integer($entry, $message); + } } /** @@ -126,7 +194,7 @@ trait Mixin */ public static function nullOrIntegerish($value, $message = '') { - static::__callStatic('nullOrIntegerish', array($value, $message)); + null === $value || static::integerish($value, $message); } /** @@ -142,7 +210,31 @@ trait Mixin */ public static function allIntegerish($value, $message = '') { - static::__callStatic('allIntegerish', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::integerish($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<numeric|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIntegerish($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::integerish($entry, $message); + } } /** @@ -158,7 +250,7 @@ trait Mixin */ public static function nullOrPositiveInteger($value, $message = '') { - static::__callStatic('nullOrPositiveInteger', array($value, $message)); + null === $value || static::positiveInteger($value, $message); } /** @@ -174,7 +266,31 @@ trait Mixin */ public static function allPositiveInteger($value, $message = '') { - static::__callStatic('allPositiveInteger', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::positiveInteger($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<positive-int|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPositiveInteger($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::positiveInteger($entry, $message); + } } /** @@ -190,7 +306,7 @@ trait Mixin */ public static function nullOrFloat($value, $message = '') { - static::__callStatic('nullOrFloat', array($value, $message)); + null === $value || static::float($value, $message); } /** @@ -206,7 +322,31 @@ trait Mixin */ public static function allFloat($value, $message = '') { - static::__callStatic('allFloat', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::float($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<float|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFloat($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::float($entry, $message); + } } /** @@ -222,7 +362,7 @@ trait Mixin */ public static function nullOrNumeric($value, $message = '') { - static::__callStatic('nullOrNumeric', array($value, $message)); + null === $value || static::numeric($value, $message); } /** @@ -238,7 +378,31 @@ trait Mixin */ public static function allNumeric($value, $message = '') { - static::__callStatic('allNumeric', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::numeric($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<numeric|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNumeric($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::numeric($entry, $message); + } } /** @@ -254,7 +418,7 @@ trait Mixin */ public static function nullOrNatural($value, $message = '') { - static::__callStatic('nullOrNatural', array($value, $message)); + null === $value || static::natural($value, $message); } /** @@ -270,7 +434,31 @@ trait Mixin */ public static function allNatural($value, $message = '') { - static::__callStatic('allNatural', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::natural($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<positive-int|0|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNatural($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::natural($entry, $message); + } } /** @@ -286,7 +474,7 @@ trait Mixin */ public static function nullOrBoolean($value, $message = '') { - static::__callStatic('nullOrBoolean', array($value, $message)); + null === $value || static::boolean($value, $message); } /** @@ -302,7 +490,31 @@ trait Mixin */ public static function allBoolean($value, $message = '') { - static::__callStatic('allBoolean', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::boolean($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<bool|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrBoolean($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::boolean($entry, $message); + } } /** @@ -318,7 +530,7 @@ trait Mixin */ public static function nullOrScalar($value, $message = '') { - static::__callStatic('nullOrScalar', array($value, $message)); + null === $value || static::scalar($value, $message); } /** @@ -334,7 +546,31 @@ trait Mixin */ public static function allScalar($value, $message = '') { - static::__callStatic('allScalar', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::scalar($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<scalar|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrScalar($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::scalar($entry, $message); + } } /** @@ -350,7 +586,7 @@ trait Mixin */ public static function nullOrObject($value, $message = '') { - static::__callStatic('nullOrObject', array($value, $message)); + null === $value || static::object($value, $message); } /** @@ -366,7 +602,31 @@ trait Mixin */ public static function allObject($value, $message = '') { - static::__callStatic('allObject', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::object($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<object|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrObject($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::object($entry, $message); + } } /** @@ -383,7 +643,7 @@ trait Mixin */ public static function nullOrResource($value, $type = null, $message = '') { - static::__callStatic('nullOrResource', array($value, $type, $message)); + null === $value || static::resource($value, $type, $message); } /** @@ -400,7 +660,32 @@ trait Mixin */ public static function allResource($value, $type = null, $message = '') { - static::__callStatic('allResource', array($value, $type, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::resource($entry, $type, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<resource|null> $value + * + * @param mixed $value + * @param string|null $type type of resource this should be. @see https://www.php.net/manual/en/function.get-resource-type.php + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrResource($value, $type = null, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::resource($entry, $type, $message); + } } /** @@ -416,7 +701,7 @@ trait Mixin */ public static function nullOrIsCallable($value, $message = '') { - static::__callStatic('nullOrIsCallable', array($value, $message)); + null === $value || static::isCallable($value, $message); } /** @@ -432,7 +717,31 @@ trait Mixin */ public static function allIsCallable($value, $message = '') { - static::__callStatic('allIsCallable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isCallable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<callable|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCallable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isCallable($entry, $message); + } } /** @@ -448,7 +757,7 @@ trait Mixin */ public static function nullOrIsArray($value, $message = '') { - static::__callStatic('nullOrIsArray', array($value, $message)); + null === $value || static::isArray($value, $message); } /** @@ -464,7 +773,31 @@ trait Mixin */ public static function allIsArray($value, $message = '') { - static::__callStatic('allIsArray', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isArray($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<array|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArray($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isArray($entry, $message); + } } /** @@ -482,7 +815,7 @@ trait Mixin */ public static function nullOrIsTraversable($value, $message = '') { - static::__callStatic('nullOrIsTraversable', array($value, $message)); + null === $value || static::isTraversable($value, $message); } /** @@ -500,7 +833,33 @@ trait Mixin */ public static function allIsTraversable($value, $message = '') { - static::__callStatic('allIsTraversable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isTraversable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<iterable|null> $value + * + * @deprecated use "isIterable" or "isInstanceOf" instead + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsTraversable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isTraversable($entry, $message); + } } /** @@ -516,7 +875,7 @@ trait Mixin */ public static function nullOrIsArrayAccessible($value, $message = '') { - static::__callStatic('nullOrIsArrayAccessible', array($value, $message)); + null === $value || static::isArrayAccessible($value, $message); } /** @@ -532,7 +891,31 @@ trait Mixin */ public static function allIsArrayAccessible($value, $message = '') { - static::__callStatic('allIsArrayAccessible', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isArrayAccessible($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<array|ArrayAccess|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsArrayAccessible($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isArrayAccessible($entry, $message); + } } /** @@ -548,7 +931,7 @@ trait Mixin */ public static function nullOrIsCountable($value, $message = '') { - static::__callStatic('nullOrIsCountable', array($value, $message)); + null === $value || static::isCountable($value, $message); } /** @@ -564,7 +947,31 @@ trait Mixin */ public static function allIsCountable($value, $message = '') { - static::__callStatic('allIsCountable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isCountable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<countable|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsCountable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isCountable($entry, $message); + } } /** @@ -580,7 +987,7 @@ trait Mixin */ public static function nullOrIsIterable($value, $message = '') { - static::__callStatic('nullOrIsIterable', array($value, $message)); + null === $value || static::isIterable($value, $message); } /** @@ -596,7 +1003,31 @@ trait Mixin */ public static function allIsIterable($value, $message = '') { - static::__callStatic('allIsIterable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isIterable($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<iterable|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsIterable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isIterable($entry, $message); + } } /** @@ -615,7 +1046,7 @@ trait Mixin */ public static function nullOrIsInstanceOf($value, $class, $message = '') { - static::__callStatic('nullOrIsInstanceOf', array($value, $class, $message)); + null === $value || static::isInstanceOf($value, $class, $message); } /** @@ -634,7 +1065,34 @@ trait Mixin */ public static function allIsInstanceOf($value, $class, $message = '') { - static::__callStatic('allIsInstanceOf', array($value, $class, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string<ExpectedType> $class + * @psalm-assert iterable<ExpectedType|null> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isInstanceOf($entry, $class, $message); + } } /** @@ -652,7 +1110,7 @@ trait Mixin */ public static function nullOrNotInstanceOf($value, $class, $message = '') { - static::__callStatic('nullOrNotInstanceOf', array($value, $class, $message)); + null === $value || static::notInstanceOf($value, $class, $message); } /** @@ -670,7 +1128,34 @@ trait Mixin */ public static function allNotInstanceOf($value, $class, $message = '') { - static::__callStatic('allNotInstanceOf', array($value, $class, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notInstanceOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string<ExpectedType> $class + * @psalm-assert iterable<!ExpectedType|null> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotInstanceOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notInstanceOf($entry, $class, $message); + } } /** @@ -687,7 +1172,7 @@ trait Mixin */ public static function nullOrIsInstanceOfAny($value, $classes, $message = '') { - static::__callStatic('nullOrIsInstanceOfAny', array($value, $classes, $message)); + null === $value || static::isInstanceOfAny($value, $classes, $message); } /** @@ -704,7 +1189,32 @@ trait Mixin */ public static function allIsInstanceOfAny($value, $classes, $message = '') { - static::__callStatic('allIsInstanceOfAny', array($value, $classes, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isInstanceOfAny($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array<class-string> $classes + * + * @param mixed $value + * @param array<object|string> $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsInstanceOfAny($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isInstanceOfAny($entry, $classes, $message); + } } /** @@ -723,7 +1233,7 @@ trait Mixin */ public static function nullOrIsAOf($value, $class, $message = '') { - static::__callStatic('nullOrIsAOf', array($value, $class, $message)); + null === $value || static::isAOf($value, $class, $message); } /** @@ -742,7 +1252,34 @@ trait Mixin */ public static function allIsAOf($value, $class, $message = '') { - static::__callStatic('allIsAOf', array($value, $class, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isAOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string<ExpectedType> $class + * @psalm-assert iterable<ExpectedType|class-string<ExpectedType>|null> $value + * + * @param iterable<object|string|null> $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isAOf($entry, $class, $message); + } } /** @@ -760,7 +1297,7 @@ trait Mixin */ public static function nullOrIsNotA($value, $class, $message = '') { - static::__callStatic('nullOrIsNotA', array($value, $class, $message)); + null === $value || static::isNotA($value, $class, $message); } /** @@ -778,7 +1315,35 @@ trait Mixin */ public static function allIsNotA($value, $class, $message = '') { - static::__callStatic('allIsNotA', array($value, $class, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isNotA($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template UnexpectedType of object + * @psalm-param class-string<UnexpectedType> $class + * @psalm-assert iterable<!UnexpectedType|null> $value + * @psalm-assert iterable<!class-string<UnexpectedType>|null> $value + * + * @param iterable<object|string|null> $value + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNotA($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isNotA($entry, $class, $message); + } } /** @@ -795,7 +1360,7 @@ trait Mixin */ public static function nullOrIsAnyOf($value, $classes, $message = '') { - static::__callStatic('nullOrIsAnyOf', array($value, $classes, $message)); + null === $value || static::isAnyOf($value, $classes, $message); } /** @@ -812,7 +1377,32 @@ trait Mixin */ public static function allIsAnyOf($value, $classes, $message = '') { - static::__callStatic('allIsAnyOf', array($value, $classes, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isAnyOf($entry, $classes, $message); + } + } + + /** + * @psalm-pure + * @psalm-param array<class-string> $classes + * + * @param iterable<object|string|null> $value + * @param string[] $classes + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsAnyOf($value, $classes, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isAnyOf($entry, $classes, $message); + } } /** @@ -828,7 +1418,7 @@ trait Mixin */ public static function nullOrIsEmpty($value, $message = '') { - static::__callStatic('nullOrIsEmpty', array($value, $message)); + null === $value || static::isEmpty($value, $message); } /** @@ -844,7 +1434,31 @@ trait Mixin */ public static function allIsEmpty($value, $message = '') { - static::__callStatic('allIsEmpty', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::isEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<empty|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::isEmpty($entry, $message); + } } /** @@ -859,7 +1473,7 @@ trait Mixin */ public static function nullOrNotEmpty($value, $message = '') { - static::__callStatic('nullOrNotEmpty', array($value, $message)); + null === $value || static::notEmpty($value, $message); } /** @@ -874,7 +1488,31 @@ trait Mixin */ public static function allNotEmpty($value, $message = '') { - static::__callStatic('allNotEmpty', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notEmpty($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<!empty|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEmpty($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEmpty($entry, $message); + } } /** @@ -890,7 +1528,11 @@ trait Mixin */ public static function allNull($value, $message = '') { - static::__callStatic('allNull', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::null($entry, $message); + } } /** @@ -905,7 +1547,11 @@ trait Mixin */ public static function allNotNull($value, $message = '') { - static::__callStatic('allNotNull', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notNull($entry, $message); + } } /** @@ -921,7 +1567,7 @@ trait Mixin */ public static function nullOrTrue($value, $message = '') { - static::__callStatic('nullOrTrue', array($value, $message)); + null === $value || static::true($value, $message); } /** @@ -937,7 +1583,31 @@ trait Mixin */ public static function allTrue($value, $message = '') { - static::__callStatic('allTrue', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::true($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<true|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrTrue($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::true($entry, $message); + } } /** @@ -953,7 +1623,7 @@ trait Mixin */ public static function nullOrFalse($value, $message = '') { - static::__callStatic('nullOrFalse', array($value, $message)); + null === $value || static::false($value, $message); } /** @@ -969,7 +1639,31 @@ trait Mixin */ public static function allFalse($value, $message = '') { - static::__callStatic('allFalse', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::false($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<false|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::false($entry, $message); + } } /** @@ -984,7 +1678,7 @@ trait Mixin */ public static function nullOrNotFalse($value, $message = '') { - static::__callStatic('nullOrNotFalse', array($value, $message)); + null === $value || static::notFalse($value, $message); } /** @@ -999,7 +1693,31 @@ trait Mixin */ public static function allNotFalse($value, $message = '') { - static::__callStatic('allNotFalse', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notFalse($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<!false|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotFalse($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notFalse($entry, $message); + } } /** @@ -1012,7 +1730,7 @@ trait Mixin */ public static function nullOrIp($value, $message = '') { - static::__callStatic('nullOrIp', array($value, $message)); + null === $value || static::ip($value, $message); } /** @@ -1025,7 +1743,28 @@ trait Mixin */ public static function allIp($value, $message = '') { - static::__callStatic('allIp', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::ip($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIp($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ip($entry, $message); + } } /** @@ -1038,7 +1777,7 @@ trait Mixin */ public static function nullOrIpv4($value, $message = '') { - static::__callStatic('nullOrIpv4', array($value, $message)); + null === $value || static::ipv4($value, $message); } /** @@ -1051,7 +1790,28 @@ trait Mixin */ public static function allIpv4($value, $message = '') { - static::__callStatic('allIpv4', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::ipv4($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv4($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ipv4($entry, $message); + } } /** @@ -1064,7 +1824,7 @@ trait Mixin */ public static function nullOrIpv6($value, $message = '') { - static::__callStatic('nullOrIpv6', array($value, $message)); + null === $value || static::ipv6($value, $message); } /** @@ -1077,7 +1837,28 @@ trait Mixin */ public static function allIpv6($value, $message = '') { - static::__callStatic('allIpv6', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::ipv6($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIpv6($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::ipv6($entry, $message); + } } /** @@ -1090,7 +1871,7 @@ trait Mixin */ public static function nullOrEmail($value, $message = '') { - static::__callStatic('nullOrEmail', array($value, $message)); + null === $value || static::email($value, $message); } /** @@ -1103,7 +1884,28 @@ trait Mixin */ public static function allEmail($value, $message = '') { - static::__callStatic('allEmail', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::email($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEmail($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::email($entry, $message); + } } /** @@ -1116,7 +1918,7 @@ trait Mixin */ public static function nullOrUniqueValues($values, $message = '') { - static::__callStatic('nullOrUniqueValues', array($values, $message)); + null === $values || static::uniqueValues($values, $message); } /** @@ -1129,7 +1931,28 @@ trait Mixin */ public static function allUniqueValues($values, $message = '') { - static::__callStatic('allUniqueValues', array($values, $message)); + static::isIterable($values); + + foreach ($values as $entry) { + static::uniqueValues($entry, $message); + } + } + + /** + * @param iterable<array|null> $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUniqueValues($values, $message = '') + { + static::isIterable($values); + + foreach ($values as $entry) { + null === $entry || static::uniqueValues($entry, $message); + } } /** @@ -1143,7 +1966,7 @@ trait Mixin */ public static function nullOrEq($value, $expect, $message = '') { - static::__callStatic('nullOrEq', array($value, $expect, $message)); + null === $value || static::eq($value, $expect, $message); } /** @@ -1157,7 +1980,29 @@ trait Mixin */ public static function allEq($value, $expect, $message = '') { - static::__callStatic('allEq', array($value, $expect, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::eq($entry, $expect, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::eq($entry, $expect, $message); + } } /** @@ -1171,7 +2016,7 @@ trait Mixin */ public static function nullOrNotEq($value, $expect, $message = '') { - static::__callStatic('nullOrNotEq', array($value, $expect, $message)); + null === $value || static::notEq($value, $expect, $message); } /** @@ -1185,7 +2030,29 @@ trait Mixin */ public static function allNotEq($value, $expect, $message = '') { - static::__callStatic('allNotEq', array($value, $expect, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notEq($entry, $expect, $message); + } + } + + /** + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEq($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEq($entry, $expect, $message); + } } /** @@ -1201,7 +2068,7 @@ trait Mixin */ public static function nullOrSame($value, $expect, $message = '') { - static::__callStatic('nullOrSame', array($value, $expect, $message)); + null === $value || static::same($value, $expect, $message); } /** @@ -1217,7 +2084,31 @@ trait Mixin */ public static function allSame($value, $expect, $message = '') { - static::__callStatic('allSame', array($value, $expect, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::same($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::same($entry, $expect, $message); + } } /** @@ -1233,7 +2124,7 @@ trait Mixin */ public static function nullOrNotSame($value, $expect, $message = '') { - static::__callStatic('nullOrNotSame', array($value, $expect, $message)); + null === $value || static::notSame($value, $expect, $message); } /** @@ -1249,7 +2140,31 @@ trait Mixin */ public static function allNotSame($value, $expect, $message = '') { - static::__callStatic('allNotSame', array($value, $expect, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notSame($entry, $expect, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $expect + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotSame($value, $expect, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notSame($entry, $expect, $message); + } } /** @@ -1265,7 +2180,7 @@ trait Mixin */ public static function nullOrGreaterThan($value, $limit, $message = '') { - static::__callStatic('nullOrGreaterThan', array($value, $limit, $message)); + null === $value || static::greaterThan($value, $limit, $message); } /** @@ -1281,7 +2196,31 @@ trait Mixin */ public static function allGreaterThan($value, $limit, $message = '') { - static::__callStatic('allGreaterThan', array($value, $limit, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::greaterThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::greaterThan($entry, $limit, $message); + } } /** @@ -1297,7 +2236,7 @@ trait Mixin */ public static function nullOrGreaterThanEq($value, $limit, $message = '') { - static::__callStatic('nullOrGreaterThanEq', array($value, $limit, $message)); + null === $value || static::greaterThanEq($value, $limit, $message); } /** @@ -1313,7 +2252,31 @@ trait Mixin */ public static function allGreaterThanEq($value, $limit, $message = '') { - static::__callStatic('allGreaterThanEq', array($value, $limit, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::greaterThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrGreaterThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::greaterThanEq($entry, $limit, $message); + } } /** @@ -1329,7 +2292,7 @@ trait Mixin */ public static function nullOrLessThan($value, $limit, $message = '') { - static::__callStatic('nullOrLessThan', array($value, $limit, $message)); + null === $value || static::lessThan($value, $limit, $message); } /** @@ -1345,7 +2308,31 @@ trait Mixin */ public static function allLessThan($value, $limit, $message = '') { - static::__callStatic('allLessThan', array($value, $limit, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::lessThan($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThan($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lessThan($entry, $limit, $message); + } } /** @@ -1361,7 +2348,7 @@ trait Mixin */ public static function nullOrLessThanEq($value, $limit, $message = '') { - static::__callStatic('nullOrLessThanEq', array($value, $limit, $message)); + null === $value || static::lessThanEq($value, $limit, $message); } /** @@ -1377,7 +2364,31 @@ trait Mixin */ public static function allLessThanEq($value, $limit, $message = '') { - static::__callStatic('allLessThanEq', array($value, $limit, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::lessThanEq($entry, $limit, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $limit + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLessThanEq($value, $limit, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lessThanEq($entry, $limit, $message); + } } /** @@ -1394,7 +2405,7 @@ trait Mixin */ public static function nullOrRange($value, $min, $max, $message = '') { - static::__callStatic('nullOrRange', array($value, $min, $max, $message)); + null === $value || static::range($value, $min, $max, $message); } /** @@ -1411,7 +2422,32 @@ trait Mixin */ public static function allRange($value, $min, $max, $message = '') { - static::__callStatic('allRange', array($value, $min, $max, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::range($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param mixed $min + * @param mixed $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRange($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::range($entry, $min, $max, $message); + } } /** @@ -1427,7 +2463,7 @@ trait Mixin */ public static function nullOrOneOf($value, $values, $message = '') { - static::__callStatic('nullOrOneOf', array($value, $values, $message)); + null === $value || static::oneOf($value, $values, $message); } /** @@ -1443,7 +2479,31 @@ trait Mixin */ public static function allOneOf($value, $values, $message = '') { - static::__callStatic('allOneOf', array($value, $values, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::oneOf($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrOneOf($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::oneOf($entry, $values, $message); + } } /** @@ -1459,7 +2519,7 @@ trait Mixin */ public static function nullOrInArray($value, $values, $message = '') { - static::__callStatic('nullOrInArray', array($value, $values, $message)); + null === $value || static::inArray($value, $values, $message); } /** @@ -1475,7 +2535,31 @@ trait Mixin */ public static function allInArray($value, $values, $message = '') { - static::__callStatic('allInArray', array($value, $values, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::inArray($entry, $values, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param array $values + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInArray($value, $values, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::inArray($entry, $values, $message); + } } /** @@ -1491,7 +2575,7 @@ trait Mixin */ public static function nullOrContains($value, $subString, $message = '') { - static::__callStatic('nullOrContains', array($value, $subString, $message)); + null === $value || static::contains($value, $subString, $message); } /** @@ -1507,7 +2591,31 @@ trait Mixin */ public static function allContains($value, $subString, $message = '') { - static::__callStatic('allContains', array($value, $subString, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::contains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::contains($entry, $subString, $message); + } } /** @@ -1523,7 +2631,7 @@ trait Mixin */ public static function nullOrNotContains($value, $subString, $message = '') { - static::__callStatic('nullOrNotContains', array($value, $subString, $message)); + null === $value || static::notContains($value, $subString, $message); } /** @@ -1539,7 +2647,31 @@ trait Mixin */ public static function allNotContains($value, $subString, $message = '') { - static::__callStatic('allNotContains', array($value, $subString, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notContains($entry, $subString, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $subString + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotContains($value, $subString, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notContains($entry, $subString, $message); + } } /** @@ -1554,7 +2686,7 @@ trait Mixin */ public static function nullOrNotWhitespaceOnly($value, $message = '') { - static::__callStatic('nullOrNotWhitespaceOnly', array($value, $message)); + null === $value || static::notWhitespaceOnly($value, $message); } /** @@ -1569,7 +2701,30 @@ trait Mixin */ public static function allNotWhitespaceOnly($value, $message = '') { - static::__callStatic('allNotWhitespaceOnly', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notWhitespaceOnly($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotWhitespaceOnly($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notWhitespaceOnly($entry, $message); + } } /** @@ -1585,7 +2740,7 @@ trait Mixin */ public static function nullOrStartsWith($value, $prefix, $message = '') { - static::__callStatic('nullOrStartsWith', array($value, $prefix, $message)); + null === $value || static::startsWith($value, $prefix, $message); } /** @@ -1601,7 +2756,31 @@ trait Mixin */ public static function allStartsWith($value, $prefix, $message = '') { - static::__callStatic('allStartsWith', array($value, $prefix, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::startsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::startsWith($entry, $prefix, $message); + } } /** @@ -1617,7 +2796,7 @@ trait Mixin */ public static function nullOrNotStartsWith($value, $prefix, $message = '') { - static::__callStatic('nullOrNotStartsWith', array($value, $prefix, $message)); + null === $value || static::notStartsWith($value, $prefix, $message); } /** @@ -1633,7 +2812,31 @@ trait Mixin */ public static function allNotStartsWith($value, $prefix, $message = '') { - static::__callStatic('allNotStartsWith', array($value, $prefix, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notStartsWith($entry, $prefix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $prefix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotStartsWith($value, $prefix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notStartsWith($entry, $prefix, $message); + } } /** @@ -1648,7 +2851,7 @@ trait Mixin */ public static function nullOrStartsWithLetter($value, $message = '') { - static::__callStatic('nullOrStartsWithLetter', array($value, $message)); + null === $value || static::startsWithLetter($value, $message); } /** @@ -1663,7 +2866,30 @@ trait Mixin */ public static function allStartsWithLetter($value, $message = '') { - static::__callStatic('allStartsWithLetter', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::startsWithLetter($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrStartsWithLetter($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::startsWithLetter($entry, $message); + } } /** @@ -1679,7 +2905,7 @@ trait Mixin */ public static function nullOrEndsWith($value, $suffix, $message = '') { - static::__callStatic('nullOrEndsWith', array($value, $suffix, $message)); + null === $value || static::endsWith($value, $suffix, $message); } /** @@ -1695,7 +2921,31 @@ trait Mixin */ public static function allEndsWith($value, $suffix, $message = '') { - static::__callStatic('allEndsWith', array($value, $suffix, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::endsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::endsWith($entry, $suffix, $message); + } } /** @@ -1711,7 +2961,7 @@ trait Mixin */ public static function nullOrNotEndsWith($value, $suffix, $message = '') { - static::__callStatic('nullOrNotEndsWith', array($value, $suffix, $message)); + null === $value || static::notEndsWith($value, $suffix, $message); } /** @@ -1727,7 +2977,31 @@ trait Mixin */ public static function allNotEndsWith($value, $suffix, $message = '') { - static::__callStatic('allNotEndsWith', array($value, $suffix, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notEndsWith($entry, $suffix, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $suffix + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotEndsWith($value, $suffix, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notEndsWith($entry, $suffix, $message); + } } /** @@ -1743,7 +3017,7 @@ trait Mixin */ public static function nullOrRegex($value, $pattern, $message = '') { - static::__callStatic('nullOrRegex', array($value, $pattern, $message)); + null === $value || static::regex($value, $pattern, $message); } /** @@ -1759,7 +3033,31 @@ trait Mixin */ public static function allRegex($value, $pattern, $message = '') { - static::__callStatic('allRegex', array($value, $pattern, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::regex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::regex($entry, $pattern, $message); + } } /** @@ -1775,7 +3073,7 @@ trait Mixin */ public static function nullOrNotRegex($value, $pattern, $message = '') { - static::__callStatic('nullOrNotRegex', array($value, $pattern, $message)); + null === $value || static::notRegex($value, $pattern, $message); } /** @@ -1791,7 +3089,31 @@ trait Mixin */ public static function allNotRegex($value, $pattern, $message = '') { - static::__callStatic('allNotRegex', array($value, $pattern, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::notRegex($entry, $pattern, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $pattern + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrNotRegex($value, $pattern, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::notRegex($entry, $pattern, $message); + } } /** @@ -1806,7 +3128,7 @@ trait Mixin */ public static function nullOrUnicodeLetters($value, $message = '') { - static::__callStatic('nullOrUnicodeLetters', array($value, $message)); + null === $value || static::unicodeLetters($value, $message); } /** @@ -1821,7 +3143,30 @@ trait Mixin */ public static function allUnicodeLetters($value, $message = '') { - static::__callStatic('allUnicodeLetters', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::unicodeLetters($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUnicodeLetters($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::unicodeLetters($entry, $message); + } } /** @@ -1836,7 +3181,7 @@ trait Mixin */ public static function nullOrAlpha($value, $message = '') { - static::__callStatic('nullOrAlpha', array($value, $message)); + null === $value || static::alpha($value, $message); } /** @@ -1851,7 +3196,30 @@ trait Mixin */ public static function allAlpha($value, $message = '') { - static::__callStatic('allAlpha', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::alpha($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlpha($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::alpha($entry, $message); + } } /** @@ -1866,7 +3234,7 @@ trait Mixin */ public static function nullOrDigits($value, $message = '') { - static::__callStatic('nullOrDigits', array($value, $message)); + null === $value || static::digits($value, $message); } /** @@ -1881,7 +3249,30 @@ trait Mixin */ public static function allDigits($value, $message = '') { - static::__callStatic('allDigits', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::digits($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDigits($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::digits($entry, $message); + } } /** @@ -1896,7 +3287,7 @@ trait Mixin */ public static function nullOrAlnum($value, $message = '') { - static::__callStatic('nullOrAlnum', array($value, $message)); + null === $value || static::alnum($value, $message); } /** @@ -1911,7 +3302,30 @@ trait Mixin */ public static function allAlnum($value, $message = '') { - static::__callStatic('allAlnum', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::alnum($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrAlnum($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::alnum($entry, $message); + } } /** @@ -1927,7 +3341,7 @@ trait Mixin */ public static function nullOrLower($value, $message = '') { - static::__callStatic('nullOrLower', array($value, $message)); + null === $value || static::lower($value, $message); } /** @@ -1943,7 +3357,31 @@ trait Mixin */ public static function allLower($value, $message = '') { - static::__callStatic('allLower', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::lower($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<lowercase-string|null> $value + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLower($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lower($entry, $message); + } } /** @@ -1958,7 +3396,7 @@ trait Mixin */ public static function nullOrUpper($value, $message = '') { - static::__callStatic('nullOrUpper', array($value, $message)); + null === $value || static::upper($value, $message); } /** @@ -1973,7 +3411,31 @@ trait Mixin */ public static function allUpper($value, $message = '') { - static::__callStatic('allUpper', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::upper($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<!lowercase-string|null> $value + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUpper($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::upper($entry, $message); + } } /** @@ -1989,7 +3451,7 @@ trait Mixin */ public static function nullOrLength($value, $length, $message = '') { - static::__callStatic('nullOrLength', array($value, $length, $message)); + null === $value || static::length($value, $length, $message); } /** @@ -2005,7 +3467,31 @@ trait Mixin */ public static function allLength($value, $length, $message = '') { - static::__callStatic('allLength', array($value, $length, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::length($entry, $length, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param int $length + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLength($value, $length, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::length($entry, $length, $message); + } } /** @@ -2021,7 +3507,7 @@ trait Mixin */ public static function nullOrMinLength($value, $min, $message = '') { - static::__callStatic('nullOrMinLength', array($value, $min, $message)); + null === $value || static::minLength($value, $min, $message); } /** @@ -2037,7 +3523,31 @@ trait Mixin */ public static function allMinLength($value, $min, $message = '') { - static::__callStatic('allMinLength', array($value, $min, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::minLength($entry, $min, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinLength($value, $min, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::minLength($entry, $min, $message); + } } /** @@ -2053,7 +3563,7 @@ trait Mixin */ public static function nullOrMaxLength($value, $max, $message = '') { - static::__callStatic('nullOrMaxLength', array($value, $max, $message)); + null === $value || static::maxLength($value, $max, $message); } /** @@ -2069,7 +3579,31 @@ trait Mixin */ public static function allMaxLength($value, $max, $message = '') { - static::__callStatic('allMaxLength', array($value, $max, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::maxLength($entry, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxLength($value, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::maxLength($entry, $max, $message); + } } /** @@ -2086,7 +3620,7 @@ trait Mixin */ public static function nullOrLengthBetween($value, $min, $max, $message = '') { - static::__callStatic('nullOrLengthBetween', array($value, $min, $max, $message)); + null === $value || static::lengthBetween($value, $min, $max, $message); } /** @@ -2103,7 +3637,32 @@ trait Mixin */ public static function allLengthBetween($value, $min, $max, $message = '') { - static::__callStatic('allLengthBetween', array($value, $min, $max, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::lengthBetween($entry, $min, $max, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrLengthBetween($value, $min, $max, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::lengthBetween($entry, $min, $max, $message); + } } /** @@ -2116,7 +3675,7 @@ trait Mixin */ public static function nullOrFileExists($value, $message = '') { - static::__callStatic('nullOrFileExists', array($value, $message)); + null === $value || static::fileExists($value, $message); } /** @@ -2129,7 +3688,28 @@ trait Mixin */ public static function allFileExists($value, $message = '') { - static::__callStatic('allFileExists', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::fileExists($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFileExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::fileExists($entry, $message); + } } /** @@ -2142,7 +3722,7 @@ trait Mixin */ public static function nullOrFile($value, $message = '') { - static::__callStatic('nullOrFile', array($value, $message)); + null === $value || static::file($value, $message); } /** @@ -2155,7 +3735,28 @@ trait Mixin */ public static function allFile($value, $message = '') { - static::__callStatic('allFile', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::file($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrFile($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::file($entry, $message); + } } /** @@ -2168,7 +3769,7 @@ trait Mixin */ public static function nullOrDirectory($value, $message = '') { - static::__callStatic('nullOrDirectory', array($value, $message)); + null === $value || static::directory($value, $message); } /** @@ -2181,7 +3782,28 @@ trait Mixin */ public static function allDirectory($value, $message = '') { - static::__callStatic('allDirectory', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::directory($entry, $message); + } + } + + /** + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrDirectory($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::directory($entry, $message); + } } /** @@ -2194,7 +3816,7 @@ trait Mixin */ public static function nullOrReadable($value, $message = '') { - static::__callStatic('nullOrReadable', array($value, $message)); + null === $value || static::readable($value, $message); } /** @@ -2207,7 +3829,28 @@ trait Mixin */ public static function allReadable($value, $message = '') { - static::__callStatic('allReadable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::readable($entry, $message); + } + } + + /** + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrReadable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::readable($entry, $message); + } } /** @@ -2220,7 +3863,7 @@ trait Mixin */ public static function nullOrWritable($value, $message = '') { - static::__callStatic('nullOrWritable', array($value, $message)); + null === $value || static::writable($value, $message); } /** @@ -2233,7 +3876,28 @@ trait Mixin */ public static function allWritable($value, $message = '') { - static::__callStatic('allWritable', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::writable($entry, $message); + } + } + + /** + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrWritable($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::writable($entry, $message); + } } /** @@ -2248,7 +3912,7 @@ trait Mixin */ public static function nullOrClassExists($value, $message = '') { - static::__callStatic('nullOrClassExists', array($value, $message)); + null === $value || static::classExists($value, $message); } /** @@ -2263,7 +3927,30 @@ trait Mixin */ public static function allClassExists($value, $message = '') { - static::__callStatic('allClassExists', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::classExists($entry, $message); + } + } + + /** + * @psalm-assert iterable<class-string|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrClassExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::classExists($entry, $message); + } } /** @@ -2282,7 +3969,7 @@ trait Mixin */ public static function nullOrSubclassOf($value, $class, $message = '') { - static::__callStatic('nullOrSubclassOf', array($value, $class, $message)); + null === $value || static::subclassOf($value, $class, $message); } /** @@ -2301,7 +3988,34 @@ trait Mixin */ public static function allSubclassOf($value, $class, $message = '') { - static::__callStatic('allSubclassOf', array($value, $class, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::subclassOf($entry, $class, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string<ExpectedType> $class + * @psalm-assert iterable<class-string<ExpectedType>|ExpectedType|null> $value + * + * @param mixed $value + * @param string|object $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrSubclassOf($value, $class, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::subclassOf($entry, $class, $message); + } } /** @@ -2316,7 +4030,7 @@ trait Mixin */ public static function nullOrInterfaceExists($value, $message = '') { - static::__callStatic('nullOrInterfaceExists', array($value, $message)); + null === $value || static::interfaceExists($value, $message); } /** @@ -2331,7 +4045,30 @@ trait Mixin */ public static function allInterfaceExists($value, $message = '') { - static::__callStatic('allInterfaceExists', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::interfaceExists($entry, $message); + } + } + + /** + * @psalm-assert iterable<class-string|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrInterfaceExists($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::interfaceExists($entry, $message); + } } /** @@ -2350,7 +4087,7 @@ trait Mixin */ public static function nullOrImplementsInterface($value, $interface, $message = '') { - static::__callStatic('nullOrImplementsInterface', array($value, $interface, $message)); + null === $value || static::implementsInterface($value, $interface, $message); } /** @@ -2369,7 +4106,34 @@ trait Mixin */ public static function allImplementsInterface($value, $interface, $message = '') { - static::__callStatic('allImplementsInterface', array($value, $interface, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::implementsInterface($entry, $interface, $message); + } + } + + /** + * @psalm-pure + * @psalm-template ExpectedType of object + * @psalm-param class-string<ExpectedType> $interface + * @psalm-assert iterable<class-string<ExpectedType>|null> $value + * + * @param mixed $value + * @param mixed $interface + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrImplementsInterface($value, $interface, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::implementsInterface($entry, $interface, $message); + } } /** @@ -2386,7 +4150,7 @@ trait Mixin */ public static function nullOrPropertyExists($classOrObject, $property, $message = '') { - static::__callStatic('nullOrPropertyExists', array($classOrObject, $property, $message)); + null === $classOrObject || static::propertyExists($classOrObject, $property, $message); } /** @@ -2403,7 +4167,32 @@ trait Mixin */ public static function allPropertyExists($classOrObject, $property, $message = '') { - static::__callStatic('allPropertyExists', array($classOrObject, $property, $message)); + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::propertyExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable<class-string|object|null> $classOrObject + * + * @param iterable<string|object|null> $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::propertyExists($entry, $property, $message); + } } /** @@ -2420,7 +4209,7 @@ trait Mixin */ public static function nullOrPropertyNotExists($classOrObject, $property, $message = '') { - static::__callStatic('nullOrPropertyNotExists', array($classOrObject, $property, $message)); + null === $classOrObject || static::propertyNotExists($classOrObject, $property, $message); } /** @@ -2437,7 +4226,32 @@ trait Mixin */ public static function allPropertyNotExists($classOrObject, $property, $message = '') { - static::__callStatic('allPropertyNotExists', array($classOrObject, $property, $message)); + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::propertyNotExists($entry, $property, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable<class-string|object|null> $classOrObject + * + * @param iterable<string|object|null> $classOrObject + * @param mixed $property + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrPropertyNotExists($classOrObject, $property, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::propertyNotExists($entry, $property, $message); + } } /** @@ -2454,7 +4268,7 @@ trait Mixin */ public static function nullOrMethodExists($classOrObject, $method, $message = '') { - static::__callStatic('nullOrMethodExists', array($classOrObject, $method, $message)); + null === $classOrObject || static::methodExists($classOrObject, $method, $message); } /** @@ -2471,7 +4285,32 @@ trait Mixin */ public static function allMethodExists($classOrObject, $method, $message = '') { - static::__callStatic('allMethodExists', array($classOrObject, $method, $message)); + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::methodExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable<class-string|object|null> $classOrObject + * + * @param iterable<string|object|null> $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::methodExists($entry, $method, $message); + } } /** @@ -2488,7 +4327,7 @@ trait Mixin */ public static function nullOrMethodNotExists($classOrObject, $method, $message = '') { - static::__callStatic('nullOrMethodNotExists', array($classOrObject, $method, $message)); + null === $classOrObject || static::methodNotExists($classOrObject, $method, $message); } /** @@ -2505,7 +4344,32 @@ trait Mixin */ public static function allMethodNotExists($classOrObject, $method, $message = '') { - static::__callStatic('allMethodNotExists', array($classOrObject, $method, $message)); + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + static::methodNotExists($entry, $method, $message); + } + } + + /** + * @psalm-pure + * @psalm-param iterable<class-string|object|null> $classOrObject + * + * @param iterable<string|object|null> $classOrObject + * @param mixed $method + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMethodNotExists($classOrObject, $method, $message = '') + { + static::isIterable($classOrObject); + + foreach ($classOrObject as $entry) { + null === $entry || static::methodNotExists($entry, $method, $message); + } } /** @@ -2521,7 +4385,7 @@ trait Mixin */ public static function nullOrKeyExists($array, $key, $message = '') { - static::__callStatic('nullOrKeyExists', array($array, $key, $message)); + null === $array || static::keyExists($array, $key, $message); } /** @@ -2537,7 +4401,31 @@ trait Mixin */ public static function allKeyExists($array, $key, $message = '') { - static::__callStatic('allKeyExists', array($array, $key, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::keyExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<array|null> $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::keyExists($entry, $key, $message); + } } /** @@ -2553,7 +4441,7 @@ trait Mixin */ public static function nullOrKeyNotExists($array, $key, $message = '') { - static::__callStatic('nullOrKeyNotExists', array($array, $key, $message)); + null === $array || static::keyNotExists($array, $key, $message); } /** @@ -2569,7 +4457,31 @@ trait Mixin */ public static function allKeyNotExists($array, $key, $message = '') { - static::__callStatic('allKeyNotExists', array($array, $key, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::keyNotExists($entry, $key, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<array|null> $array + * @param string|int $key + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrKeyNotExists($array, $key, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::keyNotExists($entry, $key, $message); + } } /** @@ -2585,7 +4497,7 @@ trait Mixin */ public static function nullOrValidArrayKey($value, $message = '') { - static::__callStatic('nullOrValidArrayKey', array($value, $message)); + null === $value || static::validArrayKey($value, $message); } /** @@ -2601,7 +4513,31 @@ trait Mixin */ public static function allValidArrayKey($value, $message = '') { - static::__callStatic('allValidArrayKey', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::validArrayKey($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<array-key|null> $value + * + * @param mixed $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrValidArrayKey($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::validArrayKey($entry, $message); + } } /** @@ -2615,7 +4551,7 @@ trait Mixin */ public static function nullOrCount($array, $number, $message = '') { - static::__callStatic('nullOrCount', array($array, $number, $message)); + null === $array || static::count($array, $number, $message); } /** @@ -2629,7 +4565,29 @@ trait Mixin */ public static function allCount($array, $number, $message = '') { - static::__callStatic('allCount', array($array, $number, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::count($entry, $number, $message); + } + } + + /** + * @param iterable<Countable|array|null> $array + * @param int $number + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCount($array, $number, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::count($entry, $number, $message); + } } /** @@ -2643,7 +4601,7 @@ trait Mixin */ public static function nullOrMinCount($array, $min, $message = '') { - static::__callStatic('nullOrMinCount', array($array, $min, $message)); + null === $array || static::minCount($array, $min, $message); } /** @@ -2657,7 +4615,29 @@ trait Mixin */ public static function allMinCount($array, $min, $message = '') { - static::__callStatic('allMinCount', array($array, $min, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::minCount($entry, $min, $message); + } + } + + /** + * @param iterable<Countable|array|null> $array + * @param int|float $min + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMinCount($array, $min, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::minCount($entry, $min, $message); + } } /** @@ -2671,7 +4651,7 @@ trait Mixin */ public static function nullOrMaxCount($array, $max, $message = '') { - static::__callStatic('nullOrMaxCount', array($array, $max, $message)); + null === $array || static::maxCount($array, $max, $message); } /** @@ -2685,7 +4665,29 @@ trait Mixin */ public static function allMaxCount($array, $max, $message = '') { - static::__callStatic('allMaxCount', array($array, $max, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::maxCount($entry, $max, $message); + } + } + + /** + * @param iterable<Countable|array|null> $array + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrMaxCount($array, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::maxCount($entry, $max, $message); + } } /** @@ -2700,7 +4702,7 @@ trait Mixin */ public static function nullOrCountBetween($array, $min, $max, $message = '') { - static::__callStatic('nullOrCountBetween', array($array, $min, $max, $message)); + null === $array || static::countBetween($array, $min, $max, $message); } /** @@ -2715,7 +4717,30 @@ trait Mixin */ public static function allCountBetween($array, $min, $max, $message = '') { - static::__callStatic('allCountBetween', array($array, $min, $max, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::countBetween($entry, $min, $max, $message); + } + } + + /** + * @param iterable<Countable|array|null> $array + * @param int|float $min + * @param int|float $max + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrCountBetween($array, $min, $max, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::countBetween($entry, $min, $max, $message); + } } /** @@ -2731,7 +4756,7 @@ trait Mixin */ public static function nullOrIsList($array, $message = '') { - static::__callStatic('nullOrIsList', array($array, $message)); + null === $array || static::isList($array, $message); } /** @@ -2747,7 +4772,31 @@ trait Mixin */ public static function allIsList($array, $message = '') { - static::__callStatic('allIsList', array($array, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::isList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<list|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isList($entry, $message); + } } /** @@ -2763,7 +4812,7 @@ trait Mixin */ public static function nullOrIsNonEmptyList($array, $message = '') { - static::__callStatic('nullOrIsNonEmptyList', array($array, $message)); + null === $array || static::isNonEmptyList($array, $message); } /** @@ -2779,7 +4828,31 @@ trait Mixin */ public static function allIsNonEmptyList($array, $message = '') { - static::__callStatic('allIsNonEmptyList', array($array, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::isNonEmptyList($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-assert iterable<non-empty-list|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyList($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isNonEmptyList($entry, $message); + } } /** @@ -2797,7 +4870,7 @@ trait Mixin */ public static function nullOrIsMap($array, $message = '') { - static::__callStatic('nullOrIsMap', array($array, $message)); + null === $array || static::isMap($array, $message); } /** @@ -2815,7 +4888,33 @@ trait Mixin */ public static function allIsMap($array, $message = '') { - static::__callStatic('allIsMap', array($array, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::isMap($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable<mixed|array<T>|null> $array + * @psalm-assert iterable<array<string, T>|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isMap($entry, $message); + } } /** @@ -2832,7 +4931,7 @@ trait Mixin */ public static function nullOrIsNonEmptyMap($array, $message = '') { - static::__callStatic('nullOrIsNonEmptyMap', array($array, $message)); + null === $array || static::isNonEmptyMap($array, $message); } /** @@ -2849,7 +4948,34 @@ trait Mixin */ public static function allIsNonEmptyMap($array, $message = '') { - static::__callStatic('allIsNonEmptyMap', array($array, $message)); + static::isIterable($array); + + foreach ($array as $entry) { + static::isNonEmptyMap($entry, $message); + } + } + + /** + * @psalm-pure + * @psalm-template T + * @psalm-param iterable<mixed|array<T>|null> $array + * @psalm-assert iterable<array<string, T>|null> $array + * @psalm-assert iterable<!empty|null> $array + * + * @param mixed $array + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrIsNonEmptyMap($array, $message = '') + { + static::isIterable($array); + + foreach ($array as $entry) { + null === $entry || static::isNonEmptyMap($entry, $message); + } } /** @@ -2864,7 +4990,7 @@ trait Mixin */ public static function nullOrUuid($value, $message = '') { - static::__callStatic('nullOrUuid', array($value, $message)); + null === $value || static::uuid($value, $message); } /** @@ -2879,7 +5005,30 @@ trait Mixin */ public static function allUuid($value, $message = '') { - static::__callStatic('allUuid', array($value, $message)); + static::isIterable($value); + + foreach ($value as $entry) { + static::uuid($entry, $message); + } + } + + /** + * @psalm-pure + * + * @param iterable<string|null> $value + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrUuid($value, $message = '') + { + static::isIterable($value); + + foreach ($value as $entry) { + null === $entry || static::uuid($entry, $message); + } } /** @@ -2895,7 +5044,7 @@ trait Mixin */ public static function nullOrThrows($expression, $class = 'Exception', $message = '') { - static::__callStatic('nullOrThrows', array($expression, $class, $message)); + null === $expression || static::throws($expression, $class, $message); } /** @@ -2911,6 +5060,30 @@ trait Mixin */ public static function allThrows($expression, $class = 'Exception', $message = '') { - static::__callStatic('allThrows', array($expression, $class, $message)); + static::isIterable($expression); + + foreach ($expression as $entry) { + static::throws($entry, $class, $message); + } + } + + /** + * @psalm-param class-string<Throwable> $class + * + * @param iterable<Closure|null> $expression + * @param string $class + * @param string $message + * + * @throws InvalidArgumentException + * + * @return void + */ + public static function allNullOrThrows($expression, $class = 'Exception', $message = '') + { + static::isIterable($expression); + + foreach ($expression as $entry) { + null === $entry || static::throws($entry, $class, $message); + } } }