diff -pruN 7.0.0-1/.github/CODE_OF_CONDUCT.md 7.0.1-1/.github/CODE_OF_CONDUCT.md
--- 7.0.0-1/.github/CODE_OF_CONDUCT.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/.github/CODE_OF_CONDUCT.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,28 @@
+# Contributor Code of Conduct
+
+As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information, such as physical or electronic
+  addresses, without explicit permission
+* Other unethical or unprofessional conduct
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project maintainer at sebastian@phpunit.de. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident.
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [https://contributor-covenant.org/version/1/3/0/][version]
+
+[homepage]: https://contributor-covenant.org
+[version]: https://contributor-covenant.org/version/1/3/0/
diff -pruN 7.0.0-1/.github/CONTRIBUTING.md 7.0.1-1/.github/CONTRIBUTING.md
--- 7.0.0-1/.github/CONTRIBUTING.md	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/.github/CONTRIBUTING.md	2025-08-13 04:44:59.000000000 +0000
@@ -7,7 +7,10 @@ We look forward to your contributions! H
 * [Report a bug](https://github.com/sebastianbergmann/recursion-context/issues/new)
 * [Send a pull request to fix a bug](https://github.com/sebastianbergmann/recursion-context/pulls)
 
-Please do not send pull requests that expand the scope of this project (see below).
+
+## We have a Code of Conduct
+
+Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
 
 
 ## Any contributions you make will be under the BSD-3-Clause License
@@ -15,6 +18,24 @@ Please do not send pull requests that ex
 When you submit code changes, your submissions are understood to be under the same [BSD-3-Clause License](https://github.com/sebastianbergmann/recursion-context/blob/main/LICENSE) that covers the project. By contributing to this project, you agree that your contributions will be licensed under its BSD-3-Clause License.
 
 
+### Do Not Violate Copyright
+
+Only submit a pull request with your own original code. Do NOT submit a pull request containing code which you have largely copied from
+another project, unless you wrote the respective code yourself.
+
+Open Source does not mean that copyright does not apply. Copyright infringements will not be tolerated and can lead to you being banned from this project and repository.
+
+
+### Do Not Submit AI-Generated Pull Requests
+
+The same goes for (largely) AI-generated pull requests. These are not welcome as they will be based on copyrighted code from others
+without accreditation and without taking the license of the original code into account, let alone getting permission
+for the use of the code or for re-licensing.
+
+Aside from that, the experience is that AI-generated pull requests will be incorrect 100% of the time and cost reviewers too much time.
+Submitting a (largely) AI-generated pull request will lead to you being banned from this project and repository.
+
+
 ## Write bug reports with detail, background, and sample code
 
 [This is an example](https://github.com/sebastianbergmann/phpunit/issues/4376) of a bug report I wrote, and I think it's not too bad.
@@ -29,13 +50,17 @@ In your bug report, please provide the f
 * What actually happens
 * Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
 
+Please do not report a bug for a version of this library that is no longer supported. Please do not report a bug if you are using a version of PHP that is not supported by the version of this library you are using.
+
+The library that is developed in this repository was either extracted from [PHPUnit](https://github.com/sebastianbergmann/phpunit) or developed specifically as a dependency for PHPUnit. Support for this library follows the [support for the version of PHPUnit that uses a specific version of this library](https://phpunit.de/supported-versions.html).
+
 Please post code and output as text ([using proper markup](https://guides.github.com/features/mastering-markdown/)). Do not post screenshots of code or output.
 
 
 ## Workflow for Pull Requests
 
 1. Fork the repository.
-2. Create your branch from the oldest branch that is affected by the bug you plan to fix.
+2. Create your branch from `main` if you plan to implement new functionality or change existing code significantly; create your branch from the oldest branch that is affected by the bug if you plan to fix a bug.
 3. Implement your change and add tests for it.
 4. Ensure the test suite passes.
 5. Ensure the code complies with our coding guidelines (see below).
@@ -45,6 +70,12 @@ Please make sure you have [set up your u
 
 We encourage you to [sign your Git commits with your GPG key](https://docs.github.com/en/github/authenticating-to-github/signing-commits).
 
+Pull requests for bug fixes must be made for the oldest branch that is supported (see above). Pull requests for new features must be based on the `main` branch.
+
+We are trying to keep backwards compatibility breaks to an absolute minimum. Please take this into account when proposing changes.
+
+Due to time constraints, we are not always able to respond as quickly as we would like. Please do not take delays personal and feel free to remind us if you feel that we forgot to respond.
+
 
 ## Development
 
diff -pruN 7.0.0-1/.github/FUNDING.yml 7.0.1-1/.github/FUNDING.yml
--- 7.0.0-1/.github/FUNDING.yml	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/.github/FUNDING.yml	2025-08-13 04:44:59.000000000 +0000
@@ -1 +1,4 @@
 github: sebastianbergmann
+liberapay: sebastianbergmann
+thanks_dev: u/gh/sebastianbergmann
+tidelift: "packagist/sebastian/recursion-context"
diff -pruN 7.0.0-1/.github/workflows/ci.yml 7.0.1-1/.github/workflows/ci.yml
--- 7.0.0-1/.github/workflows/ci.yml	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/.github/workflows/ci.yml	2025-08-13 04:44:59.000000000 +0000
@@ -1,13 +1,13 @@
 # https://help.github.com/en/categories/automating-your-workflow-with-github-actions
 
 on:
-  - "pull_request"
-  - "push"
+  - pull_request
+  - push
 
-name: "CI"
+name: CI
 
 env:
-  COMPOSER_ROOT_VERSION: "7.0.x-dev"
+  COMPOSER_ROOT_VERSION: 7.0.x-dev
 
 permissions:
   contents: read
@@ -61,33 +61,37 @@ jobs:
       fail-fast: false
       matrix:
         php-version:
-          - "8.3"
-          - "8.4"
-          - "8.5"
+          - 8.3
+          - 8.4
+          - 8.5
 
     steps:
-      - name: "Checkout"
-        uses: "actions/checkout@v4"
+      - name: Checkout
+        uses: actions/checkout@v4
 
-      - name: "Install PHP with extensions"
-        uses: "shivammathur/setup-php@v2"
+      - name: Install PHP with extensions
+        uses: shivammathur/setup-php@v2
         with:
-          php-version: "${{ matrix.php-version }}"
-          coverage: "xdebug"
+          php-version: ${{ matrix.php-version }}
+          coverage: xdebug
 
-      - name: "Install dependencies with Composer"
-        run: "./tools/composer update --no-ansi --no-interaction --no-progress"
+      - name: Install dependencies with Composer
+        run: ./tools/composer update --no-ansi --no-interaction --no-progress
 
-      - name: "Run tests with PHPUnit"
-        run: "vendor/bin/phpunit --log-junit junit.xml --coverage-clover=coverage.xml"
+      - name: Run tests with PHPUnit
+        run: ./vendor/bin/phpunit --log-junit test-results.xml --coverage-clover=code-coverage.xml
 
       - name: Upload test results to Codecov.io
         if: ${{ !cancelled() }}
         uses: codecov/test-results-action@v1
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
+          disable_search: true
+          files: ./test-results.xml
 
       - name: Upload code coverage data to Codecov.io
         uses: codecov/codecov-action@v4
         with:
           token: ${{ secrets.CODECOV_TOKEN }}
+          disable_search: true
+          files: ./code-coverage.xml
diff -pruN 7.0.0-1/.phive/phars.xml 7.0.1-1/.phive/phars.xml
--- 7.0.0-1/.phive/phars.xml	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/.phive/phars.xml	2025-08-13 04:44:59.000000000 +0000
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phive xmlns="https://phar.io/phive">
-  <phar name="php-cs-fixer" version="^3.64" installed="3.68.0" location="./tools/php-cs-fixer" copy="true"/>
-  <phar name="composer" version="^2.8" installed="2.8.4" location="./tools/composer" copy="true"/>
-  <phar name="phpstan" version="^2.0" installed="2.1.1" location="./tools/phpstan" copy="true"/>
+  <phar name="php-cs-fixer" version="^3.64" installed="3.72.0" location="./tools/php-cs-fixer" copy="true"/>
+  <phar name="composer" version="^2.8" installed="2.8.6" location="./tools/composer" copy="true"/>
 </phive>
diff -pruN 7.0.0-1/ChangeLog.md 7.0.1-1/ChangeLog.md
--- 7.0.0-1/ChangeLog.md	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/ChangeLog.md	2025-08-13 04:44:59.000000000 +0000
@@ -2,12 +2,24 @@
 
 All notable changes are documented in this file using the [Keep a CHANGELOG](https://keepachangelog.com/) principles.
 
+## [7.0.1] - 2025-08-13
+
+### Changed
+
+* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5
+
 ## [7.0.0] - 2025-02-07
 
 ### Removed
 
 * This component is no longer supported on PHP 8.2
 
+## [6.0.3] - 2025-08-13
+
+### Changed
+
+* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5
+
 ## [6.0.2] - 2024-07-03
 
 ### Changed
@@ -26,6 +38,12 @@ All notable changes are documented in th
 
 * This component is no longer supported on PHP 8.1
 
+## [5.0.1] - 2025-08-10
+
+### Changed
+
+* Do not use `SplObjectStorage` methods that will be deprecated in PHP 8.5
+
 ## [5.0.0] - 2023-02-03
 
 ### Removed
@@ -63,10 +81,13 @@ All notable changes are documented in th
 
 * Tests etc. are now ignored for archive exports
 
+[7.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/7.0.0...7.0.1
 [7.0.0]: https://github.com/sebastianbergmann/recursion-context/compare/6.0...7.0.0
+[6.0.3]: https://github.com/sebastianbergmann/recursion-context/compare/6.0.2...6.0.3
 [6.0.2]: https://github.com/sebastianbergmann/recursion-context/compare/6.0.1...6.0.2
 [6.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/6.0.0...6.0.1
 [6.0.0]: https://github.com/sebastianbergmann/recursion-context/compare/5.0...6.0.0
+[5.0.1]: https://github.com/sebastianbergmann/recursion-context/compare/5.0.0...5.0.1
 [5.0.0]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.5...5.0.0
 [4.0.5]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.4...4.0.5
 [4.0.4]: https://github.com/sebastianbergmann/recursion-context/compare/4.0.3...4.0.4
diff -pruN 7.0.0-1/build.xml 7.0.1-1/build.xml
--- 7.0.0-1/build.xml	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/build.xml	2025-08-13 04:44:59.000000000 +0000
@@ -17,10 +17,27 @@
     </target>
 
     <target name="update-tools">
-        <exec executable="phive" taskname="phive">
+        <exec executable="${basedir}/tools/phive">
+            <arg value="--no-progress"/>
+            <arg value="self-update"/>
+        </exec>
+
+        <exec executable="${basedir}/tools/phive">
             <arg value="--no-progress"/>
             <arg value="update"/>
-            <arg value="--force-accept-unsigned"/>
+        </exec>
+
+        <exec executable="${basedir}/tools/composer" dir="${basedir}/tools/.phpstan" taskname="composer">
+            <arg value="update"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-progress"/>
+            <arg value="--no-ansi"/>
+        </exec>
+
+        <exec executable="${basedir}/tools/composer" dir="${basedir}/tools/.phpstan" taskname="composer">
+            <arg value="bump"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-ansi"/>
         </exec>
     </target>
 </project>
diff -pruN 7.0.0-1/debian/changelog 7.0.1-1/debian/changelog
--- 7.0.0-1/debian/changelog	2025-02-08 21:49:12.000000000 +0000
+++ 7.0.1-1/debian/changelog	2025-08-17 08:08:15.000000000 +0000
@@ -1,3 +1,14 @@
+phpunit-recursion-context (7.0.1-1) experimental; urgency=medium
+
+  [ Sebastian Bergmann ]
+  * Do not use SplObjectStorage methods that will be deprecated in PHP 8.5
+  * Prepare release
+
+  [ David Prévot ]
+  * Update Standards-Version to 4.7.2
+
+ -- David Prévot <taffit@debian.org>  Sun, 17 Aug 2025 10:08:15 +0200
+
 phpunit-recursion-context (7.0.0-1) experimental; urgency=medium
 
   * Upload new major to experimental
diff -pruN 7.0.0-1/debian/control 7.0.1-1/debian/control
--- 7.0.0-1/debian/control	2024-07-18 05:05:43.000000000 +0000
+++ 7.0.1-1/debian/control	2025-08-12 12:07:32.000000000 +0000
@@ -4,12 +4,12 @@ Priority: optional
 Maintainer: Debian PHP PEAR Maintainers <pkg-php-pear@lists.alioth.debian.org>
 Uploaders: David Prévot <taffit@debian.org>,
            Prach Pongpanich <prachpub@gmail.com>
-Build-Depends: ant,
-               debhelper-compat (= 13),
+Build-Depends: debhelper-compat (= 13),
                dh-sequence-phpcomposer,
+               ant,
                phpab,
-               phpunit (>= 10) <!nocheck>
-Standards-Version: 4.7.0
+               phpunit <!nocheck>
+Standards-Version: 4.7.2
 Homepage: https://github.com/sebastianbergmann/recursion-context
 Vcs-Git: https://salsa.debian.org/php-team/pear/phpunit-recursion-context.git
 Vcs-Browser: https://salsa.debian.org/php-team/pear/phpunit-recursion-context
diff -pruN 7.0.0-1/phpstan.neon 7.0.1-1/phpstan.neon
--- 7.0.0-1/phpstan.neon	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/phpstan.neon	2025-08-13 04:44:59.000000000 +0000
@@ -3,3 +3,46 @@ parameters:
     paths:
         - src
         - tests
+
+    checkTooWideReturnTypesInProtectedAndPublicMethods: true
+    reportAlwaysTrueInLastCondition: true
+    reportPossiblyNonexistentConstantArrayOffset: true
+    reportPossiblyNonexistentGeneralArrayOffset: true
+    treatPhpDocTypesAsCertain: false
+
+    strictRules:
+        allRules: false
+        booleansInConditions: true
+        closureUsesThis: true
+        disallowedBacktick: true
+        disallowedEmpty: true
+        disallowedImplicitArrayCreation: true
+        disallowedLooseComparison: true
+        disallowedShortTernary: true
+        illegalConstructorMethodCall: true
+        matchingInheritedMethodNames: true
+        noVariableVariables: true
+        numericOperandsInArithmeticOperators: true
+        overwriteVariablesWithLoop: true
+        requireParentConstructorCall: true
+        strictArrayFilter: true
+        strictFunctionCalls: true
+        switchConditionsMatchingType: true
+        uselessCast: true
+
+    ergebnis:
+        allRules: false
+        final:
+            enabled: true
+        privateInFinalClass:
+            enabled: true
+
+    type_coverage:
+        declare: 100
+        return: 100
+        param: 100
+        property: 100
+        constant: 100
+
+includes:
+	- phar://phpstan.phar/conf/bleedingEdge.neon
diff -pruN 7.0.0-1/src/Context.php 7.0.1-1/src/Context.php
--- 7.0.0-1/src/Context.php	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/src/Context.php	2025-08-13 04:44:59.000000000 +0000
@@ -44,7 +44,6 @@ final class Context
     public function __destruct()
     {
         foreach ($this->arrays as &$array) {
-            /* @phpstan-ignore function.alreadyNarrowedType */
             if (is_array($array)) {
                 array_pop($array);
                 array_pop($array);
@@ -129,8 +128,8 @@ final class Context
 
     private function addObject(object $object): int
     {
-        if (!$this->objects->contains($object)) {
-            $this->objects->attach($object);
+        if (!$this->objects->offsetExists($object)) {
+            $this->objects->offsetSet($object);
         }
 
         return spl_object_id($object);
@@ -145,6 +144,7 @@ final class Context
 
         if (isset($end[1]) &&
             $end[1] === $this->objects &&
+            isset($end[0]) &&
             is_int($end[0])) {
             return $end[0];
         }
@@ -154,7 +154,7 @@ final class Context
 
     private function containsObject(object $value): false|int
     {
-        if ($this->objects->contains($value)) {
+        if ($this->objects->offsetExists($value)) {
             return spl_object_id($value);
         }
 
diff -pruN 7.0.0-1/tests/ContextTest.php 7.0.1-1/tests/ContextTest.php
--- 7.0.0-1/tests/ContextTest.php	2025-02-07 05:00:01.000000000 +0000
+++ 7.0.1-1/tests/ContextTest.php	2025-08-13 04:44:59.000000000 +0000
@@ -107,7 +107,7 @@ final class ContextTest extends TestCase
      * @param array<mixed>|object $value
      */
     #[DataProvider('valuesProvider')]
-    public function testContainsNotFound(array|object $value): void
+    public function testContainsNotFound(array|object $value, int $key): void
     {
         $context = new Context;
 
diff -pruN 7.0.0-1/tools/.phpstan/composer.json 7.0.1-1/tools/.phpstan/composer.json
--- 7.0.0-1/tools/.phpstan/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,14 @@
+{
+    "require-dev": {
+        "phpstan/phpstan": "^2.1.8",
+        "phpstan/extension-installer": "^1.4.3",
+        "phpstan/phpstan-strict-rules": "^2.0.3",
+        "tomasvotruba/type-coverage": "^2.0.2",
+        "ergebnis/phpstan-rules": "^2.8.0"
+    },
+    "config": {
+        "allow-plugins": {
+            "phpstan/extension-installer": true
+        }
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/composer.lock 7.0.1-1/tools/.phpstan/composer.lock
--- 7.0.0-1/tools/.phpstan/composer.lock	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/composer.lock	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,388 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "7c032feec49c9dbbdaa0d52198cabb4c",
+    "packages": [],
+    "packages-dev": [
+        {
+            "name": "ergebnis/phpstan-rules",
+            "version": "2.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ergebnis/phpstan-rules.git",
+                "reference": "30e790621fbad05573ef9cd355279fff5122e080"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/30e790621fbad05573ef9cd355279fff5122e080",
+                "reference": "30e790621fbad05573ef9cd355279fff5122e080",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0",
+                "phpstan/phpstan": "^2.0.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.20.0 || ^3.3.0",
+                "ergebnis/composer-normalize": "^2.45.0",
+                "ergebnis/license": "^2.6.0",
+                "ergebnis/php-cs-fixer-config": "^6.43.0",
+                "ergebnis/phpunit-slow-test-detector": "^2.18.0",
+                "nette/di": "^3.1.10",
+                "phpstan/extension-installer": "^1.4.3",
+                "phpstan/phpstan-deprecation-rules": "^2.0.1",
+                "phpstan/phpstan-phpunit": "^2.0.4",
+                "phpstan/phpstan-strict-rules": "^2.0.3",
+                "phpunit/phpunit": "^9.6.21",
+                "psr/container": "^2.0.2",
+                "symfony/finder": "^5.4.45",
+                "symfony/process": "^5.4.47"
+            },
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "rules.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Ergebnis\\PHPStan\\Rules\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Andreas Möller",
+                    "email": "am@localheinz.com",
+                    "homepage": "https://localheinz.com"
+                }
+            ],
+            "description": "Provides rules for phpstan/phpstan.",
+            "homepage": "https://github.com/ergebnis/phpstan-rules",
+            "keywords": [
+                "PHPStan",
+                "phpstan-rules"
+            ],
+            "support": {
+                "issues": "https://github.com/ergebnis/phpstan-rules/issues",
+                "security": "https://github.com/ergebnis/phpstan-rules/blob/main/.github/SECURITY.md",
+                "source": "https://github.com/ergebnis/phpstan-rules"
+            },
+            "time": "2025-02-18T11:20:05+00:00"
+        },
+        {
+            "name": "nette/utils",
+            "version": "v4.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/utils.git",
+                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+                "shasum": ""
+            },
+            "require": {
+                "php": "8.0 - 8.4"
+            },
+            "conflict": {
+                "nette/finder": "<3",
+                "nette/schema": "<1.2.2"
+            },
+            "require-dev": {
+                "jetbrains/phpstorm-attributes": "dev-master",
+                "nette/tester": "^2.5",
+                "phpstan/phpstan": "^1.0",
+                "tracy/tracy": "^2.9"
+            },
+            "suggest": {
+                "ext-gd": "to use Image",
+                "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+                "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+                "ext-json": "to use Nette\\Utils\\Json",
+                "ext-mbstring": "to use Strings::lower() etc...",
+                "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause",
+                "GPL-2.0-only",
+                "GPL-3.0-only"
+            ],
+            "authors": [
+                {
+                    "name": "David Grudl",
+                    "homepage": "https://davidgrudl.com"
+                },
+                {
+                    "name": "Nette Community",
+                    "homepage": "https://nette.org/contributors"
+                }
+            ],
+            "description": "🛠  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+            "homepage": "https://nette.org",
+            "keywords": [
+                "array",
+                "core",
+                "datetime",
+                "images",
+                "json",
+                "nette",
+                "paginator",
+                "password",
+                "slugify",
+                "string",
+                "unicode",
+                "utf-8",
+                "utility",
+                "validation"
+            ],
+            "support": {
+                "issues": "https://github.com/nette/utils/issues",
+                "source": "https://github.com/nette/utils/tree/v4.0.5"
+            },
+            "time": "2024-08-07T15:39:19+00:00"
+        },
+        {
+            "name": "phpstan/extension-installer",
+            "version": "1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/extension-installer.git",
+                "reference": "85e90b3942d06b2326fba0403ec24fe912372936"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936",
+                "reference": "85e90b3942d06b2326fba0403ec24fe912372936",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^2.0",
+                "php": "^7.2 || ^8.0",
+                "phpstan/phpstan": "^1.9.0 || ^2.0"
+            },
+            "require-dev": {
+                "composer/composer": "^2.0",
+                "php-parallel-lint/php-parallel-lint": "^1.2.0",
+                "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PHPStan\\ExtensionInstaller\\Plugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\ExtensionInstaller\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Composer plugin for automatic installation of PHPStan extensions",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/phpstan/extension-installer/issues",
+                "source": "https://github.com/phpstan/extension-installer/tree/1.4.3"
+            },
+            "time": "2024-09-04T20:21:43+00:00"
+        },
+        {
+            "name": "phpstan/phpstan",
+            "version": "2.1.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f9adff3b87c03b12cc7e46a30a524648e497758f",
+                "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4|^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan-shim": "*"
+            },
+            "bin": [
+                "phpstan",
+                "phpstan.phar"
+            ],
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPStan - PHP Static Analysis Tool",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
+            "support": {
+                "docs": "https://phpstan.org/user-guide/getting-started",
+                "forum": "https://github.com/phpstan/phpstan/discussions",
+                "issues": "https://github.com/phpstan/phpstan/issues",
+                "security": "https://github.com/phpstan/phpstan/security/policy",
+                "source": "https://github.com/phpstan/phpstan-src"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ondrejmirtes",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/phpstan",
+                    "type": "github"
+                }
+            ],
+            "time": "2025-03-09T09:30:48+00:00"
+        },
+        {
+            "name": "phpstan/phpstan-strict-rules",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan-strict-rules.git",
+                "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/8b88b5f818bfa301e0c99154ab622dace071c3ba",
+                "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0",
+                "phpstan/phpstan": "^2.0.4"
+            },
+            "require-dev": {
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/phpstan-deprecation-rules": "^2.0",
+                "phpstan/phpstan-phpunit": "^2.0",
+                "phpunit/phpunit": "^9.6"
+            },
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "rules.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Extra strict and opinionated rules for PHPStan",
+            "support": {
+                "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
+                "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.3"
+            },
+            "time": "2025-01-21T10:52:14+00:00"
+        },
+        {
+            "name": "tomasvotruba/type-coverage",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/TomasVotruba/type-coverage.git",
+                "reference": "d033429580f2c18bda538fa44f2939236a990e0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/d033429580f2c18bda538fa44f2939236a990e0c",
+                "reference": "d033429580f2c18bda538fa44f2939236a990e0c",
+                "shasum": ""
+            },
+            "require": {
+                "nette/utils": "^3.2 || ^4.0",
+                "php": "^7.4 || ^8.0",
+                "phpstan/phpstan": "^2.0"
+            },
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "config/extension.neon"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "TomasVotruba\\TypeCoverage\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Measure type coverage of your project",
+            "keywords": [
+                "phpstan-extension",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/TomasVotruba/type-coverage/issues",
+                "source": "https://github.com/TomasVotruba/type-coverage/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/rectorphp",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/tomasvotruba",
+                    "type": "github"
+                }
+            ],
+            "time": "2025-01-07T00:10:26+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {},
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {},
+    "platform-dev": {},
+    "plugin-api-version": "2.6.0"
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/autoload.php 7.0.1-1/tools/.phpstan/vendor/autoload.php
--- 7.0.0-1/tools/.phpstan/vendor/autoload.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/autoload.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,25 @@
+<?php
+
+// autoload.php @generated by Composer
+
+if (PHP_VERSION_ID < 50600) {
+    if (!headers_sent()) {
+        header('HTTP/1.1 500 Internal Server Error');
+    }
+    $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
+    if (!ini_get('display_errors')) {
+        if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
+            fwrite(STDERR, $err);
+        } elseif (!headers_sent()) {
+            echo $err;
+        }
+    }
+    trigger_error(
+        $err,
+        E_USER_ERROR
+    );
+}
+
+require_once __DIR__ . '/composer/autoload_real.php';
+
+return ComposerAutoloaderInitf9e7218f71d5874b5632927df4f72bd7::getLoader();
diff -pruN 7.0.0-1/tools/.phpstan/vendor/bin/phpstan 7.0.1-1/tools/.phpstan/vendor/bin/phpstan
--- 7.0.0-1/tools/.phpstan/vendor/bin/phpstan	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/bin/phpstan	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,119 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Proxy PHP file generated by Composer
+ *
+ * This file includes the referenced bin path (../phpstan/phpstan/phpstan)
+ * using a stream wrapper to prevent the shebang from being output on PHP<8
+ *
+ * @generated
+ */
+
+namespace Composer;
+
+$GLOBALS['_composer_bin_dir'] = __DIR__;
+$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
+
+if (PHP_VERSION_ID < 80000) {
+    if (!class_exists('Composer\BinProxyWrapper')) {
+        /**
+         * @internal
+         */
+        final class BinProxyWrapper
+        {
+            private $handle;
+            private $position;
+            private $realpath;
+
+            public function stream_open($path, $mode, $options, &$opened_path)
+            {
+                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
+                $opened_path = substr($path, 17);
+                $this->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_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+    ) {
+        return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan');
+    }
+}
+
+return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan';
diff -pruN 7.0.0-1/tools/.phpstan/vendor/bin/phpstan.phar 7.0.1-1/tools/.phpstan/vendor/bin/phpstan.phar
--- 7.0.0-1/tools/.phpstan/vendor/bin/phpstan.phar	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/bin/phpstan.phar	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,119 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * Proxy PHP file generated by Composer
+ *
+ * This file includes the referenced bin path (../phpstan/phpstan/phpstan.phar)
+ * using a stream wrapper to prevent the shebang from being output on PHP<8
+ *
+ * @generated
+ */
+
+namespace Composer;
+
+$GLOBALS['_composer_bin_dir'] = __DIR__;
+$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
+
+if (PHP_VERSION_ID < 80000) {
+    if (!class_exists('Composer\BinProxyWrapper')) {
+        /**
+         * @internal
+         */
+        final class BinProxyWrapper
+        {
+            private $handle;
+            private $position;
+            private $realpath;
+
+            public function stream_open($path, $mode, $options, &$opened_path)
+            {
+                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
+                $opened_path = substr($path, 17);
+                $this->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_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true))
+        || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper'))
+    ) {
+        return include("phpvfscomposer://" . __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar');
+    }
+}
+
+return include __DIR__ . '/..'.'/phpstan/phpstan/phpstan.phar';
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/ClassLoader.php 7.0.1-1/tools/.phpstan/vendor/composer/ClassLoader.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/ClassLoader.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/ClassLoader.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,579 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ * @see    https://www.php-fig.org/psr/psr-0/
+ * @see    https://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+    /** @var \Closure(string):void */
+    private static $includeFile;
+
+    /** @var string|null */
+    private $vendorDir;
+
+    // PSR-4
+    /**
+     * @var array<string, array<string, int>>
+     */
+    private $prefixLengthsPsr4 = array();
+    /**
+     * @var array<string, list<string>>
+     */
+    private $prefixDirsPsr4 = array();
+    /**
+     * @var list<string>
+     */
+    private $fallbackDirsPsr4 = array();
+
+    // PSR-0
+    /**
+     * List of PSR-0 prefixes
+     *
+     * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
+     *
+     * @var array<string, array<string, list<string>>>
+     */
+    private $prefixesPsr0 = array();
+    /**
+     * @var list<string>
+     */
+    private $fallbackDirsPsr0 = array();
+
+    /** @var bool */
+    private $useIncludePath = false;
+
+    /**
+     * @var array<string, string>
+     */
+    private $classMap = array();
+
+    /** @var bool */
+    private $classMapAuthoritative = false;
+
+    /**
+     * @var array<string, bool>
+     */
+    private $missingClasses = array();
+
+    /** @var string|null */
+    private $apcuPrefix;
+
+    /**
+     * @var array<string, self>
+     */
+    private static $registeredLoaders = array();
+
+    /**
+     * @param string|null $vendorDir
+     */
+    public function __construct($vendorDir = null)
+    {
+        $this->vendorDir = $vendorDir;
+        self::initializeIncludeClosure();
+    }
+
+    /**
+     * @return array<string, list<string>>
+     */
+    public function getPrefixes()
+    {
+        if (!empty($this->prefixesPsr0)) {
+            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
+        }
+
+        return array();
+    }
+
+    /**
+     * @return array<string, list<string>>
+     */
+    public function getPrefixesPsr4()
+    {
+        return $this->prefixDirsPsr4;
+    }
+
+    /**
+     * @return list<string>
+     */
+    public function getFallbackDirs()
+    {
+        return $this->fallbackDirsPsr0;
+    }
+
+    /**
+     * @return list<string>
+     */
+    public function getFallbackDirsPsr4()
+    {
+        return $this->fallbackDirsPsr4;
+    }
+
+    /**
+     * @return array<string, string> Array of classname => path
+     */
+    public function getClassMap()
+    {
+        return $this->classMap;
+    }
+
+    /**
+     * @param array<string, string> $classMap Class to filename map
+     *
+     * @return void
+     */
+    public function addClassMap(array $classMap)
+    {
+        if ($this->classMap) {
+            $this->classMap = array_merge($this->classMap, $classMap);
+        } else {
+            $this->classMap = $classMap;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix, either
+     * appending or prepending to the ones previously set for this prefix.
+     *
+     * @param string              $prefix  The prefix
+     * @param list<string>|string $paths   The PSR-0 root directories
+     * @param bool                $prepend Whether to prepend the directories
+     *
+     * @return void
+     */
+    public function add($prefix, $paths, $prepend = false)
+    {
+        $paths = (array) $paths;
+        if (!$prefix) {
+            if ($prepend) {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $paths,
+                    $this->fallbackDirsPsr0
+                );
+            } else {
+                $this->fallbackDirsPsr0 = array_merge(
+                    $this->fallbackDirsPsr0,
+                    $paths
+                );
+            }
+
+            return;
+        }
+
+        $first = $prefix[0];
+        if (!isset($this->prefixesPsr0[$first][$prefix])) {
+            $this->prefixesPsr0[$first][$prefix] = $paths;
+
+            return;
+        }
+        if ($prepend) {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $paths,
+                $this->prefixesPsr0[$first][$prefix]
+            );
+        } else {
+            $this->prefixesPsr0[$first][$prefix] = array_merge(
+                $this->prefixesPsr0[$first][$prefix],
+                $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace, either
+     * appending or prepending to the ones previously set for this namespace.
+     *
+     * @param string              $prefix  The prefix/namespace, with trailing '\\'
+     * @param list<string>|string $paths   The PSR-4 base directories
+     * @param bool                $prepend Whether to prepend the directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function addPsr4($prefix, $paths, $prepend = false)
+    {
+        $paths = (array) $paths;
+        if (!$prefix) {
+            // Register directories for the root namespace.
+            if ($prepend) {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $paths,
+                    $this->fallbackDirsPsr4
+                );
+            } else {
+                $this->fallbackDirsPsr4 = array_merge(
+                    $this->fallbackDirsPsr4,
+                    $paths
+                );
+            }
+        } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+            // Register directories for a new namespace.
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = $paths;
+        } elseif ($prepend) {
+            // Prepend directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $paths,
+                $this->prefixDirsPsr4[$prefix]
+            );
+        } else {
+            // Append directories for an already registered namespace.
+            $this->prefixDirsPsr4[$prefix] = array_merge(
+                $this->prefixDirsPsr4[$prefix],
+                $paths
+            );
+        }
+    }
+
+    /**
+     * Registers a set of PSR-0 directories for a given prefix,
+     * replacing any others previously set for this prefix.
+     *
+     * @param string              $prefix The prefix
+     * @param list<string>|string $paths  The PSR-0 base directories
+     *
+     * @return void
+     */
+    public function set($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr0 = (array) $paths;
+        } else {
+            $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Registers a set of PSR-4 directories for a given namespace,
+     * replacing any others previously set for this namespace.
+     *
+     * @param string              $prefix The prefix/namespace, with trailing '\\'
+     * @param list<string>|string $paths  The PSR-4 base directories
+     *
+     * @throws \InvalidArgumentException
+     *
+     * @return void
+     */
+    public function setPsr4($prefix, $paths)
+    {
+        if (!$prefix) {
+            $this->fallbackDirsPsr4 = (array) $paths;
+        } else {
+            $length = strlen($prefix);
+            if ('\\' !== $prefix[$length - 1]) {
+                throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+            }
+            $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+            $this->prefixDirsPsr4[$prefix] = (array) $paths;
+        }
+    }
+
+    /**
+     * Turns on searching the include path for class files.
+     *
+     * @param bool $useIncludePath
+     *
+     * @return void
+     */
+    public function setUseIncludePath($useIncludePath)
+    {
+        $this->useIncludePath = $useIncludePath;
+    }
+
+    /**
+     * Can be used to check if the autoloader uses the include path to check
+     * for classes.
+     *
+     * @return bool
+     */
+    public function getUseIncludePath()
+    {
+        return $this->useIncludePath;
+    }
+
+    /**
+     * Turns off searching the prefix and fallback directories for classes
+     * that have not been registered with the class map.
+     *
+     * @param bool $classMapAuthoritative
+     *
+     * @return void
+     */
+    public function setClassMapAuthoritative($classMapAuthoritative)
+    {
+        $this->classMapAuthoritative = $classMapAuthoritative;
+    }
+
+    /**
+     * Should class lookup fail if not found in the current class map?
+     *
+     * @return bool
+     */
+    public function isClassMapAuthoritative()
+    {
+        return $this->classMapAuthoritative;
+    }
+
+    /**
+     * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+     *
+     * @param string|null $apcuPrefix
+     *
+     * @return void
+     */
+    public function setApcuPrefix($apcuPrefix)
+    {
+        $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
+    }
+
+    /**
+     * The APCu prefix in use, or null if APCu caching is not enabled.
+     *
+     * @return string|null
+     */
+    public function getApcuPrefix()
+    {
+        return $this->apcuPrefix;
+    }
+
+    /**
+     * Registers this instance as an autoloader.
+     *
+     * @param bool $prepend Whether to prepend the autoloader or not
+     *
+     * @return void
+     */
+    public function register($prepend = false)
+    {
+        spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+
+        if (null === $this->vendorDir) {
+            return;
+        }
+
+        if ($prepend) {
+            self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
+        } else {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+            self::$registeredLoaders[$this->vendorDir] = $this;
+        }
+    }
+
+    /**
+     * Unregisters this instance as an autoloader.
+     *
+     * @return void
+     */
+    public function unregister()
+    {
+        spl_autoload_unregister(array($this, 'loadClass'));
+
+        if (null !== $this->vendorDir) {
+            unset(self::$registeredLoaders[$this->vendorDir]);
+        }
+    }
+
+    /**
+     * Loads the given class or interface.
+     *
+     * @param  string    $class The name of the class
+     * @return true|null True if loaded, null otherwise
+     */
+    public function loadClass($class)
+    {
+        if ($file = $this->findFile($class)) {
+            $includeFile = self::$includeFile;
+            $includeFile($file);
+
+            return true;
+        }
+
+        return null;
+    }
+
+    /**
+     * Finds the path to the file where the class is defined.
+     *
+     * @param string $class The name of the class
+     *
+     * @return string|false The path if found, false otherwise
+     */
+    public function findFile($class)
+    {
+        // class map lookup
+        if (isset($this->classMap[$class])) {
+            return $this->classMap[$class];
+        }
+        if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
+            return false;
+        }
+        if (null !== $this->apcuPrefix) {
+            $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+            if ($hit) {
+                return $file;
+            }
+        }
+
+        $file = $this->findFileWithExtension($class, '.php');
+
+        // Search for Hack files if we are running on HHVM
+        if (false === $file && defined('HHVM_VERSION')) {
+            $file = $this->findFileWithExtension($class, '.hh');
+        }
+
+        if (null !== $this->apcuPrefix) {
+            apcu_add($this->apcuPrefix.$class, $file);
+        }
+
+        if (false === $file) {
+            // Remember that this class does not exist.
+            $this->missingClasses[$class] = true;
+        }
+
+        return $file;
+    }
+
+    /**
+     * Returns the currently registered loaders keyed by their corresponding vendor directories.
+     *
+     * @return array<string, self>
+     */
+    public static function getRegisteredLoaders()
+    {
+        return self::$registeredLoaders;
+    }
+
+    /**
+     * @param  string       $class
+     * @param  string       $ext
+     * @return string|false
+     */
+    private function findFileWithExtension($class, $ext)
+    {
+        // PSR-4 lookup
+        $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+        $first = $class[0];
+        if (isset($this->prefixLengthsPsr4[$first])) {
+            $subPath = $class;
+            while (false !== $lastPos = strrpos($subPath, '\\')) {
+                $subPath = substr($subPath, 0, $lastPos);
+                $search = $subPath . '\\';
+                if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
+                    foreach ($this->prefixDirsPsr4[$search] as $dir) {
+                        if (file_exists($file = $dir . $pathEnd)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 lookup
+        if (false !== $pos = strrpos($class, '\\')) {
+            // namespaced class name
+            $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+                . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+        } else {
+            // PEAR-like class name
+            $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+        }
+
+        if (isset($this->prefixesPsr0[$first])) {
+            foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+                if (0 === strpos($class, $prefix)) {
+                    foreach ($dirs as $dir) {
+                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                return $file;
+            }
+        }
+
+        // PSR-0 include paths.
+        if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+            return $file;
+        }
+
+        return false;
+    }
+
+    /**
+     * @return void
+     */
+    private static function initializeIncludeClosure()
+    {
+        if (self::$includeFile !== null) {
+            return;
+        }
+
+        /**
+         * Scope isolated include.
+         *
+         * Prevents access to $this/self from included files.
+         *
+         * @param  string $file
+         * @return void
+         */
+        self::$includeFile = \Closure::bind(static function($file) {
+            include $file;
+        }, null, null);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/InstalledVersions.php 7.0.1-1/tools/.phpstan/vendor/composer/InstalledVersions.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/InstalledVersions.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/InstalledVersions.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,378 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer;
+
+use Composer\Autoload\ClassLoader;
+use Composer\Semver\VersionParser;
+
+/**
+ * This class is copied in every Composer installed project and available to all
+ *
+ * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
+ *
+ * To require its presence, you can require `composer-runtime-api ^2.0`
+ *
+ * @final
+ */
+class InstalledVersions
+{
+    /**
+     * @var mixed[]|null
+     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
+     */
+    private static $installed;
+
+    /**
+     * @var bool
+     */
+    private static $installedIsLocalDir;
+
+    /**
+     * @var bool|null
+     */
+    private static $canGetVendors;
+
+    /**
+     * @var array[]
+     * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+     */
+    private static $installedByVendor = array();
+
+    /**
+     * Returns a list of all package names which are present, either by being installed, replaced or provided
+     *
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackages()
+    {
+        $packages = array();
+        foreach (self::getInstalled() as $installed) {
+            $packages[] = array_keys($installed['versions']);
+        }
+
+        if (1 === \count($packages)) {
+            return $packages[0];
+        }
+
+        return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
+    }
+
+    /**
+     * Returns a list of all package names with a specific type e.g. 'library'
+     *
+     * @param  string   $type
+     * @return string[]
+     * @psalm-return list<string>
+     */
+    public static function getInstalledPackagesByType($type)
+    {
+        $packagesByType = array();
+
+        foreach (self::getInstalled() as $installed) {
+            foreach ($installed['versions'] as $name => $package) {
+                if (isset($package['type']) && $package['type'] === $type) {
+                    $packagesByType[] = $name;
+                }
+            }
+        }
+
+        return $packagesByType;
+    }
+
+    /**
+     * Checks whether the given package is installed
+     *
+     * This also returns true if the package name is provided or replaced by another package
+     *
+     * @param  string $packageName
+     * @param  bool   $includeDevRequirements
+     * @return bool
+     */
+    public static function isInstalled($packageName, $includeDevRequirements = true)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (isset($installed['versions'][$packageName])) {
+                return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks whether the given package satisfies a version constraint
+     *
+     * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
+     *
+     *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
+     *
+     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param  string        $packageName
+     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @return bool
+     */
+    public static function satisfies(VersionParser $parser, $packageName, $constraint)
+    {
+        $constraint = $parser->parseConstraints((string) $constraint);
+        $provided = $parser->parseConstraints(self::getVersionRanges($packageName));
+
+        return $provided->matches($constraint);
+    }
+
+    /**
+     * Returns a version constraint representing all the range(s) which are installed for a given package
+     *
+     * It is easier to use this via isInstalled() with the $constraint argument if you need to check
+     * whether a given version of a package is installed, and not just whether it exists
+     *
+     * @param  string $packageName
+     * @return string Version constraint usable with composer/semver
+     */
+    public static function getVersionRanges($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            $ranges = array();
+            if (isset($installed['versions'][$packageName]['pretty_version'])) {
+                $ranges[] = $installed['versions'][$packageName]['pretty_version'];
+            }
+            if (array_key_exists('aliases', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
+            }
+            if (array_key_exists('replaced', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
+            }
+            if (array_key_exists('provided', $installed['versions'][$packageName])) {
+                $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
+            }
+
+            return implode(' || ', $ranges);
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
+     */
+    public static function getPrettyVersion($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['pretty_version'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['pretty_version'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
+     */
+    public static function getReference($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            if (!isset($installed['versions'][$packageName]['reference'])) {
+                return null;
+            }
+
+            return $installed['versions'][$packageName]['reference'];
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @param  string      $packageName
+     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
+     */
+    public static function getInstallPath($packageName)
+    {
+        foreach (self::getInstalled() as $installed) {
+            if (!isset($installed['versions'][$packageName])) {
+                continue;
+            }
+
+            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
+        }
+
+        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
+    }
+
+    /**
+     * @return array
+     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
+     */
+    public static function getRootPackage()
+    {
+        $installed = self::getInstalled();
+
+        return $installed[0]['root'];
+    }
+
+    /**
+     * Returns the raw installed.php data for custom implementations
+     *
+     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
+     * @return array[]
+     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
+     */
+    public static function getRawData()
+    {
+        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                self::$installed = include __DIR__ . '/installed.php';
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        return self::$installed;
+    }
+
+    /**
+     * Returns the raw data of all installed.php which are currently loaded for custom implementations
+     *
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+     */
+    public static function getAllRawData()
+    {
+        return self::getInstalled();
+    }
+
+    /**
+     * Lets you reload the static array from another file
+     *
+     * This is only useful for complex integrations in which a project needs to use
+     * this class but then also needs to execute another project's autoloader in process,
+     * and wants to ensure both projects have access to their version of installed.php.
+     *
+     * A typical case would be PHPUnit, where it would need to make sure it reads all
+     * the data it needs from this class, then call reload() with
+     * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
+     * the project in which it runs can then also use this class safely, without
+     * interference between PHPUnit's dependencies and the project's dependencies.
+     *
+     * @param  array[] $data A vendor/composer/installed.php data set
+     * @return void
+     *
+     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
+     */
+    public static function reload($data)
+    {
+        self::$installed = $data;
+        self::$installedByVendor = array();
+
+        // when using reload, we disable the duplicate protection to ensure that self::$installed data is
+        // always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
+        // so we have to assume it does not, and that may result in duplicate data being returned when listing
+        // all installed packages for example
+        self::$installedIsLocalDir = false;
+    }
+
+    /**
+     * @return array[]
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
+     */
+    private static function getInstalled()
+    {
+        if (null === self::$canGetVendors) {
+            self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
+        }
+
+        $installed = array();
+        $copiedLocalDir = false;
+
+        if (self::$canGetVendors) {
+            $selfDir = strtr(__DIR__, '\\', '/');
+            foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
+                $vendorDir = strtr($vendorDir, '\\', '/');
+                if (isset(self::$installedByVendor[$vendorDir])) {
+                    $installed[] = self::$installedByVendor[$vendorDir];
+                } elseif (is_file($vendorDir.'/composer/installed.php')) {
+                    /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+                    $required = require $vendorDir.'/composer/installed.php';
+                    self::$installedByVendor[$vendorDir] = $required;
+                    $installed[] = $required;
+                    if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
+                        self::$installed = $required;
+                        self::$installedIsLocalDir = true;
+                    }
+                }
+                if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
+                    $copiedLocalDir = true;
+                }
+            }
+        }
+
+        if (null === self::$installed) {
+            // only require the installed.php file if this file is loaded from its dumped location,
+            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
+            if (substr(__DIR__, -8, 1) !== 'C') {
+                /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
+                $required = require __DIR__ . '/installed.php';
+                self::$installed = $required;
+            } else {
+                self::$installed = array();
+            }
+        }
+
+        if (self::$installed !== array() && !$copiedLocalDir) {
+            $installed[] = self::$installed;
+        }
+
+        return $installed;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/LICENSE 7.0.1-1/tools/.phpstan/vendor/composer/LICENSE
--- 7.0.0-1/tools/.phpstan/vendor/composer/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/LICENSE	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,21 @@
+
+Copyright (c) Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_classmap.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_classmap.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_classmap.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_classmap.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,59 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+    'Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php',
+    'Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php',
+    'Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php',
+    'Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php',
+    'Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php',
+    'Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php',
+    'Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php',
+    'Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php',
+    'Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php',
+    'Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php',
+    'Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php',
+    'Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
+    'Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php',
+    'Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php',
+    'Nette\\Utils\\FileInfo' => $vendorDir . '/nette/utils/src/Utils/FileInfo.php',
+    'Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php',
+    'Nette\\Utils\\Finder' => $vendorDir . '/nette/utils/src/Utils/Finder.php',
+    'Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php',
+    'Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php',
+    'Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php',
+    'Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php',
+    'Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php',
+    'Nette\\Utils\\ImageColor' => $vendorDir . '/nette/utils/src/Utils/ImageColor.php',
+    'Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
+    'Nette\\Utils\\ImageType' => $vendorDir . '/nette/utils/src/Utils/ImageType.php',
+    'Nette\\Utils\\Iterables' => $vendorDir . '/nette/utils/src/Utils/Iterables.php',
+    'Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php',
+    'Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
+    'Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php',
+    'Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php',
+    'Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php',
+    'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php',
+    'Nette\\Utils\\ReflectionMethod' => $vendorDir . '/nette/utils/src/Utils/ReflectionMethod.php',
+    'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
+    'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php',
+    'Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php',
+    'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
+    'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php',
+);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_files.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_files.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_files.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_files.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,10 @@
+<?php
+
+// autoload_files.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    '9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php',
+);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_namespaces.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_namespaces.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_namespaces.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_namespaces.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_psr4.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_psr4.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_psr4.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_psr4.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,13 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+    'TomasVotruba\\TypeCoverage\\' => array($vendorDir . '/tomasvotruba/type-coverage/src'),
+    'PHPStan\\ExtensionInstaller\\' => array($vendorDir . '/phpstan/extension-installer/src'),
+    'PHPStan\\' => array($vendorDir . '/phpstan/phpstan-strict-rules/src'),
+    'Ergebnis\\PHPStan\\Rules\\' => array($vendorDir . '/ergebnis/phpstan-rules/src'),
+);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_real.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_real.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_real.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_real.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,48 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitf9e7218f71d5874b5632927df4f72bd7
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    /**
+     * @return \Composer\Autoload\ClassLoader
+     */
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInitf9e7218f71d5874b5632927df4f72bd7', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
+        spl_autoload_unregister(array('ComposerAutoloaderInitf9e7218f71d5874b5632927df4f72bd7', 'loadClassLoader'));
+
+        require __DIR__ . '/autoload_static.php';
+        call_user_func(\Composer\Autoload\ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7::getInitializer($loader));
+
+        $loader->register(true);
+
+        $filesToLoad = \Composer\Autoload\ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7::$files;
+        $requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
+            if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+                $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+
+                require $file;
+            }
+        }, null, null);
+        foreach ($filesToLoad as $fileIdentifier => $file) {
+            $requireFile($fileIdentifier, $file);
+        }
+
+        return $loader;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/autoload_static.php 7.0.1-1/tools/.phpstan/vendor/composer/autoload_static.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/autoload_static.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/autoload_static.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,110 @@
+<?php
+
+// autoload_static.php @generated by Composer
+
+namespace Composer\Autoload;
+
+class ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7
+{
+    public static $files = array (
+        '9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php',
+    );
+
+    public static $prefixLengthsPsr4 = array (
+        'T' => 
+        array (
+            'TomasVotruba\\TypeCoverage\\' => 26,
+        ),
+        'P' => 
+        array (
+            'PHPStan\\ExtensionInstaller\\' => 27,
+            'PHPStan\\' => 8,
+        ),
+        'E' => 
+        array (
+            'Ergebnis\\PHPStan\\Rules\\' => 23,
+        ),
+    );
+
+    public static $prefixDirsPsr4 = array (
+        'TomasVotruba\\TypeCoverage\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/tomasvotruba/type-coverage/src',
+        ),
+        'PHPStan\\ExtensionInstaller\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/phpstan/extension-installer/src',
+        ),
+        'PHPStan\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/phpstan/phpstan-strict-rules/src',
+        ),
+        'Ergebnis\\PHPStan\\Rules\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/ergebnis/phpstan-rules/src',
+        ),
+    );
+
+    public static $classMap = array (
+        'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+        'Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php',
+        'Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php',
+        'Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php',
+        'Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
+        'Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php',
+        'Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php',
+        'Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php',
+        'Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
+        'Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php',
+        'Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php',
+        'Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php',
+        'Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
+        'Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php',
+        'Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php',
+        'Nette\\Utils\\FileInfo' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileInfo.php',
+        'Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php',
+        'Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/utils/src/Utils/Finder.php',
+        'Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php',
+        'Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php',
+        'Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php',
+        'Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
+        'Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php',
+        'Nette\\Utils\\ImageColor' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageColor.php',
+        'Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
+        'Nette\\Utils\\ImageType' => __DIR__ . '/..' . '/nette/utils/src/Utils/ImageType.php',
+        'Nette\\Utils\\Iterables' => __DIR__ . '/..' . '/nette/utils/src/Utils/Iterables.php',
+        'Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php',
+        'Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
+        'Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php',
+        'Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php',
+        'Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php',
+        'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php',
+        'Nette\\Utils\\ReflectionMethod' => __DIR__ . '/..' . '/nette/utils/src/Utils/ReflectionMethod.php',
+        'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
+        'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php',
+        'Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php',
+        'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
+        'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php',
+    );
+
+    public static function getInitializer(ClassLoader $loader)
+    {
+        return \Closure::bind(function () use ($loader) {
+            $loader->prefixLengthsPsr4 = ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7::$prefixDirsPsr4;
+            $loader->classMap = ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7::$classMap;
+
+        }, null, ClassLoader::class);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/installed.json 7.0.1-1/tools/.phpstan/vendor/composer/installed.json
--- 7.0.0-1/tools/.phpstan/vendor/composer/installed.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/installed.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,400 @@
+{
+    "packages": [
+        {
+            "name": "ergebnis/phpstan-rules",
+            "version": "2.8.0",
+            "version_normalized": "2.8.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ergebnis/phpstan-rules.git",
+                "reference": "30e790621fbad05573ef9cd355279fff5122e080"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/30e790621fbad05573ef9cd355279fff5122e080",
+                "reference": "30e790621fbad05573ef9cd355279fff5122e080",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0",
+                "phpstan/phpstan": "^2.0.0"
+            },
+            "require-dev": {
+                "doctrine/orm": "^2.20.0 || ^3.3.0",
+                "ergebnis/composer-normalize": "^2.45.0",
+                "ergebnis/license": "^2.6.0",
+                "ergebnis/php-cs-fixer-config": "^6.43.0",
+                "ergebnis/phpunit-slow-test-detector": "^2.18.0",
+                "nette/di": "^3.1.10",
+                "phpstan/extension-installer": "^1.4.3",
+                "phpstan/phpstan-deprecation-rules": "^2.0.1",
+                "phpstan/phpstan-phpunit": "^2.0.4",
+                "phpstan/phpstan-strict-rules": "^2.0.3",
+                "phpunit/phpunit": "^9.6.21",
+                "psr/container": "^2.0.2",
+                "symfony/finder": "^5.4.45",
+                "symfony/process": "^5.4.47"
+            },
+            "time": "2025-02-18T11:20:05+00:00",
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "rules.neon"
+                    ]
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "Ergebnis\\PHPStan\\Rules\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Andreas Möller",
+                    "email": "am@localheinz.com",
+                    "homepage": "https://localheinz.com"
+                }
+            ],
+            "description": "Provides rules for phpstan/phpstan.",
+            "homepage": "https://github.com/ergebnis/phpstan-rules",
+            "keywords": [
+                "PHPStan",
+                "phpstan-rules"
+            ],
+            "support": {
+                "issues": "https://github.com/ergebnis/phpstan-rules/issues",
+                "security": "https://github.com/ergebnis/phpstan-rules/blob/main/.github/SECURITY.md",
+                "source": "https://github.com/ergebnis/phpstan-rules"
+            },
+            "install-path": "../ergebnis/phpstan-rules"
+        },
+        {
+            "name": "nette/utils",
+            "version": "v4.0.5",
+            "version_normalized": "4.0.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nette/utils.git",
+                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nette/utils/zipball/736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+                "reference": "736c567e257dbe0fcf6ce81b4d6dbe05c6899f96",
+                "shasum": ""
+            },
+            "require": {
+                "php": "8.0 - 8.4"
+            },
+            "conflict": {
+                "nette/finder": "<3",
+                "nette/schema": "<1.2.2"
+            },
+            "require-dev": {
+                "jetbrains/phpstorm-attributes": "dev-master",
+                "nette/tester": "^2.5",
+                "phpstan/phpstan": "^1.0",
+                "tracy/tracy": "^2.9"
+            },
+            "suggest": {
+                "ext-gd": "to use Image",
+                "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+                "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+                "ext-json": "to use Nette\\Utils\\Json",
+                "ext-mbstring": "to use Strings::lower() etc...",
+                "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+            },
+            "time": "2024-08-07T15:39:19+00:00",
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0-dev"
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause",
+                "GPL-2.0-only",
+                "GPL-3.0-only"
+            ],
+            "authors": [
+                {
+                    "name": "David Grudl",
+                    "homepage": "https://davidgrudl.com"
+                },
+                {
+                    "name": "Nette Community",
+                    "homepage": "https://nette.org/contributors"
+                }
+            ],
+            "description": "🛠  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+            "homepage": "https://nette.org",
+            "keywords": [
+                "array",
+                "core",
+                "datetime",
+                "images",
+                "json",
+                "nette",
+                "paginator",
+                "password",
+                "slugify",
+                "string",
+                "unicode",
+                "utf-8",
+                "utility",
+                "validation"
+            ],
+            "support": {
+                "issues": "https://github.com/nette/utils/issues",
+                "source": "https://github.com/nette/utils/tree/v4.0.5"
+            },
+            "install-path": "../nette/utils"
+        },
+        {
+            "name": "phpstan/extension-installer",
+            "version": "1.4.3",
+            "version_normalized": "1.4.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/extension-installer.git",
+                "reference": "85e90b3942d06b2326fba0403ec24fe912372936"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936",
+                "reference": "85e90b3942d06b2326fba0403ec24fe912372936",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^2.0",
+                "php": "^7.2 || ^8.0",
+                "phpstan/phpstan": "^1.9.0 || ^2.0"
+            },
+            "require-dev": {
+                "composer/composer": "^2.0",
+                "php-parallel-lint/php-parallel-lint": "^1.2.0",
+                "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0"
+            },
+            "time": "2024-09-04T20:21:43+00:00",
+            "type": "composer-plugin",
+            "extra": {
+                "class": "PHPStan\\ExtensionInstaller\\Plugin"
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\ExtensionInstaller\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Composer plugin for automatic installation of PHPStan extensions",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/phpstan/extension-installer/issues",
+                "source": "https://github.com/phpstan/extension-installer/tree/1.4.3"
+            },
+            "install-path": "../phpstan/extension-installer"
+        },
+        {
+            "name": "phpstan/phpstan",
+            "version": "2.1.8",
+            "version_normalized": "2.1.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan.git",
+                "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan/zipball/f9adff3b87c03b12cc7e46a30a524648e497758f",
+                "reference": "f9adff3b87c03b12cc7e46a30a524648e497758f",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4|^8.0"
+            },
+            "conflict": {
+                "phpstan/phpstan-shim": "*"
+            },
+            "time": "2025-03-09T09:30:48+00:00",
+            "bin": [
+                "phpstan",
+                "phpstan.phar"
+            ],
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "PHPStan - PHP Static Analysis Tool",
+            "keywords": [
+                "dev",
+                "static analysis"
+            ],
+            "support": {
+                "docs": "https://phpstan.org/user-guide/getting-started",
+                "forum": "https://github.com/phpstan/phpstan/discussions",
+                "issues": "https://github.com/phpstan/phpstan/issues",
+                "security": "https://github.com/phpstan/phpstan/security/policy",
+                "source": "https://github.com/phpstan/phpstan-src"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ondrejmirtes",
+                    "type": "github"
+                },
+                {
+                    "url": "https://github.com/phpstan",
+                    "type": "github"
+                }
+            ],
+            "install-path": "../phpstan/phpstan"
+        },
+        {
+            "name": "phpstan/phpstan-strict-rules",
+            "version": "2.0.3",
+            "version_normalized": "2.0.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpstan/phpstan-strict-rules.git",
+                "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/8b88b5f818bfa301e0c99154ab622dace071c3ba",
+                "reference": "8b88b5f818bfa301e0c99154ab622dace071c3ba",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.4 || ^8.0",
+                "phpstan/phpstan": "^2.0.4"
+            },
+            "require-dev": {
+                "php-parallel-lint/php-parallel-lint": "^1.2",
+                "phpstan/phpstan-deprecation-rules": "^2.0",
+                "phpstan/phpstan-phpunit": "^2.0",
+                "phpunit/phpunit": "^9.6"
+            },
+            "time": "2025-01-21T10:52:14+00:00",
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "rules.neon"
+                    ]
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "PHPStan\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Extra strict and opinionated rules for PHPStan",
+            "support": {
+                "issues": "https://github.com/phpstan/phpstan-strict-rules/issues",
+                "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.3"
+            },
+            "install-path": "../phpstan/phpstan-strict-rules"
+        },
+        {
+            "name": "tomasvotruba/type-coverage",
+            "version": "2.0.2",
+            "version_normalized": "2.0.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/TomasVotruba/type-coverage.git",
+                "reference": "d033429580f2c18bda538fa44f2939236a990e0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/d033429580f2c18bda538fa44f2939236a990e0c",
+                "reference": "d033429580f2c18bda538fa44f2939236a990e0c",
+                "shasum": ""
+            },
+            "require": {
+                "nette/utils": "^3.2 || ^4.0",
+                "php": "^7.4 || ^8.0",
+                "phpstan/phpstan": "^2.0"
+            },
+            "time": "2025-01-07T00:10:26+00:00",
+            "type": "phpstan-extension",
+            "extra": {
+                "phpstan": {
+                    "includes": [
+                        "config/extension.neon"
+                    ]
+                }
+            },
+            "installation-source": "dist",
+            "autoload": {
+                "psr-4": {
+                    "TomasVotruba\\TypeCoverage\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Measure type coverage of your project",
+            "keywords": [
+                "phpstan-extension",
+                "static analysis"
+            ],
+            "support": {
+                "issues": "https://github.com/TomasVotruba/type-coverage/issues",
+                "source": "https://github.com/TomasVotruba/type-coverage/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://www.paypal.me/rectorphp",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/tomasvotruba",
+                    "type": "github"
+                }
+            ],
+            "install-path": "../tomasvotruba/type-coverage"
+        }
+    ],
+    "dev": true,
+    "dev-package-names": [
+        "ergebnis/phpstan-rules",
+        "nette/utils",
+        "phpstan/extension-installer",
+        "phpstan/phpstan",
+        "phpstan/phpstan-strict-rules",
+        "tomasvotruba/type-coverage"
+    ]
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/composer/installed.php 7.0.1-1/tools/.phpstan/vendor/composer/installed.php
--- 7.0.0-1/tools/.phpstan/vendor/composer/installed.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/composer/installed.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,77 @@
+<?php return array(
+    'root' => array(
+        'name' => '__root__',
+        'pretty_version' => 'dev-main',
+        'version' => 'dev-main',
+        'reference' => '53e29bc4860568299b0c5b3c583c83537384dca7',
+        'type' => 'library',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'dev' => true,
+    ),
+    'versions' => array(
+        '__root__' => array(
+            'pretty_version' => 'dev-main',
+            'version' => 'dev-main',
+            'reference' => '53e29bc4860568299b0c5b3c583c83537384dca7',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../../',
+            'aliases' => array(),
+            'dev_requirement' => false,
+        ),
+        'ergebnis/phpstan-rules' => array(
+            'pretty_version' => '2.8.0',
+            'version' => '2.8.0.0',
+            'reference' => '30e790621fbad05573ef9cd355279fff5122e080',
+            'type' => 'phpstan-extension',
+            'install_path' => __DIR__ . '/../ergebnis/phpstan-rules',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+        'nette/utils' => array(
+            'pretty_version' => 'v4.0.5',
+            'version' => '4.0.5.0',
+            'reference' => '736c567e257dbe0fcf6ce81b4d6dbe05c6899f96',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../nette/utils',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+        'phpstan/extension-installer' => array(
+            'pretty_version' => '1.4.3',
+            'version' => '1.4.3.0',
+            'reference' => '85e90b3942d06b2326fba0403ec24fe912372936',
+            'type' => 'composer-plugin',
+            'install_path' => __DIR__ . '/../phpstan/extension-installer',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+        'phpstan/phpstan' => array(
+            'pretty_version' => '2.1.8',
+            'version' => '2.1.8.0',
+            'reference' => 'f9adff3b87c03b12cc7e46a30a524648e497758f',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../phpstan/phpstan',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+        'phpstan/phpstan-strict-rules' => array(
+            'pretty_version' => '2.0.3',
+            'version' => '2.0.3.0',
+            'reference' => '8b88b5f818bfa301e0c99154ab622dace071c3ba',
+            'type' => 'phpstan-extension',
+            'install_path' => __DIR__ . '/../phpstan/phpstan-strict-rules',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+        'tomasvotruba/type-coverage' => array(
+            'pretty_version' => '2.0.2',
+            'version' => '2.0.2.0',
+            'reference' => 'd033429580f2c18bda538fa44f2939236a990e0c',
+            'type' => 'phpstan-extension',
+            'install_path' => __DIR__ . '/../tomasvotruba/type-coverage',
+            'aliases' => array(),
+            'dev_requirement' => true,
+        ),
+    ),
+);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,637 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+
+## Unreleased
+
+For a full diff see [`2.8.0...main`][2.8.0...main].
+
+## [`2.8.0`][2.8.0]
+
+For a full diff see [`2.7.0...2.8.0`][2.7.0...2.8.0].
+
+### Added
+
+- Added `allRules` parameter to allow disabling and enabling all rules  ([#913]), by [@localheinz]
+- Added `Expressions\NoAssignByReferenceRule`, which reports an error when a variable is assigned by reference ([#914]), by [@localheinz]
+
+## [`2.7.0`][2.7.0]
+
+For a full diff see [`2.6.1...2.7.0`][2.6.1...2.7.0].
+
+### Added
+
+- Added `Closures\NoParameterPassedByReferenceRule`, `Functions\NoParameterPassedByReferenceRule`, `Methods\NoParameterPassedByReferenceRule`, which report an error when a closure, a function, or a method has a parameter that is passed by reference ([#911]), by [@localheinz]
+- Added `Functions\NoReturnByReferenceRule` and `Methods\NoReturnByReferenceRule`, which report an error when a function or a method returns by reference ([#912]), by [@localheinz]
+
+## [`2.6.1`][2.6.1]
+
+For a full diff see [`2.6.0...2.6.1`][2.6.0...2.6.1].
+
+### Fixed
+
+- Adjusted `Methods\NoParameterWithNullableTypeDeclarationRule` to use the appropriate error identifier ([#902]), by [@manuelkiessling]
+
+## [`2.6.0`][2.6.0]
+
+For a full diff see [`2.5.2...2.6.0`][2.5.2...2.6.0].
+
+### Added
+
+- Added support for `phpstan/phpstan:^2.0.0`  ([#873]), by [@localheinz]
+
+## [`2.5.2`][2.5.2]
+
+For a full diff see [`2.5.1...2.5.2`][2.5.1...2.5.2].
+
+### Fixed
+
+- Adjusted `Closures\NoNullableReturnTypeDeclarationRule`, `Closures\NoParameterWithNullableTypeDeclarationRule`, `Functions\NoNullableReturnTypeDeclarationRule`, `Functions\NoParameterWithNullableTypeDeclarationRule`, `Methods\NoNullableReturnTypeDeclarationRule`, `Methods\NoParameterWithNullableTypeDeclarationRule` to detect cases where `null` is referenced with incorrect case or relative to the root namespace ([#897]), by [@localheinz]
+
+## [`2.5.1`][2.5.1]
+
+For a full diff see [`2.5.0...2.5.1`][2.5.0...2.5.1].
+
+### Fixed
+
+- Returned rule with error identifier ([#882]), by [@localheinz]
+- Adjusted `Methods\FinalInAbstractClassRule` to ignore Doctrine embeddables and entities ([#396]), by [@localheinz]
+- Adjusted `Expressions\NoCompactRule` to detect usages of `compact()` with incorrect case ([#889]), by [@localheinz]
+- Adjusted `Methods\PrivateInFinalClassRule` to use more appropriate message when detecting a `protected` method in an anonymous class ([#890]), by [@localheinz]
+- Adjusted `Methods\PrivateInFinalClassRule` to ignore `protected` methods from traits ([#891]), by [@localheinz]
+- Adjusted `Methods\PrivateInFinalClassRule` to ignore `protected` methods with `phpunit/phpunit` attributes requiring methods to be `protected` ([#863]), by [@cosmastech]
+- Adjusted `Methods\PrivateInFinalClassRule` to ignore `protected` methods with `phpunit/phpunit` annotations requiring methods to be `protected` ([#895]), by [@cosmastech]
+
+## [`2.5.0`][2.5.0]
+
+For a full diff see [`2.4.0...2.5.0`][2.4.0...2.5.0].
+
+### Added
+
+- Added rule error identifiers ([#875]), by [@localheinz]
+- Added support for PHP 8.0 ([#877]), by [@localheinz]
+- Added support for PHP 7.4 ([#880]), by [@localheinz]
+
+### Changed
+
+- Removed dependency on `nikic/php-parser` ([#878]), by [@localheinz]
+
+## [`2.4.0`][2.4.0]
+
+For a full diff see [`2.3.0...2.4.0`][2.3.0...2.4.0].
+
+### Added
+
+- Added support for PHP 8.4 ([#872]), by [@localheinz]
+
+## [`2.3.0`][2.3.0]
+
+For a full diff see [`2.2.0...2.3.0`][2.2.0...2.3.0].
+
+### Changed
+
+- Allowed installation on PHP 8.4 ([#862]), by [@localheinz]
+
+## [`2.2.0`][2.2.0]
+
+For a full diff see [`2.1.0...2.2.0`][2.1.0...2.2.0].
+
+### Changed
+
+- Allowed installation of `nikic/php-parser:^5.0.0` ([#735]), by [@localheinz]
+
+## [`2.1.0`][2.1.0]
+
+For a full diff see [`2.0.0...2.1.0`][2.0.0...2.1.0].
+
+### Changed
+
+- Dropped support for PHP 8.0 ([#567]), by [@localheinz]
+- Added support for PHP 8.3 ([#604]), by [@nunomaduro]
+
+## [`2.0.0`][2.0.0]
+
+For a full diff see [`1.0.0...2.0.0`][1.0.0...2.0.0].
+
+### Added
+
+- Added `methodsAllowedToUseContainerTypeDeclarations` parameter to allow configuring a list of method names that are allowed to have container parameter type declarations ([#541), by [@localheinz]
+- Allowed disabling rules ([#542), by [@localheinz]
+- Added support for nullable union types ([#543), by [@localheinz]
+
+### Changed
+
+- Dropped support for PHP 7.2 ([#496]), by [@localheinz]
+- Dropped support for PHP 7.3 ([#498]), by [@localheinz]
+- Dropped support for PHP 7.4 ([#499]), by [@localheinz]
+- Added support for PHP 8.2 ([#540]), by [@localheinz]
+
+### Removed
+
+- Removed `Expressions\NoEmptyRule` ([#525]), by [@enumag]
+
+## [`1.0.0`][1.0.0]
+
+For a full diff see [`0.15.3...1.0.0`][0.15.3...1.0.0].
+
+### Changed
+
+- Added support for `phpstan/phpstan:^1.0.0` and dropped support for non-stable versions of `phpstan/phpstan` ([#381]), by [@rpkamp]
+
+### Fixed
+
+- Adjusted `Classes\FinalRule` to not report an error when a non-final class has a `Doctrinbe\ORM\Mapping\Entity` attribute ([#395]), by [@localheinz]
+
+## [`0.15.3`][0.15.3]
+
+For a full diff see [`0.15.2...0.15.3`][0.15.2...0.15.3].
+
+### Changed
+
+- Allow installation with PHP 8.0 ([#294]), by [@localheinz]
+
+## [`0.15.2`][0.15.2]
+
+For a full diff see [`0.15.1...0.15.2`][0.15.1...0.15.2].
+
+### Changed
+
+- Dropped support for PHP 7.1 ([#259]), by [@localheinz]
+
+## [`0.15.1`][0.15.1]
+
+For a full diff see [`0.15.0...0.15.1`][0.15.0...0.15.1].
+
+### Changed
+
+- Adjusted `Methods\FinalInAbstractClass` rule to allow non-`final` `public` constructors in abstract classes ([#248]), by [@Slamdunk]
+
+## [`0.15.0`][0.15.0]
+
+For a full diff see [`0.14.4...0.15.0`][0.14.4...0.15.0].
+
+### Added
+
+- Added `Classes\PHPUnit\Framework\TestCaseWithSuffixRule`, which reports an error when a concrete class extending `PHPUnit\Framework\TestCase` does not have a `Test` suffix ([#225]), by [@localheinz]
+
+## [`0.14.4`][0.14.4]
+
+For a full diff see [`0.14.3...0.14.4`][0.14.3...0.14.4].
+
+### Fixed
+
+- Ignored classes with `@ORM\Mapping\Entity` annotations in `FinalRule` ([#202]), by [@localheinz]
+
+## [`0.14.3`][0.14.3]
+
+For a full diff see [`0.14.2...0.14.3`][0.14.2...0.14.3].
+
+### Fixed
+
+- Ignored first line in `DeclareStrictTypesRule` when it is a shebang ([#186]), by [@Great-Antique]
+
+## [`0.14.2`][0.14.2]
+
+For a full diff see [`0.14.1...0.14.2`][0.14.1...0.14.2].
+
+### Fixed
+
+- Brought back support for PHP 7.1 ([#166]), by [@localheinz]
+
+## [`0.14.1`][0.14.1]
+
+For a full diff see [`0.14.0...0.14.1`][0.14.0...0.14.1].
+
+### Fixed
+
+- Removed an inappropriate `replace` configuration from `composer.json` ([#161]), by [@localheinz]
+
+## [`0.14.0`][0.14.0]
+
+For a full diff see [`0.13.0...0.14.0`][0.13.0...0.14.0].
+
+### Changed
+
+- Allowed installation of `phpstan/phpstan:~0.12.0`  ([#147]), by [@localheinz]
+- Renamed vendor namespace `Localheinz` to `Ergebnis` after move to [@ergebnis] ([#157]), by [@localheinz]
+
+  Run
+
+  ```sh
+  composer remove localheinz/phpstan-rules
+  ```
+
+  and
+
+  ```sh
+  composer require ergebnis/phpstan-rules
+  ```
+
+  to update.
+
+  Run
+
+  ```sh
+  find . -type f -exec sed -i '.bak' 's/Localheinz\\PHPStan/Ergebnis\\PHPStan/g' {} \;
+  ```
+
+  to replace occurrences of `Localheinz\PHPStan` with `Ergebnis\PHPStan`.
+
+  Run
+
+  ```sh
+  find -type f -name '*.bak' -delete
+  ```
+
+  to delete backup files created in the previous step.
+
+- Moved parameters into `ergebnis` section to prevent conflicts with global parameters ([#158]), by [@localheinz]
+
+  Where previously `phpstan.neon` looked like the following
+
+  ```neon
+  parameters:
+      allowAbstractClasses: true
+      classesAllowedToBeExtended: []
+      classesNotRequiredToBeAbstractOrFinal: []
+      interfacesImplementedByContainers:
+          - Psr\Container\ContainerInterface
+  ```
+
+  these parameters now need to be moved into an `ergebnis` section:
+
+  ```diff
+   parameters:
+  -    allowAbstractClasses: true
+  -    classesAllowedToBeExtended: []
+  -    classesNotRequiredToBeAbstractOrFinal: []
+  -    interfacesImplementedByContainers:
+  -        - Psr\Container\ContainerInterface
+  +    ergebnis:
+  +        allowAbstractClasses: true
+  +        classesAllowedToBeExtended: []
+  +        classesNotRequiredToBeAbstractOrFinal: []
+  +        interfacesImplementedByContainers:
+  +            - Psr\Container\ContainerInterface
+  ```
+
+### Fixed
+
+- Dropped support for PHP 7.1 ([#141]), by [@localheinz]
+
+## [`0.13.0`][0.13.0]
+
+For a full diff see [`0.12.2...0.13.0`][0.12.2...0.13.0].
+
+### Added
+
+- Added `Methods\PrivateInFinalClassRule` which reports an error when a method in a `final` class is `protected` when it could be `private` ([#126]), by [@localheinz]
+
+## [`0.12.2`][0.12.2]
+
+For a full diff see [`0.12.1...0.12.2`][0.12.1...0.12.2].
+
+### Fixed
+
+- Started ignoring interfaces from analysis by `Methods\FinalInAbstractClassRule` to avoid inappropriate errors ([#132]), by [@localheinz]
+
+## [`0.12.1`][0.12.1]
+
+For a full diff see [`0.12.0...0.12.1`][0.12.0...0.12.1].
+
+### Fixed
+
+- Started resolving class name in type declaration before attempting to analyze it in the `Methods\NoParameterWithContainerTypeDeclarationRule` to avoid errors where class `self` is not found ([#128]), by [@localheinz]
+
+## [`0.12.0`][0.12.0]
+
+For a full diff see [`0.11.0...0.12.0`][0.11.0...0.12.0].
+
+### Added
+
+- Added `Methods\NoParameterWithContainerTypeDeclarationRule`, which reports an error when a method has a type declaration that corresponds to a known dependency injection container or service locator ([#122]), by [@localheinz]
+- Added `Methods\FinalInAbstractClassRule`, which reports an error when a concrete `public` or `protected` method in an `abstract` class is not `final` ([#123]), by [@localheinz]
+
+## [`0.11.0`][0.11.0]
+
+For a full diff see [`0.10.0...0.11.0`][0.10.0...0.11.0].
+
+### Added
+
+- Added `Files\DeclareStrictTypesRule`, which reports an error when a PHP file does not have a `declare(strict_types=1)` declaration ([#79]
+- Added `Expressions\NoEmptyRule`, which reports an error when the language construct `empty()` is used ([#110]), by [@localheinz]
+- Added `Expressions\NoEvalRule`, which reports an error when the language construct `eval()` is used ([#112]), by [@localheinz]
+- Added `Expressions\NoErrorSuppressionRule`, which reports an error when `@` is used to suppress errors ([#113]), by [@localheinz]
+- Added `Expressions\NoCompactRule`, which reports an error when the function `compact()` is used ([#116]), by [@localheinz]
+- Added `Statements\NoSwitchRule`, which reports an error when the statement `switch()` is used ([#117]), by [@localheinz]
+
+### Changed
+
+- Require at least `nikic/php-parser:^4.2.3` ([#102]), by [@localheinz]
+- Require at least `phpstan/phpstan:~0.11.15` ([#103]), by [@localheinz]
+
+## [`0.10.0`][0.10.0]
+
+For a full diff see [`0.9.1...0.10.0`][0.9.1...0.10.0].
+
+### Changed
+
+- Require at least `phpstan/phpstan:~0.11.7` ([#91]), by [@localheinz]
+
+### Fixed
+
+- Added missing `parametersSchema` configuration to `rules.neon`, which is required for use with `bleedingEdge.neon`, see [`phpstan/phpstan@54a125d`](https://github.com/phpstan/phpstan/commit/54a125df47fa097b792cb9a3e70c49f753f66b85) ([#93]), by [@localheinz]
+*
+## [`0.9.1`][0.9.1]
+
+For a full diff see [`0.9.0...0.9.1`][0.9.0...0.9.1].
+
+### Changed
+
+- Allow usage with [`phpstan/extension-installer`](https://github.com/phpstan/extension-installer) ([#89]), by [@localheinz]
+
+## [`0.9.0`][0.9.0]
+
+For a full diff see [`0.8.1...0.9.0`][0.8.1...0.9.0].
+
+### Changed
+
+- Adjusted `Classes\FinalRule` to ignore Doctrine entities when they are annotated ([#84]), by [@localheinz]
+
+## [`0.8.1`][0.8.1]
+
+For a full diff see [`0.8.0...0.8.1`][0.8.0...0.8.1].
+
+### Fixed
+
+- Actually enable `Expressions\NoIssetRule` ([#83]), by [@localheinz]
+
+## [`0.8.0`][0.8.0]
+
+For a full diff see [`0.7.1...0.8.0`][0.7.1...0.8.0].
+
+### Added
+
+- Added `Expressions\NoIssetRule`, which reports an error when the language construct `isset()` is used ([#81]), by [@localheinz]
+
+## [`0.7.1`][0.7.1]
+
+For a full diff see [`0.7.0...0.7.1`][0.7.0...0.7.1].
+
+### Changed
+
+- Configured `Classes\NoExtendsRule` to allow a set of default classes to be extended ([#73]), by [@localheinz]
+
+## [`0.7.0`][0.7.0]
+
+For a full diff see [`0.6.0...0.7.0`][0.6.0...0.7.0].
+
+### Added
+
+- Added `Classes\NoExtendsRule`, which reports an error when a class extends a class that is not allowed to be extended ([#68]), by [@localheinz]
+
+## [`0.6.0`][0.6.0]
+
+For a full diff see [`0.5.0...0.6.0`][0.5.0...0.6.0].
+
+### Added
+
+- Allow installation with `phpstan/phpstan:~0.11.0` ([#65]), by [@localheinz]
+
+## [`0.5.0`][0.5.0]
+
+For a full diff see [`0.4.0...0.5.0`][0.4.0...0.5.0].
+
+### Added
+
+- Added `Methods\NoConstructorParameterWithDefaultValueRule`, which reports an error when a constructor of an anonymous class or a class has a parameter with a default value ([#45]), by [@localheinz]
+- Added parameters `$allowAbstractClasses` and `$classesNotRequiredToBeAbstractOrFinal` to allow configuration of `Classes`FinalRule` ([#51]), by [@localheinz]
+
+### Removed
+
+- Removed `Classes\AbstractOrFinalRule` after merging behaviour into `Classes\FinalRule` ([#51]), by [@localheinz]
+- Removed default values from constructor of `Classes\FinalRule` ([#53]), by [@localheinz]
+
+## [`0.4.0`][0.4.0]
+
+For a full diff see [`0.3.0...0.4.0`][0.3.0...0.4.0]
+
+### Changed
+
+- Removed double-quotes from error messages to be more consistent with error messages generated by `phpstan/phstan` ([#39]), by [@localheinz]
+- Modified wording and placement of method, function, and parameter names in error messages to be more consistent with error messages generated by `phpstan/phstan` ([#42]), by [@localheinz]
+
+## [`0.3.0`][0.3.0]
+
+For a full diff see [`0.2.0...0.3.0`][0.2.0...0.3.0]
+
+### Added
+
+- Added `Functions\NoNullableReturnTypeDeclarationRule`, which reports an error when a function has a nullable return type declaration, and `Methods\NoNullableReturnTypeDeclarationRule`, which reports an error when a method declared in an anonymous class, a class, or an interface has a nullable return type declaration ([#16]), by [@localheinz]
+- Added `Closures\NoParameterWithNullDefaultValueRule`, which reports an error when a closure has a parameter with `null` as default value ([#26]), by [@localheinz]
+- Added `Closures\NoNullableReturnTypeDeclarationRule`, which reports an error when a closure has a nullable return type declaration ([#29]), by [@localheinz]
+- Added `Functions\NoParameterWithNullDefaultValueRule`, which reports an error when a function has a parameter with `null` as default value ([#31]), by [@localheinz]
+- Added `Methods\NoParameterWithNullDefaultValueRule`, which reports an error when a method declared in an anonymous class, a class, or an interface has a parameter with `null` as default value ([#32]), by [@localheinz]
+- Added `Closures\NoParameterWithNullableTypeDeclarationRule`, which reports an error when a closure has a parameter with a nullable type declaration ([#33]), by [@localheinz]
+- Added `Functions\NoParameterWithNullableTypeDeclarationRule`, which reports an error when a function has a parameter with a nullable type declaration ([#34]), by [@localheinz]
+- Added `Methods\NoParameterWithNullableTypeDeclarationRule`, which reports an error when a method declared in an anonymous class, a class, or an interface has a parameter with a nullable type declaration ([#35]), by [@localheinz]
+- Extracted `rules.neon`, so you can easily enable all rules by including it in your `phpstan.neon` ([#37]), by [@localheinz]
+
+## [`0.2.0`][0.2.0]
+
+For a full diff see [`0.1.0...0.2.0`][0.1.0...0.2.0]
+
+### Added
+
+- Added `Classes\FinalRule`, which reports an error when a non-anonymous class is not `final`, ([#4]), by [@localheinz]
+
+### Changed
+
+- Added an `$excludeClassNames` argument to the constructors of `Classes\AbstractOrFinalRule` and `Classes\FinalRule` to allow whitelisting of classes, ([#11]), by [@localheinz]
+
+## [`0.1.0`][0.1.0]
+
+For a full diff see [`362c7ea...0.1.0`][362c7ea...0.1.0].
+
+### Added
+
+- Added `Classes\AbstractOrFinalRule`, which reports an error when a non-anonymous class is neither `abstract` nor `final`, ([#1]), by [@localheinz]
+
+[0.1.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.1.0
+[0.2.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.2.0
+[0.3.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.3.0
+[0.4.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.4.0
+[0.5.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.5.0
+[0.6.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.6.0
+[0.7.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.7.0
+[0.7.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.7.1
+[0.8.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.8.0
+[0.8.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.8.1
+[0.9.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.9.0
+[0.9.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.9.1
+[0.10.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.10.0
+[0.11.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.11.0
+[0.12.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.12.0
+[0.12.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.12.1
+[0.12.2]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.12.2
+[0.13.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.13.0
+[0.14.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.14.0
+[0.14.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.14.1
+[0.14.2]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.14.2
+[0.14.3]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.14.3
+[0.14.4]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.14.4
+[0.15.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.15.0
+[0.15.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.15.1
+[0.15.2]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.15.2
+[0.15.3]: https://github.com/ergebnis/phpstan-rules/releases/tag/0.15.3
+[1.0.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/1.0.0
+[2.0.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.0.0
+[2.1.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.1.0
+[2.2.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.2.0
+[2.3.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.3.0
+[2.4.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.4.0
+[2.5.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.5.0
+[2.5.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.5.1
+[2.5.2]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.5.2
+[2.6.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.6.0
+[2.6.1]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.6.1
+[2.7.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.7.0
+[2.8.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.8.0
+
+[362c7ea...0.1.0]: https://github.com/ergebnis/phpstan-rules/compare/362c7ea...0.1.0
+[0.1.0...0.2.0]: https://github.com/ergebnis/phpstan-rules/compare/0.1.0...0.2.0
+[0.2.0...0.3.0]: https://github.com/ergebnis/phpstan-rules/compare/0.2.0...0.3.0
+[0.3.0...0.4.0]: https://github.com/ergebnis/phpstan-rules/compare/0.3.0...0.4.0
+[0.4.0...0.5.0]: https://github.com/ergebnis/phpstan-rules/compare/0.4.0...0.5.0
+[0.5.0...0.6.0]: https://github.com/ergebnis/phpstan-rules/compare/0.5.0...0.6.0
+[0.6.0...0.7.0]: https://github.com/ergebnis/phpstan-rules/compare/0.6.0...0.7.0
+[0.7.0...0.7.1]: https://github.com/ergebnis/phpstan-rules/compare/0.7.0...0.7.1
+[0.7.1...0.8.0]: https://github.com/ergebnis/phpstan-rules/compare/0.7.1...0.8.0
+[0.8.0...0.8.1]: https://github.com/ergebnis/phpstan-rules/compare/0.8.0...0.8.1
+[0.8.1...0.9.0]: https://github.com/ergebnis/phpstan-rules/compare/0.8.1...0.9.0
+[0.9.0...0.9.1]: https://github.com/ergebnis/phpstan-rules/compare/0.9.0...0.9.1
+[0.9.1...0.10.0]: https://github.com/ergebnis/phpstan-rules/compare/0.9.1...0.10.0
+[0.10.0...0.11.0]: https://github.com/ergebnis/phpstan-rules/compare/0.10.0...0.11.0
+[0.11.0...0.12.0]: https://github.com/ergebnis/phpstan-rules/compare/0.11.0...0.12.0
+[0.12.0...0.12.1]: https://github.com/ergebnis/phpstan-rules/compare/0.12.0...0.12.1
+[0.12.1...0.12.2]: https://github.com/ergebnis/phpstan-rules/compare/0.12.1...0.12.2
+[0.12.2...0.13.0]: https://github.com/ergebnis/phpstan-rules/compare/0.12.2...0.13.0
+[0.13.0...0.14.0]: https://github.com/ergebnis/phpstan-rules/compare/0.13.0...0.14.0
+[0.14.0...0.14.1]: https://github.com/ergebnis/phpstan-rules/compare/0.14.0...0.14.1
+[0.14.1...0.14.2]: https://github.com/ergebnis/phpstan-rules/compare/0.14.1...0.14.2
+[0.14.2...0.14.3]: https://github.com/ergebnis/phpstan-rules/compare/0.14.2...0.14.3
+[0.14.3...0.14.4]: https://github.com/ergebnis/phpstan-rules/compare/0.14.3...0.14.4
+[0.14.4...0.15.0]: https://github.com/ergebnis/phpstan-rules/compare/0.14.4...0.15.0
+[0.15.0...0.15.1]: https://github.com/ergebnis/phpstan-rules/compare/0.15.0...0.15.1
+[0.15.1...0.15.2]: https://github.com/ergebnis/phpstan-rules/compare/0.15.1...0.15.2
+[0.15.2...0.15.3]: https://github.com/ergebnis/phpstan-rules/compare/0.15.2...0.15.3
+[0.15.3...1.0.0]: https://github.com/ergebnis/phpstan-rules/compare/0.15.3...1.0.0
+[1.0.0...2.0.0]: https://github.com/ergebnis/phpstan-rules/compare/1.0.0...2.0.0
+[2.0.0...2.1.0]: https://github.com/ergebnis/phpstan-rules/compare/2.0.0...2.1.0
+[2.1.0...2.2.0]: https://github.com/ergebnis/phpstan-rules/compare/2.1.0...2.2.0
+[2.2.0...2.3.0]: https://github.com/ergebnis/phpstan-rules/compare/2.2.0...2.3.0
+[2.3.0...2.4.0]: https://github.com/ergebnis/phpstan-rules/compare/2.3.0...2.4.0
+[2.4.0...2.5.0]: https://github.com/ergebnis/phpstan-rules/compare/2.4.0...2.5.0
+[2.5.0...2.5.1]: https://github.com/ergebnis/phpstan-rules/compare/2.5.0...2.5.1
+[2.5.1...2.5.2]: https://github.com/ergebnis/phpstan-rules/compare/2.5.1...2.5.2
+[2.5.2...2.6.0]: https://github.com/ergebnis/phpstan-rules/compare/2.5.2...2.6.0
+[2.6.0...2.6.1]: https://github.com/ergebnis/phpstan-rules/compare/2.6.0...2.6.1
+[2.6.1...2.7.0]: https://github.com/ergebnis/phpstan-rules/compare/2.6.1...2.7.0
+[2.7.0...2.8.0]: https://github.com/ergebnis/phpstan-rules/compare/2.7.0...2.8.0
+[2.8.0...main]: https://github.com/ergebnis/phpstan-rules/compare/2.8.0...main
+
+[#1]: https://github.com/ergebnis/phpstan-rules/pull/1
+[#4]: https://github.com/ergebnis/phpstan-rules/pull/4
+[#11]: https://github.com/ergebnis/phpstan-rules/pull/11
+[#16]: https://github.com/ergebnis/phpstan-rules/pull/16
+[#26]: https://github.com/ergebnis/phpstan-rules/pull/26
+[#29]: https://github.com/ergebnis/phpstan-rules/pull/29
+[#31]: https://github.com/ergebnis/phpstan-rules/pull/31
+[#32]: https://github.com/ergebnis/phpstan-rules/pull/32
+[#33]: https://github.com/ergebnis/phpstan-rules/pull/33
+[#34]: https://github.com/ergebnis/phpstan-rules/pull/34
+[#35]: https://github.com/ergebnis/phpstan-rules/pull/35
+[#37]: https://github.com/ergebnis/phpstan-rules/pull/37
+[#39]: https://github.com/ergebnis/phpstan-rules/pull/39
+[#42]: https://github.com/ergebnis/phpstan-rules/pull/42
+[#45]: https://github.com/ergebnis/phpstan-rules/pull/45
+[#51]: https://github.com/ergebnis/phpstan-rules/pull/51
+[#53]: https://github.com/ergebnis/phpstan-rules/pull/53
+[#65]: https://github.com/ergebnis/phpstan-rules/pull/65
+[#68]: https://github.com/ergebnis/phpstan-rules/pull/68
+[#73]: https://github.com/ergebnis/phpstan-rules/pull/73
+[#79]: https://github.com/ergebnis/phpstan-rules/pull/79
+[#81]: https://github.com/ergebnis/phpstan-rules/pull/81
+[#83]: https://github.com/ergebnis/phpstan-rules/pull/83
+[#84]: https://github.com/ergebnis/phpstan-rules/pull/84
+[#89]: https://github.com/ergebnis/phpstan-rules/pull/89
+[#91]: https://github.com/ergebnis/phpstan-rules/pull/91
+[#93]: https://github.com/ergebnis/phpstan-rules/pull/93
+[#102]: https://github.com/ergebnis/phpstan-rules/pull/102
+[#103]: https://github.com/ergebnis/phpstan-rules/pull/103
+[#110]: https://github.com/ergebnis/phpstan-rules/pull/110
+[#112]: https://github.com/ergebnis/phpstan-rules/pull/112
+[#113]: https://github.com/ergebnis/phpstan-rules/pull/113
+[#116]: https://github.com/ergebnis/phpstan-rules/pull/116
+[#117]: https://github.com/ergebnis/phpstan-rules/pull/117
+[#122]: https://github.com/ergebnis/phpstan-rules/pull/122
+[#123]: https://github.com/ergebnis/phpstan-rules/pull/123
+[#126]: https://github.com/ergebnis/phpstan-rules/pull/126
+[#128]: https://github.com/ergebnis/phpstan-rules/pull/128
+[#132]: https://github.com/ergebnis/phpstan-rules/pull/132
+[#141]: https://github.com/ergebnis/phpstan-rules/pull/141
+[#147]: https://github.com/ergebnis/phpstan-rules/pull/147
+[#157]: https://github.com/ergebnis/phpstan-rules/pull/157
+[#158]: https://github.com/ergebnis/phpstan-rules/pull/158
+[#161]: https://github.com/ergebnis/phpstan-rules/pull/161
+[#166]: https://github.com/ergebnis/phpstan-rules/pull/166
+[#186]: https://github.com/ergebnis/phpstan-rules/pull/186
+[#202]: https://github.com/ergebnis/phpstan-rules/pull/202
+[#225]: https://github.com/ergebnis/phpstan-rules/pull/225
+[#248]: https://github.com/ergebnis/phpstan-rules/pull/248
+[#259]: https://github.com/ergebnis/phpstan-rules/pull/259
+[#294]: https://github.com/ergebnis/phpstan-rules/pull/294
+[#381]: https://github.com/ergebnis/phpstan-rules/pull/381
+[#395]: https://github.com/ergebnis/phpstan-rules/pull/395
+[#396]: https://github.com/ergebnis/phpstan-rules/pull/396
+[#496]: https://github.com/ergebnis/phpstan-rules/pull/496
+[#498]: https://github.com/ergebnis/phpstan-rules/pull/498
+[#499]: https://github.com/ergebnis/phpstan-rules/pull/498
+[#525]: https://github.com/ergebnis/phpstan-rules/pull/525
+[#540]: https://github.com/ergebnis/phpstan-rules/pull/540
+[#541]: https://github.com/ergebnis/phpstan-rules/pull/541
+[#542]: https://github.com/ergebnis/phpstan-rules/pull/542
+[#543]: https://github.com/ergebnis/phpstan-rules/pull/543
+[#567]: https://github.com/ergebnis/phpstan-rules/pull/567
+[#735]: https://github.com/ergebnis/phpstan-rules/pull/735
+[#862]: https://github.com/ergebnis/phpstan-rules/pull/862
+[#863]: https://github.com/ergebnis/phpstan-rules/pull/863
+[#872]: https://github.com/ergebnis/phpstan-rules/pull/872
+[#873]: https://github.com/ergebnis/phpstan-rules/pull/873
+[#875]: https://github.com/ergebnis/phpstan-rules/pull/875
+[#877]: https://github.com/ergebnis/phpstan-rules/pull/877
+[#878]: https://github.com/ergebnis/phpstan-rules/pull/878
+[#880]: https://github.com/ergebnis/phpstan-rules/pull/880
+[#882]: https://github.com/ergebnis/phpstan-rules/pull/882
+[#889]: https://github.com/ergebnis/phpstan-rules/pull/889
+[#890]: https://github.com/ergebnis/phpstan-rules/pull/890
+[#891]: https://github.com/ergebnis/phpstan-rules/pull/891
+[#895]: https://github.com/ergebnis/phpstan-rules/pull/895
+[#897]: https://github.com/ergebnis/phpstan-rules/pull/897
+[#902]: https://github.com/ergebnis/phpstan-rules/pull/902
+[#911]: https://github.com/ergebnis/phpstan-rules/pull/911
+[#912]: https://github.com/ergebnis/phpstan-rules/pull/912
+[#913]: https://github.com/ergebnis/phpstan-rules/pull/913
+[#914]: https://github.com/ergebnis/phpstan-rules/pull/914
+
+[@cosmastech]: https://github.com/cosmastech
+[@enumag]: https://github.com/enumag
+[@ergebnis]: https://github.com/ergebnis
+[@Great-Antique]: https://github.com/Great-Antique
+[@localheinz]: https://github.com/localheinz
+[@manuelkiessling]: https://github.com/manuelkiessling
+[@nunomaduro]: https://github.com/nunomaduro
+[@rpkamp]: https://github.com/rpkamp
+[@Slamdunk]: https://github.com/Slamdunk
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,16 @@
+# The MIT License (MIT)
+
+Copyright (c) 2018-2025 Andreas Möller
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the _Software_), to deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED **AS IS**, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,683 @@
+# phpstan-rules
+
+[![Integrate](https://github.com/ergebnis/phpstan-rules/workflows/Integrate/badge.svg)](https://github.com/ergebnis/phpstan-rules/actions)
+[![Merge](https://github.com/ergebnis/phpstan-rules/workflows/Merge/badge.svg)](https://github.com/ergebnis/phpstan-rules/actions)
+[![Release](https://github.com/ergebnis/phpstan-rules/workflows/Release/badge.svg)](https://github.com/ergebnis/phpstan-rules/actions)
+[![Renew](https://github.com/ergebnis/phpstan-rules/workflows/Renew/badge.svg)](https://github.com/ergebnis/phpstan-rules/actions)
+
+[![Code Coverage](https://codecov.io/gh/ergebnis/phpstan-rules/branch/main/graph/badge.svg)](https://codecov.io/gh/ergebnis/phpstan-rules)
+
+[![Latest Stable Version](https://poser.pugx.org/ergebnis/phpstan-rules/v/stable)](https://packagist.org/packages/ergebnis/phpstan-rules)
+[![Total Downloads](https://poser.pugx.org/ergebnis/phpstan-rules/downloads)](https://packagist.org/packages/ergebnis/phpstan-rules)
+[![Monthly Downloads](http://poser.pugx.org/ergebnis/phpstan-rules/d/monthly)](https://packagist.org/packages/ergebnis/phpstan-rules)
+
+This project provides a [`composer`](https://getcomposer.org) package with rules for [`phpstan/phpstan`](https://github.com/phpstan/phpstan).
+
+## Installation
+
+Run
+
+```sh
+composer require --dev ergebnis/phpstan-rules
+```
+
+## Usage
+
+All of the [rules](https://github.com/ergebnis/phpstan-rules#rules) provided (and used) by this library are included in [`rules.neon`](rules.neon).
+
+When you are using [`phpstan/extension-installer`](https://github.com/phpstan/extension-installer), `rules.neon` will be automatically included.
+
+Otherwise you need to include `rules.neon` in your `phpstan.neon`:
+
+```neon
+includes:
+	- vendor/ergebnis/phpstan-rules/rules.neon
+```
+
+:bulb: You probably want to use these rules on top of the rules provided by:
+
+- [`phpstan/phpstan`](https://github.com/phpstan/phpstan)
+- [`phpstan/phpstan-deprecation-rules`](https://github.com/phpstan/phpstan-deprecation-rules)
+- [`phpstan/phpstan-strict-rules`](https://github.com/phpstan/phpstan-strict-rules)
+
+## Rules
+
+This package provides the following rules for use with [`phpstan/phpstan`](https://github.com/phpstan/phpstan):
+
+- [`Ergebnis\PHPStan\Rules\Classes\FinalRule`](https://github.com/ergebnis/phpstan-rules#classesfinalrule)
+- [`Ergebnis\PHPStan\Rules\Classes\NoExtendsRule`](https://github.com/ergebnis/phpstan-rules#classesnoextendsrule)
+- [`Ergebnis\PHPStan\Rules\Classes\PHPUnit\Framework\TestCaseWithSuffixRule`](https://github.com/ergebnis/phpstan-rules#classesphpunitframeworktestcasewithsuffixrule)
+- [`Ergebnis\PHPStan\Rules\Closures\NoNullableReturnTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#closuresnonullablereturntypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Closures\NoParameterPassedByReferenceRule`](https://github.com/ergebnis/phpstan-rules#closuresnoparameterpassedbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullableTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#closuresnoparameterwithnullabletypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullDefaultValueRule`](https://github.com/ergebnis/phpstan-rules#closuresnoparameterwithnulldefaultvaluerule)
+- [`Ergebnis\PHPStan\Rules\Expressions\NoAssignByReferenceRule`](https://github.com/ergebnis/phpstan-rules#expressionsnoassignbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Expressions\NoCompactRule`](https://github.com/ergebnis/phpstan-rules#expressionsnocompactrule)
+- [`Ergebnis\PHPStan\Rules\Expressions\NoErrorSuppressionRule`](https://github.com/ergebnis/phpstan-rules#expressionsnoerrorsuppressionrule)
+- [`Ergebnis\PHPStan\Rules\Expressions\NoEvalRule`](https://github.com/ergebnis/phpstan-rules#expressionsnoevalrule)
+- [`Ergebnis\PHPStan\Rules\Expressions\NoIssetRule`](https://github.com/ergebnis/phpstan-rules#expressionsnoissetrule)
+- [`Ergebnis\PHPStan\Rules\Files\DeclareStrictTypesRule`](https://github.com/ergebnis/phpstan-rules#filesdeclarestricttypesrule)
+- [`Ergebnis\PHPStan\Rules\Functions\NoNullableReturnTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#functionsnonullablereturntypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Functions\NoParameterPassedByReferenceRule`](https://github.com/ergebnis/phpstan-rules#functionsnoparameterpassedbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullableTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#functionsnoparameterwithnullabletypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullDefaultValueRule`](https://github.com/ergebnis/phpstan-rules#functionsnoparameterwithnulldefaultvaluerule)
+- [`Ergebnis\PHPStan\Rules\Functions\NoReturnByReferenceRule`](https://github.com/ergebnis/phpstan-rules#functionsnoreturnbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Methods\FinalInAbstractClassRule`](https://github.com/ergebnis/phpstan-rules#methodsfinalinabstractclassrule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoConstructorParameterWithDefaultValueRule`](https://github.com/ergebnis/phpstan-rules#methodsnoconstructorparameterwithdefaultvaluerule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoNullableReturnTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#methodsnonullablereturntypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoParameterPassedByReferenceRule`](https://github.com/ergebnis/phpstan-rules#methodsnoparameterpassedbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoParameterWithContainerTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#methodsnoparameterwithcontainertypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullableTypeDeclarationRule`](https://github.com/ergebnis/phpstan-rules#methodsnoparameterwithnullabletypedeclarationrule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullDefaultValueRule`](https://github.com/ergebnis/phpstan-rules#methodsnoparameterwithnulldefaultvaluerule)
+- [`Ergebnis\PHPStan\Rules\Methods\NoReturnByReferenceRule`](https://github.com/ergebnis/phpstan-rules#methodsnoreturnbyreferencerule)
+- [`Ergebnis\PHPStan\Rules\Methods\PrivateInFinalClassRule`](https://github.com/ergebnis/phpstan-rules#methodsprivateinfinalclassrule)
+- [`Ergebnis\PHPStan\Rules\Statements\NoSwitchRule`](https://github.com/ergebnis/phpstan-rules#statementsnoswitchrule)
+
+### Classes
+
+#### `Classes\FinalRule`
+
+This rule reports an error when a non-anonymous class is not `final`.
+
+:bulb: This rule ignores classes that
+
+- use `@Entity`, `@ORM\Entity`, or `@ORM\Mapping\Entity` annotations
+- use `Doctrine\ORM\Mapping\Entity` attributes
+
+on the class level.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		final:
+			enabled: false
+```
+
+##### Disallowing `abstract` classes
+
+By default, this rule allows to declare `abstract` classes.
+
+You can set the `allowAbstractClasses` parameter to `false` to disallow abstract classes.
+
+```neon
+parameters:
+	ergebnis:
+		final:
+			allowAbstractClasses: false
+```
+
+##### Excluding classes from inspection
+
+You can set the `classesNotRequiredToBeAbstractOrFinal` parameter to a list of class names that you want to exclude from inspection.
+
+```neon
+parameters:
+	ergebnis:
+		final:
+			classesNotRequiredToBeAbstractOrFinal:
+				- Foo\Bar\NeitherAbstractNorFinal
+				- Bar\Baz\NeitherAbstractNorFinal
+```
+
+#### `Classes\NoExtendsRule`
+
+This rule reports an error when a class extends another class.
+
+##### Defaults
+
+By default, this rule allows the following classes to be extended:
+
+- [`PHPUnit\Framework\TestCase`](https://github.com/sebastianbergmann/phpunit/blob/7.5.2/src/Framework/TestCase.php)
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noExtends:
+			enabled: false
+```
+
+##### Allowing classes to be extended
+
+You can set the `classesAllowedToBeExtended` parameter to a list of class names that you want to allow to be extended.
+
+```neon
+parameters:
+	ergebnis:
+		noExtends:
+			classesAllowedToBeExtended:
+				- Ergebnis\PHPStan\Rules\Test\Integration\AbstractTestCase
+				- Ergebnis\PHPStan\Rules\Test\Integration\AbstractTestCase
+```
+
+#### `Classes\PHPUnit\Framework\TestCaseWithSuffixRule`
+
+This rule reports an error when a concrete class is a sub-class of `PHPUnit\Framework\TestCase` but does not have a `Test` suffix.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		testCaseWithSuffix:
+			enabled: false
+```
+
+### Closures
+
+#### `Closures\NoNullableReturnTypeDeclarationRule`
+
+This rule reports an error when a closure uses a nullable return type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noNullableReturnTypeDeclaration:
+			enabled: false
+```
+
+#### `Closures\NoParameterPassedByReferenceRule`
+
+This rule reports an error when a closure has a parameter that is [passed by reference](https://www.php.net/manual/en/language.references.pass.php).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterPassedByReference:
+			enabled: false
+```
+
+#### `Closures\NoParameterWithNullableTypeDeclarationRule`
+
+This rule reports an error when a closure has a parameter with a nullable type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullableTypeDeclaration:
+			enabled: false
+```
+
+#### `Closures\NoParameterWithNullDefaultValueRule`
+
+This rule reports an error when a closure has a parameter with `null` as default value.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullDefaultValue:
+			enabled: false
+```
+
+### Expressions
+
+#### `Expressions\NoAssignByReferenceRule`
+
+This rule reports an error when [a variable is assigned by reference](https://www.php.net/manual/en/language.references.whatdo.php#language.references.whatdo.assign).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noAssignByReference:
+			enabled: false
+```
+
+#### `Expressions\NoCompactRule`
+
+This rule reports an error when the function [`compact()`](https://www.php.net/compact) is used.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noCompact:
+			enabled: false
+```
+
+#### `Expressions\NoEvalRule`
+
+This rule reports an error when the language construct [`eval()`](https://www.php.net/eval) is used.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noEval:
+			enabled: false
+```
+
+#### `Expressions\NoErrorSuppressionRule`
+
+This rule reports an error when [`@`](https://www.php.net/manual/en/language.operators.errorcontrol.php) is used to suppress errors.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noErrorSuppression:
+			enabled: false
+```
+
+#### `Expressions\NoIssetRule`
+
+This rule reports an error when the language construct [`isset()`](https://www.php.net/isset) is used.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noIsset:
+			enabled: false
+```
+
+### Files
+
+#### `Files\DeclareStrictTypesRule`
+
+This rule reports an error when a non-empty file does not contain a `declare(strict_types=1)` declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		declareStrictTypes:
+			enabled: false
+```
+
+### Functions
+
+#### `Functions\NoNullableReturnTypeDeclarationRule`
+
+This rule reports an error when a function uses a nullable return type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noNullableReturnTypeDeclaration:
+			enabled: false
+```
+
+#### `Functions\NoParameterPassedByReferenceRule`
+
+This rule reports an error when a function has a parameter that is [passed by reference](https://www.php.net/manual/en/language.references.pass.php).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterPassedByReference:
+			enabled: false
+```
+
+#### `Functions\NoParameterWithNullableTypeDeclarationRule`
+
+This rule reports an error when a function has a parameter with a nullable type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullableTypeDeclaration:
+			enabled: false
+```
+
+#### `Functions\NoParameterWithNullDefaultValueRule`
+
+This rule reports an error when a function has a parameter with `null` as default value.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullDefaultValue:
+			enabled: false
+```
+
+#### `Functions\NoReturnByReferenceRule`
+
+This rule reports an error when a function [returns by reference](https://www.php.net/manual/en/language.references.return.php).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noReturnByReference:
+			enabled: false
+```
+
+### Methods
+
+#### `Methods\FinalInAbstractClassRule`
+
+This rule reports an error when a concrete `public` or `protected `method in an `abstract` class is not `final`.
+
+:bulb: This rule ignores
+
+- Doctrine embeddables
+- Doctrine entities
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		finalInAbstractClass:
+			enabled: false
+```
+
+#### `Methods\NoConstructorParameterWithDefaultValueRule`
+
+This rule reports an error when a constructor declared in
+
+- an anonymous class
+- a class
+
+has a default value.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noConstructorParameterWithDefaultValue:
+			enabled: false
+```
+
+#### `Methods\NoParameterPassedByReferenceRule`
+
+This rule reports an error when a method has a parameter that is [passed by reference](https://www.php.net/manual/en/language.references.pass.php).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterPassedByReference:
+			enabled: false
+```
+
+#### `Methods\NoNullableReturnTypeDeclarationRule`
+
+This rule reports an error when a method declared in
+
+- an anonymous class
+- a class
+- an interface
+
+uses a nullable return type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noNullableReturnTypeDeclaration:
+			enabled: false
+```
+
+#### `Methods\NoParameterWithContainerTypeDeclarationRule`
+
+This rule reports an error when a method has a type declaration for a known dependency injection container or service locator.
+
+##### Defaults
+
+By default, this rule disallows the use of type declarations indicating an implementation of
+
+- [`Psr\Container\ContainerInterface`](https://github.com/php-fig/container/blob/1.0.0/src/ContainerInterface.php)
+
+is expected to be injected into a method.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithContainerTypeDeclaration:
+			enabled: false
+```
+
+##### Configuring container interfaces
+
+You can set the `interfacesImplementedByContainers` parameter to a list of interface names of additional containers and service locators.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithContainerTypeDeclaration:
+			interfacesImplementedByContainers:
+				- Fancy\DependencyInjection\ContainerInterface
+				- Other\ServiceLocatorInterface
+```
+
+##### Configuring methods allowed to use parameters with container type declarations
+
+You can set the `methodsAllowedToUseContainerTypeDeclarations` parameter to a list of method names that are allowed to use parameters with container type declarations.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithContainerTypeDeclaration:
+			methodsAllowedToUseContainerTypeDeclarations:
+				- loadExtension
+```
+
+#### `Methods\NoParameterWithNullableTypeDeclarationRule`
+
+This rule reports an error when a method declared in
+
+- an anonymous class
+- a class
+- an interface
+
+has a parameter with a nullable type declaration.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullableTypeDeclaration:
+			enabled: false
+```
+
+#### `Methods\NoParameterWithNullDefaultValueRule`
+
+This rule reports an error when a method declared in
+
+- an anonymous class
+- a class
+- an interface
+
+has a parameter with `null` as default value.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noParameterWithNullDefaultValue:
+			enabled: false
+```
+
+#### `Functions\NoReturnByReferenceRule`
+
+This rule reports an error when a method [returns by reference](https://www.php.net/manual/en/language.references.return.php).
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noReturnByReference:
+			enabled: false
+```
+
+#### `Methods\PrivateInFinalClassRule`
+
+This rule reports an error when a method in a `final` class is `protected` but could be `private`.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		privateInFinalClass:
+			enabled: false
+```
+
+### Statements
+
+#### `Statements\NoSwitchRule`
+
+This rule reports an error when the statement [`switch()`](https://www.php.net/manual/control-structures.switch.php) is used.
+
+##### Disabling the rule
+
+You can set the `enabled` parameter to `false` to disable this rule.
+
+```neon
+parameters:
+	ergebnis:
+		noSwitch:
+			enabled: false
+```
+
+## Disabling all rules
+
+You can disable all rules using the `allRules` configuration parameter:
+
+```neon
+parameters:
+	ergebnis:
+		allRules: false
+```
+
+## Enabling rules one-by-one
+
+If you have disabled all rules using the `allRules` configuration parameter, you can re-enable individual rules with their corresponding configuration parameters:
+
+```neon
+parameters:
+	ergebnis:
+		allRules: false
+		privateInFinalClass:
+			enabled: true
+```
+
+## Changelog
+
+The maintainers of this project record notable changes to this project in a [changelog](CHANGELOG.md).
+
+## Contributing
+
+The maintainers of this project suggest following the [contribution guide](.github/CONTRIBUTING.md).
+
+## Code of Conduct
+
+The maintainers of this project ask contributors to follow the [code of conduct](https://github.com/ergebnis/.github/blob/main/CODE_OF_CONDUCT.md).
+
+## General Support Policy
+
+The maintainers of this project provide limited support.
+
+You can support the maintenance of this project by [sponsoring @localheinz](https://github.com/sponsors/localheinz) or [requesting an invoice for services related to this project](mailto:am@localheinz.com?subject=ergebnis/phpstan-rules:%20Requesting%20invoice%20for%20services).
+
+## PHP Version Support Policy
+
+This project supports PHP versions with [active and security support](https://www.php.net/supported-versions.php).
+
+The maintainers of this project add support for a PHP version following its initial release and drop support for a PHP version when it has reached the end of security support.
+
+## Security Policy
+
+This project has a [security policy](.github/SECURITY.md).
+
+## License
+
+This project uses the [MIT license](LICENSE.md).
+
+## Credits
+
+The method [`FinalRule::isWhitelistedClass()`](src/Classes/FinalRule.php) is inspired by the work on [`FinalClassFixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/2.15/src/Fixer/ClassNotation/FinalClassFixer.php) and [`FinalInternalClassFixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/2.15/src/Fixer/ClassNotation/FinalInternalClassFixer.php), contributed by [Dariusz Rumiński](https://github.com/keradus), [Filippo Tessarotto](https://github.com/Slamdunk), and [Spacepossum](https://github.com/SpacePossum) for [`friendsofphp/php-cs-fixer`](https://github.com/FriendsOfPHP/PHP-CS-Fixer) (originally licensed under MIT).
+
+## Social
+
+Follow [@localheinz](https://twitter.com/intent/follow?screen_name=localheinz) and [@ergebnis](https://twitter.com/intent/follow?screen_name=ergebnis) on Twitter.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,76 @@
+{
+  "name": "ergebnis/phpstan-rules",
+  "description": "Provides rules for phpstan/phpstan.",
+  "license": "MIT",
+  "type": "phpstan-extension",
+  "keywords": [
+    "phpstan",
+    "phpstan-rules"
+  ],
+  "authors": [
+    {
+      "name": "Andreas Möller",
+      "email": "am@localheinz.com",
+      "homepage": "https://localheinz.com"
+    }
+  ],
+  "homepage": "https://github.com/ergebnis/phpstan-rules",
+  "support": {
+    "issues": "https://github.com/ergebnis/phpstan-rules/issues",
+    "source": "https://github.com/ergebnis/phpstan-rules",
+    "security": "https://github.com/ergebnis/phpstan-rules/blob/main/.github/SECURITY.md"
+  },
+  "require": {
+    "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0",
+    "ext-mbstring": "*",
+    "phpstan/phpstan": "^2.0.0"
+  },
+  "require-dev": {
+    "doctrine/orm": "^2.20.0 || ^3.3.0",
+    "ergebnis/composer-normalize": "^2.45.0",
+    "ergebnis/license": "^2.6.0",
+    "ergebnis/php-cs-fixer-config": "^6.43.0",
+    "ergebnis/phpunit-slow-test-detector": "^2.18.0",
+    "nette/di": "^3.1.10",
+    "phpstan/extension-installer": "^1.4.3",
+    "phpstan/phpstan-deprecation-rules": "^2.0.1",
+    "phpstan/phpstan-phpunit": "^2.0.4",
+    "phpstan/phpstan-strict-rules": "^2.0.3",
+    "phpunit/phpunit": "^9.6.21",
+    "psr/container": "^2.0.2",
+    "symfony/finder": "^5.4.45",
+    "symfony/process": "^5.4.47"
+  },
+  "autoload": {
+    "psr-4": {
+      "Ergebnis\\PHPStan\\Rules\\": "src/"
+    }
+  },
+  "autoload-dev": {
+    "psr-4": {
+      "Ergebnis\\PHPStan\\Rules\\Test\\": "test/"
+    }
+  },
+  "config": {
+    "allow-plugins": {
+      "ergebnis/composer-normalize": true,
+      "infection/extension-installer": true,
+      "phpstan/extension-installer": true
+    },
+    "audit": {
+      "abandoned": "report"
+    },
+    "platform": {
+      "php": "7.4.33"
+    },
+    "preferred-install": "dist",
+    "sort-packages": true
+  },
+  "extra": {
+    "phpstan": {
+      "includes": [
+        "rules.neon"
+      ]
+    }
+  }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,263 @@
+conditionalTags:
+	Ergebnis\PHPStan\Rules\Classes\FinalRule:
+		phpstan.rules.rule: %ergebnis.final.enabled%
+	Ergebnis\PHPStan\Rules\Classes\NoExtendsRule:
+		phpstan.rules.rule: %ergebnis.noExtends.enabled%
+	Ergebnis\PHPStan\Rules\Classes\PHPUnit\Framework\TestCaseWithSuffixRule:
+		phpstan.rules.rule: %ergebnis.testCaseWithSuffix.enabled%
+	Ergebnis\PHPStan\Rules\Closures\NoNullableReturnTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noNullableReturnTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Closures\NoParameterPassedByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noParameterPassedByReference.enabled%
+	Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullableTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithNullableTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Expressions\NoAssignByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noAssignByReference.enabled%
+	Ergebnis\PHPStan\Rules\Expressions\NoCompactRule:
+		phpstan.rules.rule: %ergebnis.noCompact.enabled%
+	Ergebnis\PHPStan\Rules\Expressions\NoErrorSuppressionRule:
+		phpstan.rules.rule: %ergebnis.noErrorSuppression.enabled%
+	Ergebnis\PHPStan\Rules\Expressions\NoEvalRule:
+		phpstan.rules.rule: %ergebnis.noEval.enabled%
+	Ergebnis\PHPStan\Rules\Expressions\NoIssetRule:
+		phpstan.rules.rule: %ergebnis.noIsset.enabled%
+	Ergebnis\PHPStan\Rules\Files\DeclareStrictTypesRule:
+		phpstan.rules.rule: %ergebnis.declareStrictTypes.enabled%
+	Ergebnis\PHPStan\Rules\Functions\NoNullableReturnTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noNullableReturnTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Functions\NoParameterPassedByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noParameterPassedByReference.enabled%
+	Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullableTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithNullableTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullDefaultValueRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithNullDefaultValue.enabled%
+	Ergebnis\PHPStan\Rules\Functions\NoReturnByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noReturnByReference.enabled%
+	Ergebnis\PHPStan\Rules\Methods\FinalInAbstractClassRule:
+		phpstan.rules.rule: %ergebnis.finalInAbstractClass.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoConstructorParameterWithDefaultValueRule:
+		phpstan.rules.rule: %ergebnis.noConstructorParameterWithDefaultValue.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoNullableReturnTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noNullableReturnTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoParameterPassedByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noParameterPassedByReference.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoParameterWithContainerTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithContainerTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullableTypeDeclarationRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithNullableTypeDeclaration.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullDefaultValueRule:
+		phpstan.rules.rule: %ergebnis.noParameterWithNullDefaultValue.enabled%
+	Ergebnis\PHPStan\Rules\Methods\NoReturnByReferenceRule:
+		phpstan.rules.rule: %ergebnis.noReturnByReference.enabled%
+	Ergebnis\PHPStan\Rules\Methods\PrivateInFinalClassRule:
+		phpstan.rules.rule: %ergebnis.privateInFinalClass.enabled%
+	Ergebnis\PHPStan\Rules\Statements\NoSwitchRule:
+		phpstan.rules.rule: %ergebnis.noSwitch.enabled%
+
+parameters:
+	ergebnis:
+		allRules: true
+		declareStrictTypes:
+			enabled: %ergebnis.allRules%
+		final:
+			allowAbstractClasses: true
+			classesNotRequiredToBeAbstractOrFinal: []
+			enabled: %ergebnis.allRules%
+		finalInAbstractClass:
+			enabled: %ergebnis.allRules%
+		noAssignByReference:
+			enabled: %ergebnis.allRules%
+		noCompact:
+			enabled: %ergebnis.allRules%
+		noConstructorParameterWithDefaultValue:
+			enabled: %ergebnis.allRules%
+		noErrorSuppression:
+			enabled: %ergebnis.allRules%
+		noEval:
+			enabled: %ergebnis.allRules%
+		noExtends:
+			classesAllowedToBeExtended: []
+			enabled: %ergebnis.allRules%
+		noIsset:
+			enabled: %ergebnis.allRules%
+		noNullableReturnTypeDeclaration:
+			enabled: %ergebnis.allRules%
+		noParameterPassedByReference:
+			enabled: %ergebnis.allRules%
+		noParameterWithContainerTypeDeclaration:
+			enabled: %ergebnis.allRules%
+			interfacesImplementedByContainers:
+				- Psr\Container\ContainerInterface
+			methodsAllowedToUseContainerTypeDeclarations: []
+		noParameterWithNullableTypeDeclaration:
+			enabled: %ergebnis.allRules%
+		noParameterWithNullDefaultValue:
+			enabled: %ergebnis.allRules%
+		noReturnByReference:
+			enabled: %ergebnis.allRules%
+		noSwitch:
+			enabled: %ergebnis.allRules%
+		privateInFinalClass:
+			enabled: %ergebnis.allRules%
+		testCaseWithSuffix:
+			enabled: %ergebnis.allRules%
+
+parametersSchema:
+	ergebnis: structure([
+		allRules: bool()
+		declareStrictTypes: structure([
+			enabled: bool(),
+		])
+		final: structure([
+			allowAbstractClasses: bool()
+			classesNotRequiredToBeAbstractOrFinal: listOf(string())
+			enabled: bool(),
+		])
+		finalInAbstractClass: structure([
+			enabled: bool(),
+		])
+		noAssignByReference: structure([
+			enabled: bool(),
+		])
+		noCompact: structure([
+			enabled: bool(),
+		])
+		noConstructorParameterWithDefaultValue: structure([
+			enabled: bool(),
+		])
+		noErrorSuppression: structure([
+			enabled: bool(),
+		])
+		noExtends: structure([
+			classesAllowedToBeExtended: listOf(string())
+			enabled: bool(),
+		])
+		noEval: structure([
+			enabled: bool(),
+		])
+		noIsset: structure([
+			enabled: bool(),
+		])
+		noNullableReturnTypeDeclaration: structure([
+			enabled: bool(),
+		])
+		noParameterPassedByReference: structure([
+			enabled: bool(),
+		])
+		noParameterWithContainerTypeDeclaration: structure([
+			enabled: bool(),
+			interfacesImplementedByContainers: listOf(string())
+			methodsAllowedToUseContainerTypeDeclarations: listOf(string())
+		])
+		noParameterWithNullableTypeDeclaration: structure([
+			enabled: bool(),
+		])
+		noParameterWithNullDefaultValue: structure([
+			enabled: bool(),
+		])
+		noReturnByReference: structure([
+			enabled: bool(),
+		])
+		noSwitch: structure([
+			enabled: bool(),
+		])
+		privateInFinalClass: structure([
+			enabled: bool(),
+		])
+		testCaseWithSuffix: structure([
+			enabled: bool(),
+		])
+	])
+
+services:
+	-
+		class: Ergebnis\PHPStan\Rules\Analyzer
+
+	-
+		class: Ergebnis\PHPStan\Rules\Classes\FinalRule
+		arguments:
+			allowAbstractClasses: %ergebnis.final.allowAbstractClasses%
+			classesNotRequiredToBeAbstractOrFinal: %ergebnis.final.classesNotRequiredToBeAbstractOrFinal%
+
+	-
+		class: Ergebnis\PHPStan\Rules\Classes\NoExtendsRule
+		arguments:
+			classesAllowedToBeExtended: %ergebnis.noExtends.classesAllowedToBeExtended%
+
+	-
+		class: Ergebnis\PHPStan\Rules\Classes\PHPUnit\Framework\TestCaseWithSuffixRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Closures\NoNullableReturnTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Closures\NoParameterPassedByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Closures\NoParameterWithNullableTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Expressions\NoAssignByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Expressions\NoCompactRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Expressions\NoErrorSuppressionRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Expressions\NoEvalRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Expressions\NoIssetRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Files\DeclareStrictTypesRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Functions\NoNullableReturnTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Functions\NoParameterPassedByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullableTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Functions\NoParameterWithNullDefaultValueRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Functions\NoReturnByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\FinalInAbstractClassRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoConstructorParameterWithDefaultValueRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoNullableReturnTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoParameterPassedByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoParameterWithContainerTypeDeclarationRule
+		arguments:
+			interfacesImplementedByContainers: %ergebnis.noParameterWithContainerTypeDeclaration.interfacesImplementedByContainers%
+			methodsAllowedToUseContainerTypeDeclarations: %ergebnis.noParameterWithContainerTypeDeclaration.methodsAllowedToUseContainerTypeDeclarations%
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullableTypeDeclarationRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoParameterWithNullDefaultValueRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\NoReturnByReferenceRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Methods\PrivateInFinalClassRule
+
+	-
+		class: Ergebnis\PHPStan\Rules\Statements\NoSwitchRule
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,68 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules;
+
+use PhpParser\Node;
+
+/**
+ * @internal
+ */
+final class Analyzer
+{
+    public function hasNullDefaultValue(Node\Param $parameter): bool
+    {
+        if (!$parameter->default instanceof Node\Expr\ConstFetch) {
+            return false;
+        }
+
+        return 'null' === $parameter->default->name->toLowerString();
+    }
+
+    /**
+     * @param null|Node\ComplexType|Node\Identifier|Node\Name $typeDeclaration
+     */
+    public function isNullableTypeDeclaration($typeDeclaration): bool
+    {
+        if ($typeDeclaration instanceof Node\NullableType) {
+            return true;
+        }
+
+        if ($typeDeclaration instanceof Node\UnionType) {
+            foreach ($typeDeclaration->types as $type) {
+                if (
+                    $type instanceof Node\Identifier
+                    && 'null' === $type->toLowerString()
+                ) {
+                    return true;
+                }
+
+                if (
+                    $type instanceof Node\Name\FullyQualified
+                    && $type->hasAttribute('originalName')
+                ) {
+                    $originalName = $type->getAttribute('originalName');
+
+                    if (
+                        $originalName instanceof Node\Name
+                        && 'null' === $originalName->toLowerString()
+                    ) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,162 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Classes;
+
+use Doctrine\ORM;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Comment;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Class_>
+ */
+final class FinalRule implements Rules\Rule
+{
+    /**
+     * @var list<string>
+     */
+    private static array $whitelistedAnnotations = [
+        'Entity',
+        'ORM\Entity',
+        'ORM\Mapping\Entity',
+    ];
+
+    /**
+     * @var list<class-string>
+     */
+    private static array $whitelistedAttributes = [
+        ORM\Mapping\Entity::class,
+    ];
+    private bool $allowAbstractClasses;
+
+    /**
+     * @var list<string>
+     */
+    private array $classesNotRequiredToBeAbstractOrFinal;
+    private string $errorMessageTemplate = 'Class %s is not final.';
+
+    /**
+     * @param list<class-string> $classesNotRequiredToBeAbstractOrFinal
+     */
+    public function __construct(
+        bool $allowAbstractClasses,
+        array $classesNotRequiredToBeAbstractOrFinal
+    ) {
+        $this->allowAbstractClasses = $allowAbstractClasses;
+        $this->classesNotRequiredToBeAbstractOrFinal = \array_map(static function (string $classNotRequiredToBeAbstractOrFinal): string {
+            return $classNotRequiredToBeAbstractOrFinal;
+        }, $classesNotRequiredToBeAbstractOrFinal);
+
+        if ($allowAbstractClasses) {
+            $this->errorMessageTemplate = 'Class %s is neither abstract nor final.';
+        }
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Class_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!isset($node->namespacedName)) {
+            return [];
+        }
+
+        if (\in_array($node->namespacedName->toString(), $this->classesNotRequiredToBeAbstractOrFinal, true)) {
+            return [];
+        }
+
+        if (
+            $this->allowAbstractClasses
+            && $node->isAbstract()
+        ) {
+            return [];
+        }
+
+        if ($node->isFinal()) {
+            return [];
+        }
+
+        if ($this->hasWhitelistedAnnotation($node)) {
+            return [];
+        }
+
+        if ($this->hasWhitelistedAttribute($node)) {
+            return [];
+        }
+
+        $message = \sprintf(
+            $this->errorMessageTemplate,
+            $node->namespacedName->toString(),
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::final()->toString())
+                ->build(),
+        ];
+    }
+
+    /**
+     * This method is inspired by the work on PhpCsFixer\Fixer\ClassNotation\FinalClassFixer and
+     * PhpCsFixer\Fixer\ClassNotation\FinalInternalClassFixer contributed by Dariusz Rumiński, Filippo Tessarotto, and
+     * Spacepossum for friendsofphp/php-cs-fixer.
+     *
+     * @see https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/2.15/src/Fixer/ClassNotation/FinalClassFixer.php
+     * @see https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/2.15/src/Fixer/ClassNotation/FinalInternalClassFixer.php
+     * @see https://github.com/keradus
+     * @see https://github.com/SpacePossum
+     * @see https://github.com/Slamdunk
+     */
+    private function hasWhitelistedAnnotation(Node\Stmt\Class_ $node): bool
+    {
+        $docComment = $node->getDocComment();
+
+        if (!$docComment instanceof Comment\Doc) {
+            return false;
+        }
+
+        $reformattedComment = $docComment->getReformattedText();
+
+        if (\is_int(\preg_match_all('/@(\S+)(?=\s|$)/', $reformattedComment, $matches))) {
+            foreach ($matches[1] as $annotation) {
+                foreach (self::$whitelistedAnnotations as $whitelistedAnnotation) {
+                    if (0 === \mb_strpos($annotation, $whitelistedAnnotation)) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private function hasWhitelistedAttribute(Node\Stmt\Class_ $node): bool
+    {
+        foreach ($node->attrGroups as $attributeGroup) {
+            foreach ($attributeGroup->attrs as $attribute) {
+                if (\in_array($attribute->name->toString(), self::$whitelistedAttributes, true)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,98 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Classes;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Class_>
+ */
+final class NoExtendsRule implements Rules\Rule
+{
+    /**
+     * @var list<class-string>
+     */
+    private static array $defaultClassesAllowedToBeExtended = [
+        'PHPUnit\\Framework\\TestCase',
+    ];
+
+    /**
+     * @var list<class-string>
+     */
+    private array $classesAllowedToBeExtended;
+
+    /**
+     * @param list<class-string> $classesAllowedToBeExtended
+     */
+    public function __construct(array $classesAllowedToBeExtended)
+    {
+        $this->classesAllowedToBeExtended = \array_values(\array_unique(\array_merge(
+            self::$defaultClassesAllowedToBeExtended,
+            \array_map(static function (string $classAllowedToBeExtended): string {
+                /** @var class-string $classAllowedToBeExtended */
+                return $classAllowedToBeExtended;
+            }, $classesAllowedToBeExtended),
+        )));
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Class_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!$node->extends instanceof Node\Name) {
+            return [];
+        }
+
+        $extendedClassName = $node->extends->toString();
+
+        if (\in_array($extendedClassName, $this->classesAllowedToBeExtended, true)) {
+            return [];
+        }
+
+        if (!isset($node->namespacedName)) {
+            $message = \sprintf(
+                'Anonymous class is not allowed to extend "%s".',
+                $extendedClassName,
+            );
+
+            return [
+                Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noExtends()->toString())
+                    ->build(),
+            ];
+        }
+
+        $extendingClassName = $node->namespacedName->toString();
+
+        $message = \sprintf(
+            'Class "%s" is not allowed to extend "%s".',
+            $extendingClassName,
+            $extendedClassName,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noExtends()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,95 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Classes\PHPUnit\Framework;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Class_>
+ */
+final class TestCaseWithSuffixRule implements Rules\Rule
+{
+    /**
+     * @var list<class-string>
+     */
+    private static array $phpunitTestCaseClassNames = [
+        'PHPUnit\Framework\TestCase',
+    ];
+    private Reflection\ReflectionProvider $reflectionProvider;
+
+    public function __construct(Reflection\ReflectionProvider $reflectionProvider)
+    {
+        $this->reflectionProvider = $reflectionProvider;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Class_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if ($node->isAbstract()) {
+            return [];
+        }
+
+        if (!$node->extends instanceof Node\Name) {
+            return [];
+        }
+
+        if (!isset($node->namespacedName)) {
+            return [];
+        }
+
+        $fullyQualifiedClassName = $node->namespacedName->toString();
+
+        $classReflection = $this->reflectionProvider->getClass($fullyQualifiedClassName);
+
+        $extendedPhpunitTestCaseClassName = '';
+
+        foreach (self::$phpunitTestCaseClassNames as $phpunitTestCaseClassName) {
+            if ($classReflection->isSubclassOf($phpunitTestCaseClassName)) {
+                $extendedPhpunitTestCaseClassName = $phpunitTestCaseClassName;
+
+                break;
+            }
+        }
+
+        if ('' === $extendedPhpunitTestCaseClassName) {
+            return [];
+        }
+
+        if (1 === \preg_match('/Test$/', $fullyQualifiedClassName)) {
+            return [];
+        }
+
+        $message = \sprintf(
+            'Class %s extends %s, is concrete, but does not have a Test suffix.',
+            $fullyQualifiedClassName,
+            $extendedPhpunitTestCaseClassName,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::testCaseWithSuffix()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,53 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Closures;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Closure>
+ */
+final class NoNullableReturnTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Expr\Closure::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!$this->analyzer->isNullableTypeDeclaration($node->getReturnType())) {
+            return [];
+        }
+
+        return [
+            Rules\RuleErrorBuilder::message('Closure has a nullable return type declaration.')
+                ->identifier(ErrorIdentifier::noNullableReturnTypeDeclaration()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,64 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Closures;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Closure>
+ */
+final class NoParameterPassedByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\Closure::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersPassedByReference = \array_values(\array_filter($node->params, static function (Node\Param $parameter): bool {
+            return $parameter->byRef;
+        }));
+
+        if (0 === \count($parametersPassedByReference)) {
+            return [];
+        }
+
+        return \array_map(static function (Node\Param $parameterPassedByReference): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterPassedByReference->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Closure has parameter $%s that is passed by reference.',
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterPassedByReference()->toString())
+                ->build();
+        }, $parametersPassedByReference);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Closures;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Closure>
+ */
+final class NoParameterWithNullDefaultValueRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Expr\Closure::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullDefaultValue = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->hasNullDefaultValue($parameter);
+        }));
+
+        if (0 === \count($parametersWithNullDefaultValue)) {
+            return [];
+        }
+
+        return \array_map(static function (Node\Param $parameterWithNullDefaultValue): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullDefaultValue->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Closure has parameter $%s with null as default value.',
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullDefaultValue()->toString())
+                ->build();
+        }, $parametersWithNullDefaultValue);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Closures;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Closure>
+ */
+final class NoParameterWithNullableTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Expr\Closure::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullableTypeDeclaration = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->isNullableTypeDeclaration($parameter->type);
+        }));
+
+        if (0 === \count($parametersWithNullableTypeDeclaration)) {
+            return [];
+        }
+
+        return \array_map(static function (Node\Param $parameterWithNullableTypeDeclaration): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullableTypeDeclaration->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Closure has parameter $%s with a nullable type declaration.',
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullableTypeDeclaration()->toString())
+                ->build();
+        }, $parametersWithNullableTypeDeclaration);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,130 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules;
+
+/**
+ * @internale
+ */
+final class ErrorIdentifier
+{
+    private string $value;
+
+    private function __construct(string $value)
+    {
+        $this->value = $value;
+    }
+
+    public static function declareStrictTypes(): self
+    {
+        return new self('declareStrictTypes');
+    }
+
+    public static function final(): self
+    {
+        return new self('final');
+    }
+
+    public static function finalInAbstractClass(): self
+    {
+        return new self('finalInAbstractClass');
+    }
+
+    public static function noCompact(): self
+    {
+        return new self('noCompact');
+    }
+
+    public static function noConstructorParameterWithDefaultValue(): self
+    {
+        return new self('noConstructorParameterWithDefaultValue');
+    }
+
+    public static function noAssignByReference(): self
+    {
+        return new self('noAssignByReference');
+    }
+
+    public static function noErrorSuppression(): self
+    {
+        return new self('noErrorSuppression');
+    }
+
+    public static function noEval(): self
+    {
+        return new self('noEval');
+    }
+
+    public static function noExtends(): self
+    {
+        return new self('noExtends');
+    }
+
+    public static function noIsset(): self
+    {
+        return new self('noIsset');
+    }
+
+    public static function noParameterPassedByReference(): self
+    {
+        return new self('noParameterPassedByReference');
+    }
+
+    public static function noParameterWithContainerTypeDeclaration(): self
+    {
+        return new self('noParameterWithContainerTypeDeclaration');
+    }
+
+    public static function noParameterWithNullDefaultValue(): self
+    {
+        return new self('noParameterWithNullDefaultValue');
+    }
+
+    public static function noParameterWithNullableTypeDeclaration(): self
+    {
+        return new self('noParameterWithNullableTypeDeclaration');
+    }
+
+    public static function noNullableReturnTypeDeclaration(): self
+    {
+        return new self('noNullableReturnTypeDeclaration');
+    }
+
+    public static function noReturnByReference(): self
+    {
+        return new self('noReturnByReference');
+    }
+
+    public static function noSwitch(): self
+    {
+        return new self('noSwitch');
+    }
+
+    public static function privateInFinalClass(): self
+    {
+        return new self('privateInFinalClass');
+    }
+
+    public static function testCaseWithSuffix(): self
+    {
+        return new self('testCaseWithSuffix');
+    }
+
+    public function toString(): string
+    {
+        return \sprintf(
+            'ergebnis.%s',
+            $this->value,
+        );
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Expressions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\AssignRef>
+ */
+final class NoAssignByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\AssignRef::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        return [
+            Rules\RuleErrorBuilder::message('Assign by reference should not be used.')
+                ->identifier(ErrorIdentifier::noAssignByReference()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,49 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Expressions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\FuncCall>
+ */
+final class NoCompactRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\FuncCall::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!$node->name instanceof Node\Name) {
+            return [];
+        }
+
+        if ('compact' !== \mb_strtolower($scope->resolveName($node->name))) {
+            return [];
+        }
+
+        return [
+            Rules\RuleErrorBuilder::message('Function compact() should not be used.')
+                ->identifier(ErrorIdentifier::noCompact()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Expressions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\ErrorSuppress>
+ */
+final class NoErrorSuppressionRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\ErrorSuppress::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        return [
+            Rules\RuleErrorBuilder::message('Error suppression via "@" should not be used.')
+                ->identifier(ErrorIdentifier::noErrorSuppression()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Expressions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Eval_>
+ */
+final class NoEvalRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\Eval_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        return [
+            Rules\RuleErrorBuilder::message('Language construct eval() should not be used.')
+                ->identifier(ErrorIdentifier::noEval()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Expressions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Expr\Isset_>
+ */
+final class NoIssetRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Expr\Isset_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        return [
+            Rules\RuleErrorBuilder::message('Language construct isset() should not be used.')
+                ->identifier(ErrorIdentifier::noIsset()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,70 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Files;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Node\FileNode;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<FileNode>
+ */
+final class DeclareStrictTypesRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return FileNode::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        $nodes = $node->getNodes();
+
+        if (0 === \count($nodes)) {
+            return [];
+        }
+
+        $firstNode = \array_shift($nodes);
+
+        if (
+            $firstNode instanceof Node\Stmt\InlineHTML
+            && 2 === $firstNode->getEndLine()
+            && 0 === \mb_strpos($firstNode->value, '#!')
+        ) {
+            $firstNode = \array_shift($nodes);
+        }
+
+        if ($firstNode instanceof Node\Stmt\Declare_) {
+            foreach ($firstNode->declares as $declare) {
+                if (
+                    'strict_types' === $declare->key->toLowerString()
+                    && $declare->value instanceof Node\Scalar\LNumber
+                    && 1 === $declare->value->value
+                ) {
+                    return [];
+                }
+            }
+        }
+
+        return [
+            Rules\RuleErrorBuilder::message('File is missing a "declare(strict_types=1)" declaration.')
+                ->identifier(ErrorIdentifier::declareStrictTypes()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,62 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Functions;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Function_>
+ */
+final class NoNullableReturnTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Function_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!isset($node->namespacedName)) {
+            return [];
+        }
+
+        if (!$this->analyzer->isNullableTypeDeclaration($node->getReturnType())) {
+            return [];
+        }
+
+        $message = \sprintf(
+            'Function %s() has a nullable return type declaration.',
+            $node->namespacedName->toString(),
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noNullableReturnTypeDeclaration()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,67 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Functions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Function_>
+ */
+final class NoParameterPassedByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Function_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersPassedByReference = \array_values(\array_filter($node->params, static function (Node\Param $parameter): bool {
+            return $parameter->byRef;
+        }));
+
+        if (0 === \count($parametersPassedByReference)) {
+            return [];
+        }
+
+        $functionName = $node->namespacedName;
+
+        return \array_map(static function (Node\Param $parameterPassedByReference) use ($functionName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterPassedByReference->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Function %s() has parameter $%s that is passed by reference.',
+                $functionName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullDefaultValue()->toString())
+                ->build();
+        }, $parametersPassedByReference);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,75 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Functions;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Function_>
+ */
+final class NoParameterWithNullDefaultValueRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Function_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullDefaultValue = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->hasNullDefaultValue($parameter);
+        }));
+
+        if (0 === \count($parametersWithNullDefaultValue)) {
+            return [];
+        }
+
+        $functionName = $node->namespacedName;
+
+        return \array_map(static function (Node\Param $parameterWithNullDefaultValue) use ($functionName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullDefaultValue->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Function %s() has parameter $%s with null as default value.',
+                $functionName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullDefaultValue()->toString())
+                ->build();
+        }, $parametersWithNullDefaultValue);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,75 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Functions;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Function_>
+ */
+final class NoParameterWithNullableTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Function_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullableTypeDeclaration = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->isNullableTypeDeclaration($parameter->type);
+        }));
+
+        if (0 === \count($parametersWithNullableTypeDeclaration)) {
+            return [];
+        }
+
+        $functionName = $node->namespacedName;
+
+        return \array_map(static function (Node\Param $parameterWithNullableTypeDeclaration) use ($functionName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullableTypeDeclaration->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Function %s() has parameter $%s with a nullable type declaration.',
+                $functionName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullableTypeDeclaration()->toString())
+                ->build();
+        }, $parametersWithNullableTypeDeclaration);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Functions;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Function_>
+ */
+final class NoReturnByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Function_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (false === $node->byRef) {
+            return [];
+        }
+
+        $message = \sprintf(
+            'Function %s() returns by reference.',
+            $node->namespacedName,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noReturnByReference()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,123 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\PhpDoc;
+use PHPStan\PhpDocParser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class FinalInAbstractClassRule implements Rules\Rule
+{
+    private const DOCTRINE_ATTRIBUTE_NAMES = [
+        'Doctrine\\ORM\\Mapping\\Embeddable',
+        'Doctrine\\ORM\\Mapping\\Entity',
+    ];
+    private const DOCTRINE_TAG_NAMES = [
+        '@ORM\\Mapping\\Embeddable',
+        '@ORM\\Embeddable',
+        '@Embeddable',
+        '@ORM\\Mapping\\Entity',
+        '@ORM\\Entity',
+        '@Entity',
+    ];
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        /** @var Reflection\ClassReflection $containingClass */
+        $containingClass = $scope->getClassReflection();
+
+        if (self::isDoctrineEntity($containingClass)) {
+            return [];
+        }
+
+        if (!$containingClass->isAbstract()) {
+            return [];
+        }
+
+        if ($containingClass->isInterface()) {
+            return [];
+        }
+
+        if ($node->isAbstract()) {
+            return [];
+        }
+
+        if ($node->isFinal()) {
+            return [];
+        }
+
+        if ($node->isPrivate()) {
+            return [];
+        }
+
+        if ('__construct' === $node->name->name) {
+            return [];
+        }
+
+        $message = \sprintf(
+            'Method %s::%s() is not final, but since the containing class is abstract, it should be.',
+            $containingClass->getName(),
+            $node->name->toString(),
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::finalInAbstractClass()->toString())
+                ->build(),
+        ];
+    }
+
+    private static function isDoctrineEntity(Reflection\ClassReflection $containingClass): bool
+    {
+        $attributes = $containingClass->getNativeReflection()->getAttributes();
+
+        foreach ($attributes as $attribute) {
+            if (\in_array($attribute->getName(), self::DOCTRINE_ATTRIBUTE_NAMES, true)) {
+                return true;
+            }
+        }
+
+        $resolvedPhpDocBlock = $containingClass->getResolvedPhpDoc();
+
+        if ($resolvedPhpDocBlock instanceof PhpDoc\ResolvedPhpDocBlock) {
+            foreach ($resolvedPhpDocBlock->getPhpDocNodes() as $phpDocNode) {
+                foreach ($phpDocNode->children as $child) {
+                    if (!$child instanceof PhpDocParser\Ast\PhpDoc\PhpDocTagNode) {
+                        continue;
+                    }
+
+                    if (\in_array($child->name, self::DOCTRINE_TAG_NAMES, true)) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,99 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoConstructorParameterWithDefaultValueRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if ('__construct' !== $node->name->toLowerString()) {
+            return [];
+        }
+
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithDefaultValue = \array_values(\array_filter($node->params, static function (Node\Param $parameter): bool {
+            return self::hasDefaultValue($parameter);
+        }));
+
+        if (0 === \count($parametersWithDefaultValue)) {
+            return [];
+        }
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            return \array_map(static function (Node\Param $parameterWithDefaultValue): Rules\RuleError {
+                /** @var Node\Expr\Variable $variable */
+                $variable = $parameterWithDefaultValue->var;
+
+                /** @var string $parameterName */
+                $parameterName = $variable->name;
+
+                $message = \sprintf(
+                    'Constructor in anonymous class has parameter $%s with default value.',
+                    $parameterName,
+                );
+
+                return Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noConstructorParameterWithDefaultValue()->toString())
+                    ->build();
+            }, $parametersWithDefaultValue);
+        }
+
+        $className = $classReflection->getName();
+
+        return \array_map(static function (Node\Param $parameterWithDefaultValue) use ($className): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithDefaultValue->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Constructor in %s has parameter $%s with default value.',
+                $className,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noConstructorParameterWithDefaultValue()->toString())
+                ->build();
+        }, $parametersWithDefaultValue);
+    }
+
+    private static function hasDefaultValue(Node\Param $parameter): bool
+    {
+        return null !== $parameter->default;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,76 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoNullableReturnTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (!$this->analyzer->isNullableTypeDeclaration($node->getReturnType())) {
+            return [];
+        }
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            $message = \sprintf(
+                'Method %s() in anonymous class has a nullable return type declaration.',
+                $node->name->name,
+            );
+
+            return [
+                Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noNullableReturnTypeDeclaration()->toString())
+                    ->build(),
+            ];
+        }
+
+        $message = \sprintf(
+            'Method %s::%s() has a nullable return type declaration.',
+            $classReflection->getName(),
+            $node->name->name,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noNullableReturnTypeDeclaration()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,94 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoParameterPassedByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersExplicitlyPassedByReference = \array_values(\array_filter($node->params, static function (Node\Param $parameter): bool {
+            return $parameter->byRef;
+        }));
+
+        if (0 === \count($parametersExplicitlyPassedByReference)) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            return \array_map(static function (Node\Param $parameterExplicitlyPassedByReference) use ($methodName): Rules\RuleError {
+                /** @var Node\Expr\Variable $variable */
+                $variable = $parameterExplicitlyPassedByReference->var;
+
+                /** @var string $parameterName */
+                $parameterName = $variable->name;
+
+                $message = \sprintf(
+                    'Method %s() in anonymous class has parameter $%s that is passed by reference.',
+                    $methodName,
+                    $parameterName,
+                );
+
+                return Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noParameterPassedByReference()->toString())
+                    ->build();
+            }, $parametersExplicitlyPassedByReference);
+        }
+
+        $className = $classReflection->getName();
+
+        return \array_map(static function (Node\Param $parameterExplicitlyPassedByReference) use ($className, $methodName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterExplicitlyPassedByReference->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Method %s::%s() has parameter $%s that is passed by reference.',
+                $className,
+                $methodName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterPassedByReference()->toString())
+                ->build();
+        }, $parametersExplicitlyPassedByReference);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,179 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoParameterWithContainerTypeDeclarationRule implements Rules\Rule
+{
+    private Reflection\ReflectionProvider $reflectionProvider;
+
+    /**
+     * @var list<string>
+     */
+    private array $interfacesImplementedByContainers;
+
+    /**
+     * @var list<string>
+     */
+    private array $methodsAllowedToUseContainerTypeDeclarations;
+
+    /**
+     * @param list<string> $interfacesImplementedByContainers
+     * @param list<string> $methodsAllowedToUseContainerTypeDeclarations
+     */
+    public function __construct(
+        Reflection\ReflectionProvider $reflectionProvider,
+        array $interfacesImplementedByContainers,
+        array $methodsAllowedToUseContainerTypeDeclarations
+    ) {
+        $this->reflectionProvider = $reflectionProvider;
+        $this->interfacesImplementedByContainers = \array_values(\array_filter(
+            \array_map(static function (string $interfaceImplementedByContainers): string {
+                return $interfaceImplementedByContainers;
+            }, $interfacesImplementedByContainers),
+            static function (string $interfaceImplementedByContainer): bool {
+                return \interface_exists($interfaceImplementedByContainer);
+            },
+        ));
+        $this->methodsAllowedToUseContainerTypeDeclarations = $methodsAllowedToUseContainerTypeDeclarations;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($this->interfacesImplementedByContainers)) {
+            return [];
+        }
+
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        if (\in_array($methodName, $this->methodsAllowedToUseContainerTypeDeclarations, true)) {
+            return [];
+        }
+
+        /** @var Reflection\ClassReflection $containingClass */
+        $containingClass = $scope->getClassReflection();
+
+        return \array_values(\array_reduce(
+            $node->params,
+            function (array $errors, Node\Param $node) use ($scope, $containingClass, $methodName): array {
+                $type = $node->type;
+
+                if (!$type instanceof Node\Name) {
+                    return $errors;
+                }
+
+                /** @var Node\Expr\Variable $variable */
+                $variable = $node->var;
+
+                /** @var string $parameterName */
+                $parameterName = $variable->name;
+
+                $classUsedInTypeDeclaration = $this->reflectionProvider->getClass($scope->resolveName($type));
+
+                if ($classUsedInTypeDeclaration->isInterface()) {
+                    foreach ($this->interfacesImplementedByContainers as $interfaceImplementedByContainer) {
+                        if ($classUsedInTypeDeclaration->getName() === $interfaceImplementedByContainer) {
+                            $errors[] = self::createError(
+                                $containingClass,
+                                $methodName,
+                                $parameterName,
+                                $classUsedInTypeDeclaration,
+                            );
+
+                            return $errors;
+                        }
+
+                        if ($classUsedInTypeDeclaration->getNativeReflection()->isSubclassOf($interfaceImplementedByContainer)) {
+                            $errors[] = self::createError(
+                                $containingClass,
+                                $methodName,
+                                $parameterName,
+                                $classUsedInTypeDeclaration,
+                            );
+
+                            return $errors;
+                        }
+                    }
+                }
+
+                foreach ($this->interfacesImplementedByContainers as $interfaceImplementedByContainer) {
+                    if ($classUsedInTypeDeclaration->getNativeReflection()->implementsInterface($interfaceImplementedByContainer)) {
+                        $errors[] = self::createError(
+                            $containingClass,
+                            $methodName,
+                            $parameterName,
+                            $classUsedInTypeDeclaration,
+                        );
+
+                        return $errors;
+                    }
+                }
+
+                return $errors;
+            },
+            [],
+        ));
+    }
+
+    private static function createError(
+        Reflection\ClassReflection $classReflection,
+        string $methodName,
+        string $parameterName,
+        Reflection\ClassReflection $classUsedInTypeDeclaration
+    ): Rules\RuleError {
+        if ($classReflection->isAnonymous()) {
+            $message = \sprintf(
+                'Method %s() in anonymous class has a parameter $%s with a type declaration of %s, but containers should not be injected.',
+                $methodName,
+                $parameterName,
+                $classUsedInTypeDeclaration->getName(),
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithContainerTypeDeclaration()->toString())
+                ->build();
+        }
+
+        $message = \sprintf(
+            'Method %s::%s() has a parameter $%s with a type declaration of %s, but containers should not be injected.',
+            $classReflection->getName(),
+            $methodName,
+            $parameterName,
+            $classUsedInTypeDeclaration->getName(),
+        );
+
+        return Rules\RuleErrorBuilder::message($message)
+            ->identifier(ErrorIdentifier::noParameterWithContainerTypeDeclaration()->toString())
+            ->build();
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,102 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoParameterWithNullDefaultValueRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullDefaultValue = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->hasNullDefaultValue($parameter);
+        }));
+
+        if (0 === \count($parametersWithNullDefaultValue)) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            return \array_map(static function (Node\Param $parameterWithNullDefaultValue) use ($methodName): Rules\RuleError {
+                /** @var Node\Expr\Variable $variable */
+                $variable = $parameterWithNullDefaultValue->var;
+
+                /** @var string $parameterName */
+                $parameterName = $variable->name;
+
+                $message = \sprintf(
+                    'Method %s() in anonymous class has parameter $%s with null as default value.',
+                    $methodName,
+                    $parameterName,
+                );
+
+                return Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noParameterWithNullDefaultValue()->toString())
+                    ->build();
+            }, $parametersWithNullDefaultValue);
+        }
+
+        $className = $classReflection->getName();
+
+        return \array_map(static function (Node\Param $parameterWithNullDefaultValue) use ($className, $methodName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullDefaultValue->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Method %s::%s() has parameter $%s with null as default value.',
+                $className,
+                $methodName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullDefaultValue()->toString())
+                ->build();
+        }, $parametersWithNullDefaultValue);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,102 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\Analyzer;
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoParameterWithNullableTypeDeclarationRule implements Rules\Rule
+{
+    private Analyzer $analyzer;
+
+    public function __construct(Analyzer $analyzer)
+    {
+        $this->analyzer = $analyzer;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (0 === \count($node->params)) {
+            return [];
+        }
+
+        $parametersWithNullableTypeDeclaration = \array_values(\array_filter($node->params, function (Node\Param $parameter): bool {
+            return $this->analyzer->isNullableTypeDeclaration($parameter->type);
+        }));
+
+        if (0 === \count($parametersWithNullableTypeDeclaration)) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            return \array_map(static function (Node\Param $parameterWithNullableTypeDeclaration) use ($methodName): Rules\RuleError {
+                /** @var Node\Expr\Variable $variable */
+                $variable = $parameterWithNullableTypeDeclaration->var;
+
+                /** @var string $parameterName */
+                $parameterName = $variable->name;
+
+                $message = \sprintf(
+                    'Method %s() in anonymous class has parameter $%s with a nullable type declaration.',
+                    $methodName,
+                    $parameterName,
+                );
+
+                return Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noParameterWithNullableTypeDeclaration()->toString())
+                    ->build();
+            }, $parametersWithNullableTypeDeclaration);
+        }
+
+        $className = $classReflection->getName();
+
+        return \array_map(static function (Node\Param $parameterWithNullableTypeDeclaration) use ($className, $methodName): Rules\RuleError {
+            /** @var Node\Expr\Variable $variable */
+            $variable = $parameterWithNullableTypeDeclaration->var;
+
+            /** @var string $parameterName */
+            $parameterName = $variable->name;
+
+            $message = \sprintf(
+                'Method %s::%s() has parameter $%s with a nullable type declaration.',
+                $className,
+                $methodName,
+                $parameterName,
+            );
+
+            return Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noParameterWithNullableTypeDeclaration()->toString())
+                ->build();
+        }, $parametersWithNullableTypeDeclaration);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class NoReturnByReferenceRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        if (false === $node->byRef) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            $message = \sprintf(
+                'Method %s() in anonymous class returns by reference.',
+                $methodName,
+            );
+
+            return [
+                Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::noReturnByReference()->toString())
+                    ->build(),
+            ];
+        }
+
+        $className = $classReflection->getName();
+
+        $message = \sprintf(
+            'Method %s::%s() returns by reference.',
+            $className,
+            $methodName,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::noReturnByReference()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,198 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Methods;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Comment;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Reflection;
+use PHPStan\Rules;
+use PHPStan\Type;
+use PHPUnit\Framework;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\ClassMethod>
+ */
+final class PrivateInFinalClassRule implements Rules\Rule
+{
+    /**
+     * @var list<string>
+     */
+    private static array $whitelistedAnnotations = [
+        '@after',
+        '@before',
+        '@postCondition',
+        '@preCondition',
+    ];
+
+    /**
+     * @var list<class-string>
+     */
+    private static array $whitelistedAttributes = [
+        Framework\Attributes\After::class,
+        Framework\Attributes\Before::class,
+        Framework\Attributes\PostCondition::class,
+        Framework\Attributes\PreCondition::class,
+    ];
+    private Type\FileTypeMapper $fileTypeMapper;
+
+    public function __construct(Type\FileTypeMapper $fileTypeMapper)
+    {
+        $this->fileTypeMapper = $fileTypeMapper;
+    }
+
+    public function getNodeType(): string
+    {
+        return Node\Stmt\ClassMethod::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        /** @var Reflection\ClassReflection $containingClass */
+        $containingClass = $scope->getClassReflection();
+
+        if (!$containingClass->isFinal()) {
+            return [];
+        }
+
+        if ($node->isPublic()) {
+            return [];
+        }
+
+        if ($node->isPrivate()) {
+            return [];
+        }
+
+        if ($this->hasWhitelistedAnnotation($node, $containingClass)) {
+            return [];
+        }
+
+        if (self::hasWhitelistedAttribute($node)) {
+            return [];
+        }
+
+        $methodName = $node->name->toString();
+
+        if (self::isDeclaredByParentClass($containingClass, $methodName)) {
+            return [];
+        }
+
+        if (self::isDeclaredByTrait($containingClass, $methodName)) {
+            return [];
+        }
+
+        /** @var Reflection\ClassReflection $classReflection */
+        $classReflection = $scope->getClassReflection();
+
+        if ($classReflection->isAnonymous()) {
+            $message = \sprintf(
+                'Method %s() in anonymous class is protected, but since the containing class is final, it can be private.',
+                $node->name->name,
+            );
+
+            return [
+                Rules\RuleErrorBuilder::message($message)
+                    ->identifier(ErrorIdentifier::privateInFinalClass()->toString())
+                    ->build(),
+            ];
+        }
+
+        $message = \sprintf(
+            'Method %s::%s() is protected, but since the containing class is final, it can be private.',
+            $containingClass->getName(),
+            $methodName,
+        );
+
+        return [
+            Rules\RuleErrorBuilder::message($message)
+                ->identifier(ErrorIdentifier::privateInFinalClass()->toString())
+                ->build(),
+        ];
+    }
+
+    private function hasWhitelistedAnnotation(
+        Node\Stmt\ClassMethod $node,
+        Reflection\ClassReflection $containingClass
+    ): bool {
+        $docComment = $node->getDocComment();
+
+        if (!$docComment instanceof Comment\Doc) {
+            return false;
+        }
+
+        $resolvedPhpDoc = $this->fileTypeMapper->getResolvedPhpDoc(
+            null,
+            $containingClass->getName(),
+            null,
+            null,
+            $docComment->getText(),
+        );
+
+        foreach ($resolvedPhpDoc->getPhpDocNodes() as $phpDocNode) {
+            foreach ($phpDocNode->getTags() as $tag) {
+                if (\in_array($tag->name, self::$whitelistedAnnotations, true)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private static function hasWhitelistedAttribute(Node\Stmt\ClassMethod $node): bool
+    {
+        foreach ($node->attrGroups as $attributeGroup) {
+            foreach ($attributeGroup->attrs as $attribute) {
+                if (\in_array($attribute->name->toString(), self::$whitelistedAttributes, true)) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private static function isDeclaredByParentClass(
+        Reflection\ClassReflection $containingClass,
+        string $methodName
+    ): bool {
+        $parentClass = $containingClass->getNativeReflection()->getParentClass();
+
+        if (!$parentClass instanceof \ReflectionClass) {
+            return false;
+        }
+
+        if (!$parentClass->hasMethod($methodName)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    private static function isDeclaredByTrait(
+        Reflection\ClassReflection $containingClass,
+        string $methodName
+    ): bool {
+        foreach ($containingClass->getTraits() as $trait) {
+            if ($trait->hasMethod($methodName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php
--- 7.0.0-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,41 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * Copyright (c) 2018-2025 Andreas Möller
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE.md file that was distributed with this source code.
+ *
+ * @see https://github.com/ergebnis/phpstan-rules
+ */
+
+namespace Ergebnis\PHPStan\Rules\Statements;
+
+use Ergebnis\PHPStan\Rules\ErrorIdentifier;
+use PhpParser\Node;
+use PHPStan\Analyser;
+use PHPStan\Rules;
+
+/**
+ * @implements Rules\Rule<Node\Stmt\Switch_>
+ */
+final class NoSwitchRule implements Rules\Rule
+{
+    public function getNodeType(): string
+    {
+        return Node\Stmt\Switch_::class;
+    }
+
+    public function processNode(
+        Node $node,
+        Analyser\Scope $scope
+    ): array {
+        return [
+            Rules\RuleErrorBuilder::message('Control structures using switch should not be used.')
+                ->identifier(ErrorIdentifier::noSwitch()->toString())
+                ->build(),
+        ];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,13 @@
+<?php
+
+declare(strict_types=1);
+
+namespace PHPSTORM_META;
+
+override(\Nette\Utils\Arrays::get(0), elementType(0));
+override(\Nette\Utils\Arrays::getRef(0), elementType(0));
+override(\Nette\Utils\Arrays::grep(0), type(0));
+override(\Nette\Utils\Arrays::toObject(0), type(1));
+
+expectedArguments(\Nette\Utils\Image::resize(), 2, \Nette\Utils\Image::ShrinkOnly, \Nette\Utils\Image::Stretch, \Nette\Utils\Image::OrSmaller, \Nette\Utils\Image::OrBigger, \Nette\Utils\Image::Cover);
+expectedArguments(\Nette\Utils\Image::calculateSize(), 4, \Nette\Utils\Image::ShrinkOnly, \Nette\Utils\Image::Stretch, \Nette\Utils\Image::OrSmaller, \Nette\Utils\Image::OrBigger, \Nette\Utils\Image::Cover);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/composer.json 7.0.1-1/tools/.phpstan/vendor/nette/utils/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,51 @@
+{
+	"name": "nette/utils",
+	"description": "🛠  Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
+	"keywords": ["nette", "images", "json", "password", "validation", "utility", "string", "array", "core", "slugify", "utf-8", "unicode", "paginator", "datetime"],
+	"homepage": "https://nette.org",
+	"license": ["BSD-3-Clause", "GPL-2.0-only", "GPL-3.0-only"],
+	"authors": [
+		{
+			"name": "David Grudl",
+			"homepage": "https://davidgrudl.com"
+		},
+		{
+			"name": "Nette Community",
+			"homepage": "https://nette.org/contributors"
+		}
+	],
+	"require": {
+		"php": "8.0 - 8.4"
+	},
+	"require-dev": {
+		"nette/tester": "^2.5",
+		"tracy/tracy": "^2.9",
+		"phpstan/phpstan": "^1.0",
+		"jetbrains/phpstorm-attributes": "dev-master"
+	},
+	"conflict": {
+		"nette/finder": "<3",
+		"nette/schema": "<1.2.2"
+	},
+	"suggest": {
+		"ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
+		"ext-json": "to use Nette\\Utils\\Json",
+		"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
+		"ext-mbstring": "to use Strings::lower() etc...",
+		"ext-gd": "to use Image",
+		"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()"
+	},
+	"autoload": {
+		"classmap": ["src/"]
+	},
+	"minimum-stability": "dev",
+	"scripts": {
+		"phpstan": "phpstan analyse",
+		"tester": "tester tests -s"
+	},
+	"extra": {
+		"branch-alias": {
+			"dev-master": "4.0-dev"
+		}
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/license.md 7.0.1-1/tools/.phpstan/vendor/nette/utils/license.md
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/license.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/license.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,60 @@
+Licenses
+========
+
+Good news! You may use Nette Framework under the terms of either
+the New BSD License or the GNU General Public License (GPL) version 2 or 3.
+
+The BSD License is recommended for most projects. It is easy to understand and it
+places almost no restrictions on what you can do with the framework. If the GPL
+fits better to your project, you can use the framework under this license.
+
+You don't have to notify anyone which license you are using. You can freely
+use Nette Framework in commercial projects as long as the copyright header
+remains intact.
+
+Please be advised that the name "Nette Framework" is a protected trademark and its
+usage has some limitations. So please do not use word "Nette" in the name of your
+project or top-level domain, and choose a name that stands on its own merits.
+If your stuff is good, it will not take long to establish a reputation for yourselves.
+
+
+New BSD License
+---------------
+
+Copyright (c) 2004, 2014 David Grudl (https://davidgrudl.com)
+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 "Nette Framework" 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 owner or 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.
+
+
+GNU General Public License
+--------------------------
+
+GPL licenses are very very long, so instead of including them here we offer
+you URLs with full text:
+
+- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html)
+- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html)
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/readme.md 7.0.1-1/tools/.phpstan/vendor/nette/utils/readme.md
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/readme.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/readme.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,55 @@
+[![Nette Utils](https://github.com/nette/utils/assets/194960/c33fdb74-0652-4cad-ac6e-c1ce0d29e32a)](https://doc.nette.org/en/utils)
+
+[![Downloads this Month](https://img.shields.io/packagist/dm/nette/utils.svg)](https://packagist.org/packages/nette/utils)
+[![Tests](https://github.com/nette/utils/workflows/Tests/badge.svg?branch=master)](https://github.com/nette/utils/actions)
+[![Coverage Status](https://coveralls.io/repos/github/nette/utils/badge.svg?branch=master)](https://coveralls.io/github/nette/utils?branch=master)
+[![Latest Stable Version](https://poser.pugx.org/nette/utils/v/stable)](https://github.com/nette/utils/releases)
+[![License](https://img.shields.io/badge/license-New%20BSD-blue.svg)](https://github.com/nette/utils/blob/master/license.md)
+
+
+Introduction
+------------
+
+In package nette/utils you will find a set of useful classes for everyday use:
+
+✅ [Arrays](https://doc.nette.org/utils/arrays)<br>
+✅ [Callback](https://doc.nette.org/utils/callback) - PHP callbacks<br>
+✅ [Filesystem](https://doc.nette.org/utils/filesystem) - copying, renaming, …<br>
+✅ [Finder](https://doc.nette.org/utils/finder) - finds files and directories<br>
+✅ [Floats](https://doc.nette.org/utils/floats) - floating point numbers<br>
+✅ [Helper Functions](https://doc.nette.org/utils/helpers)<br>
+✅ [HTML elements](https://doc.nette.org/utils/html-elements) - generate HTML<br>
+✅ [Images](https://doc.nette.org/utils/images) - crop, resize, rotate images<br>
+✅ [Iterables](https://doc.nette.org/utils/iterables) <br>
+✅ [JSON](https://doc.nette.org/utils/json) - encoding and decoding<br>
+✅ [Generating Random Strings](https://doc.nette.org/utils/random)<br>
+✅ [Paginator](https://doc.nette.org/utils/paginator) - pagination math<br>
+✅ [PHP Reflection](https://doc.nette.org/utils/reflection)<br>
+✅ [Strings](https://doc.nette.org/utils/strings) - useful text functions<br>
+✅ [SmartObject](https://doc.nette.org/utils/smartobject) - PHP object enhancements<br>
+✅ [Type](https://doc.nette.org/utils/type) - PHP data type<br>
+✅ [Validation](https://doc.nette.org/utils/validators) - validate inputs<br>
+
+ <!---->
+
+Installation
+------------
+
+The recommended way to install is via Composer:
+
+```
+composer require nette/utils
+```
+
+Nette Utils 4.0 is compatible with PHP 8.0 to 8.4.
+
+ <!---->
+
+[Support Me](https://github.com/sponsors/dg)
+--------------------------------------------
+
+Do you like Nette Utils? Are you looking forward to the new features?
+
+[![Buy me a coffee](https://files.nette.org/icons/donation-3.svg)](https://github.com/sponsors/dg)
+
+Thank you!
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette;
+
+
+interface HtmlStringable
+{
+	/**
+	 * Returns string in HTML format
+	 */
+	function __toString(): string;
+}
+
+
+interface_exists(Utils\IHtmlString::class);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,150 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Iterators;
+
+use Nette;
+
+
+/**
+ * Smarter caching iterator.
+ *
+ * @property-read bool $first
+ * @property-read bool $last
+ * @property-read bool $empty
+ * @property-read bool $odd
+ * @property-read bool $even
+ * @property-read int $counter
+ * @property-read mixed $nextKey
+ * @property-read mixed $nextValue
+ */
+class CachingIterator extends \CachingIterator implements \Countable
+{
+	use Nette\SmartObject;
+
+	private int $counter = 0;
+
+
+	public function __construct(iterable|\stdClass $iterable)
+	{
+		$iterable = $iterable instanceof \stdClass
+			? new \ArrayIterator($iterable)
+			: Nette\Utils\Iterables::toIterator($iterable);
+		parent::__construct($iterable, 0);
+	}
+
+
+	/**
+	 * Is the current element the first one?
+	 */
+	public function isFirst(?int $gridWidth = null): bool
+	{
+		return $this->counter === 1 || ($gridWidth && $this->counter !== 0 && (($this->counter - 1) % $gridWidth) === 0);
+	}
+
+
+	/**
+	 * Is the current element the last one?
+	 */
+	public function isLast(?int $gridWidth = null): bool
+	{
+		return !$this->hasNext() || ($gridWidth && ($this->counter % $gridWidth) === 0);
+	}
+
+
+	/**
+	 * Is the iterator empty?
+	 */
+	public function isEmpty(): bool
+	{
+		return $this->counter === 0;
+	}
+
+
+	/**
+	 * Is the counter odd?
+	 */
+	public function isOdd(): bool
+	{
+		return $this->counter % 2 === 1;
+	}
+
+
+	/**
+	 * Is the counter even?
+	 */
+	public function isEven(): bool
+	{
+		return $this->counter % 2 === 0;
+	}
+
+
+	/**
+	 * Returns the counter.
+	 */
+	public function getCounter(): int
+	{
+		return $this->counter;
+	}
+
+
+	/**
+	 * Returns the count of elements.
+	 */
+	public function count(): int
+	{
+		$inner = $this->getInnerIterator();
+		if ($inner instanceof \Countable) {
+			return $inner->count();
+
+		} else {
+			throw new Nette\NotSupportedException('Iterator is not countable.');
+		}
+	}
+
+
+	/**
+	 * Forwards to the next element.
+	 */
+	public function next(): void
+	{
+		parent::next();
+		if (parent::valid()) {
+			$this->counter++;
+		}
+	}
+
+
+	/**
+	 * Rewinds the Iterator.
+	 */
+	public function rewind(): void
+	{
+		parent::rewind();
+		$this->counter = parent::valid() ? 1 : 0;
+	}
+
+
+	/**
+	 * Returns the next key.
+	 */
+	public function getNextKey(): mixed
+	{
+		return $this->getInnerIterator()->key();
+	}
+
+
+	/**
+	 * Returns the next element.
+	 */
+	public function getNextValue(): mixed
+	{
+		return $this->getInnerIterator()->current();
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Iterators;
+
+
+/**
+ * @deprecated use Nette\Utils\Iterables::map()
+ */
+class Mapper extends \IteratorIterator
+{
+	/** @var callable */
+	private $callback;
+
+
+	public function __construct(\Traversable $iterator, callable $callback)
+	{
+		parent::__construct($iterator);
+		$this->callback = $callback;
+	}
+
+
+	public function current(): mixed
+	{
+		return ($this->callback)(parent::current(), parent::key());
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/SmartObject.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/SmartObject.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/SmartObject.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/SmartObject.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette;
+
+use Nette\Utils\ObjectHelpers;
+
+
+/**
+ * Strict class for better experience.
+ * - 'did you mean' hints
+ * - access to undeclared members throws exceptions
+ * - support for @property annotations
+ * - support for calling event handlers stored in $onEvent via onEvent()
+ */
+trait SmartObject
+{
+	/**
+	 * @return mixed
+	 * @throws MemberAccessException
+	 */
+	public function __call(string $name, array $args)
+	{
+		$class = static::class;
+
+		if (ObjectHelpers::hasProperty($class, $name) === 'event') { // calling event handlers
+			$handlers = $this->$name ?? null;
+			if (is_iterable($handlers)) {
+				foreach ($handlers as $handler) {
+					$handler(...$args);
+				}
+			} elseif ($handlers !== null) {
+				throw new UnexpectedValueException("Property $class::$$name must be iterable or null, " . get_debug_type($handlers) . ' given.');
+			}
+
+			return null;
+		}
+
+		ObjectHelpers::strictCall($class, $name);
+	}
+
+
+	/**
+	 * @throws MemberAccessException
+	 */
+	public static function __callStatic(string $name, array $args)
+	{
+		ObjectHelpers::strictStaticCall(static::class, $name);
+	}
+
+
+	/**
+	 * @return mixed
+	 * @throws MemberAccessException if the property is not defined.
+	 */
+	public function &__get(string $name)
+	{
+		$class = static::class;
+
+		if ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { // property getter
+			if (!($prop & 0b0001)) {
+				throw new MemberAccessException("Cannot read a write-only property $class::\$$name.");
+			}
+
+			$m = ($prop & 0b0010 ? 'get' : 'is') . ucfirst($name);
+			if ($prop & 0b10000) {
+				$trace = debug_backtrace(0, 1)[0]; // suppose this method is called from __call()
+				$loc = isset($trace['file'], $trace['line'])
+					? " in $trace[file] on line $trace[line]"
+					: '';
+				trigger_error("Property $class::\$$name is deprecated, use $class::$m() method$loc.", E_USER_DEPRECATED);
+			}
+
+			if ($prop & 0b0100) { // return by reference
+				return $this->$m();
+			} else {
+				$val = $this->$m();
+				return $val;
+			}
+		} else {
+			ObjectHelpers::strictGet($class, $name);
+		}
+	}
+
+
+	/**
+	 * @throws MemberAccessException if the property is not defined or is read-only
+	 */
+	public function __set(string $name, mixed $value): void
+	{
+		$class = static::class;
+
+		if (ObjectHelpers::hasProperty($class, $name)) { // unsetted property
+			$this->$name = $value;
+
+		} elseif ($prop = ObjectHelpers::getMagicProperties($class)[$name] ?? null) { // property setter
+			if (!($prop & 0b1000)) {
+				throw new MemberAccessException("Cannot write to a read-only property $class::\$$name.");
+			}
+
+			$m = 'set' . ucfirst($name);
+			if ($prop & 0b10000) {
+				$trace = debug_backtrace(0, 1)[0]; // suppose this method is called from __call()
+				$loc = isset($trace['file'], $trace['line'])
+					? " in $trace[file] on line $trace[line]"
+					: '';
+				trigger_error("Property $class::\$$name is deprecated, use $class::$m() method$loc.", E_USER_DEPRECATED);
+			}
+
+			$this->$m($value);
+
+		} else {
+			ObjectHelpers::strictSet($class, $name);
+		}
+	}
+
+
+	/**
+	 * @throws MemberAccessException
+	 */
+	public function __unset(string $name): void
+	{
+		$class = static::class;
+		if (!ObjectHelpers::hasProperty($class, $name)) {
+			throw new MemberAccessException("Cannot unset the property $class::\$$name.");
+		}
+	}
+
+
+	public function __isset(string $name): bool
+	{
+		return isset(ObjectHelpers::getMagicProperties(static::class)[$name]);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/StaticClass.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/StaticClass.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/StaticClass.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/StaticClass.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette;
+
+
+/**
+ * Static class.
+ */
+trait StaticClass
+{
+	/**
+	 * Class is static and cannot be instantiated.
+	 */
+	private function __construct()
+	{
+	}
+
+
+	/**
+	 * Call to undefined static method.
+	 * @throws MemberAccessException
+	 */
+	public static function __callStatic(string $name, array $args): mixed
+	{
+		Utils\ObjectHelpers::strictStaticCall(static::class, $name);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Translator.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Translator.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Translator.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Translator.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Localization;
+
+
+/**
+ * Translator adapter.
+ */
+interface Translator
+{
+	/**
+	 * Translates the given string.
+	 */
+	function translate(string|\Stringable $message, mixed ...$parameters): string|\Stringable;
+}
+
+
+interface_exists(ITranslator::class);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Provides objects to work as array.
+ * @template T
+ * @implements \IteratorAggregate<array-key, T>
+ * @implements \ArrayAccess<array-key, T>
+ */
+class ArrayHash extends \stdClass implements \ArrayAccess, \Countable, \IteratorAggregate
+{
+	/**
+	 * Transforms array to ArrayHash.
+	 * @param  array<T>  $array
+	 */
+	public static function from(array $array, bool $recursive = true): static
+	{
+		$obj = new static;
+		foreach ($array as $key => $value) {
+			$obj->$key = $recursive && is_array($value)
+				? static::from($value)
+				: $value;
+		}
+
+		return $obj;
+	}
+
+
+	/**
+	 * Returns an iterator over all items.
+	 * @return \Iterator<array-key, T>
+	 */
+	public function &getIterator(): \Iterator
+	{
+		foreach ((array) $this as $key => $foo) {
+			yield $key => $this->$key;
+		}
+	}
+
+
+	/**
+	 * Returns items count.
+	 */
+	public function count(): int
+	{
+		return count((array) $this);
+	}
+
+
+	/**
+	 * Replaces or appends a item.
+	 * @param  array-key  $key
+	 * @param  T  $value
+	 */
+	public function offsetSet($key, $value): void
+	{
+		if (!is_scalar($key)) { // prevents null
+			throw new Nette\InvalidArgumentException(sprintf('Key must be either a string or an integer, %s given.', get_debug_type($key)));
+		}
+
+		$this->$key = $value;
+	}
+
+
+	/**
+	 * Returns a item.
+	 * @param  array-key  $key
+	 * @return T
+	 */
+	#[\ReturnTypeWillChange]
+	public function offsetGet($key)
+	{
+		return $this->$key;
+	}
+
+
+	/**
+	 * Determines whether a item exists.
+	 * @param  array-key  $key
+	 */
+	public function offsetExists($key): bool
+	{
+		return isset($this->$key);
+	}
+
+
+	/**
+	 * Removes the element from this list.
+	 * @param  array-key  $key
+	 */
+	public function offsetUnset($key): void
+	{
+		unset($this->$key);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,136 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Provides the base class for a generic list (items can be accessed by index).
+ * @template T
+ * @implements \IteratorAggregate<int, T>
+ * @implements \ArrayAccess<int, T>
+ */
+class ArrayList implements \ArrayAccess, \Countable, \IteratorAggregate
+{
+	use Nette\SmartObject;
+
+	private array $list = [];
+
+
+	/**
+	 * Transforms array to ArrayList.
+	 * @param  list<T>  $array
+	 */
+	public static function from(array $array): static
+	{
+		if (!Arrays::isList($array)) {
+			throw new Nette\InvalidArgumentException('Array is not valid list.');
+		}
+
+		$obj = new static;
+		$obj->list = $array;
+		return $obj;
+	}
+
+
+	/**
+	 * Returns an iterator over all items.
+	 * @return \Iterator<int, T>
+	 */
+	public function &getIterator(): \Iterator
+	{
+		foreach ($this->list as &$item) {
+			yield $item;
+		}
+	}
+
+
+	/**
+	 * Returns items count.
+	 */
+	public function count(): int
+	{
+		return count($this->list);
+	}
+
+
+	/**
+	 * Replaces or appends a item.
+	 * @param  int|null  $index
+	 * @param  T  $value
+	 * @throws Nette\OutOfRangeException
+	 */
+	public function offsetSet($index, $value): void
+	{
+		if ($index === null) {
+			$this->list[] = $value;
+
+		} elseif (!is_int($index) || $index < 0 || $index >= count($this->list)) {
+			throw new Nette\OutOfRangeException('Offset invalid or out of range');
+
+		} else {
+			$this->list[$index] = $value;
+		}
+	}
+
+
+	/**
+	 * Returns a item.
+	 * @param  int  $index
+	 * @return T
+	 * @throws Nette\OutOfRangeException
+	 */
+	public function offsetGet($index): mixed
+	{
+		if (!is_int($index) || $index < 0 || $index >= count($this->list)) {
+			throw new Nette\OutOfRangeException('Offset invalid or out of range');
+		}
+
+		return $this->list[$index];
+	}
+
+
+	/**
+	 * Determines whether a item exists.
+	 * @param  int  $index
+	 */
+	public function offsetExists($index): bool
+	{
+		return is_int($index) && $index >= 0 && $index < count($this->list);
+	}
+
+
+	/**
+	 * Removes the element at the specified position in this list.
+	 * @param  int  $index
+	 * @throws Nette\OutOfRangeException
+	 */
+	public function offsetUnset($index): void
+	{
+		if (!is_int($index) || $index < 0 || $index >= count($this->list)) {
+			throw new Nette\OutOfRangeException('Offset invalid or out of range');
+		}
+
+		array_splice($this->list, $index, 1);
+	}
+
+
+	/**
+	 * Prepends a item.
+	 * @param  T  $value
+	 */
+	public function prepend(mixed $value): void
+	{
+		$first = array_slice($this->list, 0, 1);
+		$this->offsetSet(0, $value);
+		array_splice($this->list, 1, 0, $first);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,553 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use JetBrains\PhpStorm\Language;
+use Nette;
+use function is_array, is_int, is_object, count;
+
+
+/**
+ * Array tools library.
+ */
+class Arrays
+{
+	use Nette\StaticClass;
+
+	/**
+	 * Returns item from array. If it does not exist, it throws an exception, unless a default value is set.
+	 * @template T
+	 * @param  array<T>  $array
+	 * @param  array-key|array-key[]  $key
+	 * @param  ?T  $default
+	 * @return ?T
+	 * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided
+	 */
+	public static function get(array $array, string|int|array $key, mixed $default = null): mixed
+	{
+		foreach (is_array($key) ? $key : [$key] as $k) {
+			if (is_array($array) && array_key_exists($k, $array)) {
+				$array = $array[$k];
+			} else {
+				if (func_num_args() < 3) {
+					throw new Nette\InvalidArgumentException("Missing item '$k'.");
+				}
+
+				return $default;
+			}
+		}
+
+		return $array;
+	}
+
+
+	/**
+	 * Returns reference to array item. If the index does not exist, new one is created with value null.
+	 * @template T
+	 * @param  array<T>  $array
+	 * @param  array-key|array-key[]  $key
+	 * @return ?T
+	 * @throws Nette\InvalidArgumentException if traversed item is not an array
+	 */
+	public static function &getRef(array &$array, string|int|array $key): mixed
+	{
+		foreach (is_array($key) ? $key : [$key] as $k) {
+			if (is_array($array) || $array === null) {
+				$array = &$array[$k];
+			} else {
+				throw new Nette\InvalidArgumentException('Traversed item is not an array.');
+			}
+		}
+
+		return $array;
+	}
+
+
+	/**
+	 * Recursively merges two fields. It is useful, for example, for merging tree structures. It behaves as
+	 * the + operator for array, ie. it adds a key/value pair from the second array to the first one and retains
+	 * the value from the first array in the case of a key collision.
+	 * @template T1
+	 * @template T2
+	 * @param  array<T1>  $array1
+	 * @param  array<T2>  $array2
+	 * @return array<T1|T2>
+	 */
+	public static function mergeTree(array $array1, array $array2): array
+	{
+		$res = $array1 + $array2;
+		foreach (array_intersect_key($array1, $array2) as $k => $v) {
+			if (is_array($v) && is_array($array2[$k])) {
+				$res[$k] = self::mergeTree($v, $array2[$k]);
+			}
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Returns zero-indexed position of given array key. Returns null if key is not found.
+	 */
+	public static function getKeyOffset(array $array, string|int $key): ?int
+	{
+		return Helpers::falseToNull(array_search(self::toKey($key), array_keys($array), strict: true));
+	}
+
+
+	/**
+	 * @deprecated  use  getKeyOffset()
+	 */
+	public static function searchKey(array $array, $key): ?int
+	{
+		return self::getKeyOffset($array, $key);
+	}
+
+
+	/**
+	 * Tests an array for the presence of value.
+	 */
+	public static function contains(array $array, mixed $value): bool
+	{
+		return in_array($value, $array, true);
+	}
+
+
+	/**
+	 * Returns the first item (matching the specified predicate if given). If there is no such item, it returns result of invoking $else or null.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  ?callable(V, K, array<K, V>): bool  $predicate
+	 * @return ?V
+	 */
+	public static function first(array $array, ?callable $predicate = null, ?callable $else = null): mixed
+	{
+		$key = self::firstKey($array, $predicate);
+		return $key === null
+			? ($else ? $else() : null)
+			: $array[$key];
+	}
+
+
+	/**
+	 * Returns the last item (matching the specified predicate if given). If there is no such item, it returns result of invoking $else or null.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  ?callable(V, K, array<K, V>): bool  $predicate
+	 * @return ?V
+	 */
+	public static function last(array $array, ?callable $predicate = null, ?callable $else = null): mixed
+	{
+		$key = self::lastKey($array, $predicate);
+		return $key === null
+			? ($else ? $else() : null)
+			: $array[$key];
+	}
+
+
+	/**
+	 * Returns the key of first item (matching the specified predicate if given) or null if there is no such item.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  ?callable(V, K, array<K, V>): bool  $predicate
+	 * @return ?K
+	 */
+	public static function firstKey(array $array, ?callable $predicate = null): int|string|null
+	{
+		if (!$predicate) {
+			return array_key_first($array);
+		}
+		foreach ($array as $k => $v) {
+			if ($predicate($v, $k, $array)) {
+				return $k;
+			}
+		}
+		return null;
+	}
+
+
+	/**
+	 * Returns the key of last item (matching the specified predicate if given) or null if there is no such item.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  ?callable(V, K, array<K, V>): bool  $predicate
+	 * @return ?K
+	 */
+	public static function lastKey(array $array, ?callable $predicate = null): int|string|null
+	{
+		return $predicate
+			? self::firstKey(array_reverse($array, preserve_keys: true), $predicate)
+			: array_key_last($array);
+	}
+
+
+	/**
+	 * Inserts the contents of the $inserted array into the $array immediately after the $key.
+	 * If $key is null (or does not exist), it is inserted at the beginning.
+	 */
+	public static function insertBefore(array &$array, string|int|null $key, array $inserted): void
+	{
+		$offset = $key === null ? 0 : (int) self::getKeyOffset($array, $key);
+		$array = array_slice($array, 0, $offset, preserve_keys: true)
+			+ $inserted
+			+ array_slice($array, $offset, count($array), preserve_keys: true);
+	}
+
+
+	/**
+	 * Inserts the contents of the $inserted array into the $array before the $key.
+	 * If $key is null (or does not exist), it is inserted at the end.
+	 */
+	public static function insertAfter(array &$array, string|int|null $key, array $inserted): void
+	{
+		if ($key === null || ($offset = self::getKeyOffset($array, $key)) === null) {
+			$offset = count($array) - 1;
+		}
+
+		$array = array_slice($array, 0, $offset + 1, preserve_keys: true)
+			+ $inserted
+			+ array_slice($array, $offset + 1, count($array), preserve_keys: true);
+	}
+
+
+	/**
+	 * Renames key in array.
+	 */
+	public static function renameKey(array &$array, string|int $oldKey, string|int $newKey): bool
+	{
+		$offset = self::getKeyOffset($array, $oldKey);
+		if ($offset === null) {
+			return false;
+		}
+
+		$val = &$array[$oldKey];
+		$keys = array_keys($array);
+		$keys[$offset] = $newKey;
+		$array = array_combine($keys, $array);
+		$array[$newKey] = &$val;
+		return true;
+	}
+
+
+	/**
+	 * Returns only those array items, which matches a regular expression $pattern.
+	 * @param  string[]  $array
+	 * @return string[]
+	 */
+	public static function grep(
+		array $array,
+		#[Language('RegExp')]
+		string $pattern,
+		bool|int $invert = false,
+	): array
+	{
+		$flags = $invert ? PREG_GREP_INVERT : 0;
+		return Strings::pcre('preg_grep', [$pattern, $array, $flags]);
+	}
+
+
+	/**
+	 * Transforms multidimensional array to flat array.
+	 */
+	public static function flatten(array $array, bool $preserveKeys = false): array
+	{
+		$res = [];
+		$cb = $preserveKeys
+			? function ($v, $k) use (&$res): void { $res[$k] = $v; }
+			: function ($v) use (&$res): void { $res[] = $v; };
+		array_walk_recursive($array, $cb);
+		return $res;
+	}
+
+
+	/**
+	 * Checks if the array is indexed in ascending order of numeric keys from zero, a.k.a list.
+	 * @return ($value is list ? true : false)
+	 */
+	public static function isList(mixed $value): bool
+	{
+		return is_array($value) && (PHP_VERSION_ID < 80100
+			? !$value || array_keys($value) === range(0, count($value) - 1)
+			: array_is_list($value)
+		);
+	}
+
+
+	/**
+	 * Reformats table to associative tree. Path looks like 'field|field[]field->field=field'.
+	 * @param  string|string[]  $path
+	 */
+	public static function associate(array $array, $path): array|\stdClass
+	{
+		$parts = is_array($path)
+			? $path
+			: preg_split('#(\[\]|->|=|\|)#', $path, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
+
+		if (!$parts || $parts === ['->'] || $parts[0] === '=' || $parts[0] === '|') {
+			throw new Nette\InvalidArgumentException("Invalid path '$path'.");
+		}
+
+		$res = $parts[0] === '->' ? new \stdClass : [];
+
+		foreach ($array as $rowOrig) {
+			$row = (array) $rowOrig;
+			$x = &$res;
+
+			for ($i = 0; $i < count($parts); $i++) {
+				$part = $parts[$i];
+				if ($part === '[]') {
+					$x = &$x[];
+
+				} elseif ($part === '=') {
+					if (isset($parts[++$i])) {
+						$x = $row[$parts[$i]];
+						$row = null;
+					}
+				} elseif ($part === '->') {
+					if (isset($parts[++$i])) {
+						if ($x === null) {
+							$x = new \stdClass;
+						}
+
+						$x = &$x->{$row[$parts[$i]]};
+					} else {
+						$row = is_object($rowOrig) ? $rowOrig : (object) $row;
+					}
+				} elseif ($part !== '|') {
+					$x = &$x[(string) $row[$part]];
+				}
+			}
+
+			if ($x === null) {
+				$x = $row;
+			}
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Normalizes array to associative array. Replace numeric keys with their values, the new value will be $filling.
+	 */
+	public static function normalize(array $array, mixed $filling = null): array
+	{
+		$res = [];
+		foreach ($array as $k => $v) {
+			$res[is_int($k) ? $v : $k] = is_int($k) ? $filling : $v;
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Returns and removes the value of an item from an array. If it does not exist, it throws an exception,
+	 * or returns $default, if provided.
+	 * @template T
+	 * @param  array<T>  $array
+	 * @param  ?T  $default
+	 * @return ?T
+	 * @throws Nette\InvalidArgumentException if item does not exist and default value is not provided
+	 */
+	public static function pick(array &$array, string|int $key, mixed $default = null): mixed
+	{
+		if (array_key_exists($key, $array)) {
+			$value = $array[$key];
+			unset($array[$key]);
+			return $value;
+
+		} elseif (func_num_args() < 3) {
+			throw new Nette\InvalidArgumentException("Missing item '$key'.");
+
+		} else {
+			return $default;
+		}
+	}
+
+
+	/**
+	 * Tests whether at least one element in the array passes the test implemented by the provided function.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  callable(V, K, array<K, V>): bool  $predicate
+	 */
+	public static function some(iterable $array, callable $predicate): bool
+	{
+		foreach ($array as $k => $v) {
+			if ($predicate($v, $k, $array)) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+
+	/**
+	 * Tests whether all elements in the array pass the test implemented by the provided function.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  callable(V, K, array<K, V>): bool  $predicate
+	 */
+	public static function every(iterable $array, callable $predicate): bool
+	{
+		foreach ($array as $k => $v) {
+			if (!$predicate($v, $k, $array)) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+
+	/**
+	 * Returns a new array containing all key-value pairs matching the given $predicate.
+	 * @template K of int|string
+	 * @template V
+	 * @param  array<K, V>  $array
+	 * @param  callable(V, K, array<K, V>): bool  $predicate
+	 * @return array<K, V>
+	 */
+	public static function filter(array $array, callable $predicate): array
+	{
+		$res = [];
+		foreach ($array as $k => $v) {
+			if ($predicate($v, $k, $array)) {
+				$res[$k] = $v;
+			}
+		}
+		return $res;
+	}
+
+
+	/**
+	 * Returns an array containing the original keys and results of applying the given transform function to each element.
+	 * @template K of int|string
+	 * @template V
+	 * @template R
+	 * @param  array<K, V>  $array
+	 * @param  callable(V, K, array<K, V>): R  $transformer
+	 * @return array<K, R>
+	 */
+	public static function map(iterable $array, callable $transformer): array
+	{
+		$res = [];
+		foreach ($array as $k => $v) {
+			$res[$k] = $transformer($v, $k, $array);
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Returns an array containing new keys and values generated by applying the given transform function to each element.
+	 * If the function returns null, the element is skipped.
+	 * @template K of int|string
+	 * @template V
+	 * @template ResK of int|string
+	 * @template ResV
+	 * @param  array<K, V>  $array
+	 * @param  callable(V, K, array<K, V>): ?array{ResK, ResV}  $transformer
+	 * @return array<ResK, ResV>
+	 */
+	public static function mapWithKeys(array $array, callable $transformer): array
+	{
+		$res = [];
+		foreach ($array as $k => $v) {
+			$pair = $transformer($v, $k, $array);
+			if ($pair) {
+				$res[$pair[0]] = $pair[1];
+			}
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Invokes all callbacks and returns array of results.
+	 * @param  callable[]  $callbacks
+	 */
+	public static function invoke(iterable $callbacks, ...$args): array
+	{
+		$res = [];
+		foreach ($callbacks as $k => $cb) {
+			$res[$k] = $cb(...$args);
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Invokes method on every object in an array and returns array of results.
+	 * @param  object[]  $objects
+	 */
+	public static function invokeMethod(iterable $objects, string $method, ...$args): array
+	{
+		$res = [];
+		foreach ($objects as $k => $obj) {
+			$res[$k] = $obj->$method(...$args);
+		}
+
+		return $res;
+	}
+
+
+	/**
+	 * Copies the elements of the $array array to the $object object and then returns it.
+	 * @template T of object
+	 * @param  T  $object
+	 * @return T
+	 */
+	public static function toObject(iterable $array, object $object): object
+	{
+		foreach ($array as $k => $v) {
+			$object->$k = $v;
+		}
+
+		return $object;
+	}
+
+
+	/**
+	 * Converts value to array key.
+	 */
+	public static function toKey(mixed $value): int|string
+	{
+		return key([$value => null]);
+	}
+
+
+	/**
+	 * Returns copy of the $array where every item is converted to string
+	 * and prefixed by $prefix and suffixed by $suffix.
+	 * @param  string[]  $array
+	 * @return string[]
+	 */
+	public static function wrap(array $array, string $prefix = '', string $suffix = ''): array
+	{
+		$res = [];
+		foreach ($array as $k => $v) {
+			$res[$k] = $prefix . $v . $suffix;
+		}
+
+		return $res;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,137 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+use function is_array, is_object, is_string;
+
+
+/**
+ * PHP callable tools.
+ */
+final class Callback
+{
+	use Nette\StaticClass;
+
+	/**
+	 * Invokes internal PHP function with own error handler.
+	 */
+	public static function invokeSafe(string $function, array $args, callable $onError): mixed
+	{
+		$prev = set_error_handler(function ($severity, $message, $file) use ($onError, &$prev, $function): ?bool {
+			if ($file === __FILE__) {
+				$msg = ini_get('html_errors')
+					? Html::htmlToText($message)
+					: $message;
+				$msg = preg_replace("#^$function\\(.*?\\): #", '', $msg);
+				if ($onError($msg, $severity) !== false) {
+					return null;
+				}
+			}
+
+			return $prev ? $prev(...func_get_args()) : false;
+		});
+
+		try {
+			return $function(...$args);
+		} finally {
+			restore_error_handler();
+		}
+	}
+
+
+	/**
+	 * Checks that $callable is valid PHP callback. Otherwise throws exception. If the $syntax is set to true, only verifies
+	 * that $callable has a valid structure to be used as a callback, but does not verify if the class or method actually exists.
+	 * @return callable
+	 * @throws Nette\InvalidArgumentException
+	 */
+	public static function check(mixed $callable, bool $syntax = false)
+	{
+		if (!is_callable($callable, $syntax)) {
+			throw new Nette\InvalidArgumentException(
+				$syntax
+				? 'Given value is not a callable type.'
+				: sprintf("Callback '%s' is not callable.", self::toString($callable)),
+			);
+		}
+
+		return $callable;
+	}
+
+
+	/**
+	 * Converts PHP callback to textual form. Class or method may not exists.
+	 */
+	public static function toString(mixed $callable): string
+	{
+		if ($callable instanceof \Closure) {
+			$inner = self::unwrap($callable);
+			return '{closure' . ($inner instanceof \Closure ? '}' : ' ' . self::toString($inner) . '}');
+		} else {
+			is_callable(is_object($callable) ? [$callable, '__invoke'] : $callable, true, $textual);
+			return $textual;
+		}
+	}
+
+
+	/**
+	 * Returns reflection for method or function used in PHP callback.
+	 * @param  callable  $callable  type check is escalated to ReflectionException
+	 * @throws \ReflectionException  if callback is not valid
+	 */
+	public static function toReflection($callable): \ReflectionMethod|\ReflectionFunction
+	{
+		if ($callable instanceof \Closure) {
+			$callable = self::unwrap($callable);
+		}
+
+		if (is_string($callable) && str_contains($callable, '::')) {
+			return new ReflectionMethod(...explode('::', $callable, 2));
+		} elseif (is_array($callable)) {
+			return new ReflectionMethod($callable[0], $callable[1]);
+		} elseif (is_object($callable) && !$callable instanceof \Closure) {
+			return new ReflectionMethod($callable, '__invoke');
+		} else {
+			return new \ReflectionFunction($callable);
+		}
+	}
+
+
+	/**
+	 * Checks whether PHP callback is function or static method.
+	 */
+	public static function isStatic(callable $callable): bool
+	{
+		return is_string(is_array($callable) ? $callable[0] : $callable);
+	}
+
+
+	/**
+	 * Unwraps closure created by Closure::fromCallable().
+	 */
+	public static function unwrap(\Closure $closure): callable|array
+	{
+		$r = new \ReflectionFunction($closure);
+		$class = $r->getClosureScopeClass()?->name;
+		if (str_ends_with($r->name, '}')) {
+			return $closure;
+
+		} elseif (($obj = $r->getClosureThis()) && $obj::class === $class) {
+			return [$obj, $r->name];
+
+		} elseif ($class) {
+			return [$class, $r->name];
+
+		} else {
+			return $r->name;
+		}
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * DateTime.
+ */
+class DateTime extends \DateTime implements \JsonSerializable
+{
+	use Nette\SmartObject;
+
+	/** minute in seconds */
+	public const MINUTE = 60;
+
+	/** hour in seconds */
+	public const HOUR = 60 * self::MINUTE;
+
+	/** day in seconds */
+	public const DAY = 24 * self::HOUR;
+
+	/** week in seconds */
+	public const WEEK = 7 * self::DAY;
+
+	/** average month in seconds */
+	public const MONTH = 2_629_800;
+
+	/** average year in seconds */
+	public const YEAR = 31_557_600;
+
+
+	/**
+	 * Creates a DateTime object from a string, UNIX timestamp, or other DateTimeInterface object.
+	 * @throws \Exception if the date and time are not valid.
+	 */
+	public static function from(string|int|\DateTimeInterface|null $time): static
+	{
+		if ($time instanceof \DateTimeInterface) {
+			return new static($time->format('Y-m-d H:i:s.u'), $time->getTimezone());
+
+		} elseif (is_numeric($time)) {
+			if ($time <= self::YEAR) {
+				$time += time();
+			}
+
+			return (new static)->setTimestamp((int) $time);
+
+		} else { // textual or null
+			return new static((string) $time);
+		}
+	}
+
+
+	/**
+	 * Creates DateTime object.
+	 * @throws Nette\InvalidArgumentException if the date and time are not valid.
+	 */
+	public static function fromParts(
+		int $year,
+		int $month,
+		int $day,
+		int $hour = 0,
+		int $minute = 0,
+		float $second = 0.0,
+	): static
+	{
+		$s = sprintf('%04d-%02d-%02d %02d:%02d:%02.5F', $year, $month, $day, $hour, $minute, $second);
+		if (
+			!checkdate($month, $day, $year)
+			|| $hour < 0
+			|| $hour > 23
+			|| $minute < 0
+			|| $minute > 59
+			|| $second < 0
+			|| $second >= 60
+		) {
+			throw new Nette\InvalidArgumentException("Invalid date '$s'");
+		}
+
+		return new static($s);
+	}
+
+
+	/**
+	 * Returns new DateTime object formatted according to the specified format.
+	 */
+	public static function createFromFormat(
+		string $format,
+		string $time,
+		string|\DateTimeZone|null $timezone = null,
+	): static|false
+	{
+		if ($timezone === null) {
+			$timezone = new \DateTimeZone(date_default_timezone_get());
+
+		} elseif (is_string($timezone)) {
+			$timezone = new \DateTimeZone($timezone);
+		}
+
+		$date = parent::createFromFormat($format, $time, $timezone);
+		return $date ? static::from($date) : false;
+	}
+
+
+	/**
+	 * Returns JSON representation in ISO 8601 (used by JavaScript).
+	 */
+	public function jsonSerialize(): string
+	{
+		return $this->format('c');
+	}
+
+
+	/**
+	 * Returns the date and time in the format 'Y-m-d H:i:s'.
+	 */
+	public function __toString(): string
+	{
+		return $this->format('Y-m-d H:i:s');
+	}
+
+
+	/**
+	 * You'd better use: (clone $dt)->modify(...)
+	 */
+	public function modifyClone(string $modify = ''): static
+	{
+		$dolly = clone $this;
+		return $modify ? $dolly->modify($modify) : $dolly;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Represents the file or directory returned by the Finder.
+ * @internal do not create instances directly
+ */
+final class FileInfo extends \SplFileInfo
+{
+	private string $relativePath;
+
+
+	public function __construct(string $file, string $relativePath = '')
+	{
+		parent::__construct($file);
+		$this->setInfoClass(static::class);
+		$this->relativePath = $relativePath;
+	}
+
+
+	/**
+	 * Returns the relative directory path.
+	 */
+	public function getRelativePath(): string
+	{
+		return $this->relativePath;
+	}
+
+
+	/**
+	 * Returns the relative path including file name.
+	 */
+	public function getRelativePathname(): string
+	{
+		return ($this->relativePath === '' ? '' : $this->relativePath . DIRECTORY_SEPARATOR)
+			. $this->getBasename();
+	}
+
+
+	/**
+	 * Returns the contents of the file.
+	 * @throws Nette\IOException
+	 */
+	public function read(): string
+	{
+		return FileSystem::read($this->getPathname());
+	}
+
+
+	/**
+	 * Writes the contents to the file.
+	 * @throws Nette\IOException
+	 */
+	public function write(string $content): void
+	{
+		FileSystem::write($this->getPathname(), $content);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,326 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * File system tool.
+ */
+final class FileSystem
+{
+	/**
+	 * Creates a directory if it does not exist, including parent directories.
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function createDir(string $dir, int $mode = 0777): void
+	{
+		if (!is_dir($dir) && !@mkdir($dir, $mode, recursive: true) && !is_dir($dir)) { // @ - dir may already exist
+			throw new Nette\IOException(sprintf(
+				"Unable to create directory '%s' with mode %s. %s",
+				self::normalizePath($dir),
+				decoct($mode),
+				Helpers::getLastError(),
+			));
+		}
+	}
+
+
+	/**
+	 * Copies a file or an entire directory. Overwrites existing files and directories by default.
+	 * @throws Nette\IOException  on error occurred
+	 * @throws Nette\InvalidStateException  if $overwrite is set to false and destination already exists
+	 */
+	public static function copy(string $origin, string $target, bool $overwrite = true): void
+	{
+		if (stream_is_local($origin) && !file_exists($origin)) {
+			throw new Nette\IOException(sprintf("File or directory '%s' not found.", self::normalizePath($origin)));
+
+		} elseif (!$overwrite && file_exists($target)) {
+			throw new Nette\InvalidStateException(sprintf("File or directory '%s' already exists.", self::normalizePath($target)));
+
+		} elseif (is_dir($origin)) {
+			static::createDir($target);
+			foreach (new \FilesystemIterator($target) as $item) {
+				static::delete($item->getPathname());
+			}
+
+			foreach ($iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($origin, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST) as $item) {
+				if ($item->isDir()) {
+					static::createDir($target . '/' . $iterator->getSubPathName());
+				} else {
+					static::copy($item->getPathname(), $target . '/' . $iterator->getSubPathName());
+				}
+			}
+		} else {
+			static::createDir(dirname($target));
+			if (@stream_copy_to_stream(static::open($origin, 'rb'), static::open($target, 'wb')) === false) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to copy file '%s' to '%s'. %s",
+					self::normalizePath($origin),
+					self::normalizePath($target),
+					Helpers::getLastError(),
+				));
+			}
+		}
+	}
+
+
+	/**
+	 * Opens file and returns resource.
+	 * @return resource
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function open(string $path, string $mode)
+	{
+		$f = @fopen($path, $mode); // @ is escalated to exception
+		if (!$f) {
+			throw new Nette\IOException(sprintf(
+				"Unable to open file '%s'. %s",
+				self::normalizePath($path),
+				Helpers::getLastError(),
+			));
+		}
+		return $f;
+	}
+
+
+	/**
+	 * Deletes a file or an entire directory if exists. If the directory is not empty, it deletes its contents first.
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function delete(string $path): void
+	{
+		if (is_file($path) || is_link($path)) {
+			$func = DIRECTORY_SEPARATOR === '\\' && is_dir($path) ? 'rmdir' : 'unlink';
+			if (!@$func($path)) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to delete '%s'. %s",
+					self::normalizePath($path),
+					Helpers::getLastError(),
+				));
+			}
+		} elseif (is_dir($path)) {
+			foreach (new \FilesystemIterator($path) as $item) {
+				static::delete($item->getPathname());
+			}
+
+			if (!@rmdir($path)) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to delete directory '%s'. %s",
+					self::normalizePath($path),
+					Helpers::getLastError(),
+				));
+			}
+		}
+	}
+
+
+	/**
+	 * Renames or moves a file or a directory. Overwrites existing files and directories by default.
+	 * @throws Nette\IOException  on error occurred
+	 * @throws Nette\InvalidStateException  if $overwrite is set to false and destination already exists
+	 */
+	public static function rename(string $origin, string $target, bool $overwrite = true): void
+	{
+		if (!$overwrite && file_exists($target)) {
+			throw new Nette\InvalidStateException(sprintf("File or directory '%s' already exists.", self::normalizePath($target)));
+
+		} elseif (!file_exists($origin)) {
+			throw new Nette\IOException(sprintf("File or directory '%s' not found.", self::normalizePath($origin)));
+
+		} else {
+			static::createDir(dirname($target));
+			if (realpath($origin) !== realpath($target)) {
+				static::delete($target);
+			}
+
+			if (!@rename($origin, $target)) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to rename file or directory '%s' to '%s'. %s",
+					self::normalizePath($origin),
+					self::normalizePath($target),
+					Helpers::getLastError(),
+				));
+			}
+		}
+	}
+
+
+	/**
+	 * Reads the content of a file.
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function read(string $file): string
+	{
+		$content = @file_get_contents($file); // @ is escalated to exception
+		if ($content === false) {
+			throw new Nette\IOException(sprintf(
+				"Unable to read file '%s'. %s",
+				self::normalizePath($file),
+				Helpers::getLastError(),
+			));
+		}
+
+		return $content;
+	}
+
+
+	/**
+	 * Reads the file content line by line. Because it reads continuously as we iterate over the lines,
+	 * it is possible to read files larger than the available memory.
+	 * @return \Generator<int, string>
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function readLines(string $file, bool $stripNewLines = true): \Generator
+	{
+		return (function ($f) use ($file, $stripNewLines) {
+			$counter = 0;
+			do {
+				$line = Callback::invokeSafe('fgets', [$f], fn($error) => throw new Nette\IOException(sprintf(
+					"Unable to read file '%s'. %s",
+					self::normalizePath($file),
+					$error,
+				)));
+				if ($line === false) {
+					fclose($f);
+					break;
+				}
+				if ($stripNewLines) {
+					$line = rtrim($line, "\r\n");
+				}
+
+				yield $counter++ => $line;
+
+			} while (true);
+		})(static::open($file, 'r'));
+	}
+
+
+	/**
+	 * Writes the string to a file.
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function write(string $file, string $content, ?int $mode = 0666): void
+	{
+		static::createDir(dirname($file));
+		if (@file_put_contents($file, $content) === false) { // @ is escalated to exception
+			throw new Nette\IOException(sprintf(
+				"Unable to write file '%s'. %s",
+				self::normalizePath($file),
+				Helpers::getLastError(),
+			));
+		}
+
+		if ($mode !== null && !@chmod($file, $mode)) { // @ is escalated to exception
+			throw new Nette\IOException(sprintf(
+				"Unable to chmod file '%s' to mode %s. %s",
+				self::normalizePath($file),
+				decoct($mode),
+				Helpers::getLastError(),
+			));
+		}
+	}
+
+
+	/**
+	 * Sets file permissions to `$fileMode` or directory permissions to `$dirMode`.
+	 * Recursively traverses and sets permissions on the entire contents of the directory as well.
+	 * @throws Nette\IOException  on error occurred
+	 */
+	public static function makeWritable(string $path, int $dirMode = 0777, int $fileMode = 0666): void
+	{
+		if (is_file($path)) {
+			if (!@chmod($path, $fileMode)) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to chmod file '%s' to mode %s. %s",
+					self::normalizePath($path),
+					decoct($fileMode),
+					Helpers::getLastError(),
+				));
+			}
+		} elseif (is_dir($path)) {
+			foreach (new \FilesystemIterator($path) as $item) {
+				static::makeWritable($item->getPathname(), $dirMode, $fileMode);
+			}
+
+			if (!@chmod($path, $dirMode)) { // @ is escalated to exception
+				throw new Nette\IOException(sprintf(
+					"Unable to chmod directory '%s' to mode %s. %s",
+					self::normalizePath($path),
+					decoct($dirMode),
+					Helpers::getLastError(),
+				));
+			}
+		} else {
+			throw new Nette\IOException(sprintf("File or directory '%s' not found.", self::normalizePath($path)));
+		}
+	}
+
+
+	/**
+	 * Determines if the path is absolute.
+	 */
+	public static function isAbsolute(string $path): bool
+	{
+		return (bool) preg_match('#([a-z]:)?[/\\\\]|[a-z][a-z0-9+.-]*://#Ai', $path);
+	}
+
+
+	/**
+	 * Normalizes `..` and `.` and directory separators in path.
+	 */
+	public static function normalizePath(string $path): string
+	{
+		$parts = $path === '' ? [] : preg_split('~[/\\\\]+~', $path);
+		$res = [];
+		foreach ($parts as $part) {
+			if ($part === '..' && $res && end($res) !== '..' && end($res) !== '') {
+				array_pop($res);
+			} elseif ($part !== '.') {
+				$res[] = $part;
+			}
+		}
+
+		return $res === ['']
+			? DIRECTORY_SEPARATOR
+			: implode(DIRECTORY_SEPARATOR, $res);
+	}
+
+
+	/**
+	 * Joins all segments of the path and normalizes the result.
+	 */
+	public static function joinPaths(string ...$paths): string
+	{
+		return self::normalizePath(implode('/', $paths));
+	}
+
+
+	/**
+	 * Converts backslashes to slashes.
+	 */
+	public static function unixSlashes(string $path): string
+	{
+		return strtr($path, '\\', '/');
+	}
+
+
+	/**
+	 * Converts slashes to platform-specific directory separators.
+	 */
+	public static function platformSlashes(string $path): string
+	{
+		return DIRECTORY_SEPARATOR === '/'
+			? strtr($path, '\\', '/')
+			: str_replace(':\\\\', '://', strtr($path, '/', '\\')); // protocol://
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,510 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Finder allows searching through directory trees using iterator.
+ *
+ * Finder::findFiles('*.php')
+ *     ->size('> 10kB')
+ *     ->from('.')
+ *     ->exclude('temp');
+ *
+ * @implements \IteratorAggregate<string, FileInfo>
+ */
+class Finder implements \IteratorAggregate
+{
+	use Nette\SmartObject;
+
+	/** @var array<array{string, string}> */
+	private array $find = [];
+
+	/** @var string[] */
+	private array $in = [];
+
+	/** @var \Closure[] */
+	private array $filters = [];
+
+	/** @var \Closure[] */
+	private array $descentFilters = [];
+
+	/** @var array<string|self> */
+	private array $appends = [];
+	private bool $childFirst = false;
+
+	/** @var ?callable */
+	private $sort;
+	private int $maxDepth = -1;
+	private bool $ignoreUnreadableDirs = true;
+
+
+	/**
+	 * Begins search for files and directories matching mask.
+	 */
+	public static function find(string|array $masks = ['*']): static
+	{
+		$masks = is_array($masks) ? $masks : func_get_args(); // compatibility with variadic
+		return (new static)->addMask($masks, 'dir')->addMask($masks, 'file');
+	}
+
+
+	/**
+	 * Begins search for files matching mask.
+	 */
+	public static function findFiles(string|array $masks = ['*']): static
+	{
+		$masks = is_array($masks) ? $masks : func_get_args(); // compatibility with variadic
+		return (new static)->addMask($masks, 'file');
+	}
+
+
+	/**
+	 * Begins search for directories matching mask.
+	 */
+	public static function findDirectories(string|array $masks = ['*']): static
+	{
+		$masks = is_array($masks) ? $masks : func_get_args(); // compatibility with variadic
+		return (new static)->addMask($masks, 'dir');
+	}
+
+
+	/**
+	 * Finds files matching the specified masks.
+	 */
+	public function files(string|array $masks = ['*']): static
+	{
+		return $this->addMask((array) $masks, 'file');
+	}
+
+
+	/**
+	 * Finds directories matching the specified masks.
+	 */
+	public function directories(string|array $masks = ['*']): static
+	{
+		return $this->addMask((array) $masks, 'dir');
+	}
+
+
+	private function addMask(array $masks, string $mode): static
+	{
+		foreach ($masks as $mask) {
+			$mask = FileSystem::unixSlashes($mask);
+			if ($mode === 'dir') {
+				$mask = rtrim($mask, '/');
+			}
+			if ($mask === '' || ($mode === 'file' && str_ends_with($mask, '/'))) {
+				throw new Nette\InvalidArgumentException("Invalid mask '$mask'");
+			}
+			if (str_starts_with($mask, '**/')) {
+				$mask = substr($mask, 3);
+			}
+			$this->find[] = [$mask, $mode];
+		}
+		return $this;
+	}
+
+
+	/**
+	 * Searches in the given directories. Wildcards are allowed.
+	 */
+	public function in(string|array $paths): static
+	{
+		$paths = is_array($paths) ? $paths : func_get_args(); // compatibility with variadic
+		$this->addLocation($paths, '');
+		return $this;
+	}
+
+
+	/**
+	 * Searches recursively from the given directories. Wildcards are allowed.
+	 */
+	public function from(string|array $paths): static
+	{
+		$paths = is_array($paths) ? $paths : func_get_args(); // compatibility with variadic
+		$this->addLocation($paths, '/**');
+		return $this;
+	}
+
+
+	private function addLocation(array $paths, string $ext): void
+	{
+		foreach ($paths as $path) {
+			if ($path === '') {
+				throw new Nette\InvalidArgumentException("Invalid directory '$path'");
+			}
+			$path = rtrim(FileSystem::unixSlashes($path), '/');
+			$this->in[] = $path . $ext;
+		}
+	}
+
+
+	/**
+	 * Lists directory's contents before the directory itself. By default, this is disabled.
+	 */
+	public function childFirst(bool $state = true): static
+	{
+		$this->childFirst = $state;
+		return $this;
+	}
+
+
+	/**
+	 * Ignores unreadable directories. By default, this is enabled.
+	 */
+	public function ignoreUnreadableDirs(bool $state = true): static
+	{
+		$this->ignoreUnreadableDirs = $state;
+		return $this;
+	}
+
+
+	/**
+	 * Set a compare function for sorting directory entries. The function will be called to sort entries from the same directory.
+	 * @param  callable(FileInfo, FileInfo): int  $callback
+	 */
+	public function sortBy(callable $callback): static
+	{
+		$this->sort = $callback;
+		return $this;
+	}
+
+
+	/**
+	 * Sorts files in each directory naturally by name.
+	 */
+	public function sortByName(): static
+	{
+		$this->sort = fn(FileInfo $a, FileInfo $b): int => strnatcmp($a->getBasename(), $b->getBasename());
+		return $this;
+	}
+
+
+	/**
+	 * Adds the specified paths or appends a new finder that returns.
+	 */
+	public function append(string|array|null $paths = null): static
+	{
+		if ($paths === null) {
+			return $this->appends[] = new static;
+		}
+
+		$this->appends = array_merge($this->appends, (array) $paths);
+		return $this;
+	}
+
+
+	/********************* filtering ****************d*g**/
+
+
+	/**
+	 * Skips entries that matches the given masks relative to the ones defined with the in() or from() methods.
+	 */
+	public function exclude(string|array $masks): static
+	{
+		$masks = is_array($masks) ? $masks : func_get_args(); // compatibility with variadic
+		foreach ($masks as $mask) {
+			$mask = FileSystem::unixSlashes($mask);
+			if (!preg_match('~^/?(\*\*/)?(.+)(/\*\*|/\*|/|)$~D', $mask, $m)) {
+				throw new Nette\InvalidArgumentException("Invalid mask '$mask'");
+			}
+			$end = $m[3];
+			$re = $this->buildPattern($m[2]);
+			$filter = fn(FileInfo $file): bool => ($end && !$file->isDir())
+				|| !preg_match($re, FileSystem::unixSlashes($file->getRelativePathname()));
+
+			$this->descentFilter($filter);
+			if ($end !== '/*') {
+				$this->filter($filter);
+			}
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Yields only entries which satisfy the given filter.
+	 * @param  callable(FileInfo): bool  $callback
+	 */
+	public function filter(callable $callback): static
+	{
+		$this->filters[] = \Closure::fromCallable($callback);
+		return $this;
+	}
+
+
+	/**
+	 * It descends only to directories that match the specified filter.
+	 * @param  callable(FileInfo): bool  $callback
+	 */
+	public function descentFilter(callable $callback): static
+	{
+		$this->descentFilters[] = \Closure::fromCallable($callback);
+		return $this;
+	}
+
+
+	/**
+	 * Sets the maximum depth of entries.
+	 */
+	public function limitDepth(?int $depth): static
+	{
+		$this->maxDepth = $depth ?? -1;
+		return $this;
+	}
+
+
+	/**
+	 * Restricts the search by size. $operator accepts "[operator] [size] [unit]" example: >=10kB
+	 */
+	public function size(string $operator, ?int $size = null): static
+	{
+		if (func_num_args() === 1) { // in $operator is predicate
+			if (!preg_match('#^(?:([=<>!]=?|<>)\s*)?((?:\d*\.)?\d+)\s*(K|M|G|)B?$#Di', $operator, $matches)) {
+				throw new Nette\InvalidArgumentException('Invalid size predicate format.');
+			}
+
+			[, $operator, $size, $unit] = $matches;
+			$units = ['' => 1, 'k' => 1e3, 'm' => 1e6, 'g' => 1e9];
+			$size *= $units[strtolower($unit)];
+			$operator = $operator ?: '=';
+		}
+
+		return $this->filter(fn(FileInfo $file): bool => !$file->isFile() || Helpers::compare($file->getSize(), $operator, $size));
+	}
+
+
+	/**
+	 * Restricts the search by modified time. $operator accepts "[operator] [date]" example: >1978-01-23
+	 */
+	public function date(string $operator, string|int|\DateTimeInterface|null $date = null): static
+	{
+		if (func_num_args() === 1) { // in $operator is predicate
+			if (!preg_match('#^(?:([=<>!]=?|<>)\s*)?(.+)$#Di', $operator, $matches)) {
+				throw new Nette\InvalidArgumentException('Invalid date predicate format.');
+			}
+
+			[, $operator, $date] = $matches;
+			$operator = $operator ?: '=';
+		}
+
+		$date = DateTime::from($date)->format('U');
+		return $this->filter(fn(FileInfo $file): bool => !$file->isFile() || Helpers::compare($file->getMTime(), $operator, $date));
+	}
+
+
+	/********************* iterator generator ****************d*g**/
+
+
+	/**
+	 * Returns an array with all found files and directories.
+	 * @return list<FileInfo>
+	 */
+	public function collect(): array
+	{
+		return iterator_to_array($this->getIterator(), preserve_keys: false);
+	}
+
+
+	/** @return \Generator<string, FileInfo> */
+	public function getIterator(): \Generator
+	{
+		$plan = $this->buildPlan();
+		foreach ($plan as $dir => $searches) {
+			yield from $this->traverseDir($dir, $searches);
+		}
+
+		foreach ($this->appends as $item) {
+			if ($item instanceof self) {
+				yield from $item->getIterator();
+			} else {
+				$item = FileSystem::platformSlashes($item);
+				yield $item => new FileInfo($item);
+			}
+		}
+	}
+
+
+	/**
+	 * @param  array<object{pattern: string, mode: string, recursive: bool}>  $searches
+	 * @param  string[]  $subdirs
+	 * @return \Generator<string, FileInfo>
+	 */
+	private function traverseDir(string $dir, array $searches, array $subdirs = []): \Generator
+	{
+		if ($this->maxDepth >= 0 && count($subdirs) > $this->maxDepth) {
+			return;
+		} elseif (!is_dir($dir)) {
+			throw new Nette\InvalidStateException(sprintf("Directory '%s' does not exist.", rtrim($dir, '/\\')));
+		}
+
+		try {
+			$pathNames = new \FilesystemIterator($dir, \FilesystemIterator::FOLLOW_SYMLINKS | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::CURRENT_AS_PATHNAME | \FilesystemIterator::UNIX_PATHS);
+		} catch (\UnexpectedValueException $e) {
+			if ($this->ignoreUnreadableDirs) {
+				return;
+			} else {
+				throw new Nette\InvalidStateException($e->getMessage());
+			}
+		}
+
+		$files = $this->convertToFiles($pathNames, implode('/', $subdirs), FileSystem::isAbsolute($dir));
+
+		if ($this->sort) {
+			$files = iterator_to_array($files);
+			usort($files, $this->sort);
+		}
+
+		foreach ($files as $file) {
+			$pathName = $file->getPathname();
+			$cache = $subSearch = [];
+
+			if ($file->isDir()) {
+				foreach ($searches as $search) {
+					if ($search->recursive && $this->proveFilters($this->descentFilters, $file, $cache)) {
+						$subSearch[] = $search;
+					}
+				}
+			}
+
+			if ($this->childFirst && $subSearch) {
+				yield from $this->traverseDir($pathName, $subSearch, array_merge($subdirs, [$file->getBasename()]));
+			}
+
+			$relativePathname = FileSystem::unixSlashes($file->getRelativePathname());
+			foreach ($searches as $search) {
+				if (
+					$file->{'is' . $search->mode}()
+					&& preg_match($search->pattern, $relativePathname)
+					&& $this->proveFilters($this->filters, $file, $cache)
+				) {
+					yield $pathName => $file;
+					break;
+				}
+			}
+
+			if (!$this->childFirst && $subSearch) {
+				yield from $this->traverseDir($pathName, $subSearch, array_merge($subdirs, [$file->getBasename()]));
+			}
+		}
+	}
+
+
+	private function convertToFiles(iterable $pathNames, string $relativePath, bool $absolute): \Generator
+	{
+		foreach ($pathNames as $pathName) {
+			if (!$absolute) {
+				$pathName = preg_replace('~\.?/~A', '', $pathName);
+			}
+			$pathName = FileSystem::platformSlashes($pathName);
+			yield new FileInfo($pathName, $relativePath);
+		}
+	}
+
+
+	private function proveFilters(array $filters, FileInfo $file, array &$cache): bool
+	{
+		foreach ($filters as $filter) {
+			$res = &$cache[spl_object_id($filter)];
+			$res ??= $filter($file);
+			if (!$res) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+
+	/** @return array<string, array<object{pattern: string, mode: string, recursive: bool}>> */
+	private function buildPlan(): array
+	{
+		$plan = $dirCache = [];
+		foreach ($this->find as [$mask, $mode]) {
+			$splits = [];
+			if (FileSystem::isAbsolute($mask)) {
+				if ($this->in) {
+					throw new Nette\InvalidStateException("You cannot combine the absolute path in the mask '$mask' and the directory to search '{$this->in[0]}'.");
+				}
+				$splits[] = self::splitRecursivePart($mask);
+			} else {
+				foreach ($this->in ?: ['.'] as $in) {
+					$in = strtr($in, ['[' => '[[]', ']' => '[]]']); // in path, do not treat [ and ] as a pattern by glob()
+					$splits[] = self::splitRecursivePart($in . '/' . $mask);
+				}
+			}
+
+			foreach ($splits as [$base, $rest, $recursive]) {
+				$base = $base === '' ? '.' : $base;
+				$dirs = $dirCache[$base] ??= strpbrk($base, '*?[')
+					? glob($base, GLOB_NOSORT | GLOB_ONLYDIR | GLOB_NOESCAPE)
+					: [strtr($base, ['[[]' => '[', '[]]' => ']'])]; // unescape [ and ]
+
+				if (!$dirs) {
+					throw new Nette\InvalidStateException(sprintf("Directory '%s' does not exist.", rtrim($base, '/\\')));
+				}
+
+				$search = (object) ['pattern' => $this->buildPattern($rest), 'mode' => $mode, 'recursive' => $recursive];
+				foreach ($dirs as $dir) {
+					$plan[$dir][] = $search;
+				}
+			}
+		}
+
+		return $plan;
+	}
+
+
+	/**
+	 * Since glob() does not know ** wildcard, we divide the path into a part for glob and a part for manual traversal.
+	 */
+	private static function splitRecursivePart(string $path): array
+	{
+		$a = strrpos($path, '/');
+		$parts = preg_split('~(?<=^|/)\*\*($|/)~', substr($path, 0, $a + 1), 2);
+		return isset($parts[1])
+			? [$parts[0], $parts[1] . substr($path, $a + 1), true]
+			: [$parts[0], substr($path, $a + 1), false];
+	}
+
+
+	/**
+	 * Converts wildcards to regular expression.
+	 */
+	private function buildPattern(string $mask): string
+	{
+		if ($mask === '*') {
+			return '##';
+		} elseif (str_starts_with($mask, './')) {
+			$anchor = '^';
+			$mask = substr($mask, 2);
+		} else {
+			$anchor = '(?:^|/)';
+		}
+
+		$pattern = strtr(
+			preg_quote($mask, '#'),
+			[
+				'\*\*/' => '(.+/)?',
+				'\*' => '[^/]*',
+				'\?' => '[^/]',
+				'\[\!' => '[^',
+				'\[' => '[',
+				'\]' => ']',
+				'\-' => '-',
+			],
+		);
+		return '#' . $anchor . $pattern . '$#D' . (defined('PHP_WINDOWS_VERSION_BUILD') ? 'i' : '');
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Floating-point numbers comparison.
+ */
+class Floats
+{
+	use Nette\StaticClass;
+
+	private const Epsilon = 1e-10;
+
+
+	public static function isZero(float $value): bool
+	{
+		return abs($value) < self::Epsilon;
+	}
+
+
+	public static function isInteger(float $value): bool
+	{
+		return abs(round($value) - $value) < self::Epsilon;
+	}
+
+
+	/**
+	 * Compare two floats. If $a < $b it returns -1, if they are equal it returns 0 and if $a > $b it returns 1
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function compare(float $a, float $b): int
+	{
+		if (is_nan($a) || is_nan($b)) {
+			throw new \LogicException('Trying to compare NAN');
+
+		} elseif (!is_finite($a) && !is_finite($b) && $a === $b) {
+			return 0;
+		}
+
+		$diff = abs($a - $b);
+		if (($diff < self::Epsilon || ($diff / max(abs($a), abs($b)) < self::Epsilon))) {
+			return 0;
+		}
+
+		return $a < $b ? -1 : 1;
+	}
+
+
+	/**
+	 * Returns true if $a = $b
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function areEqual(float $a, float $b): bool
+	{
+		return self::compare($a, $b) === 0;
+	}
+
+
+	/**
+	 * Returns true if $a < $b
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function isLessThan(float $a, float $b): bool
+	{
+		return self::compare($a, $b) < 0;
+	}
+
+
+	/**
+	 * Returns true if $a <= $b
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function isLessThanOrEqualTo(float $a, float $b): bool
+	{
+		return self::compare($a, $b) <= 0;
+	}
+
+
+	/**
+	 * Returns true if $a > $b
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function isGreaterThan(float $a, float $b): bool
+	{
+		return self::compare($a, $b) > 0;
+	}
+
+
+	/**
+	 * Returns true if $a >= $b
+	 * @throws \LogicException if one of parameters is NAN
+	 */
+	public static function isGreaterThanOrEqualTo(float $a, float $b): bool
+	{
+		return self::compare($a, $b) >= 0;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+class Helpers
+{
+	/**
+	 * Executes a callback and returns the captured output as a string.
+	 */
+	public static function capture(callable $func): string
+	{
+		ob_start(function () {});
+		try {
+			$func();
+			return ob_get_clean();
+		} catch (\Throwable $e) {
+			ob_end_clean();
+			throw $e;
+		}
+	}
+
+
+	/**
+	 * Returns the last occurred PHP error or an empty string if no error occurred. Unlike error_get_last(),
+	 * it is nit affected by the PHP directive html_errors and always returns text, not HTML.
+	 */
+	public static function getLastError(): string
+	{
+		$message = error_get_last()['message'] ?? '';
+		$message = ini_get('html_errors') ? Html::htmlToText($message) : $message;
+		$message = preg_replace('#^\w+\(.*?\): #', '', $message);
+		return $message;
+	}
+
+
+	/**
+	 * Converts false to null, does not change other values.
+	 */
+	public static function falseToNull(mixed $value): mixed
+	{
+		return $value === false ? null : $value;
+	}
+
+
+	/**
+	 * Returns value clamped to the inclusive range of min and max.
+	 */
+	public static function clamp(int|float $value, int|float $min, int|float $max): int|float
+	{
+		if ($min > $max) {
+			throw new Nette\InvalidArgumentException("Minimum ($min) is not less than maximum ($max).");
+		}
+
+		return min(max($value, $min), $max);
+	}
+
+
+	/**
+	 * Looks for a string from possibilities that is most similar to value, but not the same (for 8-bit encoding).
+	 * @param  string[]  $possibilities
+	 */
+	public static function getSuggestion(array $possibilities, string $value): ?string
+	{
+		$best = null;
+		$min = (strlen($value) / 4 + 1) * 10 + .1;
+		foreach (array_unique($possibilities) as $item) {
+			if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) < $min) {
+				$min = $len;
+				$best = $item;
+			}
+		}
+
+		return $best;
+	}
+
+
+	/**
+	 * Compares two values in the same way that PHP does. Recognizes operators: >, >=, <, <=, =, ==, ===, !=, !==, <>
+	 */
+	public static function compare(mixed $left, string $operator, mixed $right): bool
+	{
+		return match ($operator) {
+			'>' => $left > $right,
+			'>=' => $left >= $right,
+			'<' => $left < $right,
+			'<=' => $left <= $right,
+			'=', '==' => $left == $right,
+			'===' => $left === $right,
+			'!=', '<>' => $left != $right,
+			'!==' => $left !== $right,
+			default => throw new Nette\InvalidArgumentException("Unknown operator '$operator'"),
+		};
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,839 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+use Nette\HtmlStringable;
+use function is_array, is_float, is_object, is_string;
+
+
+/**
+ * HTML helper.
+ *
+ * @property string|null $accept
+ * @property string|null $accesskey
+ * @property string|null $action
+ * @property string|null $align
+ * @property string|null $allow
+ * @property string|null $alt
+ * @property bool|null   $async
+ * @property string|null $autocapitalize
+ * @property string|null $autocomplete
+ * @property bool|null   $autofocus
+ * @property bool|null   $autoplay
+ * @property string|null $charset
+ * @property bool|null   $checked
+ * @property string|null $cite
+ * @property string|null $class
+ * @property int|null    $cols
+ * @property int|null    $colspan
+ * @property string|null $content
+ * @property bool|null   $contenteditable
+ * @property bool|null   $controls
+ * @property string|null $coords
+ * @property string|null $crossorigin
+ * @property string|null $data
+ * @property string|null $datetime
+ * @property string|null $decoding
+ * @property bool|null   $default
+ * @property bool|null   $defer
+ * @property string|null $dir
+ * @property string|null $dirname
+ * @property bool|null   $disabled
+ * @property bool|null   $download
+ * @property string|null $draggable
+ * @property string|null $dropzone
+ * @property string|null $enctype
+ * @property string|null $for
+ * @property string|null $form
+ * @property string|null $formaction
+ * @property string|null $formenctype
+ * @property string|null $formmethod
+ * @property bool|null   $formnovalidate
+ * @property string|null $formtarget
+ * @property string|null $headers
+ * @property int|null    $height
+ * @property bool|null   $hidden
+ * @property float|null  $high
+ * @property string|null $href
+ * @property string|null $hreflang
+ * @property string|null $id
+ * @property string|null $integrity
+ * @property string|null $inputmode
+ * @property bool|null   $ismap
+ * @property string|null $itemprop
+ * @property string|null $kind
+ * @property string|null $label
+ * @property string|null $lang
+ * @property string|null $list
+ * @property bool|null   $loop
+ * @property float|null  $low
+ * @property float|null  $max
+ * @property int|null    $maxlength
+ * @property int|null    $minlength
+ * @property string|null $media
+ * @property string|null $method
+ * @property float|null  $min
+ * @property bool|null   $multiple
+ * @property bool|null   $muted
+ * @property string|null $name
+ * @property bool|null   $novalidate
+ * @property bool|null   $open
+ * @property float|null  $optimum
+ * @property string|null $pattern
+ * @property string|null $ping
+ * @property string|null $placeholder
+ * @property string|null $poster
+ * @property string|null $preload
+ * @property string|null $radiogroup
+ * @property bool|null   $readonly
+ * @property string|null $rel
+ * @property bool|null   $required
+ * @property bool|null   $reversed
+ * @property int|null    $rows
+ * @property int|null    $rowspan
+ * @property string|null $sandbox
+ * @property string|null $scope
+ * @property bool|null   $selected
+ * @property string|null $shape
+ * @property int|null    $size
+ * @property string|null $sizes
+ * @property string|null $slot
+ * @property int|null    $span
+ * @property string|null $spellcheck
+ * @property string|null $src
+ * @property string|null $srcdoc
+ * @property string|null $srclang
+ * @property string|null $srcset
+ * @property int|null    $start
+ * @property float|null  $step
+ * @property string|null $style
+ * @property int|null    $tabindex
+ * @property string|null $target
+ * @property string|null $title
+ * @property string|null $translate
+ * @property string|null $type
+ * @property string|null $usemap
+ * @property string|null $value
+ * @property int|null    $width
+ * @property string|null $wrap
+ *
+ * @method self accept(?string $val)
+ * @method self accesskey(?string $val, bool $state = null)
+ * @method self action(?string $val)
+ * @method self align(?string $val)
+ * @method self allow(?string $val, bool $state = null)
+ * @method self alt(?string $val)
+ * @method self async(?bool $val)
+ * @method self autocapitalize(?string $val)
+ * @method self autocomplete(?string $val)
+ * @method self autofocus(?bool $val)
+ * @method self autoplay(?bool $val)
+ * @method self charset(?string $val)
+ * @method self checked(?bool $val)
+ * @method self cite(?string $val)
+ * @method self class(?string $val, bool $state = null)
+ * @method self cols(?int $val)
+ * @method self colspan(?int $val)
+ * @method self content(?string $val)
+ * @method self contenteditable(?bool $val)
+ * @method self controls(?bool $val)
+ * @method self coords(?string $val)
+ * @method self crossorigin(?string $val)
+ * @method self datetime(?string $val)
+ * @method self decoding(?string $val)
+ * @method self default(?bool $val)
+ * @method self defer(?bool $val)
+ * @method self dir(?string $val)
+ * @method self dirname(?string $val)
+ * @method self disabled(?bool $val)
+ * @method self download(?bool $val)
+ * @method self draggable(?string $val)
+ * @method self dropzone(?string $val)
+ * @method self enctype(?string $val)
+ * @method self for(?string $val)
+ * @method self form(?string $val)
+ * @method self formaction(?string $val)
+ * @method self formenctype(?string $val)
+ * @method self formmethod(?string $val)
+ * @method self formnovalidate(?bool $val)
+ * @method self formtarget(?string $val)
+ * @method self headers(?string $val, bool $state = null)
+ * @method self height(?int $val)
+ * @method self hidden(?bool $val)
+ * @method self high(?float $val)
+ * @method self hreflang(?string $val)
+ * @method self id(?string $val)
+ * @method self integrity(?string $val)
+ * @method self inputmode(?string $val)
+ * @method self ismap(?bool $val)
+ * @method self itemprop(?string $val)
+ * @method self kind(?string $val)
+ * @method self label(?string $val)
+ * @method self lang(?string $val)
+ * @method self list(?string $val)
+ * @method self loop(?bool $val)
+ * @method self low(?float $val)
+ * @method self max(?float $val)
+ * @method self maxlength(?int $val)
+ * @method self minlength(?int $val)
+ * @method self media(?string $val)
+ * @method self method(?string $val)
+ * @method self min(?float $val)
+ * @method self multiple(?bool $val)
+ * @method self muted(?bool $val)
+ * @method self name(?string $val)
+ * @method self novalidate(?bool $val)
+ * @method self open(?bool $val)
+ * @method self optimum(?float $val)
+ * @method self pattern(?string $val)
+ * @method self ping(?string $val, bool $state = null)
+ * @method self placeholder(?string $val)
+ * @method self poster(?string $val)
+ * @method self preload(?string $val)
+ * @method self radiogroup(?string $val)
+ * @method self readonly(?bool $val)
+ * @method self rel(?string $val)
+ * @method self required(?bool $val)
+ * @method self reversed(?bool $val)
+ * @method self rows(?int $val)
+ * @method self rowspan(?int $val)
+ * @method self sandbox(?string $val, bool $state = null)
+ * @method self scope(?string $val)
+ * @method self selected(?bool $val)
+ * @method self shape(?string $val)
+ * @method self size(?int $val)
+ * @method self sizes(?string $val)
+ * @method self slot(?string $val)
+ * @method self span(?int $val)
+ * @method self spellcheck(?string $val)
+ * @method self src(?string $val)
+ * @method self srcdoc(?string $val)
+ * @method self srclang(?string $val)
+ * @method self srcset(?string $val)
+ * @method self start(?int $val)
+ * @method self step(?float $val)
+ * @method self style(?string $property, string $val = null)
+ * @method self tabindex(?int $val)
+ * @method self target(?string $val)
+ * @method self title(?string $val)
+ * @method self translate(?string $val)
+ * @method self type(?string $val)
+ * @method self usemap(?string $val)
+ * @method self value(?string $val)
+ * @method self width(?int $val)
+ * @method self wrap(?string $val)
+ */
+class Html implements \ArrayAccess, \Countable, \IteratorAggregate, HtmlStringable
+{
+	use Nette\SmartObject;
+
+	/** @var array<string, mixed>  element's attributes */
+	public $attrs = [];
+
+	/** void elements */
+	public static $emptyElements = [
+		'img' => 1, 'hr' => 1, 'br' => 1, 'input' => 1, 'meta' => 1, 'area' => 1, 'embed' => 1, 'keygen' => 1,
+		'source' => 1, 'base' => 1, 'col' => 1, 'link' => 1, 'param' => 1, 'basefont' => 1, 'frame' => 1,
+		'isindex' => 1, 'wbr' => 1, 'command' => 1, 'track' => 1,
+	];
+
+	/** @var array<int, HtmlStringable|string> nodes */
+	protected $children = [];
+
+	/** element's name */
+	private string $name = '';
+
+	private bool $isEmpty = false;
+
+
+	/**
+	 * Constructs new HTML element.
+	 * @param  array|string $attrs element's attributes or plain text content
+	 */
+	public static function el(?string $name = null, array|string|null $attrs = null): static
+	{
+		$el = new static;
+		$parts = explode(' ', (string) $name, 2);
+		$el->setName($parts[0]);
+
+		if (is_array($attrs)) {
+			$el->attrs = $attrs;
+
+		} elseif ($attrs !== null) {
+			$el->setText($attrs);
+		}
+
+		if (isset($parts[1])) {
+			foreach (Strings::matchAll($parts[1] . ' ', '#([a-z0-9:-]+)(?:=(["\'])?(.*?)(?(2)\2|\s))?#i') as $m) {
+				$el->attrs[$m[1]] = $m[3] ?? true;
+			}
+		}
+
+		return $el;
+	}
+
+
+	/**
+	 * Returns an object representing HTML text.
+	 */
+	public static function fromHtml(string $html): static
+	{
+		return (new static)->setHtml($html);
+	}
+
+
+	/**
+	 * Returns an object representing plain text.
+	 */
+	public static function fromText(string $text): static
+	{
+		return (new static)->setText($text);
+	}
+
+
+	/**
+	 * Converts to HTML.
+	 */
+	final public function toHtml(): string
+	{
+		return $this->render();
+	}
+
+
+	/**
+	 * Converts to plain text.
+	 */
+	final public function toText(): string
+	{
+		return $this->getText();
+	}
+
+
+	/**
+	 * Converts given HTML code to plain text.
+	 */
+	public static function htmlToText(string $html): string
+	{
+		return html_entity_decode(strip_tags($html), ENT_QUOTES | ENT_HTML5, 'UTF-8');
+	}
+
+
+	/**
+	 * Changes element's name.
+	 */
+	final public function setName(string $name, ?bool $isEmpty = null): static
+	{
+		$this->name = $name;
+		$this->isEmpty = $isEmpty ?? isset(static::$emptyElements[$name]);
+		return $this;
+	}
+
+
+	/**
+	 * Returns element's name.
+	 */
+	final public function getName(): string
+	{
+		return $this->name;
+	}
+
+
+	/**
+	 * Is element empty?
+	 */
+	final public function isEmpty(): bool
+	{
+		return $this->isEmpty;
+	}
+
+
+	/**
+	 * Sets multiple attributes.
+	 */
+	public function addAttributes(array $attrs): static
+	{
+		$this->attrs = array_merge($this->attrs, $attrs);
+		return $this;
+	}
+
+
+	/**
+	 * Appends value to element's attribute.
+	 */
+	public function appendAttribute(string $name, mixed $value, mixed $option = true): static
+	{
+		if (is_array($value)) {
+			$prev = isset($this->attrs[$name]) ? (array) $this->attrs[$name] : [];
+			$this->attrs[$name] = $value + $prev;
+
+		} elseif ((string) $value === '') {
+			$tmp = &$this->attrs[$name]; // appending empty value? -> ignore, but ensure it exists
+
+		} elseif (!isset($this->attrs[$name]) || is_array($this->attrs[$name])) { // needs array
+			$this->attrs[$name][$value] = $option;
+
+		} else {
+			$this->attrs[$name] = [$this->attrs[$name] => true, $value => $option];
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Sets element's attribute.
+	 */
+	public function setAttribute(string $name, mixed $value): static
+	{
+		$this->attrs[$name] = $value;
+		return $this;
+	}
+
+
+	/**
+	 * Returns element's attribute.
+	 */
+	public function getAttribute(string $name): mixed
+	{
+		return $this->attrs[$name] ?? null;
+	}
+
+
+	/**
+	 * Unsets element's attribute.
+	 */
+	public function removeAttribute(string $name): static
+	{
+		unset($this->attrs[$name]);
+		return $this;
+	}
+
+
+	/**
+	 * Unsets element's attributes.
+	 */
+	public function removeAttributes(array $attributes): static
+	{
+		foreach ($attributes as $name) {
+			unset($this->attrs[$name]);
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Overloaded setter for element's attribute.
+	 */
+	final public function __set(string $name, mixed $value): void
+	{
+		$this->attrs[$name] = $value;
+	}
+
+
+	/**
+	 * Overloaded getter for element's attribute.
+	 */
+	final public function &__get(string $name): mixed
+	{
+		return $this->attrs[$name];
+	}
+
+
+	/**
+	 * Overloaded tester for element's attribute.
+	 */
+	final public function __isset(string $name): bool
+	{
+		return isset($this->attrs[$name]);
+	}
+
+
+	/**
+	 * Overloaded unsetter for element's attribute.
+	 */
+	final public function __unset(string $name): void
+	{
+		unset($this->attrs[$name]);
+	}
+
+
+	/**
+	 * Overloaded setter for element's attribute.
+	 */
+	final public function __call(string $m, array $args): mixed
+	{
+		$p = substr($m, 0, 3);
+		if ($p === 'get' || $p === 'set' || $p === 'add') {
+			$m = substr($m, 3);
+			$m[0] = $m[0] | "\x20";
+			if ($p === 'get') {
+				return $this->attrs[$m] ?? null;
+
+			} elseif ($p === 'add') {
+				$args[] = true;
+			}
+		}
+
+		if (count($args) === 0) { // invalid
+
+		} elseif (count($args) === 1) { // set
+			$this->attrs[$m] = $args[0];
+
+		} else { // add
+			$this->appendAttribute($m, $args[0], $args[1]);
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Special setter for element's attribute.
+	 */
+	final public function href(string $path, array $query = []): static
+	{
+		if ($query) {
+			$query = http_build_query($query, '', '&');
+			if ($query !== '') {
+				$path .= '?' . $query;
+			}
+		}
+
+		$this->attrs['href'] = $path;
+		return $this;
+	}
+
+
+	/**
+	 * Setter for data-* attributes. Booleans are converted to 'true' resp. 'false'.
+	 */
+	public function data(string $name, mixed $value = null): static
+	{
+		if (func_num_args() === 1) {
+			$this->attrs['data'] = $name;
+		} else {
+			$this->attrs["data-$name"] = is_bool($value)
+				? json_encode($value)
+				: $value;
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Sets element's HTML content.
+	 */
+	final public function setHtml(mixed $html): static
+	{
+		$this->children = [(string) $html];
+		return $this;
+	}
+
+
+	/**
+	 * Returns element's HTML content.
+	 */
+	final public function getHtml(): string
+	{
+		return implode('', $this->children);
+	}
+
+
+	/**
+	 * Sets element's textual content.
+	 */
+	final public function setText(mixed $text): static
+	{
+		if (!$text instanceof HtmlStringable) {
+			$text = htmlspecialchars((string) $text, ENT_NOQUOTES, 'UTF-8');
+		}
+
+		$this->children = [(string) $text];
+		return $this;
+	}
+
+
+	/**
+	 * Returns element's textual content.
+	 */
+	final public function getText(): string
+	{
+		return self::htmlToText($this->getHtml());
+	}
+
+
+	/**
+	 * Adds new element's child.
+	 */
+	final public function addHtml(mixed $child): static
+	{
+		return $this->insert(null, $child);
+	}
+
+
+	/**
+	 * Appends plain-text string to element content.
+	 */
+	public function addText(mixed $text): static
+	{
+		if (!$text instanceof HtmlStringable) {
+			$text = htmlspecialchars((string) $text, ENT_NOQUOTES, 'UTF-8');
+		}
+
+		return $this->insert(null, $text);
+	}
+
+
+	/**
+	 * Creates and adds a new Html child.
+	 */
+	final public function create(string $name, array|string|null $attrs = null): static
+	{
+		$this->insert(null, $child = static::el($name, $attrs));
+		return $child;
+	}
+
+
+	/**
+	 * Inserts child node.
+	 */
+	public function insert(?int $index, HtmlStringable|string $child, bool $replace = false): static
+	{
+		$child = $child instanceof self ? $child : (string) $child;
+		if ($index === null) { // append
+			$this->children[] = $child;
+
+		} else { // insert or replace
+			array_splice($this->children, $index, $replace ? 1 : 0, [$child]);
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Inserts (replaces) child node (\ArrayAccess implementation).
+	 * @param  int|null  $index  position or null for appending
+	 * @param  Html|string  $child  Html node or raw HTML string
+	 */
+	final public function offsetSet($index, $child): void
+	{
+		$this->insert($index, $child, replace: true);
+	}
+
+
+	/**
+	 * Returns child node (\ArrayAccess implementation).
+	 * @param  int  $index
+	 */
+	final public function offsetGet($index): HtmlStringable|string
+	{
+		return $this->children[$index];
+	}
+
+
+	/**
+	 * Exists child node? (\ArrayAccess implementation).
+	 * @param  int  $index
+	 */
+	final public function offsetExists($index): bool
+	{
+		return isset($this->children[$index]);
+	}
+
+
+	/**
+	 * Removes child node (\ArrayAccess implementation).
+	 * @param  int  $index
+	 */
+	public function offsetUnset($index): void
+	{
+		if (isset($this->children[$index])) {
+			array_splice($this->children, $index, 1);
+		}
+	}
+
+
+	/**
+	 * Returns children count.
+	 */
+	final public function count(): int
+	{
+		return count($this->children);
+	}
+
+
+	/**
+	 * Removes all children.
+	 */
+	public function removeChildren(): void
+	{
+		$this->children = [];
+	}
+
+
+	/**
+	 * Iterates over elements.
+	 * @return \ArrayIterator<int, HtmlStringable|string>
+	 */
+	final public function getIterator(): \ArrayIterator
+	{
+		return new \ArrayIterator($this->children);
+	}
+
+
+	/**
+	 * Returns all children.
+	 */
+	final public function getChildren(): array
+	{
+		return $this->children;
+	}
+
+
+	/**
+	 * Renders element's start tag, content and end tag.
+	 */
+	final public function render(?int $indent = null): string
+	{
+		$s = $this->startTag();
+
+		if (!$this->isEmpty) {
+			// add content
+			if ($indent !== null) {
+				$indent++;
+			}
+
+			foreach ($this->children as $child) {
+				if ($child instanceof self) {
+					$s .= $child->render($indent);
+				} else {
+					$s .= $child;
+				}
+			}
+
+			// add end tag
+			$s .= $this->endTag();
+		}
+
+		if ($indent !== null) {
+			return "\n" . str_repeat("\t", $indent - 1) . $s . "\n" . str_repeat("\t", max(0, $indent - 2));
+		}
+
+		return $s;
+	}
+
+
+	final public function __toString(): string
+	{
+		return $this->render();
+	}
+
+
+	/**
+	 * Returns element's start tag.
+	 */
+	final public function startTag(): string
+	{
+		return $this->name
+			? '<' . $this->name . $this->attributes() . '>'
+			: '';
+	}
+
+
+	/**
+	 * Returns element's end tag.
+	 */
+	final public function endTag(): string
+	{
+		return $this->name && !$this->isEmpty ? '</' . $this->name . '>' : '';
+	}
+
+
+	/**
+	 * Returns element's attributes.
+	 * @internal
+	 */
+	final public function attributes(): string
+	{
+		if (!is_array($this->attrs)) {
+			return '';
+		}
+
+		$s = '';
+		$attrs = $this->attrs;
+		foreach ($attrs as $key => $value) {
+			if ($value === null || $value === false) {
+				continue;
+
+			} elseif ($value === true) {
+				$s .= ' ' . $key;
+
+				continue;
+
+			} elseif (is_array($value)) {
+				if (strncmp($key, 'data-', 5) === 0) {
+					$value = Json::encode($value);
+
+				} else {
+					$tmp = null;
+					foreach ($value as $k => $v) {
+						if ($v != null) { // intentionally ==, skip nulls & empty string
+							// composite 'style' vs. 'others'
+							$tmp[] = $v === true
+								? $k
+								: (is_string($k) ? $k . ':' . $v : $v);
+						}
+					}
+
+					if ($tmp === null) {
+						continue;
+					}
+
+					$value = implode($key === 'style' || !strncmp($key, 'on', 2) ? ';' : ' ', $tmp);
+				}
+			} elseif (is_float($value)) {
+				$value = rtrim(rtrim(number_format($value, 10, '.', ''), '0'), '.');
+
+			} else {
+				$value = (string) $value;
+			}
+
+			$q = str_contains($value, '"') ? "'" : '"';
+			$s .= ' ' . $key . '=' . $q
+				. str_replace(
+					['&', $q, '<'],
+					['&amp;', $q === '"' ? '&quot;' : '&#39;', '<'],
+					$value,
+				)
+				. (str_contains($value, '`') && strpbrk($value, ' <>"\'') === false ? ' ' : '')
+				. $q;
+		}
+
+		$s = str_replace('@', '&#64;', $s);
+		return $s;
+	}
+
+
+	/**
+	 * Clones all children too.
+	 */
+	public function __clone()
+	{
+		foreach ($this->children as $key => $value) {
+			if (is_object($value)) {
+				$this->children[$key] = clone $value;
+			}
+		}
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,831 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Basic manipulation with images. Supported types are JPEG, PNG, GIF, WEBP, AVIF and BMP.
+ *
+ * <code>
+ * $image = Image::fromFile('nette.jpg');
+ * $image->resize(150, 100);
+ * $image->sharpen();
+ * $image->send();
+ * </code>
+ *
+ * @method Image affine(array $affine, ?array $clip = null)
+ * @method void alphaBlending(bool $enable)
+ * @method void antialias(bool $enable)
+ * @method void arc(int $centerX, int $centerY, int $width, int $height, int $startAngle, int $endAngle, ImageColor $color)
+ * @method int colorAllocate(int $red, int $green, int $blue)
+ * @method int colorAllocateAlpha(int $red, int $green, int $blue, int $alpha)
+ * @method int colorAt(int $x, int $y)
+ * @method int colorClosest(int $red, int $green, int $blue)
+ * @method int colorClosestAlpha(int $red, int $green, int $blue, int $alpha)
+ * @method int colorClosestHWB(int $red, int $green, int $blue)
+ * @method void colorDeallocate(int $color)
+ * @method int colorExact(int $red, int $green, int $blue)
+ * @method int colorExactAlpha(int $red, int $green, int $blue, int $alpha)
+ * @method void colorMatch(Image $image2)
+ * @method int colorResolve(int $red, int $green, int $blue)
+ * @method int colorResolveAlpha(int $red, int $green, int $blue, int $alpha)
+ * @method void colorSet(int $index, int $red, int $green, int $blue, int $alpha = 0)
+ * @method array colorsForIndex(int $color)
+ * @method int colorsTotal()
+ * @method int colorTransparent(?int $color = null)
+ * @method void convolution(array $matrix, float $div, float $offset)
+ * @method void copy(Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH)
+ * @method void copyMerge(Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH, int $pct)
+ * @method void copyMergeGray(Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $srcW, int $srcH, int $pct)
+ * @method void copyResampled(Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dstH, int $srcW, int $srcH)
+ * @method void copyResized(Image $src, int $dstX, int $dstY, int $srcX, int $srcY, int $dstW, int $dstH, int $srcW, int $srcH)
+ * @method Image cropAuto(int $mode = IMG_CROP_DEFAULT, float $threshold = .5, ?ImageColor $color = null)
+ * @method void ellipse(int $centerX, int $centerY, int $width, int $height, ImageColor $color)
+ * @method void fill(int $x, int $y, ImageColor $color)
+ * @method void filledArc(int $centerX, int $centerY, int $width, int $height, int $startAngle, int $endAngle, ImageColor $color, int $style)
+ * @method void filledEllipse(int $centerX, int $centerY, int $width, int $height, ImageColor $color)
+ * @method void filledPolygon(array $points, ImageColor $color)
+ * @method void filledRectangle(int $x1, int $y1, int $x2, int $y2, ImageColor $color)
+ * @method void fillToBorder(int $x, int $y, ImageColor $borderColor, ImageColor $color)
+ * @method void filter(int $filter, ...$args)
+ * @method void flip(int $mode)
+ * @method array ftText(float $size, float $angle, int $x, int $y, ImageColor $color, string $fontFile, string $text, array $options = [])
+ * @method void gammaCorrect(float $inputgamma, float $outputgamma)
+ * @method array getClip()
+ * @method int getInterpolation()
+ * @method int interlace(?bool $enable = null)
+ * @method bool isTrueColor()
+ * @method void layerEffect(int $effect)
+ * @method void line(int $x1, int $y1, int $x2, int $y2, ImageColor $color)
+ * @method void openPolygon(array $points, ImageColor $color)
+ * @method void paletteCopy(Image $source)
+ * @method void paletteToTrueColor()
+ * @method void polygon(array $points, ImageColor $color)
+ * @method void rectangle(int $x1, int $y1, int $x2, int $y2, ImageColor $color)
+ * @method mixed resolution(?int $resolutionX = null, ?int $resolutionY = null)
+ * @method Image rotate(float $angle, ImageColor $backgroundColor)
+ * @method void saveAlpha(bool $enable)
+ * @method Image scale(int $newWidth, int $newHeight = -1, int $mode = IMG_BILINEAR_FIXED)
+ * @method void setBrush(Image $brush)
+ * @method void setClip(int $x1, int $y1, int $x2, int $y2)
+ * @method void setInterpolation(int $method = IMG_BILINEAR_FIXED)
+ * @method void setPixel(int $x, int $y, ImageColor $color)
+ * @method void setStyle(array $style)
+ * @method void setThickness(int $thickness)
+ * @method void setTile(Image $tile)
+ * @method void trueColorToPalette(bool $dither, int $ncolors)
+ * @method array ttfText(float $size, float $angle, int $x, int $y, ImageColor $color, string $fontfile, string $text, array $options = [])
+ * @property-read positive-int $width
+ * @property-read positive-int $height
+ * @property-read \GdImage $imageResource
+ */
+class Image
+{
+	use Nette\SmartObject;
+
+	/** Prevent from getting resized to a bigger size than the original */
+	public const ShrinkOnly = 0b0001;
+
+	/** Resizes to a specified width and height without keeping aspect ratio */
+	public const Stretch = 0b0010;
+
+	/** Resizes to fit into a specified width and height and preserves aspect ratio */
+	public const OrSmaller = 0b0000;
+
+	/** Resizes while bounding the smaller dimension to the specified width or height and preserves aspect ratio */
+	public const OrBigger = 0b0100;
+
+	/** Resizes to the smallest possible size to completely cover specified width and height and reserves aspect ratio */
+	public const Cover = 0b1000;
+
+	/** @deprecated use Image::ShrinkOnly */
+	public const SHRINK_ONLY = self::ShrinkOnly;
+
+	/** @deprecated use Image::Stretch */
+	public const STRETCH = self::Stretch;
+
+	/** @deprecated use Image::OrSmaller */
+	public const FIT = self::OrSmaller;
+
+	/** @deprecated use Image::OrBigger */
+	public const FILL = self::OrBigger;
+
+	/** @deprecated use Image::Cover */
+	public const EXACT = self::Cover;
+
+	/** @deprecated use Image::EmptyGIF */
+	public const EMPTY_GIF = self::EmptyGIF;
+
+	/** image types */
+	public const
+		JPEG = ImageType::JPEG,
+		PNG = ImageType::PNG,
+		GIF = ImageType::GIF,
+		WEBP = ImageType::WEBP,
+		AVIF = ImageType::AVIF,
+		BMP = ImageType::BMP;
+
+	public const EmptyGIF = "GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;";
+
+	private const Formats = [ImageType::JPEG => 'jpeg', ImageType::PNG => 'png', ImageType::GIF => 'gif', ImageType::WEBP => 'webp', ImageType::AVIF => 'avif', ImageType::BMP => 'bmp'];
+
+	private \GdImage $image;
+
+
+	/**
+	 * Returns RGB color (0..255) and transparency (0..127).
+	 * @deprecated use ImageColor::rgb()
+	 */
+	public static function rgb(int $red, int $green, int $blue, int $transparency = 0): array
+	{
+		return [
+			'red' => max(0, min(255, $red)),
+			'green' => max(0, min(255, $green)),
+			'blue' => max(0, min(255, $blue)),
+			'alpha' => max(0, min(127, $transparency)),
+		];
+	}
+
+
+	/**
+	 * Reads an image from a file and returns its type in $type.
+	 * @throws Nette\NotSupportedException if gd extension is not loaded
+	 * @throws UnknownImageFileException if file not found or file type is not known
+	 */
+	public static function fromFile(string $file, ?int &$type = null): static
+	{
+		self::ensureExtension();
+		$type = self::detectTypeFromFile($file);
+		if (!$type) {
+			throw new UnknownImageFileException(is_file($file) ? "Unknown type of file '$file'." : "File '$file' not found.");
+		}
+
+		return self::invokeSafe('imagecreatefrom' . self::Formats[$type], $file, "Unable to open file '$file'.", __METHOD__);
+	}
+
+
+	/**
+	 * Reads an image from a string and returns its type in $type.
+	 * @throws Nette\NotSupportedException if gd extension is not loaded
+	 * @throws ImageException
+	 */
+	public static function fromString(string $s, ?int &$type = null): static
+	{
+		self::ensureExtension();
+		$type = self::detectTypeFromString($s);
+		if (!$type) {
+			throw new UnknownImageFileException('Unknown type of image.');
+		}
+
+		return self::invokeSafe('imagecreatefromstring', $s, 'Unable to open image from string.', __METHOD__);
+	}
+
+
+	private static function invokeSafe(string $func, string $arg, string $message, string $callee): static
+	{
+		$errors = [];
+		$res = Callback::invokeSafe($func, [$arg], function (string $message) use (&$errors): void {
+			$errors[] = $message;
+		});
+
+		if (!$res) {
+			throw new ImageException($message . ' Errors: ' . implode(', ', $errors));
+		} elseif ($errors) {
+			trigger_error($callee . '(): ' . implode(', ', $errors), E_USER_WARNING);
+		}
+
+		return new static($res);
+	}
+
+
+	/**
+	 * Creates a new true color image of the given dimensions. The default color is black.
+	 * @param  positive-int  $width
+	 * @param  positive-int  $height
+	 * @throws Nette\NotSupportedException if gd extension is not loaded
+	 */
+	public static function fromBlank(int $width, int $height, ImageColor|array|null $color = null): static
+	{
+		self::ensureExtension();
+		if ($width < 1 || $height < 1) {
+			throw new Nette\InvalidArgumentException('Image width and height must be greater than zero.');
+		}
+
+		$image = new static(imagecreatetruecolor($width, $height));
+		if ($color) {
+			$image->alphablending(false);
+			$image->filledrectangle(0, 0, $width - 1, $height - 1, $color);
+			$image->alphablending(true);
+		}
+
+		return $image;
+	}
+
+
+	/**
+	 * Returns the type of image from file.
+	 * @return ImageType::*|null
+	 */
+	public static function detectTypeFromFile(string $file, &$width = null, &$height = null): ?int
+	{
+		[$width, $height, $type] = @getimagesize($file); // @ - files smaller than 12 bytes causes read error
+		return isset(self::Formats[$type]) ? $type : null;
+	}
+
+
+	/**
+	 * Returns the type of image from string.
+	 * @return ImageType::*|null
+	 */
+	public static function detectTypeFromString(string $s, &$width = null, &$height = null): ?int
+	{
+		[$width, $height, $type] = @getimagesizefromstring($s); // @ - strings smaller than 12 bytes causes read error
+		return isset(self::Formats[$type]) ? $type : null;
+	}
+
+
+	/**
+	 * Returns the file extension for the given image type.
+	 * @param  ImageType::*  $type
+	 * @return value-of<self::Formats>
+	 */
+	public static function typeToExtension(int $type): string
+	{
+		if (!isset(self::Formats[$type])) {
+			throw new Nette\InvalidArgumentException("Unsupported image type '$type'.");
+		}
+
+		return self::Formats[$type];
+	}
+
+
+	/**
+	 * Returns the image type for given file extension.
+	 * @return ImageType::*
+	 */
+	public static function extensionToType(string $extension): int
+	{
+		$extensions = array_flip(self::Formats) + ['jpg' => ImageType::JPEG];
+		$extension = strtolower($extension);
+		if (!isset($extensions[$extension])) {
+			throw new Nette\InvalidArgumentException("Unsupported file extension '$extension'.");
+		}
+
+		return $extensions[$extension];
+	}
+
+
+	/**
+	 * Returns the mime type for the given image type.
+	 * @param  ImageType::*  $type
+	 */
+	public static function typeToMimeType(int $type): string
+	{
+		return 'image/' . self::typeToExtension($type);
+	}
+
+
+	/**
+	 * @param  ImageType::*  $type
+	 */
+	public static function isTypeSupported(int $type): bool
+	{
+		self::ensureExtension();
+		return (bool) (imagetypes() & match ($type) {
+			ImageType::JPEG => IMG_JPG,
+			ImageType::PNG => IMG_PNG,
+			ImageType::GIF => IMG_GIF,
+			ImageType::WEBP => IMG_WEBP,
+			ImageType::AVIF => 256, // IMG_AVIF,
+			ImageType::BMP => IMG_BMP,
+			default => 0,
+		});
+	}
+
+
+	/** @return  ImageType[] */
+	public static function getSupportedTypes(): array
+	{
+		self::ensureExtension();
+		$flag = imagetypes();
+		return array_filter([
+			$flag & IMG_GIF ? ImageType::GIF : null,
+			$flag & IMG_JPG ? ImageType::JPEG : null,
+			$flag & IMG_PNG ? ImageType::PNG : null,
+			$flag & IMG_WEBP ? ImageType::WEBP : null,
+			$flag & 256 ? ImageType::AVIF : null, // IMG_AVIF
+			$flag & IMG_BMP ? ImageType::BMP : null,
+		]);
+	}
+
+
+	/**
+	 * Wraps GD image.
+	 */
+	public function __construct(\GdImage $image)
+	{
+		$this->setImageResource($image);
+		imagesavealpha($image, true);
+	}
+
+
+	/**
+	 * Returns image width.
+	 * @return positive-int
+	 */
+	public function getWidth(): int
+	{
+		return imagesx($this->image);
+	}
+
+
+	/**
+	 * Returns image height.
+	 * @return positive-int
+	 */
+	public function getHeight(): int
+	{
+		return imagesy($this->image);
+	}
+
+
+	/**
+	 * Sets image resource.
+	 */
+	protected function setImageResource(\GdImage $image): static
+	{
+		$this->image = $image;
+		return $this;
+	}
+
+
+	/**
+	 * Returns image GD resource.
+	 */
+	public function getImageResource(): \GdImage
+	{
+		return $this->image;
+	}
+
+
+	/**
+	 * Scales an image. Width and height accept pixels or percent.
+	 * @param  int-mask-of<self::OrSmaller|self::OrBigger|self::Stretch|self::Cover|self::ShrinkOnly>  $mode
+	 */
+	public function resize(int|string|null $width, int|string|null $height, int $mode = self::OrSmaller): static
+	{
+		if ($mode & self::Cover) {
+			return $this->resize($width, $height, self::OrBigger)->crop('50%', '50%', $width, $height);
+		}
+
+		[$newWidth, $newHeight] = static::calculateSize($this->getWidth(), $this->getHeight(), $width, $height, $mode);
+
+		if ($newWidth !== $this->getWidth() || $newHeight !== $this->getHeight()) { // resize
+			$newImage = static::fromBlank($newWidth, $newHeight, ImageColor::rgb(0, 0, 0, 0))->getImageResource();
+			imagecopyresampled(
+				$newImage,
+				$this->image,
+				0,
+				0,
+				0,
+				0,
+				$newWidth,
+				$newHeight,
+				$this->getWidth(),
+				$this->getHeight(),
+			);
+			$this->image = $newImage;
+		}
+
+		if ($width < 0 || $height < 0) {
+			imageflip($this->image, $width < 0 ? ($height < 0 ? IMG_FLIP_BOTH : IMG_FLIP_HORIZONTAL) : IMG_FLIP_VERTICAL);
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Calculates dimensions of resized image. Width and height accept pixels or percent.
+	 * @param  int-mask-of<self::OrSmaller|self::OrBigger|self::Stretch|self::Cover|self::ShrinkOnly>  $mode
+	 */
+	public static function calculateSize(
+		int $srcWidth,
+		int $srcHeight,
+		$newWidth,
+		$newHeight,
+		int $mode = self::OrSmaller,
+	): array
+	{
+		if ($newWidth === null) {
+		} elseif (self::isPercent($newWidth)) {
+			$newWidth = (int) round($srcWidth / 100 * abs($newWidth));
+			$percents = true;
+		} else {
+			$newWidth = abs($newWidth);
+		}
+
+		if ($newHeight === null) {
+		} elseif (self::isPercent($newHeight)) {
+			$newHeight = (int) round($srcHeight / 100 * abs($newHeight));
+			$mode |= empty($percents) ? 0 : self::Stretch;
+		} else {
+			$newHeight = abs($newHeight);
+		}
+
+		if ($mode & self::Stretch) { // non-proportional
+			if (!$newWidth || !$newHeight) {
+				throw new Nette\InvalidArgumentException('For stretching must be both width and height specified.');
+			}
+
+			if ($mode & self::ShrinkOnly) {
+				$newWidth = min($srcWidth, $newWidth);
+				$newHeight = min($srcHeight, $newHeight);
+			}
+		} else {  // proportional
+			if (!$newWidth && !$newHeight) {
+				throw new Nette\InvalidArgumentException('At least width or height must be specified.');
+			}
+
+			$scale = [];
+			if ($newWidth > 0) { // fit width
+				$scale[] = $newWidth / $srcWidth;
+			}
+
+			if ($newHeight > 0) { // fit height
+				$scale[] = $newHeight / $srcHeight;
+			}
+
+			if ($mode & self::OrBigger) {
+				$scale = [max($scale)];
+			}
+
+			if ($mode & self::ShrinkOnly) {
+				$scale[] = 1;
+			}
+
+			$scale = min($scale);
+			$newWidth = (int) round($srcWidth * $scale);
+			$newHeight = (int) round($srcHeight * $scale);
+		}
+
+		return [max($newWidth, 1), max($newHeight, 1)];
+	}
+
+
+	/**
+	 * Crops image. Arguments accepts pixels or percent.
+	 */
+	public function crop(int|string $left, int|string $top, int|string $width, int|string $height): static
+	{
+		[$r['x'], $r['y'], $r['width'], $r['height']]
+			= static::calculateCutout($this->getWidth(), $this->getHeight(), $left, $top, $width, $height);
+		if (gd_info()['GD Version'] === 'bundled (2.1.0 compatible)') {
+			$this->image = imagecrop($this->image, $r);
+			imagesavealpha($this->image, true);
+		} else {
+			$newImage = static::fromBlank($r['width'], $r['height'], ImageColor::rgb(0, 0, 0, 0))->getImageResource();
+			imagecopy($newImage, $this->image, 0, 0, $r['x'], $r['y'], $r['width'], $r['height']);
+			$this->image = $newImage;
+		}
+
+		return $this;
+	}
+
+
+	/**
+	 * Calculates dimensions of cutout in image. Arguments accepts pixels or percent.
+	 */
+	public static function calculateCutout(
+		int $srcWidth,
+		int $srcHeight,
+		int|string $left,
+		int|string $top,
+		int|string $newWidth,
+		int|string $newHeight,
+	): array
+	{
+		if (self::isPercent($newWidth)) {
+			$newWidth = (int) round($srcWidth / 100 * $newWidth);
+		}
+
+		if (self::isPercent($newHeight)) {
+			$newHeight = (int) round($srcHeight / 100 * $newHeight);
+		}
+
+		if (self::isPercent($left)) {
+			$left = (int) round(($srcWidth - $newWidth) / 100 * $left);
+		}
+
+		if (self::isPercent($top)) {
+			$top = (int) round(($srcHeight - $newHeight) / 100 * $top);
+		}
+
+		if ($left < 0) {
+			$newWidth += $left;
+			$left = 0;
+		}
+
+		if ($top < 0) {
+			$newHeight += $top;
+			$top = 0;
+		}
+
+		$newWidth = min($newWidth, $srcWidth - $left);
+		$newHeight = min($newHeight, $srcHeight - $top);
+		return [$left, $top, $newWidth, $newHeight];
+	}
+
+
+	/**
+	 * Sharpens image a little bit.
+	 */
+	public function sharpen(): static
+	{
+		imageconvolution($this->image, [ // my magic numbers ;)
+			[-1, -1, -1],
+			[-1, 24, -1],
+			[-1, -1, -1],
+		], 16, 0);
+		return $this;
+	}
+
+
+	/**
+	 * Puts another image into this image. Left and top accepts pixels or percent.
+	 * @param  int<0, 100>  $opacity 0..100
+	 */
+	public function place(self $image, int|string $left = 0, int|string $top = 0, int $opacity = 100): static
+	{
+		$opacity = max(0, min(100, $opacity));
+		if ($opacity === 0) {
+			return $this;
+		}
+
+		$width = $image->getWidth();
+		$height = $image->getHeight();
+
+		if (self::isPercent($left)) {
+			$left = (int) round(($this->getWidth() - $width) / 100 * $left);
+		}
+
+		if (self::isPercent($top)) {
+			$top = (int) round(($this->getHeight() - $height) / 100 * $top);
+		}
+
+		$output = $input = $image->image;
+		if ($opacity < 100) {
+			$tbl = [];
+			for ($i = 0; $i < 128; $i++) {
+				$tbl[$i] = round(127 - (127 - $i) * $opacity / 100);
+			}
+
+			$output = imagecreatetruecolor($width, $height);
+			imagealphablending($output, false);
+			if (!$image->isTrueColor()) {
+				$input = $output;
+				imagefilledrectangle($output, 0, 0, $width, $height, imagecolorallocatealpha($output, 0, 0, 0, 127));
+				imagecopy($output, $image->image, 0, 0, 0, 0, $width, $height);
+			}
+
+			for ($x = 0; $x < $width; $x++) {
+				for ($y = 0; $y < $height; $y++) {
+					$c = \imagecolorat($input, $x, $y);
+					$c = ($c & 0xFFFFFF) + ($tbl[$c >> 24] << 24);
+					\imagesetpixel($output, $x, $y, $c);
+				}
+			}
+
+			imagealphablending($output, true);
+		}
+
+		imagecopy(
+			$this->image,
+			$output,
+			$left,
+			$top,
+			0,
+			0,
+			$width,
+			$height,
+		);
+		return $this;
+	}
+
+
+	/**
+	 * Calculates the bounding box for a TrueType text. Returns keys left, top, width and height.
+	 */
+	public static function calculateTextBox(
+		string $text,
+		string $fontFile,
+		float $size,
+		float $angle = 0,
+		array $options = [],
+	): array
+	{
+		self::ensureExtension();
+		$box = imagettfbbox($size, $angle, $fontFile, $text, $options);
+		return [
+			'left' => $minX = min([$box[0], $box[2], $box[4], $box[6]]),
+			'top' => $minY = min([$box[1], $box[3], $box[5], $box[7]]),
+			'width' => max([$box[0], $box[2], $box[4], $box[6]]) - $minX + 1,
+			'height' => max([$box[1], $box[3], $box[5], $box[7]]) - $minY + 1,
+		];
+	}
+
+
+	/**
+	 * Draw a rectangle.
+	 */
+	public function rectangleWH(int $x, int $y, int $width, int $height, ImageColor $color): void
+	{
+		if ($width !== 0 && $height !== 0) {
+			$this->rectangle($x, $y, $x + $width + ($width > 0 ? -1 : 1), $y + $height + ($height > 0 ? -1 : 1), $color);
+		}
+	}
+
+
+	/**
+	 * Draw a filled rectangle.
+	 */
+	public function filledRectangleWH(int $x, int $y, int $width, int $height, ImageColor $color): void
+	{
+		if ($width !== 0 && $height !== 0) {
+			$this->filledRectangle($x, $y, $x + $width + ($width > 0 ? -1 : 1), $y + $height + ($height > 0 ? -1 : 1), $color);
+		}
+	}
+
+
+	/**
+	 * Saves image to the file. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9).
+	 * @param  ImageType::*|null  $type
+	 * @throws ImageException
+	 */
+	public function save(string $file, ?int $quality = null, ?int $type = null): void
+	{
+		$type ??= self::extensionToType(pathinfo($file, PATHINFO_EXTENSION));
+		$this->output($type, $quality, $file);
+	}
+
+
+	/**
+	 * Outputs image to string. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9).
+	 * @param  ImageType::*  $type
+	 */
+	public function toString(int $type = ImageType::JPEG, ?int $quality = null): string
+	{
+		return Helpers::capture(function () use ($type, $quality): void {
+			$this->output($type, $quality);
+		});
+	}
+
+
+	/**
+	 * Outputs image to string.
+	 */
+	public function __toString(): string
+	{
+		return $this->toString();
+	}
+
+
+	/**
+	 * Outputs image to browser. Quality is in the range 0..100 for JPEG (default 85), WEBP (default 80) and AVIF (default 30) and 0..9 for PNG (default 9).
+	 * @param  ImageType::*  $type
+	 * @throws ImageException
+	 */
+	public function send(int $type = ImageType::JPEG, ?int $quality = null): void
+	{
+		header('Content-Type: ' . self::typeToMimeType($type));
+		$this->output($type, $quality);
+	}
+
+
+	/**
+	 * Outputs image to browser or file.
+	 * @param  ImageType::*  $type
+	 * @throws ImageException
+	 */
+	private function output(int $type, ?int $quality, ?string $file = null): void
+	{
+		switch ($type) {
+			case ImageType::JPEG:
+				$quality = $quality === null ? 85 : max(0, min(100, $quality));
+				$success = @imagejpeg($this->image, $file, $quality); // @ is escalated to exception
+				break;
+
+			case ImageType::PNG:
+				$quality = $quality === null ? 9 : max(0, min(9, $quality));
+				$success = @imagepng($this->image, $file, $quality); // @ is escalated to exception
+				break;
+
+			case ImageType::GIF:
+				$success = @imagegif($this->image, $file); // @ is escalated to exception
+				break;
+
+			case ImageType::WEBP:
+				$quality = $quality === null ? 80 : max(0, min(100, $quality));
+				$success = @imagewebp($this->image, $file, $quality); // @ is escalated to exception
+				break;
+
+			case ImageType::AVIF:
+				$quality = $quality === null ? 30 : max(0, min(100, $quality));
+				$success = @imageavif($this->image, $file, $quality); // @ is escalated to exception
+				break;
+
+			case ImageType::BMP:
+				$success = @imagebmp($this->image, $file); // @ is escalated to exception
+				break;
+
+			default:
+				throw new Nette\InvalidArgumentException("Unsupported image type '$type'.");
+		}
+
+		if (!$success) {
+			throw new ImageException(Helpers::getLastError() ?: 'Unknown error');
+		}
+	}
+
+
+	/**
+	 * Call to undefined method.
+	 * @throws Nette\MemberAccessException
+	 */
+	public function __call(string $name, array $args): mixed
+	{
+		$function = 'image' . $name;
+		if (!function_exists($function)) {
+			ObjectHelpers::strictCall(static::class, $name);
+		}
+
+		foreach ($args as $key => $value) {
+			if ($value instanceof self) {
+				$args[$key] = $value->getImageResource();
+
+			} elseif ($value instanceof ImageColor || (is_array($value) && isset($value['red']))) {
+				$args[$key] = $this->resolveColor($value);
+			}
+		}
+
+		$res = $function($this->image, ...$args);
+		return $res instanceof \GdImage
+			? $this->setImageResource($res)
+			: $res;
+	}
+
+
+	public function __clone()
+	{
+		ob_start(function () {});
+		imagepng($this->image, null, 0);
+		$this->setImageResource(imagecreatefromstring(ob_get_clean()));
+	}
+
+
+	private static function isPercent(int|string &$num): bool
+	{
+		if (is_string($num) && str_ends_with($num, '%')) {
+			$num = (float) substr($num, 0, -1);
+			return true;
+		} elseif (is_int($num) || $num === (string) (int) $num) {
+			$num = (int) $num;
+			return false;
+		}
+
+		throw new Nette\InvalidArgumentException("Expected dimension in int|string, '$num' given.");
+	}
+
+
+	/**
+	 * Prevents serialization.
+	 */
+	public function __sleep(): array
+	{
+		throw new Nette\NotSupportedException('You cannot serialize or unserialize ' . self::class . ' instances.');
+	}
+
+
+	public function resolveColor(ImageColor|array $color): int
+	{
+		$color = $color instanceof ImageColor ? $color->toRGBA() : array_values($color);
+		return imagecolorallocatealpha($this->image, ...$color) ?: imagecolorresolvealpha($this->image, ...$color);
+	}
+
+
+	private static function ensureExtension(): void
+	{
+		if (!extension_loaded('gd')) {
+			throw new Nette\NotSupportedException('PHP extension GD is not loaded.');
+		}
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Represent RGB color (0..255) with opacity (0..1).
+ */
+class ImageColor
+{
+	public static function rgb(int $red, int $green, int $blue, float $opacity = 1): self
+	{
+		return new self($red, $green, $blue, $opacity);
+	}
+
+
+	/**
+	 * Accepts formats #RRGGBB, #RRGGBBAA, #RGB, #RGBA
+	 */
+	public static function hex(string $hex): self
+	{
+		$hex = ltrim($hex, '#');
+		$len = strlen($hex);
+		if ($len === 3 || $len === 4) {
+			return new self(
+				(int) hexdec($hex[0]) * 17,
+				(int) hexdec($hex[1]) * 17,
+				(int) hexdec($hex[2]) * 17,
+				(int) hexdec($hex[3] ?? 'F') * 17 / 255,
+			);
+		} elseif ($len === 6 || $len === 8) {
+			return new self(
+				(int) hexdec($hex[0] . $hex[1]),
+				(int) hexdec($hex[2] . $hex[3]),
+				(int) hexdec($hex[4] . $hex[5]),
+				(int) hexdec(($hex[6] ?? 'F') . ($hex[7] ?? 'F')) / 255,
+			);
+		} else {
+			throw new Nette\InvalidArgumentException('Invalid hex color format.');
+		}
+	}
+
+
+	private function __construct(
+		public int $red,
+		public int $green,
+		public int $blue,
+		public float $opacity = 1,
+	) {
+		$this->red = max(0, min(255, $red));
+		$this->green = max(0, min(255, $green));
+		$this->blue = max(0, min(255, $blue));
+		$this->opacity = max(0, min(1, $opacity));
+	}
+
+
+	public function toRGBA(): array
+	{
+		return [
+			max(0, min(255, $this->red)),
+			max(0, min(255, $this->green)),
+			max(0, min(255, $this->blue)),
+			max(0, min(127, (int) round(127 - $this->opacity * 127))),
+		];
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+
+/**
+ * Type of image file.
+ */
+/*enum*/ final class ImageType
+{
+	public const
+		JPEG = IMAGETYPE_JPEG,
+		PNG = IMAGETYPE_PNG,
+		GIF = IMAGETYPE_GIF,
+		WEBP = IMAGETYPE_WEBP,
+		AVIF = 19, // IMAGETYPE_AVIF,
+		BMP = IMAGETYPE_BMP;
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,238 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Utilities for iterables.
+ */
+final class Iterables
+{
+	use Nette\StaticClass;
+
+	/**
+	 * Tests for the presence of value.
+	 */
+	public static function contains(iterable $iterable, mixed $value): bool
+	{
+		foreach ($iterable as $v) {
+			if ($v === $value) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Tests for the presence of key.
+	 */
+	public static function containsKey(iterable $iterable, mixed $key): bool
+	{
+		foreach ($iterable as $k => $v) {
+			if ($k === $key) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Returns the first item (matching the specified predicate if given). If there is no such item, it returns result of invoking $else or null.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @param  ?callable(V, K, iterable<K, V>): bool  $predicate
+	 * @return ?V
+	 */
+	public static function first(iterable $iterable, ?callable $predicate = null, ?callable $else = null): mixed
+	{
+		foreach ($iterable as $k => $v) {
+			if (!$predicate || $predicate($v, $k, $iterable)) {
+				return $v;
+			}
+		}
+		return $else ? $else() : null;
+	}
+
+
+	/**
+	 * Returns the key of first item (matching the specified predicate if given). If there is no such item, it returns result of invoking $else or null.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @param  ?callable(V, K, iterable<K, V>): bool  $predicate
+	 * @return ?K
+	 */
+	public static function firstKey(iterable $iterable, ?callable $predicate = null, ?callable $else = null): mixed
+	{
+		foreach ($iterable as $k => $v) {
+			if (!$predicate || $predicate($v, $k, $iterable)) {
+				return $k;
+			}
+		}
+		return $else ? $else() : null;
+	}
+
+
+	/**
+	 * Tests whether at least one element in the iterator passes the test implemented by the provided function.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @param  callable(V, K, iterable<K, V>): bool  $predicate
+	 */
+	public static function some(iterable $iterable, callable $predicate): bool
+	{
+		foreach ($iterable as $k => $v) {
+			if ($predicate($v, $k, $iterable)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * Tests whether all elements in the iterator pass the test implemented by the provided function.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @param  callable(V, K, iterable<K, V>): bool  $predicate
+	 */
+	public static function every(iterable $iterable, callable $predicate): bool
+	{
+		foreach ($iterable as $k => $v) {
+			if (!$predicate($v, $k, $iterable)) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+
+	/**
+	 * Iterator that filters elements according to a given $predicate. Maintains original keys.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @param  callable(V, K, iterable<K, V>): bool  $predicate
+	 * @return \Generator<K, V>
+	 */
+	public static function filter(iterable $iterable, callable $predicate): \Generator
+	{
+		foreach ($iterable as $k => $v) {
+			if ($predicate($v, $k, $iterable)) {
+				yield $k => $v;
+			}
+		}
+	}
+
+
+	/**
+	 * Iterator that transforms values by calling $transformer. Maintains original keys.
+	 * @template K
+	 * @template V
+	 * @template R
+	 * @param  iterable<K, V>  $iterable
+	 * @param  callable(V, K, iterable<K, V>): R  $transformer
+	 * @return \Generator<K, R>
+	 */
+	public static function map(iterable $iterable, callable $transformer): \Generator
+	{
+		foreach ($iterable as $k => $v) {
+			yield $k => $transformer($v, $k, $iterable);
+		}
+	}
+
+
+	/**
+	 * Iterator that transforms keys and values by calling $transformer. If it returns null, the element is skipped.
+	 * @template K
+	 * @template V
+	 * @template ResV
+	 * @template ResK
+	 * @param  iterable<K, V>  $iterable
+	 * @param  callable(V, K, iterable<K, V>): ?array{ResV, ResK}  $transformer
+	 * @return \Generator<ResV, ResK>
+	 */
+	public static function mapWithKeys(iterable $iterable, callable $transformer): \Generator
+	{
+		foreach ($iterable as $k => $v) {
+			$pair = $transformer($v, $k, $iterable);
+			if ($pair) {
+				yield $pair[0] => $pair[1];
+			}
+		}
+	}
+
+
+	/**
+	 * Wraps around iterator and caches its keys and values during iteration.
+	 * This allows the data to be re-iterated multiple times.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @return \IteratorAggregate<K, V>
+	 */
+	public static function memoize(iterable $iterable): iterable
+	{
+		return new class (self::toIterator($iterable)) implements \IteratorAggregate {
+			public function __construct(
+				private \Iterator $iterator,
+				private array $cache = [],
+			) {
+			}
+
+
+			public function getIterator(): \Generator
+			{
+				if (!$this->cache) {
+					$this->iterator->rewind();
+				}
+				$i = 0;
+				while (true) {
+					if (isset($this->cache[$i])) {
+						[$k, $v] = $this->cache[$i];
+					} elseif ($this->iterator->valid()) {
+						$k = $this->iterator->key();
+						$v = $this->iterator->current();
+						$this->iterator->next();
+						$this->cache[$i] = [$k, $v];
+					} else {
+						break;
+					}
+					yield $k => $v;
+					$i++;
+				}
+			}
+		};
+	}
+
+
+	/**
+	 * Creates an iterator from anything that is iterable.
+	 * @template K
+	 * @template V
+	 * @param  iterable<K, V>  $iterable
+	 * @return \Iterator<K, V>
+	 */
+	public static function toIterator(iterable $iterable): \Iterator
+	{
+		return match (true) {
+			$iterable instanceof \Iterator => $iterable,
+			$iterable instanceof \IteratorAggregate => self::toIterator($iterable->getIterator()),
+			is_array($iterable) => new \ArrayIterator($iterable),
+		};
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * JSON encoder and decoder.
+ */
+final class Json
+{
+	use Nette\StaticClass;
+
+	/** @deprecated use Json::decode(..., forceArrays: true) */
+	public const FORCE_ARRAY = JSON_OBJECT_AS_ARRAY;
+
+	/** @deprecated use Json::encode(..., pretty: true) */
+	public const PRETTY = JSON_PRETTY_PRINT;
+
+	/** @deprecated use Json::encode(..., asciiSafe: true) */
+	public const ESCAPE_UNICODE = 1 << 19;
+
+
+	/**
+	 * Converts value to JSON format. Use $pretty for easier reading and clarity, $asciiSafe for ASCII output
+	 * and $htmlSafe for HTML escaping, $forceObjects enforces the encoding of non-associateve arrays as objects.
+	 * @throws JsonException
+	 */
+	public static function encode(
+		mixed $value,
+		bool|int $pretty = false,
+		bool $asciiSafe = false,
+		bool $htmlSafe = false,
+		bool $forceObjects = false,
+	): string
+	{
+		if (is_int($pretty)) { // back compatibility
+			$flags = ($pretty & self::ESCAPE_UNICODE ? 0 : JSON_UNESCAPED_UNICODE) | ($pretty & ~self::ESCAPE_UNICODE);
+		} else {
+			$flags = ($asciiSafe ? 0 : JSON_UNESCAPED_UNICODE)
+				| ($pretty ? JSON_PRETTY_PRINT : 0)
+				| ($forceObjects ? JSON_FORCE_OBJECT : 0)
+				| ($htmlSafe ? JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_TAG : 0);
+		}
+
+		$flags |= JSON_UNESCAPED_SLASHES
+			| (defined('JSON_PRESERVE_ZERO_FRACTION') ? JSON_PRESERVE_ZERO_FRACTION : 0); // since PHP 5.6.6 & PECL JSON-C 1.3.7
+
+		$json = json_encode($value, $flags);
+		if ($error = json_last_error()) {
+			throw new JsonException(json_last_error_msg(), $error);
+		}
+
+		return $json;
+	}
+
+
+	/**
+	 * Parses JSON to PHP value. The $forceArrays enforces the decoding of objects as arrays.
+	 * @throws JsonException
+	 */
+	public static function decode(string $json, bool|int $forceArrays = false): mixed
+	{
+		$flags = is_int($forceArrays) // back compatibility
+			? $forceArrays
+			: ($forceArrays ? JSON_OBJECT_AS_ARRAY : 0);
+		$flags |= JSON_BIGINT_AS_STRING;
+
+		$value = json_decode($json, flags: $flags);
+		if ($error = json_last_error()) {
+			throw new JsonException(json_last_error_msg(), $error);
+		}
+
+		return $value;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,229 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+use Nette\MemberAccessException;
+
+
+/**
+ * Nette\SmartObject helpers.
+ * @internal
+ */
+final class ObjectHelpers
+{
+	use Nette\StaticClass;
+
+	/**
+	 * @return never
+	 * @throws MemberAccessException
+	 */
+	public static function strictGet(string $class, string $name): void
+	{
+		$rc = new \ReflectionClass($class);
+		$hint = self::getSuggestion(array_merge(
+			array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), fn($p) => !$p->isStatic()),
+			self::parseFullDoc($rc, '~^[ \t*]*@property(?:-read)?[ \t]+(?:\S+[ \t]+)??\$(\w+)~m'),
+		), $name);
+		throw new MemberAccessException("Cannot read an undeclared property $class::\$$name" . ($hint ? ", did you mean \$$hint?" : '.'));
+	}
+
+
+	/**
+	 * @return never
+	 * @throws MemberAccessException
+	 */
+	public static function strictSet(string $class, string $name): void
+	{
+		$rc = new \ReflectionClass($class);
+		$hint = self::getSuggestion(array_merge(
+			array_filter($rc->getProperties(\ReflectionProperty::IS_PUBLIC), fn($p) => !$p->isStatic()),
+			self::parseFullDoc($rc, '~^[ \t*]*@property(?:-write)?[ \t]+(?:\S+[ \t]+)??\$(\w+)~m'),
+		), $name);
+		throw new MemberAccessException("Cannot write to an undeclared property $class::\$$name" . ($hint ? ", did you mean \$$hint?" : '.'));
+	}
+
+
+	/**
+	 * @return never
+	 * @throws MemberAccessException
+	 */
+	public static function strictCall(string $class, string $method, array $additionalMethods = []): void
+	{
+		$trace = debug_backtrace(0, 3); // suppose this method is called from __call()
+		$context = ($trace[1]['function'] ?? null) === '__call'
+			? ($trace[2]['class'] ?? null)
+			: null;
+
+		if ($context && is_a($class, $context, true) && method_exists($context, $method)) { // called parent::$method()
+			$class = get_parent_class($context);
+		}
+
+		if (method_exists($class, $method)) { // insufficient visibility
+			$rm = new \ReflectionMethod($class, $method);
+			$visibility = $rm->isPrivate()
+				? 'private '
+				: ($rm->isProtected() ? 'protected ' : '');
+			throw new MemberAccessException("Call to {$visibility}method $class::$method() from " . ($context ? "scope $context." : 'global scope.'));
+
+		} else {
+			$hint = self::getSuggestion(array_merge(
+				get_class_methods($class),
+				self::parseFullDoc(new \ReflectionClass($class), '~^[ \t*]*@method[ \t]+(?:static[ \t]+)?(?:\S+[ \t]+)??(\w+)\(~m'),
+				$additionalMethods,
+			), $method);
+			throw new MemberAccessException("Call to undefined method $class::$method()" . ($hint ? ", did you mean $hint()?" : '.'));
+		}
+	}
+
+
+	/**
+	 * @return never
+	 * @throws MemberAccessException
+	 */
+	public static function strictStaticCall(string $class, string $method): void
+	{
+		$trace = debug_backtrace(0, 3); // suppose this method is called from __callStatic()
+		$context = ($trace[1]['function'] ?? null) === '__callStatic'
+			? ($trace[2]['class'] ?? null)
+			: null;
+
+		if ($context && is_a($class, $context, true) && method_exists($context, $method)) { // called parent::$method()
+			$class = get_parent_class($context);
+		}
+
+		if (method_exists($class, $method)) { // insufficient visibility
+			$rm = new \ReflectionMethod($class, $method);
+			$visibility = $rm->isPrivate()
+				? 'private '
+				: ($rm->isProtected() ? 'protected ' : '');
+			throw new MemberAccessException("Call to {$visibility}method $class::$method() from " . ($context ? "scope $context." : 'global scope.'));
+
+		} else {
+			$hint = self::getSuggestion(
+				array_filter((new \ReflectionClass($class))->getMethods(\ReflectionMethod::IS_PUBLIC), fn($m) => $m->isStatic()),
+				$method,
+			);
+			throw new MemberAccessException("Call to undefined static method $class::$method()" . ($hint ? ", did you mean $hint()?" : '.'));
+		}
+	}
+
+
+	/**
+	 * Returns array of magic properties defined by annotation @property.
+	 * @return array of [name => bit mask]
+	 * @internal
+	 */
+	public static function getMagicProperties(string $class): array
+	{
+		static $cache;
+		$props = &$cache[$class];
+		if ($props !== null) {
+			return $props;
+		}
+
+		$rc = new \ReflectionClass($class);
+		preg_match_all(
+			'~^  [ \t*]*  @property(|-read|-write|-deprecated)  [ \t]+  [^\s$]+  [ \t]+  \$  (\w+)  ()~mx',
+			(string) $rc->getDocComment(),
+			$matches,
+			PREG_SET_ORDER,
+		);
+
+		$props = [];
+		foreach ($matches as [, $type, $name]) {
+			$uname = ucfirst($name);
+			$write = $type !== '-read'
+				&& $rc->hasMethod($nm = 'set' . $uname)
+				&& ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic();
+			$read = $type !== '-write'
+				&& ($rc->hasMethod($nm = 'get' . $uname) || $rc->hasMethod($nm = 'is' . $uname))
+				&& ($rm = $rc->getMethod($nm))->name === $nm && !$rm->isPrivate() && !$rm->isStatic();
+
+			if ($read || $write) {
+				$props[$name] = $read << 0 | ($nm[0] === 'g') << 1 | $rm->returnsReference() << 2 | $write << 3 | ($type === '-deprecated') << 4;
+			}
+		}
+
+		foreach ($rc->getTraits() as $trait) {
+			$props += self::getMagicProperties($trait->name);
+		}
+
+		if ($parent = get_parent_class($class)) {
+			$props += self::getMagicProperties($parent);
+		}
+
+		return $props;
+	}
+
+
+	/**
+	 * Finds the best suggestion (for 8-bit encoding).
+	 * @param  (\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionClass|\ReflectionProperty|string)[]  $possibilities
+	 * @internal
+	 */
+	public static function getSuggestion(array $possibilities, string $value): ?string
+	{
+		$norm = preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '+', $value);
+		$best = null;
+		$min = (strlen($value) / 4 + 1) * 10 + .1;
+		foreach (array_unique($possibilities, SORT_REGULAR) as $item) {
+			$item = $item instanceof \Reflector ? $item->name : $item;
+			if ($item !== $value && (
+				($len = levenshtein($item, $value, 10, 11, 10)) < $min
+				|| ($len = levenshtein(preg_replace($re, '*', $item), $norm, 10, 11, 10)) < $min
+			)) {
+				$min = $len;
+				$best = $item;
+			}
+		}
+
+		return $best;
+	}
+
+
+	private static function parseFullDoc(\ReflectionClass $rc, string $pattern): array
+	{
+		do {
+			$doc[] = $rc->getDocComment();
+			$traits = $rc->getTraits();
+			while ($trait = array_pop($traits)) {
+				$doc[] = $trait->getDocComment();
+				$traits += $trait->getTraits();
+			}
+		} while ($rc = $rc->getParentClass());
+
+		return preg_match_all($pattern, implode('', $doc), $m) ? $m[1] : [];
+	}
+
+
+	/**
+	 * Checks if the public non-static property exists.
+	 * Returns 'event' if the property exists and has event like name
+	 * @internal
+	 */
+	public static function hasProperty(string $class, string $name): bool|string
+	{
+		static $cache;
+		$prop = &$cache[$class][$name];
+		if ($prop === null) {
+			$prop = false;
+			try {
+				$rp = new \ReflectionProperty($class, $name);
+				if ($rp->isPublic() && !$rp->isStatic()) {
+					$prop = $name >= 'onA' && $name < 'on_' ? 'event' : true;
+				}
+			} catch (\ReflectionException $e) {
+			}
+		}
+
+		return $prop;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Paginating math.
+ *
+ * @property   int $page
+ * @property-read int $firstPage
+ * @property-read int|null $lastPage
+ * @property-read int<0,max> $firstItemOnPage
+ * @property-read int<0,max> $lastItemOnPage
+ * @property   int $base
+ * @property-read bool $first
+ * @property-read bool $last
+ * @property-read int<0,max>|null $pageCount
+ * @property   positive-int $itemsPerPage
+ * @property   int<0,max>|null $itemCount
+ * @property-read int<0,max> $offset
+ * @property-read int<0,max>|null $countdownOffset
+ * @property-read int<0,max> $length
+ */
+class Paginator
+{
+	use Nette\SmartObject;
+
+	private int $base = 1;
+
+	/** @var positive-int */
+	private int $itemsPerPage = 1;
+
+	private int $page = 1;
+
+	/** @var int<0, max>|null */
+	private ?int $itemCount = null;
+
+
+	/**
+	 * Sets current page number.
+	 */
+	public function setPage(int $page): static
+	{
+		$this->page = $page;
+		return $this;
+	}
+
+
+	/**
+	 * Returns current page number.
+	 */
+	public function getPage(): int
+	{
+		return $this->base + $this->getPageIndex();
+	}
+
+
+	/**
+	 * Returns first page number.
+	 */
+	public function getFirstPage(): int
+	{
+		return $this->base;
+	}
+
+
+	/**
+	 * Returns last page number.
+	 */
+	public function getLastPage(): ?int
+	{
+		return $this->itemCount === null
+			? null
+			: $this->base + max(0, $this->getPageCount() - 1);
+	}
+
+
+	/**
+	 * Returns the sequence number of the first element on the page
+	 * @return int<0, max>
+	 */
+	public function getFirstItemOnPage(): int
+	{
+		return $this->itemCount !== 0
+			? $this->offset + 1
+			: 0;
+	}
+
+
+	/**
+	 * Returns the sequence number of the last element on the page
+	 * @return int<0, max>
+	 */
+	public function getLastItemOnPage(): int
+	{
+		return $this->offset + $this->length;
+	}
+
+
+	/**
+	 * Sets first page (base) number.
+	 */
+	public function setBase(int $base): static
+	{
+		$this->base = $base;
+		return $this;
+	}
+
+
+	/**
+	 * Returns first page (base) number.
+	 */
+	public function getBase(): int
+	{
+		return $this->base;
+	}
+
+
+	/**
+	 * Returns zero-based page number.
+	 * @return int<0, max>
+	 */
+	protected function getPageIndex(): int
+	{
+		$index = max(0, $this->page - $this->base);
+		return $this->itemCount === null
+			? $index
+			: min($index, max(0, $this->getPageCount() - 1));
+	}
+
+
+	/**
+	 * Is the current page the first one?
+	 */
+	public function isFirst(): bool
+	{
+		return $this->getPageIndex() === 0;
+	}
+
+
+	/**
+	 * Is the current page the last one?
+	 */
+	public function isLast(): bool
+	{
+		return $this->itemCount === null
+			? false
+			: $this->getPageIndex() >= $this->getPageCount() - 1;
+	}
+
+
+	/**
+	 * Returns the total number of pages.
+	 * @return int<0, max>|null
+	 */
+	public function getPageCount(): ?int
+	{
+		return $this->itemCount === null
+			? null
+			: (int) ceil($this->itemCount / $this->itemsPerPage);
+	}
+
+
+	/**
+	 * Sets the number of items to display on a single page.
+	 */
+	public function setItemsPerPage(int $itemsPerPage): static
+	{
+		$this->itemsPerPage = max(1, $itemsPerPage);
+		return $this;
+	}
+
+
+	/**
+	 * Returns the number of items to display on a single page.
+	 * @return positive-int
+	 */
+	public function getItemsPerPage(): int
+	{
+		return $this->itemsPerPage;
+	}
+
+
+	/**
+	 * Sets the total number of items.
+	 */
+	public function setItemCount(?int $itemCount = null): static
+	{
+		$this->itemCount = $itemCount === null ? null : max(0, $itemCount);
+		return $this;
+	}
+
+
+	/**
+	 * Returns the total number of items.
+	 * @return int<0, max>|null
+	 */
+	public function getItemCount(): ?int
+	{
+		return $this->itemCount;
+	}
+
+
+	/**
+	 * Returns the absolute index of the first item on current page.
+	 * @return int<0, max>
+	 */
+	public function getOffset(): int
+	{
+		return $this->getPageIndex() * $this->itemsPerPage;
+	}
+
+
+	/**
+	 * Returns the absolute index of the first item on current page in countdown paging.
+	 * @return int<0, max>|null
+	 */
+	public function getCountdownOffset(): ?int
+	{
+		return $this->itemCount === null
+			? null
+			: max(0, $this->itemCount - ($this->getPageIndex() + 1) * $this->itemsPerPage);
+	}
+
+
+	/**
+	 * Returns the number of items on current page.
+	 * @return int<0, max>
+	 */
+	public function getLength(): int
+	{
+		return $this->itemCount === null
+			? $this->itemsPerPage
+			: min($this->itemsPerPage, $this->itemCount - $this->getPageIndex() * $this->itemsPerPage);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+use Random\Randomizer;
+
+
+/**
+ * Secure random string generator.
+ */
+final class Random
+{
+	use Nette\StaticClass;
+
+	/**
+	 * Generates a random string of given length from characters specified in second argument.
+	 * Supports intervals, such as `0-9` or `A-Z`.
+	 */
+	public static function generate(int $length = 10, string $charlist = '0-9a-z'): string
+	{
+		$charlist = preg_replace_callback(
+			'#.-.#',
+			fn(array $m): string => implode('', range($m[0][0], $m[0][2])),
+			$charlist,
+		);
+		$charlist = count_chars($charlist, mode: 3);
+		$chLen = strlen($charlist);
+
+		if ($length < 1) {
+			throw new Nette\InvalidArgumentException('Length must be greater than zero.');
+		} elseif ($chLen < 2) {
+			throw new Nette\InvalidArgumentException('Character list must contain at least two chars.');
+		} elseif (PHP_VERSION_ID >= 80300) {
+			return (new Randomizer)->getBytesFromString($charlist, $length);
+		}
+
+		$res = '';
+		for ($i = 0; $i < $length; $i++) {
+			$res .= $charlist[random_int(0, $chLen - 1)];
+		}
+
+		return $res;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,322 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * PHP reflection helpers.
+ */
+final class Reflection
+{
+	use Nette\StaticClass;
+
+	/** @deprecated use Nette\Utils\Validator::isBuiltinType() */
+	public static function isBuiltinType(string $type): bool
+	{
+		return Validators::isBuiltinType($type);
+	}
+
+
+	/** @deprecated use Nette\Utils\Validator::isClassKeyword() */
+	public static function isClassKeyword(string $name): bool
+	{
+		return Validators::isClassKeyword($name);
+	}
+
+
+	/** @deprecated use native ReflectionParameter::getDefaultValue() */
+	public static function getParameterDefaultValue(\ReflectionParameter $param): mixed
+	{
+		if ($param->isDefaultValueConstant()) {
+			$const = $orig = $param->getDefaultValueConstantName();
+			$pair = explode('::', $const);
+			if (isset($pair[1])) {
+				$pair[0] = Type::resolve($pair[0], $param);
+				try {
+					$rcc = new \ReflectionClassConstant($pair[0], $pair[1]);
+				} catch (\ReflectionException $e) {
+					$name = self::toString($param);
+					throw new \ReflectionException("Unable to resolve constant $orig used as default value of $name.", 0, $e);
+				}
+
+				return $rcc->getValue();
+
+			} elseif (!defined($const)) {
+				$const = substr((string) strrchr($const, '\\'), 1);
+				if (!defined($const)) {
+					$name = self::toString($param);
+					throw new \ReflectionException("Unable to resolve constant $orig used as default value of $name.");
+				}
+			}
+
+			return constant($const);
+		}
+
+		return $param->getDefaultValue();
+	}
+
+
+	/**
+	 * Returns a reflection of a class or trait that contains a declaration of given property. Property can also be declared in the trait.
+	 */
+	public static function getPropertyDeclaringClass(\ReflectionProperty $prop): \ReflectionClass
+	{
+		foreach ($prop->getDeclaringClass()->getTraits() as $trait) {
+			if ($trait->hasProperty($prop->name)
+				// doc-comment guessing as workaround for insufficient PHP reflection
+				&& $trait->getProperty($prop->name)->getDocComment() === $prop->getDocComment()
+			) {
+				return self::getPropertyDeclaringClass($trait->getProperty($prop->name));
+			}
+		}
+
+		return $prop->getDeclaringClass();
+	}
+
+
+	/**
+	 * Returns a reflection of a method that contains a declaration of $method.
+	 * Usually, each method is its own declaration, but the body of the method can also be in the trait and under a different name.
+	 */
+	public static function getMethodDeclaringMethod(\ReflectionMethod $method): \ReflectionMethod
+	{
+		// file & line guessing as workaround for insufficient PHP reflection
+		$decl = $method->getDeclaringClass();
+		if ($decl->getFileName() === $method->getFileName()
+			&& $decl->getStartLine() <= $method->getStartLine()
+			&& $decl->getEndLine() >= $method->getEndLine()
+		) {
+			return $method;
+		}
+
+		$hash = [$method->getFileName(), $method->getStartLine(), $method->getEndLine()];
+		if (($alias = $decl->getTraitAliases()[$method->name] ?? null)
+			&& ($m = new \ReflectionMethod(...explode('::', $alias, 2)))
+			&& $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()]
+		) {
+			return self::getMethodDeclaringMethod($m);
+		}
+
+		foreach ($decl->getTraits() as $trait) {
+			if ($trait->hasMethod($method->name)
+				&& ($m = $trait->getMethod($method->name))
+				&& $hash === [$m->getFileName(), $m->getStartLine(), $m->getEndLine()]
+			) {
+				return self::getMethodDeclaringMethod($m);
+			}
+		}
+
+		return $method;
+	}
+
+
+	/**
+	 * Finds out if reflection has access to PHPdoc comments. Comments may not be available due to the opcode cache.
+	 */
+	public static function areCommentsAvailable(): bool
+	{
+		static $res;
+		return $res ?? $res = (bool) (new \ReflectionMethod(self::class, __FUNCTION__))->getDocComment();
+	}
+
+
+	public static function toString(\Reflector $ref): string
+	{
+		if ($ref instanceof \ReflectionClass) {
+			return $ref->name;
+		} elseif ($ref instanceof \ReflectionMethod) {
+			return $ref->getDeclaringClass()->name . '::' . $ref->name . '()';
+		} elseif ($ref instanceof \ReflectionFunction) {
+			return PHP_VERSION_ID >= 80200 && $ref->isAnonymous()
+				? '{closure}()'
+				: $ref->name . '()';
+		} elseif ($ref instanceof \ReflectionProperty) {
+			return self::getPropertyDeclaringClass($ref)->name . '::$' . $ref->name;
+		} elseif ($ref instanceof \ReflectionParameter) {
+			return '$' . $ref->name . ' in ' . self::toString($ref->getDeclaringFunction());
+		} else {
+			throw new Nette\InvalidArgumentException;
+		}
+	}
+
+
+	/**
+	 * Expands the name of the class to full name in the given context of given class.
+	 * Thus, it returns how the PHP parser would understand $name if it were written in the body of the class $context.
+	 * @throws Nette\InvalidArgumentException
+	 */
+	public static function expandClassName(string $name, \ReflectionClass $context): string
+	{
+		$lower = strtolower($name);
+		if (empty($name)) {
+			throw new Nette\InvalidArgumentException('Class name must not be empty.');
+
+		} elseif (Validators::isBuiltinType($lower)) {
+			return $lower;
+
+		} elseif ($lower === 'self' || $lower === 'static') {
+			return $context->name;
+
+		} elseif ($lower === 'parent') {
+			return $context->getParentClass()
+				? $context->getParentClass()->name
+				: 'parent';
+
+		} elseif ($name[0] === '\\') { // fully qualified name
+			return ltrim($name, '\\');
+		}
+
+		$uses = self::getUseStatements($context);
+		$parts = explode('\\', $name, 2);
+		if (isset($uses[$parts[0]])) {
+			$parts[0] = $uses[$parts[0]];
+			return implode('\\', $parts);
+
+		} elseif ($context->inNamespace()) {
+			return $context->getNamespaceName() . '\\' . $name;
+
+		} else {
+			return $name;
+		}
+	}
+
+
+	/** @return array<string, class-string> of [alias => class] */
+	public static function getUseStatements(\ReflectionClass $class): array
+	{
+		if ($class->isAnonymous()) {
+			throw new Nette\NotImplementedException('Anonymous classes are not supported.');
+		}
+
+		static $cache = [];
+		if (!isset($cache[$name = $class->name])) {
+			if ($class->isInternal()) {
+				$cache[$name] = [];
+			} else {
+				$code = file_get_contents($class->getFileName());
+				$cache = self::parseUseStatements($code, $name) + $cache;
+			}
+		}
+
+		return $cache[$name];
+	}
+
+
+	/**
+	 * Parses PHP code to [class => [alias => class, ...]]
+	 */
+	private static function parseUseStatements(string $code, ?string $forClass = null): array
+	{
+		try {
+			$tokens = \PhpToken::tokenize($code, TOKEN_PARSE);
+		} catch (\ParseError $e) {
+			trigger_error($e->getMessage(), E_USER_NOTICE);
+			$tokens = [];
+		}
+
+		$namespace = $class = null;
+		$classLevel = $level = 0;
+		$res = $uses = [];
+
+		$nameTokens = [T_STRING, T_NS_SEPARATOR, T_NAME_QUALIFIED, T_NAME_FULLY_QUALIFIED];
+
+		while ($token = current($tokens)) {
+			next($tokens);
+			switch ($token->id) {
+				case T_NAMESPACE:
+					$namespace = ltrim(self::fetch($tokens, $nameTokens) . '\\', '\\');
+					$uses = [];
+					break;
+
+				case T_CLASS:
+				case T_INTERFACE:
+				case T_TRAIT:
+				case PHP_VERSION_ID < 80100
+					? T_CLASS
+					: T_ENUM:
+					if ($name = self::fetch($tokens, T_STRING)) {
+						$class = $namespace . $name;
+						$classLevel = $level + 1;
+						$res[$class] = $uses;
+						if ($class === $forClass) {
+							return $res;
+						}
+					}
+
+					break;
+
+				case T_USE:
+					while (!$class && ($name = self::fetch($tokens, $nameTokens))) {
+						$name = ltrim($name, '\\');
+						if (self::fetch($tokens, '{')) {
+							while ($suffix = self::fetch($tokens, $nameTokens)) {
+								if (self::fetch($tokens, T_AS)) {
+									$uses[self::fetch($tokens, T_STRING)] = $name . $suffix;
+								} else {
+									$tmp = explode('\\', $suffix);
+									$uses[end($tmp)] = $name . $suffix;
+								}
+
+								if (!self::fetch($tokens, ',')) {
+									break;
+								}
+							}
+						} elseif (self::fetch($tokens, T_AS)) {
+							$uses[self::fetch($tokens, T_STRING)] = $name;
+
+						} else {
+							$tmp = explode('\\', $name);
+							$uses[end($tmp)] = $name;
+						}
+
+						if (!self::fetch($tokens, ',')) {
+							break;
+						}
+					}
+
+					break;
+
+				case T_CURLY_OPEN:
+				case T_DOLLAR_OPEN_CURLY_BRACES:
+				case ord('{'):
+					$level++;
+					break;
+
+				case ord('}'):
+					if ($level === $classLevel) {
+						$class = $classLevel = 0;
+					}
+
+					$level--;
+			}
+		}
+
+		return $res;
+	}
+
+
+	private static function fetch(array &$tokens, string|int|array $take): ?string
+	{
+		$res = null;
+		while ($token = current($tokens)) {
+			if ($token->is($take)) {
+				$res .= $token->text;
+			} elseif (!$token->is([T_DOC_COMMENT, T_WHITESPACE, T_COMMENT])) {
+				break;
+			}
+
+			next($tokens);
+		}
+
+		return $res;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+
+/**
+ * ReflectionMethod preserving the original class name.
+ * @internal
+ */
+final class ReflectionMethod extends \ReflectionMethod
+{
+	private \ReflectionClass $originalClass;
+
+
+	public function __construct(object|string $objectOrMethod, ?string $method = null)
+	{
+		if (is_string($objectOrMethod) && str_contains($objectOrMethod, '::')) {
+			[$objectOrMethod, $method] = explode('::', $objectOrMethod, 2);
+		}
+		parent::__construct($objectOrMethod, $method);
+		$this->originalClass = new \ReflectionClass($objectOrMethod);
+	}
+
+
+	public function getOriginalClass(): \ReflectionClass
+	{
+		return $this->originalClass;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,728 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use JetBrains\PhpStorm\Language;
+use Nette;
+use function is_array, is_object, strlen;
+
+
+/**
+ * String tools library.
+ */
+class Strings
+{
+	use Nette\StaticClass;
+
+	public const TrimCharacters = " \t\n\r\0\x0B\u{A0}\u{2000}\u{2001}\u{2002}\u{2003}\u{2004}\u{2005}\u{2006}\u{2007}\u{2008}\u{2009}\u{200A}\u{200B}";
+
+	/** @deprecated use Strings::TrimCharacters */
+	public const TRIM_CHARACTERS = self::TrimCharacters;
+
+
+	/**
+	 * @deprecated use Nette\Utils\Validator::isUnicode()
+	 */
+	public static function checkEncoding(string $s): bool
+	{
+		return $s === self::fixEncoding($s);
+	}
+
+
+	/**
+	 * Removes all invalid UTF-8 characters from a string.
+	 */
+	public static function fixEncoding(string $s): string
+	{
+		// removes xD800-xDFFF, x110000 and higher
+		return htmlspecialchars_decode(htmlspecialchars($s, ENT_NOQUOTES | ENT_IGNORE, 'UTF-8'), ENT_NOQUOTES);
+	}
+
+
+	/**
+	 * Returns a specific character in UTF-8 from code point (number in range 0x0000..D7FF or 0xE000..10FFFF).
+	 * @throws Nette\InvalidArgumentException if code point is not in valid range
+	 */
+	public static function chr(int $code): string
+	{
+		if ($code < 0 || ($code >= 0xD800 && $code <= 0xDFFF) || $code > 0x10FFFF) {
+			throw new Nette\InvalidArgumentException('Code point must be in range 0x0 to 0xD7FF or 0xE000 to 0x10FFFF.');
+		} elseif (!extension_loaded('iconv')) {
+			throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.');
+		}
+
+		return iconv('UTF-32BE', 'UTF-8//IGNORE', pack('N', $code));
+	}
+
+
+	/**
+	 * Returns a code point of specific character in UTF-8 (number in range 0x0000..D7FF or 0xE000..10FFFF).
+	 */
+	public static function ord(string $c): int
+	{
+		if (!extension_loaded('iconv')) {
+			throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.');
+		}
+
+		$tmp = iconv('UTF-8', 'UTF-32BE//IGNORE', $c);
+		if (!$tmp) {
+			throw new Nette\InvalidArgumentException('Invalid UTF-8 character "' . ($c === '' ? '' : '\x' . strtoupper(bin2hex($c))) . '".');
+		}
+
+		return unpack('N', $tmp)[1];
+	}
+
+
+	/**
+	 * @deprecated use str_starts_with()
+	 */
+	public static function startsWith(string $haystack, string $needle): bool
+	{
+		return str_starts_with($haystack, $needle);
+	}
+
+
+	/**
+	 * @deprecated use str_ends_with()
+	 */
+	public static function endsWith(string $haystack, string $needle): bool
+	{
+		return str_ends_with($haystack, $needle);
+	}
+
+
+	/**
+	 * @deprecated use str_contains()
+	 */
+	public static function contains(string $haystack, string $needle): bool
+	{
+		return str_contains($haystack, $needle);
+	}
+
+
+	/**
+	 * Returns a part of UTF-8 string specified by starting position and length. If start is negative,
+	 * the returned string will start at the start'th character from the end of string.
+	 */
+	public static function substring(string $s, int $start, ?int $length = null): string
+	{
+		if (function_exists('mb_substr')) {
+			return mb_substr($s, $start, $length, 'UTF-8'); // MB is much faster
+		} elseif (!extension_loaded('iconv')) {
+			throw new Nette\NotSupportedException(__METHOD__ . '() requires extension ICONV or MBSTRING, neither is loaded.');
+		} elseif ($length === null) {
+			$length = self::length($s);
+		} elseif ($start < 0 && $length < 0) {
+			$start += self::length($s); // unifies iconv_substr behavior with mb_substr
+		}
+
+		return iconv_substr($s, $start, $length, 'UTF-8');
+	}
+
+
+	/**
+	 * Removes control characters, normalizes line breaks to `\n`, removes leading and trailing blank lines,
+	 * trims end spaces on lines, normalizes UTF-8 to the normal form of NFC.
+	 */
+	public static function normalize(string $s): string
+	{
+		// convert to compressed normal form (NFC)
+		if (class_exists('Normalizer', false) && ($n = \Normalizer::normalize($s, \Normalizer::FORM_C)) !== false) {
+			$s = $n;
+		}
+
+		$s = self::unixNewLines($s);
+
+		// remove control characters; leave \t + \n
+		$s = self::pcre('preg_replace', ['#[\x00-\x08\x0B-\x1F\x7F-\x9F]+#u', '', $s]);
+
+		// right trim
+		$s = self::pcre('preg_replace', ['#[\t ]+$#m', '', $s]);
+
+		// leading and trailing blank lines
+		$s = trim($s, "\n");
+
+		return $s;
+	}
+
+
+	/** @deprecated use Strings::unixNewLines() */
+	public static function normalizeNewLines(string $s): string
+	{
+		return self::unixNewLines($s);
+	}
+
+
+	/**
+	 * Converts line endings to \n used on Unix-like systems.
+	 * Line endings are: \n, \r, \r\n, U+2028 line separator, U+2029 paragraph separator.
+	 */
+	public static function unixNewLines(string $s): string
+	{
+		return preg_replace("~\r\n?|\u{2028}|\u{2029}~", "\n", $s);
+	}
+
+
+	/**
+	 * Converts line endings to platform-specific, i.e. \r\n on Windows and \n elsewhere.
+	 * Line endings are: \n, \r, \r\n, U+2028 line separator, U+2029 paragraph separator.
+	 */
+	public static function platformNewLines(string $s): string
+	{
+		return preg_replace("~\r\n?|\n|\u{2028}|\u{2029}~", PHP_EOL, $s);
+	}
+
+
+	/**
+	 * Converts UTF-8 string to ASCII, ie removes diacritics etc.
+	 */
+	public static function toAscii(string $s): string
+	{
+		$iconv = defined('ICONV_IMPL') ? trim(ICONV_IMPL, '"\'') : null;
+		static $transliterator = null;
+		if ($transliterator === null) {
+			if (class_exists('Transliterator', false)) {
+				$transliterator = \Transliterator::create('Any-Latin; Latin-ASCII');
+			} else {
+				trigger_error(__METHOD__ . "(): it is recommended to enable PHP extensions 'intl'.", E_USER_NOTICE);
+				$transliterator = false;
+			}
+		}
+
+		// remove control characters and check UTF-8 validity
+		$s = self::pcre('preg_replace', ['#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{2FF}\x{370}-\x{10FFFF}]#u', '', $s]);
+
+		// transliteration (by Transliterator and iconv) is not optimal, replace some characters directly
+		$s = strtr($s, ["\u{201E}" => '"', "\u{201C}" => '"', "\u{201D}" => '"', "\u{201A}" => "'", "\u{2018}" => "'", "\u{2019}" => "'", "\u{B0}" => '^', "\u{42F}" => 'Ya', "\u{44F}" => 'ya', "\u{42E}" => 'Yu', "\u{44E}" => 'yu', "\u{c4}" => 'Ae', "\u{d6}" => 'Oe', "\u{dc}" => 'Ue', "\u{1e9e}" => 'Ss', "\u{e4}" => 'ae', "\u{f6}" => 'oe', "\u{fc}" => 'ue', "\u{df}" => 'ss']); // „ “ ” ‚ ‘ ’ ° Я я Ю ю Ä Ö Ü ẞ ä ö ü ß
+		if ($iconv !== 'libiconv') {
+			$s = strtr($s, ["\u{AE}" => '(R)', "\u{A9}" => '(c)', "\u{2026}" => '...', "\u{AB}" => '<<', "\u{BB}" => '>>', "\u{A3}" => 'lb', "\u{A5}" => 'yen', "\u{B2}" => '^2', "\u{B3}" => '^3', "\u{B5}" => 'u', "\u{B9}" => '^1', "\u{BA}" => 'o', "\u{BF}" => '?', "\u{2CA}" => "'", "\u{2CD}" => '_', "\u{2DD}" => '"', "\u{1FEF}" => '', "\u{20AC}" => 'EUR', "\u{2122}" => 'TM', "\u{212E}" => 'e', "\u{2190}" => '<-', "\u{2191}" => '^', "\u{2192}" => '->', "\u{2193}" => 'V', "\u{2194}" => '<->']); // ® © … « » £ ¥ ² ³ µ ¹ º ¿ ˊ ˍ ˝ ` € ™ ℮ ← ↑ → ↓ ↔
+		}
+
+		if ($transliterator) {
+			$s = $transliterator->transliterate($s);
+			// use iconv because The transliterator leaves some characters out of ASCII, eg → ʾ
+			if ($iconv === 'glibc') {
+				$s = strtr($s, '?', "\x01"); // temporarily hide ? to distinguish them from the garbage that iconv creates
+				$s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
+				$s = str_replace(['?', "\x01"], ['', '?'], $s); // remove garbage and restore ? characters
+			} elseif ($iconv === 'libiconv') {
+				$s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
+			} else { // null or 'unknown' (#216)
+				$s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]); // remove non-ascii chars
+			}
+		} elseif ($iconv === 'glibc' || $iconv === 'libiconv') {
+			// temporarily hide these characters to distinguish them from the garbage that iconv creates
+			$s = strtr($s, '`\'"^~?', "\x01\x02\x03\x04\x05\x06");
+			if ($iconv === 'glibc') {
+				// glibc implementation is very limited. transliterate into Windows-1250 and then into ASCII, so most Eastern European characters are preserved
+				$s = iconv('UTF-8', 'WINDOWS-1250//TRANSLIT//IGNORE', $s);
+				$s = strtr(
+					$s,
+					"\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf8\xf9\xfa\xfb\xfc\xfd\xfe\x96\xa0\x8b\x97\x9b\xa6\xad\xb7",
+					'ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt- <->|-.',
+				);
+				$s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]);
+			} else {
+				$s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
+			}
+
+			// remove garbage that iconv creates during transliteration (eg Ý -> Y')
+			$s = str_replace(['`', "'", '"', '^', '~', '?'], '', $s);
+			// restore temporarily hidden characters
+			$s = strtr($s, "\x01\x02\x03\x04\x05\x06", '`\'"^~?');
+		} else {
+			$s = self::pcre('preg_replace', ['#[^\x00-\x7F]++#', '', $s]); // remove non-ascii chars
+		}
+
+		return $s;
+	}
+
+
+	/**
+	 * Modifies the UTF-8 string to the form used in the URL, ie removes diacritics and replaces all characters
+	 * except letters of the English alphabet and numbers with a hyphens.
+	 */
+	public static function webalize(string $s, ?string $charlist = null, bool $lower = true): string
+	{
+		$s = self::toAscii($s);
+		if ($lower) {
+			$s = strtolower($s);
+		}
+
+		$s = self::pcre('preg_replace', ['#[^a-z0-9' . ($charlist !== null ? preg_quote($charlist, '#') : '') . ']+#i', '-', $s]);
+		$s = trim($s, '-');
+		return $s;
+	}
+
+
+	/**
+	 * Truncates a UTF-8 string to given maximal length, while trying not to split whole words. Only if the string is truncated,
+	 * an ellipsis (or something else set with third argument) is appended to the string.
+	 */
+	public static function truncate(string $s, int $maxLen, string $append = "\u{2026}"): string
+	{
+		if (self::length($s) > $maxLen) {
+			$maxLen -= self::length($append);
+			if ($maxLen < 1) {
+				return $append;
+
+			} elseif ($matches = self::match($s, '#^.{1,' . $maxLen . '}(?=[\s\x00-/:-@\[-`{-~])#us')) {
+				return $matches[0] . $append;
+
+			} else {
+				return self::substring($s, 0, $maxLen) . $append;
+			}
+		}
+
+		return $s;
+	}
+
+
+	/**
+	 * Indents a multiline text from the left. Second argument sets how many indentation chars should be used,
+	 * while the indent itself is the third argument (*tab* by default).
+	 */
+	public static function indent(string $s, int $level = 1, string $chars = "\t"): string
+	{
+		if ($level > 0) {
+			$s = self::replace($s, '#(?:^|[\r\n]+)(?=[^\r\n])#', '$0' . str_repeat($chars, $level));
+		}
+
+		return $s;
+	}
+
+
+	/**
+	 * Converts all characters of UTF-8 string to lower case.
+	 */
+	public static function lower(string $s): string
+	{
+		return mb_strtolower($s, 'UTF-8');
+	}
+
+
+	/**
+	 * Converts the first character of a UTF-8 string to lower case and leaves the other characters unchanged.
+	 */
+	public static function firstLower(string $s): string
+	{
+		return self::lower(self::substring($s, 0, 1)) . self::substring($s, 1);
+	}
+
+
+	/**
+	 * Converts all characters of a UTF-8 string to upper case.
+	 */
+	public static function upper(string $s): string
+	{
+		return mb_strtoupper($s, 'UTF-8');
+	}
+
+
+	/**
+	 * Converts the first character of a UTF-8 string to upper case and leaves the other characters unchanged.
+	 */
+	public static function firstUpper(string $s): string
+	{
+		return self::upper(self::substring($s, 0, 1)) . self::substring($s, 1);
+	}
+
+
+	/**
+	 * Converts the first character of every word of a UTF-8 string to upper case and the others to lower case.
+	 */
+	public static function capitalize(string $s): string
+	{
+		return mb_convert_case($s, MB_CASE_TITLE, 'UTF-8');
+	}
+
+
+	/**
+	 * Compares two UTF-8 strings or their parts, without taking character case into account. If length is null, whole strings are compared,
+	 * if it is negative, the corresponding number of characters from the end of the strings is compared,
+	 * otherwise the appropriate number of characters from the beginning is compared.
+	 */
+	public static function compare(string $left, string $right, ?int $length = null): bool
+	{
+		if (class_exists('Normalizer', false)) {
+			$left = \Normalizer::normalize($left, \Normalizer::FORM_D); // form NFD is faster
+			$right = \Normalizer::normalize($right, \Normalizer::FORM_D); // form NFD is faster
+		}
+
+		if ($length < 0) {
+			$left = self::substring($left, $length, -$length);
+			$right = self::substring($right, $length, -$length);
+		} elseif ($length !== null) {
+			$left = self::substring($left, 0, $length);
+			$right = self::substring($right, 0, $length);
+		}
+
+		return self::lower($left) === self::lower($right);
+	}
+
+
+	/**
+	 * Finds the common prefix of strings or returns empty string if the prefix was not found.
+	 * @param  string[]  $strings
+	 */
+	public static function findPrefix(array $strings): string
+	{
+		$first = array_shift($strings);
+		for ($i = 0; $i < strlen($first); $i++) {
+			foreach ($strings as $s) {
+				if (!isset($s[$i]) || $first[$i] !== $s[$i]) {
+					while ($i && $first[$i - 1] >= "\x80" && $first[$i] >= "\x80" && $first[$i] < "\xC0") {
+						$i--;
+					}
+
+					return substr($first, 0, $i);
+				}
+			}
+		}
+
+		return $first;
+	}
+
+
+	/**
+	 * Returns number of characters (not bytes) in UTF-8 string.
+	 * That is the number of Unicode code points which may differ from the number of graphemes.
+	 */
+	public static function length(string $s): int
+	{
+		return match (true) {
+			extension_loaded('mbstring') => mb_strlen($s, 'UTF-8'),
+			extension_loaded('iconv') => iconv_strlen($s, 'UTF-8'),
+			default => strlen(@utf8_decode($s)), // deprecated
+		};
+	}
+
+
+	/**
+	 * Removes all left and right side spaces (or the characters passed as second argument) from a UTF-8 encoded string.
+	 */
+	public static function trim(string $s, string $charlist = self::TrimCharacters): string
+	{
+		$charlist = preg_quote($charlist, '#');
+		return self::replace($s, '#^[' . $charlist . ']+|[' . $charlist . ']+$#Du', '');
+	}
+
+
+	/**
+	 * Pads a UTF-8 string to given length by prepending the $pad string to the beginning.
+	 * @param  non-empty-string  $pad
+	 */
+	public static function padLeft(string $s, int $length, string $pad = ' '): string
+	{
+		$length = max(0, $length - self::length($s));
+		$padLen = self::length($pad);
+		return str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen) . $s;
+	}
+
+
+	/**
+	 * Pads UTF-8 string to given length by appending the $pad string to the end.
+	 * @param  non-empty-string  $pad
+	 */
+	public static function padRight(string $s, int $length, string $pad = ' '): string
+	{
+		$length = max(0, $length - self::length($s));
+		$padLen = self::length($pad);
+		return $s . str_repeat($pad, (int) ($length / $padLen)) . self::substring($pad, 0, $length % $padLen);
+	}
+
+
+	/**
+	 * Reverses UTF-8 string.
+	 */
+	public static function reverse(string $s): string
+	{
+		if (!extension_loaded('iconv')) {
+			throw new Nette\NotSupportedException(__METHOD__ . '() requires ICONV extension that is not loaded.');
+		}
+
+		return iconv('UTF-32LE', 'UTF-8', strrev(iconv('UTF-8', 'UTF-32BE', $s)));
+	}
+
+
+	/**
+	 * Returns part of $haystack before $nth occurence of $needle or returns null if the needle was not found.
+	 * Negative value means searching from the end.
+	 */
+	public static function before(string $haystack, string $needle, int $nth = 1): ?string
+	{
+		$pos = self::pos($haystack, $needle, $nth);
+		return $pos === null
+			? null
+			: substr($haystack, 0, $pos);
+	}
+
+
+	/**
+	 * Returns part of $haystack after $nth occurence of $needle or returns null if the needle was not found.
+	 * Negative value means searching from the end.
+	 */
+	public static function after(string $haystack, string $needle, int $nth = 1): ?string
+	{
+		$pos = self::pos($haystack, $needle, $nth);
+		return $pos === null
+			? null
+			: substr($haystack, $pos + strlen($needle));
+	}
+
+
+	/**
+	 * Returns position in characters of $nth occurence of $needle in $haystack or null if the $needle was not found.
+	 * Negative value of `$nth` means searching from the end.
+	 */
+	public static function indexOf(string $haystack, string $needle, int $nth = 1): ?int
+	{
+		$pos = self::pos($haystack, $needle, $nth);
+		return $pos === null
+			? null
+			: self::length(substr($haystack, 0, $pos));
+	}
+
+
+	/**
+	 * Returns position in characters of $nth occurence of $needle in $haystack or null if the needle was not found.
+	 */
+	private static function pos(string $haystack, string $needle, int $nth = 1): ?int
+	{
+		if (!$nth) {
+			return null;
+		} elseif ($nth > 0) {
+			if ($needle === '') {
+				return 0;
+			}
+
+			$pos = 0;
+			while (($pos = strpos($haystack, $needle, $pos)) !== false && --$nth) {
+				$pos++;
+			}
+		} else {
+			$len = strlen($haystack);
+			if ($needle === '') {
+				return $len;
+			} elseif ($len === 0) {
+				return null;
+			}
+
+			$pos = $len - 1;
+			while (($pos = strrpos($haystack, $needle, $pos - $len)) !== false && ++$nth) {
+				$pos--;
+			}
+		}
+
+		return Helpers::falseToNull($pos);
+	}
+
+
+	/**
+	 * Divides the string into arrays according to the regular expression. Expressions in parentheses will be captured and returned as well.
+	 */
+	public static function split(
+		string $subject,
+		#[Language('RegExp')]
+		string $pattern,
+		bool|int $captureOffset = false,
+		bool $skipEmpty = false,
+		int $limit = -1,
+		bool $utf8 = false,
+	): array
+	{
+		$flags = is_int($captureOffset)  // back compatibility
+			? $captureOffset
+			: ($captureOffset ? PREG_SPLIT_OFFSET_CAPTURE : 0) | ($skipEmpty ? PREG_SPLIT_NO_EMPTY : 0);
+
+		$pattern .= $utf8 ? 'u' : '';
+		$m = self::pcre('preg_split', [$pattern, $subject, $limit, $flags | PREG_SPLIT_DELIM_CAPTURE]);
+		return $utf8 && $captureOffset
+			? self::bytesToChars($subject, [$m])[0]
+			: $m;
+
+	}
+
+
+	/**
+	 * Searches the string for the part matching the regular expression and returns
+	 * an array with the found expression and individual subexpressions, or `null`.
+	 */
+	public static function match(
+		string $subject,
+		#[Language('RegExp')]
+		string $pattern,
+		bool|int $captureOffset = false,
+		int $offset = 0,
+		bool $unmatchedAsNull = false,
+		bool $utf8 = false,
+	): ?array
+	{
+		$flags = is_int($captureOffset) // back compatibility
+			? $captureOffset
+			: ($captureOffset ? PREG_OFFSET_CAPTURE : 0) | ($unmatchedAsNull ? PREG_UNMATCHED_AS_NULL : 0);
+
+		if ($utf8) {
+			$offset = strlen(self::substring($subject, 0, $offset));
+			$pattern .= 'u';
+		}
+
+		if ($offset > strlen($subject)) {
+			return null;
+		} elseif (!self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset])) {
+			return null;
+		} elseif ($utf8 && $captureOffset) {
+			return self::bytesToChars($subject, [$m])[0];
+		} else {
+			return $m;
+		}
+	}
+
+
+	/**
+	 * Searches the string for all occurrences matching the regular expression and
+	 * returns an array of arrays containing the found expression and each subexpression.
+	 * @return ($lazy is true ? \Generator<int, array> : array[])
+	 */
+	public static function matchAll(
+		string $subject,
+		#[Language('RegExp')]
+		string $pattern,
+		bool|int $captureOffset = false,
+		int $offset = 0,
+		bool $unmatchedAsNull = false,
+		bool $patternOrder = false,
+		bool $utf8 = false,
+		bool $lazy = false,
+	): array|\Generator
+	{
+		if ($utf8) {
+			$offset = strlen(self::substring($subject, 0, $offset));
+			$pattern .= 'u';
+		}
+
+		if ($lazy) {
+			$flags = PREG_OFFSET_CAPTURE | ($unmatchedAsNull ? PREG_UNMATCHED_AS_NULL : 0);
+			return (function () use ($utf8, $captureOffset, $flags, $subject, $pattern, $offset) {
+				$counter = 0;
+				while (
+					$offset <= strlen($subject) - ($counter ? 1 : 0)
+					&& self::pcre('preg_match', [$pattern, $subject, &$m, $flags, $offset])
+				) {
+					$offset = $m[0][1] + max(1, strlen($m[0][0]));
+					if (!$captureOffset) {
+						$m = array_map(fn($item) => $item[0], $m);
+					} elseif ($utf8) {
+						$m = self::bytesToChars($subject, [$m])[0];
+					}
+					yield $counter++ => $m;
+				}
+			})();
+		}
+
+		if ($offset > strlen($subject)) {
+			return [];
+		}
+
+		$flags = is_int($captureOffset) // back compatibility
+			? $captureOffset
+			: ($captureOffset ? PREG_OFFSET_CAPTURE : 0) | ($unmatchedAsNull ? PREG_UNMATCHED_AS_NULL : 0) | ($patternOrder ? PREG_PATTERN_ORDER : 0);
+
+		self::pcre('preg_match_all', [
+			$pattern, $subject, &$m,
+			($flags & PREG_PATTERN_ORDER) ? $flags : ($flags | PREG_SET_ORDER),
+			$offset,
+		]);
+		return $utf8 && $captureOffset
+			? self::bytesToChars($subject, $m)
+			: $m;
+	}
+
+
+	/**
+	 * Replaces all occurrences matching regular expression $pattern which can be string or array in the form `pattern => replacement`.
+	 */
+	public static function replace(
+		string $subject,
+		#[Language('RegExp')]
+		string|array $pattern,
+		string|callable $replacement = '',
+		int $limit = -1,
+		bool $captureOffset = false,
+		bool $unmatchedAsNull = false,
+		bool $utf8 = false,
+	): string
+	{
+		if (is_object($replacement) || is_array($replacement)) {
+			if (!is_callable($replacement, false, $textual)) {
+				throw new Nette\InvalidStateException("Callback '$textual' is not callable.");
+			}
+
+			$flags = ($captureOffset ? PREG_OFFSET_CAPTURE : 0) | ($unmatchedAsNull ? PREG_UNMATCHED_AS_NULL : 0);
+			if ($utf8) {
+				$pattern .= 'u';
+				if ($captureOffset) {
+					$replacement = fn($m) => $replacement(self::bytesToChars($subject, [$m])[0]);
+				}
+			}
+
+			return self::pcre('preg_replace_callback', [$pattern, $replacement, $subject, $limit, 0, $flags]);
+
+		} elseif (is_array($pattern) && is_string(key($pattern))) {
+			$replacement = array_values($pattern);
+			$pattern = array_keys($pattern);
+		}
+
+		if ($utf8) {
+			$pattern = array_map(fn($item) => $item . 'u', (array) $pattern);
+		}
+
+		return self::pcre('preg_replace', [$pattern, $replacement, $subject, $limit]);
+	}
+
+
+	private static function bytesToChars(string $s, array $groups): array
+	{
+		$lastBytes = $lastChars = 0;
+		foreach ($groups as &$matches) {
+			foreach ($matches as &$match) {
+				if ($match[1] > $lastBytes) {
+					$lastChars += self::length(substr($s, $lastBytes, $match[1] - $lastBytes));
+				} elseif ($match[1] < $lastBytes) {
+					$lastChars -= self::length(substr($s, $match[1], $lastBytes - $match[1]));
+				}
+
+				$lastBytes = $match[1];
+				$match[1] = $lastChars;
+			}
+		}
+
+		return $groups;
+	}
+
+
+	/** @internal */
+	public static function pcre(string $func, array $args)
+	{
+		$res = Callback::invokeSafe($func, $args, function (string $message) use ($args): void {
+			// compile-time error, not detectable by preg_last_error
+			throw new RegexpException($message . ' in pattern: ' . implode(' or ', (array) $args[0]));
+		});
+
+		if (($code = preg_last_error()) // run-time error, but preg_last_error & return code are liars
+			&& ($res === null || !in_array($func, ['preg_filter', 'preg_replace_callback', 'preg_replace'], true))
+		) {
+			throw new RegexpException(preg_last_error_msg()
+				. ' (pattern: ' . implode(' or ', (array) $args[0]) . ')', $code);
+		}
+
+		return $res;
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,267 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * PHP type reflection.
+ */
+final class Type
+{
+	/** @var array<int, string|self> */
+	private array $types;
+	private bool $simple;
+	private string $kind; // | &
+
+
+	/**
+	 * Creates a Type object based on reflection. Resolves self, static and parent to the actual class name.
+	 * If the subject has no type, it returns null.
+	 */
+	public static function fromReflection(
+		\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionProperty $reflection,
+	): ?self
+	{
+		$type = $reflection instanceof \ReflectionFunctionAbstract
+			? $reflection->getReturnType() ?? (PHP_VERSION_ID >= 80100 && $reflection instanceof \ReflectionMethod ? $reflection->getTentativeReturnType() : null)
+			: $reflection->getType();
+
+		return $type ? self::fromReflectionType($type, $reflection, asObject: true) : null;
+	}
+
+
+	private static function fromReflectionType(\ReflectionType $type, $of, bool $asObject): self|string
+	{
+		if ($type instanceof \ReflectionNamedType) {
+			$name = self::resolve($type->getName(), $of);
+			return $asObject
+				? new self($type->allowsNull() && $name !== 'mixed' ? [$name, 'null'] : [$name])
+				: $name;
+
+		} elseif ($type instanceof \ReflectionUnionType || $type instanceof \ReflectionIntersectionType) {
+			return new self(
+				array_map(fn($t) => self::fromReflectionType($t, $of, asObject: false), $type->getTypes()),
+				$type instanceof \ReflectionUnionType ? '|' : '&',
+			);
+
+		} else {
+			throw new Nette\InvalidStateException('Unexpected type of ' . Reflection::toString($of));
+		}
+	}
+
+
+	/**
+	 * Creates the Type object according to the text notation.
+	 */
+	public static function fromString(string $type): self
+	{
+		if (!Validators::isTypeDeclaration($type)) {
+			throw new Nette\InvalidArgumentException("Invalid type '$type'.");
+		}
+
+		if ($type[0] === '?') {
+			return new self([substr($type, 1), 'null']);
+		}
+
+		$unions = [];
+		foreach (explode('|', $type) as $part) {
+			$part = explode('&', trim($part, '()'));
+			$unions[] = count($part) === 1 ? $part[0] : new self($part, '&');
+		}
+
+		return count($unions) === 1 && $unions[0] instanceof self
+			? $unions[0]
+			: new self($unions);
+	}
+
+
+	/**
+	 * Resolves 'self', 'static' and 'parent' to the actual class name.
+	 */
+	public static function resolve(
+		string $type,
+		\ReflectionFunctionAbstract|\ReflectionParameter|\ReflectionProperty $of,
+	): string
+	{
+		$lower = strtolower($type);
+		if ($of instanceof \ReflectionFunction) {
+			return $type;
+		} elseif ($lower === 'self') {
+			return $of->getDeclaringClass()->name;
+		} elseif ($lower === 'static') {
+			return ($of instanceof ReflectionMethod ? $of->getOriginalClass() : $of->getDeclaringClass())->name;
+		} elseif ($lower === 'parent' && $of->getDeclaringClass()->getParentClass()) {
+			return $of->getDeclaringClass()->getParentClass()->name;
+		} else {
+			return $type;
+		}
+	}
+
+
+	private function __construct(array $types, string $kind = '|')
+	{
+		$o = array_search('null', $types, strict: true);
+		if ($o !== false) { // null as last
+			array_splice($types, $o, 1);
+			$types[] = 'null';
+		}
+
+		$this->types = $types;
+		$this->simple = is_string($types[0]) && ($types[1] ?? 'null') === 'null';
+		$this->kind = count($types) > 1 ? $kind : '';
+	}
+
+
+	public function __toString(): string
+	{
+		$multi = count($this->types) > 1;
+		if ($this->simple) {
+			return ($multi ? '?' : '') . $this->types[0];
+		}
+
+		$res = [];
+		foreach ($this->types as $type) {
+			$res[] = $type instanceof self && $multi ? "($type)" : $type;
+		}
+		return implode($this->kind, $res);
+	}
+
+
+	/**
+	 * Returns the array of subtypes that make up the compound type as strings.
+	 * @return array<int, string|string[]>
+	 */
+	public function getNames(): array
+	{
+		return array_map(fn($t) => $t instanceof self ? $t->getNames() : $t, $this->types);
+	}
+
+
+	/**
+	 * Returns the array of subtypes that make up the compound type as Type objects:
+	 * @return self[]
+	 */
+	public function getTypes(): array
+	{
+		return array_map(fn($t) => $t instanceof self ? $t : new self([$t]), $this->types);
+	}
+
+
+	/**
+	 * Returns the type name for simple types, otherwise null.
+	 */
+	public function getSingleName(): ?string
+	{
+		return $this->simple
+			? $this->types[0]
+			: null;
+	}
+
+
+	/**
+	 * Returns true whether it is a union type.
+	 */
+	public function isUnion(): bool
+	{
+		return $this->kind === '|';
+	}
+
+
+	/**
+	 * Returns true whether it is an intersection type.
+	 */
+	public function isIntersection(): bool
+	{
+		return $this->kind === '&';
+	}
+
+
+	/**
+	 * Returns true whether it is a simple type. Single nullable types are also considered to be simple types.
+	 */
+	public function isSimple(): bool
+	{
+		return $this->simple;
+	}
+
+
+	/** @deprecated use isSimple() */
+	public function isSingle(): bool
+	{
+		return $this->simple;
+	}
+
+
+	/**
+	 * Returns true whether the type is both a simple and a PHP built-in type.
+	 */
+	public function isBuiltin(): bool
+	{
+		return $this->simple && Validators::isBuiltinType($this->types[0]);
+	}
+
+
+	/**
+	 * Returns true whether the type is both a simple and a class name.
+	 */
+	public function isClass(): bool
+	{
+		return $this->simple && !Validators::isBuiltinType($this->types[0]);
+	}
+
+
+	/**
+	 * Determines if type is special class name self/parent/static.
+	 */
+	public function isClassKeyword(): bool
+	{
+		return $this->simple && Validators::isClassKeyword($this->types[0]);
+	}
+
+
+	/**
+	 * Verifies type compatibility. For example, it checks if a value of a certain type could be passed as a parameter.
+	 */
+	public function allows(string $subtype): bool
+	{
+		if ($this->types === ['mixed']) {
+			return true;
+		}
+
+		$subtype = self::fromString($subtype);
+		return $subtype->isUnion()
+			? Arrays::every($subtype->types, fn($t) => $this->allows2($t instanceof self ? $t->types : [$t]))
+			: $this->allows2($subtype->types);
+	}
+
+
+	private function allows2(array $subtypes): bool
+	{
+		return $this->isUnion()
+			? Arrays::some($this->types, fn($t) => $this->allows3($t instanceof self ? $t->types : [$t], $subtypes))
+			: $this->allows3($this->types, $subtypes);
+	}
+
+
+	private function allows3(array $types, array $subtypes): bool
+	{
+		return Arrays::every(
+			$types,
+			fn($type) => Arrays::some(
+				$subtypes,
+				fn($subtype) => Validators::isBuiltinType($type)
+					? strcasecmp($type, $subtype) === 0
+					: is_a($subtype, $type, allow_string: true)
+			)
+		);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,416 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+
+/**
+ * Validation utilities.
+ */
+class Validators
+{
+	use Nette\StaticClass;
+
+	private const BuiltinTypes = [
+		'string' => 1, 'int' => 1, 'float' => 1, 'bool' => 1, 'array' => 1, 'object' => 1,
+		'callable' => 1, 'iterable' => 1, 'void' => 1, 'null' => 1, 'mixed' => 1, 'false' => 1,
+		'never' => 1, 'true' => 1,
+	];
+
+	/** @var array<string,?callable> */
+	protected static $validators = [
+		// PHP types
+		'array' => 'is_array',
+		'bool' => 'is_bool',
+		'boolean' => 'is_bool',
+		'float' => 'is_float',
+		'int' => 'is_int',
+		'integer' => 'is_int',
+		'null' => 'is_null',
+		'object' => 'is_object',
+		'resource' => 'is_resource',
+		'scalar' => 'is_scalar',
+		'string' => 'is_string',
+
+		// pseudo-types
+		'callable' => [self::class, 'isCallable'],
+		'iterable' => 'is_iterable',
+		'list' => [Arrays::class, 'isList'],
+		'mixed' => [self::class, 'isMixed'],
+		'none' => [self::class, 'isNone'],
+		'number' => [self::class, 'isNumber'],
+		'numeric' => [self::class, 'isNumeric'],
+		'numericint' => [self::class, 'isNumericInt'],
+
+		// string patterns
+		'alnum' => 'ctype_alnum',
+		'alpha' => 'ctype_alpha',
+		'digit' => 'ctype_digit',
+		'lower' => 'ctype_lower',
+		'pattern' => null,
+		'space' => 'ctype_space',
+		'unicode' => [self::class, 'isUnicode'],
+		'upper' => 'ctype_upper',
+		'xdigit' => 'ctype_xdigit',
+
+		// syntax validation
+		'email' => [self::class, 'isEmail'],
+		'identifier' => [self::class, 'isPhpIdentifier'],
+		'uri' => [self::class, 'isUri'],
+		'url' => [self::class, 'isUrl'],
+
+		// environment validation
+		'class' => 'class_exists',
+		'interface' => 'interface_exists',
+		'directory' => 'is_dir',
+		'file' => 'is_file',
+		'type' => [self::class, 'isType'],
+	];
+
+	/** @var array<string,callable> */
+	protected static $counters = [
+		'string' => 'strlen',
+		'unicode' => [Strings::class, 'length'],
+		'array' => 'count',
+		'list' => 'count',
+		'alnum' => 'strlen',
+		'alpha' => 'strlen',
+		'digit' => 'strlen',
+		'lower' => 'strlen',
+		'space' => 'strlen',
+		'upper' => 'strlen',
+		'xdigit' => 'strlen',
+	];
+
+
+	/**
+	 * Verifies that the value is of expected types separated by pipe.
+	 * @throws AssertionException
+	 */
+	public static function assert(mixed $value, string $expected, string $label = 'variable'): void
+	{
+		if (!static::is($value, $expected)) {
+			$expected = str_replace(['|', ':'], [' or ', ' in range '], $expected);
+			$translate = ['boolean' => 'bool', 'integer' => 'int', 'double' => 'float', 'NULL' => 'null'];
+			$type = $translate[gettype($value)] ?? gettype($value);
+			if (is_int($value) || is_float($value) || (is_string($value) && strlen($value) < 40)) {
+				$type .= ' ' . var_export($value, return: true);
+			} elseif (is_object($value)) {
+				$type .= ' ' . $value::class;
+			}
+
+			throw new AssertionException("The $label expects to be $expected, $type given.");
+		}
+	}
+
+
+	/**
+	 * Verifies that element $key in array is of expected types separated by pipe.
+	 * @param  mixed[]  $array
+	 * @throws AssertionException
+	 */
+	public static function assertField(
+		array $array,
+		$key,
+		?string $expected = null,
+		string $label = "item '%' in array",
+	): void
+	{
+		if (!array_key_exists($key, $array)) {
+			throw new AssertionException('Missing ' . str_replace('%', $key, $label) . '.');
+
+		} elseif ($expected) {
+			static::assert($array[$key], $expected, str_replace('%', $key, $label));
+		}
+	}
+
+
+	/**
+	 * Verifies that the value is of expected types separated by pipe.
+	 */
+	public static function is(mixed $value, string $expected): bool
+	{
+		foreach (explode('|', $expected) as $item) {
+			if (str_ends_with($item, '[]')) {
+				if (is_iterable($value) && self::everyIs($value, substr($item, 0, -2))) {
+					return true;
+				}
+
+				continue;
+			} elseif (str_starts_with($item, '?')) {
+				$item = substr($item, 1);
+				if ($value === null) {
+					return true;
+				}
+			}
+
+			[$type] = $item = explode(':', $item, 2);
+			if (isset(static::$validators[$type])) {
+				try {
+					if (!static::$validators[$type]($value)) {
+						continue;
+					}
+				} catch (\TypeError $e) {
+					continue;
+				}
+			} elseif ($type === 'pattern') {
+				if (Strings::match($value, '|^' . ($item[1] ?? '') . '$|D')) {
+					return true;
+				}
+
+				continue;
+			} elseif (!$value instanceof $type) {
+				continue;
+			}
+
+			if (isset($item[1])) {
+				$length = $value;
+				if (isset(static::$counters[$type])) {
+					$length = static::$counters[$type]($value);
+				}
+
+				$range = explode('..', $item[1]);
+				if (!isset($range[1])) {
+					$range[1] = $range[0];
+				}
+
+				if (($range[0] !== '' && $length < $range[0]) || ($range[1] !== '' && $length > $range[1])) {
+					continue;
+				}
+			}
+
+			return true;
+		}
+
+		return false;
+	}
+
+
+	/**
+	 * Finds whether all values are of expected types separated by pipe.
+	 * @param  mixed[]  $values
+	 */
+	public static function everyIs(iterable $values, string $expected): bool
+	{
+		foreach ($values as $value) {
+			if (!static::is($value, $expected)) {
+				return false;
+			}
+		}
+
+		return true;
+	}
+
+
+	/**
+	 * Checks if the value is an integer or a float.
+	 * @return ($value is int|float ? true : false)
+	 */
+	public static function isNumber(mixed $value): bool
+	{
+		return is_int($value) || is_float($value);
+	}
+
+
+	/**
+	 * Checks if the value is an integer or a integer written in a string.
+	 * @return ($value is non-empty-string ? bool : ($value is int ? true : false))
+	 */
+	public static function isNumericInt(mixed $value): bool
+	{
+		return is_int($value) || (is_string($value) && preg_match('#^[+-]?[0-9]+$#D', $value));
+	}
+
+
+	/**
+	 * Checks if the value is a number or a number written in a string.
+	 * @return ($value is non-empty-string ? bool : ($value is int|float ? true : false))
+	 */
+	public static function isNumeric(mixed $value): bool
+	{
+		return is_float($value) || is_int($value) || (is_string($value) && preg_match('#^[+-]?([0-9]++\.?[0-9]*|\.[0-9]+)$#D', $value));
+	}
+
+
+	/**
+	 * Checks if the value is a syntactically correct callback.
+	 */
+	public static function isCallable(mixed $value): bool
+	{
+		return $value && is_callable($value, syntax_only: true);
+	}
+
+
+	/**
+	 * Checks if the value is a valid UTF-8 string.
+	 */
+	public static function isUnicode(mixed $value): bool
+	{
+		return is_string($value) && preg_match('##u', $value);
+	}
+
+
+	/**
+	 * Checks if the value is 0, '', false or null.
+	 * @return ($value is 0|''|false|null ? true : false)
+	 */
+	public static function isNone(mixed $value): bool
+	{
+		return $value == null; // intentionally ==
+	}
+
+
+	/** @internal */
+	public static function isMixed(): bool
+	{
+		return true;
+	}
+
+
+	/**
+	 * Checks if a variable is a zero-based integer indexed array.
+	 * @deprecated  use Nette\Utils\Arrays::isList
+	 * @return ($value is list ? true : false)
+	 */
+	public static function isList(mixed $value): bool
+	{
+		return Arrays::isList($value);
+	}
+
+
+	/**
+	 * Checks if the value is in the given range [min, max], where the upper or lower limit can be omitted (null).
+	 * Numbers, strings and DateTime objects can be compared.
+	 */
+	public static function isInRange(mixed $value, array $range): bool
+	{
+		if ($value === null || !(isset($range[0]) || isset($range[1]))) {
+			return false;
+		}
+
+		$limit = $range[0] ?? $range[1];
+		if (is_string($limit)) {
+			$value = (string) $value;
+		} elseif ($limit instanceof \DateTimeInterface) {
+			if (!$value instanceof \DateTimeInterface) {
+				return false;
+			}
+		} elseif (is_numeric($value)) {
+			$value *= 1;
+		} else {
+			return false;
+		}
+
+		return (!isset($range[0]) || ($value >= $range[0])) && (!isset($range[1]) || ($value <= $range[1]));
+	}
+
+
+	/**
+	 * Checks if the value is a valid email address. It does not verify that the domain actually exists, only the syntax is verified.
+	 */
+	public static function isEmail(string $value): bool
+	{
+		$atom = "[-a-z0-9!#$%&'*+/=?^_`{|}~]"; // RFC 5322 unquoted characters in local-part
+		$alpha = "a-z\x80-\xFF"; // superset of IDN
+		return (bool) preg_match(<<<XX
+			(^(?n)
+				("([ !#-[\\]-~]*|\\\\[ -~])+"|$atom+(\\.$atom+)*)  # quoted or unquoted
+				@
+				([0-9$alpha]([-0-9$alpha]{0,61}[0-9$alpha])?\\.)+  # domain - RFC 1034
+				[$alpha]([-0-9$alpha]{0,17}[$alpha])?              # top domain
+			$)Dix
+			XX, $value);
+	}
+
+
+	/**
+	 * Checks if the value is a valid URL address.
+	 */
+	public static function isUrl(string $value): bool
+	{
+		$alpha = "a-z\x80-\xFF";
+		return (bool) preg_match(<<<XX
+			(^(?n)
+				https?://(
+					(([-_0-9$alpha]+\\.)*                       # subdomain
+						[0-9$alpha]([-0-9$alpha]{0,61}[0-9$alpha])?\\.)?  # domain
+						[$alpha]([-0-9$alpha]{0,17}[$alpha])?   # top domain
+					|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}  # IPv4
+					|\\[[0-9a-f:]{3,39}\\]                      # IPv6
+				)(:\\d{1,5})?                                   # port
+				(/\\S*)?                                        # path
+				(\\?\\S*)?                                      # query
+				(\\#\\S*)?                                      # fragment
+			$)Dix
+			XX, $value);
+	}
+
+
+	/**
+	 * Checks if the value is a valid URI address, that is, actually a string beginning with a syntactically valid schema.
+	 */
+	public static function isUri(string $value): bool
+	{
+		return (bool) preg_match('#^[a-z\d+\.-]+:\S+$#Di', $value);
+	}
+
+
+	/**
+	 * Checks whether the input is a class, interface or trait.
+	 * @deprecated
+	 */
+	public static function isType(string $type): bool
+	{
+		return class_exists($type) || interface_exists($type) || trait_exists($type);
+	}
+
+
+	/**
+	 * Checks whether the input is a valid PHP identifier.
+	 */
+	public static function isPhpIdentifier(string $value): bool
+	{
+		return preg_match('#^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$#D', $value) === 1;
+	}
+
+
+	/**
+	 * Determines if type is PHP built-in type. Otherwise, it is the class name.
+	 */
+	public static function isBuiltinType(string $type): bool
+	{
+		return isset(self::BuiltinTypes[strtolower($type)]);
+	}
+
+
+	/**
+	 * Determines if type is special class name self/parent/static.
+	 */
+	public static function isClassKeyword(string $name): bool
+	{
+		return (bool) preg_match('#^(self|parent|static)$#Di', $name);
+	}
+
+
+	/**
+	 * Checks whether the given type declaration is syntactically valid.
+	 */
+	public static function isTypeDeclaration(string $type): bool
+	{
+		return (bool) preg_match(<<<'XX'
+			~((?n)
+				\?? (?<type> \\? (?<name> [a-zA-Z_\x7f-\xff][\w\x7f-\xff]*) (\\ (?&name))* ) |
+				(?<intersection> (?&type) (& (?&type))+ ) |
+				(?<upart> (?&type) | \( (?&intersection) \) )  (\| (?&upart))+
+			)$~xAD
+			XX, $type);
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+
+/**
+ * The exception that is thrown when an image error occurs.
+ */
+class ImageException extends \Exception
+{
+}
+
+
+/**
+ * The exception that indicates invalid image file.
+ */
+class UnknownImageFileException extends ImageException
+{
+}
+
+
+/**
+ * The exception that indicates error of JSON encoding/decoding.
+ */
+class JsonException extends \JsonException
+{
+}
+
+
+/**
+ * The exception that indicates error of the last Regexp execution.
+ */
+class RegexpException extends \Exception
+{
+}
+
+
+/**
+ * The exception that indicates assertion error.
+ */
+class AssertionException extends \Exception
+{
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/compatibility.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/compatibility.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/compatibility.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/compatibility.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette\Utils;
+
+use Nette;
+
+if (false) {
+	/** @deprecated use Nette\HtmlStringable */
+	interface IHtmlString extends Nette\HtmlStringable
+	{
+	}
+} elseif (!interface_exists(IHtmlString::class)) {
+	class_alias(Nette\HtmlStringable::class, IHtmlString::class);
+}
+
+namespace Nette\Localization;
+
+if (false) {
+	/** @deprecated use Nette\Localization\Translator */
+	interface ITranslator extends Translator
+	{
+	}
+} elseif (!interface_exists(ITranslator::class)) {
+	class_alias(Translator::class, ITranslator::class);
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/exceptions.php 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/exceptions.php
--- 7.0.0-1/tools/.phpstan/vendor/nette/utils/src/exceptions.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/nette/utils/src/exceptions.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,109 @@
+<?php
+
+/**
+ * This file is part of the Nette Framework (https://nette.org)
+ * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
+ */
+
+declare(strict_types=1);
+
+namespace Nette;
+
+
+/**
+ * The exception that is thrown when the value of an argument is
+ * outside the allowable range of values as defined by the invoked method.
+ */
+class ArgumentOutOfRangeException extends \InvalidArgumentException
+{
+}
+
+
+/**
+ * The exception that is thrown when a method call is invalid for the object's
+ * current state, method has been invoked at an illegal or inappropriate time.
+ */
+class InvalidStateException extends \RuntimeException
+{
+}
+
+
+/**
+ * The exception that is thrown when a requested method or operation is not implemented.
+ */
+class NotImplementedException extends \LogicException
+{
+}
+
+
+/**
+ * The exception that is thrown when an invoked method is not supported. For scenarios where
+ * it is sometimes possible to perform the requested operation, see InvalidStateException.
+ */
+class NotSupportedException extends \LogicException
+{
+}
+
+
+/**
+ * The exception that is thrown when a requested method or operation is deprecated.
+ */
+class DeprecatedException extends NotSupportedException
+{
+}
+
+
+/**
+ * The exception that is thrown when accessing a class member (property or method) fails.
+ */
+class MemberAccessException extends \Error
+{
+}
+
+
+/**
+ * The exception that is thrown when an I/O error occurs.
+ */
+class IOException extends \RuntimeException
+{
+}
+
+
+/**
+ * The exception that is thrown when accessing a file that does not exist on disk.
+ */
+class FileNotFoundException extends IOException
+{
+}
+
+
+/**
+ * The exception that is thrown when part of a file or directory cannot be found.
+ */
+class DirectoryNotFoundException extends IOException
+{
+}
+
+
+/**
+ * The exception that is thrown when an argument does not match with the expected value.
+ */
+class InvalidArgumentException extends \InvalidArgumentException
+{
+}
+
+
+/**
+ * The exception that is thrown when an illegal index was requested.
+ */
+class OutOfRangeException extends \OutOfRangeException
+{
+}
+
+
+/**
+ * The exception that is thrown when a value (typically returned by function) does not match with the expected value.
+ */
+class UnexpectedValueException extends \UnexpectedValueException
+{
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Ondřej Mirtes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/README.md 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/README.md
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/README.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,93 @@
+# PHPStan Extension Installer
+
+[![Build](https://github.com/phpstan/extension-installer/workflows/Build/badge.svg)](https://github.com/phpstan/extension-installer/actions)
+[![Latest Stable Version](https://poser.pugx.org/phpstan/extension-installer/v/stable)](https://packagist.org/packages/phpstan/extension-installer)
+[![License](https://poser.pugx.org/phpstan/extension-installer/license)](https://packagist.org/packages/phpstan/extension-installer)
+
+Composer plugin for automatic installation of [PHPStan](https://phpstan.org/) extensions.
+
+# Motivation
+
+```diff
+diff --git a/phpstan.neon b/phpstan.neon
+index db4e3df32e..2ca30fa20a 100644
+--- a/phpstan.neon
++++ b/phpstan.neon
+@@ -1,12 +1,3 @@
+-includes:
+-	- vendor/phpstan/phpstan-doctrine/extension.neon
+-	- vendor/phpstan/phpstan-doctrine/rules.neon
+-	- vendor/phpstan/phpstan-nette/extension.neon
+-	- vendor/phpstan/phpstan-nette/rules.neon
+-	- vendor/phpstan/phpstan-phpunit/extension.neon
+-	- vendor/phpstan/phpstan-phpunit/rules.neon
+-	- vendor/phpstan/phpstan-strict-rules/rules.neon
+-
+ parameters:
+ 	autoload_directories:
+ 		- %rootDir%/../../../build/SlevomatSniffs
+diff --git a/composer.json b/composer.json
+index 1b578dd624..f6ebf6e477 100644
+--- a/composer.json
++++ b/composer.json
+@@ -142,6 +142,7 @@
+ 		"jakub-onderka/php-parallel-lint": "1.0.0",
+ 		"justinrainbow/json-schema": "5.2.8",
+ 		"ondrejmirtes/mocktainer": "0.8",
++		"phpstan/extension-installer": "^1.0",
+ 		"phpstan/phpstan": "^0.11.7",
+ 		"phpstan/phpstan-doctrine": "^0.11.3",
+ 		"phpstan/phpstan-nette": "^0.11.1",
+```
+
+## Usage
+
+```bash
+composer require --dev phpstan/extension-installer
+```
+
+Starting from Composer 2.2.0 you'll get the following question:
+```
+phpstan/extension-installer contains a Composer plugin which is currently not in your allow-plugins config. See https://getcomposer.org/allow-plugins
+Do you trust "phpstan/extension-installer" to execute code and wish to enable it now? (writes "allow-plugins" to composer.json) [y,n,d,?]
+```
+
+Answer with `y` to allow the plugin.
+
+## Instructions for extension developers
+
+It's best (but optional) to set the extension's composer package [type](https://getcomposer.org/doc/04-schema.md#type) to `phpstan-extension` for this plugin to be able to recognize it and to be [discoverable on Packagist](https://packagist.org/explore/?type=phpstan-extension).
+
+Add `phpstan` key in the extension `composer.json`'s `extra` section:
+
+```json
+{
+  "extra": {
+    "phpstan": {
+      "includes": [
+        "extension.neon"
+      ]
+    }
+  }
+}
+```
+
+## Ignoring a particular extension
+
+You may want to disable auto-installation of a particular extension to handle installation manually. Ignore an extension by adding an `extra.phpstan/extension-installer.ignore` array in `composer.json` that specifies a list of packages to ignore:
+
+```json
+{
+  "extra": {
+    "phpstan/extension-installer": {
+      "ignore": [
+        "phpstan/phpstan-phpunit"
+      ]
+    }
+  }
+}
+```
+
+## Limitations
+
+The extension installer depends on Composer script events, therefore you cannot use `--no-scripts` flag.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/composer.json 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,33 @@
+{
+    "name": "phpstan/extension-installer",
+    "type": "composer-plugin",
+    "description": "Composer plugin for automatic installation of PHPStan extensions",
+    "license": [
+        "MIT"
+    ],
+    "keywords": ["dev", "static analysis"],
+    "require": {
+        "php": "^7.2 || ^8.0",
+        "composer-plugin-api": "^2.0",
+        "phpstan/phpstan": "^1.9.0 || ^2.0"
+    },
+    "require-dev": {
+        "composer/composer": "^2.0",
+        "php-parallel-lint/php-parallel-lint": "^1.2.0",
+        "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0"
+    },
+    "config": {
+        "sort-packages": true,
+        "allow-plugins": {
+            "ocramius/package-versions": true
+        }
+    },
+    "extra": {
+        "class": "PHPStan\\ExtensionInstaller\\Plugin"
+    },
+    "autoload": {
+        "psr-4": {
+            "PHPStan\\ExtensionInstaller\\": "src/"
+        }
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,67 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\ExtensionInstaller;
+
+/**
+ * This class is generated by phpstan/extension-installer.
+ * @internal
+ */
+final class GeneratedConfig
+{
+
+	public const EXTENSIONS = array (
+  'ergebnis/phpstan-rules' => 
+  array (
+    'install_path' => '/usr/local/src/recursion-context/tools/.phpstan/vendor/ergebnis/phpstan-rules',
+    'relative_install_path' => '../../../ergebnis/phpstan-rules',
+    'extra' => 
+    array (
+      'includes' => 
+      array (
+        0 => 'rules.neon',
+      ),
+    ),
+    'version' => '2.8.0',
+    'phpstanVersionConstraint' => '>=2.0.0.0-dev, <3.0.0.0-dev',
+  ),
+  'phpstan/phpstan-strict-rules' => 
+  array (
+    'install_path' => '/usr/local/src/recursion-context/tools/.phpstan/vendor/phpstan/phpstan-strict-rules',
+    'relative_install_path' => '../../phpstan-strict-rules',
+    'extra' => 
+    array (
+      'includes' => 
+      array (
+        0 => 'rules.neon',
+      ),
+    ),
+    'version' => '2.0.3',
+    'phpstanVersionConstraint' => '>=2.0.4.0-dev, <3.0.0.0-dev',
+  ),
+  'tomasvotruba/type-coverage' => 
+  array (
+    'install_path' => '/usr/local/src/recursion-context/tools/.phpstan/vendor/tomasvotruba/type-coverage',
+    'relative_install_path' => '../../../tomasvotruba/type-coverage',
+    'extra' => 
+    array (
+      'includes' => 
+      array (
+        0 => 'config/extension.neon',
+      ),
+    ),
+    'version' => '2.0.2',
+    'phpstanVersionConstraint' => '>=2.0.0.0-dev, <3.0.0.0-dev',
+  ),
+);
+
+	public const NOT_INSTALLED = array (
+);
+
+	/** @var string|null */
+	public const PHPSTAN_VERSION_CONSTRAINT = '>=2.0.4.0-dev, <3.0.0.0-dev';
+
+	private function __construct()
+	{
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,228 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\ExtensionInstaller;
+
+use Composer\Composer;
+use Composer\EventDispatcher\EventSubscriberInterface;
+use Composer\IO\IOInterface;
+use Composer\Plugin\PluginInterface;
+use Composer\Script\Event;
+use Composer\Script\ScriptEvents;
+use Composer\Semver\Constraint\ConstraintInterface;
+use Composer\Semver\Constraint\MultiConstraint;
+use Composer\Semver\Intervals;
+use Composer\Util\Filesystem;
+use function array_key_exists;
+use function array_keys;
+use function class_exists;
+use function count;
+use function dirname;
+use function file_exists;
+use function file_put_contents;
+use function getcwd;
+use function in_array;
+use function is_file;
+use function ksort;
+use function md5;
+use function md5_file;
+use function sort;
+use function sprintf;
+use function strpos;
+use function var_export;
+use const DIRECTORY_SEPARATOR;
+
+final class Plugin implements PluginInterface, EventSubscriberInterface
+{
+
+	/** @var string */
+	private static $generatedFileTemplate = <<<'PHP'
+<?php declare(strict_types = 1);
+
+namespace PHPStan\ExtensionInstaller;
+
+/**
+ * This class is generated by phpstan/extension-installer.
+ * @internal
+ */
+final class GeneratedConfig
+{
+
+	public const EXTENSIONS = %s;
+
+	public const NOT_INSTALLED = %s;
+
+	/** @var string|null */
+	public const PHPSTAN_VERSION_CONSTRAINT = %s;
+
+	private function __construct()
+	{
+	}
+
+}
+
+PHP;
+
+	public function activate(Composer $composer, IOInterface $io): void
+	{
+		// noop
+	}
+
+	public function deactivate(Composer $composer, IOInterface $io): void
+	{
+		// noop
+	}
+
+	public function uninstall(Composer $composer, IOInterface $io): void
+	{
+		// noop
+	}
+
+	/**
+	 * @return array<string, string>
+	 */
+	public static function getSubscribedEvents(): array
+	{
+		return [
+			ScriptEvents::POST_INSTALL_CMD => 'process',
+			ScriptEvents::POST_UPDATE_CMD => 'process',
+		];
+	}
+
+	public function process(Event $event): void
+	{
+		$io = $event->getIO();
+
+		if (!file_exists(__DIR__)) {
+			$io->write('<info>phpstan/extension-installer:</info> Package not found (probably scheduled for removal); extensions installation skipped.');
+			return;
+		}
+
+		$composer = $event->getComposer();
+		$installationManager = $composer->getInstallationManager();
+
+		$generatedConfigFilePath = __DIR__ . '/GeneratedConfig.php';
+		$oldGeneratedConfigFileHash = null;
+		if (is_file($generatedConfigFilePath)) {
+			$oldGeneratedConfigFileHash = md5_file($generatedConfigFilePath);
+		}
+		$notInstalledPackages = [];
+		$installedPackages = [];
+		$ignoredPackages = [];
+
+		$data = [];
+		$fs = new Filesystem();
+		$ignore = [];
+
+		$packageExtra = $composer->getPackage()->getExtra();
+
+		if (isset($packageExtra['phpstan/extension-installer']['ignore'])) {
+			$ignore = $packageExtra['phpstan/extension-installer']['ignore'];
+		}
+
+		$phpstanVersionConstraints = [];
+
+		foreach ($composer->getRepositoryManager()->getLocalRepository()->getPackages() as $package) {
+			if (
+				$package->getType() !== 'phpstan-extension'
+				&& !isset($package->getExtra()['phpstan'])
+			) {
+				if (
+					strpos($package->getName(), 'phpstan') !== false
+					&& !in_array($package->getName(), [
+						'phpstan/phpstan',
+						'phpstan/phpstan-shim',
+						'phpstan/phpdoc-parser',
+						'phpstan/extension-installer',
+					], true)
+				) {
+					$notInstalledPackages[$package->getName()] = $package->getFullPrettyVersion();
+				}
+				continue;
+			}
+
+			if (in_array($package->getName(), $ignore, true)) {
+				$ignoredPackages[] = $package->getName();
+				continue;
+			}
+
+			$installPath = $installationManager->getInstallPath($package);
+			if ($installPath === null) {
+				continue;
+			}
+
+			$absoluteInstallPath = $fs->isAbsolutePath($installPath)
+				? $installPath
+				: getcwd() . DIRECTORY_SEPARATOR . $installPath;
+
+			$packageRequires = $package->getRequires();
+			$phpstanConstraint = null;
+			if (array_key_exists('phpstan/phpstan', $packageRequires)) {
+				$phpstanConstraint = $packageRequires['phpstan/phpstan']->getConstraint();
+				if ($phpstanConstraint->getLowerBound()->isZero()) {
+					continue;
+				}
+				if ($phpstanConstraint->getUpperBound()->isPositiveInfinity()) {
+					continue;
+				}
+				$phpstanVersionConstraints[] = $phpstanConstraint;
+			}
+
+			$data[$package->getName()] = [
+				'install_path' => $absoluteInstallPath,
+				'relative_install_path' => $fs->findShortestPath(dirname($generatedConfigFilePath), $absoluteInstallPath, true),
+				'extra' => $package->getExtra()['phpstan'] ?? null,
+				'version' => $package->getFullPrettyVersion(),
+				'phpstanVersionConstraint' => $phpstanConstraint !== null ? $this->constraintIntoString($phpstanConstraint) : null,
+			];
+
+			$installedPackages[$package->getName()] = true;
+		}
+
+		$phpstanVersionConstraint = null;
+		if (count($phpstanVersionConstraints) > 0 && class_exists(Intervals::class)) {
+			if (count($phpstanVersionConstraints) === 1) {
+				$multiConstraint = $phpstanVersionConstraints[0];
+			} else {
+				$multiConstraint = new MultiConstraint($phpstanVersionConstraints);
+			}
+			$phpstanVersionConstraint = $this->constraintIntoString(Intervals::compactConstraint($multiConstraint));
+		}
+
+		ksort($data);
+		ksort($installedPackages);
+		ksort($notInstalledPackages);
+		sort($ignoredPackages);
+
+		$generatedConfigFileContents = sprintf(self::$generatedFileTemplate, var_export($data, true), var_export($notInstalledPackages, true), var_export($phpstanVersionConstraint, true));
+		file_put_contents($generatedConfigFilePath, $generatedConfigFileContents);
+		$io->write('<info>phpstan/extension-installer:</info> Extensions installed');
+
+		if ($oldGeneratedConfigFileHash === md5($generatedConfigFileContents)) {
+			return;
+		}
+
+		foreach (array_keys($installedPackages) as $name) {
+			$io->write(sprintf('> <info>%s:</info> installed', $name));
+		}
+
+		foreach (array_keys($notInstalledPackages) as $name) {
+			$io->write(sprintf('> <comment>%s:</comment> not supported', $name));
+		}
+
+		foreach ($ignoredPackages as $name) {
+			$io->write(sprintf('> <comment>%s:</comment> ignored', $name));
+		}
+	}
+
+	private function constraintIntoString(ConstraintInterface $constraint): string
+	{
+		return sprintf(
+			'%s%s, %s%s',
+			$constraint->getLowerBound()->isInclusive() ? '>=' : '>',
+			$constraint->getLowerBound()->getVersion(),
+			$constraint->getUpperBound()->isInclusive() ? '<=' : '<',
+			$constraint->getUpperBound()->getVersion()
+		);
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/LICENSE 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/LICENSE
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/LICENSE	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2016 Ondřej Mirtes
+Copyright (c) 2025 PHPStan s.r.o.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/README.md 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/README.md
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/README.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,108 @@
+<h1 align="center">PHPStan - PHP Static Analysis Tool</h1>
+
+<p align="center">
+	<img src="https://i.imgur.com/WaRKPlC.png" alt="PHPStan" width="300" height="300">
+</p>
+
+<p align="center">
+	<a href="https://github.com/phpstan/phpstan/actions"><img src="https://github.com/phpstan/phpstan/workflows/Tests/badge.svg" alt="Build Status"></a>
+	<a href="https://packagist.org/packages/phpstan/phpstan"><img src="https://poser.pugx.org/phpstan/phpstan/v/stable" alt="Latest Stable Version"></a>
+	<a href="https://packagist.org/packages/phpstan/phpstan/stats"><img src="https://poser.pugx.org/phpstan/phpstan/downloads" alt="Total Downloads"></a>
+	<a href="https://choosealicense.com/licenses/mit/"><img src="https://poser.pugx.org/phpstan/phpstan/license" alt="License"></a>
+	<a href="https://phpstan.org/"><img src="https://img.shields.io/badge/PHPStan-enabled-brightgreen.svg?style=flat" alt="PHPStan Enabled"></a>
+</p>
+
+------
+
+PHPStan focuses on finding errors in your code without actually running it. It catches whole classes of bugs
+even before you write tests for the code. It moves PHP closer to compiled languages in the sense that the correctness of each line of the code
+can be checked before you run the actual line.
+
+**[Read more about PHPStan »](https://phpstan.org/)**
+
+**[Try out PHPStan on the on-line playground! »](https://phpstan.org/try)**
+
+## Sponsors
+
+<a href="https://coders.thecodingmachine.com/phpstan"><img src="website/src/images/sponsor/tcm.png" alt="TheCodingMachine" width="247" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://packagist.com/?utm_source=phpstan&utm_medium=readme&utm_campaign=sponsorlogo"><img src="website/src/images/sponsor/packagist.png" alt="Private Packagist" width="283" height="64"></a>
+<br>
+<a href="https://www.cdn77.com/"><img src="website/src/images/sponsor/cdn77.png" alt="CDN77" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://blackfire.io/docs/introduction?utm_source=phpstan&utm_medium=github_readme&utm_campaign=logo"><img src="website/src/images/sponsor/blackfire.png" alt="Blackfire.io" width="254" height="64"></a>
+<br>
+<a href="https://www.iodigital.com/"><img src="website/src/images/sponsor/io.png" alt="iO" width="254" height="65"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://www.fame.fi/"><img src="website/src/images/sponsor/fame.png" alt="Fame Helsinki" width="283" height="64"></a>
+<br>
+<a href="https://www.startupjobs.cz/startup/shipmonk"><img src="website/src/images/sponsor/shipmonk.jpg" alt="ShipMonk" width="290" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://togetter.com/"><img src="website/src/images/sponsor/togetter.png" alt="Togetter" width="283" height="64"></a>
+<br>
+<a href="https://join.rightcapital.com/?utm_source=phpstan&utm_medium=github&utm_campaign=sponsorship"><img src="website/src/images/sponsor/rightcapital.png" alt="RightCapital" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://www.contentkingapp.com/?ref=php-developer&utm_source=phpstan&utm_medium=referral&utm_campaign=sponsorship"><img src="website/src/images/sponsor/contentking.png" alt="ContentKing" width="283" height="64"></a>
+<br>
+<a href="https://zol.fr?utm_source=phpstan"><img src="website/src/images/sponsor/zol.png" alt="ZOL" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://www.edgenext.com/"><img src="website/src/images/sponsor/edgenext.png" alt="EdgeNext" width="283" height="64"></a>
+<br>
+<a href="https://www.shopware.com/en/"><img src="website/src/images/sponsor/shopware.png" alt="Shopware" width="284" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://craftcms.com/"><img src="website/src/images/sponsor/craftcms.png" alt="Craft CMS" width="283" height="64"></a>
+<br>
+<a href="https://www.worksome.com/"><img src="website/src/images/sponsor/worksome.png" alt="Worksome" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://www.campoint.net/"><img src="website/src/images/sponsor/campoint.png" alt="campoint AG" width="283" height="64"></a>
+<br>
+<a href="https://www.crisp.nl/"><img src="website/src/images/sponsor/crisp.png" alt="Crisp.nl" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://inviqa.com/"><img src="website/src/images/sponsor/inviqa.png" alt="Inviqa" width="254" height="65"></a>
+<br>
+<a href="https://www.shoptet.cz/"><img src="website/src/images/sponsor/shoptet.png" alt="Shoptet" width="283" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://route4me.com/"><img src="website/src/images/sponsor/route4me.png" alt="Route4Me: Route Optimizer and Route Planner Software" width="283" height="64"></a>
+<br>
+<a href="https://werkenbijbelsimpel.nl/en/about-us/"><img src="website/src/images/sponsor/belsimpel.png" alt="Belsimpel" width="284" height="64"></a>
+&nbsp;&nbsp;&nbsp;
+<a href="https://jobs.ticketswap.com/"><img src="website/src/images/sponsor/ticketswap.png" alt="TicketSwap" width="269" height="64"></a>
+
+
+[**You can now sponsor my open-source work on PHPStan through GitHub Sponsors.**](https://github.com/sponsors/ondrejmirtes)
+
+Does GitHub already have your 💳? Do you use PHPStan to find 🐛 before they reach production? [Send a couple of 💸 a month my way too.](https://github.com/sponsors/ondrejmirtes) Thank you!
+
+One-time donations [through Revolut.me](https://revolut.me/ondrejmirtes) are also accepted. To request an invoice, [contact me](mailto:ondrej@mirtes.cz) through e-mail.
+
+## Documentation
+
+All the documentation lives on the [phpstan.org website](https://phpstan.org/):
+
+* [Getting Started & User Guide](https://phpstan.org/user-guide/getting-started)
+* [Config Reference](https://phpstan.org/config-reference)
+* [PHPDocs Basics](https://phpstan.org/writing-php-code/phpdocs-basics) & [PHPDoc Types](https://phpstan.org/writing-php-code/phpdoc-types)
+* [Extension Library](https://phpstan.org/user-guide/extension-library)
+* [Developing Extensions](https://phpstan.org/developing-extensions/extension-types)
+* [API Reference](https://apiref.phpstan.org/)
+
+## PHPStan Pro
+
+PHPStan Pro is a paid add-on on top of open-source PHPStan Static Analysis Tool with these premium features:
+
+* Web UI for browsing found errors, you can click and open your editor of choice on the offending line.
+* Continuous analysis (watch mode): scans changed files in the background, refreshes the UI automatically.
+
+Try it on PHPStan 0.12.45 or later by running it with the `--pro` option. You can create an account either by following the on-screen instructions, or by visiting [account.phpstan.com](https://account.phpstan.com/).
+
+After 30-day free trial period it costs 7 EUR for individuals monthly, 70 EUR for teams (up to 25 members). By paying for PHPStan Pro, you're supporting the development of open-source PHPStan.
+
+You can read more about it on [PHPStan's website](https://phpstan.org/blog/introducing-phpstan-pro).
+
+## Code of Conduct
+
+This project adheres to a [Contributor Code of Conduct](https://github.com/phpstan/phpstan/blob/master/CODE_OF_CONDUCT.md). By participating in this project and its community, you are expected to uphold this code.
+
+## Contributing
+
+Any contributions are welcome. PHPStan's source code open to pull requests lives at [`phpstan/phpstan-src`](https://github.com/phpstan/phpstan-src).
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,338 @@
+Upgrading from PHPStan 1.x to 2.0
+=================================
+
+## PHP version requirements
+
+PHPStan now requires PHP 7.4 or newer to run.
+
+## Upgrading guide for end users
+
+The best way to get ready for upgrade to PHPStan 2.0 is to update to the **latest PHPStan 1.12 release**
+and enable [**Bleeding Edge**](https://phpstan.org/blog/what-is-bleeding-edge). This will enable the new rules and behaviours that 2.0 turns on for all users.
+
+Also make sure to install and enable [`phpstan/phpstan-deprecation-rules`](https://github.com/phpstan/phpstan-deprecation-rules).
+
+Once you get to a green build with no deprecations showed on latest PHPStan 1.12.x with Bleeding Edge enabled, you can update all your related PHPStan dependencies to 2.0 in `composer.json`:
+
+```json
+"require-dev": {
+    "phpstan/phpstan": "^2.0",
+    "phpstan/phpstan-deprecation-rules": "^2.0",
+    "phpstan/phpstan-doctrine": "^2.0",
+    "phpstan/phpstan-nette": "^2.0",
+    "phpstan/phpstan-phpunit": "^2.0",
+    "phpstan/phpstan-strict-rules": "^2.0",
+    "phpstan/phpstan-symfony": "^2.0",
+    "phpstan/phpstan-webmozart-assert": "^2.0",
+    ...
+}
+```
+
+Don't forget to update [3rd party PHPStan extensions](https://phpstan.org/user-guide/extension-library) as well.
+
+After changing your `composer.json`, run `composer update 'phpstan/*' -W`.
+
+It's up to you whether you go through the new reported errors or if you just put them all to the [baseline](https://phpstan.org/user-guide/baseline) ;) Everyone who's on PHPStan 1.12 should be able to upgrade to PHPStan 2.0.
+
+### Noteworthy changes to code analysis
+
+* [**Enhancements in handling parameters passed by reference**](https://phpstan.org/blog/enhancements-in-handling-parameters-passed-by-reference)
+* [**Validate inline PHPDoc `@var` tag type**](https://phpstan.org/blog/phpstan-1-10-comes-with-lie-detector#validate-inline-phpdoc-%40var-tag-type)
+* [**List type enforced**](https://phpstan.org/blog/phpstan-1-9-0-with-phpdoc-asserts-list-type#list-type)
+* **Always `true` conditions always reported**: previously reported only with phpstan-strict-rules, this is now always reported.
+
+### Removed option `checkMissingIterableValueType`
+
+It's strongly recommended to add the missing array typehints.
+
+If you want to continue ignoring missing typehints from arrays, add `missingType.iterableValue` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+	ignoreErrors:
+		-
+			identifier: missingType.iterableValue
+```
+
+### Removed option `checkGenericClassInNonGenericObjectType`
+
+It's strongly recommended to add the missing generic typehints.
+
+If you want to continue ignoring missing typehints from generics, add `missingType.generics` error identifier to your `ignoreErrors`:
+
+```neon
+parameters:
+	ignoreErrors:
+		-
+			identifier: missingType.generics
+```
+
+### Removed `checkAlwaysTrue*` options
+
+These options have been removed because PHPStan now always behaves as if these were set to `true`:
+
+* `checkAlwaysTrueCheckTypeFunctionCall`
+* `checkAlwaysTrueInstanceof`
+* `checkAlwaysTrueStrictComparison`
+* `checkAlwaysTrueLooseComparison`
+
+### Removed option `excludes_analyse`
+
+It has been replaced with [`excludePaths`](https://phpstan.org/user-guide/ignoring-errors#excluding-whole-files).
+
+### Paths in `excludePaths` and `ignoreErrors` have to be a valid file path or a fnmatch pattern
+
+If you are excluding a file path that might not exist but you still want to have it in `excludePaths`, append `(?)`:
+
+```neon
+parameters:
+	excludePaths:
+		- tests/*/data/*
+		- src/broken
+		- node_modules (?) # optional path, might not exist
+```
+
+If you have the same situation in `ignoreErrors` (ignoring an error in a path that might not exist), use `reportUnmatchedIgnoredErrors: false`.
+
+```neon
+parameters:
+	reportUnmatchedIgnoredErrors: false
+```
+
+Appending `(?)` in `ignoreErrors` is not supported.
+
+### Changes in 1st party PHPStan extensions
+
+* [phpstan-doctrine](https://github.com/phpstan/phpstan-doctrine)
+  * Removed config parameter `searchOtherMethodsForQueryBuilderBeginning` (extension now behaves as when this was set to `true`)
+  * Removed config parameter `queryBuilderFastAlgorithm` (extension now behaves as when this was set to `false`)
+* [phpstan-symfony](https://github.com/phpstan/phpstan-symfony)
+  * Removed legacy options with `_` in the name
+  * `container_xml_path` -> use `containerXmlPath`
+  * `constant_hassers` -> use `constantHassers`
+  * `console_application_loader` -> use `consoleApplicationLoader`
+
+### Minor backward compatibility breaks
+
+* Removed unused config parameter `cache.nodesByFileCountMax`
+* Removed unused config parameter `memoryLimitFile`
+* Removed unused feature toggle `disableRuntimeReflectionProvider`
+* Removed unused config parameter `staticReflectionClassNamePatterns`
+* Remove `fixerTmpDir` config parameter, use `pro.tmpDir` instead
+* Remove `tempResultCachePath` config parameter, use `resultCachePath` instead
+* `additionalConfigFiles` config parameter must be a list
+
+## Upgrading guide for extension developers
+
+> [!NOTE]
+> Please switch to PHPStan 2.0 in a new major version of your extension. It's not feasible to try to support both PHPStan 1.x and PHPStan 2.x with the same extension code.
+>
+> You can definitely get closer to supporting PHPStan 2.0 without increasing major version by solving reported deprecations and other issues by analysing your extension code with PHPStan & phpstan-deprecation-rules & Bleeding Edge, but the final leap and solving backward incompatibilities should be done by requiring `"phpstan/phpstan": "^2.0"` in your `composer.json`, and releasing a new major version.
+
+### PHPStan now uses nikic/php-parser v5
+
+See [UPGRADING](https://github.com/nikic/PHP-Parser/blob/master/UPGRADE-5.0.md) guide for PHP-Parser.
+
+The most notable change is how `throw` statement is represented. Previously, `throw` statements like `throw $e;` were represented using the `Stmt\Throw_` class, while uses inside other expressions (such as `$x ?? throw $e`) used the `Expr\Throw_` class.
+
+Now, `throw $e;` is represented as a `Stmt\Expression` that contains an `Expr\Throw_`. The
+`Stmt\Throw_` class has been removed.
+
+### PHPStan now uses phpstan/phpdoc-parser v2
+
+See [UPGRADING](https://github.com/phpstan/phpdoc-parser/blob/2.0.x/UPGRADING.md) guide for phpstan/phpdoc-parser.
+
+### Returning plain strings as errors no longer supported, use RuleErrorBuilder
+
+Identifiers are also required in custom rules.
+
+Learn more: [Using RuleErrorBuilder to enrich reported errors in custom rules](https://phpstan.org/blog/using-rule-error-builder)
+
+**Before**:
+
+```php
+return ['My error'];
+```
+
+**After**:
+
+```php
+return [
+    RuleErrorBuilder::message('My error')
+        ->identifier('my.error')
+        ->build(),
+];
+```
+
+### Deprecate various `instanceof *Type` in favour of new methods on `Type` interface
+
+Learn more: [Why Is instanceof *Type Wrong and Getting Deprecated?](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated)
+
+### Removed deprecated `ParametersAcceptorSelector::selectSingle()`
+
+Use [`ParametersAcceptorSelector::selectFromArgs()`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ParametersAcceptorSelector.html#_selectFromArgs) instead. It should be used in most places where `selectSingle()` was previously used, like dynamic return type extensions.
+
+**Before**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectSingle($functionReflection->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$defaultReturnType = ParametersAcceptorSelector::selectFromArgs(
+    $scope,
+    $functionCall->getArgs(),
+    $functionReflection->getVariants()
+)->getReturnType();
+```
+
+If you're analysing function or method body itself and you're using one of the following methods, ask for `getParameters()` and `getReturnType()` directly on the reflection object:
+
+* [InClassMethodNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InClassMethodNode.html)
+* [InFunctionNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.InFunctionNode.html)
+* [FunctionReturnStatementsNode::getFunctionReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.FunctionReturnStatementsNode.html)
+* [MethodReturnStatementsNode::getMethodReflection()](https://apiref.phpstan.org/2.0.x/PHPStan.Node.MethodReturnStatementsNode.html)
+* [Scope::getFunction()](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.Scope.html#_getFunction)
+
+**Before**:
+
+```php
+$function = $node->getFunctionReflection();
+$returnType = ParametersAcceptorSelector::selectSingle($function->getVariants())->getReturnType();
+```
+
+**After**:
+
+```php
+$returnType = $node->getFunctionReflection()->getReturnType();
+```
+
+### Changed `TypeSpecifier::create()` and `SpecifiedTypes` constructor parameters
+
+[`PHPStan\Analyser\TypeSpecifier::create()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.TypeSpecifier.html#_create) now accepts (all parameters are required):
+
+* `Expr $expr`
+* `Type $type`
+* `TypeSpecifierContext $context`
+* `Scope $scope`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by this method), call `setAlwaysOverwriteTypes()` and `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::create()`). These methods return a new object (SpecifiedTypes is immutable).
+
+[`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) constructor now accepts:
+
+* `array $sureTypes`
+* `array $sureNotTypes`
+
+If you want to change `$overwrite` or `$rootExpr` (previous parameters also used to be accepted by the constructor), call `setAlwaysOverwriteTypes()` and `setRootExpr()`. These methods return a new object (SpecifiedTypes is immutable).
+
+### `ConstantArrayType` no longer extends `ArrayType`
+
+`Type::getArrays()` now returns `list<ArrayType|ConstantArrayType>`.
+
+Using `$type instanceof ArrayType` is [being deprecated anyway](https://phpstan.org/blog/why-is-instanceof-type-wrong-and-getting-deprecated) so the impact of this change should be minimal.
+
+### Changed `TypeSpecifier::specifyTypesInCondition()`
+
+This method no longer accepts `Expr $rootExpr`. If you want to change it, call `setRootExpr()` on [`SpecifiedTypes`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.SpecifiedTypes.html) (object returned by `TypeSpecifier::specifyTypesInCondition()`). `setRootExpr()` method returns a new object (SpecifiedTypes is immutable).
+
+### Node attributes `parent`, `previous`, `next` are no longer available
+
+Learn more: https://phpstan.org/blog/preprocessing-ast-for-custom-rules
+
+### Removed config parameter `scopeClass`
+
+As a replacement you can implement [`PHPStan\Type\ExpressionTypeResolverExtension`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.ExpressionTypeResolverExtension.html) interface instead and register it as a service.
+
+### Removed `PHPStan\Broker\Broker`
+
+Use [`PHPStan\Reflection\ReflectionProvider`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ReflectionProvider.html) instead.
+
+`BrokerAwareExtension` was also removed. Ask for `ReflectionProvider` in the extension constructor instead.
+
+Instead of `PHPStanTestCase::createBroker()`, call `PHPStanTestCase::createReflectionProvider()`.
+
+### List type is enabled for everyone
+
+Removed static methods from `AccessoryArrayListType` class:
+
+* `isListTypeEnabled()`
+* `setListTypeEnabled()`
+* `intersectWith()`
+
+Instead of `AccessoryArrayListType::intersectWith($type)`, do `TypeCombinator::intersect($type, new AccessoryArrayListType())`.
+
+### Minor backward compatibility breaks
+
+* Classes that were previously `@final` were made `final`
+* Parameter `$callableParameters` of [`MutatingScope::enterAnonymousFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterAnonymousFunction) and [`enterArrowFunction()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.MutatingScope.html#_enterArrowFunction) made required
+* Parameter `StatementContext $context` of [`NodeScopeResolver::processStmtNodes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Analyser.NodeScopeResolver.html#_processStmtNodes) made required
+* ClassPropertiesNode - remove `$extensions` parameter from [`getUninitializedProperties()`](https://apiref.phpstan.org/2.0.x/PHPStan.Node.ClassPropertiesNode.html#_getUninitializedProperties)
+* `Type::getSmallerType()`, `Type::getSmallerOrEqualType()`, `Type::getGreaterType()`, `Type::getGreaterOrEqualType()`, `Type::isSmallerThan()`, `Type::isSmallerThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* `CompoundType::isGreaterThan()`, `CompoundType::isGreaterThanOrEqual()` now require [`PhpVersion`](https://apiref.phpstan.org/2.0.x/PHPStan.Php.PhpVersion.html) as argument.
+* Removed `ReflectionProvider::supportsAnonymousClasses()` (all reflection providers support anonymous classes)
+* Remove `ArrayType::generalizeKeys()`
+* Remove `ArrayType::count()`, use `Type::getArraySize()` instead
+* Remove `ArrayType::castToArrayKeyType()`, `Type::toArrayKey()` instead
+* Remove `UnionType::pickTypes()`, use `pickFromTypes()` instead
+* Remove `RegexArrayShapeMatcher::matchType()`, use `matchExpr()` instead
+* Remove unused `PHPStanTestCase::$useStaticReflectionProvider`
+* Remove `PHPStanTestCase::getReflectors()`, use `getReflector()` instead
+* Remove `ClassReflection::getFileNameWithPhpDocs()`, use `getFileName()` instead
+* Remove `AnalysisResult::getInternalErrors()`, use `getInternalErrorObjects()` instead
+* Remove `ConstantReflection::getValue()`, use `getValueExpr()` instead. To get `Type` from `Expr`, use `Scope::getType()` or `InitializerExprTypeResolver::getType()`
+* Remove `PropertyTag::getType()`, use `getReadableType()` / `getWritableType()` instead
+* Remove `GenericTypeVariableResolver`, use [`Type::getTemplateType()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getTemplateType) instead
+* Rename `Type::isClassStringType()` to `Type::isClassString()`
+* Remove `Scope::isSpecified()`, use `hasExpressionType()` instead
+* Remove `ConstantArrayType::isEmpty()`, use `isIterableAtLeastOnce()->no()` instead
+* Remove `ConstantArrayType::getNextAutoIndex()`
+* Removed methods from `ConstantArrayType` - `getFirst*Type` and `getLast*Type`
+  * Use `getFirstIterable*Type` and `getLastIterable*Type` instead
+* Remove `ConstantArrayType::generalizeToArray()`
+* Remove `ConstantArrayType::findTypeAndMethodName()`, use `findTypeAndMethodNames()` instead
+* Remove `ConstantArrayType::removeLast()`, use [`Type::popArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_popArray) instead
+* Remove `ConstantArrayType::removeFirst()`, use [`Type::shiftArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_shiftArray) instead
+* Remove `ConstantArrayType::reverse()`, use [`Type::reverseArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_reverseArray) instead
+* Remove `ConstantArrayType::chunk()`, use [`Type::chunkArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_chunkArray) instead
+* Remove `ConstantArrayType::slice()`, use [`Type::sliceArray()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_sliceArray) instead
+* Made `TypeUtils` thinner by removing methods:
+  * Remove `TypeUtils::getArrays()` and `getAnyArrays()`, use [`Type::getArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getArrays) instead
+  * Remove `TypeUtils::getConstantArrays()` and `getOldConstantArrays()`, use [`Type::getConstantArrays()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantArrays) instead
+  * Remove `TypeUtils::getConstantStrings()`, use [`Type::getConstantStrings()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantStrings) instead
+  * Remove `TypeUtils::getConstantTypes()` and `getAnyConstantTypes()`, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) or [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize)
+  * Remove `TypeUtils::generalizeType()`, use [`Type::generalize()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_generalize) instead
+  * Remove `TypeUtils::getDirectClassNames()`, use [`Type::getObjectClassNames()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getObjectClassNames) instead
+  * Remove `TypeUtils::getConstantScalars()`, use [`Type::isConstantScalarValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantScalarValue) or [`Type::getConstantScalarTypes()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getConstantScalarTypes) instead
+  * Remove `TypeUtils::getEnumCaseObjects()`, use [`Type::getEnumCases()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getEnumCases) instead
+  * Remove `TypeUtils::containsCallable()`, use [`Type::isCallable()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isCallable) instead
+* Removed `Scope::doNotTreatPhpDocTypesAsCertain()`, use `getNativeType()` instead
+* Parameter `$isList` in `ConstantArrayType` constructor can only be `TrinaryLogic`, no longer `bool`
+* Parameter `$nextAutoIndexes` in `ConstantArrayType` constructor can only be `non-empty-list<int>`, no longer `int`
+* Remove `ConstantType` interface, use [`Type::isConstantValue()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_isConstantValue) instead
+* `acceptsNamedArguments()` in `FunctionReflection`, `ExtendedMethodReflection` and `CallableParametersAcceptor` interfaces returns `TrinaryLogic` instead of `bool`
+* Remove `FunctionReflection::isFinal()`
+* [`Type::getProperty()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.Type.html#_getProperty) now returns [`ExtendedPropertyReflection`](https://apiref.phpstan.org/2.0.x/PHPStan.Reflection.ExtendedPropertyReflection.html)
+* Remove `__set_state()` on objects that should not be serialized in cache
+* Parameter `$selfClass` of [`TypehintHelper::decideTypeFromReflection()`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.TypehintHelper.html#_decideTypeFromReflection) no longer accepts `string`
+* `LevelsTestCase::dataTopics()` data provider made static
+* `PHPStan\Node\Printer\Printer` no longer autowired as `PhpParser\PrettyPrinter\Standard`, use `PHPStan\Node\Printer\Printer` in the typehint
+* Remove `Type::acceptsWithReason()`, `Type:accepts()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Remove `CompoundType::isAcceptedWithReasonBy()`, `CompoundType::isAcceptedBy()` return type changed from `TrinaryLogic` to [`AcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+Remove `Type::isSuperTypeOfWithReason()`, `Type:isSuperTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `CompoundType::isSubTypeOfWithReasonBy()`, `CompoundType::isSubTypeOf()` return type changed from `TrinaryLogic` to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* Remove `TemplateType::isValidVarianceWithReason()`, changed `TemplateType::isValidVariance()` return type to [`IsSuperTypeOfResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.IsSuperTypeOfResult.html)
+* `RuleLevelHelper::accepts()` return type changed from `bool` to [`RuleLevelHelperAcceptsResult`](https://apiref.phpstan.org/2.0.x/PHPStan.Type.AcceptsResult.html)
+* Changes around `ClassConstantReflection`
+  * Class `ClassConstantReflection` removed from BC promise, renamed to `RealClassConstantReflection`
+  * Interface `ConstantReflection` renamed to `ClassConstantReflection`
+  * Added more methods around PHPDoc types and native types to the (new) `ClassConstantReflection`
+  * Interface `GlobalConstantReflection` renamed to `ConstantReflection`
+* Renamed interfaces and classes from `*WithPhpDocs` to `Extended*`
+  * `ParametersAcceptorWithPhpDocs` -> `ExtendedParametersAcceptor`
+  * `ParameterReflectionWithPhpDocs` -> `ExtendedParameterReflection`
+  * `FunctionVariantWithPhpDocs` -> `ExtendedFunctionVariant`
+* `ClassPropertyNode::getNativeType()` return type changed from AST node to `Type|null`
+* Class `PHPStan\Node\ClassMethod` (accessible from `ClassMethodsNode`) is no longer an AST node
+  * Call `PHPStan\Node\ClassMethod::getNode()` to access the original AST node
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,114 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan;
+
+use Composer\Autoload\ClassLoader;
+use function class_exists;
+use const PHP_VERSION_ID;
+
+final class PharAutoloader
+{
+	/** @var ClassLoader */
+	private static $composerAutoloader;
+
+	/** @var bool */
+	private static $polyfillsLoaded = false;
+
+	final public static function loadClass(string $class): void {
+		if (!extension_loaded('phar') || defined('__PHPSTAN_RUNNING__')) {
+			return;
+		}
+
+		if (strpos($class, '_PHPStan_') === 0) {
+			if (!in_array('phar', stream_get_wrappers(), true)) {
+				throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.');
+			}
+
+			if (self::$composerAutoloader === null) {
+				self::$composerAutoloader = require 'phar://' . __DIR__ . '/phpstan.phar/vendor/autoload.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/jetbrains/phpstorm-stubs/PhpStormStubsMap.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/async/src/functions_include.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/react/promise/src/functions_include.php';
+			}
+			self::$composerAutoloader->loadClass($class);
+
+			return;
+		}
+		if (strpos($class, 'PHPStan\\') !== 0 || strpos($class, 'PHPStan\\PhpDocParser\\') === 0) {
+			return;
+		}
+
+		if (!in_array('phar', stream_get_wrappers(), true)) {
+			throw new \Exception('Phar wrapper is not registered. Please review your php.ini settings.');
+		}
+
+		if (!self::$polyfillsLoaded) {
+			self::$polyfillsLoaded = true;
+
+			if (
+				PHP_VERSION_ID < 80000
+				&& empty($GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'])
+				&& !class_exists(\Symfony\Polyfill\Php80\Php80::class, false)
+			) {
+				$GLOBALS['__composer_autoload_files']['a4a119a56e50fbb293281d9a48007e0e'] = true;
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/Php80.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php80/bootstrap.php';
+			}
+
+			if (
+				empty($GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'])
+				&& !class_exists(\Symfony\Polyfill\Mbstring\Mbstring::class, false)
+			) {
+				$GLOBALS['__composer_autoload_files']['0e6d7bf4a5811bfa5cf40c5ccd6fae6a'] = true;
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/Mbstring.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-mbstring/bootstrap.php';
+			}
+
+			if (
+				empty($GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'])
+				&& !class_exists(\Symfony\Polyfill\Intl\Normalizer\Normalizer::class, false)
+			) {
+				$GLOBALS['__composer_autoload_files']['e69f7f6ee287b969198c3c9d6777bd38'] = true;
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/Normalizer.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-normalizer/bootstrap.php';
+			}
+
+			if (
+				!extension_loaded('intl')
+				&& empty($GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'])
+				&& !class_exists(\Symfony\Polyfill\Intl\Grapheme\Grapheme::class, false)
+			) {
+				$GLOBALS['__composer_autoload_files']['8825ede83f2f289127722d4e842cf7e8'] = true;
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/Grapheme.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-intl-grapheme/bootstrap.php';
+			}
+
+			if (
+				PHP_VERSION_ID < 80100
+				&& empty ($GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'])
+				&& !class_exists(\Symfony\Polyfill\Php81\Php81::class, false)
+			) {
+				$GLOBALS['__composer_autoload_files']['23c18046f52bef3eea034657bafda50f'] = true;
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/Php81.php';
+				require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/bootstrap.php';
+			}
+		}
+
+		$filename = str_replace('\\', DIRECTORY_SEPARATOR, $class);
+		if (strpos($class, 'PHPStan\\BetterReflection\\') === 0) {
+			$filename = substr($filename, strlen('PHPStan\\BetterReflection\\'));
+			$filepath = 'phar://' . __DIR__ . '/phpstan.phar/vendor/ondrejmirtes/better-reflection/src/' . $filename . '.php';
+		} else {
+			$filename = substr($filename, strlen('PHPStan\\'));
+			$filepath = 'phar://' . __DIR__ . '/phpstan.phar/src/' . $filename . '.php';
+		}
+
+		if (!file_exists($filepath)) {
+			return;
+		}
+
+		require $filepath;
+	}
+}
+
+spl_autoload_register([PharAutoloader::class, 'loadClass']);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/composer.json 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,26 @@
+{
+	"name": "phpstan/phpstan",
+	"description": "PHPStan - PHP Static Analysis Tool",
+	"license": ["MIT"],
+	"keywords": ["dev", "static analysis"],
+	"require": {
+		"php": "^7.4|^8.0"
+	},
+	"conflict": {
+		"phpstan/phpstan-shim": "*"
+	},
+	"bin": [
+		"phpstan",
+		"phpstan.phar"
+	],
+	"autoload": {
+		"files": ["bootstrap.php"]
+	},
+	"support": {
+		"issues": "https://github.com/phpstan/phpstan/issues",
+		"forum": "https://github.com/phpstan/phpstan/discussions",
+		"source": "https://github.com/phpstan/phpstan-src",
+		"docs": "https://phpstan.org/user-guide/getting-started",
+		"security": "https://github.com/phpstan/phpstan/security/policy"
+	}
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,2 @@
+includes:
+	- phar://phpstan.phar/conf/bleedingEdge.neon
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,8 @@
+#!/usr/bin/env php
+<?php
+
+declare (strict_types=1);
+
+Phar::loadPhar(__DIR__ . '/phpstan.phar', 'phpstan.phar');
+
+require 'phar://phpstan.phar/bin/phpstan';
Binary files 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar and 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar differ
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmfNX6IACgkQUcZzBf/C
+5cAOGBAAibd5PkpJtT3HD4whLS7MsTSOcHoGoHNaqCqZWWk/sQPg8IqQUTCW/F4u
+e1BUQ3yTSs15XhoBh5vMzZ+LEzIdoXSwGyHSdBLVdYHVsg0HD8yUfuNiKy7ycJh0
+jfcckztoLWPxZCpaxbv2RQ4e7l73rw5fGYwtLiKUvuh4vmtXNHK/gn25cJtKbEn+
+Gocbe9LZfoB0IPWrb/JtES8SPqs307K8v1ATj7xEFK0EtFUmie36qlFOvJZstEJ4
+Ro7HWaHJJFMqeX8sABanUp42lbiEJcZEoVBnWl5UeJ5aA5NnqB8t1m95ByCn4wQp
+EMg4xiKOowtowfRByQngOd2jiNH/QuNZPNwNg4/3moJuKP/7MbAzI31FkPCoIonq
+gz34IhW0S0pNIWEwIHJOtRKkOio5AjS7JTlU+XWhYfEYVPat1WHBKnpv8pfK+Xoe
+qkkKjHhiZJD0zyf/d3LG8U+r7Q06/hJrhSghGOMcnh66qPLjl9k9MK1vAHbae9Y9
+j7SDTIZfjflFFF0iHypaU9IEUio/3tTJngE+gB6IhVhMaqySm97W3ot225hKbM1d
+VS4PqlOEPgOmPt3444VqaNJUoC2zJkGUhFKTyRm9aN+/8R6foKJ4GG4DICLmDr0R
+wXDbAthyzPpZ84kN2p6EgVkSFsomQgwU93VSvB69KvbNkkOfZ9I=
+=mtzY
+-----END PGP SIGNATURE-----
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,27 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+trim_trailing_whitespace = true
+
+[*.{php,phpt}]
+indent_style = tab
+indent_size = 4
+
+[*.xml]
+indent_style = tab
+indent_size = 4
+
+[*.neon]
+indent_style = tab
+indent_size = 4
+
+[*.{yaml,yml}]
+indent_style = space
+indent_size = 2
+
+[composer.json]
+indent_style = tab
+indent_size = 4
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2016 Ondřej Mirtes
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,108 @@
+# Extra strict and opinionated rules for PHPStan
+
+[![Build](https://github.com/phpstan/phpstan-strict-rules/workflows/Build/badge.svg)](https://github.com/phpstan/phpstan-strict-rules/actions)
+[![Latest Stable Version](https://poser.pugx.org/phpstan/phpstan-strict-rules/v/stable)](https://packagist.org/packages/phpstan/phpstan-strict-rules)
+[![License](https://poser.pugx.org/phpstan/phpstan-strict-rules/license)](https://packagist.org/packages/phpstan/phpstan-strict-rules)
+
+[PHPStan](https://phpstan.org/) focuses on finding bugs in your code. But in PHP there's a lot of leeway in how stuff can be written. This repository contains additional rules that revolve around strictly and strongly typed code with no loose casting for those who want additional safety in extremely defensive programming:
+
+* Require booleans in `if`, `elseif`, ternary operator, after `!`, and on both sides of `&&` and `||`.
+* Require numeric operands or arrays in `+` and numeric operands in `-`/`*`/`/`/`**`/`%`.
+* Require numeric operand in `$var++`, `$var--`, `++$var`and `--$var`.
+* These functions contain a `$strict` parameter for better type safety, it must be set to `true`:
+  * `in_array` (3rd parameter)
+  * `array_search` (3rd parameter)
+  * `array_keys` (3rd parameter; only if the 2nd parameter `$search_value` is provided)
+  * `base64_decode` (2nd parameter)
+* Variables assigned in `while` loop condition and `for` loop initial assignment cannot be used after the loop.
+* Variables set in foreach that's always looped thanks to non-empty arrays cannot be used after the loop.
+* Types in `switch` condition and `case` value must match. PHP compares them loosely by default and that can lead to unexpected results.
+* Check that statically declared methods are called statically.
+* Disallow `empty()` - it's a very loose comparison (see [manual](https://php.net/empty)), it's recommended to use more strict one.
+* Disallow short ternary operator (`?:`) - implies weak comparison, it's recommended to use null coalesce operator (`??`) or ternary operator with strict condition.
+* Disallow variable variables (`$$foo`, `$this->$method()` etc.)
+* Disallow overwriting variables with foreach key and value variables
+* Always true `instanceof`, type-checking `is_*` functions and strict comparisons `===`/`!==`. These checks can be turned off by setting `checkAlwaysTrueInstanceof`/`checkAlwaysTrueCheckTypeFunctionCall`/`checkAlwaysTrueStrictComparison` to false.
+* Correct case for referenced and called function names.
+* Correct case for inherited and implemented method names.
+* Contravariance for parameter types and covariance for return types in inherited methods (also known as Liskov substitution principle - LSP)
+* Check LSP even for static methods
+* Require calling parent constructor
+* Disallow usage of backtick operator (`` $ls = `ls -la` ``)
+* Closure should use `$this` directly instead of using `$this` variable indirectly
+
+Additional rules are coming in subsequent releases!
+
+
+## Installation
+
+To use this extension, require it in [Composer](https://getcomposer.org/):
+
+```
+composer require --dev phpstan/phpstan-strict-rules
+```
+
+If you also install [phpstan/extension-installer](https://github.com/phpstan/extension-installer) then you're all set!
+
+<details>
+  <summary>Manual installation</summary>
+
+If you don't want to use `phpstan/extension-installer`, include rules.neon in your project's PHPStan config:
+
+```
+includes:
+    - vendor/phpstan/phpstan-strict-rules/rules.neon
+```
+</details>
+
+## Disabling rules
+
+You can disable rules using configuration parameters:
+
+```neon
+parameters:
+	strictRules:
+		disallowedLooseComparison: false
+		booleansInConditions: false
+		uselessCast: false
+		requireParentConstructorCall: false
+		disallowedBacktick: false
+		disallowedEmpty: false
+		disallowedImplicitArrayCreation: false
+		disallowedShortTernary: false
+		overwriteVariablesWithLoop: false
+		closureUsesThis: false
+		matchingInheritedMethodNames: false
+		numericOperandsInArithmeticOperators: false
+		strictFunctionCalls: false
+		dynamicCallOnStaticMethod: false
+		switchConditionsMatchingType: false
+		noVariableVariables: false
+		strictArrayFilter: false
+		illegalConstructorMethodCall: false
+```
+
+Aside from introducing new custom rules, phpstan-strict-rules also [change the default values of some configuration parameters](https://github.com/phpstan/phpstan-strict-rules/blob/1.6.x/rules.neon#L1) that are present in PHPStan itself. These parameters are [documented on phpstan.org](https://phpstan.org/config-reference#stricter-analysis).
+
+## Enabling rules one-by-one
+
+If you don't want to start using all the available strict rules at once but only one or two, you can!
+
+You can disable all rules from the included `rules.neon` with:
+
+```neon
+parameters:
+	strictRules:
+		allRules: false
+```
+
+Then you can re-enable individual rules with configuration parameters:
+
+```neon
+parameters:
+	strictRules:
+		allRules: false
+		booleansInConditions: true
+```
+
+Even with `strictRules.allRules` set to `false`, part of this package is still in effect. That's because phpstan-strict-rules also [change the default values of some configuration parameters](https://github.com/phpstan/phpstan-strict-rules/blob/1.6.x/rules.neon#L1) that are present in PHPStan itself. These parameters are [documented on phpstan.org](https://phpstan.org/config-reference#stricter-analysis).
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,43 @@
+{
+	"name": "phpstan/phpstan-strict-rules",
+	"type": "phpstan-extension",
+	"description": "Extra strict and opinionated rules for PHPStan",
+	"license": [
+		"MIT"
+	],
+	"require": {
+		"php": "^7.4 || ^8.0",
+		"phpstan/phpstan": "^2.0.4"
+	},
+	"require-dev": {
+		"php-parallel-lint/php-parallel-lint": "^1.2",
+		"phpstan/phpstan-deprecation-rules": "^2.0",
+		"phpstan/phpstan-phpunit": "^2.0",
+		"phpunit/phpunit": "^9.6"
+	},
+	"config": {
+		"platform": {
+			"php": "7.4.6"
+		},
+		"sort-packages": true
+	},
+	"extra": {
+		"phpstan": {
+			"includes": [
+				"rules.neon"
+			]
+		}
+	},
+	"autoload": {
+		"psr-4": {
+			"PHPStan\\": "src/"
+		}
+	},
+	"autoload-dev": {
+		"classmap": [
+			"tests/"
+		]
+	},
+	"minimum-stability": "dev",
+	"prefer-stable": true
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,279 @@
+parameters:
+	strictRulesInstalled: true
+	polluteScopeWithLoopInitialAssignments: false
+	polluteScopeWithAlwaysIterableForeach: false
+	polluteScopeWithBlock: false
+	checkDynamicProperties: true
+	checkExplicitMixedMissingReturn: true
+	checkFunctionNameCase: true
+	checkInternalClassCaseSensitivity: true
+	reportMaybesInMethodSignatures: true
+	reportStaticMethodSignatures: true
+	reportMaybesInPropertyPhpDocTypes: true
+	reportWrongPhpDocTypeInVarTag: true
+	strictRules:
+		allRules: true
+		disallowedLooseComparison: %strictRules.allRules%
+		booleansInConditions: %strictRules.allRules%
+		uselessCast: %strictRules.allRules%
+		requireParentConstructorCall: %strictRules.allRules%
+		disallowedBacktick: %strictRules.allRules%
+		disallowedEmpty: %strictRules.allRules%
+		disallowedImplicitArrayCreation: %strictRules.allRules%
+		disallowedShortTernary: %strictRules.allRules%
+		overwriteVariablesWithLoop: %strictRules.allRules%
+		closureUsesThis: %strictRules.allRules%
+		matchingInheritedMethodNames: %strictRules.allRules%
+		numericOperandsInArithmeticOperators: %strictRules.allRules%
+		strictFunctionCalls: %strictRules.allRules%
+		dynamicCallOnStaticMethod: %strictRules.allRules%
+		switchConditionsMatchingType: %strictRules.allRules%
+		noVariableVariables: %strictRules.allRules%
+		strictArrayFilter: %strictRules.allRules%
+		illegalConstructorMethodCall: %strictRules.allRules%
+
+parametersSchema:
+	strictRules: structure([
+		allRules: anyOf(bool(), arrayOf(bool())),
+		disallowedLooseComparison: anyOf(bool(), arrayOf(bool())),
+		booleansInConditions: anyOf(bool(), arrayOf(bool()))
+		uselessCast: anyOf(bool(), arrayOf(bool()))
+		requireParentConstructorCall: anyOf(bool(), arrayOf(bool()))
+		disallowedBacktick: anyOf(bool(), arrayOf(bool()))
+		disallowedEmpty: anyOf(bool(), arrayOf(bool()))
+		disallowedImplicitArrayCreation: anyOf(bool(), arrayOf(bool()))
+		disallowedShortTernary: anyOf(bool(), arrayOf(bool()))
+		overwriteVariablesWithLoop: anyOf(bool(), arrayOf(bool()))
+		closureUsesThis: anyOf(bool(), arrayOf(bool()))
+		matchingInheritedMethodNames: anyOf(bool(), arrayOf(bool()))
+		numericOperandsInArithmeticOperators: anyOf(bool(), arrayOf(bool()))
+		strictFunctionCalls: anyOf(bool(), arrayOf(bool()))
+		dynamicCallOnStaticMethod: anyOf(bool(), arrayOf(bool()))
+		switchConditionsMatchingType: anyOf(bool(), arrayOf(bool()))
+		noVariableVariables: anyOf(bool(), arrayOf(bool()))
+		strictArrayFilter: anyOf(bool(), arrayOf(bool()))
+		illegalConstructorMethodCall: anyOf(bool(), arrayOf(bool()))
+	])
+
+conditionalTags:
+	PHPStan\Rules\DisallowedConstructs\DisallowedLooseComparisonRule:
+		phpstan.rules.rule: %strictRules.disallowedLooseComparison%
+	PHPStan\Rules\BooleansInConditions\BooleanInBooleanAndRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\BooleansInConditions\BooleanInBooleanNotRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\BooleansInConditions\BooleanInBooleanOrRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\BooleansInConditions\BooleanInElseIfConditionRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\BooleansInConditions\BooleanInIfConditionRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\BooleansInConditions\BooleanInTernaryOperatorRule:
+		phpstan.rules.rule: %strictRules.booleansInConditions%
+	PHPStan\Rules\Cast\UselessCastRule:
+		phpstan.rules.rule: %strictRules.uselessCast%
+	PHPStan\Rules\Classes\RequireParentConstructCallRule:
+		phpstan.rules.rule: %strictRules.requireParentConstructorCall%
+	PHPStan\Rules\DisallowedConstructs\DisallowedBacktickRule:
+		phpstan.rules.rule: %strictRules.disallowedBacktick%
+	PHPStan\Rules\DisallowedConstructs\DisallowedEmptyRule:
+		phpstan.rules.rule: %strictRules.disallowedEmpty%
+	PHPStan\Rules\DisallowedConstructs\DisallowedImplicitArrayCreationRule:
+		phpstan.rules.rule: %strictRules.disallowedImplicitArrayCreation%
+	PHPStan\Rules\DisallowedConstructs\DisallowedShortTernaryRule:
+		phpstan.rules.rule: %strictRules.disallowedShortTernary%
+	PHPStan\Rules\ForeachLoop\OverwriteVariablesWithForeachRule:
+		phpstan.rules.rule: %strictRules.overwriteVariablesWithLoop%
+	PHPStan\Rules\ForLoop\OverwriteVariablesWithForLoopInitRule:
+		phpstan.rules.rule: %strictRules.overwriteVariablesWithLoop%
+	PHPStan\Rules\Functions\ArrayFilterStrictRule:
+		phpstan.rules.rule: %strictRules.strictArrayFilter%
+	PHPStan\Rules\Functions\ClosureUsesThisRule:
+		phpstan.rules.rule: %strictRules.closureUsesThis%
+	PHPStan\Rules\Methods\WrongCaseOfInheritedMethodRule:
+		phpstan.rules.rule: %strictRules.matchingInheritedMethodNames%
+	PHPStan\Rules\Operators\OperandInArithmeticPostDecrementRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandInArithmeticPostIncrementRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandInArithmeticPreDecrementRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandInArithmeticPreIncrementRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticAdditionRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticDivisionRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticExponentiationRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticModuloRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticMultiplicationRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\Operators\OperandsInArithmeticSubtractionRule:
+		phpstan.rules.rule: %strictRules.numericOperandsInArithmeticOperators%
+	PHPStan\Rules\StrictCalls\DynamicCallOnStaticMethodsRule:
+		phpstan.rules.rule: %strictRules.dynamicCallOnStaticMethod%
+	PHPStan\Rules\StrictCalls\DynamicCallOnStaticMethodsCallableRule:
+		phpstan.rules.rule: %strictRules.dynamicCallOnStaticMethod%
+	PHPStan\Rules\StrictCalls\StrictFunctionCallsRule:
+		phpstan.rules.rule: %strictRules.strictFunctionCalls%
+	PHPStan\Rules\SwitchConditions\MatchingTypeInSwitchCaseConditionRule:
+		phpstan.rules.rule: %strictRules.switchConditionsMatchingType%
+	PHPStan\Rules\VariableVariables\VariableMethodCallRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariableMethodCallableRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariableStaticMethodCallRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariableStaticMethodCallableRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariableStaticPropertyFetchRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariableVariablesRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\VariableVariables\VariablePropertyFetchRule:
+		phpstan.rules.rule: %strictRules.noVariableVariables%
+	PHPStan\Rules\Methods\IllegalConstructorMethodCallRule:
+		phpstan.rules.rule: %strictRules.illegalConstructorMethodCall%
+	PHPStan\Rules\Methods\IllegalConstructorStaticCallRule:
+		phpstan.rules.rule: %strictRules.illegalConstructorMethodCall%
+
+services:
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanRuleHelper
+
+	-
+		class: PHPStan\Rules\Operators\OperatorRuleHelper
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariablePropertyFetchRule
+		arguments:
+			universalObjectCratesClasses: %universalObjectCratesClasses%
+
+	-
+		class: PHPStan\Rules\DisallowedConstructs\DisallowedLooseComparisonRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInBooleanAndRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInBooleanNotRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInBooleanOrRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInElseIfConditionRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInIfConditionRule
+
+	-
+		class: PHPStan\Rules\BooleansInConditions\BooleanInTernaryOperatorRule
+
+	-
+		class: PHPStan\Rules\Cast\UselessCastRule
+		arguments:
+			treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+			treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+
+	-
+		class: PHPStan\Rules\Classes\RequireParentConstructCallRule
+
+	-
+		class: PHPStan\Rules\DisallowedConstructs\DisallowedBacktickRule
+
+	-
+		class: PHPStan\Rules\DisallowedConstructs\DisallowedEmptyRule
+
+	-
+		class: PHPStan\Rules\DisallowedConstructs\DisallowedImplicitArrayCreationRule
+
+	-
+		class: PHPStan\Rules\DisallowedConstructs\DisallowedShortTernaryRule
+
+	-
+		class: PHPStan\Rules\ForeachLoop\OverwriteVariablesWithForeachRule
+
+	-
+		class: PHPStan\Rules\ForLoop\OverwriteVariablesWithForLoopInitRule
+
+	-
+		class: PHPStan\Rules\Functions\ArrayFilterStrictRule
+		arguments:
+			treatPhpDocTypesAsCertain: %treatPhpDocTypesAsCertain%
+			checkNullables: %checkNullables%
+			treatPhpDocTypesAsCertainTip: %tips.treatPhpDocTypesAsCertain%
+
+	-
+		class: PHPStan\Rules\Functions\ClosureUsesThisRule
+
+	-
+		class: PHPStan\Rules\Methods\WrongCaseOfInheritedMethodRule
+
+	-
+		class: PHPStan\Rules\Methods\IllegalConstructorMethodCallRule
+
+	-
+		class: PHPStan\Rules\Methods\IllegalConstructorStaticCallRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandInArithmeticPostDecrementRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandInArithmeticPostIncrementRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandInArithmeticPreDecrementRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandInArithmeticPreIncrementRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticAdditionRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticDivisionRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticExponentiationRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticModuloRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticMultiplicationRule
+
+	-
+		class: PHPStan\Rules\Operators\OperandsInArithmeticSubtractionRule
+
+	-
+		class: PHPStan\Rules\StrictCalls\DynamicCallOnStaticMethodsRule
+
+	-
+		class: PHPStan\Rules\StrictCalls\DynamicCallOnStaticMethodsCallableRule
+
+	-
+		class: PHPStan\Rules\StrictCalls\StrictFunctionCallsRule
+
+	-
+		class: PHPStan\Rules\SwitchConditions\MatchingTypeInSwitchCaseConditionRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableMethodCallRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableMethodCallableRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableStaticMethodCallRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableStaticMethodCallableRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableStaticPropertyFetchRule
+
+	-
+		class: PHPStan\Rules\VariableVariables\VariableVariablesRule
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,59 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\BooleanAndNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<BooleanAndNode>
+ */
+class BooleanInBooleanAndRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return BooleanAndNode::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$originalNode = $node->getOriginalNode();
+		$messages = [];
+		$nodeText = $originalNode->getOperatorSigil();
+		$identifierType = $originalNode instanceof Node\Expr\BinaryOp\BooleanAnd ? 'booleanAnd' : 'logicalAnd';
+		if (!$this->helper->passesAsBoolean($scope, $originalNode->left)) {
+			$leftType = $scope->getType($originalNode->left);
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in %s, %s given on the left side.',
+				$nodeText,
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier(sprintf('%s.leftNotBoolean', $identifierType))->build();
+		}
+
+		$rightScope = $node->getRightScope();
+		if (!$this->helper->passesAsBoolean($rightScope, $originalNode->right)) {
+			$rightType = $rightScope->getType($originalNode->right);
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in %s, %s given on the right side.',
+				$nodeText,
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier(sprintf('%s.rightNotBoolean', $identifierType))->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,47 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\BooleanNot;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<BooleanNot>
+ */
+class BooleanInBooleanNotRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return BooleanNot::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($this->helper->passesAsBoolean($scope, $node->expr)) {
+			return [];
+		}
+
+		$expressionType = $scope->getType($node->expr);
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in a negated boolean, %s given.',
+				$expressionType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('booleanNot.exprNotBoolean')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,59 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\BooleanOrNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<BooleanOrNode>
+ */
+class BooleanInBooleanOrRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return BooleanOrNode::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$originalNode = $node->getOriginalNode();
+		$messages = [];
+		$nodeText = $originalNode->getOperatorSigil();
+		$identifierType = $originalNode instanceof Node\Expr\BinaryOp\BooleanOr ? 'booleanOr' : 'logicalOr';
+		if (!$this->helper->passesAsBoolean($scope, $originalNode->left)) {
+			$leftType = $scope->getType($originalNode->left);
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in %s, %s given on the left side.',
+				$nodeText,
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier(sprintf('%s.leftNotBoolean', $identifierType))->build();
+		}
+
+		$rightScope = $node->getRightScope();
+		if (!$this->helper->passesAsBoolean($rightScope, $originalNode->right)) {
+			$rightType = $rightScope->getType($originalNode->right);
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in %s, %s given on the right side.',
+				$nodeText,
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier(sprintf('%s.rightNotBoolean', $identifierType))->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,47 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\ElseIf_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<ElseIf_>
+ */
+class BooleanInElseIfConditionRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return ElseIf_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($this->helper->passesAsBoolean($scope, $node->cond)) {
+			return [];
+		}
+
+		$conditionExpressionType = $scope->getType($node->cond);
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in an elseif condition, %s given.',
+				$conditionExpressionType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('elseif.condNotBoolean')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,47 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\If_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<If_>
+ */
+class BooleanInIfConditionRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return If_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($this->helper->passesAsBoolean($scope, $node->cond)) {
+			return [];
+		}
+
+		$conditionExpressionType = $scope->getType($node->cond);
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in an if condition, %s given.',
+				$conditionExpressionType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('if.condNotBoolean')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,51 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\Ternary;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Ternary>
+ */
+class BooleanInTernaryOperatorRule implements Rule
+{
+
+	private BooleanRuleHelper $helper;
+
+	public function __construct(BooleanRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Ternary::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->if === null) {
+			return []; // elvis ?:
+		}
+
+		if ($this->helper->passesAsBoolean($scope, $node->cond)) {
+			return [];
+		}
+
+		$conditionExpressionType = $scope->getType($node->cond);
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Only booleans are allowed in a ternary operator condition, %s given.',
+				$conditionExpressionType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('ternary.condNotBoolean')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,42 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\BooleansInConditions;
+
+use PhpParser\Node\Expr;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\RuleLevelHelper;
+use PHPStan\Type\ErrorType;
+use PHPStan\Type\MixedType;
+use PHPStan\Type\Type;
+
+class BooleanRuleHelper
+{
+
+	private RuleLevelHelper $ruleLevelHelper;
+
+	public function __construct(RuleLevelHelper $ruleLevelHelper)
+	{
+		$this->ruleLevelHelper = $ruleLevelHelper;
+	}
+
+	public function passesAsBoolean(Scope $scope, Expr $expr): bool
+	{
+		$type = $scope->getType($expr);
+		if ($type instanceof MixedType) {
+			return !$type->isExplicitMixed();
+		}
+		$typeToCheck = $this->ruleLevelHelper->findTypeToCheck(
+			$scope,
+			$expr,
+			'',
+			static fn (Type $type): bool => $type->isBoolean()->yes(),
+		);
+		$foundType = $typeToCheck->getType();
+		if ($foundType instanceof ErrorType) {
+			return true;
+		}
+
+		return $foundType->isBoolean()->yes();
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,81 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Cast;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\Cast;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\ErrorType;
+use PHPStan\Type\GeneralizePrecision;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Cast>
+ */
+class UselessCastRule implements Rule
+{
+
+	private bool $treatPhpDocTypesAsCertain;
+
+	private bool $treatPhpDocTypesAsCertainTip;
+
+	public function __construct(
+		bool $treatPhpDocTypesAsCertain,
+		bool $treatPhpDocTypesAsCertainTip
+	)
+	{
+		$this->treatPhpDocTypesAsCertain = $treatPhpDocTypesAsCertain;
+		$this->treatPhpDocTypesAsCertainTip = $treatPhpDocTypesAsCertainTip;
+	}
+
+	public function getNodeType(): string
+	{
+		return Cast::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$castType = $scope->getType($node);
+		if ($castType instanceof ErrorType) {
+			return [];
+		}
+		$castType = $castType->generalize(GeneralizePrecision::lessSpecific());
+
+		if ($this->treatPhpDocTypesAsCertain) {
+			$expressionType = $scope->getType($node->expr);
+		} else {
+			$expressionType = $scope->getNativeType($node->expr);
+		}
+		if ($castType->isSuperTypeOf($expressionType)->yes()) {
+			$addTip = function (RuleErrorBuilder $ruleErrorBuilder) use ($scope, $node, $castType): RuleErrorBuilder {
+				if (!$this->treatPhpDocTypesAsCertain) {
+					return $ruleErrorBuilder;
+				}
+
+				$expressionTypeWithoutPhpDoc = $scope->getNativeType($node->expr);
+				if ($castType->isSuperTypeOf($expressionTypeWithoutPhpDoc)->yes()) {
+					return $ruleErrorBuilder;
+				}
+
+				if (!$this->treatPhpDocTypesAsCertainTip) {
+					return $ruleErrorBuilder;
+				}
+
+				return $ruleErrorBuilder->treatPhpDocTypesAsCertainTip();
+			};
+			return [
+				$addTip(RuleErrorBuilder::message(sprintf(
+					'Casting to %s something that\'s already %s.',
+					$castType->describe(VerbosityLevel::typeOnly()),
+					$expressionType->describe(VerbosityLevel::typeOnly()),
+				)))->identifier('cast.useless')->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,142 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Classes;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\StaticCall;
+use PhpParser\Node\Name;
+use PhpParser\Node\Stmt\ClassMethod;
+use PHPStan\Analyser\Scope;
+use PHPStan\BetterReflection\Reflection\Adapter\ReflectionClass;
+use PHPStan\BetterReflection\Reflection\Adapter\ReflectionEnum;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\ShouldNotHappenException;
+use function property_exists;
+use function sprintf;
+
+/**
+ * @implements Rule<ClassMethod>
+ */
+class RequireParentConstructCallRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return ClassMethod::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$scope->isInClass()) {
+			throw new ShouldNotHappenException();
+		}
+
+		if ($scope->isInTrait()) {
+			return [];
+		}
+
+		if ($node->name->name !== '__construct') {
+			return [];
+		}
+
+		if ($node->isAbstract()) {
+			return [];
+		}
+
+		$classReflection = $scope->getClassReflection()->getNativeReflection();
+		if ($classReflection->isInterface() || $classReflection->isAnonymous()) {
+			return [];
+		}
+
+		if ($this->callsParentConstruct($node)) {
+			return [];
+		}
+
+		$parentClass = $this->getParentConstructorClass($classReflection);
+		if ($parentClass !== false) {
+			return [
+				RuleErrorBuilder::message(sprintf(
+					'%s::__construct() does not call parent constructor from %s.',
+					$classReflection->getName(),
+					$parentClass->getName(),
+				))->identifier('constructor.missingParentCall')->build(),
+			];
+		}
+
+		return [];
+	}
+
+	private function callsParentConstruct(Node $parserNode): bool
+	{
+		if (!property_exists($parserNode, 'stmts')) {
+			return false;
+		}
+
+		foreach ($parserNode->stmts as $statement) {
+			if ($statement instanceof Node\Stmt\Expression) {
+				$statement = $statement->expr;
+			}
+
+			$statement = $this->ignoreErrorSuppression($statement);
+			if ($statement instanceof StaticCall) {
+				if (
+					$statement->class instanceof Name
+					&& ((string) $statement->class === 'parent')
+					&& $statement->name instanceof Node\Identifier
+					&& $statement->name->name === '__construct'
+				) {
+					return true;
+				}
+			} else {
+				if ($this->callsParentConstruct($statement)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * @param ReflectionClass|ReflectionEnum $classReflection
+	 * @return ReflectionClass|false
+	 */
+	private function getParentConstructorClass($classReflection)
+	{
+		while ($classReflection->getParentClass() !== false) {
+			$constructor = $classReflection->getParentClass()->hasMethod('__construct') ? $classReflection->getParentClass()->getMethod('__construct') : null;
+			$constructorWithClassName = $classReflection->getParentClass()->hasMethod($classReflection->getParentClass()->getName()) ? $classReflection->getParentClass()->getMethod($classReflection->getParentClass()->getName()) : null;
+			if (
+				(
+					$constructor !== null
+					&& $constructor->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName()
+					&& !$constructor->isAbstract()
+					&& !$constructor->isPrivate()
+					&& !$constructor->isDeprecated()
+				) || (
+					$constructorWithClassName !== null
+					&& $constructorWithClassName->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName()
+					&& !$constructorWithClassName->isAbstract()
+				)
+			) {
+				return $classReflection->getParentClass();
+			}
+
+			$classReflection = $classReflection->getParentClass();
+		}
+
+		return false;
+	}
+
+	private function ignoreErrorSuppression(Node $statement): Node
+	{
+		if ($statement instanceof Node\Expr\ErrorSuppress) {
+
+			return $statement->expr;
+		}
+
+		return $statement;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,31 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\DisallowedConstructs;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\ShellExec;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+
+/**
+ * @implements Rule<ShellExec>
+ */
+class DisallowedBacktickRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return ShellExec::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		return [
+			RuleErrorBuilder::message('Backtick operator is not allowed. Use shell_exec() instead.')
+				->identifier('backtick.notAllowed')
+				->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,31 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\DisallowedConstructs;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\Empty_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+
+/**
+ * @implements Rule<Empty_>
+ */
+class DisallowedEmptyRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Empty_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		return [
+			RuleErrorBuilder::message('Construct empty() is not allowed. Use more strict comparison.')
+				->identifier('empty.notAllowed')
+				->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\DisallowedConstructs;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\ArrayDimFetch;
+use PhpParser\Node\Expr\Assign;
+use PhpParser\Node\Expr\Variable;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function is_string;
+use function sprintf;
+
+/**
+ * @implements Rule<Assign>
+ */
+class DisallowedImplicitArrayCreationRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Assign::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->var instanceof ArrayDimFetch) {
+			return [];
+		}
+
+		$node = $node->var;
+		while ($node instanceof ArrayDimFetch) {
+			$node = $node->var;
+		}
+
+		if (!$node instanceof Variable) {
+			return [];
+		}
+
+		if (!is_string($node->name)) {
+			return [];
+		}
+
+		$certainty = $scope->hasVariableType($node->name);
+		if ($certainty->no()) {
+			return [
+				RuleErrorBuilder::message(sprintf('Implicit array creation is not allowed - variable $%s does not exist.', $node->name))
+					->identifier('variable.implicitArray')
+					->build(),
+			];
+		}
+
+		if ($certainty->maybe()) {
+			return [
+				RuleErrorBuilder::message(sprintf('Implicit array creation is not allowed - variable $%s might not exist.', $node->name))
+					->identifier('variable.implicitArray')
+					->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,48 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\DisallowedConstructs;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\BinaryOp;
+use PhpParser\Node\Expr\BinaryOp\Equal;
+use PhpParser\Node\Expr\BinaryOp\NotEqual;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+
+/**
+ * @implements Rule<BinaryOp>
+ */
+class DisallowedLooseComparisonRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return BinaryOp::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof Equal) {
+			return [
+				RuleErrorBuilder::message(
+					'Loose comparison via "==" is not allowed.',
+				)->tip('Use strict comparison via "===" instead.')
+					->identifier('equal.notAllowed')
+					->build(),
+			];
+		}
+		if ($node instanceof NotEqual) {
+			return [
+				RuleErrorBuilder::message(
+					'Loose comparison via "!=" is not allowed.',
+				)->tip('Use strict comparison via "!==" instead.')
+					->identifier('notEqual.notAllowed')
+					->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,35 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\DisallowedConstructs;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\Ternary;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+
+/**
+ * @implements Rule<Ternary>
+ */
+class DisallowedShortTernaryRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Ternary::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->if !== null) {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message('Short ternary operator is not allowed. Use null coalesce operator if applicable or consider using long ternary.')
+				->identifier('ternary.shortNotAllowed')
+				->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,77 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\ForLoop;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\Assign;
+use PhpParser\Node\Stmt\For_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\IdentifierRuleError;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function is_string;
+use function sprintf;
+
+/**
+ * @implements Rule<For_>
+ */
+class OverwriteVariablesWithForLoopInitRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return For_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$errors = [];
+		foreach ($node->init as $expr) {
+			if (!($expr instanceof Assign)) {
+				continue;
+			}
+
+			foreach ($this->checkValueVar($scope, $expr->var) as $error) {
+				$errors[] = $error;
+			}
+		}
+
+		return $errors;
+	}
+
+	/**
+	 * @return list<IdentifierRuleError>
+	 */
+	private function checkValueVar(Scope $scope, Expr $expr): array
+	{
+		$errors = [];
+		if (
+			$expr instanceof Node\Expr\Variable
+			&& is_string($expr->name)
+			&& $scope->hasVariableType($expr->name)->yes()
+		) {
+			$errors[] = RuleErrorBuilder::message(sprintf('For loop initial assignment overwrites variable $%s.', $expr->name))
+				->identifier('for.variableOverwrite')
+				->build();
+		}
+
+		if (
+			$expr instanceof Node\Expr\List_
+			|| $expr instanceof Node\Expr\Array_
+		) {
+			foreach ($expr->items as $item) {
+				if ($item === null) {
+					continue;
+				}
+
+				foreach ($this->checkValueVar($scope, $item->value) as $error) {
+					$errors[] = $error;
+				}
+			}
+		}
+
+		return $errors;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,80 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\ForeachLoop;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Stmt\Foreach_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\IdentifierRuleError;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function is_string;
+use function sprintf;
+
+/**
+ * @implements Rule<Foreach_>
+ */
+class OverwriteVariablesWithForeachRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Foreach_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$errors = [];
+		if (
+			$node->keyVar instanceof Node\Expr\Variable
+			&& is_string($node->keyVar->name)
+			&& $scope->hasVariableType($node->keyVar->name)->yes()
+		) {
+			$errors[] = RuleErrorBuilder::message(sprintf('Foreach overwrites $%s with its key variable.', $node->keyVar->name))
+				->identifier('foreach.keyOverwrite')
+				->build();
+		}
+
+		foreach ($this->checkValueVar($scope, $node->valueVar) as $error) {
+			$errors[] = $error;
+		}
+
+		return $errors;
+	}
+
+	/**
+	 * @return list<IdentifierRuleError>
+	 */
+	private function checkValueVar(Scope $scope, Expr $expr): array
+	{
+		$errors = [];
+		if (
+			$expr instanceof Node\Expr\Variable
+			&& is_string($expr->name)
+			&& $scope->hasVariableType($expr->name)->yes()
+		) {
+			$errors[] = RuleErrorBuilder::message(sprintf('Foreach overwrites $%s with its value variable.', $expr->name))
+				->identifier('foreach.valueOverwrite')
+				->build();
+		}
+
+		if (
+			$expr instanceof Node\Expr\List_
+			|| $expr instanceof Node\Expr\Array_
+		) {
+			foreach ($expr->items as $item) {
+				if ($item === null) {
+					continue;
+				}
+
+				foreach ($this->checkValueVar($scope, $item->value) as $error) {
+					$errors[] = $error;
+				}
+			}
+		}
+
+		return $errors;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,162 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Functions;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\FuncCall;
+use PhpParser\Node\Name;
+use PHPStan\Analyser\ArgumentsNormalizer;
+use PHPStan\Analyser\Scope;
+use PHPStan\Reflection\ParametersAcceptorSelector;
+use PHPStan\Reflection\ReflectionProvider;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\Type;
+use PHPStan\Type\UnionType;
+use PHPStan\Type\VerbosityLevel;
+use function count;
+use function sprintf;
+
+/**
+ * @implements Rule<FuncCall>
+ */
+class ArrayFilterStrictRule implements Rule
+{
+
+	private ReflectionProvider $reflectionProvider;
+
+	private bool $treatPhpDocTypesAsCertain;
+
+	private bool $checkNullables;
+
+	private bool $treatPhpDocTypesAsCertainTip;
+
+	public function __construct(
+		ReflectionProvider $reflectionProvider,
+		bool $treatPhpDocTypesAsCertain,
+		bool $checkNullables,
+		bool $treatPhpDocTypesAsCertainTip
+	)
+	{
+		$this->reflectionProvider = $reflectionProvider;
+		$this->treatPhpDocTypesAsCertain = $treatPhpDocTypesAsCertain;
+		$this->checkNullables = $checkNullables;
+		$this->treatPhpDocTypesAsCertainTip = $treatPhpDocTypesAsCertainTip;
+	}
+
+	public function getNodeType(): string
+	{
+		return FuncCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->name instanceof Name) {
+			return [];
+		}
+
+		if (!$this->reflectionProvider->hasFunction($node->name, $scope)) {
+			return [];
+		}
+
+		$functionReflection = $this->reflectionProvider->getFunction($node->name, $scope);
+
+		if ($functionReflection->getName() !== 'array_filter') {
+			return [];
+		}
+
+		$parametersAcceptor = ParametersAcceptorSelector::selectFromArgs(
+			$scope,
+			$node->getArgs(),
+			$functionReflection->getVariants(),
+			$functionReflection->getNamedArgumentsVariants(),
+		);
+
+		$normalizedFuncCall = ArgumentsNormalizer::reorderFuncArguments($parametersAcceptor, $node);
+
+		if ($normalizedFuncCall === null) {
+			return [];
+		}
+
+		$args = $normalizedFuncCall->getArgs();
+		if (count($args) === 0) {
+			return [];
+		}
+
+		if (count($args) === 1) {
+			$arrayType = $scope->getType($args[0]->value);
+			$itemType = $arrayType->getIterableValueType();
+			if ($itemType instanceof UnionType) {
+				$hasTruthy = false;
+				$hasFalsey = false;
+				foreach ($itemType->getTypes() as $innerType) {
+					$booleanType = $innerType->toBoolean();
+					if ($booleanType->isTrue()->yes()) {
+						$hasTruthy = true;
+						continue;
+					}
+					if ($booleanType->isFalse()->yes()) {
+						$hasFalsey = true;
+						continue;
+					}
+
+					$hasTruthy = false;
+					$hasFalsey = false;
+					break;
+				}
+
+				if ($hasTruthy && $hasFalsey) {
+					return [];
+				}
+			} elseif ($itemType->isBoolean()->yes()) {
+				return [];
+			} elseif ($itemType->isArray()->yes()) {
+				return [];
+			}
+
+			return [
+				RuleErrorBuilder::message('Call to function array_filter() requires parameter #2 to be passed to avoid loose comparison semantics.')
+					->identifier('arrayFilter.strict')
+					->build(),
+			];
+		}
+
+		$nativeCallbackType = $scope->getNativeType($args[1]->value);
+
+		if ($this->treatPhpDocTypesAsCertain) {
+			$callbackType = $scope->getType($args[1]->value);
+		} else {
+			$callbackType = $nativeCallbackType;
+		}
+
+		if ($this->isCallbackTypeNull($callbackType)) {
+			$message = 'Parameter #2 of array_filter() cannot be null to avoid loose comparison semantics (%s given).';
+			$errorBuilder = RuleErrorBuilder::message(sprintf(
+				$message,
+				$callbackType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('arrayFilter.strict');
+
+			if ($this->treatPhpDocTypesAsCertainTip && !$this->isCallbackTypeNull($nativeCallbackType) && $this->treatPhpDocTypesAsCertain) {
+				$errorBuilder->treatPhpDocTypesAsCertainTip();
+			}
+
+			return [$errorBuilder->build()];
+		}
+
+		return [];
+	}
+
+	private function isCallbackTypeNull(Type $callbackType): bool
+	{
+		if ($callbackType->isNull()->yes()) {
+			return true;
+		}
+
+		if ($callbackType->isNull()->no()) {
+			return false;
+		}
+
+		return $this->checkNullables;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,52 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Functions;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\ThisType;
+use function is_string;
+use function sprintf;
+
+/**
+ * @implements Rule<Node\Expr\Closure>
+ */
+class ClosureUsesThisRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Node\Expr\Closure::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->static) {
+			return [];
+		}
+
+		if ($scope->isInClosureBind()) {
+			return [];
+		}
+
+		$messages = [];
+		foreach ($node->uses as $closureUse) {
+			$varType = $scope->getType($closureUse->var);
+			if (!is_string($closureUse->var->name)) {
+				continue;
+			}
+			if (!$varType instanceof ThisType) {
+				continue;
+			}
+
+			$messages[] = RuleErrorBuilder::message(sprintf('Anonymous function uses $this assigned to variable $%s. Use $this directly in the function body.', $closureUse->var->name))
+				->line($closureUse->getStartLine())
+				->identifier('closure.useThis')
+				->build();
+		}
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,34 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Methods;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+
+/**
+ * @implements Rule<Node\Expr\MethodCall>
+ */
+final class IllegalConstructorMethodCallRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Node\Expr\MethodCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->name instanceof Node\Identifier || $node->name->toLowerString() !== '__construct') {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message('Call to __construct() on an existing object is not allowed.')
+				->identifier('constructor.call')
+				->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,92 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Methods;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function array_key_exists;
+use function array_map;
+use function in_array;
+use function sprintf;
+use function strtolower;
+
+/**
+ * @implements Rule<Node\Expr\StaticCall>
+ */
+final class IllegalConstructorStaticCallRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Node\Expr\StaticCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->name instanceof Node\Identifier || $node->name->toLowerString() !== '__construct') {
+			return [];
+		}
+
+		if ($this->isCollectCallingConstructor($node, $scope)) {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message('Static call to __construct() is only allowed on a parent class in the constructor.')
+				->identifier('constructor.call')
+				->build(),
+		];
+	}
+
+	private function isCollectCallingConstructor(Node\Expr\StaticCall $node, Scope $scope): bool
+	{
+		// __construct should be called from inside constructor
+		if ($scope->getFunction() === null) {
+			return false;
+		}
+
+		if ($scope->getFunction()->getName() !== '__construct') {
+			if (!$this->isInRenamedTraitConstructor($scope)) {
+				return false;
+			}
+		}
+
+		if (!$scope->isInClass()) {
+			return false;
+		}
+
+		if (!$node->class instanceof Node\Name) {
+			return false;
+		}
+
+		$parentClasses = array_map(static fn (string $name) => strtolower($name), $scope->getClassReflection()->getParentClassesNames());
+
+		return in_array(strtolower($scope->resolveName($node->class)), $parentClasses, true);
+	}
+
+	private function isInRenamedTraitConstructor(Scope $scope): bool
+	{
+		if (!$scope->isInClass()) {
+			return false;
+		}
+
+		if (!$scope->isInTrait()) {
+			return false;
+		}
+
+		if ($scope->getFunction() === null) {
+			return false;
+		}
+
+		$traitAliases = $scope->getClassReflection()->getNativeReflection()->getTraitAliases();
+		$functionName = $scope->getFunction()->getName();
+		if (!array_key_exists($functionName, $traitAliases)) {
+			return false;
+		}
+
+		return $traitAliases[$functionName] === sprintf('%s::%s', $scope->getTraitReflection()->getName(), '__construct');
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,86 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Methods;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\InClassMethodNode;
+use PHPStan\Reflection\ClassReflection;
+use PHPStan\Rules\IdentifierRuleError;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function sprintf;
+
+/**
+ * @implements Rule<InClassMethodNode>
+ */
+class WrongCaseOfInheritedMethodRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return InClassMethodNode::class;
+	}
+
+	public function processNode(
+		Node $node,
+		Scope $scope
+	): array
+	{
+		$methodReflection = $node->getMethodReflection();
+		$declaringClass = $methodReflection->getDeclaringClass();
+
+		$messages = [];
+		if ($declaringClass->getParentClass() !== null) {
+			$parentMessage = $this->findMethod(
+				$declaringClass,
+				$declaringClass->getParentClass(),
+				$methodReflection->getName(),
+			);
+			if ($parentMessage !== null) {
+				$messages[] = $parentMessage;
+			}
+		}
+
+		foreach ($declaringClass->getInterfaces() as $interface) {
+			$interfaceMessage = $this->findMethod(
+				$declaringClass,
+				$interface,
+				$methodReflection->getName(),
+			);
+			if ($interfaceMessage === null) {
+				continue;
+			}
+
+			$messages[] = $interfaceMessage;
+		}
+
+		return $messages;
+	}
+
+	private function findMethod(
+		ClassReflection $declaringClass,
+		ClassReflection $classReflection,
+		string $methodName
+	): ?IdentifierRuleError
+	{
+		if (!$classReflection->hasNativeMethod($methodName)) {
+			return null;
+		}
+
+		$parentMethod = $classReflection->getNativeMethod($methodName);
+		if ($parentMethod->getName() === $methodName) {
+			return null;
+		}
+
+		return RuleErrorBuilder::message(sprintf(
+			'Method %s::%s() does not match %s method name: %s::%s().',
+			$declaringClass->getDisplayName(),
+			$methodName,
+			$classReflection->isInterface() ? 'interface' : 'parent',
+			$classReflection->getDisplayName(),
+			$parentMethod->getName(),
+		))->identifier('method.nameCase')->build();
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,61 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\PostDec;
+use PhpParser\Node\Expr\PostInc;
+use PhpParser\Node\Expr\PreDec;
+use PhpParser\Node\Expr\PreInc;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @phpstan-template TNodeType of PreInc|PreDec|PostInc|PostDec
+ * @phpstan-implements Rule<TNodeType>
+ */
+abstract class OperandInArithmeticIncrementOrDecrementRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	/**
+	 * @param TNodeType $node
+	 */
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$messages = [];
+		$varType = $scope->getType($node->var);
+
+		if (
+			($node instanceof PreInc || $node instanceof PostInc)
+				&& !$this->helper->isValidForIncrement($scope, $node->var)
+			|| ($node instanceof PreDec || $node instanceof PostDec)
+				&& !$this->helper->isValidForDecrement($scope, $node->var)
+		) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in %s, %s given.',
+				$this->describeOperation(),
+				$varType->describe(VerbosityLevel::typeOnly()),
+			))->identifier(sprintf('%s.nonNumeric', $this->getIdentifier()))->build();
+		}
+
+		return $messages;
+	}
+
+	abstract protected function describeOperation(): string;
+
+	/**
+	 * @return 'preInc'|'postInc'|'preDec'|'postDec'
+	 */
+	abstract protected function getIdentifier(): string;
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,28 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node\Expr\PostDec;
+
+/**
+ * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PostDec>
+ */
+class OperandInArithmeticPostDecrementRule extends OperandInArithmeticIncrementOrDecrementRule
+{
+
+	public function getNodeType(): string
+	{
+		return PostDec::class;
+	}
+
+	protected function describeOperation(): string
+	{
+		return 'post-decrement';
+	}
+
+	protected function getIdentifier(): string
+	{
+		return 'postDec';
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,28 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node\Expr\PostInc;
+
+/**
+ * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PostInc>
+ */
+class OperandInArithmeticPostIncrementRule extends OperandInArithmeticIncrementOrDecrementRule
+{
+
+	public function getNodeType(): string
+	{
+		return PostInc::class;
+	}
+
+	protected function describeOperation(): string
+	{
+		return 'post-increment';
+	}
+
+	protected function getIdentifier(): string
+	{
+		return 'postInc';
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,28 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node\Expr\PreDec;
+
+/**
+ * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PreDec>
+ */
+class OperandInArithmeticPreDecrementRule extends OperandInArithmeticIncrementOrDecrementRule
+{
+
+	public function getNodeType(): string
+	{
+		return PreDec::class;
+	}
+
+	protected function describeOperation(): string
+	{
+		return 'pre-decrement';
+	}
+
+	protected function getIdentifier(): string
+	{
+		return 'preDec';
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,28 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node\Expr\PreInc;
+
+/**
+ * @phpstan-extends OperandInArithmeticIncrementOrDecrementRule<PreInc>
+ */
+class OperandInArithmeticPreIncrementRule extends OperandInArithmeticIncrementOrDecrementRule
+{
+
+	public function getNodeType(): string
+	{
+		return PreInc::class;
+	}
+
+	protected function describeOperation(): string
+	{
+		return 'pre-increment';
+	}
+
+	protected function getIdentifier(): string
+	{
+		return 'preInc';
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,69 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Plus as AssignOpPlus;
+use PhpParser\Node\Expr\BinaryOp\Plus as BinaryOpPlus;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function count;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticAdditionRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpPlus) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpPlus) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$leftType = $scope->getType($left);
+		$rightType = $scope->getType($right);
+		if (count($leftType->getArrays()) > 0 && count($rightType->getArrays()) > 0) {
+			return [];
+		}
+
+		$messages = [];
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in +, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('plus.leftNonNumeric')->build();
+		}
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in +, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('plus.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Div as AssignOpDiv;
+use PhpParser\Node\Expr\BinaryOp\Div as BinaryOpDiv;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticDivisionRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpDiv) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpDiv) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$messages = [];
+		$leftType = $scope->getType($left);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in /, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('div.leftNonNumeric')->build();
+		}
+
+		$rightType = $scope->getType($right);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in /, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('div.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Pow as AssignOpPow;
+use PhpParser\Node\Expr\BinaryOp\Pow as BinaryOpPow;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticExponentiationRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpPow) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpPow) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$messages = [];
+		$leftType = $scope->getType($left);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in **, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('pow.leftNonNumeric')->build();
+		}
+
+		$rightType = $scope->getType($right);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in **, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('pow.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Mod as AssignOpMod;
+use PhpParser\Node\Expr\BinaryOp\Mod as BinaryOpMod;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticModuloRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpMod) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpMod) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$messages = [];
+		$leftType = $scope->getType($left);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in %%, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('mod.leftNonNumeric')->build();
+		}
+
+		$rightType = $scope->getType($right);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in %%, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('mod.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Mul as AssignOpMul;
+use PhpParser\Node\Expr\BinaryOp\Mul as BinaryOpMul;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticMultiplicationRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpMul) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpMul) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$messages = [];
+		$leftType = $scope->getType($left);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in *, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('mul.leftNonNumeric')->build();
+		}
+
+		$rightType = $scope->getType($right);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in *, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('mul.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr;
+use PhpParser\Node\Expr\AssignOp\Minus as AssignOpMinus;
+use PhpParser\Node\Expr\BinaryOp\Minus as BinaryOpMinus;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Expr>
+ */
+class OperandsInArithmeticSubtractionRule implements Rule
+{
+
+	private OperatorRuleHelper $helper;
+
+	public function __construct(OperatorRuleHelper $helper)
+	{
+		$this->helper = $helper;
+	}
+
+	public function getNodeType(): string
+	{
+		return Expr::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node instanceof BinaryOpMinus) {
+			$left = $node->left;
+			$right = $node->right;
+		} elseif ($node instanceof AssignOpMinus) {
+			$left = $node->var;
+			$right = $node->expr;
+		} else {
+			return [];
+		}
+
+		$messages = [];
+		$leftType = $scope->getType($left);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $left)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in -, %s given on the left side.',
+				$leftType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('minus.leftNonNumeric')->build();
+		}
+
+		$rightType = $scope->getType($right);
+		if (!$this->helper->isValidForArithmeticOperation($scope, $right)) {
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Only numeric types are allowed in -, %s given on the right side.',
+				$rightType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('minus.rightNonNumeric')->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,92 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\Operators;
+
+use PhpParser\Node\Expr;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\RuleLevelHelper;
+use PHPStan\Type\Accessory\AccessoryNumericStringType;
+use PHPStan\Type\BenevolentUnionType;
+use PHPStan\Type\ErrorType;
+use PHPStan\Type\FloatType;
+use PHPStan\Type\IntegerType;
+use PHPStan\Type\IntersectionType;
+use PHPStan\Type\MixedType;
+use PHPStan\Type\StringType;
+use PHPStan\Type\Type;
+use PHPStan\Type\UnionType;
+
+class OperatorRuleHelper
+{
+
+	private RuleLevelHelper $ruleLevelHelper;
+
+	public function __construct(RuleLevelHelper $ruleLevelHelper)
+	{
+		$this->ruleLevelHelper = $ruleLevelHelper;
+	}
+
+	public function isValidForArithmeticOperation(Scope $scope, Expr $expr): bool
+	{
+		$type = $scope->getType($expr);
+		if ($type instanceof MixedType) {
+			return true;
+		}
+
+		// already reported by PHPStan core
+		if ($type->toNumber() instanceof ErrorType) {
+			return true;
+		}
+
+		return $this->isSubtypeOfNumber($scope, $expr);
+	}
+
+	public function isValidForIncrement(Scope $scope, Expr $expr): bool
+	{
+		$type = $scope->getType($expr);
+		if ($type instanceof MixedType) {
+			return true;
+		}
+
+		if ($type->isString()->yes()) {
+			// Because `$a = 'a'; $a++;` is valid
+			return true;
+		}
+
+		return $this->isSubtypeOfNumber($scope, $expr);
+	}
+
+	public function isValidForDecrement(Scope $scope, Expr $expr): bool
+	{
+		$type = $scope->getType($expr);
+		if ($type instanceof MixedType) {
+			return true;
+		}
+
+		return $this->isSubtypeOfNumber($scope, $expr);
+	}
+
+	private function isSubtypeOfNumber(Scope $scope, Expr $expr): bool
+	{
+		$acceptedType = new UnionType([new IntegerType(), new FloatType(), new IntersectionType([new StringType(), new AccessoryNumericStringType()])]);
+
+		$type = $this->ruleLevelHelper->findTypeToCheck(
+			$scope,
+			$expr,
+			'',
+			static fn (Type $type): bool => $acceptedType->isSuperTypeOf($type)->yes(),
+		)->getType();
+
+		if ($type instanceof ErrorType) {
+			return true;
+		}
+
+		$isSuperType = $acceptedType->isSuperTypeOf($type);
+		if ($type instanceof BenevolentUnionType) {
+			return !$isSuperType->no();
+		}
+
+		return $isSuperType->yes();
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,65 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\StrictCalls;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\MethodCallableNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Rules\RuleLevelHelper;
+use PHPStan\Type\ErrorType;
+use PHPStan\Type\Type;
+use function sprintf;
+
+/**
+ * @implements Rule<MethodCallableNode>
+ */
+class DynamicCallOnStaticMethodsCallableRule implements Rule
+{
+
+	private RuleLevelHelper $ruleLevelHelper;
+
+	public function __construct(RuleLevelHelper $ruleLevelHelper)
+	{
+		$this->ruleLevelHelper = $ruleLevelHelper;
+	}
+
+	public function getNodeType(): string
+	{
+		return MethodCallableNode::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->getName() instanceof Node\Identifier) {
+			return [];
+		}
+
+		$name = $node->getName()->name;
+		$type = $this->ruleLevelHelper->findTypeToCheck(
+			$scope,
+			$node->getVar(),
+			'',
+			static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($name)->yes(),
+		)->getType();
+
+		if ($type instanceof ErrorType || !$type->canCallMethods()->yes() || !$type->hasMethod($name)->yes()) {
+			return [];
+		}
+
+		$methodReflection = $type->getMethod($name, $scope);
+		if ($methodReflection->isStatic()) {
+			return [
+				RuleErrorBuilder::message(sprintf(
+					'Dynamic call to static method %s::%s().',
+					$methodReflection->getDeclaringClass()->getDisplayName(),
+					$methodReflection->getName(),
+				))->identifier('staticMethod.dynamicCall')->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,76 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\StrictCalls;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\MethodCall;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Rules\RuleLevelHelper;
+use PHPStan\Testing\PHPStanTestCase;
+use PHPStan\Testing\TypeInferenceTestCase;
+use PHPStan\Type\ErrorType;
+use PHPStan\Type\Type;
+use function in_array;
+use function sprintf;
+
+/**
+ * @implements Rule<MethodCall>
+ */
+class DynamicCallOnStaticMethodsRule implements Rule
+{
+
+	private RuleLevelHelper $ruleLevelHelper;
+
+	public function __construct(RuleLevelHelper $ruleLevelHelper)
+	{
+		$this->ruleLevelHelper = $ruleLevelHelper;
+	}
+
+	public function getNodeType(): string
+	{
+		return MethodCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->name instanceof Node\Identifier) {
+			return [];
+		}
+
+		$name = $node->name->name;
+		$type = $this->ruleLevelHelper->findTypeToCheck(
+			$scope,
+			$node->var,
+			'',
+			static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($name)->yes(),
+		)->getType();
+
+		if ($type instanceof ErrorType || !$type->canCallMethods()->yes() || !$type->hasMethod($name)->yes()) {
+			return [];
+		}
+
+		$methodReflection = $type->getMethod($name, $scope);
+		if ($methodReflection->isStatic()) {
+			$prototype = $methodReflection->getPrototype();
+			if (in_array($prototype->getDeclaringClass()->getName(), [
+				TypeInferenceTestCase::class,
+				PHPStanTestCase::class,
+			], true)) {
+				return [];
+			}
+
+			return [
+				RuleErrorBuilder::message(sprintf(
+					'Dynamic call to static method %s::%s().',
+					$methodReflection->getDeclaringClass()->getDisplayName(),
+					$methodReflection->getName(),
+				))->identifier('staticMethod.dynamicCall')->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,96 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\StrictCalls;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\FuncCall;
+use PhpParser\Node\Name;
+use PHPStan\Analyser\ArgumentsNormalizer;
+use PHPStan\Analyser\Scope;
+use PHPStan\Reflection\ParametersAcceptorSelector;
+use PHPStan\Reflection\ReflectionProvider;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\Constant\ConstantBooleanType;
+use function array_key_exists;
+use function sprintf;
+use function strtolower;
+
+/**
+ * @implements Rule<FuncCall>
+ */
+class StrictFunctionCallsRule implements Rule
+{
+
+	/** @var int[] */
+	private array $functionArguments = [
+		'in_array' => 2,
+		'array_search' => 2,
+		'base64_decode' => 1,
+		'array_keys' => 2,
+	];
+
+	private ReflectionProvider $reflectionProvider;
+
+	public function __construct(ReflectionProvider $reflectionProvider)
+	{
+		$this->reflectionProvider = $reflectionProvider;
+	}
+
+	public function getNodeType(): string
+	{
+		return FuncCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (!$node->name instanceof Name) {
+			return [];
+		}
+
+		if (!$this->reflectionProvider->hasFunction($node->name, $scope)) {
+			return [];
+		}
+
+		$function = $this->reflectionProvider->getFunction($node->name, $scope);
+		$parametersAcceptor = ParametersAcceptorSelector::selectFromArgs($scope, $node->getArgs(), $function->getVariants());
+		$node = ArgumentsNormalizer::reorderFuncArguments($parametersAcceptor, $node);
+		if ($node === null) {
+			return [];
+		}
+		$functionName = strtolower($function->getName());
+		if (!array_key_exists($functionName, $this->functionArguments)) {
+			return [];
+		}
+
+		if ($functionName === 'array_keys' && !array_key_exists(1, $node->getArgs())) {
+			return [];
+		}
+
+		$argumentPosition = $this->functionArguments[$functionName];
+		if (!array_key_exists($argumentPosition, $node->getArgs())) {
+			return [
+				RuleErrorBuilder::message(sprintf(
+					'Call to function %s() requires parameter #%d to be set.',
+					$functionName,
+					$argumentPosition + 1,
+				))->identifier('function.strict')->build(),
+			];
+		}
+
+		$argumentType = $scope->getType($node->getArgs()[$argumentPosition]->value);
+		$trueType = new ConstantBooleanType(true);
+		if (!$trueType->isSuperTypeOf($argumentType)->yes()) {
+			return [
+				RuleErrorBuilder::message(sprintf(
+					'Call to function %s() requires parameter #%d to be true.',
+					$functionName,
+					$argumentPosition + 1,
+				))->identifier('function.strict')->build(),
+			];
+		}
+
+		return [];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,60 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\SwitchConditions;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\Switch_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\Printer\Printer;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<Switch_>
+ */
+class MatchingTypeInSwitchCaseConditionRule implements Rule
+{
+
+	private Printer $printer;
+
+	public function __construct(Printer $printer)
+	{
+		$this->printer = $printer;
+	}
+
+	public function getNodeType(): string
+	{
+		return Switch_::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		$messages = [];
+		$conditionType = $scope->getType($node->cond);
+		foreach ($node->cases as $case) {
+			if ($case->cond === null) {
+				continue;
+			}
+
+			$caseType = $scope->getType($case->cond);
+			if (!$conditionType->isSuperTypeOf($caseType)->no()) {
+				continue;
+			}
+
+			$messages[] = RuleErrorBuilder::message(sprintf(
+				'Switch condition type (%s) does not match case condition %s (%s).',
+				$conditionType->describe(VerbosityLevel::value()),
+				$this->printer->prettyPrintExpr($case->cond),
+				$caseType->describe(VerbosityLevel::typeOnly()),
+			))
+				->line($case->getStartLine())
+				->identifier('switch.type')
+				->build();
+		}
+
+		return $messages;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,38 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\MethodCall;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<MethodCall>
+ */
+class VariableMethodCallRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return MethodCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->name instanceof Node\Identifier) {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable method call on %s.',
+				$scope->getType($node->var)->describe(VerbosityLevel::typeOnly()),
+			))->identifier('method.dynamicName')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,38 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\MethodCallableNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<MethodCallableNode>
+ */
+class VariableMethodCallableRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return MethodCallableNode::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->getName() instanceof Node\Identifier) {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable method call on %s.',
+				$scope->getType($node->getVar())->describe(VerbosityLevel::typeOnly()),
+			))->identifier('method.dynamicName')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,98 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\PropertyFetch;
+use PHPStan\Analyser\Scope;
+use PHPStan\Reflection\ClassReflection;
+use PHPStan\Reflection\ReflectionProvider;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use SimpleXMLElement;
+use function sprintf;
+
+/**
+ * @implements Rule<PropertyFetch>
+ */
+class VariablePropertyFetchRule implements Rule
+{
+
+	private ReflectionProvider $reflectionProvider;
+
+	/** @var string[] */
+	private array $universalObjectCratesClasses;
+
+	/**
+	 * @param string[] $universalObjectCratesClasses
+	 */
+	public function __construct(ReflectionProvider $reflectionProvider, array $universalObjectCratesClasses)
+	{
+		$this->reflectionProvider = $reflectionProvider;
+		$this->universalObjectCratesClasses = $universalObjectCratesClasses;
+	}
+
+	public function getNodeType(): string
+	{
+		return PropertyFetch::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->name instanceof Node\Identifier) {
+			return [];
+		}
+
+		$fetchedOnType = $scope->getType($node->var);
+		foreach ($fetchedOnType->getObjectClassNames() as $referencedClass) {
+			if (!$this->reflectionProvider->hasClass($referencedClass)) {
+				continue;
+			}
+
+			$classReflection = $this->reflectionProvider->getClass($referencedClass);
+			if (
+				$this->isUniversalObjectCrate($classReflection)
+				|| $this->isSimpleXMLElement($classReflection)
+			) {
+				return [];
+			}
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable property access on %s.',
+				$fetchedOnType->describe(VerbosityLevel::typeOnly()),
+			))->identifier('property.dynamicName')->build(),
+		];
+	}
+
+	private function isSimpleXMLElement(
+		ClassReflection $classReflection
+	): bool
+	{
+		return $classReflection->getName() === SimpleXMLElement::class
+			|| $classReflection->isSubclassOf(SimpleXMLElement::class);
+	}
+
+	private function isUniversalObjectCrate(
+		ClassReflection $classReflection
+	): bool
+	{
+		foreach ($this->universalObjectCratesClasses as $className) {
+			if (!$this->reflectionProvider->hasClass($className)) {
+				continue;
+			}
+
+			if (
+				$classReflection->getName() === $className
+				|| $classReflection->isSubclassOf($className)
+			) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,44 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\StaticCall;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<StaticCall>
+ */
+class VariableStaticMethodCallRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return StaticCall::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->name instanceof Node\Identifier) {
+			return [];
+		}
+
+		if ($node->class instanceof Node\Name) {
+			$methodCalledOn = $scope->resolveName($node->class);
+		} else {
+			$methodCalledOn = $scope->getType($node->class)->describe(VerbosityLevel::typeOnly());
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable static method call on %s.',
+				$methodCalledOn,
+			))->identifier('staticMethod.dynamicName')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,44 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\StaticMethodCallableNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<StaticMethodCallableNode>
+ */
+class VariableStaticMethodCallableRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return StaticMethodCallableNode::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->getName() instanceof Node\Identifier) {
+			return [];
+		}
+
+		if ($node->getClass() instanceof Node\Name) {
+			$methodCalledOn = $scope->resolveName($node->getClass());
+		} else {
+			$methodCalledOn = $scope->getType($node->getClass())->describe(VerbosityLevel::typeOnly());
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable static method call on %s.',
+				$methodCalledOn,
+			))->identifier('staticMethod.dynamicName')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,44 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\StaticPropertyFetch;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use PHPStan\Type\VerbosityLevel;
+use function sprintf;
+
+/**
+ * @implements Rule<StaticPropertyFetch>
+ */
+class VariableStaticPropertyFetchRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return StaticPropertyFetch::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if ($node->name instanceof Node\Identifier) {
+			return [];
+		}
+
+		if ($node->class instanceof Node\Name) {
+			$propertyAccessedOn = $scope->resolveName($node->class);
+		} else {
+			$propertyAccessedOn = $scope->getType($node->class)->describe(VerbosityLevel::typeOnly());
+		}
+
+		return [
+			RuleErrorBuilder::message(sprintf(
+				'Variable static property access on %s.',
+				$propertyAccessedOn,
+			))->identifier('staticProperty.dynamicName')->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php
--- 7.0.0-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,36 @@
+<?php declare(strict_types = 1);
+
+namespace PHPStan\Rules\VariableVariables;
+
+use PhpParser\Node;
+use PhpParser\Node\Expr\Variable;
+use PHPStan\Analyser\Scope;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleErrorBuilder;
+use function is_string;
+
+/**
+ * @implements Rule<Variable>
+ */
+class VariableVariablesRule implements Rule
+{
+
+	public function getNodeType(): string
+	{
+		return Variable::class;
+	}
+
+	public function processNode(Node $node, Scope $scope): array
+	{
+		if (is_string($node->name)) {
+			return [];
+		}
+
+		return [
+			RuleErrorBuilder::message('Variable variables are not allowed.')
+				->identifier('variable.dynamicName')
+				->build(),
+		];
+	}
+
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_style = space
+indent_size = 4
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,5 @@
+/vendor
+composer.lock
+
+.idea
+/.phpunit.cache
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,25 @@
+The MIT License
+---------------
+
+Copyright (c) 2022-present Tomáš Votruba (https://tomasvotruba.cz)
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,132 @@
+# Require Minimal Type Coverage
+
+<br>
+
+<div align="center">
+    <img src="/docs/required_type_level.jpg" style="width: 25em" alt="AI abilities sea level rising... as way to rise type coverage for class elements">
+</div>
+
+<br>
+
+PHPStan uses type declarations to determine the type of variables, properties and other expression. Sometimes it's hard to see what PHPStan errors are the important ones among thousands of others.
+
+Instead of fixing all PHPStan errors at once, we can start with minimal require type coverage.
+
+<br>
+
+What is the type coverage you ask? We have 4 type possible declarations in total here:
+
+```php
+final class ConferenceFactory
+{
+    const SPEAKER_TAG = 'speaker';
+
+    private $talkFactory;
+
+    public function createConference(array $data)
+    {
+        $talks = $this->talkFactory->create($data);
+
+        return new Conference($talks);
+    }
+}
+```
+
+*Note: Class constant types require PHP 8.3 to run.*
+
+The param type is defined. But the property, return and constant types are missing.
+
+* 1 out of 4 = 25 % coverage
+
+Our code quality is only at one-quarter of its potential. Let's get to 100 %!
+
+```diff
+ final class ConferenceFactory
+ {
+-    public const SPEAKER_TAG = 'speaker';
++    public const string SPEAKER_TAG = 'speaker';
+
+-    private $talkFactory;
++    private TalkFactory $talkFactory;
+
+-    public function createConference(array $data)
++    public function createConference(array $data): Conference
+     {
+         $talks = $this->talkFactory->create($data);
+
+         return new Conference($talks);
+     }
+ }
+```
+
+This technique is very simple to start even on legacy project. Also, you're now aware exactly how high coverage your project has.
+
+<br>
+
+## Install
+
+```bash
+composer require tomasvotruba/type-coverage --dev
+```
+
+The package is available on PHP 7.2+ version in tagged releases.
+
+<br>
+
+## Usage
+
+With [PHPStan extension installer](https://github.com/phpstan/extension-installer), everything is ready to run.
+
+Enable each item on their own:
+
+```yaml
+# phpstan.neon
+parameters:
+    type_coverage:
+        return: 50
+        param: 35.5
+        property: 70
+        constant: 85
+```
+
+<br>
+
+## Measure Strict Declares coverage
+
+Once you've reached 100 % type coverage, make sure [your code is strict and uses types](https://tomasvotruba.com/blog/how-adding-type-declarations-makes-your-code-dangerous):
+
+```php
+<?php
+
+declare(strict_types=1);
+```
+
+Again, raise level percent by percent in your own pace:
+
+```yaml
+parameters:
+    type_coverage:
+        declare: 40
+```
+
+<br>
+
+## Full Paths only
+
+If you run PHPStan only on some subpaths that are different from your setup in `phpstan.neon`, e.g.:
+
+```bash
+vendor/bin/phpstan analyze src/Controller
+```
+
+This package could show false positives, as classes in the `src/Controller` could be slightly less typed. This would be spamming whole PHPStan output and make hard to see any other errors you look for.
+
+That's why this package only triggers if there are full paths, e.g.:
+
+```bash
+vendor/bin/phpstan
+````
+
+<br>
+
+Happy coding!
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,24 @@
+{
+    "name": "tomasvotruba/type-coverage",
+    "type": "phpstan-extension",
+    "description": "Measure type coverage of your project",
+    "license": "MIT",
+    "keywords": ["static analysis", "phpstan-extension"],
+    "require": {
+        "php": "^7.4 || ^8.0",
+        "phpstan/phpstan": "^2.0",
+        "nette/utils": "^3.2 || ^4.0"
+    },
+    "autoload": {
+        "psr-4": {
+            "TomasVotruba\\TypeCoverage\\": "src"
+        }
+    },
+    "extra": {
+        "phpstan": {
+            "includes": [
+                "config/extension.neon"
+            ]
+        }
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,79 @@
+parametersSchema:
+    # see https://doc.nette.org/en/schema for configuration
+    type_coverage: structure([
+        declare: anyOf(float(), int())
+        # type declarations
+        return_type: anyOf(float(), int())
+        param_type: anyOf(float(), int())
+        property_type: anyOf(float(), int())
+        constant_type: anyOf(float(), int())
+        print_suggestions: bool()
+        # aliases to avoid typos
+        return: anyOf(schema(float(), nullable()), schema(int(), nullable()))
+        param: anyOf(schema(float(), nullable()), schema(int(), nullable()))
+        property: anyOf(schema(float(), nullable()), schema(int(), nullable()))
+        constant: anyOf(schema(float(), nullable()), schema(int(), nullable()))
+
+        # measure
+        measure: bool()
+    ])
+
+# default parameters
+parameters:
+    type_coverage:
+        declare: 0
+        # type declarations
+        return_type: 99
+        param_type: 99
+        property_type: 99
+        constant_type: 99
+        # default, yet deprecated
+        print_suggestions: true
+        # aliases
+        return: null
+        param: null
+        property: null
+        constant: null
+
+        measure: false
+
+services:
+    - TomasVotruba\TypeCoverage\Formatter\TypeCoverageFormatter
+    - TomasVotruba\TypeCoverage\CollectorDataNormalizer
+
+    -
+        factory: TomasVotruba\TypeCoverage\Configuration
+        arguments:
+            - %type_coverage%
+
+    # collectors
+    -
+        class: TomasVotruba\TypeCoverage\Collectors\ReturnTypeDeclarationCollector
+        tags:
+            - phpstan.collector
+
+    -
+        class: TomasVotruba\TypeCoverage\Collectors\ParamTypeDeclarationCollector
+        tags:
+            - phpstan.collector
+
+    -
+        class: TomasVotruba\TypeCoverage\Collectors\PropertyTypeDeclarationCollector
+        tags:
+            - phpstan.collector
+    -
+        class: TomasVotruba\TypeCoverage\Collectors\ConstantTypeDeclarationCollector
+        tags:
+            - phpstan.collector
+
+    -
+        class: TomasVotruba\TypeCoverage\Collectors\DeclareCollector
+        tags:
+            - phpstan.collector
+
+rules:
+    - TomasVotruba\TypeCoverage\Rules\ParamTypeCoverageRule
+    - TomasVotruba\TypeCoverage\Rules\ReturnTypeCoverageRule
+    - TomasVotruba\TypeCoverage\Rules\PropertyTypeCoverageRule
+    - TomasVotruba\TypeCoverage\Rules\ConstantTypeCoverageRule
+    - TomasVotruba\TypeCoverage\Rules\DeclareCoverageRule
Binary files 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/docs/required_type_level.jpg and 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/docs/required_type_level.jpg differ
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,18 @@
+<?php
+
+declare(strict_types=1);
+
+use Rector\Config\RectorConfig;
+
+return RectorConfig::configure()
+    ->withPaths([
+        __DIR__ . '/src',
+        __DIR__ . '/tests',
+    ])
+    ->withPhpSets()
+    ->withPreparedSets(deadCode: true, codeQuality: true, codingStyle: true, typeDeclarations: true, privatization: true, naming: true)
+    ->withImportNames(removeUnusedImports: true)
+    ->withSkip([
+        '*/Fixture/*',
+        '*/Source/*',
+    ]);
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,36 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage;
+
+use TomasVotruba\TypeCoverage\ValueObject\TypeCountAndMissingTypes;
+
+final class CollectorDataNormalizer
+{
+    /**
+     * @param array<string, array<array{0: int, 1: array<string, int>}>> $collectorDataByPath
+     */
+    public function normalize(array $collectorDataByPath): TypeCountAndMissingTypes
+    {
+        $totalCount = 0;
+        $missingCount = 0;
+
+        $missingTypeLinesByFilePath = [];
+
+        foreach ($collectorDataByPath as $filePath => $typeCoverageData) {
+            foreach ($typeCoverageData as $nestedData) {
+                $totalCount += $nestedData[0];
+
+                $missingCount += count($nestedData[1]);
+
+                $missingTypeLinesByFilePath[$filePath] = array_merge(
+                    $missingTypeLinesByFilePath[$filePath] ?? [],
+                    $nestedData[1]
+                );
+            }
+        }
+
+        return new TypeCountAndMissingTypes($totalCount, $missingCount, $missingTypeLinesByFilePath);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,77 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Collectors;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\ClassConst;
+use PHPStan\Analyser\Scope;
+use PHPStan\Collectors\Collector;
+use PHPStan\Node\ClassConstantsNode;
+use PHPStan\Reflection\ClassReflection;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Rules\ConstantTypeCoverageRule
+ */
+final class ConstantTypeDeclarationCollector implements Collector
+{
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return ClassConstantsNode::class;
+    }
+
+    /**
+     * @param ClassConstantsNode $node
+     * @return mixed[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // enable only on PHP 8.3+
+        if (PHP_VERSION_ID < 80300) {
+            return [0, []];
+        }
+
+        $constantCount = count($node->getConstants());
+
+        $missingTypeLines = [];
+
+        foreach ($node->getConstants() as $classConst) {
+            // blocked by parent type
+            if ($this->isGuardedByParentClassConstant($scope, $classConst)) {
+                continue;
+            }
+
+            // already typed
+            if ($classConst->type instanceof Node) {
+                continue;
+            }
+
+            // give useful context
+            $missingTypeLines[] = $classConst->getLine();
+        }
+
+        return [$constantCount, $missingTypeLines];
+    }
+
+    private function isGuardedByParentClassConstant(Scope $scope, ClassConst $classConst): bool
+    {
+        $constName = $classConst->consts[0]->name->toString();
+
+        $classReflection = $scope->getClassReflection();
+        if (! $classReflection instanceof ClassReflection) {
+            return false;
+        }
+
+        foreach ($classReflection->getParents() as $parentClassReflection) {
+            if ($parentClassReflection->hasConstant($constName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,51 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Collectors;
+
+use PhpParser\Node;
+use PhpParser\Node\Scalar\LNumber;
+use PhpParser\Node\Stmt\Declare_;
+use PHPStan\Analyser\Scope;
+use PHPStan\Collectors\Collector;
+use PHPStan\Node\FileNode;
+
+final class DeclareCollector implements Collector
+{
+    public function getNodeType(): string
+    {
+        return FileNode::class;
+    }
+
+    /**
+     * @param FileNode $node
+     */
+    public function processNode(Node $node, Scope $scope): bool
+    {
+        foreach ($node->getNodes() as $node) {
+            if (! $node instanceof Declare_) {
+                continue;
+            }
+
+            foreach ($node->declares as $declare) {
+                if (
+                    $declare->key->name !== 'strict_types'
+                ) {
+                    continue;
+                }
+
+                if (
+                    ! $declare->value instanceof LNumber
+                    || $declare->value->value !== 1
+                ) {
+                    return false;
+                }
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,72 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Collectors;
+
+use PhpParser\Comment\Doc;
+use PhpParser\Node;
+use PhpParser\Node\FunctionLike;
+use PHPStan\Analyser\Scope;
+use PHPStan\Collectors\Collector;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Rules\ParamTypeCoverageRule
+ */
+final class ParamTypeDeclarationCollector implements Collector
+{
+    public function getNodeType(): string
+    {
+        return FunctionLike::class;
+    }
+
+    /**
+     * @param FunctionLike $node
+     * @return mixed[]|null
+     */
+    public function processNode(Node $node, Scope $scope): ?array
+    {
+        if ($this->shouldSkipFunctionLike($node)) {
+            return null;
+        }
+
+        $missingTypeLines = [];
+        $paramCount = count($node->getParams());
+
+        foreach ($node->getParams() as $param) {
+            if ($param->variadic) {
+                // skip variadic
+                --$paramCount;
+                continue;
+            }
+
+            if ($param->type === null) {
+                $missingTypeLines[] = $param->getLine();
+            }
+        }
+
+        return [$paramCount, $missingTypeLines];
+    }
+
+    private function shouldSkipFunctionLike(FunctionLike $functionLike): bool
+    {
+        // nothing to analyse
+        if ($functionLike->getParams() === []) {
+            return true;
+        }
+
+        return $this->hasFunctionLikeCallableParam($functionLike);
+    }
+
+    private function hasFunctionLikeCallableParam(FunctionLike $functionLike): bool
+    {
+        // skip callable, can be anythings
+        $docComment = $functionLike->getDocComment();
+        if (! $docComment instanceof Doc) {
+            return false;
+        }
+
+        $docCommentText = $docComment->getText();
+        return strpos($docCommentText, '@param callable') !== false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,93 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Collectors;
+
+use PhpParser\Comment\Doc;
+use PhpParser\Node;
+use PhpParser\Node\Stmt\Property;
+use PHPStan\Analyser\Scope;
+use PHPStan\Collectors\Collector;
+use PHPStan\Node\InClassNode;
+use PHPStan\Reflection\ClassReflection;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Rules\PropertyTypeCoverageRule
+ */
+final class PropertyTypeDeclarationCollector implements Collector
+{
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return InClassNode::class;
+    }
+
+    /**
+     * @param InClassNode $node
+     * @return mixed[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // return typed properties/all properties
+        $classLike = $node->getOriginalNode();
+
+        $propertyCount = count($classLike->getProperties());
+
+        $missingTypeLines = [];
+
+        foreach ($classLike->getProperties() as $property) {
+            // blocked by parent type
+            if ($this->isGuardedByParentClassProperty($scope, $property)) {
+                continue;
+            }
+
+            // already typed
+            if ($property->type instanceof Node) {
+                continue;
+            }
+
+            if ($this->isPropertyDocTyped($property)) {
+                continue;
+            }
+
+            // give useful context
+            $missingTypeLines[] = $property->getLine();
+        }
+
+        return [$propertyCount, $missingTypeLines];
+    }
+
+    private function isPropertyDocTyped(Property $property): bool
+    {
+        $docComment = $property->getDocComment();
+        if (! $docComment instanceof Doc) {
+            return false;
+        }
+
+        $docCommentText = $docComment->getText();
+
+        // skip as unable to type
+        return strpos($docCommentText, 'callable') !== false || strpos($docCommentText, 'resource') !== false;
+    }
+
+    private function isGuardedByParentClassProperty(Scope $scope, Property $property): bool
+    {
+        $propertyName = $property->props[0]->name->toString();
+
+        $classReflection = $scope->getClassReflection();
+        if (! $classReflection instanceof ClassReflection) {
+            return false;
+        }
+
+        foreach ($classReflection->getParents() as $parentClassReflection) {
+            if ($parentClassReflection->hasProperty($propertyName)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,48 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Collectors;
+
+use PhpParser\Node;
+use PhpParser\Node\Stmt\ClassMethod;
+use PHPStan\Analyser\Scope;
+use PHPStan\Collectors\Collector;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Rules\ReturnTypeCoverageRule
+ */
+final class ReturnTypeDeclarationCollector implements Collector
+{
+    public function getNodeType(): string
+    {
+        return ClassMethod::class;
+    }
+
+    /**
+     * @param ClassMethod $node
+     * @return mixed[]|null
+     */
+    public function processNode(Node $node, Scope $scope): ?array
+    {
+        // skip magic
+        if ($node->isMagic()) {
+            return null;
+        }
+
+        if ($scope->isInTrait()) {
+            $originalMethodName = $node->getAttribute('originalTraitMethodName');
+            if ($originalMethodName === '__construct') {
+                return null;
+            }
+        }
+
+        $missingTypeLines = [];
+
+        if (! $node->returnType instanceof Node) {
+            $missingTypeLines[] = $node->getLine();
+        }
+
+        return [1, $missingTypeLines];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Configuration;
+
+use PHPStan\Analyser\LazyInternalScopeFactory;
+use PHPStan\Analyser\Scope;
+use PHPStan\DependencyInjection\MemoizingContainer;
+use PHPStan\DependencyInjection\Nette\NetteContainer;
+use ReflectionProperty;
+
+/**
+ * The easiest way to reach project configuration from Scope object
+ */
+final class ScopeConfigurationResolver
+{
+    private static ?bool $areFullPathsAnalysed = null;
+
+    public static function areFullPathsAnalysed(Scope $scope): bool
+    {
+        // cache for speed
+        if (self::$areFullPathsAnalysed !== null) {
+            return self::$areFullPathsAnalysed;
+        }
+
+        $scopeFactory = self::getPrivateProperty($scope, 'scopeFactory');
+
+        // different types are used in tests, there we want to always analyse everything
+        if (! $scopeFactory instanceof LazyInternalScopeFactory) {
+            return true;
+        }
+
+        $scopeFactoryContainer = self::getPrivateProperty($scopeFactory, 'container');
+        if (! $scopeFactoryContainer instanceof MemoizingContainer) {
+            // edge case, unable to analyse
+            return true;
+        }
+
+        /** @var NetteContainer $originalContainer */
+        $originalContainer = self::getPrivateProperty($scopeFactoryContainer, 'originalContainer');
+
+        $analysedPaths = $originalContainer->getParameter('analysedPaths');
+        $analysedPathsFromConfig = $originalContainer->getParameter('analysedPathsFromConfig');
+
+        self::$areFullPathsAnalysed = $analysedPathsFromConfig === $analysedPaths;
+
+        return self::$areFullPathsAnalysed;
+    }
+
+    private static function getPrivateProperty(object $object, string $propertyName): object
+    {
+        $reflectionProperty = new ReflectionProperty($object, $propertyName);
+        $reflectionProperty->setAccessible(true);
+
+        return $reflectionProperty->getValue($object);
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,76 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage;
+
+final class Configuration
+{
+    /**
+     * @var array<string, mixed>
+     * @readonly
+     */
+    private array $parameters;
+
+    /**
+     * @param array<string, mixed> $parameters
+     */
+    public function __construct(array $parameters)
+    {
+        $this->parameters = $parameters;
+    }
+
+    /**
+     * @return float|int
+     */
+    public function getRequiredPropertyTypeLevel()
+    {
+        return $this->parameters['property'] ?? $this->parameters['property_type'];
+    }
+
+    public function isConstantTypeCoverageEnabled(): bool
+    {
+        if (PHP_VERSION_ID < 80300) {
+            return false;
+        }
+
+        return $this->getRequiredConstantTypeLevel() > 0;
+    }
+
+    /**
+     * @return float|int
+     */
+    public function getRequiredConstantTypeLevel()
+    {
+        return $this->parameters['constant'] ?? $this->parameters['constant_type'];
+    }
+
+    /**
+     * @return float|int
+     */
+    public function getRequiredParamTypeLevel()
+    {
+        return $this->parameters['param'] ?? $this->parameters['param_type'];
+    }
+
+    /**
+     * @return float|int
+     */
+    public function getRequiredReturnTypeLevel()
+    {
+        return $this->parameters['return'] ?? $this->parameters['return_type'];
+    }
+
+    /**
+     * @return float|int
+     */
+    public function getRequiredDeclareLevel()
+    {
+        return $this->parameters['declare'];
+    }
+
+    public function showOnlyMeasure(): bool
+    {
+        return $this->parameters['measure'];
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,56 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Formatter;
+
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\ValueObject\TypeCountAndMissingTypes;
+
+final class TypeCoverageFormatter
+{
+    /**
+     * @return RuleError[]
+     * @param float|int $minimalLevel
+     */
+    public function formatErrors(
+        string $message,
+        string $identifier,
+        $minimalLevel,
+        TypeCountAndMissingTypes $typeCountAndMissingTypes
+    ): array {
+        if ($typeCountAndMissingTypes->getTotalCount() === 0) {
+            return [];
+        }
+
+        $typeCoveragePercentage = $typeCountAndMissingTypes->getCoveragePercentage();
+
+        // has the code met the minimal sea level of types?
+        if ($typeCoveragePercentage >= $minimalLevel) {
+            return [];
+        }
+
+        $ruleErrors = [];
+
+        foreach ($typeCountAndMissingTypes->getMissingTypeLinesByFilePath() as $filePath => $lines) {
+            $errorMessage = sprintf(
+                $message,
+                $typeCountAndMissingTypes->getTotalCount(),
+                $typeCountAndMissingTypes->getFilledCount(),
+                $typeCoveragePercentage,
+                $minimalLevel
+            );
+
+            foreach ($lines as $line) {
+                $ruleErrors[] = RuleErrorBuilder::message($errorMessage)
+                    ->identifier($identifier)
+                    ->file($filePath)
+                    ->line($line)
+                    ->build();
+            }
+        }
+
+        return $ruleErrors;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Rules;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\CollectedDataNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\CollectorDataNormalizer;
+use TomasVotruba\TypeCoverage\Collectors\ConstantTypeDeclarationCollector;
+use TomasVotruba\TypeCoverage\Configuration;
+use TomasVotruba\TypeCoverage\Configuration\ScopeConfigurationResolver;
+use TomasVotruba\TypeCoverage\Formatter\TypeCoverageFormatter;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Tests\Rules\ConstantTypeCoverageRule\ConstantTypeCoverageRuleTest
+ *
+ * @implements Rule<CollectedDataNode>
+ */
+final class ConstantTypeCoverageRule implements Rule
+{
+    /**
+     * @var string
+     */
+    public const ERROR_MESSAGE = 'Out of %d possible constant types, only %d - %.1f %% actually have it. Add more constant types to get over %s %%';
+
+    /**
+     * @var string
+     */
+    private const IDENTIFIER = 'typeCoverage.constantTypeCoverage';
+
+    /**
+     * @readonly
+     */
+    private TypeCoverageFormatter $typeCoverageFormatter;
+
+    /**
+     * @readonly
+     */
+    private Configuration $configuration;
+
+    /**
+     * @readonly
+     */
+    private CollectorDataNormalizer $collectorDataNormalizer;
+
+    public function __construct(TypeCoverageFormatter $typeCoverageFormatter, Configuration $configuration, CollectorDataNormalizer $collectorDataNormalizer)
+    {
+        $this->typeCoverageFormatter = $typeCoverageFormatter;
+        $this->configuration = $configuration;
+        $this->collectorDataNormalizer = $collectorDataNormalizer;
+    }
+
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return CollectedDataNode::class;
+    }
+
+    /**
+     * @param CollectedDataNode $node
+     * @return RuleError[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // if only subpaths are analysed, skip as data will be false positive
+        if (! ScopeConfigurationResolver::areFullPathsAnalysed($scope)) {
+            return [];
+        }
+
+        $constantTypeDeclarationCollector = $node->get(ConstantTypeDeclarationCollector::class);
+        $typeCountAndMissingTypes = $this->collectorDataNormalizer->normalize($constantTypeDeclarationCollector);
+
+        if ($this->configuration->showOnlyMeasure()) {
+            $errorMessage = sprintf(
+                'Class constant type coverage is %.1f %% out of %d possible',
+                $typeCountAndMissingTypes->getCoveragePercentage(),
+                $typeCountAndMissingTypes->getTotalCount()
+            );
+
+            return [RuleErrorBuilder::message($errorMessage)->build()];
+        }
+
+        if (! $this->configuration->isConstantTypeCoverageEnabled()) {
+            return [];
+        }
+
+        return $this->typeCoverageFormatter->formatErrors(
+            self::ERROR_MESSAGE,
+            self::IDENTIFIER,
+            $this->configuration->getRequiredConstantTypeLevel(),
+            $typeCountAndMissingTypes
+        );
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Rules;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\CollectedDataNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\Collectors\DeclareCollector;
+use TomasVotruba\TypeCoverage\Configuration;
+use TomasVotruba\TypeCoverage\Configuration\ScopeConfigurationResolver;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Tests\Rules\DeclareCoverageRule\DeclareCoverageRuleTest
+ *
+ * @implements Rule<CollectedDataNode>
+ */
+final class DeclareCoverageRule implements Rule
+{
+    /**
+     * @var string
+     */
+    public const ERROR_MESSAGE = 'Out of %d possible declare(strict_types=1), only %d - %.1f %% actually have it. Add more declares to get over %s %%';
+
+    /**
+     * @readonly
+     */
+    private Configuration $configuration;
+
+    public function __construct(Configuration $configuration)
+    {
+        $this->configuration = $configuration;
+    }
+
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return CollectedDataNode::class;
+    }
+
+    /**
+     * @param CollectedDataNode $node
+     * @return RuleError[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // if only subpaths are analysed, skip as data will be false positive
+        if (! ScopeConfigurationResolver::areFullPathsAnalysed($scope)) {
+            return [];
+        }
+
+        $requiredDeclareLevel = $this->configuration->getRequiredDeclareLevel();
+
+        $declareCollector = $node->get(DeclareCollector::class);
+        $totalPossibleDeclares = count($declareCollector);
+
+        $coveredDeclares = 0;
+        $notCoveredDeclareFilePaths = [];
+
+        foreach ($declareCollector as $fileName => $data) {
+            // has declares
+            if ($data === [true]) {
+                ++$coveredDeclares;
+            } else {
+                $notCoveredDeclareFilePaths[] = $fileName;
+            }
+        }
+
+        $declareCoverage = ($coveredDeclares / $totalPossibleDeclares) * 100;
+
+        if ($this->configuration->showOnlyMeasure()) {
+            $errorMessage = sprintf(
+                'Strict declares coverage is %.1f %% out of %d possible',
+                $declareCoverage,
+                $totalPossibleDeclares
+            );
+            return [RuleErrorBuilder::message($errorMessage)->build()];
+        }
+
+        // not enabled
+        if ($requiredDeclareLevel === 0) {
+            return [];
+        }
+
+        // nothing to handle
+        if ($totalPossibleDeclares === 0) {
+            return [];
+        }
+
+        // we meet the limit, all good
+        if ($declareCoverage >= $requiredDeclareLevel) {
+            return [];
+        }
+
+        $ruleErrors = [];
+        foreach ($notCoveredDeclareFilePaths as $notCoveredDeclareFilePath) {
+            $errorMessage = sprintf(
+                self::ERROR_MESSAGE,
+                $totalPossibleDeclares,
+                $coveredDeclares,
+                $declareCoverage,
+                $requiredDeclareLevel,
+            );
+
+            $ruleErrors[] = RuleErrorBuilder::message($errorMessage)->file($notCoveredDeclareFilePath)->build();
+        }
+
+        return $ruleErrors;
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,105 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Rules;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\CollectedDataNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\CollectorDataNormalizer;
+use TomasVotruba\TypeCoverage\Collectors\ParamTypeDeclarationCollector;
+use TomasVotruba\TypeCoverage\Configuration;
+use TomasVotruba\TypeCoverage\Configuration\ScopeConfigurationResolver;
+use TomasVotruba\TypeCoverage\Formatter\TypeCoverageFormatter;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Tests\Rules\ParamTypeCoverageRule\ParamTypeCoverageRuleTest
+ *
+ * @implements Rule<CollectedDataNode>
+ */
+final class ParamTypeCoverageRule implements Rule
+{
+    /**
+     * @var string
+     */
+    public const ERROR_MESSAGE = 'Out of %d possible param types, only %d - %.1f %% actually have it. Add more param types to get over %s %%';
+
+    /**
+     * @var string
+     */
+    private const IDENTIFIER = 'typeCoverage.paramTypeCoverage';
+
+    /**
+     * @readonly
+     */
+    private TypeCoverageFormatter $typeCoverageFormatter;
+
+    /**
+     * @readonly
+     */
+    private Configuration $configuration;
+
+    /**
+     * @readonly
+     */
+    private CollectorDataNormalizer $collectorDataNormalizer;
+
+    public function __construct(TypeCoverageFormatter $typeCoverageFormatter, Configuration $configuration, CollectorDataNormalizer $collectorDataNormalizer)
+    {
+        $this->typeCoverageFormatter = $typeCoverageFormatter;
+        $this->configuration = $configuration;
+        $this->collectorDataNormalizer = $collectorDataNormalizer;
+    }
+
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return CollectedDataNode::class;
+    }
+
+    /**
+     * @param CollectedDataNode $node
+     * @return RuleError[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // if only subpaths are analysed, skip as data will be false positive
+        if (! ScopeConfigurationResolver::areFullPathsAnalysed($scope)) {
+            return [];
+        }
+
+        $paramTypeDeclarationCollector = $node->get(ParamTypeDeclarationCollector::class);
+
+        $typeCountAndMissingTypes = $this->collectorDataNormalizer->normalize($paramTypeDeclarationCollector);
+
+        if ($this->configuration->showOnlyMeasure()) {
+            $errorMessage = sprintf(
+                'Param type coverage is %.1f %% out of %d possible',
+                $typeCountAndMissingTypes->getCoveragePercentage(),
+                $typeCountAndMissingTypes->getTotalCount()
+            );
+
+            $ruleError = RuleErrorBuilder::message($errorMessage)
+                ->build();
+
+            return [$ruleError];
+        }
+
+        if ($this->configuration->getRequiredParamTypeLevel() === 0) {
+            return [];
+        }
+
+        return $this->typeCoverageFormatter->formatErrors(
+            self::ERROR_MESSAGE,
+            self::IDENTIFIER,
+            $this->configuration->getRequiredParamTypeLevel(),
+            $typeCountAndMissingTypes
+        );
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Rules;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\CollectedDataNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\CollectorDataNormalizer;
+use TomasVotruba\TypeCoverage\Collectors\PropertyTypeDeclarationCollector;
+use TomasVotruba\TypeCoverage\Configuration;
+use TomasVotruba\TypeCoverage\Configuration\ScopeConfigurationResolver;
+use TomasVotruba\TypeCoverage\Formatter\TypeCoverageFormatter;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Tests\Rules\PropertyTypeCoverageRule\PropertyTypeCoverageRuleTest
+ *
+ * @implements Rule<CollectedDataNode>
+ */
+final class PropertyTypeCoverageRule implements Rule
+{
+    /**
+     * @var string
+     */
+    public const ERROR_MESSAGE = 'Out of %d possible property types, only %d - %.1f %% actually have it. Add more property types to get over %s %%';
+
+    /**
+     * @var string
+     */
+    private const IDENTIFIER = 'typeCoverage.propertyTypeCoverage';
+
+    /**
+     * @readonly
+     */
+    private TypeCoverageFormatter $typeCoverageFormatter;
+
+    /**
+     * @readonly
+     */
+    private Configuration $configuration;
+
+    /**
+     * @readonly
+     */
+    private CollectorDataNormalizer $collectorDataNormalizer;
+
+    public function __construct(TypeCoverageFormatter $typeCoverageFormatter, Configuration $configuration, CollectorDataNormalizer $collectorDataNormalizer)
+    {
+        $this->typeCoverageFormatter = $typeCoverageFormatter;
+        $this->configuration = $configuration;
+        $this->collectorDataNormalizer = $collectorDataNormalizer;
+    }
+
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return CollectedDataNode::class;
+    }
+
+    /**
+     * @param CollectedDataNode $node
+     * @return RuleError[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // if only subpaths are analysed, skip as data will be false positive
+        if (! ScopeConfigurationResolver::areFullPathsAnalysed($scope)) {
+            return [];
+        }
+
+        $propertyTypeDeclarationCollector = $node->get(PropertyTypeDeclarationCollector::class);
+        $typeCountAndMissingTypes = $this->collectorDataNormalizer->normalize($propertyTypeDeclarationCollector);
+
+        if ($this->configuration->showOnlyMeasure()) {
+            $errorMessage = sprintf(
+                'Property type coverage is %.1f %% out of %d possible',
+                $typeCountAndMissingTypes->getCoveragePercentage(),
+                $typeCountAndMissingTypes->getTotalCount()
+            );
+
+            return [RuleErrorBuilder::message($errorMessage)->build()];
+        }
+
+        if ($this->configuration->getRequiredPropertyTypeLevel() === 0) {
+            return [];
+        }
+
+        return $this->typeCoverageFormatter->formatErrors(
+            self::ERROR_MESSAGE,
+            self::IDENTIFIER,
+            $this->configuration->getRequiredPropertyTypeLevel(),
+            $typeCountAndMissingTypes
+        );
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,100 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\Rules;
+
+use PhpParser\Node;
+use PHPStan\Analyser\Scope;
+use PHPStan\Node\CollectedDataNode;
+use PHPStan\Rules\Rule;
+use PHPStan\Rules\RuleError;
+use PHPStan\Rules\RuleErrorBuilder;
+use TomasVotruba\TypeCoverage\CollectorDataNormalizer;
+use TomasVotruba\TypeCoverage\Collectors\ReturnTypeDeclarationCollector;
+use TomasVotruba\TypeCoverage\Configuration;
+use TomasVotruba\TypeCoverage\Configuration\ScopeConfigurationResolver;
+use TomasVotruba\TypeCoverage\Formatter\TypeCoverageFormatter;
+
+/**
+ * @see \TomasVotruba\TypeCoverage\Tests\Rules\ReturnTypeCoverageRule\ReturnTypeCoverageRuleTest
+ *
+ * @implements Rule<CollectedDataNode>
+ */
+final class ReturnTypeCoverageRule implements Rule
+{
+    /**
+     * @var string
+     */
+    public const ERROR_MESSAGE = 'Out of %d possible return types, only %d - %.1f %% actually have it. Add more return types to get over %s %%';
+
+    /**
+     * @var string
+     */
+    private const IDENTIFIER = 'typeCoverage.returnTypeCoverage';
+
+    /**
+     * @readonly
+     */
+    private TypeCoverageFormatter $typeCoverageFormatter;
+
+    /**
+     * @readonly
+     */
+    private Configuration $configuration;
+
+    /**
+     * @readonly
+     */
+    private CollectorDataNormalizer $collectorDataNormalizer;
+
+    public function __construct(TypeCoverageFormatter $typeCoverageFormatter, Configuration $configuration, CollectorDataNormalizer $collectorDataNormalizer)
+    {
+        $this->typeCoverageFormatter = $typeCoverageFormatter;
+        $this->configuration = $configuration;
+        $this->collectorDataNormalizer = $collectorDataNormalizer;
+    }
+
+    /**
+     * @return class-string<Node>
+     */
+    public function getNodeType(): string
+    {
+        return CollectedDataNode::class;
+    }
+
+    /**
+     * @param CollectedDataNode $node
+     * @return RuleError[]
+     */
+    public function processNode(Node $node, Scope $scope): array
+    {
+        // if only subpaths are analysed, skip as data will be false positive
+        if (! ScopeConfigurationResolver::areFullPathsAnalysed($scope)) {
+            return [];
+        }
+
+        $returnSeaLevelDataByFilePath = $node->get(ReturnTypeDeclarationCollector::class);
+        $typeCountAndMissingTypes = $this->collectorDataNormalizer->normalize($returnSeaLevelDataByFilePath);
+
+        if ($this->configuration->showOnlyMeasure()) {
+            $errorMessage = sprintf(
+                'Return type coverage is %.1f %% out of %d possible',
+                $typeCountAndMissingTypes->getCoveragePercentage(),
+                $typeCountAndMissingTypes->getTotalCount()
+            );
+            return [RuleErrorBuilder::message($errorMessage)->build()];
+        }
+
+        if ($this->configuration->getRequiredReturnTypeLevel() === 0) {
+            return [];
+        }
+
+        return $this->typeCoverageFormatter->formatErrors(
+            self::ERROR_MESSAGE,
+            self::IDENTIFIER,
+            $this->configuration->getRequiredReturnTypeLevel(),
+            $typeCountAndMissingTypes
+        );
+    }
+}
diff -pruN 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php
--- 7.0.0-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,75 @@
+<?php
+
+declare(strict_types=1);
+
+namespace TomasVotruba\TypeCoverage\ValueObject;
+
+final class TypeCountAndMissingTypes
+{
+    /**
+     * @readonly
+     */
+    private int $totalCount;
+
+    /**
+     * @readonly
+     */
+    private int $missingCount;
+
+    /**
+     * @var array<string, int[]>
+     * @readonly
+     */
+    private array $missingTypeLinesByFilePath;
+
+    /**
+     * @param array<string, int[]> $missingTypeLinesByFilePath
+     */
+    public function __construct(int $totalCount, int $missingCount, array $missingTypeLinesByFilePath)
+    {
+        $this->totalCount = $totalCount;
+        $this->missingCount = $missingCount;
+        $this->missingTypeLinesByFilePath = $missingTypeLinesByFilePath;
+    }
+
+    public function getTotalCount(): int
+    {
+        return $this->totalCount;
+    }
+
+    public function getFilledCount(): int
+    {
+        return $this->totalCount - $this->missingCount;
+    }
+
+    /**
+     * @return array<string, int[]>
+     */
+    public function getMissingTypeLinesByFilePath(): array
+    {
+        return $this->missingTypeLinesByFilePath;
+    }
+
+    public function getCoveragePercentage(): float
+    {
+        if ($this->totalCount === 0) {
+            return 100.0;
+        }
+
+        $relative = 100 * ($this->getTypedCount() / $this->totalCount);
+
+        // round down with one decimal, to make error message clear that required value is not reached yet
+        return floor($relative * 10) / 10;
+    }
+
+    private function getTypedCount(): int
+    {
+        $missingCount = 0;
+
+        foreach ($this->missingTypeLinesByFilePath as $missingTypeLines) {
+            $missingCount += count($missingTypeLines);
+        }
+
+        return $this->totalCount - $missingCount;
+    }
+}
Binary files 7.0.0-1/tools/composer and 7.0.1-1/tools/composer differ
diff -pruN 7.0.0-1/tools/phive 7.0.1-1/tools/phive
--- 7.0.0-1/tools/phive	1970-01-01 00:00:00.000000000 +0000
+++ 7.0.1-1/tools/phive	2025-08-13 04:44:59.000000000 +0000
@@ -0,0 +1,1107 @@
+#!/usr/bin/env php
+<?php
+namespace PharIo\Phive;
+
+use PharIo\Phive\Cli;
+use Phar;
+
+if (defined('HHVM_VERSION')) {
+    fwrite(STDERR, "HHVM runtime not supported. Please use with PHP 7.3 or later.\n\n");
+    die(99);
+}
+
+if (PHP_VERSION_ID < 70300) {
+    fwrite(
+        STDERR,
+        sprintf(
+            'Phive requires PHP 7.3 or later; ' .
+            "Upgrading to the latest version of PHP is highly recommended. (Version used: %s)\n\n",
+            PHP_VERSION
+        )
+    );
+
+    die(1);
+}
+
+spl_autoload_register(
+  function ($class)
+  {
+      static $classes = NULL;
+
+      if ($classes === NULL) {
+          $classes = array(
+            'phario\\executor\\exception' => '/vendor/phar-io/executor/src/ExecutorException.php',
+                'phario\\executor\\executor' => '/vendor/phar-io/executor/src/Executor.php',
+                'phario\\executor\\executorresult' => '/vendor/phar-io/executor/src/ExecutorResult.php',
+                'phario\\filesystem\\directory' => '/vendor/phar-io/filesystem/src/Directory.php',
+                'phario\\filesystem\\directoryexception' => '/vendor/phar-io/filesystem/src/DirectoryException.php',
+                'phario\\filesystem\\exception' => '/vendor/phar-io/filesystem/src/Exception.php',
+                'phario\\filesystem\\file' => '/vendor/phar-io/filesystem/src/File.php',
+                'phario\\filesystem\\filename' => '/vendor/phar-io/filesystem/src/Filename.php',
+                'phario\\filesystem\\filenameexception' => '/vendor/phar-io/filesystem/src/FilenameException.php',
+                'phario\\filesystem\\lastmodifieddate' => '/vendor/phar-io/filesystem/src/LastModifiedDate.php',
+                'phario\\gnupg\\errorstrings' => '/vendor/phar-io/gnupg/src/ErrorStrings.php',
+                'phario\\gnupg\\exception' => '/vendor/phar-io/gnupg/src/Exception.php',
+                'phario\\gnupg\\factory' => '/vendor/phar-io/gnupg/src/Factory.php',
+                'phario\\gnupg\\gnupg' => '/vendor/phar-io/gnupg/src/GnuPG.php',
+                'phario\\manifest\\application' => '/vendor/phar-io/manifest/src/values/Application.php',
+                'phario\\manifest\\applicationname' => '/vendor/phar-io/manifest/src/values/ApplicationName.php',
+                'phario\\manifest\\author' => '/vendor/phar-io/manifest/src/values/Author.php',
+                'phario\\manifest\\authorcollection' => '/vendor/phar-io/manifest/src/values/AuthorCollection.php',
+                'phario\\manifest\\authorcollectioniterator' => '/vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php',
+                'phario\\manifest\\authorelement' => '/vendor/phar-io/manifest/src/xml/AuthorElement.php',
+                'phario\\manifest\\authorelementcollection' => '/vendor/phar-io/manifest/src/xml/AuthorElementCollection.php',
+                'phario\\manifest\\bundledcomponent' => '/vendor/phar-io/manifest/src/values/BundledComponent.php',
+                'phario\\manifest\\bundledcomponentcollection' => '/vendor/phar-io/manifest/src/values/BundledComponentCollection.php',
+                'phario\\manifest\\bundledcomponentcollectioniterator' => '/vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php',
+                'phario\\manifest\\bundleselement' => '/vendor/phar-io/manifest/src/xml/BundlesElement.php',
+                'phario\\manifest\\componentelement' => '/vendor/phar-io/manifest/src/xml/ComponentElement.php',
+                'phario\\manifest\\componentelementcollection' => '/vendor/phar-io/manifest/src/xml/ComponentElementCollection.php',
+                'phario\\manifest\\containselement' => '/vendor/phar-io/manifest/src/xml/ContainsElement.php',
+                'phario\\manifest\\copyrightelement' => '/vendor/phar-io/manifest/src/xml/CopyrightElement.php',
+                'phario\\manifest\\copyrightinformation' => '/vendor/phar-io/manifest/src/values/CopyrightInformation.php',
+                'phario\\manifest\\elementcollection' => '/vendor/phar-io/manifest/src/xml/ElementCollection.php',
+                'phario\\manifest\\elementcollectionexception' => '/vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php',
+                'phario\\manifest\\email' => '/vendor/phar-io/manifest/src/values/Email.php',
+                'phario\\manifest\\exception' => '/vendor/phar-io/manifest/src/exceptions/Exception.php',
+                'phario\\manifest\\extelement' => '/vendor/phar-io/manifest/src/xml/ExtElement.php',
+                'phario\\manifest\\extelementcollection' => '/vendor/phar-io/manifest/src/xml/ExtElementCollection.php',
+                'phario\\manifest\\extension' => '/vendor/phar-io/manifest/src/values/Extension.php',
+                'phario\\manifest\\extensionelement' => '/vendor/phar-io/manifest/src/xml/ExtensionElement.php',
+                'phario\\manifest\\invalidapplicationnameexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php',
+                'phario\\manifest\\invalidemailexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php',
+                'phario\\manifest\\invalidurlexception' => '/vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php',
+                'phario\\manifest\\library' => '/vendor/phar-io/manifest/src/values/Library.php',
+                'phario\\manifest\\license' => '/vendor/phar-io/manifest/src/values/License.php',
+                'phario\\manifest\\licenseelement' => '/vendor/phar-io/manifest/src/xml/LicenseElement.php',
+                'phario\\manifest\\manifest' => '/vendor/phar-io/manifest/src/values/Manifest.php',
+                'phario\\manifest\\manifestdocument' => '/vendor/phar-io/manifest/src/xml/ManifestDocument.php',
+                'phario\\manifest\\manifestdocumentexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php',
+                'phario\\manifest\\manifestdocumentloadingexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php',
+                'phario\\manifest\\manifestdocumentmapper' => '/vendor/phar-io/manifest/src/ManifestDocumentMapper.php',
+                'phario\\manifest\\manifestdocumentmapperexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php',
+                'phario\\manifest\\manifestelement' => '/vendor/phar-io/manifest/src/xml/ManifestElement.php',
+                'phario\\manifest\\manifestelementexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestElementException.php',
+                'phario\\manifest\\manifestloader' => '/vendor/phar-io/manifest/src/ManifestLoader.php',
+                'phario\\manifest\\manifestloaderexception' => '/vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php',
+                'phario\\manifest\\manifestserializer' => '/vendor/phar-io/manifest/src/ManifestSerializer.php',
+                'phario\\manifest\\noemailaddressexception' => '/vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php',
+                'phario\\manifest\\phpelement' => '/vendor/phar-io/manifest/src/xml/PhpElement.php',
+                'phario\\manifest\\phpextensionrequirement' => '/vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php',
+                'phario\\manifest\\phpversionrequirement' => '/vendor/phar-io/manifest/src/values/PhpVersionRequirement.php',
+                'phario\\manifest\\requirement' => '/vendor/phar-io/manifest/src/values/Requirement.php',
+                'phario\\manifest\\requirementcollection' => '/vendor/phar-io/manifest/src/values/RequirementCollection.php',
+                'phario\\manifest\\requirementcollectioniterator' => '/vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php',
+                'phario\\manifest\\requireselement' => '/vendor/phar-io/manifest/src/xml/RequiresElement.php',
+                'phario\\manifest\\type' => '/vendor/phar-io/manifest/src/values/Type.php',
+                'phario\\manifest\\url' => '/vendor/phar-io/manifest/src/values/Url.php',
+                'phario\\phive\\abstractrequestedpharresolver' => '/src/services/resolver/AbstractRequestedPharResolver.php',
+                'phario\\phive\\abstractresolvingstrategy' => '/src/services/resolver/strategy/AbstractResolvingStrategy.php',
+                'phario\\phive\\authconfig' => '/src/shared/config/AuthConfig.php',
+                'phario\\phive\\authentication' => '/src/shared/http/Authentication.php',
+                'phario\\phive\\authexception' => '/src/shared/exceptions/AuthException.php',
+                'phario\\phive\\authxmlconfig' => '/src/shared/config/AuthXmlConfig.php',
+                'phario\\phive\\authxmlconfigfilelocator' => '/src/shared/config/AuthXmlConfigFileLocator.php',
+                'phario\\phive\\basehash' => '/src/shared/hash/BaseHash.php',
+                'phario\\phive\\basicauthentication' => '/src/shared/http/authentication/BasicAuthentication.php',
+                'phario\\phive\\bearerauthentication' => '/src/shared/http/authentication/BearerAuthentication.php',
+                'phario\\phive\\cachebackend' => '/src/shared/http/CacheBackend.php',
+                'phario\\phive\\checksumservice' => '/src/services/checksum/ChecksumService.php',
+                'phario\\phive\\cli\\coloredconsoleoutput' => '/src/shared/cli/output/ColoredConsoleOutput.php',
+                'phario\\phive\\cli\\command' => '/src/shared/cli/Command.php',
+                'phario\\phive\\cli\\commandlocator' => '/src/shared/cli/CommandLocator.php',
+                'phario\\phive\\cli\\commandlocatorexception' => '/src/shared/cli/CommandLocatorException.php',
+                'phario\\phive\\cli\\commandoptionsexception' => '/src/shared/cli/CommandOptionsException.php',
+                'phario\\phive\\cli\\consoleinput' => '/src/shared/cli/input/ConsoleInput.php',
+                'phario\\phive\\cli\\consoleoutput' => '/src/shared/cli/output/ConsoleOutput.php',
+                'phario\\phive\\cli\\consoletable' => '/src/shared/cli/output/ConsoleTable.php',
+                'phario\\phive\\cli\\context' => '/src/shared/cli/Context.php',
+                'phario\\phive\\cli\\contextexception' => '/src/shared/cli/ContextException.php',
+                'phario\\phive\\cli\\generalcontext' => '/src/shared/cli/GeneralContext.php',
+                'phario\\phive\\cli\\input' => '/src/shared/cli/input/Input.php',
+                'phario\\phive\\cli\\options' => '/src/shared/cli/Options.php',
+                'phario\\phive\\cli\\output' => '/src/shared/cli/output/Output.php',
+                'phario\\phive\\cli\\outputfactory' => '/src/shared/cli/output/OutputFactory.php',
+                'phario\\phive\\cli\\outputlocator' => '/src/shared/cli/output/OutputLocator.php',
+                'phario\\phive\\cli\\request' => '/src/shared/cli/Request.php',
+                'phario\\phive\\cli\\requestexception' => '/src/shared/cli/RequestException.php',
+                'phario\\phive\\cli\\runner' => '/src/shared/cli/Runner.php',
+                'phario\\phive\\cli\\runnerexception' => '/src/shared/cli/RunnerException.php',
+                'phario\\phive\\commandlocator' => '/src/commands/CommandLocator.php',
+                'phario\\phive\\compatibilityservice' => '/src/services/phar/CompatibilityService.php',
+                'phario\\phive\\composeralias' => '/src/shared/ComposerAlias.php',
+                'phario\\phive\\composercommand' => '/src/commands/composer/ComposerCommand.php',
+                'phario\\phive\\composercommandconfig' => '/src/commands/composer/ComposerCommandConfig.php',
+                'phario\\phive\\composercontext' => '/src/commands/composer/ComposerContext.php',
+                'phario\\phive\\composerservice' => '/src/commands/composer/ComposerService.php',
+                'phario\\phive\\compositeauthconfig' => '/src/shared/config/CompositeAuthConfig.php',
+                'phario\\phive\\config' => '/src/shared/config/Config.php',
+                'phario\\phive\\configexception' => '/src/shared/exceptions/ConfigException.php',
+                'phario\\phive\\configuredphar' => '/src/shared/phar/ConfiguredPhar.php',
+                'phario\\phive\\configuredpharexception' => '/src/shared/phar/ConfiguredPharException.php',
+                'phario\\phive\\curl' => '/src/shared/http/Curl.php',
+                'phario\\phive\\curlconfig' => '/src/shared/http/CurlConfig.php',
+                'phario\\phive\\curlconfigbuilder' => '/src/shared/http/CurlConfigBuilder.php',
+                'phario\\phive\\curlconfigexception' => '/src/shared/exceptions/CurlConfigException.php',
+                'phario\\phive\\curlexception' => '/src/shared/exceptions/CurlException.php',
+                'phario\\phive\\curlhttpclient' => '/src/shared/http/CurlHttpClient.php',
+                'phario\\phive\\defaultcommand' => '/src/commands/default/DefaultCommand.php',
+                'phario\\phive\\defaultcommandconfig' => '/src/commands/default/DefaultCommandConfig.php',
+                'phario\\phive\\directurlresolver' => '/src/services/resolver/DirectUrlResolver.php',
+                'phario\\phive\\downloadfailedexception' => '/src/shared/exceptions/DownloadFailedException.php',
+                'phario\\phive\\environment' => '/src/shared/environment/Environment.php',
+                'phario\\phive\\environmentauthconfig' => '/src/shared/config/EnvironmentAuthConfig.php',
+                'phario\\phive\\environmentexception' => '/src/shared/exceptions/EnvironmentException.php',
+                'phario\\phive\\environmentlocator' => '/src/shared/environment/EnvironmentLocator.php',
+                'phario\\phive\\errorexception' => '/src/shared/exceptions/ErrorException.php',
+                'phario\\phive\\etag' => '/src/shared/http/ETag.php',
+                'phario\\phive\\exception' => '/src/shared/exceptions/Exception.php',
+                'phario\\phive\\executor' => '/src/shared/executor/Executor.php',
+                'phario\\phive\\executorexception' => '/src/shared/exceptions/ExecutorException.php',
+                'phario\\phive\\executorresult' => '/src/shared/executor/ExecutorResult.php',
+                'phario\\phive\\factory' => '/src/Factory.php',
+                'phario\\phive\\featuremissingexception' => '/src/shared/exceptions/FeatureMissingException.php',
+                'phario\\phive\\filedownloader' => '/src/shared/download/FileDownloader.php',
+                'phario\\phive\\filedownloaderexception' => '/src/shared/FileDownloaderException.php',
+                'phario\\phive\\filemigration' => '/src/services/migration/FileMigration.php',
+                'phario\\phive\\filenotwritableexception' => '/src/shared/exceptions/FileNotWritableException.php',
+                'phario\\phive\\filestoragecachebackend' => '/src/shared/http/FileStorageCacheBackend.php',
+                'phario\\phive\\git' => '/src/shared/Git.php',
+                'phario\\phive\\gitawarephiveversion' => '/src/shared/version/GitAwarePhiveVersion.php',
+                'phario\\phive\\gitexception' => '/src/shared/exceptions/GitException.php',
+                'phario\\phive\\githubaliasresolver' => '/src/services/resolver/GithubAliasResolver.php',
+                'phario\\phive\\githubaliasresolverexception' => '/src/GithubAliasResolverException.php',
+                'phario\\phive\\githubrepository' => '/src/shared/repository/GithubRepository.php',
+                'phario\\phive\\gitlabaliasresolver' => '/src/services/resolver/GitlabAliasResolver.php',
+                'phario\\phive\\gitlabrepository' => '/src/shared/repository/GitlabRepository.php',
+                'phario\\phive\\globalphivexmlconfig' => '/src/shared/config/GlobalPhiveXmlConfig.php',
+                'phario\\phive\\gnupg' => '/src/shared/GnuPG.php',
+                'phario\\phive\\gnupgkeydownloader' => '/src/services/key/gpg/GnupgKeyDownloader.php',
+                'phario\\phive\\gnupgkeydownloaderexception' => '/src/shared/exceptions/GnupgKeyDownloaderException.php',
+                'phario\\phive\\gnupgkeyimporter' => '/src/services/key/gpg/GnupgKeyImporter.php',
+                'phario\\phive\\gnupgsignatureverifier' => '/src/services/signature/gpg/GnupgSignatureVerifier.php',
+                'phario\\phive\\gnupgverificationresult' => '/src/services/signature/gpg/GnupgVerificationResult.php',
+                'phario\\phive\\hash' => '/src/shared/hash/Hash.php',
+                'phario\\phive\\helpcommand' => '/src/commands/help/HelpCommand.php',
+                'phario\\phive\\homepharsxmlmigration' => '/src/services/migration/HomePharsXmlMigration.php',
+                'phario\\phive\\homephivexmlmigration' => '/src/services/migration/HomePhiveXmlMigration.php',
+                'phario\\phive\\httpclient' => '/src/shared/http/HttpClient.php',
+                'phario\\phive\\httpexception' => '/src/shared/http/HttpException.php',
+                'phario\\phive\\httpprogresshandler' => '/src/shared/http/HttpProgressHandler.php',
+                'phario\\phive\\httpprogressrenderer' => '/src/shared/http/HttpProgressRenderer.php',
+                'phario\\phive\\httpprogressupdate' => '/src/shared/http/HttpProgressUpdate.php',
+                'phario\\phive\\httpresponse' => '/src/shared/http/HttpResponse.php',
+                'phario\\phive\\httpresponseexception' => '/src/shared/http/HttpResponseException.php',
+                'phario\\phive\\installationfailedexception' => '/src/shared/exceptions/InstallationFailedException.php',
+                'phario\\phive\\installcommand' => '/src/commands/install/InstallCommand.php',
+                'phario\\phive\\installcommandconfig' => '/src/commands/install/InstallCommandConfig.php',
+                'phario\\phive\\installcommandconfigexception' => '/src/commands/install/InstallCommandConfigException.php',
+                'phario\\phive\\installcontext' => '/src/commands/install/InstallContext.php',
+                'phario\\phive\\installedphar' => '/src/shared/phar/InstalledPhar.php',
+                'phario\\phive\\installservice' => '/src/services/phar/InstallService.php',
+                'phario\\phive\\internalfilemigration' => '/src/services/migration/InternalFileMigration.php',
+                'phario\\phive\\invalidhashexception' => '/src/shared/exceptions/InvalidHashException.php',
+                'phario\\phive\\invalidxmlexception' => '/src/shared/exceptions/InvalidXmlException.php',
+                'phario\\phive\\ioexception' => '/src/shared/exceptions/IOException.php',
+                'phario\\phive\\jsondata' => '/src/shared/JsonData.php',
+                'phario\\phive\\keydownloader' => '/src/services/key/KeyDownloader.php',
+                'phario\\phive\\keyimporter' => '/src/services/key/KeyImporter.php',
+                'phario\\phive\\keyimportresult' => '/src/services/key/KeyImportResult.php',
+                'phario\\phive\\keyservice' => '/src/services/key/KeyService.php',
+                'phario\\phive\\linkcreationfailedexception' => '/src/shared/exceptions/LinkCreationFailedException.php',
+                'phario\\phive\\listcommand' => '/src/commands/list/ListCommand.php',
+                'phario\\phive\\localaliasresolver' => '/src/services/resolver/LocalAliasResolver.php',
+                'phario\\phive\\localfirstresolvingstrategy' => '/src/services/resolver/strategy/LocalFirstResolvingStrategy.php',
+                'phario\\phive\\localphivexmlconfig' => '/src/shared/config/LocalPhiveXmlConfig.php',
+                'phario\\phive\\localrepository' => '/src/shared/repository/LocalRepository.php',
+                'phario\\phive\\localsourceslistfileloader' => '/src/shared/sources/LocalSourcesListFileLoader.php',
+                'phario\\phive\\localsslcertificate' => '/src/shared/http/LocalSslCertificate.php',
+                'phario\\phive\\migratecommand' => '/src/commands/migrate/MigrateCommand.php',
+                'phario\\phive\\migratecommandconfig' => '/src/commands/migrate/MigrateCommandConfig.php',
+                'phario\\phive\\migratecontext' => '/src/commands/migrate/MigrateContext.php',
+                'phario\\phive\\migration' => '/src/services/migration/Migration.php',
+                'phario\\phive\\migrationexception' => '/src/shared/exceptions/MigrationException.php',
+                'phario\\phive\\migrationfactory' => '/src/services/migration/MigrationFactory.php',
+                'phario\\phive\\migrationservice' => '/src/services/migration/MigrationService.php',
+                'phario\\phive\\migrationsfailedexception' => '/src/shared/exceptions/MigrationsFailedException.php',
+                'phario\\phive\\nogpgbinaryfoundexception' => '/src/shared/exceptions/NoGPGBinaryFoundException.php',
+                'phario\\phive\\notfoundexception' => '/src/shared/exceptions/NotFoundException.php',
+                'phario\\phive\\outdatedcommand' => '/src/commands/outdated/OutdatedCommand.php',
+                'phario\\phive\\outdatedconfig' => '/src/commands/outdated/OutdatedConfig.php',
+                'phario\\phive\\outdatedconfigexception' => '/src/commands/outdated/OutdatedConfigException.php',
+                'phario\\phive\\outdatedcontext' => '/src/commands/outdated/OutdatedContext.php',
+                'phario\\phive\\phar' => '/src/shared/phar/Phar.php',
+                'phario\\phive\\pharalias' => '/src/shared/phar/PharAlias.php',
+                'phario\\phive\\phardownloader' => '/src/services/phar/PharDownloader.php',
+                'phario\\phive\\pharexception' => '/src/shared/exceptions/PharException.php',
+                'phario\\phive\\pharidentifier' => '/src/shared/phar/PharIdentifier.php',
+                'phario\\phive\\pharinstaller' => '/src/services/phar/PharInstaller.php',
+                'phario\\phive\\pharinstallerexception' => '/src/shared/exceptions/PharInstallerException.php',
+                'phario\\phive\\pharinstallerfactory' => '/src/services/phar/PharInstallerFactory.php',
+                'phario\\phive\\pharinstallerlocator' => '/src/services/phar/PharInstallerLocator.php',
+                'phario\\phive\\pharioaliasresolver' => '/src/services/resolver/PharIoAliasResolver.php',
+                'phario\\phive\\phariorepository' => '/src/shared/repository/PharIoRepository.php',
+                'phario\\phive\\pharregistry' => '/src/shared/PharRegistry.php',
+                'phario\\phive\\pharregistryexception' => '/src/shared/exceptions/PharRegistryException.php',
+                'phario\\phive\\pharservice' => '/src/services/phar/PharService.php',
+                'phario\\phive\\pharurl' => '/src/shared/phar/PharUrl.php',
+                'phario\\phive\\phivecontext' => '/src/PhiveContext.php',
+                'phario\\phive\\phiveversion' => '/src/shared/version/PhiveVersion.php',
+                'phario\\phive\\phivexmlconfig' => '/src/shared/config/PhiveXmlConfig.php',
+                'phario\\phive\\phivexmlconfigfilelocator' => '/src/shared/config/PhiveXmlConfigFileLocator.php',
+                'phario\\phive\\projectphivexmlmigration' => '/src/services/migration/ProjectPhiveXmlMigration.php',
+                'phario\\phive\\publickey' => '/src/services/key/PublicKey.php',
+                'phario\\phive\\publickeyexception' => '/src/shared/exceptions/PublicKeyException.php',
+                'phario\\phive\\publickeyreader' => '/src/services/key/gpg/PublicKeyReader.php',
+                'phario\\phive\\purgecommand' => '/src/commands/purge/PurgeCommand.php',
+                'phario\\phive\\purgecontext' => '/src/commands/purge/PurgeContext.php',
+                'phario\\phive\\ratelimit' => '/src/shared/http/RateLimit.php',
+                'phario\\phive\\release' => '/src/shared/phar/Release.php',
+                'phario\\phive\\releasecollection' => '/src/shared/phar/ReleaseCollection.php',
+                'phario\\phive\\releaseexception' => '/src/shared/exceptions/ReleaseException.php',
+                'phario\\phive\\releaseselector' => '/src/services/phar/ReleaseSelector.php',
+                'phario\\phive\\remotefirstresolvingstrategy' => '/src/services/resolver/strategy/RemoteFirstResolvingStrategy.php',
+                'phario\\phive\\remotesourceslistfileloader' => '/src/shared/sources/RemoteSourcesListFileLoader.php',
+                'phario\\phive\\removalservice' => '/src/services/phar/RemovalService.php',
+                'phario\\phive\\removecommand' => '/src/commands/remove/RemoveCommand.php',
+                'phario\\phive\\removecommandconfig' => '/src/commands/remove/RemoveCommandConfig.php',
+                'phario\\phive\\removecontext' => '/src/commands/remove/RemoveContext.php',
+                'phario\\phive\\requestedphar' => '/src/shared/phar/RequestedPhar.php',
+                'phario\\phive\\requestedpharresolver' => '/src/services/resolver/RequestedPharResolver.php',
+                'phario\\phive\\requestedpharresolverfactory' => '/src/services/resolver/RequestedPharResolverFactory.php',
+                'phario\\phive\\requestedpharresolverservice' => '/src/services/resolver/RequestedPharResolverService.php',
+                'phario\\phive\\requestedpharresolverservicebuilder' => '/src/services/resolver/RequestedPharResolverServiceBuilder.php',
+                'phario\\phive\\resetcommand' => '/src/commands/reset/ResetCommand.php',
+                'phario\\phive\\resetcommandconfig' => '/src/commands/reset/ResetCommandConfig.php',
+                'phario\\phive\\resetcontext' => '/src/commands/reset/ResetContext.php',
+                'phario\\phive\\resolveexception' => '/src/shared/exceptions/ResolveException.php',
+                'phario\\phive\\resolvingstrategy' => '/src/services/resolver/strategy/ResolvingStrategy.php',
+                'phario\\phive\\retryinghttpclient' => '/src/shared/http/RetryingHttpClient.php',
+                'phario\\phive\\ringdowncurlhttpclient' => '/src/shared/http/RingdownCurlHttpClient.php',
+                'phario\\phive\\selfupdatecommand' => '/src/commands/selfupdate/SelfupdateCommand.php',
+                'phario\\phive\\sha1hash' => '/src/shared/hash/sha/Sha1Hash.php',
+                'phario\\phive\\sha256hash' => '/src/shared/hash/sha/Sha256Hash.php',
+                'phario\\phive\\sha384hash' => '/src/shared/hash/sha/Sha384Hash.php',
+                'phario\\phive\\sha512hash' => '/src/shared/hash/sha/Sha512Hash.php',
+                'phario\\phive\\signatureverifier' => '/src/services/signature/SignatureVerifier.php',
+                'phario\\phive\\skelcommand' => '/src/commands/skel/SkelCommand.php',
+                'phario\\phive\\skelcommandconfig' => '/src/commands/skel/SkelCommandConfig.php',
+                'phario\\phive\\skelcontext' => '/src/commands/skel/SkelContext.php',
+                'phario\\phive\\source' => '/src/shared/sources/Source.php',
+                'phario\\phive\\sourcerepository' => '/src/shared/repository/SourceRepository.php',
+                'phario\\phive\\sourceslist' => '/src/shared/sources/SourcesList.php',
+                'phario\\phive\\sourceslistexception' => '/src/shared/exceptions/SourcesListException.php',
+                'phario\\phive\\sourceslistfileloader' => '/src/shared/sources/SourcesListFileLoader.php',
+                'phario\\phive\\staticphiveversion' => '/src/shared/version/StaticPhiveVersion.php',
+                'phario\\phive\\statuscommand' => '/src/commands/status/StatusCommand.php',
+                'phario\\phive\\statuscommandconfig' => '/src/commands/status/StatusCommandConfig.php',
+                'phario\\phive\\statuscontext' => '/src/commands/status/StatusContext.php',
+                'phario\\phive\\supportedrelease' => '/src/shared/phar/SupportedRelease.php',
+                'phario\\phive\\targetdirectorylocator' => '/src/shared/TargetDirectoryLocator.php',
+                'phario\\phive\\tokenauthentication' => '/src/shared/http/authentication/TokenAuthentication.php',
+                'phario\\phive\\trustedcollection' => '/src/services/key/TrustedCollection.php',
+                'phario\\phive\\unixoidenvironment' => '/src/shared/environment/UnixoidEnvironment.php',
+                'phario\\phive\\unixoidpharinstaller' => '/src/services/phar/UnixoidPharInstaller.php',
+                'phario\\phive\\unsupportedrelease' => '/src/shared/phar/UnsupportedRelease.php',
+                'phario\\phive\\unsupportedversionconstraintexception' => '/src/shared/exceptions/UnsupportedVersionConstraintException.php',
+                'phario\\phive\\updatecommand' => '/src/commands/update/UpdateCommand.php',
+                'phario\\phive\\updatecommandconfig' => '/src/commands/update/UpdateCommandConfig.php',
+                'phario\\phive\\updatecontext' => '/src/commands/update/UpdateContext.php',
+                'phario\\phive\\updaterepositorylistcommand' => '/src/commands/update-repository-list/UpdateRepositoryListCommand.php',
+                'phario\\phive\\url' => '/src/shared/Url.php',
+                'phario\\phive\\urlrepository' => '/src/shared/repository/UrlRepository.php',
+                'phario\\phive\\usedphar' => '/src/shared/phar/UsedPhar.php',
+                'phario\\phive\\userfilemigration' => '/src/services/migration/UserFileMigration.php',
+                'phario\\phive\\verificationfailedexception' => '/src/shared/exceptions/VerificationFailedException.php',
+                'phario\\phive\\verificationresult' => '/src/services/signature/VerificationResult.php',
+                'phario\\phive\\versioncommand' => '/src/commands/version/VersionCommand.php',
+                'phario\\phive\\windowsenvironment' => '/src/shared/environment/WindowsEnvironment.php',
+                'phario\\phive\\windowspharinstaller' => '/src/services/phar/WindowsPharInstaller.php',
+                'phario\\phive\\xmlfile' => '/src/shared/XmlFile.php',
+                'phario\\version\\abstractversionconstraint' => '/vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php',
+                'phario\\version\\andversionconstraintgroup' => '/vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php',
+                'phario\\version\\anyversionconstraint' => '/vendor/phar-io/version/src/constraints/AnyVersionConstraint.php',
+                'phario\\version\\buildmetadata' => '/vendor/phar-io/version/src/BuildMetaData.php',
+                'phario\\version\\exactversionconstraint' => '/vendor/phar-io/version/src/constraints/ExactVersionConstraint.php',
+                'phario\\version\\exception' => '/vendor/phar-io/version/src/exceptions/Exception.php',
+                'phario\\version\\greaterthanorequaltoversionconstraint' => '/vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php',
+                'phario\\version\\invalidprereleasesuffixexception' => '/vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php',
+                'phario\\version\\invalidversionexception' => '/vendor/phar-io/version/src/exceptions/InvalidVersionException.php',
+                'phario\\version\\nobuildmetadataexception' => '/vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php',
+                'phario\\version\\noprereleasesuffixexception' => '/vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php',
+                'phario\\version\\orversionconstraintgroup' => '/vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php',
+                'phario\\version\\prereleasesuffix' => '/vendor/phar-io/version/src/PreReleaseSuffix.php',
+                'phario\\version\\specificmajorandminorversionconstraint' => '/vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php',
+                'phario\\version\\specificmajorversionconstraint' => '/vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php',
+                'phario\\version\\unsupportedversionconstraintexception' => '/vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php',
+                'phario\\version\\version' => '/vendor/phar-io/version/src/Version.php',
+                'phario\\version\\versionconstraint' => '/vendor/phar-io/version/src/constraints/VersionConstraint.php',
+                'phario\\version\\versionconstraintparser' => '/vendor/phar-io/version/src/VersionConstraintParser.php',
+                'phario\\version\\versionconstraintvalue' => '/vendor/phar-io/version/src/VersionConstraintValue.php',
+                'phario\\version\\versionnumber' => '/vendor/phar-io/version/src/VersionNumber.php'
+          );
+      }
+
+      $class = strtolower($class);
+
+      if (isset($classes[$class])) {
+          require 'phar://phive.phar/' . $classes[$class];
+      }
+  }
+);
+
+Phar::mapPhar('phive.phar');
+
+$rc = (new Factory(new Cli\Request($_SERVER['argv']), new StaticPhiveVersion('0.15.3')))->getRunner()->run();
+exit($rc);
+
+__HALT_COMPILER(); ?>
+nX  =      
+   phive.phar    +   vendor/phar-io/filesystem/src/Directory.php  f        4   vendor/phar-io/filesystem/src/DirectoryException.php   f   =v"      +   vendor/phar-io/filesystem/src/Exception.phpf   f^   $      &   vendor/phar-io/filesystem/src/File.phpf  f   C+r      *   vendor/phar-io/filesystem/src/Filename.php  f  Vs)      3   vendor/phar-io/filesystem/src/FilenameException.phpm   fb   fo      2   vendor/phar-io/filesystem/src/LastModifiedDate.php  fT  [      (   vendor/phar-io/executor/src/Executor.php  f  #j~      1   vendor/phar-io/executor/src/ExecutorException.php   fg   </n      .   vendor/phar-io/executor/src/ExecutorResult.php  f/  0SH      )   vendor/phar-io/gnupg/src/ErrorStrings.phpuI  f  һ      &   vendor/phar-io/gnupg/src/Exception.phpa   fY   N      $   vendor/phar-io/gnupg/src/Factory.php7  f  jh      "   vendor/phar-io/gnupg/src/GnuPG.php=$  f	  KGE	      D   vendor/phar-io/version/src/constraints/AbstractVersionConstraint.php  fn  oSMy      D   vendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php  f  /j-Ҵ      ?   vendor/phar-io/version/src/constraints/AnyVersionConstraint.php@  fL  [      A   vendor/phar-io/version/src/constraints/ExactVersionConstraint.php  f  :B      P   vendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php  f  ^      C   vendor/phar-io/version/src/constraints/OrVersionConstraintGroup.php  f  ش      Q   vendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php  f  LK      I   vendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.php  f        <   vendor/phar-io/version/src/constraints/VersionConstraint.php  f0  W      3   vendor/phar-io/version/src/exceptions/Exception.php  f  G      J   vendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php   fu         A   vendor/phar-io/version/src/exceptions/InvalidVersionException.php   fs   |      B   vendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php   fp         E   vendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.php   fr   XbpԴ      O   vendor/phar-io/version/src/exceptions/UnsupportedVersionConstraintException.php  f%  Gd      ,   vendor/phar-io/version/src/BuildMetaData.php  f|  H      /   vendor/phar-io/version/src/PreReleaseSuffix.php^  fv  .o      &   vendor/phar-io/version/src/Version.php+  f;  fr붴      6   vendor/phar-io/version/src/VersionConstraintParser.php  f  <P6      5   vendor/phar-io/version/src/VersionConstraintValue.php&
+  fg  P>13      ,   vendor/phar-io/version/src/VersionNumber.php  fk  J}r      6   vendor/phar-io/manifest/src/ManifestDocumentMapper.php  f  q      .   vendor/phar-io/manifest/src/ManifestLoader.php  f  q̤      2   vendor/phar-io/manifest/src/ManifestSerializer.php  fM  ۂ      E   vendor/phar-io/manifest/src/exceptions/ElementCollectionException.php  f0  _Uj      4   vendor/phar-io/manifest/src/exceptions/Exception.php  f  P      J   vendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php1  fF  MV      @   vendor/phar-io/manifest/src/exceptions/InvalidEmailException.php  f+  ˤ      >   vendor/phar-io/manifest/src/exceptions/InvalidUrlException.php  f/  Y      D   vendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php  f'   o      K   vendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.php  f!  գ      J   vendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.php  f0  `'i      C   vendor/phar-io/manifest/src/exceptions/ManifestElementException.php  f%  #mߤ      B   vendor/phar-io/manifest/src/exceptions/ManifestLoaderException.php  f  4o      B   vendor/phar-io/manifest/src/exceptions/NoEmailAddressException.php  f4  q:      2   vendor/phar-io/manifest/src/values/Application.php  f5  f=      6   vendor/phar-io/manifest/src/values/ApplicationName.php  f        -   vendor/phar-io/manifest/src/values/Author.php  f  <L      7   vendor/phar-io/manifest/src/values/AuthorCollection.php  f   ¤      ?   vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php  f  ]=      7   vendor/phar-io/manifest/src/values/BundledComponent.phpH  f  Z	      A   vendor/phar-io/manifest/src/values/BundledComponentCollection.php  f  $      I   vendor/phar-io/manifest/src/values/BundledComponentCollectionIterator.php  f  :"漤      ;   vendor/phar-io/manifest/src/values/CopyrightInformation.php\  f        ,   vendor/phar-io/manifest/src/values/Email.php  f  S|      0   vendor/phar-io/manifest/src/values/Extension.php  f  Z7'      .   vendor/phar-io/manifest/src/values/Library.php  f2        .   vendor/phar-io/manifest/src/values/License.php  f  ^      /   vendor/phar-io/manifest/src/values/Manifest.php-
+  f  g      >   vendor/phar-io/manifest/src/values/PhpExtensionRequirement.php  fw  (      <   vendor/phar-io/manifest/src/values/PhpVersionRequirement.php$  f  "&      2   vendor/phar-io/manifest/src/values/Requirement.php  f  1q      <   vendor/phar-io/manifest/src/values/RequirementCollection.php\  f  X?      D   vendor/phar-io/manifest/src/values/RequirementCollectionIterator.php  f        +   vendor/phar-io/manifest/src/values/Type.php  f  <2      *   vendor/phar-io/manifest/src/values/Url.php  f  #lͣ      1   vendor/phar-io/manifest/src/xml/AuthorElement.php  fn  2      ;   vendor/phar-io/manifest/src/xml/AuthorElementCollection.phpS  fS  (7      2   vendor/phar-io/manifest/src/xml/BundlesElement.phpz  ff  }      4   vendor/phar-io/manifest/src/xml/ComponentElement.php  f`  $Sg       >   vendor/phar-io/manifest/src/xml/ComponentElementCollection.php\  fT  6      3   vendor/phar-io/manifest/src/xml/ContainsElement.php  f  aΤ      4   vendor/phar-io/manifest/src/xml/CopyrightElement.php  f}  t)T      5   vendor/phar-io/manifest/src/xml/ElementCollection.php  f  砲L      .   vendor/phar-io/manifest/src/xml/ExtElement.php  fK        8   vendor/phar-io/manifest/src/xml/ExtElementCollection.phpJ  fQ        4   vendor/phar-io/manifest/src/xml/ExtensionElement.php  fa  zj      2   vendor/phar-io/manifest/src/xml/LicenseElement.php|  f\  tTX      4   vendor/phar-io/manifest/src/xml/ManifestDocument.php  f  9S      3   vendor/phar-io/manifest/src/xml/ManifestElement.phpn  f  p      .   vendor/phar-io/manifest/src/xml/PhpElement.php  f  wO      3   vendor/phar-io/manifest/src/xml/RequiresElement.phpK  f^  ܗ      )   src/commands/composer/ComposerContext.php  f  x      )   src/commands/composer/ComposerCommand.php  f  `^      /   src/commands/composer/ComposerCommandConfig.php  f  lŤ      )   src/commands/composer/ComposerService.php	  f,        '   src/commands/default/DefaultCommand.php,  f  e      -   src/commands/default/DefaultCommandConfig.php  ft  @k         src/commands/help/help.md
+  f  $4w      !   src/commands/help/HelpCommand.php  f  JD      6   src/commands/install/InstallCommandConfigException.php  f2  =      '   src/commands/install/InstallContext.phpN  f  |S      -   src/commands/install/InstallCommandConfig.php{  f  k      '   src/commands/install/InstallCommand.php
+  f  ;      !   src/commands/list/ListCommand.php  fD  |      '   src/commands/migrate/MigrateContext.php  fP  X'e      '   src/commands/migrate/MigrateCommand.php  f  	"      -   src/commands/migrate/MigrateCommandConfig.phpt  ft  W¤      1   src/commands/outdated/OutdatedConfigException.php  f  -4      )   src/commands/outdated/OutdatedContext.php4  f  #>      (   src/commands/outdated/OutdatedConfig.php9  f        )   src/commands/outdated/OutdatedCommand.phpQ  fP  K5      #   src/commands/purge/PurgeContext.php  f  fP      #   src/commands/purge/PurgeCommand.phps  f  (Ҥ      %   src/commands/remove/RemoveContext.php  fQ  '      %   src/commands/remove/RemoveCommand.php 	  f0  M      +   src/commands/remove/RemoveCommandConfig.php  f  /@      #   src/commands/reset/ResetContext.php  f  EŴ      #   src/commands/reset/ResetCommand.php0  fr  #\      )   src/commands/reset/ResetCommandConfig.php  f  IŤ      -   src/commands/selfupdate/SelfupdateCommand.php  f  gYU      !   src/commands/skel/SkelContext.php2  fX  _Mʹ      '   src/commands/skel/SkelCommandConfig.php  f  !E      !   src/commands/skel/SkelCommand.phph	  f  V      %   src/commands/status/StatusContext.php  ft  &      %   src/commands/status/StatusCommand.php  f        +   src/commands/status/StatusCommandConfig.phpI
+  f<  U氝      C   src/commands/update-repository-list/UpdateRepositoryListCommand.php  f  8Hj      %   src/commands/update/UpdateContext.php  fz  f      %   src/commands/update/UpdateCommand.php  f  k      +   src/commands/update/UpdateCommandConfig.php   f  @$      '   src/commands/version/VersionCommand.php	  fO           src/commands/CommandLocator.phpq
+  f  X@      )   src/services/checksum/ChecksumService.php8  f  2w      +   src/services/key/gpg/GnupgKeyDownloader.phpt
+  f  ݴ      )   src/services/key/gpg/GnupgKeyImporter.php  f  ~      (   src/services/key/gpg/PublicKeyReader.php  f5  W      "   src/services/key/KeyDownloader.php  f  }.e          src/services/key/KeyImporter.php  f  j      $   src/services/key/KeyImportResult.phpa  f  AG         src/services/key/KeyService.php	  f  U          src/services/key/PublicKey.php  fr  :F?      &   src/services/key/TrustedCollection.php  f  a~      (   src/services/migration/FileMigration.php  f  t;Y      0   src/services/migration/HomePhiveXmlMigration.php>  f  ?겴      0   src/services/migration/InternalFileMigration.phpY  fm  @      $   src/services/migration/Migration.php  f  X'mY      3   src/services/migration/ProjectPhiveXmlMigration.php  f;  9̴      ,   src/services/migration/UserFileMigration.php  f`  p      0   src/services/migration/HomePharsXmlMigration.phpl  f  ]]&      +   src/services/migration/MigrationFactory.php  f  rA      +   src/services/migration/MigrationService.php  f  H4      $   src/services/phar/PharDownloader.phpV  fx  ^      #   src/services/phar/PharInstaller.php  f	  5JԴ      *   src/services/phar/PharInstallerFactory.php  f  	      *   src/services/phar/PharInstallerLocator.php-  f  V      !   src/services/phar/PharService.php  f  s      %   src/services/phar/ReleaseSelector.php	  f  m      *   src/services/phar/UnixoidPharInstaller.php7  f  n0ޱ      *   src/services/phar/WindowsPharInstaller.php  f  G      $   src/services/phar/InstallService.phpv  f        *   src/services/phar/CompatibilityService.php  f  >~^      $   src/services/phar/RemovalService.phpu  f  %      <   src/services/resolver/strategy/AbstractResolvingStrategy.php   f+  ז      >   src/services/resolver/strategy/LocalFirstResolvingStrategy.php]  fq  M;B      ?   src/services/resolver/strategy/RemoteFirstResolvingStrategy.php^  fr  ٴ      4   src/services/resolver/strategy/ResolvingStrategy.php  f-  W$      7   src/services/resolver/AbstractRequestedPharResolver.php0  f  82Q      +   src/services/resolver/DirectUrlResolver.php  f  7k      -   src/services/resolver/GitlabAliasResolver.phpG  f  v㵴      ,   src/services/resolver/LocalAliasResolver.php  f  _      -   src/services/resolver/PharIoAliasResolver.php	  fI  DX      /   src/services/resolver/RequestedPharResolver.php4  fW  R/      6   src/services/resolver/RequestedPharResolverFactory.php4  f.  ?L      6   src/services/resolver/RequestedPharResolverService.phpW  f  zN      =   src/services/resolver/RequestedPharResolverServiceBuilder.php  f  +&      -   src/services/resolver/GithubAliasResolver.phpt  f@  Zt      6   src/services/signature/gpg/GnupgVerificationResult.php  fk  L      5   src/services/signature/gpg/GnupgSignatureVerifier.php8  f  e'8      ,   src/services/signature/SignatureVerifier.php  f>  P      -   src/services/signature/VerificationResult.php4  fJ  O         src/shared/cli/input/Input.php  f(  )DU      %   src/shared/cli/input/ConsoleInput.php  f  K﨤      '   src/shared/cli/output/ConsoleOutput.php
+  fy  T:|      &   src/shared/cli/output/ConsoleTable.php  fr  d#;          src/shared/cli/output/Output.php  f^  J      '   src/shared/cli/output/OutputFactory.php  f[  Q@      .   src/shared/cli/output/ColoredConsoleOutput.php[  f;  b      '   src/shared/cli/output/OutputLocator.phpg  f  A         src/shared/cli/Command.php  f  ǯG      *   src/shared/cli/CommandLocatorException.php  f&  t      *   src/shared/cli/CommandOptionsException.php  f<  @         src/shared/cli/Context.phpz  f  4nN      #   src/shared/cli/ContextException.php  f/  U      #   src/shared/cli/RequestException.php  fG  Mꪴ      "   src/shared/cli/RunnerException.php  f  m;g         src/shared/cli/error.txtR  f   '      !   src/shared/cli/CommandLocator.php  f7  o6      !   src/shared/cli/GeneralContext.phpB  f           src/shared/cli/Options.php  f  6         src/shared/cli/Request.php  fu  7N         src/shared/cli/Runner.phpV  fE  0N          src/shared/config/AuthConfig.php  f,  d      #   src/shared/config/AuthXmlConfig.php  f  S঴      .   src/shared/config/AuthXmlConfigFileLocator.phpx  ff  6ô      )   src/shared/config/CompositeAuthConfig.php  f  1z      *   src/shared/config/GlobalPhiveXmlConfig.php@  f_  fK[      )   src/shared/config/LocalPhiveXmlConfig.php  f  qٴ      /   src/shared/config/PhiveXmlConfigFileLocator.php)  fW  QwŴ      +   src/shared/config/EnvironmentAuthConfig.php  f  Vo      $   src/shared/config/PhiveXmlConfig.php#  fh  }M         src/shared/config/Config.php  f  5      &   src/shared/download/FileDownloader.phpj	  fF  cz      -   src/shared/environment/EnvironmentLocator.php  f        -   src/shared/environment/WindowsEnvironment.php  f  	|      -   src/shared/environment/UnixoidEnvironment.php
+  f  Rs      &   src/shared/environment/Environment.php=  f  'f)      '   src/shared/exceptions/AuthException.php  f  Z
+P      )   src/shared/exceptions/ConfigException.php  f  .´      -   src/shared/exceptions/CurlConfigException.php  f  ?c      '   src/shared/exceptions/CurlException.php  f  α      1   src/shared/exceptions/DownloadFailedException.php  f  ˫)$      .   src/shared/exceptions/EnvironmentException.php  f  bb      (   src/shared/exceptions/ErrorException.php  f  IW      #   src/shared/exceptions/Exception.php  f
+  <      +   src/shared/exceptions/ExecutorException.php  f.         1   src/shared/exceptions/FeatureMissingException.php  f        2   src/shared/exceptions/FileNotWritableException.php  f  g)      &   src/shared/exceptions/GitException.php  f
+  =      5   src/shared/exceptions/GnupgKeyDownloaderException.php  f  m8      %   src/shared/exceptions/IOException.php  f
+  ˸˴      5   src/shared/exceptions/InstallationFailedException.php  f  u      .   src/shared/exceptions/InvalidHashException.php  f  `o      -   src/shared/exceptions/InvalidXmlException.php  f  }      5   src/shared/exceptions/LinkCreationFailedException.php  f  H@!g      ,   src/shared/exceptions/MigrationException.php  f  g      3   src/shared/exceptions/MigrationsFailedException.php  ft  shg      3   src/shared/exceptions/NoGPGBinaryFoundException.php  f  G?      +   src/shared/exceptions/NotFoundException.php  f  A)      '   src/shared/exceptions/PharException.php  f
+  2eh״      0   src/shared/exceptions/PharInstallerException.php  f  B      /   src/shared/exceptions/PharRegistryException.php  f  Qz-      ,   src/shared/exceptions/PublicKeyException.php  f  L      *   src/shared/exceptions/ReleaseException.php  f  |      *   src/shared/exceptions/ResolveException.php  f  Db      .   src/shared/exceptions/SourcesListException.php  f)  z/      ?   src/shared/exceptions/UnsupportedVersionConstraintException.php  f  R      5   src/shared/exceptions/VerificationFailedException.php  f  V&          src/shared/executor/Executor.php  fZ  '&/      &   src/shared/executor/ExecutorResult.php"  f  8          src/shared/hash/sha/Sha1Hash.phpL  f  |      "   src/shared/hash/sha/Sha256Hash.phpR  f  $U      "   src/shared/hash/sha/Sha384Hash.phpR  f  -G      "   src/shared/hash/sha/Sha512Hash.phpS  f  Cc         src/shared/hash/BaseHash.phpN  f  qQ         src/shared/hash/Hash.php  fB  .      6   src/shared/http/authentication/BasicAuthentication.php  f  B-      7   src/shared/http/authentication/BearerAuthentication.php  f/  'I      6   src/shared/http/authentication/TokenAuthentication.php  f/  E          src/shared/http/CacheBackend.phpL  fS  4         src/shared/http/Curl.phpu
+  fl  Bi      !   src/shared/http/HttpException.php  f  fd_      '   src/shared/http/HttpProgressHandler.php  f  	Y_      )   src/shared/http/HttpResponseException.php  f  mȑA      "   src/shared/http/Authentication.php  f           src/shared/http/CurlConfig.phpG  f  	      %   src/shared/http/CurlConfigBuilder.php  f           src/shared/http/ETag.php2  fP  xpr      +   src/shared/http/FileStorageCacheBackend.php  f  9[i      (   src/shared/http/HttpProgressRenderer.php
+  f   P      &   src/shared/http/HttpProgressUpdate.php  f'  mKdĤ      '   src/shared/http/LocalSslCertificate.php  f  ۥ         src/shared/http/RateLimit.php(  f  $      "   src/shared/http/CurlHttpClient.php  f  {¦         src/shared/http/HttpClient.php  f1  K	e          src/shared/http/HttpResponse.php  f|        &   src/shared/http/RetryingHttpClient.php  fp  +@      *   src/shared/http/RingdownCurlHttpClient.php  fn  %ri      +   src/shared/phar/ConfiguredPharException.php  f/  4@ý      "   src/shared/phar/PharIdentifier.php  f  lI         src/shared/phar/PharUrl.php  f]  \         src/shared/phar/Release.php  f8  Eȴ      %   src/shared/phar/ReleaseCollection.phpH  f  cG      !   src/shared/phar/InstalledPhar.php?  f  )7         src/shared/phar/PharAlias.phpv  fm  y      &   src/shared/phar/UnsupportedRelease.php  f  -      "   src/shared/phar/ConfiguredPhar.php3  f  o         src/shared/phar/Phar.php  f  =@j      !   src/shared/phar/RequestedPhar.php
+  f   0      $   src/shared/phar/SupportedRelease.php  fO  1         src/shared/phar/UsedPhar.phpv  f  <      *   src/shared/repository/SourceRepository.php  f*  dд      *   src/shared/repository/GitlabRepository.phpI
+  f  2t      )   src/shared/repository/LocalRepository.php  f  im      *   src/shared/repository/PharIoRepository.php(
+  f{        '   src/shared/repository/UrlRepository.php  f  V$t      *   src/shared/repository/GithubRepository.php
+  f  R'!r      ,   src/shared/sources/SourcesListFileLoader.php  f  9>K      1   src/shared/sources/LocalSourcesListFileLoader.phpC  f  nCҤ      2   src/shared/sources/RemoteSourcesListFileLoader.php  f  sSD         src/shared/sources/Source.php\  f  [      "   src/shared/sources/SourcesList.php	  f!  dN      +   src/shared/version/GitAwarePhiveVersion.php  f%  BǴ      #   src/shared/version/PhiveVersion.php  f  L++      )   src/shared/version/StaticPhiveVersion.phpa  f`  Vkش         src/shared/ComposerAlias.php^  fI        &   src/shared/FileDownloaderException.php  f  f         src/shared/Git.phpV  f  5<Ӵ         src/shared/JsonData.phpM  f  讛      %   src/shared/TargetDirectoryLocator.php  fy  H>Of         src/shared/Url.phpm
+  f   ô         src/shared/PharRegistry.php~&  fc            src/shared/XmlFile.phpm  f8  j         src/shared/GnuPG.phpX  f  0      $   src/GithubAliasResolverException.php  f  Q         src/PhiveContext.php  f  4k         src/autoload.phpS  f1  "w|         src/Factory.phpF  f
+  (         conf/auth.skeleton.xmld  fR  &ٴ         conf/auth.xsd  f  :%         conf/pgp-keyservers.phpY   fJ   +p         conf/pharBat.template%   f'            conf/phive.skeleton.xml  fR        WmoF_v$et:s"M )DYHw$h߇;Xd7OD>$ROBդx@sP`)1SOý&L{ aZ[0 K S` |{;S|1,_$<(q)`>Фۚ{ڛ_b'(t\x܅Y<x,LݠHblXp#WDގMHr0aW84eZ&9fqS 'Ѽĩ8UrҰ@rwF㣣K)U(EwRD,`_Iwݰ~XUDK["sIelրٴ}Lf'!w!
+>r[-݂zrK^"r εx0w`ZoUPlxllIf	u1@I6ɨ.KdMS(L.6"113'QWMEW@H1LSk `6Q?ȟ!KXR!zBZL)v?1ȭjiWDcw%<]qQ{dYh9׆3d.aIqV;î˴X)BY!L.;魓X'm[fW14$`xN69ca5h39^7B!i?zuj??ys?+<mT<t㚴Ma!eL S,%㠹U#kۣ^)VFja=03YUbq 2Dx7ᮽ7Kx:5&nm&I^5uzSe]Hl NGp o;hp;=Og\T!(g)D'͖vOYNǎ1jP#?x2xHmeAʰ%:~ 0*RR\@}}aV}ܸըa.1O0iơ)*ޞ_^g囫F
+Խ3}ڙɖZ헠ÛsMEqi԰{3Y;eFX7ql	{%&:z+	vljme#HG_B>oVak}H75(­ͣ壖{"yˍko
+AlنWZ!Mzwb%cQqqV,u8?N4ҷm=0~ō::Air4]
+/uZ&o2OD#hI,XlZA0=K2xLnqE
+LsI]ȃr @DLw(nhyUb(7yXh?bG7ͲxEȱ
+@=O8Mp$<8pɠz[hGMs玟MKE6Uw>)c<=Dŝ߇"q<?]PMk0WЃZʮm
+zSCK	>iɺMG}=>'Z.*N6o}kkܟajMqg!  Yϝ2>C>N30Cviۏ8ΰmiqhQq'ĢęqeiIXXZ徫9ju*$%Iy*
+r1$9MID~FJ4"WMJ/[oJS6"4iKu"ipt6޵v!w|6/z7;߽Oܧ4HM|[|r43쒵_ l2g&l9^I$a*}Jf+iH>܃_)*(in&3*FJ3YKzRJsB.pS՘ /\r5'$CpJZŮtZSs]#8@*AP;f[&£	O}A<!mQC?B'\*Q`+soi>_?Y[O\OJ]i_%&4BmM)?EZ@xuL<Z<Cr={/ϱեkdvk4/-&;K8E7OFQT^̹1*[dLy9ƊQ\g
+EΎRnr?U)RߖMz>Y? ExszvU˴:P 4_*{d:LΚcSzڮTuζxgʧY-9/T5XI5vڴ#rXE>.ۣd,J~gmnW+*Ҹ{4v؏I4ΙWppxs83δcp5k^EgM|;n⩦Q-Ns{98r6<dak+|
+&ԫI#\o8z`0N3U<a''JiB(	F?;txʕ[8up̱zu;r}7CUX|j[8^_boT}_)߬maywuY=/(PHIMI,J(.)L./,H-VU0ԴKM-.HLNUH,̏qI,.I͵JI,.V 	ԹV$d)V+ Dj uMK@#xMzBAQ
+e"ijeٝ}f*+I(txvRym:j
+.R3q	z~,$O? h8lN,Bn.5ʹW9+' o^))`i,Ϯ%#ĀKo)t]B.!sC7[P Np:{F]%0pMKkH;L8BzjFN ݙ3$W&D({MY9(e wpĵ3'U$GۓIoU7h.n5`efw/SAn0[CF$Ævh" LR{AEbHYMC̋hgtUW:AҌ#SȝUfeBV,6g׌z  Y|̰z\505B!gx/d BrݮNr+lXW<+;ؠ$gCς,Cv(d(8FH{(B۟)I3Ta]3s<0zh7YeL7 x1E$irV;;Xwħݛ:euDʨ'Jڇ bcw(D_emӒ.ȟQ׃#)nc2
+	Ncdq ΰ9=]~({'(4Y7JPD]7/c߰U1
+P=`gq"K*Ѥxwq|K%FeQ<n>MeO
+|A[́G [$WmFSӪ7} ?O0wJT({	 U@0\4:*叓6		%ݽM,<r!5l>G)<\2&R7|Jpb `E	<8#Tz__-Ӣ:pp%Lq[;9"6O>i%Vf'(hG%rY=@3Wh4mOm|{-HM, U>0oK]éVԧDYIUPp;PIQ֘tt2޽ҹy׵cB!%`N/e#ЧpSU'Y~\m6>,nbImKN.w$9@˴mTHE(b{n>Ib<ݱ#;V7T(^5i=^}BЖ֌z+G݋uC&ojcM!|yO;r`)j؎<pJZz,F{})@#ڐv{7,?wզkWv2GRC!rY(HG{f<HA\
++~+hw=;zр?0mDjL 05bbdzl1!n}qehT5L%nI*4DvL@|U$PJ2Pͯ<zy{.IjB8x n#Xb*-wtOJX˶S#6Vз[Ho}压i9JySg`>2<s$j	p,c|<ЦG=@{wY."$}Tpb Q{mpʗP"b}ƚMXĴU4aOGkFhzmc8c͔{^S$HY`ykM52I3T4˕#}kϘ+GAÈkrr软f^X'sa	s[&Y;>.?̣T1cɞtoX7 )o-P{F0,`TcX1ot۰˳pI򜦓H\k{dGfj11D]'&pفX˝լڼeEaJ$ܡ˃+*`®wJ>0)>Jh:C:'ipZ&f@.oC+3GD0:*-濌	=RkNC(ڴ'pfi@µӝd'CLz!Q:Ư-"ԛr(/c5\ruO/Q>9#>\ҤUEo&'zKR9)F%`~U!u8_/Ue믃׳#,W8ю[t#3={kʛO}|]6xYg{j8W*jw/[,<o<"K=u\	${,b[*xh{X&&46!t,R}wXNC/{n\4b0[ϊifb!yZ e?0=,+ff-	X]yJ-WmcQU-WqO>"L{B*@@6[ϋlZeaGYO<xyvFd-̽{tCqfy
+n8m*r0xCDN8/1Sobhm#b3Q?)I*<m@Ѷ5Yp\M<K=zu+}hS	2'}%p:cLSg{e:i"zp4+lr
+7U^y6&^4l?[%hN!9&Ivl3[A$L{-'1Hr-sq|fI ?S^NظdM
+5I͔HK*86Dp#lZ=ˉ͇3X&V!m*|QN)f<6	%[&tg?\OLވXM_Fִadߋ^J2w5	n|MB^샻PV&+\0UV$|ûheD.<VR]˶XJ9er&˙`xjbL@mZ-U\0?QYJRq*G,o9>{3Mµ:WxR@ydM;kRCPCױ
+[O"esEr0	&Ay$;$2% dҐI@gLl¨thM\O}4tȺ^GhxN̐=\cJE<fDzҰ/1`fHr{ @M`|ʑ*ZgFK3p|i$fJBȹO1nȎ뮡'r\>:b.<[p/d\Tݱ2"]4qG[Ƽx̿6_V4̦FHX.+I=eFrf\FHyP2D;v)<i+җ>*H.`%j#tgs/Xj]`gT<%J.|d֚$JL=HtȽ{.KM2פ=aȣyTCIT?PPb0ef=B/Q7/C6a ۘdCE":]w1#/ۘ 1]W_&e}#!;3pt ?3KϏGNȑs^CYG~չ;)>ϏEm@>똩.ZzG< Ֆv( ];$_ΉC:5*#7GBmzkz2!% >+ ?F/ZۻYe+kց4	S LFi(UQCl8	~CsKKNpZ"#ƾ KŖ[~oBU1j5InX3l9<=뜲q'w<*%3n>6,;g%31avnmSr2&[uOUp[֫\W>ﮪo
+Eu.ܻ!"kbMRG.vq&[4_\]Ty38@>TtjЈFhFk.@[v	7qQJX-\q!4Yh){3;tI
+]'3
+l}V'BP3dHr'ܵ[|C@+?V>MEƸ'pQFF-.LlMMQ3Λm ;fpe޼m&Q9*zv;7Fh$χ:e B?2B= U]@"$_?BH]DaC. P*լ7qOb Vw;Ag0?ZKX34.r|fyl|zWlD9{9WH!CV˦W"q($cү_̵ɮe[=[JxB?z#({6<7𩦈rGƣRUɞ7A(Waui]Ȩǝs{:s픐NӈB[8[K\iY	h|OW:Qh̶W.ѝ:d̣.#)]o"|:AbY^`edTKt:6^2*^NywLj LL"oUU!ZHdh>[jv
+젱S|^seu,mΞ2?;
+SUʏD9ڱ=5_ՠuJv P艶_g9xS-=9 	v !Ɛ<
++cO\-)f\K@m8Չvj;z/ya	%{W1L֓*[VdT?fWYZFz(6F9@8*CvrMF"K_*yJ1\sAV?07RHƟFMRHTM#)SnQ\XYSdͣ1mT*//=foFn7h[+Wf]aqӾQq%On^J8㽙	lBxڤY
+j~/ݶIw{"+*'S!?Qيxu .QtF*U;%8qO^larHWFW]]F/1z}Bh(^B]FW_F1xF:NX3̰8gęay3-h%Z<#tED-=j_.b?@l\aT÷_Qe(`(7^!WFV*CAb9cwS/Ǟ76U{. v^/Hjh9/5(* yZ|\Ҽ6tcEj-R4'o^ϋyVwlQ@
+b~Q:޶i,A{[[lդ8L%t]UQV8Ose5>pm-=@%@&)}س1|Fy'po	7+kGANR?IRM	JʮDF棞_vFxe,~CM}'>;27dl3>Dd3R/xbs2,PYj63sMV "<fT@AӠ|fGPMG`8MT	\ |uM*un|F$d>M2hoH ,ܷ/؈hlHB~A{_̼ԬmKY_pgH/9zΧxy/xE1
+0 =Ȩ$Pt*ᝒic_V1l*kt)Ry4 E};#Jvp>uT]o0}ϯ@=V(E(*L.R-)>9_@H>{V&T!FDf'Qz5jIcYBDct}4bKqO06B>_q8.q&8y/RhTAsӽvj4 {{
+i/b tVrqjs,/tk_ڨn]T](eo)a"(}cԃ tLtr`Bj0;DzQDbx
+qWzǹ 'x{6~|5oP=7-Ɩ2h4Pk@R `'OWZ
+Mxn}?`Xj&Tvx6.0&kYSq;!:.6"<-FjM+by)ǸnLFh#xRy|u:"+%gs8Bh7)4	gyg2u܂IPaB`w,N)Yj7bLB-fI+Wx>+K:e^,9y9%\dEؕSYa&qr[Rd|=)R`_E܁P64M$Uw*۷8 g@V|!+ߚr=lUcɱ_c5l_]<5h:Yh&2т;{?ks6~ތ;|%n˖'vs58I1	 hG |$Gnzb}b͛tB~D8Br˅ܤ(`uEJ|5=|t2QmE?	~\~FE3q#$Ƴ;ї	BP?TםNeMP\/)r <X r,aI4eGT>6=HXX1uGF9@.ӄPJzD6] i12A~r?/kF$Md,DȒ,\Ln&pEJ8$rҌ@с~Ǐ]v:  SxL8nPx
+rL$	VޫTiQK&t'UQrDJ$@7,lQV?aB̗ne4[=C&5@2]SsWD&%|slY1.1C4PMi4j욈
+Mn<u`!<;94Se?-s$&|&6d:9(7
+G-r!^m')5F[
+MxnE1zLtM1* S
+HWR"&_>}pg?3ឝvNff'+DӢGquuʹ8:&R&9&YQ"O9eQ$<ߪmh)y<|ol<F*8mQ#*py/T=S#0߇ K#繖2L"QxEb [j<%\GJ
+2LjNSx[k"Է$/BKb؃G4dDfk@w׼BաG$ \1%!vSmY֚a,V઒-=D:|Cao}kFJ;VewGr,{'V<2F)zJu"$FKM1qBBcĩB~dq-I**H5{ N"ʰiғp~-
+JqKg$cɺp?6OTO,3[ƹv~|nc*N]-UoxӅmb0oFs(igggn\?`x./?]:<\ 0` w5os=mmUoŤBP=F{pcXkAb_'64AÅΑ4aH܅Ue)x I\ЄYg4[>#QXk"ֻSl)ܤ꾷J-&˸oUD^̯xۧoeaɑ<5`\ި)VW?1K"$%!c܈[Qn{b,DH.6?Nrr%4nnTSL n'Pyp?ё7&xu(4篏Œ8Vec{c?TnaЀWqrVļ9
+M\i+6-P;|QdXa:U9fހrp2;=myd-#Hn4oɋH4jKT(h!GV򑗰RN%zk.Հh=_f]NW~%L8[tmTyVB.I#?'XϿfQz"Jÿ{PtepX90seQ䘭</>I߫[~p>9n~ݍo9`mNuB:Nai5n;m3SҺz2j<Ë_#*Zn΅E&Kܾ&˛?h:vv=i&LmY_X_Dp1ܷTo9	Ճ0/-ZT3Z}[Rv_pyM:!d"e׫q/y4nD25jIFaŶex)bq*0]xR[MsB*tF;`>s:Wbj-b!VtwrtC[u.,x5JTWo[cp'-v]=IJ404λǝ{ѫԨ]+m3>ʥ/Suz_EHZE^=R>8\;鶛Vh4;JbXJ0+O-~_T|%2mzgWTx!N_Qu~/QI$.rCi%&4r,9jݑiH";߷z*3R\7 vˈnS<?Өt.W	-mܤ&HDsSGfßr*2`S94@-(36ٴA[J uy'B)*<TT`*@"SGjK dGB l}y
+ Fp|Ie"䑆%]m \/l:{b<mZ	[`.P8L	wpyVكʣjՈiD)(yAgMx3pڱfnjv3_mPjAWCIczIHiKNzEg5Ì&{'Izz?.a),[g;{qU\TXg'xdDJGG1z%U:ss&eyߜ,cMIySo.嚲	)	|lb9D;NTϰdKHÅdHxq!چԓIKDϔxP[G#e4RGVRaHB%es,UUQ-38O9vj'}ҋ{VxSr@	Ŕr$2EH%D~Uo9^A]ig|+uQpj7B(2:O؆煮H_mRn1+^%hP@SHR\Y֪*fI\;ͼg>*`mIi8#>j<Tge"Jc&"$?*{%h_Ǹ~U9|xLC;Τmb>Ŭr"øˆn`"ckx}pũE&ؙT!eWE3/8[0V6i>3h#hS$d\"?]XNo` `<b%s^!c-%FO>=OՑby Enwo5et֩yFn6#ٚG ڟ0Z=!	4tN9zקںzP~o%}9&Xyo;k^t#brwzmǾ;!jq(FTI||P mP]kA|_1&$5v|@)>ޞ']$])S=IAͧWrTZ+'Jx\U
+?z6t	lQ>SyIj\*`.w*76Qn|Kl_h$Nm+xOwz<sQxOƜJ=(zGXCt.r)i?>=<~>NVG>ZiF{>beDH) q 1Y@Rfz(bC4O :6Qt9RjfQw/RQ6*pi=ῖѶ,6woM.V'mAo1+!RwK+Ɇ6%J8!YllؖgiѦI"|G{Mhx\fg>'x[Mns"vf)?ğ?8a\`]
+6ܐOsTds^)3Nt1C-뽇9UPh פ.+$$GǛr1X6VK	Z7-6N-thEbĖ
+n@kD
+$c䂂C+k? ΠK`rޡeEQ"׳]Xդx]Zy|>RYU''o.07L{=#9F)I/m-mn@~9pJDT@9EBG]ngШɻWkB{~{9TJ2Q9P)|o *aK
+?=D:nYtI4Ѽ8\_4
+5$0<T|tޑlktmkB _VZ0><o+t%X6"B`Ǵop\$UV%~F=kZC`|IQ氦YA7Yf,_PIVӠ]. ;EH  Fw()B*Af5ڷݦl`8Zڴh-G3ah(t<>fu08s_t.
+I8!mmPݸt:}4rbxa?uQAn0sA6n$H E[ A.i`E&%e(ڊQٙ=JVE;~8&#<:҆<I&s?Yv"CWb׆/0'(%_q7,CckYVkm	-	bͨc߉^dK5E0Fzws6QcM[
+(uʧh"X#TkD1+9E0,9xRheP.]5;-V2 FXlH6H/zC1PIgفb'59I蕶d48~,}h*Ŏ٨A";v[&q:?ð:H4cYggTnw^1ؼSΙ*'LF~F±䱙TB~tF;WH*؈Eg')+2_RMk1xƉ_RhJ!kgʒvC/׍P3ok*V<C:>;}9)F<6PfH#ak|moOXs] Cƍ&}7؜+(d[`iްȘlk$&hgn˶ SAbbjwŚ!f
+!.QıTٴ+$6`[V*v)(hRJSX9VRz/M tkMDȦ
+XnDſ
+ X#<s^]ҘL&:k7Z֨TkE[/bY/[1H<̔G=LJM޲|:<3b':}Z;;CRV9j?T_lyt<Ԥ~yM
+B3/omQn0+e81zN\TXQ+-EnPvi9;.Σfe(8JJv9bw墘M
+L6)\C^Ա*q,֐A",o[(&<p2<;oxˡ`$ r)ab6.$)aC~>I卥#"j-$CSRѓ⋀Eňg>N;gVmqS%Dɿ &l,c>=	c'Eqhf*mNeAIqbn%Hfi<jiY[_}YF3J\
+V/RƔǧ1r9J`_պey\g7ꍑmPjQCv	n&$JBѾzE6&{Y׹F166/<LrƎO\˳31HaꀧR" ]%2n
+pɔpGB{ذ7⺍k+|*aHD;,=V12^LcGѡڎB&g<Ǉۻ)'G/s?c/1"VN<Wpv2JI4؆yunz& hSW$c4a_,ZV]&LtX^h^?]AK1xnժT,Of64	ɬ]Xg_g)U-3+.q1/Wt>"KQN*T7%AV̥D.<myu5%=Xdr)x˲J'l_T`Sq
+-Ke+S<CJ|ziN>V'T~;:X/Dٲf<43ċ+i'Me_E=0=F89t+
+N9 G.R\qVŷW(.t:.s){дrD5)ypG619J*`c[MJ&$iDBnF{~Eʱ
+0=OqUSA둻JE|w
+]?YGXagrF': \atpG<IB,lFuPϓ$a+ķhOEȱ
+0=OqU
+T(GCȝPݱG]b᎝yg(NtA#pnB,lFv~puPMCѴUZP!n7EȻ
+@~bJ-XYHP
+Ȱ!vFX2<ǳJ3b↝y/(Ntp)GиrfRBLlF:6ܑ{Y_zB2M[IքF[~/]QKQWGQZeHms	ɽdYas%$K+z,MSJg|:<N:税A3*-P|ݔlN:Ѓt͈,4>y~{nCp͙+.XYj>x8;Ƃ4HsH4}b=&jCi;F'*ۛzY8F	lg3{l5FbJEig2ѫ$	:AM2Rw2k--ؿW<9.ׁA?fѩfNp|ݿ?}Ao1+!lTqmETR4Z8UU;64|oM#Z6I}^׳j:0]o:6!(B=m%/+ұV<c`ф9es_|}57ԒG,`!:>X;L"=3Lb|gİ#_ :[>Ono
+jX{R(&+8X	-
+H
+UqVٺ3+'%<T L',$(mq'e2Ϟ17tٛ6|RFG`(gTҾXǿc)ظ:z	k_=K}&Os,Tn0+JѓٹE-&%6Z^Yh )9ED=L"`8f.	8UkXdVD!\SOjI#tJTL=/TkW9RY HrjTh9>DTBϖS>d9pJ}3tQ.J^(Rk7JM]N=pSeN#}.863l֨ O3Ԫ!ܚD{w"m~P_kfk"3gZٸU&|&al&T5gj)QiL
+MD\xBkc:blڼL=*bLPHǄ
+_k;:MswY󁋺Q8jt/}1v?N']]=mvTXS7fSBeRQ&oQ#'{Ӧ1Sq)@gs`^;X**+haO!Ƀ_lAp>v#[HծyKXn^lv_h0Oj*pF_5i;*@Zz\N&s۞\/mIkτ	Nyt>l9)} XmS6_pㅼp\L2%)؛X#{GĲlGg]iQ
+!1
+i Szp❶["*`Bc* %\B2dx\Є[9C8	%ٸ78&BRW̐CW($<G>ٌQDu _2BdqA>q:$BLdIgD҄B#so?]\\(Sy2"*|ƙ@*TD !HBTHI@V!@ >	eM8tN$n2k\U/yČWPZ 2UXǋk`M6Ǫ!`r8L$oC"OqLd,P aB,F{w	k>~8$k螚ATxiedēW	cJHY4]Z3pufAUDH} CSs@ FJg6pgPM	2K޿k ukXɮz0)LNrǰ9:)ʯm]/p\+zתa-+qU"ǎ֍RdF
+68*>֍Fׁqĵ}GX<Mdj=-5mkPXgi8~gg{{`okg!5(:r- y%D"5oko+KNorEoNiMNO66c9ic;k1z-]-85G\yܔPnqq;eGmmsG4֦^4~mNg>W,V7Wϡy|RR~#%/[/9?Sw7- fEnWG	L_FjAB7dsmusdJ(EpNVVw̼񠗣TjץLz73ymeA	,M=Bt
+yo:#/_v,6Qd ! 7㘜]b*1|Ψ֦^FTnzlA5L[{C,<8Es|P\wsZw'0Jah\*ZNZ5όS1[vMAq$YEetް=P:[,cAgxr6:s=zѫÔ>',]IP8dɇbҔv>
+D$npv4YZy57&*PU]o6}<裎&q7i_,+Lr$7h>Pe}ر+0xË%HF1jG;op3KImLG|Fd[]Pq	2.x5[wCgDF8)*W2(dQޔ3c,!Jc0\#0	 	 ׏ף#*clbb`I43Kd&cU"U'ԒP	tjфh(¸%Jo- gOJ,5|:R(a;JQZ"9=e:K(GW~ IYXnB+@'ǃ7>D$vۥФC۪rr&x>(<w^ [LopeA]w?	`]t}o1&P/ S8.̭
+TurЍ4?i\(bw7Tbm穗r-&zԶ9kM;x#Q#TSM^fwvI~&xC	R9r7Pwr?s͋yVLi,ѬfΆT9du
+,8Sσ NmToQ:ꐇJ?A/V+It<lR*@nj|u˽i
+m,N)'DB!&K-f\[)xv:nDC{nq@nPN8BmK#V	W]4 AvWuțFY˼l]Ngڨw6AnYkTB[2.&FJIr'>N[QͫeG9[9IVʽ^ծ/u:ڮΡ~N:KKh<kzpUmLQsoUM0WLI(l8Bӭ^*u+J\6(2f W |*yofx=ŇH"ВJ0|+F	.8$D<%V($0h@Sĥq"A  H%[nPxƂBɏH,AƇBb
+-}-6 	$,>""CǬi'Q%*q}jPe\ew*y'*DHU*4\W-e/ފ/9Ri>AZ|UyEvgeMZ6kܹ;8pfιП3"g+i<1bۺO[o_+X/#\1wTG`܇ȕ~=<AE|0'j	ӋMpϲ̖ǤϓV5چ'Wv́'AP*6uIm5Ӓٹd.#GYK-oMcvEWV5dѱG]g;X)4[alOkWrRu\P/zQ/I%|q@(ZWzf}4ﵹ7iUDOr4?ACt)y4gowWZM6R	*s}jA!ۤ1v$4PB!%ޡcؘ͠w/C0%sӇϯRб<ʦ3:5I	~>cg$RC\WOz<f*@2X_t|yGn)'.cc1>oX7[9axߣzƺ A7tޱdu-r2cy?{xbɰ|baקּTr,.v\#6B[Ή4k(ge۲i `:`#ŕLwd³W26xuWjdl4c<x}gu/Cw]zk9>H	S9lziW_o6ק"NIs M
+t$GRq"} EQE;يMu쭨TX6DbC?
+Tpͫ^mMli@"5-D^oׄ-*:˻QһZC^^2ˆ?QjgD2|_Wx1/!JS#(LwE1%ʻa,mՆLKi5K5¶m(%2@ٖє9BrV_zCDÞ(ta{kcD(y;o2Fv)12Z婿To1GeJ?vLiI(7D*m-l^-+b%$ez̲!JAolw5%|  Dih9cUWhN<Z>o晙X@:PN/PǺACˋ$5s(^숸}{-))Yyl{b\TC5-8ݑ:iY`;/Xf#$}y{!ZںLv3THl4dYc#OP]֐zQjs6ڸZ|	3Frt+^YCoWpPCC`S{q ,J߬4>YL ,k\VC7p[42uԚ!=staOOP/GLBpimK?9$%G>uQ,|5L 3K0lY۷o,z-H\8Pk|'䴫0:bURU嘞<8BOD	mZ]yKvE`mLЋ]c̭}t!rߧyh]i	jU6y9s!Py2 G#1Û0fy9P;'&%FB+xUױ>2;?lfgbn[I$Y;D&t|K
+ozϘy'H!kOVB(P<MQ`vZC`n{0zʤM?$C&0^~`/iT&vh]Y8+xE=vŁ+{v0opI)?JawG[kX?=Qt n }N^M7V3)œAo@s]&VTjQrDB8^]͌I+G8N؃]7D8d*DrM28O#Y!p _ϷmMڋ.=CXN=-IEcZ:b8Yl"PxNlm&)l*0hCPw΁@YC^61DG(,־ˏ:mPa]Tjб!0>i%h0yuмID^y"{ DQyku%mu
+i)?bҎ=V}0]K^o1F,O[_Zlq<qai|0׏Qy@mB<ϡ4<)S$jI>gYX刎O=R0az/<6ȳ4ɮ L uy2e@Hw<X6XKo6Ww$NhH&]4HE{A(Yc'.y|GDB#
+m̽yato {pPIķ@N{.䳢 
+Tq3FTFQO~c9цa
+tp"B2lzH	-ڌScI"K$1*F|!TJ|!9ŧ+*I%S]$`ǴTwNRԒD`jT
+?sQrsE~%usUxd͆Hd%Ifͽ^Entk_uP"vLDj҉ΤT5P)(0dz#b9ܢP \#Q5Tdw RVQldsF#X)N\RA{[?iaj>縹l`rA5חV8v!5!*,Enй# q|.!'b2juYb:c
+\4TWugTaG)}aXE*+v&S4^Q4ܾUu8.4|*ɱo0깏BgT\2`4>ƆEFc}<Zr	Q}K{j\#FO)O`:TLR6-c8:2w$ūP#KVIYcf{*%Q^Fxa7&p%eVahO\ӌc䴍܎E2&D(5B~+ǽ-YKjOd	c=7I_ϊIKjQ,B㰱2X6X..rRN3u3@*$Сqm Mx@Ӫ o`Xpc7Ƹ 3osei#Ҷ_Vlm)Q.IidB($;L"B $j&Wۙs7Gm-	SBYKԅ]ȶ ͺ#k.h&^:.KP,&S-w&W4fU\0Pu-wL'͑]tR5\DӮ*hrat>6׉;T(pm :M6
+:vjͲr7`[nWިG:20.-o~k9:6ff{A+T#H*m3&*wϛ6^uJy&9zZI^~ lvB|lji:g;kv(
+uKKA+"]ˊ*dv=馓qˬ/XԗJQ4U1
+q;	{{xJbPuwE~!6,*αwq^qHaJUl34|{^tsI^p]*> mzw\RB:I"1D\{rɺ"]/fhi;rЈ}k>6fysP&!X%ijY}a&!Df'YN"Wgm_H_>]AKA+JxnZXP(Hv6Ng$k-VǄ%ovQCE>Do/8h&x
+QĈJb(ɪ<Q8ثR_ȏp)HXL1#<oIc<rCj2ngLyKM|.X^הh
+-|&魈v.O	@9+#Ț,<FMLxnWWpjg6hh6ҋg򯝉˴fԹ^OAʆSb6n`	a[7u]K#AEWGQ5q"Tqad
+{]fd!}9ur?KWpLTJ?^pY8=
+8¯N$
+UGnQ]ҲI^e9!2W7̩*_Wd.+.KW85uO{#
+1WY}o1!%БNY!ړKcdWtwY<>/ƪɆwؐ7؈wјFF9J=[f!X+%izY}cf!Df;$qH=86"H__ $q4g-t uOKA)QEϭXP(H:g3$kVPKozZc;U?{a1v'p/`ZI1⾣:OҲAʲs]We\$nRU>[l惆O2R\Sg+Km'-vPiի,~]
+oБNY!ړK}dWw3=S6#Ǌ/ncc17aP
+Eo`R.gofBLdf=I݂ߜ퐾$%ß>uOkA)1	!gmPC[
+io"j"A	߽'`QO'=c:΅O<LrƎxwHg	g>G#uTzHس=lI>ŵ)㦐>cI|98=oCH'6, \qmHG3
+jl/!F?tdVgF
+zV(>oW_W}1P`GN/sc^'ˌ\;~i2)2HirZHwmidS6YV^w`f
+ϒMeJAEw"ߎ($SթvߥGGa\&\tD7̫D}mNV:1b(TmG2?^J;K4*ϝc#n*$puÔ|54|{jqT¹$^O>*> mzO\RB-:I"1D\{rɺ*X.Og7҆wX|4fys?vvRV(I1uy%&!DfXqg9=7gm_җ#k[~RMO@WD^HShPBU*B8u^qH>3ͼ}o"Bƞ(;}(pq2'Ї_	H V9,_K)GѣYOLBgSY{.GNp#JwXօi,"px,;ʓP0>2-*,B^9Ehvd<pi@th/f?f-HV0vLB[w7%J4w'I%sZϘB^y[L^qXgD`MlUy0bl3Ml a{
+oku72Esx,]ӕqf6__^+ZҚ;ME#ev0.7mY:vNvΉEsNq5gF۲mb}zs8p\U\]`Rz8)Q,}#A6/L͜lKW>z1SFwc0%|^:Uޛۙoe_KASԣ(yK⟜(h1雭ug{ޜ^<c.jc?K#>.Q~ЧL$C(=n;$`^88oJ\d'67,)ֻcs-IלذpVR3QTI(D;ĢzUi觜ߊtNjDҾQ<=F#~%nۛ]ql%6E"V%rE'4rYb3/%N#V7|vjgƚ9;Oe]KAEWGMEAEGA٬U.[B}L87Q
+*oWߞN:1b(TmG2?^J{+,*ϝc+n*4puÌb=5|{^zq\¹$O>*> mzO\RB-:I"1D\{rɺ*\.7ʆwX|4fys?v&Ag+y4w<\b"3y6/	7k[~]QKBA8)b%FE`BsݥT49|3seX6
+_oC鍪~>ޝ>0 SQo<^(E4}2=<x?`L%d}XD=E<sc92|i(^;-LZT)cm0E;:xQ>֩4>r`Ɨao1^:RlI`bWIjadh纊԰d2|oTU&N"2]N9Z&n8~W?/uOK$A)QE=ϸ:ʈ"QLUz:lue<嗗Ǜ׾"qI'l8ÏY8=
+8C/N2Ct멭oR$`^d;!M77̩)_??qk2Rs.j_%@{
+҄XԛG/޳]ݘ3gЉY!ڕ6Kcdgjy{vmxO-/N؊1+cXsJ0cϔ%-fX}Naf!Lf-ˁ$/Rjl8ko C<I/o]OKA)qWD(
+zHMOSv{dV߫zy+z*_|W_pzpQ$*1ޗe`󓀙.u::qK͌D֤/ox̅2bmE+b}Pl
+=bɮ5/jlE#ch)!:I"gcHnȥcd7{t3[2b~q42byiȴaU1.kMι7<*O ں$CqF>3t=;7pmN1)NMzʏԢJTB&I±]{67H̜gg_}Q28<{KgUꈙ6)?K
+Y=(AKA:qe>r3
+/i=hM7/0_{jIR-[ %cVF+̅vo"cn^iT$)qj-%$%]CtGOfYU>| Qp ̆YňKV-3 wXR@d>%	(qu^&lP)FiGu.xr6VM[V67xX5Tnp?|?5 Ṡ1﹵Qؽc'N[~zgΏC}xk;OKjXqkfb'>m򝶴G\s<H?uf$NOp1mBߓz90`MӾ^Vmī[k1WL !Ǝk|@
+cY,ٸ/ڋNJsM(䨭"LYhYs@	|Fɰ@00E{r@jd֥@3C@"U}R,F9+B[F9w(r	U%e	D(*kA@+<m,*Fx2}[<<.U=)V1䆛,akc_F>v:ĩrP7J#18qRD[JJO+ z0{R1֭q,2OJc(y-ue_rV5zϱ\jXҒi}n5Lꀬ<a0bIut=iŏu~]w}LYY*'BYW˓u{龇({5ʃɞeFڃY`e7Ō$S*v~xe?kXyo$ivz6i~lpwR߂-<Z2sBO!f{;>DH_?}Oo1s	5K(*R[UJoUwvת׶Ƴwh{=}-2C^ExwL&
+&2
+c	L,Z!oLAQڵ/lJ`ǰbGh$sdGpi1gc>RC8
+䃥K#qYsIR@Nl<TEc-SФFk%CާSBӐ
+!7F*4Ogj_T	־q{KY{1UY2(}hNA'yl2P,
+ݚ:XI̍骑"cR~8E^ h=gKlIvm#V]^Fy?p&Mw{i<ڬռ!OweK&i؝_#$.Ƽ'g8I(uqJazwmOud~Oo1)B $(UڪRzK#dw,@Jfϛ{~;+j l,d1w٠A~T&@i,	WWE 74ڙ[6J eB%H1t?8.U>cDQ_L}y;UN$)(*@;6(Cc
+ւ>Mjk4R@0T:G=U@X4{_o	մ!ب 	;/,`cIY#hW` #UcJi,a.JSI(]$t0U}S{5ȐnT'O[.fZlx{5B @V>>%Zx6k%Wav7$gRi1wǥ5(G-i܃WqN`|'+"a)Pw>ڙ~hi8K?FLgo "GGf$I]IŵOOBAo1CF\IZB"*AT	)rYglǉ*v{Yyo:u	`FY;Slb0g>|F->vV}KYNuLOwbx#LX_I4caiNH[[;*$XaL]]
+W$eZEVۢQr6
+#%3hU3seoG"pt<{{xV6h|E^;hm,"bC};3vO9YG͍)<L}?73V@:Sdb7 ˃Tՠ:NV	W5un~hӸlwh	69>>=㞭~WUX7žYg~;ˎi4~5g_gW){6A0s vQKYVEjJEę$VO@^9	t,U}{o^AQJ~Sx7'IV 6:Gp9|-g: w	4ڍ'E)0RcxdK6hKUze3DT"V伡pM\ThmO[[-Q
+h3P
+ǡ1HIƀj@mBN@ptl>m7O_"(p epRĉW"P.n:bEIR`jhlB(
+8AE<If	*oPVWPEVVfde)!@j㌡s:t_	 @< -J<C,I{vyҪhg̲Q9Dtօ&>rð~Խ$^ZVLR}N1{3tAү= 3^ײ|VxOrAr~ȿGΪԵ.a^߅Oo@sZR*4BWYϮfgwց{㏾P=(2X`xn?JK" 7څ{6R	an="KbY~<8*Q_0"8_|yMyS)6$EhG&8}vR"_&5) Z;G}U@s_w	U!ة 	^XH	.FЮC;ÌT+FYR8էu$vdLV	L-VH^Ɔ?TX,dU!@YǑ '' ݷ[$V	UސQaHZCS;w5_veNwK*``AiZNwTNd*:uh[h9s?Dntmx9#U.rtdFjw܊zp|hI[ޮyAk@mܘ^k;ubRjHK!=x5wYPߋd)N&oyZ|uDƑ(X[}M
+L	uI·d~|!o+Nz]e!>׊V<Αɢ	ϫ]~]<>sf"V!xǲ?6{
+%L*v5H>֌*;"a}@j":8Z>6MTۆ֤8QBiy8YMc)d1Jڙ"7/
+(K
+~ 0L:6kdcӞOf-IWi^yrwwx;gۭ	>d7Qӗ>mY7USȻ Usw=Y)r1,~ n&_7mn0z= n^#;* (j# ƚZYDiXr^Pb7-?̎lc")u+afy2$0e#RHكW\WԲ&gc?Xn`ƚIC5M5:/Q
+0v6Ut>o=u]0J8#6E/U碈R]A;tPIw
+v7ccTԷ3J4nYt_$EX;/|Y^ٲXrw@bOj$
+bR `4ELow[-z;la8KV]§<vs.*Y=ۋ_]<^oG@ٚ֟T?Kn<XeY]siJjT.ˉ7lving_dc?So0_qUuPFVi&^&!ǹ۳04>%alyI}ٞ|Sώ$/yk5덓Q?>< @p/pg@W	ԽscV%C*{p4­;:0N,;_8#f3	1?,liX[tJh89HQ8vgpP@nEG ]W	&`
+&s狇ER0ls11oOghQBb3q\}F{hNR	aQ`=<m-¯ `l-XHVDQ][Gk>NmQꆐ)P-#0,n	Ӧ
+mc|.o0놵@4t؉#/ݦV/i}+W98ݡK+"<W&3FW;{/IvB)ŏ T<=7L¯e7<p*MeO/o]J$AqFD٫3(z\Xi;XSU$)A|wq%XsL<3W75_ダ<b$1PIeHz[S͏e1s̸H_Yݰ$|G=;2ʸƊXˊrc[PPKvyQe.
+CK	ЉN9CPtE.%&&c	{wWOWөɱ&C/{GdJȈ睝iV)E1S9Me| K1	RҎJٛf6^l3|AO1!R"M)
+$*QnH;xUMio{3Khzeguω3q6`hgD-t$3rSYܦS%0.=o, 	\_Lk(PX.qLK͖B8bKpZQPh`cPqQShhV;!3\hlI]S$ϔ;~JЎ{h\N;hXE,ƆL-D77zwC f	;TH'UonޢKeE[[b1dbu4^,]T f=k{hoa-^OQ|U%*ЋU]O0}ϯH<U u|U!14LBsC珲jON4qy{*H981V3jF|ΓY3x,qf@mA$VJ+*Rfϥ	¥WߨS^dRxˈ/Péi.TP*!
+``CVYMFj%B8
+h(
+D!X&E
+#1k/USUnؒXx!rf0fK1#TXsBпy8Ӯ@m<I('@	 lkR)h%wfkb}yүu۳ܨ!JlprPH#;qL
+]JΑFeB+'rRi p)qFpb[D0V;j'ikld2+#qt&ϡOљh2-mhs| 3a	t;"io^xF2<;5ZE8y&Rct=}=]1ьB쉣k4~;72qNᵪkc=?%f:	3)ޣ::jc&zn_|Du7R.-pN_XpE&/7U%#8~aѿd=-E-9GXql9аMC]d^mAo1+ޡ$jq%iZQ	PE8"Ew6klBߑ>3{3fIL+Ϫ_۠hB$EvbHZ''ǡ!
+.G	0c&FIL1w´˚ϱS:u(,r)H[1h;Vp\'6	Β1$t1¿-<7IvBsHN	@ղmX>{QCV6OvivN7**ڼi].d	JRg4gst˨X}b5鼍?I9ge-zhvHN |~uOo1)ޡ$*?FETTQ	)rmfƉ*$%{~WosђNh&maOx=l|Yq ";1ܑE$#?;S\94[-ݜ㑖N]*$}aL):oIVk["[Eb	/%ѝI`=+!t`OQ	$kg9r vx?xWGiX[hYhQ-[i*	>KgD&a~MSD9>OQMǊTYXhM 	f'8ZU"o6't,{t%? xJ]g5W7GOז.VdG.dEM]NAx!Ihbli\fNWBnǶ_?&}Cʽb*m
+xRPKÐLjH52=R]8y{M0|LH#Oק!VbBܲbRNiSnnF
+>ESY%F6Ўns,u-8Dn
+Kxw{XOEw`vTPIvb+U⣝󹿱sf/ي_}Mo0<i]4KtXmݲ``d&KE'A:o_>|Lyї2RAX+-{O0M&Frmt ,r^"/ݯhuNAhR`ȖɠC,Ȗ]F1hjbܗ7t|".*,[[-1
+h3P
+M-C1HIƀ:ƴъl 6w\hga j5}_o/lCJaLveRčW"P.n;bEIRPڼ.cQ0(q^[Ax$B7(t+o"+0V?o̢2NjG`G%%  [X1{oi0=INgĵN&l̙f{'W
+^8̸	u+^'V#O[+Ђpi}ˡvﷴBG?Mo1+|*R[UMoiwk1U7,%3~Q LZ`ۃɠJ
+PA ^+Gx~S
+rA:aZ-݆Ol`d_8-.TR`Da=L|yke=FKlYaZDq>;)h藠ImHdǕrޠ
++uu6~{P6Tk 9IJ"krnYUaJYL8Է"Zv&IӁ`QVh%J'ueLQ!@u, Ԟ+M}⦪gZ)AjddH]z}\үS Nwmos~7na/(lhu4kyVc΀VPY8gFlpo|$LrtdF+X̀w>g,{y<fOR]k1|_1~mPHS{9QYڽ俗;1^$ffG7ˈGۢȂfn.J+(cXAnÏomW4uOm:$ϸqqRq=_-S%\qHq,#xiIޟ`+o&xM64$xds0;5Y^!-Im=D$g˫v:TMZbEW-^`e։IaM:Ӓ%YVɮIluh"k(#<#O ʝ5%EM=(FgM3SsWJWaEl(k<y	%V/wdM<h=:טm۵g][ImTQĭ_jer8y˂7xGw>t_mO0sDtQnYV{X5vlCW߽r[^~7|I-:γ>59%4AEJ	ʡaKO¨Oа϶~g<:17w64ZzaN+(cQ]dkMz#bQ>ƳZoٵ^,W2hy
+i$GP^YCI8VѮ7>O~'QiWc'
+^T`|s6$H[PN?1bC˒$2-&x6:^L,k~Ș-{|+8KsX iV0b*q\
+O0
++Y6ϛ ﴗ#m㹋}z$ӒԽ	Nõ\`akNlR4=)Fbsm̴d=#-򱉓\.UEUs~fޭ7b8e4Aahw+kvBOk1)ޡ;	n'li	
+aV;JB3J{%[L6g)B4;X13 QV_-XN{cvU,*XS|=;ugeH6qLǉB8ЖJAA,3ۧ1a^@;A.1O.$$;ߗQ5ԒbKs:кĒĞuΚ@K"Çx<qP/w t%J&^,ߣq՗YKxSޞ/8hGԼNp7sC5ߒej[1z7	nĸ$ЖBYw%*̨n(yrqf5tttf_j)d/4Q^*)>㪛33I1LHP^wi -;/E*&í0.{Mb|9iՒgS#L+#Y=	8وsP$-ѽE`0FG:@CT5WDoŏ(Mâ7lO{zlEؘ&JOt.5iN:WmXdiMl3 j[04MC!IKȚ06oɑ+N@uGnW}jAuXkCb;
+1$&`a4[23LFVC4|U]e4Jx_ϫ
+x邢!޹~|sZT8%l;TXF'XLpE7̍SN:5rr9dN$؈IJ9XGCEG:OQ"HJ,$BtJt_WhuH:g9E8v:ؘx§oVzjvͫG M#{(&n  <A2UsD*ȣh4VE ލ^ߍcBY\م.ꓢkAk1P҄^k7Mb\hC!%BkgwE#%ȱ[0R4|o-1cLo)_ǠCdEbH=Tnӷ$gsJa4E7S,_m/pR$ȕz\1sʑ.D"Gl`IJTKEnRG1xeSB3Ȥ]j}wnvmH-)/6ki3|x΅X3y>oᜏUr[GXX:Ł<9 uG_7ilw4lI=^aEٽخm@ٝ.߉Ǘ+7en1z9nf"ڢ@zZWHnP݋I>G+CAG!y`VH7]_8\}L(^S~9ve\$,4"LxHb~u_ut{gZyTICrIt
+>G|V6!d6jYtk@kJGb VB>-fDI'f;]x^NR4lWtQw& \%Bhεc?4s!yUy,mh$6Da2kĝRW)wPEm|:SOL%dUL3jv0횬	5ݽj@zP҄^k'Ml\hC!!BF;kJ޽#P|O8\&ONj^8}g6!PT;77pҳ{v.ڶSuґ	W~V)xCI-	4Bcۓ;Ռn1n}vfp igKbXi|ISǔ7:ڧ)PklvМXC4k9/zN7/
+(%(YIk=+K0SO a8kb3Z[깬>"+I;rD!
+e-뵎.gYnVO?pLV<>7~>c*cyqV<@ZuwxjUT}j1ݐ&ib@
+Pd%lSe׻.1Iuo4~Ϳ$PF*/%Oլ8-pg4>|F2;#aPi'~p#LXÿI4cnz=k:#MVoߨ#<O\lZ|vGaםFɣ(PGh`=%M֨|dww\=<4d>gQW˱K1MK9K͊ WZb=+q1SO [otl{ilHo:uQF,%^U1+%0ׇ6KC-ċ݃i<1CIuٰ})g?N}_W<ݤ6~[n/_Tn0}WpXizv]+vZ`i(2U$C}ĩӋ,^)AR3)^9p
+^t܉w)<8A6߹K{-QeYA<  (ų.TxVO,׆s;Nc;i6ƴb80)HkԴ`KpZZI4A\N2r0RRxHja
+K9pPۂ$)GF;!_/
+Pᒑ[n2w+փ\V02tkm<Zx߲{Gp֋NNC5w)W۳Мz&!Jl]5V/ %h0ӑZF36-Ws4EӔhg
+eXWLM3-*+&zxS8鵝j,qqR=U>^ظmkW1qVS>8xƤ򀫀tl $Fzg!JZ.k{9KemF"(~Jzl/iZǭjnjmoQf	̡&JpTxFͶZiǇ9%\D>❬pD%>R.,'m~4UIjZ3i|TK]MkA+C!vn>qi 
+E#MP8vM.ѱTxVYw~p1(AR#;IYaޥV0f~"H)T<	q傥y̜rC0[%XCA'RѝT`#1mtEAT&92)%fpz|ZS4l$Æ]Џ_al4>uK	M<pGRV'K3_ c&/ldq
+[-Or`OgGh.weOO#1XWZXeG$f<hS'-WBŧgM~HMbW{/y3vgxŋ!wxϱ#S5;]7B_/)&^iKW'xWqG5K_(Db[&q^-nw	]M	a@˲3$Ji~~:4iX+hnfQU6$J 63~IZ|΅U1{Y%MsJU@oF*+ JUtC!Qso%dUL/h/u4Ղl1QktMkA+C!vHz|RHݡA	%k'`sGû,}A!\cG.lEuv\hhcbDC!u_{һ3Il]0ǵ
+&duÒTO8dIGV,m\p.n v
+!kGj;۬ю)!NtQڬyr+f;wZyXOmxOhoqM>5fy];gV(a
+̰~rY։OAcؓw eShG	4:۬9&%v}TIE~;FY-Rk*<։HxRKk[1gQMvU(cݹ#15%ȱS0tS4|sq4ǌ}$I1~&s{1PЇԐz|Ioӏ$bg[&卆a4LW*HjsR~	yI	>qeży̜rCuX[%XCA'1jIcRk庶F>,$9ALxݻY|_m6aM](/oqu+gs'a3|Rpbb1/c
+~@<*)c`{dLߡɰQ7b`w'G㏦³W7_5Mv VMo6WLYH
+8ڱ&EHb{(`"J*9JbtJ-Ɏ]'k4oFsK `dNsZha8p
+ ,ȘgJh,F+#Ac(kh%3
+Y<YLoXK@]H;^YLo9W`*(I}(CHK):o)8* TMHh5B"O/7[b2F,$ֵ0gAcproE'ícf3[HRq.́/Td{;UK.\"3s4F~p/-΅"4ݎ0BQ:.АP   Ef00#*h8,2f΄rËpTÓzbͭ*O{w_#[\cǜxl)DGh\܏ܭ\/ g/
+.~ 	R]$v"5X5HQ`Q;Cun-=E;j+4|䲶'0=Ȕ:=Gxst2m85fVt*5KE-=m:v3Dy 3:eK\*qjMOd,j٪SK9{V|^	Sr_uF-hcA>
+ljjib[kK	eL-8jQH<׫1
+.FBً<_Rls3Fُ;qc̘.U";Zm\!U-]CTK7pQ'өD&	\6e7cC	[c|~x[];'-vw#ϴfMꌫ׍iΤZ!|z-ʣu?3UÙ&`Whhyd7_Lz	,m#eI:yt=ZSuB9>ZȅB-&koO0SI?ut\XsȾP>9u4&wys{!OsKf0d{hag8v]*,$B"93:)3-S"AK +oX!(d'pΌU8W̒`
+>cmup9\b;pf1ZBVdĪ mI!)^uRpTADЪDfnʼb9wJ26R GpctbڜqlAa>~KPѸ/t7Pܹ(Z
+t  J
+`X7%Lv4)3f>x68팃2{3[#F<0B8nSvy_JS(ReEަ[Zo`(ф܁5HcMZñoH£}4e.Rܢ(ܴi9L[ZN,(M`@+(NW3`DG{'Ѹzn¨Mk}jJkـ3-zp\BƳ#Pzc2ؘÏvckWf-d4*_Yo_?YxV"BYbNns:z 
+\4iP=ӁЂ,ߟJTkJa2]^}q%ð{Ge)j1uHz4qi
+EήD#mJ޽z퀛ҹfO3\BE6LhV.>LgY3<:/} xA2Yk;o}Mv.)J;Mf"EYsׇs<ڈzJep\MkO؎(W5u1%f#]GўsskG>G
+di3}]Vbc}Uxubl	6V4^`Ӓ$c~ޥUXA[% ԭ;.'#ӏ腸Ѿ2izW鍎O&tTNÓly)LqFVۃI?s*'nHOV6oP&^LKّ=: ]Oo1ݪJR"#rwl<M2~>#mF?tIp\A"!-cmO,D/v<m	kh\υ	h'Lma]ˎn.D++,*Lи>SʑN`OAG;Zªj*%'5FБ!p`5$@dhz?_<>-S;7[
+ ooQMPT#ޝ+v ѩc\"Fj($H~+q'8 bp+Q3֤˻iڏXysn5܇Ͷv,|vK_ͫU]KBAW*tu"b3]Zw9~8<3.fpOxz,7xw^LE,DT)tDcES*g<noHS\0K0.sʁ;kMY
+16{Go9
+&-Oq?.jޝ:SG=	j/.]yImK屉edKGe֧Li:ZW9rP|Љ16IsA9ւkuTO0~_q:Teh[6!$dKsk{KM$uCw?}JFYiy|g'p_CE
+ۚ6!p%ЪuEbATx?x1%>*Raθ?GF ([vV=6w.UcA=i@ra7aC,~.60b(ZXIg]ه|YFJ#*ܸ_mFYpYYb[{nⳠ-n,2? LpQa`-1lHc>F	DϳЯyCx}hH\xβFKpUt ~go`cw.H{iX;dg6OSNK4p".mVT@+i6px;ۙ-IQB@G6nح~qz̋S8*&
++ŗho+B6/>0/r!?EE\([R9D0d0NV^&g5*ߥҶλˏނfK	dWyQcq7lat7*{mfo4kZt{1Kʬ> 3p5UP`_<KQkQFЂw'84XR3ֽIm·Jػ(fØA`U=L۱uRMoA)W )j#CHhΌl/U,M?<yUm2Zr:dM/aȌE0A97;'P!f>lsr_rH0Vp~,qXrK$s<#KA{'d6xGO 9BVZht`\PbAagp_=-fylU	\	Cj8SAx%iZ q@J#<~Umd$%7Gcqy`bjt D3%ff(KgefGХǢNM  .LwL S{z5n{A/7hJ`ޱP]YbFV[UVϸ@'³sF(ڢ4V	Za\wVNfT	VNKw䯉b5[z'Ӏ~ }[3iwP$wk$^{Nwwz[TKo7ﯘ*+H1z]N\AsglVffVP>zH}ߪuc2ZeW!If81|*CnJP)p9<fo"/ڑYN,沈J&tK|Q,FYx5\q'
+]Uf2/86#!tݿ.FJJT1vU &*p3)@<xv5iedRPt̢f>2pEJ>ۯ+/nvJЪ^#mΔܱ:}_Hl,E4"]*fXui1 r<"Xްxp^W(A^7URGCZK<44Mڐ~<tQ5l,pM(5Y_jd̳Ԫ/&-L9Xn)$ɯnhsl/0[qҒW. nP<CiF3>FvG*fgXw
+	#;%4i=8S45uڜzLdG_A+?ӷd2#hmDܵT_:49?<հpIAnԉO+XVMn0kCBiTRU$0l;=)$YA+&BmHLS[;R+OD|њy4y+<C8 @{nuk? ?{'c{c`BןG_ }Qn0+搃l1zuH M"I+A/(K$卻3\ᐑS+[~qFd6N0cr	*	ϰ9Uuū炑>{CMZuF	h'+apKy,B7Xu"dְW7!<GVL ([_
+VL4@͏T؋Le+.1|i.,1$٧yH-BWEyc2RTဍVOo Zx"5v<kΫZ0I|Kڽ,λ!otcM_e3ni%WFvJkJr Dxp/mol5Q[c<W񿦫.t9l>wÈ
+5S:ڪ´ʑ^
+NG)M:]T'9'9$}HmOk1)!Ibz6Rz
+Yl$*KbF&|"I]4iqlBƓD89^lZa)zNH2b{Fs41={SGOKV,H%͎dA!kEQ-yw2\l(.<2F׻m˖2YaE.5b&vʳ*І5a[yUO=>7q51	+ MX$h{$-)3Όwi^핡Π)c&2<9:٬rJ_Bm%ɢ.{RG?΃)KKz:!RVn6W̡EZ'EC(41Sb4S3ܵ^EjkK<>μy(nشX;ָ^WpkB{wUQO_
+ `S	TzJ{h 6`%FxVccW:x>Cy*@m@[OC^N21XBcBM{ԬDLHWEѡ2OA:ˠ@Q(`|`Ewؒ_th!$Ye]j/`5E_Շ?m>ۻ
+y;ų8e)&(^'cpp^2+26)CgԖ%mU60.$ܱ}gVh'·@_3]w)Г][AZ9t9[C73R`.c*,\٣ 
+ `U4OU>8ZY5c﬿PBMc,SGFA90)ō{t#+ڀY-CQ7e)^yL]zQѩ RtN6DG^uō`u[Q1ϜkxӋho1@ȷ
+oϲ
+tp_<|!`c΀q0#$[;TCTRF϶Xo ~Gc4$}&1g#̋/L~V@-c">:Ġ ߢCA>')\i!ޔ(?ufvDT^zFeQSC3 Fao-B"]3Y|s@rN%;duʻ&J7M@M5o7avgwCE^NTrQvvNOs;sxZ1v!_RJ>!f`j!TXҡg0U 洃Ɣ`sAE[Q?yI͞cSckmJx_0\,jJzt;&ӶZYwߘ֝,P{hhZsJ%0*@dGqFl`SSXNU?xZ-tt~TY^^]s",Gŋ*W_MoYjc|U3MѲmRn0+/^u ]GM-"I#A/(Qy̼mGW:$Jr/}6J].UFi
+p3Rh[նd2'o09`,t4"T8
+3W:NS05պfQ<i$@Pfc}%XYӃ$ah=?	ƥ`E@A
+>K)01$,K(I}|Kd8n}i!#TjHFUNSk:& 0v1	)oMbyLKo"Ϛ]F٦|zc^K_kُtw<q7fߌ8a'!Y3*tw7y*mywzN;^%n4kC[_&/t%i7Nv0ʬݹVEAO[A+8'P(*T9~žjG@)GrCXy]_.Y)14J[8+[Kow"9yGBy⎥ۖk+<A5!j.ɵۿ;R"1GrzV"?ج?grɐfq^<gxөGFtDFF7xhdB,dM5RV:TJ Om~\SS M"qMiwNۮQqOo@sdL^iQڢVmT뱽ʲ(߽@?s޼UC([w$$VY:+Bו}ZbmY)L޲'xb}8ZE&9|"(jt!/6#KU3]L+TX@neE9Vj6&仕KBY0Iji|y(wȌaM} Onң8Ek=*\`  g͋"ӏ2wt椾W!6?m_6Ť5mnSE.IRZtPrpOkI(SJsR~a忶#?VXk4SCi6?"79dK~;<d101B:Svt!IF/7.6ny'ls'X[o6~8ZJI]Fc(Ej$Xʲ.xi'Y<w*F$zJK^'Foa0[QKHb	W("YK4xg#gCt*ē>\(M	Ϙcp	CC%]ZH+($2eBf4@(_
+MC({xry512hx 
+B60WJ2@DuI*!tE乸"2tRe(0:4^_ߧ21rm}sL<\%LꏔZio?Pr]#l3z;qLx%1{[
+~{#	I8N3D*NRpΕ&Ό_  =`4xD{ѰS"gr6cR;'Jc6#2B] w!lHN\X.Lϳi<Րt_Z[tU/n-x9|隢;<)A3*Lu6ncKU6j0?o^I񠠥6dșj@t/nGN%w$B{O*=ZxS;Z4tV2Wi%*M!5e3y$)*1)Lk@J$-puLFjlfh4׻Pg>J׻^VǌnP,gb8Uk"j4ƉD{5.,0P]sE#^	sfI&0%]R'iEDn%K!"꽵(5oD2SƴM"?|x$PWS*>8>ԣ(Kҳ]75zb,3}nc*7&,?~4jsXc]Y4Qt]%RV
+FDFY͖=pR!t)/%DrYO*Է̉k%
+Y%-uy2ۉxOoL8Rϳ
+^%}v*y5B@0JYlfѢkl?mڎɨzv^;\Nz~\iIydվG@Ёlʔkr9zG7Q_mu%vE2gn^ݎw㐧nv۶7۶ubsZ$6͝+ڢ3!\s}XB6CGcU7n;^0mebmy]Xه"`oNY[Iu8֦K]9kۙٕȱbYW\~WջՓfz䓈5Iuq=7*7Cχ/O';1vN(Ok|n?g?vVMo0Wp@Enצe-V(v(P2%MC KvK#H9Ov,>$8cxșqf@mAfp-XIl[iZ |DDm-}rk|&2"ܴ*W(GgD@=Vjl;k(
+D&uA,b#1[fuurP1;b e):F"PO#A
+4PXUdE鎮X,?3Jb~:yQNa,|%bXV=" c8e댔f[bhu<&]רȉyסWU:b_HE،*ȫr|Ms3
+Y)Sڸ2pdQ*B6powmhTI{\Ý,CX~0*p&X#rm}"eZ'g,A̓CmIIy"S<Y1qbC	cs-w p׶EH	^kN+ۤK6	͡
+&&}٨^CHjt +7;[׍NMJ ?JX&{j6HuM)0Nf#;<X'˶hdgf5Sy'e>G$C.іZ[$i>K6JOptP)Gl溾?4C53ToReuB:qq+OL6[CR'Lj-o°VXKg0sFl%a=݃vNΠ>Vi7'V:v.V5>۳utt_nqG+KAO0OCRؽRV	HX	΄X8eOZ*rHۤJln͌sÕ9I-<+G{6J.	x.U@4A8StQL[yZ2RO-y|s>i<Ĕ"&	ܸґuְW/%ܺGVL (SX_	V4@X(Z6y],4ƥ`,E@§X*.`k/	曖/#*
+NHS)5%I"ֆGXGI"*VUDWTဉVM# 71m`BLyL8Q4mЭ`?/Շi		k%w]HkZr2{T=a׸uQ4.l)\`O-ğmzk<wL$k4ªXj%§!UY;i^c|l9=fD@Sey3vi+[{U`.g$+2[>NN<\Yx
+V/(X?ڬ-oث%+D{r,,mGQ6.m~6NUPMO[Aﯘ[@6mQT/겻Q5Oxx񡆊}"ᩚDomWY/!*QQI}|02$nag̸IbAj}:<I-RgXpUCR7"(w%`Et/,0!%zc9+#Y,51)9vzpV,aK.-`ͼA<×`ezb䮬Ə̝-ZęҲd;[aqo J1~ȾK.R 'Z ?@٠\\bc|L_ݫT]o0|^&muX}a֢Pd:HH'Av6L/㑢|q
+J-<&^I~_i:FFpW(\iEg9|-"~y.µ7o0?3VY1,q%0KpA+Z1 A5ժdIz!/yZI4LnFfN ]x	RUa\ չ08OAl_yd	WFQI!3p>]B5d5މL|Rk/v	ӸA5  G#
+#-: V0%5~)ٕ< *'Թ5K[%q@ @#R<Mՙډk7/WZɶb_JNj ͸5RiHu6WIɼ>v}S:l[T;{Ӱ}	PIVe*dN-YpII-qpH!J&5wB	JK/!1W.i3H[Bt	Wp(̥0 +>8 lsZaOg@MO̍Bf_SE(|+)-{E}ǿv\#wn+I<&Ww%-+NxқV>if?׼\kc^nMnsħN	
+EX!ȬxfWK)7imOk1)Ibz@cjg-QYYP݋vhuͼ==-?$бVݻ颚*:A<	eEh݁o+&vVQ)>)⬂%rxu$(Kcl<!(t01hv1sPa^݋;A.1I]HIqCs}s_Pc08srGZKa]"ϫ@{Dh)?ħGUe<eRn~Okb+ fX(G*/B,݁11ޝG4Z!vkb̓-hOVΤYeUU/7%GCͬCoVTW2n_M/6/ENAuB AE	F$x$1L/qvf2OnE]ꯧg8Lr{ӟTA=jdSFΎyʧ;>J$<?`jJ2eL-L"̲ϔrlZxj*W
+6R:(8Ddg:s/uVo9X=K]U4I6,IU`D֪3JnbͻRNl79PCQW~ Qn1+怴I$*Ph".M޷Y6Mvz<3͌={ۈL$lm4;|omBc&D͂ඵOt+l`dxϞiXf=]ViMQX21fi\6R:!aUi0S;k'MёN'K~uy[V:iE5VZHW>̆`B|^Qn[aѿTEyb62U8nZpF	r<+ r֠t;[C<ě;r|*7LvI2=|"dYi/zQ;B0Z|ao4C3;c
+ 0@XLu\On&d=QgXC>_Ok1Sd$1֎84$CYZY7w1%褝{N?CȀqЊ|H6Jx4Ao+L%XF`**pv+Hb--|È47]xpPFc@ih-]I^7(	an],V$J2ԒԲZsA!(W
+ᡒ=5XWb5d"2#X8[-  {`aӽO)RpD1ZAJeX!*Ά*Cs]κ\S{|t)Psf c'ʗJRk$;w}MF;/-qK>tat
+җ
+;SwCC"<8LGȧߎ\K}Vi3ޙ/X[O9~ϯ8QehVIKSHز=k{h_s\QyqC#=%\?ŨwnvaQHb]^,DO.#^Ї#>2
+>q<))pqB <@p-}TB	c5r@BTBXS||'e@T0#y% "]pB ""DZD:DJ4|/.g'gHx`̂@$\֌98s5rj+ȍ)K"]t
+\#o'NW3cuRph'b2`UQv  wwÚ4Wl".8f;tM4N\>TDǉn0
+\gTC%*((4%MS͊)2^mJZ9N`6Edh&&`ኇOzjaȐg6Sñ :5\{껠6$WyScHmC/MB_"C(| G4ts=y2+CDG*M?ZYL|GŃ:ɣ7?:Dӎl.#ʅ*
+ DJTB|ؽµoz_PfzK.zŶSybilc0flK-#QM_J L+XsŻ靑2~Ll#kz&ah>ք2ֻssv!$  
+vkԬ?0MeX޽Ai*ZnUh6K6ͫ}ބep.]*l{\-oTjQ=͢joyYi#H3'S[}klS^ܤa=&;1UE65+8k<<w3QWy}$vMn{V]m;` 6xoT5%puy
+CBCa kj%ӲSf~i%l
+l#UenLdϴʡ!1;GIK5$Y'*96PQeK5u<NrFF9w/
+B(nCHBHnSr`Qe)oBj lөv䛢=}	 GI_+J)t?#&q,0w[X(|*=2XKLT-؆Cu W;7Wk(Q,m,eZZ& l@8e8wy聯3[YTO0h'xnb53Ao^{	K{5<Ǉ\1nuF&	?i#33׈_=rb!3-4x6z/fΦfWoѥn*^Pd[HgM^7ȹꝹB1pQzVbq25}
+;wo̾zc
+GT>o LaK	[s)5)JR,KefҔ9Zu-68?Qi̓iU"*\˛Ẉ[-\U]KBAW)tu"b3]Zw9~8<3y(&-Ӎ(z,$wAЄHbY,|DT9lȉm"Vr2k`Ik+l+Ę%_(Hjúr>gzBo%!dZ9P"Y!O{ojuN[
+ .]y-;$%)<NubXP"Icc\"Xs:(Zp_Rn@+@DBӢTERԴ=E]BQſWk1CG>xfߛړP0g!Em1n{m*cCP$+Xf7[2Z | *I&/M<R3F$ap>XL@P흐YFĝ'O 5B}TOhk4:F0(1ލ XT6iy_泇ǧ&(^KARx4!mTFXԊqENNje*fXDZ7Mj`A'3k? pkEoJƶI82k%و8;_(g$ߎ;BKkE-yHu'::"zrҤ4?vrj:7(`Mٓ<5g+.2)$(A<N	.H_c}oz!#8wOP UZo8=bX":(Ѣ`ys5j>?xIȸU^m8n`}]UPNAW[@6Dբ­*g֛1ބ߫&~~K
+j]a4tAцBb-31e'a~kIH3WC})yIjgLU
+A$,{ˢ{Y`c?Wv2BjBN(Iam]5[R4AkqmVk3|n]5k!xHbԹ^?By;N,99I?y7GoƩQ|$"׻>j+ǔG'A"O^~UK#\\b{C?T]kH}ׯ8-MMkR(iHv]J*a'2#և]Ϝ{=]ikf(܋&{!;ONJX&͌*pW-DJ#!>IT3`FzrZ3B.JW) d3b2#\E(|]%Y(0'C,a#hެoC(Ua,ra[.ʱwq]̍z'a.36B<Ixͬ=5jC+4aVbU NNpafXRe `x<>Oa{*I]4߼MT<2oׇNV?Nը`4ґAeMtvZҞ][lA0=o;3G͇maY)>]qy2*}w!ȻcT0
+陸wfcD#[ߗeI.,5f]#
+p5ilMB}V^Ϝt/>{ʡȳxn9Z'dz=zXn(^tOG7Pb! 1PFv0xee{Hc'b܈Xq߃3!\/yU{#g}ΊHh[I}'DQ],LxYtڛgp
+Bx-qv1囬?P\vx2yg^'}Ro0_q<@D:(˨VG$dKbͱCHiG'|2p<ϣ$x)u\Kbp9<zdܒEff,.u1p+kiH0/=:o0(gfGs\"1:XmBUce@i7tZF&a/d:08&\v<VVTO{n:2՝6:j]*vt
+r;L]UI満? `$IO#(<d2}Ir'dGŲ[UQ6l`]q3SQ_4#/[^NX 0}p旐k7q5$I	,$Ѷb[akK'}=
+8¶u-u:/U]KBAW*tu"$b3]Zw9~8<3.fpOxz,7xw^LE,R>=}@
+&T"O!&QOrD4)@PaS׭"'c*Ph`(T6>!r`2fYwXL)v$Ϋv%2lϕG&҆%e,yZ?26hUzȅB^@"xca=r,͏TN@+	!;J@6T
+!hCzXv֡VNb;{7c-(pw$WS2.F{N)by0<j*nFUBi^S=	_D۸Ec 4;Z8
+>>GJ@ZD3
+1Xք5>\x)q)|lJ'Iw/"-
+d+$s.ܣy;2/-2^D5"3 ^
+Ԟam7 z-\27:Uh-<©Q*D(sxHkrFgG<lφ5{Aj˥"ٶkFwqk 6xEek1T*mlgix5&npk>P}u 7,=gXJ"|]¢^,|q@
+F۴jq(d6`LC>>nei;9޸*4yzUֵDq2%w%5%g#]w7o`Ɠ5R¯|2L(,&PMo1xvWmW҆UTcmyf"ٴycn>Fђv*Qɒ"jZL5~#XFTI:	J]a<S%aܨi>[]֊*/Sh"(|$%$?1w=`}Vёb~Y~{Xf%+FkE-V$'MС=U^m҄{]x62-
+3~4aUm
+ 5;8=|2)!\hgGhZ~F{Xt,RF|.r&QpV1qY}:w&HտmHioKz/e޽rQ\L
+{2nmTZ4F͐%JI7%)SW[o6~8RX2d{(4K $EF:R$Gd!y.<w>^7]h1`bVTk_dxWpk.Zmx>T6|S$Y
+/Dx),<gFC<YLs\B#0C$P22@º[ErLɈ+9-Y-ǝ{{ڥ`;f!継sq*x*!d* _$+j!ܨѨ.!+J_FcJѐ+b+Z9(FvGk KʹnX2c3V-a_J~x!u%øAh	f-ܣXW:gKUKK \L&peƧ]P,GXwfm̗05zx!8whdpzi%]Gxa^-GqYeJ񎕿*w5~3RPmkht xvIϒ2J{"#§{!=DY8#pk-eσH[Ź-"ؘZA}E=ŅڊBp!B~ xMEYAKnqXQ	0IVϴ*Ac	Ǚݨ1V̸8SWvsĥ?Nڂ29lv˨H A,'ejIyKB~*q4ؗ. bסAa.?Mߗ{4bLX_CS7S?Yܾ6ͻ3^_a4/bg8\d	,`[;v՛>Lzf}O:bz]a£oM5Ћ|QV@Mq_.g5d]L2pڳh-`y몼iy6w/t4e5$h+bmeh\r O8'&I-WdX&pEQ;au%Hthhm*uSce8>ly}?=lXдDRd~OU+L~r:I
+
+-6/ n`SɴZZ6q+	Rޞ~Hcq*qT)ӧ?d>"<='(w|lDkTۣuĞn>UPn1+v`$vA6sr#!$8F/v0OPⲆ}"ቚDomWY?M!*QQI]/|0*$>OE2kbI~>mboH-RwY=pUCRBPnK6ފ":EY1wEb3Ĥqzxjf[RQ߽6Zg.3k%ϸ$e=^d\z3eƯ6w'R8c)9 R~Gl::~cc(a% tE<78@5czFg>oSo0xJDAuVCjX)2y±'CvXClߧ'_zQŘaҒc}h~'< @bWCIk%8eZng_+d	0Tlfq\rwaX#07n|yqA;+LZF1HPƀilRBvTaM&緑jLJ%Qr
+-aCRլˏU4CxїQXAhB
+Uق+ w:pVCO>"CԈgiJjsTl860_/,ZKz&=J\p]]Of0:^huo׳(c~aLa9(5KRw*k|Gi2 d7,*5B>E?=h{>^~~Vujo<TΈ7J?ϲGW;[g6>kDdUo8~_1ZսB˶GYiTGIqbձ#{EOvP7}3~͒b-iCݟ40DX	 ,d<' \g'#	A#x0
+/;pˌm{lk2K)xp%LsbZۜeo %\J[
+"&e$B&Y/~X"p 9V#pWoR	3KAn]]}G8Ngomf]Jfc0cq_D4͉mei.+&$O0oA%(:M"$Dp  f03V;wR9̈#ܛA3Η:zCaotHw>
+O]|+ȽqݱdrNa`hXAX&vv\ʨT}f>EG<ZO ,uSx2;%ٯvZ./t봐V W%9aME\D:)lH4^0$#&=j`ehyݟDMxB{]^~zaKolNP8+,3JG1<MĮLBx4p]B;.X4TF-N(Oد }2"}k2B(:E֗w+Xy!8]%[NѤ^& 妱4&N`xNڬf0( pOGc8G7	v;RU~ny~oXyASǋAf!,0/_RW40joORi77Y|1_ONH*A~#Mc5]E)F3T67(D<-.s=zT5@ P]k1|ׯIki-m}CXDI☒^t S(dvgg53Z|H}B֓$8M/Mz:pD[FFV\+&v<, 	|>_Ͱ5eu,N}<"(41Q^shha.QH]3$ϔώ7<5Ӟh\iqZ8e"_@OY]OrW̍)[}BAEXO9cCޣd @lvB-Mʘ' /J	 GTEWBEt&_ˮ:cj㦎Ϊ[=L;JVo6~_qX
+dyCɌdA%Z:K\iRQv5@$w[ww?x.K31LOFȼ}4=&ى'r5 cڀZCʷxA1W^$5G\k`3jCpɴīU~,$|5\RmU&:1DJWQ7JIֹ5٭JBrd@F["v~B1Scq͓un̓l!eV-F&KF630uò!\o2bY)_ѥ-b9|9W'H0"XfrReQq/ L[&ˍmneoA8Vyul)X&v+ >LZv^_#%<2~`ס0&Mǡ
+**:BzkgS"BgM[{yao/n'L[I	qU7Sg8&B0=o@5ݪ~໇ҕݍҋ=tPhr-ۢ߼eVbdkR+ն_l{HUh*i@B1:#t
+|R<NsOGKy#ىI1u1i/k>]ʥ<~	G\\Y.Fp
+GTN3](=/& Xkr`?ncJ#RFg,ί]\EL}40ju%UO<?HWǩH]{<=L:$4x>^3.ĦysVSU&w~ ?mxə\* ADTzqh Eu-^ʨ>j?wNe3gS4/s~	+ci]G}ߧ^wT]S0L-EO$3.ԙҐRs6A}s~l]\;һÒZoUMo6WL+ʦc7EE],[D)R xb{AK}y~
+b5j=ddr*-@ڂ璿|Zwep%@7ik
+V9<(7jHÕ9&Ur |XM 4ؒ`g$[+\jAh^9}Owo̖ha
+nZ,*`m	5oTSűDbEFFD}"$i%C/֋I;Mz4jtT{Ok֪PԮȟz_IӍ<ZIc5rG%a1Z-?	 |ׯ ՚%1k<o5u=NF'܍&R;gHଓVfӘL|Ho'3AfAXu*xFa\PQBڄ}^=k[j7pfLa{辜vGicC;|O8
+q/E!HX4d-UXuI/Mcp^ij,ژh%2p\Lۃ~1#.Ky5IG'((WmꙞ惘4eϋ-0j:i-3p%T2S|MabŅ^"LsxkGzr0͐jZgRe<蓕CZ瘧JIL79Lo|l≀tZ${}r܎ܞ+57}\OǮ{{vlQU}*.V%C!eojtX?}PnZ1+$B(-
+j$TE!!c/}ٖwUhUOٙٝM'lha[=e7ÉFܰ`ρl"z"Sᯍbx_"CLm4]fXΊHL
+s)@=\Zxi*r1\m._Q}*UN9ϭ֏U_L8Zg9{Ǒ%u\ו&ږ$[GxnlyJ"c:,ommc\"Uz5ӊE/pUp~ FlIiݧ:@d=rsUM9.þۭKQtN/A껩xmT:-f>c%DUuOo1IJP
+T T8&٬k[3M#^D
+yoJ[P$<Rx..&DFPCnp׆GtU.{	0cx)f1Ŝ$8_ּ7(#w,Ѹ.m\" (9MgY>e4]sRFHM%2)1n|r_5;RAfq]֗܉g\+_D<%GfuznW1?pbfH^j2>'T+aq P$]M|_[O)ҏ:K:Iq2zUMSMaX<9p2MCƼX-	9ٽ }TMO@ẂP@DH!UHhǫwШW>%3o{7HKF[GWw0h~I,<B&$`9<bgԈ6A&p#,\2Rx:	.m2Am$V@`*#-&	\RWh)8* T`Nh5#YnV\1,LM\u%qHa!g/5#(Y&eW(Da$/]_ p>՞_*jR1$!:ʵIA"GSuV<rQ+3j~Mί٠D4MlhLCV*^\+.sʓrgS<zqWNʑ]nVGUU5= xsذ z Uy0N.`E:"&ӄ{.w<l pBzIjjQsn;?%t٭a29G>Nw=+0NiG%zdS}/{I&xtD_4FôŏMhNa`~^)!qбB9x[~&+I~šmF]@E'O$+Z9&-ix9ة}UҽeVmo6_qVrfi2/
+m4À$$Fygiٖ%CIu**HQ*a1vlI/*tӏ$:F09H!JXCbf`eV#-;8VC#Gᘄ_F'n**4BoB fK5KcV
+[+R0=JpOwyvCs %ޙJiUG%JHo]$jui陁V,&scyI
+,J6v1"spSqfRtftF9 p$,}<J^eI0@*j&Q+Tf߱l#^)-iրU"Ã4ڱ%vl`Fk^==HnIhӍhi7=S?=ڼzuxC8ȵUcL}7G;#w]CvV2RKEAq/)gm^ISt5]sEap4nHNt;*_ZTmPY~2E=1j/[Ƨpdl(3fJ<+юr*!xc uڦjALUwt\C)޷:*3, y6m' 	k>~Q,+^[޾7QbVGƤ헿H8<G[n:>&wcƝJQ3eyiP92\
+4  3>-|ӄzEݔ?I	1_5qr1ZI }snC!7w֑ѳp
+'?q`?qұl%y*;if¿@#̯"lr^8v\Z{OZ6Z.ly:af,)4Ϳ?iN:y=j1q7,66@)ѬE=݆w3T7ibJs}xv.0r&uOta!>+cB&u>Mx97jڸRfA"7/j'rF>ә#XƢSp.r)t^};xG-b[8',oi$2ʻNDVC$ܧwiuԸȡLӼO5DC槵c8C9mq*Rsv/	CB"%KED(ksP+e._mO1ߧ&>[
+[mBBi׋KM|)PZ!N,9] E.W!}ꍓQ?>A4"p3nsS랼Z]ك/ |,3'8p.0p%z80qC4 L
+j^ /RkzحDCd5p!+"
+\0Afa
+k9p(l%i[(1@rB"_ۇDIRR@r^I" -
+a+[p4L0o 0a.d<؝W+GYm'k%_2x|RrJz"PV~NdjE&{>.-YxfGlʑ֊e-_X2\rsG.yU|3QM.񎶩{v+.BOʚHZRXh	U1 [r*HFҊ8s(\ɸ®b)w(CK.t#!(3,*;ZmbĶGX]@-%i#j\RlT(mj&pL:Z\&}5[qZOCW=YXi减!<ՌeZ7T^`7''fi/{czNTk0_qCڐn#nl1
+9U$MwNF!5CՋuY_P4"`N{^{(A/RAx\wJ/4:zrY`a00'U~ZefX	b-,`.+LakrU.`дƀܺG-!h۸7(aqx?nW?gWQ*5J0AkXiVyrm]˃̊Np~)s{iQyX'湺gkb\2
+3 AvUp+[F7գD6A}[-w)t#ѣdL>pAui6u(eJTxŞZ\2~H |VA2ZSړ9rW)St
+(W?=>~[F8=56548X\:ʏ?Pc{$; v\V#zVMo6WL;nNf7M mjlRidIbH+PCy%rޛP?@q.CHٕ|4;)<eB*sirSXerg#Wڔ$י0)P$gB˗Y	<⋰N
+X =L\̠69!@#R8Mx	\yqsRI&`ra'q~~x<1	{a!	1yb(FJl#2AwW|4*,R1GkH*٧^lZUf}/zr-$[]{ `\Ƭutffcg֛#o7;=˝ u\c~;YwbׁG\30}gr'^䧏^N#dVI؅-QZ*L@d 5iFuxp
+3<dö=*YUF%u㲴p(!sLhX4}*]͏%W>fYhTO%kt!m׷_((΂ohu-H53AlVLS^?]х=Iyfhpt>E%J`ATqQقc==Wc84	=I	RRÁ1AUPU;E"MÉ&0FΕN0Z0GD_Rc5|ÝJuZ}R6U	l<. BWV8iQ'ec満3dnD8R)rHQ7od#/'<n։P	h)2ΪDuviZ\,'F'Ƙh;-Vd
+a<]JcA;id
+ZQe}%5@pF	U{T mOo1)ĂHho)JUBv׊ TGJx,O(H[ŔGae#@q~0CMDi,D_b]=fhw>T |dGd{&bGy[|'ڪ(F9|x䃥drwfۈx
+RZKzr[EqC;uuw>bR+AE&vYT`7	̩Š4a]+^_LL[#\G:v삥9d 0+Nc뇄Oj`WBU	6:ZQ6NnlwQђwӝ}pBK-n歎م^ަ~tl?{߫XNv3Hy;4?3x?o,x7zUW6N:c1΍_WU[oJ~$ۈ@HiҞUOEXXU۫;P)3|7W_]\AQdKf.q c3̀"ڂ!g;P!>JUj-D4@Em\-&iOS\Nb,#CLkQB8z j8+i~l9΁v=3 0I]ˤH}xλ9'RfXOH)i,@Exȉ?̃[b;+(%	yenX,~2J]}yPNpF`?5
+  f1숆=|Ui#aNm>2}$T0>	N0V;e`W2' <=uШXkTa&'_,+, ,T^ tY9hSϻhcsdFJqz9K?шrb8Xo̤FBsУ5#%,_j;Vp}T|2P*Nғ͵܃wW1
+Iqk	b	t"㳁FJ3QMȸd	׫*5\_C[
+4.:Pr>Lvc0|s}Iʑ*{4Z0V4l%K'CC//Lh>Ʌ"'Rs%e ;pf|WCQXV;cdQ0lܵwHWS.{i?y.y&y~~?!U/ܗ3߽Mkyi6X\gCRh1mE=Fç9=AO1xT1!鶳tBiv1w+xo{,3d6%mrw3Ha5{$
+=ͼs1aOY
+f:Wzl[tPƬ\A2W\΂/1CnWhφB!pc>h<B82b]vzc,?-88Hg&by>PI6NU*A(`Ms<o <M0kg?pveکQEPNB1+xT`$Cģ)}6}㿛=LoϨ+4(*]Lr81ssz.9 [Qk42[Ww	=LDmO󨢛lhkxrZ̲ϔr+Uxhk	uܟ{(:*xӱ=-͢;SoG[Pq
+GVԈ#T"M*:[Y1CN$4 m`{+jg{jW*MЉ2}Qo1WLHk%*jUEϷY5^P^Py5̎?6&mS/
+-K5|l@cj=]#;'/b+v4XP106	*7|i	Mhr`\yx7@"ach}-3+&lUDmi!|5APyX8&<gwQQhb|w ~Ӎb'gF	JdTsG"l!Uh4˥.
+'-Lp}]#w[61_sy,{z=5+oQyoO$;HfٹWdwžo_tLzxy]BUMoFWL7"In8uDp\+r(.%fR=%Q(ov޼yg9$+2/~e ʤT*i lA={,0J+5p#ns|%3nR|n]s5Yj6uϚfiMvV2F2R;a	
+AK<_U0	a ʅ	.8Fur,* C)k<
+xQ2,yYMA+a<b1¿ %?	Ns{a.^`iؽo;%K:_qa,&Z)8̋qKX.bz{2utQ"]	ZĐܑMT+?QT\.zv!!5	tx۶	BWVM#Th[1N&.^I賤-_]P++>':۫kzT#S.p޿wǥmF3&`ɁŁI63F*|&;0A$(&`5H2V(9^HM7/4#M!GN1P2p'zO	IVHBs6*2l49py}v'^LunWq7$5/	J]`v3J1G퐾ǿn
+hM#A%:VkZh0=EB)}d&YsX{|8 $LpU;Y~3IXFQ{mp!煨#1]{$u)ѵ7+]RGˡ7]cT:eW=m^Fk)v"gE)Uf>'
+eaT]k0}Iil`cڗєױ-	:%!ĎsΕ|]'")3[2Ӓk0.9b"c"68@(5b<F"L,\1#q^+fI0	0GW.tQ+IFrRVJ<M;t*8J dLH(NYbݟ;GU1e/MP[UT[$jfjQ$2:] 2'UwdV-#|γ,'J7ORp p3AȵSڈ#&YX5B\w3m6"grBt|dh7['[)p%-2kER@=ԯdE֒qaA	ݵР[}wzF" Z`"+'TkL}U	Q;ieGc F6?:IwP:9zo⹄[`6?7oApu0[2x~;rf=.[KtkAדoY5.k(E%BGo!G|62bg̶}>kΣvuOo1."A?EZUHɍkű,5HZ5｟G7Idf3(DyAOel'Y7X4nGW
+bӁݶTg/^'bi4]W&}Zgq:+bD1y*B`abvV".2!lZaE흡	.l"?kq1<L9wF:ú|dI)slL3ahǟݏjsyW05>2^nE( `aӌ0EbBxf\]{gah?k좳'DrrZ0>)Fjѡ3XfVEu9ْmU!R7i߹%N/WSY0~²!u]tBX<EeIȉ/Zm$+( =CzbC41Kuڊ;N%C,xG;{X
+2ɺm900k$X.qC4B&ij/Kdh<2JfNGMnyP1.C#<ʟ0Fq	{[D6,/"#*NHRЃN${qwU{-i3	 B:P+T4Vh ,f3Ad#up )jMCu65 p°n:XM
+6ᵺHq2kk2S֛5>)>N^C⏄l,?UULw3O;.6/I|$`rہNG.R\vN;2;v<eȩy~RMo0WP v5Ini؆a,Ӷ0Y(*1R7>}Diֵ*ZIIr_)eUj'تN3H+zRMːޑAxޔ6X
+Jx
+ܸ֡uc!SI-{K-B9LZI4AR'XY3Qx}}\>ob$[*86D:Iʌ;![Ak-mde{q{.#deRv _;I5>10:^?2  J$n5)HWԪPlv^=$wLr$w%[b[G.Q1#kYhxP\9.x>żAi>S@ȁ0k$g=5ͯFVӓć$uPUrAb8Z2AQƗ3PIُ%bp_`gUuF1F'Kxe,	E=ipſ4q.HV>h~~Un1~:pB"%DO=׶{vY;$OU]^K+7\[1&BTˊ2!=]̊Rs=s&|H6"Vray_x>ǖ+mGPDM=\q8wJoe!<Y%&BG:s6w_wj.*V<g!jR&vWRd#M1ʘIN>&Ei7_;u
+6YMM9>2R uRtfT]nI'mZ<[qQr-}MEwxUﯰ/ckO~~2RMAϯx$,kĀMLkOWS].$!WRа<ɦw'/M|Va/h}`DjmW7k7OVXFۆ_k)=X]K
+<AhD;QXhN#:x13|lE{2/)0e}X߯>=F:2(v:>ˠ9FWzΉ#]˷2EUhX7ZW ٬a-QDh$ZgA#Z
+BϠL;t@Q1/g!$OQEuA!aך[Q.XAvR03&4C#$
+~_:O*?_ƈy(~^>8R8kf=-Ep\^mrvӑpڸڊoTMo0WPv5niXݰZI ^HNE2G=x j2Zd߾)i1KcCP$pט53HSdF%'*$^.
+'ǅb1Glb*	E+xWHlWht`Jn bM}M?_T4J`*]-`cٷ3VAiFϓ",k7[\kL[w,2RD<?3 .ѰlNևZwKSÉN g.'&.GʣF3~dpl2MjoOۢ<D5<xZټ3|'̱(kâq>gjY:](G޾bF(-9X*45&#w[ƴ:yƱ:as訶U{qKu\N,Jop8ܔ#X{S6ZGCA-ab'!:2NI+s6!TUD_}(U4t^czmSMo0W!v5in
+l]t,ӱPEH:Y0Rb'٪L=җW	P0g!UyfX	q)Ƈ-e#Cj{CKE{\|,QaC1@{'dV<'nwht`\ix7`Q1&?=.b$L%Q]/`cٷ:S+4S$GYrtb02N]t7[\V1/F?̒6߂b8  .C^+k^\h%2/Z	i5U{BPaAG,.Gn=x΢Yߴ{drܯ/jr?i8kϋ	ۣҒO*:Dzn5ᖝ_*?mobkoc[VȬn!aO9eWj7XַQN@<!ViT{ϵwUޑ%ۊq&7Qڬ<<+^$1ƥomLO)]h`Z̏S}TMoHW0EPKAlcu6MEѴH#J":c^lىӏbș?cDc.dV7eG1˦g*r$+
+>6I=*S(䶀#vEV/Is%vp!C26Ct`|	6xeZvXvo6U={B;|5JCthaE~u:(@I֤hj^BrhyyӢDc>6߇zGfY>lDYYgD]h1C5JE .Wa(Tȴ2p6v3˞	gSCB얎,T=^;Upjb(}NAŖ hQSojM^|Sߓ֍qAQOpco`{Q;Qۉ%_3ӣ'TTA~țIT}dU	z& qnc /j+amhҀA^`BPc_D9ɏT32MF
+^k^u^/(4	iL`bT|IE;=0,\-5Sѧ]$8lj>C.nG&_/a!WʧX|_̲?EA;n0z9`	N^kuk$$AS+-M˕Ȼ%ϡ(o~]Mޅ:$m 
+-Koq6*2RX}mt%>٬k@xώ*X"&VUI!hpG1&f䃥B;ajso=CjBX}LO5\$Wy(1,Hڵ>.7nU;JS,*3RC7	ڗȣ̩Š4VFY̚[3 f[bV	:sznF~MRAlVhT)˥.
+7Z}^0<<]t.ؗӎ/N)J|Iv?]}MrD Ŭ';/{Ot9]̽zÿx-=lgk=1} SKo0Wp@P#ݵntmXN](2S$kĮktE{(!Ca옔	JtItkJ#( Mx&Җ+R!	\AxNGpSX	Bs\ˢD[j L&5ؒ	ǖ#Jq悕5GPjaprv6ƸK Sn˅,޼Iir/2b~߼HE j+HnHpERZh#i$¯ p!dK+/':>T+ْM&TIڤ&^?OUc3XXP3}ԟ
+Y@z<!?uqAg\rQ9mx0\]qY(̻{;(!_J'N:jPԦq NrAv	mx>)qԧ.aMv.	"bס޳]!sHKm'7YcZX3t_~8T!exN*υv*0z]x[0VCW{\3]YЇXG	 ܳEgv-DjҼÿX9˯ߥVn7}W95},ՉkAZװ%AqG)rJ{AbM H\ϜٯiB\2Y#}iK8AAXkM?K\toDXxB$zBc	ΘQx*p1%Y\cΨ<8Ou*	SpjC+m&LJw'-GEB0+@*VfyLl,A$(MIg#p) #&|<"(#3Pj?-,nh%#׿青Eh ηRĊW4b-и DjĖY1u%fe%3]u}O7m\vM/@e{jIuU(J
+^ȵ"k2n/>꾏UZKZ@+e/5s#tsBu: 8^y:Jxy.b.;zùMdbBbtcjLQҕ9yTYjc1ü&Z4vvr)ٕfiPjN1#0,Bh|T&eV0j1`fj4W+<L7enW(S: j#q6anX͌;	!?2h?gI>F832<ώTK:3HvcRM5Qҝ.-3ΑOץq|!>5ܧ$Q.VW:S!FGthiPqQ2:rSHG'L7ѺN'}V&3\V0.?o)r=h6KP3$+T>a|@"8r9m/w$1J󟺦;^|KO0~r9fS J:eu9qX򏌔L)KS!Jo2)?84^]oXgeCdciAeQYOV>uZTŎQ]lug²kp¼3VQ`Mһӫyh/]V؟YozQJ׬e1#܋&kWÏNؑ?y52ZPz:2b^9Ój?V[k#7~8g3c}X
+q:l mRKȚc,Gg옒^4mw>$N Bat?d+VVJ#( /2;Ic@+ߴ0/HJe}p)+a3Hpʅ$N&!I-S䊄cU5*Jqʬ,m+khap=>xPYcp)vc`߼)Ii勑t_bA9Cd6eK[2بQcRȸ`}g!/"&HUZx4>"liUć<dcAj\nk d[Ap)'){VBj+al٨QmIsP.5R1F"SXcO|bptx$`ĂP+Sti?VELWµrhsO ,8x4*z4kgC	a"?v9Zg7kz+VuZiVg}E+
+))P;<U+Q#tl	PץH2Ej`9&;(̳ZU~AbӦ2K8qScXc ͢[&(V$^#S!L{Bf_u=Gf?EFag7;Rfe`U@{J58`#T
+tIមTjĭMi 8d81ly1Q;!8V2<p ٘|ˁZnbT`)l>|%&b=92D~C1λ2.%G=*YiSe.Od(aawg#/}QwPUݛR1tQP#k[=ȭ7\QpiWr<={btS;@9w\_gGg!)"´{-t9WUapdok0WCvHmY֮euc/sϱ"9Yߋkل^OwPȔEaCx&r`Z1DPw\p`i2{vW/b0Gv\iQ:H1 ,CKՠ6N<Sg"q-n
+F}?iu}&Y`Ң#&$G߱&оKpK1&kWg#3r:%ՆJ$Δc<N(h--j|?
+ L`CAPΚ>SG[[fV),
+wZaO%ũ|Sa}Cø,c<&؁hgrņK',Ȭ>Vp^j2W(6X:!}w7+1}iHO+=G}PMo1x(	J5RTEJ^*!eG55^*TɇFd*
+[].RWѰ_[Nh8!Q/-oNx*J[x'gOM4[滚7xI3u$0me"aWeAR9طvl'&($i{=?=̿γաF5	5cز\>N,TyTx%FÏ:Is$ C6F.9j]Τ(1J4G|\nآͰXJgjwW}x~\vopQ+ҋr7,+w_6;K9IRh}iJ7Wɾ QMk1ﯘCƎv\iB%T0+*KIkcJ{RN{3o捦|HTZe{
+wI1[jm:p5^q(el	?cT*Q/c77VA:Y8tByPOh%@жvQ;;7$aiy_iT^,6"b'HaceIN++6F4"\\o$* `<`[NJ4)5=뭈qB_ԡ}2ZnL`Άȭ噁RdhMd4i Nm_3fbnJEH+$|g'uhֈ`eOņjw⠝-ttb2LǠ% gn>N+~Un8+SK`u5lP7KFQ$f(&,re/ˋ(ͼy3C+( LٓpelPA18Ali5bnRC*3@g8dr8
+	ι]tC4 ƓZV7[_" #{@k%02ʚ186
+ݟW7Ka+r;.a|	>g[D6o%%FO4I*q)iϵ#έaOB?M3|Z5Jo	I  F#aXv6#lCՂ/zdMXii<UK^CgC5!1vp#l>%mx]lFui3PH0Pq>`nu^[=Wl/Kk5!V+yE%yP,~ZxX:EmҔ4
+YB([H \a7}哙krV蛬Y1ppzʋNx|<kBᑾ´?NYt8?=?H۝^^`\4Lf[R
+2ʬңa4Wˀ0''Nx8~x4NOA-d~cAJvrx[O)xVF-nፅk=oVh?c
+^~ڂ2+h;Å'f8>b6ׇ)ʦ&Vs>%}n0z
+Z.Y֮h  m@tDDN}A;TIh#hNX$2*SYkb!@Q'ot!@aJO~I&:y[75NGf!;`]CtALhJHBM=g;2|F?P3p=,TgLiv$$&`B}| GmVYMRܗ7yi#>D'rس;fJ)432=v?
+   h32\Dkd!ߍ@u/ExBJl(]"oBqJ˫7\\=__%:j^H"*р{RDJ܆^5kZl4,P?<o$o]TaOA~b1+*FDLń,wq́;6)_潙7{ln!T	1)xm_[ArI
+AX&\b70vS-8w
+lyf8L`sA,k,)mlnXBgN6J+sE[uV2EMR/{,N*
+v:Bc $ka+9oLRdO"-^H&p71LEy_:ʡ<Mf')CDWRtM/᧷ЏT	")ufVX(Qg_ ur)war}~?/Fw=ytNnƣf?
+ԓvΖyR?qT+6_%s%]{YtE񅒏wۂaw-*Z¡^Z$[Tn
+Jg0>9Mfаp	3$:UK#̅%8p~	w[ 4Ԛ_SȯIVg(hr[Ѕfw.*tOȗaƭ3tuBVp`ru=/MN`I Ɵ*դvA*OKٕwX1Zz/J$|GOOl$^f|ͱcj&-$TbVQSp*:~H5K{xޢ?Vmo6_q<T
+fڤN:#l]gÀuhdqHE@7bwϽ=w4e!!CZ6Qd,3x,L$ʀsv6rض0>(SI3*(7mָ!0gQnnd!Q"(P;
+Le	nKFks*b)F1|q_Wַ֔Kѐ1^)䵨E"kS8PKB>D݋/"QTk3h7;w^@_>oWkޏ'?*$cAokMGqr-_ɿBdDkڐ\1- 8;QMY+s\XTlGBze4X+=~R^0jɆ$1lJfsx:zS2z辧'[S;aktEЗ	4&S*>r7];6nc  Ć.b:ݏ)|bjр_u-Plj6)<dσjø<7BeF͓`Yn8M-IP<7gm{4YrDIr;BP9NK?6cmL-qx芓6dl71Lp 9۶vqO./흍3*I.O	Nky:nmBܢ܏kܙ錓9/!-5#~?I2Y?$97ao!(rzLOͱX'&o]ZiR'p}?6}t[ڿ7|ߤ3~mQw59F'M5эIWwFVQo6~ׯ.,1dxh#Zua):L&5c)ʖd)mEǻ;^ϒ")Sjeǿ. Nᯄ4Ĕ")2YBw2)zN| J 27*)7bp9*ҥ&K2YLD0VJ{H&A4n)qD,՚bYL#ln߇a>\`&aLCDl$`lZ#p!Qg#r2rHgˏ>>-?MǇ˦rЭ||']80XE5ԴRaC3EąG	Q,&'''k,?z2Ki1Yޥ{MS.bRcfheiwr1C+J6  OOfmխ8Sa'=:p%Q9-]U΍T#UJPr=GOji~> zD]0h F O^V\62_:a<.&WQ~t7h	^TTx~V4AddKvS5 $a-7Ŋvq͖-ܹHԃ.vKAe_3=|iΏNAԇq߬iMw{3]sRBV(Z(Źe;vg2\x7*7V@rV
+Lύ"FW*ډL"Gx[˖]u1\-ߓCb퉺J5',M1q@rvj-ytzv'Gs¥IE&Slo>O<cw2خ,m$JxE
+PlHI^$QRi5	νbן'0}QN/I-Ԁ'==ڬk#z"gٍ}þO0۲bjg5mRk0~_ti^&ZV[Y}	E>Hggeri'ןBN(OiZV\Q~&0K(8R^
+<8AS)Hu/ek-ݬ8Z ,QMס+TeE2P6vV<kq>6U=kp~2aڶs?&lU@aE9,%$]ELP&<߻eItǆAh^ȤoGs˟TLD~5,7	 q([۰wvCVث<7JtM㱝ƻ	IzmXjk-i_3To<q7&@w.>_N{qYvyeWh=;\ =ame5ls8ώSXڢM_3>J!>GgCorfD˹m==*o0PyR	r2$>3bpǃNώIr$'cvi}?TMo@W!P(i#*FR4;EU{ҠD!>7=}LQFouI'YAV`n
+aץ<E19|p)l+hpSE"ST0+Y%Z+lSX?DBtBP[[/L/`Z
+V.*j	/bC`B9r?$hK}I"02W[*bv-ɫ °F	HT_$"G5*dM9k`^y<[(WF;npVLzG6g;d)}~Mkkyɏ!!rAF)ARw4؀v駪fV#gQ=z28`A-Kޚ]X-Yτ2P~\>V?w_w1}ZcܳmNh^+ߛX^?vFjL۶ mW?s<Vetmn0EB
+@b4@Pq192$;3cBrUŗxvk5	~ٱ~̫
+E"#(
+!xo*\vvV_#,X$N6%@	߸gB% %IE?
+Y`c;'efy%9]D&eF5YG)|S{u^s/ᲟoD#y?W(i1!fbUrQ >Ʈ7_Oj擙eòqM3>5zIOb ^,˱niX@z6VH8l6\{W?mMo1+DP@iHHQAYblwfjSo;o)"Fjc~2V]&(mBb7ք=*ꉧ\ȍi!	9CLiƒP֨Y-ph!44Dt qr2	ukYBր6m.CRPH,;V>ｾ<=X?w5lt`%O`YW^s+*Wwְ_EU"
+lXQ[As܇]a{$|WZj?ߊu6mr]\k|}Z!@Wzz'U&As!dyt]v-YhOq\zAggY=PNAW!!؄EsDBZOafӻߣ1~ԣW5Vt+gTڮ]^QzI4T13=ԝ&famjKc)V\f3~pbَ+KMC(Tփmߋ")!|O$ޤSD߈Q~>ZOR`a:i/v؊EAJw|g>Cydd≭Qfeꍛ: :I@?0a'،ݤx SWQWERn0+"5]A(@AS(M˕Ϳ%y ݓH汣O	H[ŔGab%5&6`"bИg><6\bGlI,WRQrq&U	U+c/3!ԭFjk%ƻ3K*6w_o7&lUDe^*l4>5Aj<ΜZSJw{I1r:)#6NIUVZWqAZBUbYPvC$} eF1\k布6%GO2w}d䞞$oC,Qc8 {Cת=j"9:Xv,(h0.˽sio:'M!)=x!=޽GMӮ3G7GO}k+8/bp0۫>ӳWFGhRظǼ(DE&iW7U>Q]O@|J#R(T!Jrħw:!Ȏ
+{9wfǟˢDNT{]$'QrO	4snI<kvBg_	?Upl8{sbJ3#LU8iYKO5&1(Y-{حzRF](=!,޷E	Q wѢ+/bK1"%<nG(I7"꘬ޱD$=*\p6ecuB*oQ 8q4+;
+Zk֣(WlG#57oDyآ};yltG}G.kM֧W3q=%o*[Wz>aڔ?2u7Ga0Fاٮ0išsGM_ɍtb_'x m^h=&|SjL۲QeNn^*BgBw\[u[R#>*H3q04bv#[Lb [fiy#_)x1=%ϭQo0)Uj[i]`MO&׹66wwGNҴ{?5ݹ'oB@maBF˽<l43cCP$gpS%PGHf^
+:3ror?DTVHpPb
+	i%R"*kAoc5#7xw be}ELUR	,CaFJh}EAbm9Oz@J#ܔ"$8r9WG]dvwQhg(Evtٔ[U!a; ȇC8](Kc_:Uq PЛuGIsZMw,TiIw$Zzzn 5cԸJ;VG۟1-و-
+3ET\6Ͷ"ܚ]W6WZnhoGkjN	7OQ!l9`20S!J2ʶ԰lD[wb1Խ;$eljUԵ@-a~ ^E.ٴ}	|H\/^.}_]9'V'6
+ۓR8bϽIN#~R]+1#{NJkz~ϽtfYORKo1*尋B($JHQA"X*C}g{FI\g$W_Adr'+[Q/Cqem	µ7
+{%f47C?몦X{J0A,;ax{`OY
+BpaŨ'#u;wws0MP1bm-X;ɼĆ-roBRKxşm",wZSW$0;#Gk<(N#o@$Iވ>LAJLlNwCT&? ;W-MBOŚ(wA}oY,`Stx~1rc5?9;t.R\ѾS1ogvɵY1#[ t>UFTd:LpU<Ыήh]QT.b<莖Sj?\oܿ_vjo[VQo6~ׯ"qܾڱ,MA$P`:[Di;]@J%h1`_,Q}苟\ GaꙔ:$ByX(<8AvZyqmݖԲ`HeWd~|Eb^ΛggsY	bٸtC4 IK뀷E5]J,,+kiapo>=WQa#<W08$ mH%F;!
+AwI#zAZ	lAVΟseYy-{lkghrWs$$?_%z<wo	 h0˵ 0?E>"ZF8Iҵk*VH:nmG1Ѣ6v\+	P6xyxRrzK?3IpV5=ߎ+"iLpBl\'q
+{j黮pV""LÝi	_9kiŝ1uOwKVҬskbԧDnNnZ~NџI57e&ybNKߨ&I}:<,t(Χ%bOaoޚEs_[h8Ͳ^w1!-/BG6Ռװt*<Ui
+&3kUec͚GїoqЫ]z璘ej~oNxa݉[ǏW7[j.0*L=KҁIlt먲9Jk%,[x$V>!8S~_oIQmAk[1s6&mJ0v"(Ϯ)EviݝF+:
+MԄ}c%}{=]aϑ='+C鱎è/(-&a;ɄSd]yGﮰWcH	VzYXDM;Mx7X=~,~H	OzS'/KBM䕰g:OOۇYWt,p`V^ JwpٿV|db6>qCZҞB҆\?m`ec:og:Ct{ޜ6T9.iJL?l9EOo/-/TN@+搃Q(4@A*RYi7q+8"͒PK9j LZ.?edO/%( P XTh#LR ܰEb,.[ug9^3TRB׾栝Y%[{ %BQzӽfhB	9{ޠ
+KUsn8|WK5T+ V$%H>5vyyXFx*?DI
+& 	gJ5I  >\/CJzEf4u(NAҒv
+ݑEWo|[_s6׍! s30 dpTsHs([ImqJzz5ǆzV44C鿳8{0cFL=!f}Vf{09q?C_ai']۞Ɉ}%)μ"Q^rGx0*_XrG͇QUD-fj.ӬZ_.8&5R]o0}ϯ8
+|1TUIqnkoh
+Cd'c߇2 'mS7
+-e(NFٰ(%X<bÞS)>#| bGu{izU>SEql?BK	rhͺ`3$GF
+%ƻK*jCۆ~xX-TLJ%تĿ^ckW	maԆbPX*ߚFFYKYQ%Eokqm4W ~Z1\edM)Geo[uNQ@H,JBȃitWkk4T(T>zw2g&ɤ;uzQ%WM4<N/Ӟj_;a@$ɱwU|4yd-/vB{=W֞Tx&Ўt%=^.$LlҴ}<g }PMk1xvMkQ'!RBch^ERGuM/w)%s̼Y~	]@C*2
+-;9OբOL3|t]4qÑ;;­UX"m
+[UR"2&t|\흰xgHGhyM.k=*1]!XR:=gS0"Z`'1pbP)~?OY*F<ӯDQg[hM6S |:ŦW1g<&_g8h.
+'-0TDIN2[.xsuZ
++8F4hzOIY-.Xٚ~NBH\$ݻV]o6}ׯ)\X6y#7Y4.H:a$G^	d+ANEsϹ{HKf1vd{z2蒣<#×L8X	 f	
+n2Ź6OV<d1U?IDKNUxS\L̑`
+0G'Z85Am$zC`*YI[W^j!r)нCj횑jF"s݅*lTS
+ʀ<ysN+ʳH5:8MGQ|\{dG#u3V(ZWQ%s>
+ݢrPΖ,tS `6Y?譒h}baj|GMgK-#$ւ:ζ"2RdOms)ɻN:,&_JsٜS\!M*hO%ب?_E	z-}a5ioբ7XmQ
+01܅E mj
+⃦t1J/eEʭb&)nag<R5]0wGVx4=&0G$	tHe{I͙,pF<*K&$M#zK0.V~eVy)S<(*_5	 Gb
+SL)MU	pRyضz#aP=e-C[XrjdَKSs+zNU_l;͘!C3Ú?r{09zr/m]RKT.UP&nl7[arEZ=+!7)#܇W.vPf۲e-Li0zε"T@fqe!޳yGݹzʜCKpSh-mgLJaE=ԟy?FA[\3A1TߵV$`/q?&a@zsWh<-YXAM<?,:ղ|!Ԍal3RQ2cig^F^=
+2jA<ɼ:]/~f<DƶS8zC"LѿTQO@~ϯ0ZӊRc!	^9ql_K5%d@Srϟ9ˢU)-#Yv/$ЁaȍE0"eaf@8̤Hu!| 	Á"Gw`cbO.ʢD_Z@P.흐KSO Bbhk4:F0.4UbہҢbydu8*aR(b\Hų$%NMK.EH/IǾ̠btUs7Sd4	St2XFx];sj@i(d܄{Ib3$])cE Nf֢x[)A؞5>*Q5Qhc%mgJT{IvJLk@Y	!R5e	ʩqFԠ'@nVߺHfE${oӤky8Lkxoߵaߏ)犛pF<G~k 6'>s%[Xn.KW"nr3oF&tz+;pw/ hG
+sp8_i΅#Rq@+[/pTo0_q Z26DYnBe6Uƹ$Vm(';ᳯ>LC<gCKFpzF{!n ]	J`^3JoH3GH9Oh3G"a`4peHg%1p%ɈEA
+F!)xsQZ!e=92uɷĵ(ckf!ւ2 'ުpZr?lV30˘U# (,䙣vЃ w=l
+sJFAF${zPX!Sk*f=L	J^x83kݾN.e4 :%Jp'  w0Z1SAt>X1B:wY	GOVUE.8$^#WҒ)8%C{DG:a:r];ؕ6#mĔu]Qf9DqsXUj;"S,Zbꀭ3m$ZFH"v2֟jʜZ5#¥vpeG"^"]|(v0 =Xje |gp)RKmNYpkǭ2HE1R]^%[xa3^C-~&A;ZRsƆBRT*N}{)ovtY?ΰa71NχykL?w:!aų={\	wT?-/=PjA|߯<$v4!RB]T(=ݭZH:S.>j4c.͕s#{ڄ+|lТ:jGL+|R!ܗ(nF/uG>s|[[Vh""JTŕWOUЏ w؅X\eV(t<?<~=NRs0q͋:3|
+ouDH["%G}?F6!8i?-v<HQ)L ڸ/Џp~pq 8`Q5q*$O,iS;97&	Ao1[UK)T[jA8!L3Hv:Z!;)z q=oXSH^h&*W;?q8ȊՋxDgqUAxUXdwSldYOSgP#V+hsP	w͊o"HZJg:qCGo\)j"'iٻ}SK00yEE=&ki.G!z-_ll$<B'Җ? %Z#5瑤
+g[_cvǍ+z˔0])}T7D| U?KC?/=AKA+-նZ-B=dv6	NgLR.Zyy˗]-`.
+;}S`7d+acIxn{`̭DZ6z[jlQTI0/ga}F¥M$/)	z(.*8Ad8̽W~ *E-×T\jW&la㭬nnxfG%:2 kءg`a{@=MФpRgkP,Rit33m~ TMo6WL^qԾI`p'E7d{AJV^f<>EM2NV;K=_'g+ܷң =ps+4Ad\sedUwN+cs4]nӚ.
+FxB#p'ҶUFe4;8?&8pKhzP=gl%+Ҟ uc\'X]*$iu\]]P1nc+<j\Tc+]EL=|hё"|n1_#_\'I[{u^W4~I nyfc̖:I*%Ǖ(Ѷg*H L lps@WgN>	&F(O,E2$cG;(+\ZD1|V4FCgccőP(9cᜄɾDT]f_	>9Zket#]K?##pRS#z( 
+ݑdcr.>";tV6dmtP8AvI6/nBZQQ̚Dl!M23yZjbH/N2^d9NR|yߐ3',yLE9G>gQؑ&rl'Sbe&ض~^9B/.-M(ߊkqXHewyjdVnF}WL#V7R|
+m,CvVP\x]^&QI
+To9hwt!@0BXەF>17qhFT1cÁq4u&p#|F.Iύ;><˙0AKStQi)!P$V)~P6F! XwOт(\I@fY?C7-	1`Bn^l*ި@#f}̨F#[[-z#Q"!Dw\[5tLp0!&,x1=9g4Mf(mwNsZf*i~bubϴh|u  t2<(~nqw0 g/׃ݟІzwzr2XjY*9s2ܮEtqQ-[a+K{OjJh'2H,3Mlyw4=5weRoՃ1ia)HewYN46+<ynAacqUuYG\Zp2'/.U"7oNF?ޏg7OGfK|&/$uEvUjԱ?s@Dj0}E-@U1;Pf'\GϨ9T2+"M(B+B-6SLe֚yGg͚2[ef%-gM
+Vۖڄ6<(+yZ疥Q/Ms<ҌEr{o嗀[E?0vcR`cR85֊70g"AWm>TL._SaO0_HR4iZ`mH*׹4NB$aB)w~;SHKf(f)'&  7H$*+S?B(ggqȌy::QAIYN:`*1/6nER=Z
+NJY2'",a%.Χgg22P2DM/JP
+yVNbK9ㄫs}WMn*$
+)c'$Klnr$dbՒn\ ȋO:L\~9:9=='A:pbVF#f2F1nkxU=UbL]ahZvxwn$?u]FcH^{mN{P05CKvPgt1!cB%ٝEEɵ,H\UoZVpCM*%;vhw^
+;q%+찷~m
+}#~w5\aTSP(W!5~n
+5ida~Fm\aIo& Ak1+ޡ8^cIk\jHZC]%13M(e7>⦄|tBgj[!y6+1H`Eqb6tYat,synM{t'nxSc:,(ܖP(H.9,zX#,.Fi))Ses@䔰gGn\zXQc1;Ejl6܉'\+_UHMpEUHwg3 tM/FjSOFvO5:5y"'ONvd~%eiNf7[!	/{'/uӔ;Ak1+ЃLB&165ԥ@jZxm)e7v 6b͌J(h''4R񬺺po!*ژQQ6'08\0cH&&b$u}֗}`GS.3u$⺄B\Fs6ug,z
+\RM)zJeyt9OP9%<E:ﾬ˻ݲG,8)/Y-ʝx<8O'k~~⬪|rtV:[9o,G tum}_{gD/Q͜'	!$#oot}v[>Vo{-P*OM_N1)F(́˒@QH Td-5e
+^9@Tߍ矙-AR3)c;n=ڍp+S'N:W؊`Z7'5bYOd>kaé upЄJ%ƹZ1A5LjR%p0-ZI4AB	N
+EݷjasP	YA8-I"H-##
+NH\Х-Nd4*6#tp1BX
+'BާHQ$V[lhJ|d4YH  \9JnV/,-Ctދ{`U*k/5Q\u䮓&>xXFE_i^o9z lC^-i5a{g2j5~3`Zjkl](>nǣƨ4V>궏Y.Q,<c`EK2<$)jܝ*)ji4X`F_=g':)|,9U-snZ1~Y ABiQ#E-R]$d|r53wFZ3'_RB,cWӕ،^ YVፁƜҁQ|pl|EV刳p:'\[Qo#|Ì4fIH)`Y+p:+ĠBC ^wǚxkS@
+haq=>ߟU[9+{m@Pf਺ L[d²@/y?6&˻"<SbԱ1.X5e}$g~ QvxoJ^&;s;wP
+.V(gݿ}.^W^ nqlݽB)&
+I.6"ϩ^k^S))c/Q3w)
+l4~lGs4=AKA+ޱ-ūZ]*D
+X٬lkj=&^wg4vLj0Z.VfQ|~^"!AK+V5t;Ŏj[mu$XKc} llRT$O1	.(6*8Edt7eO[4\~C%u.5sJV6i?|d_^QI~Xáe  wu`7$)8&n EOkB1sTųڊ&5om1	}gwwf~̎˨*-꧞3x~Ǡw[^(K3()rmDs㢂ȓmUŊ7$)k.m1.sʁ!(V)jZS+%cl`F(I}]$ŷOgoYu)GT^X\Ab6U}iϒ2</YOScvHӴSɒrOʱ zm#b:k͏eAOA+uHT93c1;3{G?ϳ5V5*sggxJbR3-ar,J}k'-3~$ʯL1fs/;ǚ7&q7(Xģ|d3Xi4Xdl?GwYdR9jbRNx?~ˇr<5Y$ÞAb6kgȗ.SZ3#Uy>H97(cy\9HïI=`~%@6Iȯ|bY%	e9*>`uQMk[1_1lcbz֩IheZ"KjP{ĥ'jgv43jvT}ᬚ*KA#!ԐyeLYe7ĕFƇ@
+椑cY1yEń">rˊy9^,Ϝr5\j-i9$yFӆ wRA$ݐIcT[]t|ݭꍙ'Î
+j){-|I:K򤊴1<mzyXUDcm2E'
+ r
+дu$<NJ)̪1ʗ?5.Rߞ)hE|1l{KOz";O:b߾BTΒs\p`Гz86I} MFLJlk\lXɋ1
+boPΪ_o]AOA+p%I]qL1w@Ɐ_:>"lhaoI&x,9XmQk42Eʟw^s}ܖH6SQ̖HUt=ĆVm5T00>SʁZ6Vp)jmȟ}*PO-Q:UNq
+=˧Ͳ]So+X~C.Uc$[GX{[V"ԘFˣ25+EJG=7@GX	.,x)"~ 6k#;{ &Sm~ mN1~9B OZhDE	r	خwU}~;w5TxdD[t]*ezq<|	Qjpg{bVSAqq2>M2)fܲa"U& lp%kˮɋMi@zJp#c"UikSD+&r?G}0Vًۨ:қ#\&5ZGaY1]α1.Y|NSf/Q2 P2E7]S̊)./,5śAl/S\]MKC1EwiKiqݪR R˂y`^2Uۂ̝]`]vLrsQߠ7ςEј|(W	O**i9eD-LgJ9P'
+.E-i5|L	u9;BXXȁLb6YͻUbbgoUرzhW^R[TydmHueYi1.X1R9s^)V
+nr
+.|]N@<PAҧ8%zON(B|[B)Ti=s!4̸.xH(Ǯï|םUFs>2ORc%DQőNȩ54#lW*$\cBJMaXs\I夯,C;ld/JP:שL'g-Jp~4m#PKNu=O7]AKA+CHW[Z*D
+(t6	NgLZ.m=x
+I͛LϨ+4(*]pbƕAWd+`F=1O ^"!AS+fs>kآl#%3ac
+oZMRNIд!wt`G86IvV9K@>rxY/U1V5سzhgVlylQV2?6<14]sv;&qUf%?n(wO?a>vءizؒ-.1^N̏Vo6~_q-J2gɌd+Vd:%:YDhR;Rv5@eYvzɻ>~<!A.ah,	ngv\Dp C+R!§Ll bEf!ܐBE2d\2Rx=g	^X\z:rԹDgL%$d*;M`3xP%Br Ϸ.ߘ͘53Sbaka3nFN-[G1xELqwf>c͸o #uδI(vg-IT͍%-pɌ_Q!19%.QYԿ W3nn>'bDA9]̥[ٌke,܆Q}'Nӫ&p]C۽dIrCwS-"J U{mFz(qǨ{i%T	ɊCe
+{mZRp+"+}uLCݒ"ш)'Ps~<K
+x0f7ZBhWzBK"eHt45LxhH!,<,-ddsgⳬK&L]#XAS6uݶR)6kѪlo*{^^Î.B׭#^䎟yEzҤ.YX:	70k1rRSTfLx8@j`rb͐؛=FPi/S&]!mݾ.r{<<~Cڐ3A%LEL7KCXj+văG
+Q".$ff*Z̿CVwzjc*n_Ja,LZ)iͯT2AXz2'Nn^oܪ7ӹpڻ]|TD}-=޽dx3{
+цk&;xgAS=_{½v(ڋuhGe'l.6O&wÙR7's0yJĕ]uRUQk0~AF퐵5Ntc4E>bd$iC:vZ^w}'y
+Hr0F1jsz5q c1)LCA]*<E,e.3@Ήh%pm=n6%*fcQdʂ"RŶJ{RҒs-挢LR0)&Pp$bwyVk[5f2b`O4$LXm^RQ*@uA(]FJ>8EAPjMPD)a|Rޞ.&r5v[  b<EET]tfɊrɥe
+*bFauz3H"jW(L?Q$!aT^[h!4uaКh
+doЮ˥gEoeD줢)lTh>MD8]L^R9Eχ	vR@)GC~d_úqv9 pgxn^xv#֢>>|gh2<1favLy;I+oVGZ}<ڡi0Cgm	>ESZ;} wC;DE8kGjU@w\wO[_Kz/~nx!C<mukܱB]rsn>MZ|z礥nEpuѦWn8}W.,'ve)6@6)/mX""*I	6/uˢ~93C, 0%}ՃzP'w||NM|#LϞ~8w!O	{D$|ZEx6;(a'(TY!Rԁ@X!gJin\JfyBXS"͸E9B"K3RCa*!
+DBD]#XR%E|12GcBn~҉Rsc^B35LPfQ%Rd|*9Sx^)Q* 8>8@ Ϛ]#"^Lz$eq	'iJõ懇3D*7NΌ~
+In|3V0\[u͈_pIi`\^^&:|XB>)Pdk56,FeÜQŏH lxYlKD7IgJܴ@mCgp2 MZ:.TKqvBw	22k#Eטq>G55W]0:	әFYѿ@Dn%zU9jF
+T`ݯx]S-;Fѵ*N4
+usGDm ps
+ٯiqFt/߮<)Ft>]oaڃ1,8Z֖IRel6ڝ[k[yNKihsodX5+ ),Z|mkֺȩ@9nTW5,}x#`qtc}QkN[Uz~Gqx<"Jȱ3;0K|PTx0\aB6DWHYt.}"M^IX~5_aV?l4{ &*nn&{P%4N{__>e?AB}:z~hE~*9pn.ΨLPE}?ޠV˕9&%yTʬҖT
+((ԡf{hZ_(%c`孼 O8O\QISf:P
+mIP.ʎ:NRvc$4{y
+1ı/$'SE7lu`D$q	l
+su@c\0K}.=HH(s O<,MBDcgqa.<f4KvB"LB/$ M0^jjXiIX"1]8%sJy2aX\ӡhE"sGV[0!N&6oNσ/ד0_L`rrѦJ,,GwQ](J
+sx82Lp@S%3&,v*i~JɢP
+OD8GO13"$桘g2fK Q`:]x	STXeBpFpGn>F8]WEX;HfaɌoFǈ$8^N>T{lRJ(-};(AB$s f	LOË/Їف.O/pr58>6sGWW?/x<8?>؂9L.&ЇZ`\bk<:G`t6TUōjײq89Ї6-8EH2I~P]d2dclxJ	J6fXIx~^[R6~aHA8-L+V{Zm([ 5ujpKрggHO
+
+7W*EH8F
+j
+ӇѤ³tF֝]3{@l&UQAdI~߄#IF%YLjh̸̱zޞ.+gųAbΖ%-ʠfX"syizNkhfz`NIbjK&*eto6]yeM^YWVV^;wwr|J~ո4НL׽i꩘j{#tE@5=]	8؃{L(#erVkKRѸ{HltROƛ7<%wANْznqRDs[YB};f	"E-@O=ܙ=XG@WQ%XUĄ5DzQjnGa
+}3Ofh4	; ~]˫EdW[.~y- 3g{xߌWÍ_į="i7Q6e#Uݐn+$N]|}eys*J yqXe\mY׈2h7cc=:L@A*yǏ~-rDMSy^XwWrZ5f!~[ B^(L'XSnv`ɉ:իniUmQdn߸^[Iqϩi.tL#iNYZI4mf}{1izԳ0k+Vz{wMgE켨%}s<(n~|B?kz)xt3&v+;K
+@H[Zrfz-e{,%(1@25Bx3%	[c$EwKo6l[\ Yo:\[?jTyCVkj>7صuioބ4ѬXPQaڒWS6[[Z]6S6\L.Ԗ+>|+{?[X`l̑YbmE2"qCW[\(kstrySQ*\c~z^YZyFǈjBd6}fǣi>E=jdu?ΡHj-BgRo
+7DXEjp_ަ6z§BΟ^neºX_u˹vR""@&*˶}nhZNrtn'p9^ꦪWS ^4'qxa}mRͲsQJCAWC[Vm-"z$o_^7]vZVIf236̃Y1qNxd0³F<C
+eElve;<ƝYϪS}Q96\QQn9cZNYrcAAT\c:FzޡX!yG*1#yzj|,U}0u8PA-KkD_b-yl$/E&HPM714ŻV^,6AN-#	+T1e{>1VMo8WL4'^$btCm"JZrd/[Rd&o{3, B.hμȃ<&B,$1CcxH/=("nu3b<kn$S_ѐ+f.Wc+fI0bl̒u&SpȈUN*;m8>BڤVc$2-νA(a[f!̅l%@Nչ\G䉧X6c!a^.y^n/]fYgLmILQduNɧTj54+ˍj? `2r|J;'d4)3#6ξ3/~adrN\VP?=C:g$Hvv``⶟^Y	^ThIHLp
++e3Ͽ9v:'UbZghKo/x4; $GbQ@er=)7>x:W-u-xcĝ4z4dE{a!xUyii,{
+pfSFaK+KgNCz[,iSJCfV^X6LhRqeɐz&zA#0bVpT$E7ָO`~߿Ŵb&6[A<iԠWO+*iT|t!bt54W7E0z#^t;i\L[+ocXQ:¡ܲ8ѽE,[ᯪPGv+v@xQ~v O13fV8>VS̑9ctk*G'Q :??$j^9K}NOgSn0+KN$nZ)$\1{AYɩ<I˙%y
+ZII~C9&A]+ʃ`KXjܺfHed.0OHT8³~`@S]: aRy`K\#AkoD)--+k4
+Rnx7wWUk
+ZXZq{H"H[t'KNHE->4&IokngLDj=\,ܚRUqJ% p[@TeGj%'49_"khw{ǴVerKp!JBsGig
+}}a<Wkgmzq^8;2ݖv9BmP]q
+9K[Wi}$<WCY[f;Ʒ#i쾣/E^)΅|ڑF0-=)S}S-ml4 xG"p=~^~6MF3|V}NqW>	fkR2Uڿ\øtC>tAϐ#X*ۗK$^[H;SwCԊt5RMO1Ẃ$C6@C#"U	nm&ت׶ff^y@Uem7޼2Td2D[}Lr~<5w^ddTí+:11)?_:%GOOb8C4[瓊.(1jLYvRT_X:N:qS<`i}_]V`PaU@Z6Uȧ&bC:KdjL+WE$ZOE`+])~	Ɂ*0m  N'ȷE
+ wLM_}a~aŖm.lZ!3>.:(I_P8О̛:Kbz1%TA`(׉	P~5CyaYZaAӽ'mqZCu7/Kyo~*5S
+{R"Vn۲kB}O]Pj#1+Oȃ\^a!sBX"$=q̒_4CN]=.cDxO,Λ9;28£d*cE7N1Jd\\T0=̧ϏD=Efr .˜rJ6E-4Mgzeo9
+>-O90	n/7j5SG	:/YaAkyICC3i˒2V2/25fO^Ey;~dj$Z
+6,R;7\C6Ɏ%'(J!pW8,aV_aJF=5mNW0(HݤouQMo@ẂHP@hZJTB%JsZcSTW uhsx;ｙǪ 'cQ(*lt͇l	 [P(%7t@ -R'q-g0Aqt99MetjS*+t9TxSp$Z`mِ
+/;Tn %ӾwͿqTkLKTc+g-Ak1'B`Y,v#$ùtǖVke?μ*N(d$bpvμ+xK.ʿ a
+]ݎFѱW	7='zc@Q;i%FӧgZkU2PhԥCl|ыvrW2g[Ҹ<zMn۱ մ;4kdQ%je^mQ/4N_?SMo0Wp@A>f]+Pl:;(ʒ@ɂ}'ntG>'/=䨍bL0iyp1$~}YR\V8JA̜0-KTg-µQY\(xhϣx
+B7"+_zt`9hgiQ#uR"1mHdǕrv ޠ
++uw7pK5¤Tk $%H\A<N0x;82I:CdafS&I
+ak̜-hV&  ~Va1VJt$o7vElVN2pw63_f&K: \kI]A`˶+Du-N;#6typeڣZ]%J|4uLMSpDZleLӬSY(rH(l*<:~!JZol85fT%.* m{N	iCkGIQ%L{NJ5c_*}'JW>9d1%͸P#o'3P˓ҽQo~oR= ߥhA;w& TQOA~_1Mh8J*jBѢ>XC9n㲻ٝIo88I>@f,$$:=;)x+KKuaIT҃E`R䂎#(cWN2XiBB=t1>N4E5\QNNfU:a4;98_6fpFJvh%iO ujY=BҲȻGP2,C"%Nl$w#s}.&ҋ^Z΀jB	JϾI$Tj*L/Ba='͗9gS99 :@gMw7SV$gXyΡz|؟\>).a&Ya	L<܋ntUaU4OM&R~8y%
+g>v[>4KQlRDԭ*d
+q	'ThUɆs!E婷*3?I*uz*I<$wu6\prG/iS܏Yj}Ʀ@}Wд-n~!5>fgˬuЂa0#	r~)YdUS#?WA*{D
+նڕϺ}BGCJ1WΚÛ76K]3g-Y[o6~8Z
+e{7]a.h-hQ#)>("e%E~~ѫ6FFR	:^LN'p
+[*aMvK̎+?	*ވF?P(	rU?rw"RQXW^̷9$K!tU(.dE;.@mcXz7	ffk.vDQ gH$9ۻkeS[HH,ia
+TmAi%/Dlʜ$["nF#ɤ,єʇEwqzJ(#d.h?xpoys}|2{
+wK&;gR	B3uKԢLJ$
+F,ٚn	 )\vLsAD!$f~tOAͶbh!1DE5O-&fA!:q%h/8.:TPD}D<KQ6^S8j6ytIEC'8wgRoE1>=i[4r-aW?RHO}d vp^*P!@M	a9l@UlYOπLa^ϗ@h7Oaި*]ES-t3}J$Mk2uٱEǶ(?M2Wys`6|I4D pS`ARA|`"	4!xbcj1rX)t@QaDS80vxGؖR*M✵!VK@"/_s30wPSdl4`e{[(l=8_r{7+Ym6~- >Pߣ2btmqSs?ֆ'4s"0S%W[Roz:_v\}wռz+I&MFroa?hzw+X"Kf/97f2|[e֗$M6[M1D}lI8U?6w`jѐft@KHq齥`UKTcLF9!S[Z{.콧"k.$[Ӷşhzvf)0x+;Tv
+/{9T[&]	]Ӥ׫U^\\@V0vmwk`F:ydk!u?ؠjZ.10O,][{tmY8T>^W,a1Euz93QZ*^еRj],
+lwb7sHV|WlGvdΩi<_R+C!19EwxУf_KuћhΗ$1K8s3=5en4L㬷sErϣ_g.DI¶'CcͰWVSMk+o	C%a9d\\o!+
+Й-׭a0({]N4>lw;i3bsłոa?~Roc%d-?i{B0toHz۟jt/%o̭-4M{}G	wH*0ɽPHBd1|Z[}+~\=x-.>mHV~j]eK1mAKd!O8Z*hACkuue3L/o̺˃_6tTbԏx_}^zrVJMٵ`+iJa{֜~:!&3}`zOoZy88!!Rˍ.QFSAq_JxXmo8ί*PrvMmK8Cc[N';BRO?3h&5#b
+N0[np
+S!,8oAi"I	"ށ/V!|L=%G*<,c<90G)-©Ij#S1pȊINں\[aK	|PSm3FBC0Cx8箯Fgo<TpRF0cb
+.a&(;[utyR,CgG^a;Kq87R8\udv|ɊX}drr+2ʲD,s!fo"'mgc?s7/㵸a%sFZME  .>2gQX2Tp7lm+GkލgL>yϵrdsNQ0OUyUb)j)+cPS?>z'8Ef&oڈRRΚ:kΧ:{qialdK*ע'Xh	B~NR۝Xإ3@	Rhwųp&)*XVk>ofEڗ8 =H]jBQovE)&Z֦JH4m	ӟgr)t;&䔾GYTh@fPI֜wT =޻b7qqLLȌOwƽyS"s7-fF[fh T~*)33u1)CO4K~y:u39j5?RK*:^/~n(HCF<v.Rjw}1*sl10Ŭ86f[/6NtuG:˘,q	x
+Qi^Ʌlt;:c]Α=rb0NN-"'*[r 	BrPyB`C5RZݞ!7atO+}ZCv}1#6x{ksG{ub:Yew0hvȧ"PQ}؜Y6Z&&sp :vpGxOyaӠw8jlCh;a>q<]FTIf=(?KVr)(=띸|-gQ{ǷzjUo:~_q*Q ޫ'hvjto*5c[	m ծnoޙ@\2#+8֠KN <BH0K5 xLZ	b{%Sђf7asH0X߸3Am$zG`*Y1/H[W|(GXR{o)8* B#D7!lS(g l@y-_Grf?oqRWgPAHm*G9zfZ \pfD
+T{bצq0=QeGaFIq)TqKpقS@܀8l*Q$Uyʯn[8NZ7W2d w[qg	GWn';˪+LFabk t6t-k&ns榊6]ǼD[VQNOv@
+ZtF{9Ǽ|!װ,9gsi^k^nQW)W?r/'@kx3e'c{%QslqO'G&#0Z6q%h.g]4Bsǵ0';K7*	ˬ?enFVe;zOiۿRb
+'^q}W&ZhEJ$zοH[<\{m|Ɵw>ݮ
+9_1ǧZʣliܝ~YIuϽǃFگA#ϺQl. ;EQMk1WC!$-y6mp[CR(ZWT̬]SnԹI>e4e*D;L2WV;/h} xAH-:+qS'*YtSW}`E6Ę&wR4 ac{M,φ_C;Bۇ >wcxcէ8Adywj1HŴ4^kK\jMlᡳL?eQL\-Z+c\"Xĭ7.9 @+oMz,&eb>W{QڔSga|5S8Ove|Ey1cvr56>Az9SR8T]O@|JM׆RH0MAPPt9:*ʎ	H?] Fa3)^9?ݠ
+(<8A6Tͱ@["5K232=-{8dtynxrc
+J`~S8uC4@&ilWS$V@k%xeK`e8#.~hT1NBx_ka)paۜ$r'0"CDNCH7r_edH&ORyݷXQD|ڸ/]Y*qù"liDAj=+ۅ\5\2C7  ZZpJ9,Xɪ).j%	l;_N;xI]\EiL]tvKKPl[ZK>fcpuzH!~>LXωS5C}S	4Tf֐USFfcd!ȠhTk-u7AEm,}|>wՖ0??ڟDY^p}{ʜ+h{c>M|32V27T׾OL6˄ύIٮpc"aذ Vn6}W$NSGi	}M,biR|A/-N]>Y˙9sH, FÐ)SdHOagpҁxLA4"Ȅc	ܧjg(<F685OBكߜA|Cg1^a3AWY4zG&i;5: ?Z"$ [+I[V!(apU}?O>Ua%bE%ưRN"H-:F,2!SnׂaH9~׊m3Q["CNm<Z3P*JdCCm밗1uv%f(#4H-VcTΚ\3w `prWK`F̩`.Va`rA*U2BV+c-qv13tk;*rȹ3`p:	Cت{a҂MbKB-wl[53y3AZ!;@RA7vQ{fU7_AnYث^ס*.]l?wU7Y೅.-!2;%)UjWBʧRڐ,idu9t)5NHVK<j'hEC=4skyr}F5^phK"csFE,H]t}_8}Z)XnK.bKD?0!T{yȵ?eyy̑ZʽvJ=J3eYF&_݃U@[ը/x#!GKCGAGNEP;3.[{8 4ϗ_?
+6/5ŵ⑍72]FIh5%lQQ7dTP/XR9}WtRP38ɾ손%YJdPyQ!KR/߷47[QQEaitiGAׁ=1@4ug߁DDEK'!wᓖǂGdF ?`#f3	&_8U$
+J棘63Bq,w+- p9Vzʈ+كH 33Dr8Q@Ms
+ፊ ?r#M|#A+)w|q柃fxquY^ޞ^}MWƱ-p`ZKܐm*T[ł<SOI,BLOKP6V	JzB vɟUޤ֮6DוFmHsI"Q<nHd֎Y)T	b1^3.p4\OJ/	د)'3rƵS:  =81߲ͮFZ;5A'݌Gy^B+V2n~v,XXDN%߃#
+W qd`&H׌[uS&	{SFĂ0euv }涻M;*(Ӊ
+E~b^r'Ha2"Xt0T?g.$N|7{Y#Z&e3okҹbdJެ2P)%2Ks4ΪdU?*ׅs}~q7ί	[:ֺ
+x8&s\%{>(ߔ~rҞ&VlZOhkX^Wd@{tKeb		\5OѽEKL9&9?V{b돩[ޫ~Q9Zfo,s4zYܐj<-l-	e^DasVlQ1r"ٮk8|&H\2utro_3dkr݃8I4)4T6kHn)74c\uuAOmO>KʛX6sjSrUgc*	*yCmMN*B͈IvBnۃ.6'h7myi|nXc=l{zn.$}iLIwr4Jv177Xj1\onXV:<7QyތƵLT\'.EƝ\u遣Z'Xyg(o|IɄja^</,*}0\?O(S5>ߓm!!?DJ'	PX]aU?VFO&-=4:v&S|=q^lCn>p*tR~|ӏu(d|EL@$jdENWi~J#d*2;lGh]2ť!&}6$;{jS+lD^Klг</Am$rs'5=JߧEJAuLB0xN1 ǀLf{ٙa7?.s좪=dQ@w=gLF#y,ȶ(Re^1pC,J$<?`fK2Tt?ƖVm3T00>Sʁ:#lRVS§TP!w8֩4V91r +ӱϽ[ՃT,]T8KybmHuevGƸ`EhկNrw +*q5Up̷EJAuLB0xNh	c@&ٙa7?.s좪=dQ@=gLF#{,ȶ(RE{!K$<?`fK2Tt?ƆvVmT00>Sʁ:#lR»VSTP!w8֩4V91r +ӱϽ˷Ͳ[ՃT,]T8KybmHueGƸ`EH(w'NJl79PCQW|EJAuLB0xN1 ǀLf{33to~]6s좪=dQ@=eLF#{4,ȶ(R=Uʧ;!K$<?`fK2t?ƚVmuT00>Sʁz#lRNSTt!86V91r +={]V_uSo+Y~ƁC{xI]qDےd+o2mAՕPnqt3@GX6WeEJAuLBH1 ǀLf{ٙa7?.s좪gQ@w=gۛLG#y,ȶ(RMz2s!J$<?`nK2O*cK{+6Z*EXd)@6Vp)j}_S*PO;w`GQT9^vխ[
+*.pd^R[<56$:۲N#3c\"X%Nrw +*q5Up̷EAO1+xE$Ɛm,mәe!nE޼fz]epOxz,7I5TyA2Ev
+g<SN3}<x?`J%lwGD=E<sS23IQ5.S:F݄ ޹7cʞԧ8DL8xnϹ|Yt`Hђzb֫vb&򸊴gdkGeLSjcHdpNl{*_wEJAuLBHѰb@$:3to~]6s⫮gQ@w=eۛLG#y4,ȶ(R=M2S!J$<?`nK2OjcC;+6:*EXd)@=kT/)'4]p=Q&*8Fdg:}/eUb`5o8zh_^RWRyjmIuěq{.)::R۫mSe]JAuLBHѰb@$:3Cwo~]6]Tujr2D98}S!td0&DBˊ`Þ&g27!8M*[N]IM7clhgEMxs7¦.'4>dzB޻cpRrDB:sOeUg0Vq:w8^rǎr}Ad[ba-1.ZT̙_ :*ZDj)O0EAK1ؖUbAfgM0Ml"wߛ7oerpj0M (·b718M*XZN.zV{h	c)BDATV3oCf'4mp=$G!)J$+Sn=mכ_5SoA~FC[vKIHR#m~>0sl{7=9;*ARç2mOk1"T("أP&4̬(eo͛C	3X3&D<5(jvIgA@#ݻL919мգQYx2|&SB
+&ɮl%f1\׽3Bs0Dppt̽n٭Gͨ_щt9Ln*8iCZqHP BII
+7S@jKL(؆
+3L
+oKOP_uAk1mR^m'uhK =X;]Kbf֎)e׻N(.B3O7O($<Rmczqp?(CLbH%pCK$aWF~_jXL$ix-:VʜrͭM¶$*F5ު9*#2ɞ,x\3)pn`VH"*X^S#S1DH{LX<n#e_<pפ{&kw>8 &$ :%Wn7OQMoIlu(;fs6GkU}7&$'z=oHak$E^EKkA+"JΚ(rlo0냐v㱋z~\BE֛LVHnob:*0«cA͞d":>Ф@Xt;c'o'eMP^IEwc4l\3
+6\b:Bz޹=[
+BPHL>^,7eSgG#X~A;xm!IuF+YMiy[@'P	W䩡U|?EAO1@<TcHHbJwNMg0nv9˛6\g&td0«gÁl"x>Ġo,S,7]`m؟IE7clioEF<QKs93+
+.E-o5>޵;BXXȁL~y\lWݩ^LUbeQ#v.Ug婉!6ޖu#(w|I)V%&j(~oEOO1@<"*<ntfw7ymvLЅz,S&Ox0gd]=:<S;'>J$?cK<,f:*Ye)@:Zm#_c*G`[w"|Rȁ4]u9_L4z"i95Lg䱊&VNet(efSlNCҖh(瀎B269PMQK}EAO1@<$FIHbJwNMg0nv9˛6\g&td0«gÁl"x>Ġo,S,7]`m؟IE7clioEF<RKs93+
+.E-o5>޵;BXXȁL~i\=oWݩ^LUbeQ#v.Ug婉!6ޖueur;<+q5Up	̷EJAuLB0xNhH0 ǀtfzٙa7?.s?feX6
+D7rw;VQޜ>0 SQ|SO,R>3c@
+fT"}c~-IS3\01.sʁ (Z}p
+16zpu*Oqq|^֋vٽꋩ#ő/-^+/-aTTLqTi/2*H(J!vy2;	>)G+]-G\ͯEJAuLB0xNh$ ǀtfzٙa7?.s좪=da*<-軞3pZMFFxs^PLEjl?MޱH\S%2O.*Q<_clyO"VrL.<)haR"ϩ@nCoN!)0}eXnݪL)$^~A;xIm1yREjX2QY]iU@"XoW$ny2;'hᨂU}W?EAO1+x%I!36YU8/͛oeX6
+D7j8
+#8/}`xAH56xRw,S,)f̩D^[ޓGn`.ga]wFP0)jVSTQ!wGaXҐȁI>^nUGX/]lqI<"5,c㨬ӮȬL あMXI9Z"&n8"~UEjAuTHΚDs8ۛi?B=&cQ5y>"lhaz$x,9XmQkG3/?x.lSQĖHUU8ĆvVm+`"Wc}AXwMETPB8֩4V9!r +#ө[-gͼ}So'+X~YTmyI.U#mC#-˴~V/,gGRۛMPT2E_KBASGQz#BG!ֽsݡǽe̏sgT--Cϙ?1 5-Tc@#1O\x=C`'Lm4^QEwCikEF<Ӟ
+rfgJ9Pk\ZxT
+}pQ:*8Ddp`:vw/mh_u[
+*_U8zh^Ҿ8K%Dېd+o2mF&Ƹ`Eʻ'G@'X	6WemAkA+!ۤ1N$84Ж@zyV:$SqHOKi
+*GjPX?n:qgu($\	;r$lȏq+q)b1ł$rs_U|sgސZܲ`²4s	A$lZˢGCXè?:I!Y^BN(I~YC=)+5.V<y򌧆1;*cts>*Շf*=d$BUmn<6a9Im4y.lnϖ'A!dnm7ώ{yJ{r{w EKkB1g"JڗV("إPb2	MBfJ{.pΜf]%tKF咉5(<YAuH#1ORL%fAO*pGAxBL*<e)@:ZC#_2#TM0;xC	>VZ|C@	GO./6E'ͰAZxNM1y6eG&JIj.ej]Y(Z&:)
+&~oEOk1"JV
+E{JLfl2vq͛˰d.4`)Ȼ\3p#ޜgT><#"HvΟh9)_pDs0DZyba=5/P{a]FhaR⏍T P5!E&XRk)i&<fWL5z"i95L=TE]gm;&̔2A3cdhWC=tqI΁j¸_[ EJAuLBH1 ǀLf{ٙa7?.s쏪gQ@w=gۛLG#y,ȶ(RMz2s!J$<?`nK2O*cK{+6Z*,ϔrN+T/)'mp:(u*UNq
+t}/uV[
+*,pdЮ8KեDېdo:̌qpur@'X	vWMPT~oEJAuLB0xNh	c@:0ݛws쏪=dQTx Z=eLF#;/}`xAH5ƠW,R>;c@
+fT"w16#QO/rL.`]wBP`Sw"ϩ@nCO[N!)0uXmݪ:RHPy9gqWKjeT]*OL%eUca,sw	+|7UpENAuB AE	Fcx$1l/3qvf2fWc}v@{[sfOx`0d*TcGbSl%2O.*R<^QwCyK"ySYvS
+AMQ5|J>V(TR90	,ꊩ#ő,pmyIb6Ucad+Ge6G&@"|]kw^,I9V&n8
+̷EKkA+"JΚ"	A0G!f3tB{M.m5`D;}S&td0gAÁl"5X{Ġw,R>DC
+D󤦛16TYQOR\]RacZME
+SzBӆ ޹;Bؤ)Y!}eXnݪLUfV%\S$[GX{[VidfV
+<:RۋĻhGQ|EAO1@<$HbJwNMg0nv9{͛m`D;}Lr}5`WςE|AXY+n	**i?ϓnފx
+rgJ9Pg\Zxj*|H	u?svN)Y!}i\=oWݪz8ZAˢ
+GVKj#T+OMIӮ^GNrw+"q5Up̷EAO1@<$HbmMg0nv9{mv@[}r}5`W/TOz2ߝb`+q(~pQJ<O*c{-,,˜rlZT!cm;xQ>֩4>1r`=[Ճ#ő.pXMyj"5,,c㨬ӮH/,)xu'X	v79pQ|EJAuI4"Bc@fg{ٙa7?.=vQ_OϨ[h$Z雞3jbnYp  ۢHtc08){]DS
+DW1vTYQ/QT.<L)ꍰKQW"ϩ@=Bk݁E!plRirc@V[nٯ[
+j.qd^RW|kmIueG&Ƹ`E"fQ b-K@-E rWv=(I<IXc2E_KBA8*%FB`$ĺwlef{\|9s7
+j	uԄ۱^_uGհWG+C`xG
+'4G0t|wѥOS$󠦛>vj!X¤BDjpɄ׍eѿ,@41Ȟ8mlqN}HN	;)4Ξv	̂3읢f{ k57	>gaܖ8OX':}dTU>:U&mJbT(4IM'<0(ՊEmdU}W?EjAuT%gMb"JCNBg{3MfgwXEuTMϨ['Z點3Mb^=jd[F]bW\%TT0%lwѣΊx=Lb̲ϔr6+np
+}p6Q:*8Ddp`:vwϫeh_u[
+*_U8zh[^Ҿ8KեDېdko*mE&Ƹ`EFkvi9P89ʭb%^-nr
+6?S]k@|ׯHƎ髝iBu|Z[Gwv($KdCܓO.scL_n>&h<` ?2ERA8
+3ū;^ZgL7_03ogCXR+aᚪZ10)Hkثea*d==Tk%2+75Cp!lǇb8;A**ga
+;pXl%i82bDx΄?EQSedHR8~=$(;!r^^Ҹx!MOHjA=   \J'q=i7a*0YCO2LjHrx hraWwAX,5k9`]7"qOЧa+dh&hQ,'IZ66d!l.!lȹ7`pבͽNpA/^ˑ3owG7]0`\ë<1֪aCb4ò=IUZښw-V~.qѧH-P0M&'''67iq?_oR՝{.Q1W}	.*&F7R:M{Kt+:os{qCERO^I^QꏊaYZ& '<îPhu65'x'yoho+`A+X	cՎӔ@SAZ^"[{5a|rOVL (~+XY3$ah߼x?Z̓Tk؋J֋*>%Aڪ<,RpBjQQH-Bd
+ %;L&ɤj'p#v+L5*i8<mdUxf+ʬ+$KiM`%b&^?JM*]~LN\0qt	}Ϡ"JI!V扣7ϥ'x$OLoX-^bo?|xsKrmp)f%\>5cm[k1WB&kKͅJ	0FIhf^$RfӏF4l:J\&gN"pZGFju	"%Ehqk݂+q<#
+N)y>o8Č${N8m,!vA	^l
+~
+	jmu09s0oCz u"vLX8^˫/lUSK%	'Z`Bsd&4ۖǕHqk)݄e"Ӫ%sy+Òߡ{!19Z穃H3Kk~TK;g Jެ2xeY=<<y^O:C4eiG~3),7~Akգ9695j
+&v^߶kF`\Ե_Wƿ9zGGoVcvBWa,-̾}PJfG{{ʪm[k1WB&m@)dl$HB3k'"Eh47#}&!T%Y-w?폪 _e,#$-na1){#u.)	L%OLXqM%&pMD(@/:	BB9`}҃>#ńE}OL'٪4&F	X^բ+%MСٴ<z JnJ7GȨ:\^0PLtD{1Y/Z땃vSOУo+ Y%Vڐy)ﱧW)^J$] k]Q, bRX0n\9dɣI9l
+B:wJD6-mblն_fX9xڟ'{CBWa,M^Ͽ}(<L/OsG[z,m[k1WBƉ[Җ$N\HqK_z	v6U${|KK"4s曑N?Fѐv*Q͒[y_hPa2ZU7Bɸ1;#u.)	T%OgCLiXPG		E)DG97KNBuO!A휃VjL^~H1aniQt/LUiL,EV$7ϡKCiyTyuO&Ï2qUuΕaߡ^c^qU+3F(6!0.S	<U ,Jٵ!]/<Þ^'x&+tL3vR7	"YVe+Ĥ`\rWb&YV)<-(y}趴y3Tۢ~ajX?-F6m,Xf{ P(yNޖُXm[k1WB&@6R(%җ^DIhf^$R,9N?Fѐv*Q͒;yI5T૱:eDŭ:P2.C|JjyoJl53+<)ogD
+QNt켓xSSHCh;ws<oCzPb?Dt,7W_fW٪4&F	X^עK+%MСٶ<z JnJ7GȤ:\^0PLtD1Y/Z땃v3N׊Q7T nvmHy)8{/$.yxZɵuƮ{\JHVU gbRX2nB9dGM1lrFkt<wmu;?"mQϰ~}3|f"S K7{9>JfÓq~s_m沪 }Ao0<`i]4Ztha(a-30EH:A1r&dQ#=]l@JՕ>guc&##/ҕAq3'P>q$	9Ң=:aI-zpO=1XXd)@E;)*r ~N}`_E(>oP}cȁPvCߗۻ˻b5,v(yٳWZԳ%;<17$-C~H?Dcz)sE[P܊~1[QF`
+ݣ8hCQo 0`E2R|*R취Ż1ZoOʦ(ʽ=uy.js3}®潬T-/F,`UOLs<>j"#.ڔ߶gaWgY4_m2'%[~2zwy1 uAk1n	fm%%Rch<Xı]I%I7қe}OOOۏ-53)Uz.NN-aC#u	I<`!v<$*I:SyduÖpGp=d.Tp3+vjqm;*#b-2^~
+OiͽY"cH>K-ghEnwuG-<@QՋG:kd:#_BOl">E6!Hq֩7n~ h%\"ľZ//8yڄo::ϙ(TO}%Z& ]Ok1:B!4Hi Cr,v+"KB3ׄ|Mی~hq̕hvVuX.Lksvjp	ZN(+be^yn0(nce:ƍYʁVc=o"QG?猅%sBf5f91{أ{Q{g9Å6a䙄x;{xWP`ڑbKދlv2>[8	aIdˎ}=l6+	̡i] I7$^qPg?ʡ|j H;QRgy9nڅ%lcnkҝa,~zaM#/?u`փ}N9*۲ k֧]G}˚w]OKA)VֿE "GAlgplkj=[2aHx&۫+x&XhcbDE%1!naPKKȏq#q(bFz}O<פ);Pr{!(7%ugEx_mW9+#;Y,51)cy7=.wO˻~`vh.Zt4靵g<Ey>2u|"U2	MgE?\0΍_@b{|e?46l}qy+C:8MƗr]OK1f+Rj*D
+(HmqffEeWe~evUcEC!{`g;=v8*&E2!)Ci&ԝM473/Ly	iՒg<PG+7sP$;+"Hh;@mwo	j&Dn<W,z+?,jMa}y-B(͡cNZ} ,Ey~d\gU*o7EbKa4FOr PvjWi4>G7~97uAk1LBۦ1(%V(ٕ2YSnBs{ޛ
+:4zij.bE#VRCqfbQKgM"yb-u{zwqnZ$Yu	sI< ೘v6+,01%g(}ge*c0oʹj.fb}h6yT;UpB\y} ?lb#K_ ئяdT1=.kbԴBsڸ.[Y%o=ZV7z`aꅅ>n~?VQo8~ϯxKI^3k];'j~I
+'1W_$dCKFpZKg4`+!I"6) tb:!ynBL}GCQ]O1^7aKfI0-iN%: 0׊Xf	 %LJo-GeZiHhՄT"[~FOFebaw\VP䒷:3H(6ea03 ,Auz?ǋ|>YD^Oa"]o:1Ovh|;VLO{YUcfV3#h<#Z_#c
+	%j"V.4lõ!rɬ(3~  Ff@-Fl!2#1S]	EMx_lҩgB	>!J##tsO|K?5:Q`EgF9k\|)^hŕJ\ZEron>w%_=:=ǟx<+( 
+Ԓb}rgcaRAkAB^LLH)3V/?ZENLJ
+4__ʴpIYv䏦#wFhHg}!.uߵصkΔ҃b&G]z.8bSq&9GQRw]7Х9ztlU3v~Bbx}['wApf)kAbZ{5uP(c;ɻ!V)(5ܿ^\=r_ȯD=g?5 O{~W*HE]K1E+c[JϭZ-D
+Qiv$dfeW>˨*<-^2pf#^>0 SQ[<1eʗ?b`x((~rQJž'ߍ=zXssEvS܂XMEO@nB[:xQ>֩H}c$SY^vTWL)N$ɫ%52lS2&ucu[Hk|MgX?/m~ mQn1WC(jĵ	PR	PD	ڳc[q
+ԓ3o{}]eH/*w}\^Zl_/}`LH#ΟÄKY)z;-ؒD7+<@E=E츲`[mvS܀haRTC$I1`NoqLr$)Sa<w$L)T`}bWmKb&Yt0!}t2N5%KQ?; u`ѴQD'	78%o7݋G_z^,%ۮe(YI͖FIGP,#KA_sHd6c3*#ЄdS0sV!Nv:uXoEMnriڰ׶K
+W7R
+WENAuB AE	cx$1lqvf2fWcW}`D;}s&Ox`0gÁl"X{>ȠsS>Dc
+D.󨢻!6l#\YRac5+|J	>Q:*8Ddp`:v|Y:0Vq巋*Y=/RuAhlamYm1.X,U+INQhqrC@'X	Wemj1z];Ӑ@)X0vU$13k㖼{%{43ξ6!,S%Js=5Ol| xAH<~G}]VQ	_U0iΗ݌6bA1f2\s)@66p)*u6]p'zQV}c@V;O}*VxyeQZK\j3IZ~H?LxEWȐ>fj]u
+n;m)w! F,Hm~gp昚dLS޽V+(wN]TͻW\(e/,TlCAU}5xA;ݧ¹\.ƃ˖鐩֙9)Nn1ԼVmoF_1'%gS8KHc1Nidm`1X؉j1|R>+3ska7Dk\0⊅x1~ZnOBC >iAi2o!b&8#=GA38eĘ!@@.#g
+)`0w]Cc O7$zq+שdә!RD. tӄ\.[y\VؘFdj%\"#.@r9osxbN6m9wS9csBL̻2d|;V( v6Lui٦cڋ̰+սm8s{أP>Mˍ9S:V ,Cz4sLPFO8ݘѧN/nȕ%1p+I)?hqzBF>Y- ~+ JYh,Q1O0'$<fdfAi\=	B@6c%GOu(PLH=paUQ",Uj4hoB@EqYk<-XWhYP(tHw;KB^*8LGNChqK;g۷&Ԙmȇf8,x򳜿bT?0K_kc`y"gp/P}Yʅ4X<Ȉwv7]wn<83H_yv̐Ι[*'&1@\YUs^׶RHxOpIɤʩeX$,jNKNԸ#āj/k2h2f,F]mԔrӥV/৞uȟ߫36~<6E
+`5(5UFt E̪X-n/B0or֣+uFI]e5kTCi0<ik3WB488=yKdVb
+.ۮrcbmJDieDNѠ1@\YwѦ~o'S
+[A?̢Ö"'P}]կ3y@MUfcN^Ԋeĵ'kćjAomαj7ls;[[%ר
+z؏HֿuR]0|ϯ؇;]P_GCT=P92ΆX@QqO=3[HQ0vLJS2z+*+d#sc9C,x!Zim.)NpoX"]f6hlB fRZ!!+Uݣ%Q;3C;>C+<Toŏ·q.AYS8(΁}xgJҤH:+$2f~WEQ/-28KJs6"Y`^R17:SR)  `ޡf,`lFQVBr^˳eRr~6tC׫dMdnF;RrZ^z C0&QtǶw*Tv}'es: _Q>Tv0"q!%^YjV;\1)KWKek$';#LKf[pNovz&tHlmAk1+!ۤ1&N6$PJ9X;k*]J{ƛnzz{3Z_в$<Slg/Y.,䃢Đ;<0Eqˋ7$1GJXL"IOoα=J+us\deS,0۫;I!uYBN(ICpTԸy2I}`V܋cN+/DϬѓ<\5b@Nr01}b듫cs9Ilv'x=gu/7w`}zKa4>P'kTQk@~ϯDOz,- f4K0;ѓ1ګpy||\|˳RRb/Ld<KQA2a#<dzI'#Y3X%-AJ,.-]M]x)zh
+bu*rrPhSP
+i!}x$#ƀڢjYOE;ۅzUyh|8$CzH`Q
++-H޻ri=r? "xȐK 
+xYI~gx6$<a*d7-^~h&%׃(R2)qN#T]z%^# ~WKd6LzBКT ڄjuxף>T0c!Y_0i/>>zzvUAް~H9"C?
+69L3x=~0C?ʴIp7:/b$ilaӎpŨQD} TuF
+=yrL9۶6(ssMY1>9Imn@{]ٸLIyXpޤ3~d,AY>HǴok+t2*9sX:6^;#[q;?qۧfI6Co6V<`.'.lJ'	@׆r/VhbTn07Wỗ~Vn6}W̃Igl[đM6mA}[QD&!4{~S..v>U6Ds¡Nҹc'vn4U8&{}d\ pMWxAPCn!HBxC\05pH٢y?Hq.I	NMpsJt@`2DIK|QXE&Y!+dЂ'(%\@fVK_/.tl,<2)7moTA	B&'f	MZ},3284o7ooY!'	2d\ +ݽ=KW-5Kf\YoH=s2EB(mwT g `g+Fp!t[Y*^ ч-2NfU@>ph|Bd>Z:^\qgě {R%@
+vn6\F\
+X)UyKnrL<U<G>7/NŠ1?<ja[(bAqa!V-k߭E|-3'ƏZ؟1sWv]t*fTy*˻E~A8T]q#} ^^#ldq+z>/c&gߥ1x:t;і9'?iWֲ;tݷ;hn1Ar'sm{z޼{|Рfm֒#(_Ok7~8bxux3L&|ۉܹA&qG!݃zt\SGkw;j'k3mr;0P(q[JGFW~}3t6Xge3'YǇG]T[o0~ϯ8} :cZih&!km>9$%H/'|r-Ϥ$x~mGІ\yȔFP $WKD<Z&Z2d0@Ѽߦx߁)΅g%<a_\:¤ aR-J%!+ZI4Aҫ`eMF
+W{ߞߧ@U\0TR$MȈWNHI.,GQ/#2-Lڏ"&d'.7 0Z
+t g2 n
+hCɘ~+s	PZbzw.A{4\\1Jnͤ5
+YCNI:-!W0p[U{Z춷}ԄN&nlޛ&7	VmhB.4c7j+ҩ6TzkFnM'ZugO9Knu$+L[$Up<7Ti7vt׋㳳O8'n[[k@+I1}ԭIH 3^2;1%.(vCՙ9ߙ~qTLJs'q4J#H5V ]K7tAYcbW6
+4-{nsZ"[L]ȺdJ,2HN=xmVKm\A	6u>I[ixQ[-9HmŊ@٬<*'2.s}&Ydď{߷z^J\d(ؓHBqgbF,z
+ `0 ڬz8v7A4ȭeʙYFy=4,ZZH!-sA&i3tar)&z ;4oy$Gt&&>jGsۏ[KO~\U~`Ҵ!cyfڭt{l1L8NlGi	~o_Oo1)!@4B(mHQ%rf`GږgU?I<zƣ/u&QG4ՙ>GOa1b$EX]h!>'^Vko?T02Ӥ/4J#'50`H!:B?^$[!A+¢qvՎ-y!_TVLMFŴ2Y6^4ǚd	6w75I4pW4ۍw5MQS<Έ(r͊ z=LV&fl+0Qmس_x*Mbx/l	o#zOlm|.&?[B;;YّLhOڶȷ];mdIHTh!<Vy&x>z>_Xmo8_1BR鶟:I7"^$i`E"u$HzlSB3#̒b(Qf'o'0K(r	w	[NZf[VFA	?8_Qx hÈQ{[ʒe
+1P)b/J?J&AX[i(
+R& 2D#:Ԛrx%b_+3	TƻG=ARw	Q3!r%D)]0aPi|Wjo\¸ɸ[ebxBQx"%&ކfe$X-tɔ.|`)47[`('Zu15g(4㘢0  F''p&\Kd+[ЧnV\)hf}ģ\q_L>ndhH'.W"oY	<=nuDY˱XP)Q95N{PjвVXzn/*g}{N/2A4ҞG+ݩU`
+BLk|J&Hvm\jĵC4v3i'Ql'oƮFgІaӋX~f&Wo1mРr66Hٙ BLh-u1;Bsc]%L'}(x;R}	}dHWQ.){YQhn&]X#R
+Mʕ-!.&9Kxp~?ԫ[Vf_)S7Ixpcxs+W\3(e-b}vaIUJ
+`PMX=yTbEy'.ׄƹ8Hd'X<L&4F
+G!O=4lciT2͚SOF?'QĂ08Yԑ́ |RQpuQ;KVxEnk=7;L086D߻[Mh-`j7:t^bONb Awχi,L9+~[ueR^i~K'[`<,~C fc6a[~"_(&oӝmo%%^kT-u#qg3|ZG
+qN7wsԒ1e?vTkwoǍ"49~;iCc^nEJt.f$kVl:'E)<]eFm|
+Wb@N*rc(?UJLEoOk2tqNaqva_0:[aLϡ^Q*#2(bZ=&Dģq6,B٥_/W5%ξ"BDh\c>,ބ !Q嶙+J@?0p)U#(R,!Ȇ5Lf38%#JpcfG.0SdEit([7#!~~oߪ׭zs Oٻga,|h؝1WkOFƹ7A?Q]'0x/K:%M;X\V"ǉށlPS|11%L0*h+R4>VS*Am>==9-aq|>@K?R :ap89nſKAWWRAq$vә!m).ZO^<&yL/ϨRSqfdxV*쥠LjH^<+f)U0pC\kdV0%|:ԓ/xXpˊi94ϜrN5\j-i1M
+׽SqCbtC&)Salwl4P}0dQA-ۋk<_RR}|\EpKOz^UDcm,ςp4|T UkƸ?Gl9bg<r)3|V_TN@|WI x*1 *Jr^ǧ:wuR9v8THggfg2EB2:¯|{")TacqqmSӌё]|sp{4Կ&³T#Y26 	Ԥ`|%xc8#EC:W'(7$<ahQ}?UgK-JPCNIO"-f䭐L;L<d.-}$oM;^pzHµuj.p*I^ϣy1kP<3~
+b(q\I!ZH=Br'\mne鬴Trv9\4	kk?]L,'jK-Ax*$;ݯ7zrą[n8;=Czo:w8qvz!0}`Wm񭱬֋|6ޓcؘ\-Lp{#*9εŗ5=8sfǿ$ Uvۘ6_P):u҇SBbt,y#O44-ZǑT:`Wo&ޟh lu-;3Y+|vB[4o_Qo6)nlI8vZ,Y.VHgMi$(ʲYN0a|1D?we^B)#mMU%O:?JXR@%D((0#&ܢ
+ةw#pCۇG=PoܖyEP@xi*l
+^P9²bCuM3"/&%C")n긩zөjc*'
+6DBFf*ˢ)BZd{'k%If9~*uTW^)(WˁeH	*|5QtEKkJ (}$JRn!|.#躋h%n8y8%(cw^'<6طX75,x8(L@#A3/0Hb7fٟ/r>R 0Ls4܇qMrWfix|oܭ/=?;G"rg<Κ|Eyr&ҙg(3Q.JU;z`4>IRRe9)۫:h
+f[]2 q4쐽	鴕If/N%Xy1YAYxŘs]ۉPZm^U%͊Xl5Z΋Wo+T/*l qYU^d=oOx06[nAJTx_S,kCtD%اyӚWJʖȖ/OV|q?nz5_od
+%3w}2HLI}ҡQ럛$1QEޓ7V[o*7~WL؍ Q_C$&RJ"Hڇ$B;Z5텃"{e*/	}3FE
+hՌڅ)4_~1!̀"ڂ9bhA1j*QFZ Ɖ5pME.qIeD=ƨ*R(GD@-c+.5!9GwڜQP5L.( lnǇd:8W	0[b `&l:Fƚ"P _YQ"<GD?"V+6NSd1~z},f__к`4da,Dk[QD,*cQ,VhA(̈́S'E"1gOUZc`*[15V9Ca5
+k l \er4Ц* c)B$AlMY0t57 >2/9.IuLW RrڸvScQUH=+
+kp .VhW͡kޅYA-qD̹kFI7j|5XCPoMBuVh;e2I'~E<b5H]htZH붆ByoB{<2}0NfLs'	e̽1| LTKoh2R?u717YY|u^JR=3/r]%j-J~f{v|Lޘl̋
+!3R4`ԯiK=Pb]']R66hDkş0WrLH'CV~k\
+!%/h?ֹT,఑[b3f  bM6T4Go.yasW,2u[nQEGf-|SML~?F#dTP2,Y}ayx7óK+ci!d"ó[aoog[q54uC^cx3kt%-Ɨ,;i5fU^@#4P~ܕ6z#,ոhҀoI9R0^p:plw>N|Ýn-vWSo$
+
+/䯆xmAOA+P`4!Dٮ8L]UⱯ}:>&lhaz$ČYp  ۢH֞w44߼bpS"6NES["ͫc=OTYQRT<L)ꌰKQW"w@=iCK܁E!plRZ/Y!a||Zvz0V'jY=Gp>"L[lamyH#c\"X[[G;k$6RTI4 *> ǴJRf/=KKCA+β-EqkT,RNp:3$-Er]'92HM8؇*x.'EV^:.Ţԓ.FaɄ')^2oECSlhg<SG5V*5Q/B&>EBۥޫJ{㒧LaeXn̢7aGt4gK@XG/>|dg#ieI vmCnL8FkܷSO@~_IL$YiW
+tUXWQ"t8i素}41[wrfs)BII~g{u$ \9TXA&qF}&5BA4B_HDi&8p-ALjV!0#dUQTBIAP)X[p:j&nsRV07LEAtrhQB"sAC3A<R;qr8x1z?ڙUZzZ M
+=fc)XΒҜ;$^;A \QY55L!  VBm9ǍDaZz`s@wKxU<:nRèVɱm6<LvOӇ/wZpPE`Ge/|vkC&ݸͺeMJݐ$qp9[*k1D~=H(̓'%D{ݛ~qGg_U{eI]mW;Tꉁǆ6/<웪HAd_aь)#Sg{rfz;+w%uAkA+6&׮)S!j=AƘ^ƉKrsfjXI?}wrȊՋH'ԣ.fa/	_HLiݟRg|+=5V*5QP	goE`0N)!7:qc7.y+pq{}޴S`8EXe@e8GtI>}snҗ=r9Hƶ<u P>q8u;Zh?/%uMrG|Jy׹?}Ao1+!@4 )*RUEMnUw`ςP^y%ivo=ɇXEl	5]O}\xl:M$}e|]q,B<Uc.ё	ϳMw.vPRKf$uY"8A	^nj΁@+ƶv撞a6Ȟ?DtLq|l}Y.>eTSL+R)G4O0*
+O{N"Yf#㢨S~79&^l.BiGq{n'#=,QJMEp$5`oY h0@ҁV)+Q!UXE+gK=*ޙpп!wp77^_񄵖N/pm$c_m-ϨT0+@tQҢ]iZqbؖgB{e֗${o潱2
+9J-<Cz<fQ#Y(	`VgN^
+7oka~g>1p#0K0zc
+i@&i{)z
+>[\ lKA6Z+Z(y/)HEc\ kaGp0OAڼ<Ɍ#9!
+=&2Ͳgqu"}|izR-!BfԂXhy` `2 <fΫ`sЪBU~MޥDp+:6.@tF+	@ZAUe7urZsY[j|a݅+12C=oD밒:U[iu`b<q{h;WK=K:$lTk$Up_T25SNzjigmAk11N4PJ=X;*Kb4kJ{ڛ.Bo73ϹhRS񶳗|CtRIS/Gq)<^#K
+V}5bBx`ŪL:S\§h*Kפ!Wwϱ0$vId5r`*i}cXQ`֓Ds8:|IzO4E:pO=&7t*ePrG;I' `4XIQseW9WT)K7y֙ӧR }n.OfgA=Wuw۷ZzuQَٳ8e4NWn0|9`n^k'uh"⶧M,4IpW6^P&u~3ZMDED#d!_l02juwӹB
+!m#1%OxNI<-7)V,V{|\D
+QB
+&xIvJH~	9=5`}N~H3aotsu}Ψ4ZpЌU8Xi <6	U<S^6F\WJl/Rif|PuO.:ڑFP 0LoudZg9\=~/!)Dql7ԭ7yXM,52wQyq~s2_̟γχ
+$Qr[^0&[D&Z;b$}L)_񾋟;VدQV]o0}ϯ*!(+Z
+MӤ87Ě#ہU}ILM_s=qb(j5%C=}כD~}2	LCFm*EujK{^	兀kVo+#>b
+uyaʌ1P)bH"$9@EHä@Ƒh-Ý{|-l+'̤h>1IXZ"PG R7$r/3O/}%4|\
+maLr5̥H:W }mC-S{9SlKClTmO9翊>A51:O\R7œUVR(W_Ilv
+`8:95]p8WCCǎҧ:UwbJSd5[".v]ڌo65-@,DDeZ[fQuWi3@[.s	<؟͂lI8ڨJT<*fm>>Ly`Y*lF1
+
+7@5^5jv92 pƧq N8Bc8+GA	֨̐%CrrڒbNMM+y1=<S	B)я,!߫?O?NFsSYH25 RyK&W^bPGY(_8Ctxzm2K2L?goU]o0}ϯ*k)jJ]UiOqn5ǎ('$$t<,sIrs%D%3Z2ӊ٧4DXD2ft/8 ވMB>|6
+dpÌźG8̒`
+bnlyc%LSpȈuNآ6@	BK	RpTAXjDfw~ޕ(a;f!#	JxsJɓ@m8ḲAn/]g_} $.0oL-U'>is1shЪZ ` -3Q'Ό2Br^L&(wVmp	64*O+6QnAE,_KYVL),yÊxtx3O_+ܕ1+k}$πvps;gbؿ.cqTmrUpU+U+Uh[-ge21kH#29"߳cLܑ[k-;ɝavY ;<_,Aw2XC)wxFp$5T!H1z7	;K;le	3דIƍ0E6Fsfİԛk*{ZN<)&o帾N]2g;>Fpmu,	Ѹ7CW[UO0~_qh+JוBTM{\B,\;9W ƹ|=9KB5{ M>h ǂ A$XbxąNx-x΍B*zDc	NQ8]O`KFV0ט?L8AHt@`*5bZm(#lR/Z
+Y1+:D"#\\~_P^#m01X'tj8a.y(BJG?}EAocOdq_]4$/"kPv\2"_)y  `4t6JʊHq9:sbĚYQcn!fJפ͕ֲ^Gt󘁓t)(U܅{sLy{j46*z %]脉/HBe0IBogS720~ߐ-ij]nlB%5t.><7m^KeԨfv 66zC}yK(O*"^iBe߲SyWrwnʴ{*;a__^#ݬ&&fT4_)jmeIVR,kͰoV	jY'ϕ?\;КܧgJcFY"֧vGA{H4B>ͭt?5B=80R}?/Sn1|Jy ڄ@Q%RESΪ5i+w^ xfgfj 9j{,d<K@_f0KcCP$PgP"n|x!*z!|F+EyCB#\q}0E@,& (N,xJ'aݨ'5#VbBacfv?%ҘJY1䆷Zó$gI#hז/2AiBѝU&reHl/L[';n3`qNꣿ ` Ӎ"(r:d6J6<Hvv.ZVq?`vojJJaجHLtjw,*RcR'0l<'C?0.G¤tcz֯bOT:G0v@idMVtFw<t*Knm;Dr MʽZcbhx4	8#Vo1Vv=RH22Q
+ʥ:Sڝ
+x҇8?KydWam:yطg-I;5Uؾ_mQn0+m1z#qh&0hj-Iawe(S ΌwUY!'Pխ+<3t'+O;Mq3T8>{~`a8jt;vFԙ/Tc!=ʊb)aBYВlOl,!|0bdpttj}}yHRM0-dv89-)Ě-Ƽ<͂9TJÏg<j@kisCsϳz#g<Q@B.3 X#ŏ_HTF	ZLA2ZygM5`1rmuJaL.h
+c{NRRkW0s
+`fZPWbP{ߐG]ƴa
+:5ۚ/<_}m}ay'_Ӗ?ƊIkv;|ns6ͺ!:[_UPMKAϯx֯f83&YKjE/yyXPH^h&ɶx<qGxh9XQJt00naƸL%_HL1bÇ`Ek>:Lu7Rz"|nJ6ugE',.%8PVȫ7. 5W;fwEo5hX-Z:	P]#+ipܔ#8I/VlI([-> n8r3ْu][Gj{O#hOVnF}WHKd9v\IP19^;KD/]qwrΙ١ySMcNWt09JP9mV|:@mqeʩe#\:<3r/4<'>rgm\yA&Cjwj^zMu9cQjt=Xk2^+kI+OW7!TM&AҥfKA)6'~\&9Gt[ʹxle͗OfEZekNT~Q^+[WA_x}a LNNp"bO)pS+ts-L}Q;],im?ׅUx΂
+CCve&Ƕh5UfYKZģ9ɽw,yaS#> _ޒH0d]+WxFpԼEv@܄x<-qE1R+!w@6`x]A-uձaR0v+㾨Z=-2 7WޑiKv
+KQ8bm1"L"쭆ENwؔZE-q0,LEn+@"%z|2=wmNnBCTpzl\vhwK푱Z nLM`6fӠ@kOnU@z.;w`7{If!:%IѩeG>,l>o9iya,PcLQ
+TdR195>,{ԌEaeq=ͨHXdvmq.+k7_VZVM9
+Ø pKG*~?)VW(ϷM&e	S%
+9I@(͂w0_S\.}̖N:Tk0!?צ͚,$>"cQYҤs0)4Iҽ{/&7"b
+N+tQ4FЅ\8ȄD:y.8  [	b*{Zrpì»u}8̑`
+D73Am$z 0׊XRJGKQ92mFB!lBtzP`0ti9i]0R@gG>럡#(*G*G0>='lu:
+T(6ͣ;"l(dL.h'H=H,Pe؊  .m޾+:
+}|V[rxĤ[!m{cwr*^/>;y1*AKG[q-(]b㤪گL[d<]ɫ\?fnIVM$t2 >q?к`?0RM4=_mU,r8;5-Y-m	Ӫ?ԸTcne|w=ozu1A=NUI߷j?宒if,RiթC^=7uԖU\֧E܀۳׻$CUmo6_q(RH2xIcMb6t6$ˣC@%ۉ/wϽ=w:p9fYLY4H:t0@Os<ԸfiŔ;H>Yp!#8gV>8<1>2r)Z8Z02ܠ6"0CpRpE[paRH	ʻז"CEBM1':#\ࢴf|g Tqp>y҅2)"fHe8"(*ǥ2Xܤ_J?*Ww$($#
+׷h4	T2 @ӁќYs&:Rn3pJ\<J}xȴ"g%5Bm9Ui7--(>ˤu<g.Xa5bp$qg|g[zOp#p;d4vVih,㐴+q$U8)0ZqV[]]_wy$!u_qaPmwz/I3
+Ņ1Ky/xVSX,F(XLsM_ŖA[Ӛ]aպGu:bF[ Vs&E_xJl7笌g/Έok-3ً`J;6a3Lbݡp8K~iT5fKRܴߙ,%WcH)\!&κVKCʑ"*Flm{NN?{}|Z㓽p'5\Ҵ4de+ߝg[{lKy`ukvgM57cʦE@9յF;]kpV8V(A|(WyRn0+ޡ;HZ6iע
+E,;()J	->qS'im"#}qULy6Zd(?Y/C*13`"b2K: n|XW\ĎpmI,]M_ާ%TE1ĸ/PRB;a3sl?{TYm-N="]U~|cR)JE&nHI棯Y/_,eN-(	;yibĄ#x^,97\گ z=\-M,Nj_bOTڻ(\k|"ZzjƬv:OO;h~06}l3[6YRF5rPuFOM8sGj.׏\S*N,>mҖ3'y.4!8`+ިќd6/#zPd>j)qgujޙbNRjAyı8Gb/So6VoF~_$rKIlI1A%J[wڑgO(+^;}$O>{_kt8Bxc2MOFpa4b	%ܕjC#h,lU;*<Kg>h4_	:CY?-<ʐEV!) FʼX])	^kwуV9&PfiEYB	`hz{u:@5ĤD-2XTVI	ȳ.'mS+	Jtsl42y,9g3vce[An{wNUp~gQ~QR*JA+Mk2p{ `zrt	rjB0{1>*Xְ8Kh.DXǂyk2k#H)/O,T	6yە՚ZL\	s0}i'gPi~er"
+9N&Yߝ:¼|z@1q\aɮFkikeu@B<FE9zch9JH1ǉ4m2-+MFtje3`A*ȈZ*r؃OJjtb!#@2%]v.9kz5@چ]1_ ;COG"Uw+ZڏYwz"w@f6!=Ǿl-[vkbᝎBG RMm@(
+w@휻v$^WG8;M
+oS<J!:eR)y5ci{L?lD8%np׹0D&<󇝘ʰ.Cn/9E<HfWuBEw'f>蓅G0w7QsİN> 8r[yG0PꠊOo;8OQP"ތ͟%N!ݽAH3tѿMQKBAWGIzM+K	wC;Wǽe83ߙ3gfg8
+z85/^*	TˑzbȻW%2.Z1yW
+E<qzi̳ϜrEٷJ5\ϽX!I@*)SeOn^,wnUL=)NTxIC52lr5el=uz?25FriՍT]IM" rbѴv'"$r|omPjAW8^zIHh{`Ƴڎ imLɿfN3zOi95ZoLVwzJ(eQ
+7GyHb(g<tb{ބ_*2pŽ%vȰN.aL3LƠLN#˻sdPtރ3ۓ ȭQaɣᱟۼ<>}>e>:p45_/H@sx[!rUӢ$c^Ȳ(:[q{ŶeQXoD`^X6$	hjd6yl1e `}0v^+`g'Ml>v6QNGq|up}7@p{	o|49qʨx<'LG<W>?ĩ&/(V)
+iӵ'ɅB(p9![mSn0}Wp@ARcMk,@K@t-LNZAd9<7j1̠o^]pSn![R~s
+č~ѐKf$n<x`8s4piFdd!'elpPB@twh#DWrZ G~wss*QNBmc8qJxr!D*%dZ"z.&"2G.rb"\!\fŧ{iy`ohh%W,F<3da s'#Sӆ!RXy}pdTG$E{MoiT`4Q]ޮ_k:?Am DJZ2yD~pͧȢ7hs-#RZ*"lṱrp,W=ؚ24	hGشAA)ڬG\tw3
+eq7n||\sKhS&;5*+YAAʍ.[KɄ[~b¬0KC2sUhP+If%AszyÆRNj"Ν
+N:758*wܘd8N&ʟmWh5B3b5"Mn?cO,ז|zR]o0|/^KWdXa(f/(2S$E n~`z'W;(QjAy&%y;c>NFp_+ʃ`+UZču;R!9\A&NWī0L|_ڡu#)AZäV-N%
+Z|Th$Lei#XYS(<Bp۾v{3>E1Vx(?ha	[5pl@AڲoyAD_m"$	>22*2KA$vӲwWiV5Jt5N0??$    F:ZeGp7NN/ptsa|2\Jk<Su"-kćy%Ї+4>f|p{}vHClukV#x2Eȁ̱#S-(i^8#	UAߒgjACeҵ:/-VSk[0}s|<"fݺ:[A;,-FN&' To6PdqՎ]gYhـY0"F%[-k1~EݏW8PjA'%:tB1J#('ȃK<*ʺ-U!)\AAgdp<g8->
+J	K$b
+i LOn@KAh$FP&^Y3Q0Mu(U]/`|>g[D6k(##NH/Jip:;Rǟ?_k\(Z0mU?)W 0`$~[e6Wԓg;0M&A=[:ץG>4iۤ5p΂ y-zB/n:Jt?[,-]j%8	WLtRWmD̚Y$x¬&tJ޼7=m<[o=)JtzrrHѼ Q9$Ff3xז>JD09cxcPr[rKP|X+Qb\jRX9x?fN/N޵FK2-IhBJk	aϕPW}uJq3x˖Y	h=YڹfRoX.kubi{KY@æ^4QS'7/5:A_`ыob0~y~ݿj鐓tHl_
+Y@bt6/N!,v[}*	5j4=GN1)R~zK
+FmJ(AZ9]c[lB%jљ9ߙwCFRO^INy(uIRJTas\jI̺WEhN!|ܑ瀡N0'c'td(05բbCcxa=$֐J	er+k4@X*Z}_&g|GTx+%8 mqO	I*z#$¦t4ׁ\ylz$RQJxned? pB+ߦߧx6\N1B2wƮLk~'#Z
+&wego'+#v5$Yiۏ;<<.cX
+&wsen6Tjm<q^I_
+k|2KSzWD{/UA/;|;1F󣣝n9[(nS_mI2|-mex$Wl7H<& uQj1|WC44IiKP(:'z^)}[/Y}jre*D;D)^eE\tf001mٯ[EJ|@Xsˁ)T[Qo>SO&L\ʾ5?EUupzfwQV}S=m/˛`L[XAYll^bώb|n} IZ˷ǐHeL/y2TC]UZSΊ<GzO, @λCtGX*.Kp5bҞGbsMf/(Iz]Vyb)ƫ0kQr(ѲOf8\o`2OmOk1mҘ\c'uR(%SYKT캡w?T7yyZ/!-Lӝ,|AІHbY[<Ӆ+fnM߉UhݜcK{+l=uX$l/KjM\Naif?ezB^18JBl5t
+t}~z8ZAEA=ܱ#L&gb[~OÏqъ`VorPJ/bMo5=*ʅCop֟+s}m\$ʝ^ǀzjw7`l~5ʤTaO0_T15fJ)+C!M/ۄ\X8e;)hߑS6ظo{wO2(Kf)u
+o!8'y ÷J8BaCDKT+֕G'8Y2uG;1hgOqM+`
+_!#'2 SVފUu\[P6R#Uj[3/Hb
+tu_/N.Q]cbP+мӍ<Q&g'\U^DIҸK7R4fBFmBLĮ?dh$\2pk)ï ,òe6$:icE<%Uh;OEiVR[>,D!!ry4B/7+X#LxA1w݉J'}s;Y|ca1g'ÚMWfwjza(˳lͰ4̲/_Yq+NyUբ=a-q0ITQ"J&{
+u EWHX/q+
+h<|4a-ZR;h<EAO1@<"DcHhbm,mәe1nv<{mv@[}r}5`/T#Oz2ߝb`+q(~pQJ<O*c{Xd9+}p
+1&So9
+:Oqqr[u`Hђ
+WKjeT#OMK&:*723d9w16>CjcHTq'Xɿ_ Tn0+I}ܚ8um>:M%"4)+F/(ˎ8@y;%/ߗENI^$?y^D~>R<JvBmhAlu*/LG-9tet5³_"KLˢ$[j
+@AZN-+ηU5=d<AukʚJM6&&jB0j)r moy&_
+I+G.i<*#"S$FI_<)ë(;^-=V'iL_ʑdQ47NC3!'r͍u*O ~Ӎp8S:L=(wIj|X4VJrXIvG2:`r4$=OO*WﰴVwqg<"W)')Fǣ\q7ǔgЛߒ $"No4taGvҺކՈH_^0!+;T8IZc܄g\$X`.IƌtjIYáе؆L9U~Prk|NzzÜٌ:d#v"N9L?mgYcgFLnam}56X}9v!i<>#Hv xL&kebGl*qFF TO0HĤ}Y)mM|ۦ\׶NK5ONI˗${}2
+bY
+%?MzI'A.t`=
+*gcW,gX$pɚB@!k6waBSt^TÙk.laXE3F{vu+T
+Ħz@+)H;ss.XEվoσdRU| n]2XJ_)Y5O"sr]<4?t(4I:G׽6`0ߎhk@f\JQ:ZazdZ.9ӌUD)1{41T2Y9'lы"9qFA; 8tbaz&-zCe/GV<-lЁ&}WG6 _YW;qur!M+Ÿ>VxGޞ3._ل݆U.x.Ou_JR!n'p]Zx*ڠi*vޠrtIeA㻸GGrAr*+HM0>	Oى+5ZhŖBv2N>4l0JtW֞~-m=w\>R9,ﯶ&UCp4{'̥o7 AJ%`jzt&&u_) :8|U*ڷ_u̵3^ioC!?_0*ͺV8ZOuR[o0~ϯ8* ((FVZ+@ڥqNUc[C+CHsiv/T BʉFXͨ]ڽB3^ۃ6,f fPD[1<$ld>`WN3jkh<a"2"Ҝ
+#(k""RXV7RMs挢0LRoeRt@q$apn'ʂلX3G-`lօ72	AExHa6祦(0󽱸	Fj&p+=rb,^-Pw+5  z6DDWVmE8YU3HU_S7MB
+ʰ\R))~,t
+ђJ}gn9T[Zc53יقוŘ6l΀[Dn6DD9bbvjf޻\=?Oi:,;L9͈ZAyYzEl6kut#xx` ׷dq?OƳ~//4bi^O/)xeJ CtFjwo8J1UOLKix`-1]}Oٰ۪3w]|i!%7;xV[o"7~_q*΀hhUj!,F4$U琱^U0l.-/|՟|frr,&ޠПDAυa@a-EP .[$BU2	-98gVŪ~?bS0G]parH@`*Y򤭫^k#-GZka$Vw{sy*PQvA&\3	ʁBN{GbtqE$HEݟ叿Ӥ0!,`ֲ}	)~\Ǽb2^Qg-'2=}luz+;!W~ٯ.z4ܨ-"h]}hV%{G)d".s`% 2[Bqòb筘DBQ=p(Ư{2VZE[RGLf9^ű0=Nmi1sj<z+-G=7F+T`
+p"PmR'piF"7?lq|[QOwuxhqE=mIӇ1my1ģ:^KzNUE\} {)TOHr`;)wЕuZ]|JpXZMP]_06.)f"Ax\5$&5<QъKL0χth`DӸ!ĳNo0sN	B-8+N:!0O/7=.)*V(DxBt.GAo EhդXѴuVӸÍBU.2vrwE}_ܒw%0_,-aִvsi$R^*(#l=O'C[awR`e4OfG_Z_o9	<u8 ݤi]5W\{A ҬIj$iFcmpFE#%"+ $'#MԽ(/d'{F%h@%D(+|>CqɋLAp!P^|Y~b7$RQ,Q+YYQa)$)ABVT*fwMDlņ(Dxh˫+(2HH{a
+Te"AHxZ<1AYCFįhTJ-K@ ?K<lΘ~^L<ecgX2o*2i{%;V*|zK&^	z!Juל67
+I9=Hik}[ `vrD@#>=S@Qh/&"K+-9MZsJjG헉#u\?G̛Ն[<] T*?g]v
+͵&VnScoWN-X43_	fW}HgFcM?1.$UEa4N3bl0Y`[]Znl}Ӝ'0kN!V>hn2"	V}{w ?Xf9@^f4OOx.]A-VF]3J([0n0&;"+cOWU+w2vXYe邤iIô5ȵ@U
+MF})6hƑN+i^5?+a{ 6;93'p^A6 ÑFjLu{W΂@Fddħ6U(Ŗ0;LV\ I2:gbU8f.N5sٱ|vuvM2w &S@=찕,}$kt2Aa|
+)RTLPOκp"Ls+C6_jsg\4~REߚ=ύvϊHBEA2e2K:6eӅ
+xj1JCfmA-^nd?TQB(/vL$벱)V5tTY`BWS0oU +^tj'-4&܏5E."N%UJ<m؟*3"-P͢5s{"͏ø& %,Io?\I*<x7arv+k=%cg_ix؛Wշ͡>B{Ζr]ռm0p>*Wua_ٝRJ5HGGU6|{nvOٕ"1[@ߘzv)^@hWV|[
+{WMaЋ~.,w)E:6,0OF<[?̏FM<]*L+_uJs[e;u.?}0"GnW-Gp9cEy>l_MTZC{"ϭOmÑ'оkw05_Րnd4TM@'xg;@O0O.`	o?;lqS"C8<T͛&iq8H*u([A'P޽OR;X]^un_v2mi`$T4Un)Tm\pE[*zoZvv\:7" e Df-BZ\KPE9P&%a(B[*;Z-Т{)sGvW*km1x:J\{5v;KM8B	T:vGS дxt|n
+,{|+k$LqS}1JCr}sk':py<fWdY;p%rQ\?^m᯿+vSO;ΚMX~+:G]mpa݈=X朘㆘4ᇟ]z6rz:KC3|ɰu1-1YETf0Y_Sl] $*;?jtr^wFYNͺI19H_FWn6}WC It
+;v. C"`^Q{X93
+Hr0F1j{z)^÷iHG`
+2œ Rf"g%Dh8#JK~z|!0"O,Qn.@Yp@ "*Q4RF*0BZreh(
+D*UNbGܾ͵儙x#+.Le(I#4$G]u+܉,W_\IZ(̲Y{	^}| &7]̟Bjz}g_Dkx̹] 1\lQr'ĊB-1G̗AOM&#tڥ`k#^G+)M]pa2%4܊-,ybaTCg!QHKA-R%s-rc}XoysQж	lVUefq-u
+0Xā)}>Ϡ|%Iܵ>ѮʅmwS($~!?KJoϳvfBS*Ѣ}qEoLFD[v.햬fn6+#j^;[]:(e+t:30^x7'9*W4W2~E&GL{ &y}5;k͒*zV5r9u&;htě-a$IrL,io5)
+exUARk O3,
+]*1mt2?_qŌIiо5`KC`UB'TcMI&<QxFpjٵG6p`B"(?aOU	O.!9@Wb7j6z5>`@ x Vuto<Gk)w^w:O݆Z+}#$
+S8fT<ϧGie1O'3j\u
+Θ+H	8DVV|-MQͨ'kn0EYlnG&M0hj,Ib8!4zqvp᝹5dTIIraM?t@~$^ʁ`JT Jŭ8ae>F
+}@bA{k	Jhx	&)mb@ͤvr!a)ݫS%Q;})
++<}_oOUD0H#8)N}xg2DMQaz4r# Ȝ;u>.^.qs%*A S,uZ¯  `<Xg6lI:euֶ#'wR%Ϡۭ41eگ2_lftkB:~CY0mu$Pu`NiDxދa}5z]!.^C%_jbz+LuvA.#f]*5`ɤ
+sc6#}:s">	Ug 5_Iˌ_Hd(&Y٘EMOB1Ew	@\
+Tc416y|CLΝ;2j
+Dr}՟`W/TN"cNѳ}Kd\T0yVQ7Cl"QOrT΋YvS܁XæW"TѴ!^(T>!r`{Z-ϛewTL)$ޫv%2lϕ&Җ%eUz;}dbL+rcl <xum5%>(Zc2MoA+|@JR-\Z*q!Mf#&$w4JQ)͞~絧ocDP_(7Iq~R	|k@<BY-qǮnvWLＡ*05LxcÕu#&dJWM=f`)Ur|A`{L{gQxmChap}Y\ΣZc(쵰4"Pv2kh,mc&,ۍL"qin	E {FdC^Jc
+ VYl	$(ߍOQB̏X951u0`Є5&-XSXQFR>?8t^~md8jup
+5;Jh%5'
+[yJ9dqm6CeiA=䥿P8jFAc\mo6_ 
+I@/w״1v4`Ҭ5WTI/8"%%J3|/Ù!5<WKZWEꒈRU52褰 HVQD(-S;*3*3RgUQPf[ {<ʠlؕVbW**,˶m](맏F|RE
+@fe^NӃߠ4<<IߓfG嗗͎%JB	r[OȞ--@+JX;wͮy7.FJ_*8I,uvvD@{VV'jEwS1}1h[w%~랡kG(.	h#I]	#b
+IzD@RI)vpMKJZq, N܏Ģ3zyYp%g[մjҍ|eWV#ɴr4
+= ]8!&fUL2Fko۹kڳݲq'㘂\3XB
+=Oن4I-h!|S+OxN;RdnIxX}oA4O0N{<vbLguIUuXx4
+ L?!^SFC`E4A9m}åLʉhn<7Љ{lT=F(44s(#J4ҤTBq,(g9VKcp7l:'~V0
+@Tk	[Ǝ=GJ 
+(Z*R(D%-SSgH~;'@
+(T+bbh^LF-=q>Fwx=Fr=~kp/bLztE{\n@<L}^e2}QDZjDTJZG5V[:٧tu
+WJB9Dgg{!B@\	j20@@ʫHBRUmfB~~Jc;uE#-yT|5ϵ{3dO)WTk@.FDș2}xڻ0QFpq#uH[0_f.旣NUn	iݞbñ4jSh+|L1=Ա}ÅZ~3wn1Ipt2Bc.A!XD,>5L\D{зE̻tVA~3k؍#M5b]*0z@p+Rt֛NJPk#Dvj	mSF	.@6z=1vĥ젱JkcƦe5`1?a'@M>iE%W7~ĄI,Y'G$ܚťi@ԄEF_gN=%
+-a3_0zķ)zȽ:{tOX?$Kߒ'DHE'4\p ~_wF(gBK7Bo
+(7+W&Ͳ3*Cyx-?R(ufcKL٫iX©5}DhbDtk%oERys*ec/t#JVP6\FA+NNۉpyOinMnSl_rDXsL <=.g g'iּUS]Ӛ-o[S.gTL*JGue`pwbUo`{cz6$5!>	B_zb0X2zhsfˠ'lz1+?:NW(/\]W=ERtEp~1Ysekhxk/#BKvsJbTV ׋:N4ظ[_mS.wX㻴xh$.cܥSWc
+F?P-okF8R:?7_ zt`㣃FCba̄ي*vY~dƌ@1cHM;L&
+>jY,0 UcV)8cP:U^X ۭXAoN4+HMoJ@G,$H4-M
+n3j9DGɇH:,`w`.:rHp	qN7_y=8;ٯ !'7|hhM# 7|L=L,F?$TCk!h]$SL:K!m@<('yZ$w$##/_8Տ8a~!zrՋghhQ@MqQɢ{ cCwҬ{HXTte\=q&˶y [<b%?4A+Cx+cf5tq3FG1{+pTp"eqM	}6:'.د|օ>bD+b4tU>[%tՂCyV6ϑ,/!8Q%\;k1pX89"meK:-cl-z*gvYfe=̭HG)̽9ۻ8sȹÅDeZ	"rCrx~!vB>̩οmѺw2ʀnuܑ,pǐbf;\1Bxv8_EΤw /M?$IN?Ϧߒԩ * :9[_]ee#)_hg?>.ko뇢:vN57<<;34vm{!K/hE%(H/uADHy-?LO	d)&HA$\q[VkI&ɔ7)nKA^Phgd7THF3Jh uyB$4[$$g7̹|s"@e]]a,L a2*Y"*1t?JoL$TZ LTy Ih|&@.ה̿iBafB_',DBV E)/{Ȝo	Do/˳s,'{{IJ \#ɫ;IVKْ6x@%^R^ڣ.yʾ]?J#<ֻ<@A7I*E(oRt깾ֺe"'&%fT=E<SsxVScJ7G'F5#
+Ue'Y%`e,A<#vXz<lh'T|2=@𾔲(%>n2#V\9; Y˳=7zJ|6$,Bghgxv5ꉗRS3̩o1V.db+P>jftzPDG1x	Z,+(r̄4$3P|W%"{.ԉYQ߁ex`wȷZңWz~ۤjBOLgk**ohJśoLIE@Gh4r~t	ITqj"CT6$,,=^"=bJo#~|󋖾=_W۵,*yzMRn?gH3.d̲\r*aqW#9z3}}kzTQ{4l*O5?]M]=Ya	r&SD̈{a3*t=΃	aCƈTpj^|eh;+QBxnM:Ns_jZל߲lN{+6->Hl>fl@>h.,Z $honӉQ!]nuy=̿ﳴo1/\7SFEc;g$1rcJ@C(,[;@h c/^O[?'U5<$6$E
+f4}PEL ӆEP!ܸYkK^,|Ɲh-^}[4u
+	YlhDcb)hda!GUzʕUƋ|xԤ8uӑ_yjuDZ[e pBO̕5tuXB^[9҈ɯl%HևMnsL~Tͤ"]A! C<̈	3Pw[>HY7Q3e
+i74b.3# pPh_{|es [ T=.庳/fy<6e!6؃"m*%jQu
+UdISb-e!fŚ#RxnOɿ壳~ݶ	Pn%Iw^ilkFnμؒLIOO. bQy?]3(R/T}̪& Mž7֛z7@0]O:o8^	d2mx|Xf'H ^=Dncn1MS`2`t}&0&K8#0,&B ]6 ekRi^FpΌX-YAݶXh2Uj5H
+6uۧ^P=u=y߭"j蛂JvR&9kiǄ:",C^״fc((39050iU}0zpT1l\4ި[ׅbwG8V̌H_hìX
+L{|mVl#YYlQYrْ5$:#A'	!͈DTxg?t3E)UC:7@NP'6r&;RL~?[)7,(^R:I4LZxSwU(p*͟iVS3}uh`c*>6Mil?n^6E*٩i<ifĐP/"Ϝ%i r}59"GGǪXU wT}l`
+;~}5rj<
+>L!Wg!tQVTWA`eO#xb<Oɳ*0ovMj4'r4-D#8K<Z9~WQj0eԘ"Tj'Ȣ=R5b"
+'PEw1*
+D7گ1ņ\1L]`c-3:Ct▉p<f RB_gq:Qx*@m|?P.hŌ}7uo'ᙊ##"9GqcWu+@x o?kb~d߽3>&}qsljho]8t:ߚ^gPzMa e{"AOoh07Y7˧Wyo}15c<cNW:V;I6CRL>0#,yXƴ< F
+@Žvz,$ѭb;s\ƜC:T&]7OO@&=Ѱ5E4P06#]nvj1f2/y%l:gWKQпt qL ^cfty:`L|0$A+EH:(PlHEO%0\&y:0$N'
+
+T{nz=S
+;Xh#KmSJ;_5nk`\bPX*Iyqv/u
+KSЋ`i9@'
+#&be)-9ӆ8rX?n~O?=hf֯f[M:dq='oxƀВ=G+46~(xT=o0+5t)dj!)L%"")ߑ2Xrt#5mZ^-WR7÷v`SѻsѳumTu2PW+ϧ*6Ǉ@.AcK)"Pr\(@KXQ1 !GAG6?84w	9r;L~/s^(:WCybjz2_1ݤ#!,GKZ2{d}5?sHZaǻKxZ`e"_9cbп'1?|eSl3,]~^a0/6dv'Zn6E 1cK[!ɜc,ž0;/(*J-)-SRPPPPN,/H+H//JWA&敔%@Js3KRSJչb sHMWOK*(PPRVpwqsuUVVRP SN@+|KVzBP
+B@RilO-kwK$@AO{oތN9$#8ƟF .y~6;]Ly7?l9lvlY++	 ;Euk2dQwf6@NYF`jCh㎢ZuӴ&MvS=w>{Dߏ*ZaeT-9@bpVud#2khH*eON~=wPF&`WVR)l!P,4d*@JjPm%ZCEc#H'J2fY~'p5ͧU/?e
++j=Ssr~ul*:մF:uC;M!NBhXUtBCp^m	B[~^AԚnz`{mgD35s6+-vYҽG#dĢ+p?#Ԏhvq	-+#>ai~?s<]Qk7Zj)Jn
+eЇ:'$]¬MGPGv;/T\U_]IHr*A؍]0hHZ&+nt03z7>0:   GBMB
\ No newline at end of file
Binary files 7.0.0-1/tools/php-cs-fixer and 7.0.1-1/tools/php-cs-fixer differ
Binary files 7.0.0-1/tools/phpstan and 7.0.1-1/tools/phpstan differ
