diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..ee242a80
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -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 --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index 8179781b..cd19652f 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -7,7 +7,10 @@ We look forward to your contributions! Here are some examples how you can contri
 * [Report a bug](https://github.com/sebastianbergmann/diff/issues/new)
 * [Send a pull request to fix a bug](https://github.com/sebastianbergmann/diff/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 expand the scope of this project (see belo
 When you submit code changes, your submissions are understood to be under the same [BSD-3-Clause License](https://github.com/sebastianbergmann/diff/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 following:
 * 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 username and email address](https://git-s
 
 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 --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index c2fba0f9..473852ab 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1 +1,4 @@
 github: sebastianbergmann
+liberapay: sebastianbergmann
+thanks_dev: u/gh/sebastianbergmann
+tidelift: "packagist/sebastian/diff"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index f1e48353..404d9699 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,16 +1,16 @@
 # https://help.github.com/en/categories/automating-your-workflow-with-github-actions
 
 on:
-  - "pull_request"
-  - "push"
+  - pull_request
+  - push
 
-name: "CI"
+name: CI
 
 permissions:
   contents: read
 
 env:
-  COMPOSER_ROOT_VERSION: "7.0.x-dev"
+  COMPOSER_ROOT_VERSION: 7.0.x-dev
 
 jobs:
   coding-guidelines:
@@ -61,34 +61,38 @@ 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
           ini-values: memory_limit=-1
 
-      - 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 --git a/.phive/phars.xml b/.phive/phars.xml
index fbd58122..55f3545d 100644
--- a/.phive/phars.xml
+++ b/.phive/phars.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <phive xmlns="https://phar.io/phive">
-  <phar name="php-cs-fixer" version="^3.65" 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.65" 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 --git a/ChangeLog.md b/ChangeLog.md
index 4d3379ba..6a63fb09 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -6,7 +6,7 @@ All notable changes are documented in this file using the [Keep a CHANGELOG](htt
 
 ### Removed
 
-* This component is no longer supported on PHP 8.3
+* This component is no longer supported on PHP 8.2
 
 ## [6.0.2] - 2024-07-03
 
diff --git a/build.xml b/build.xml
index 73c6a6e9..67172abe 100644
--- a/build.xml
+++ b/build.xml
@@ -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 --git a/phpstan.neon b/phpstan.neon
index 46b0f477..de2c9d27 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -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 --git a/src/Differ.php b/src/Differ.php
index 44a4b445..c70eafe8 100644
--- a/src/Differ.php
+++ b/src/Differ.php
@@ -182,7 +182,7 @@ private function detectUnmatchedLineEndings(array $diff): bool
         return false;
     }
 
-    private function getLinebreak($line): string
+    private function getLinebreak(int|string $line): string
     {
         if (!is_string($line)) {
             return '';
diff --git a/src/Exception/ConfigurationException.php b/src/Exception/ConfigurationException.php
index 4bd25d89..33891c1c 100644
--- a/src/Exception/ConfigurationException.php
+++ b/src/Exception/ConfigurationException.php
@@ -12,11 +12,11 @@
 use function gettype;
 use function is_object;
 use function sprintf;
-use Exception;
+use InvalidArgumentException;
 
-final class ConfigurationException extends InvalidArgumentException
+final class ConfigurationException extends InvalidArgumentException implements Exception
 {
-    public function __construct(string $option, string $expected, mixed $value, int $code = 0, ?Exception $previous = null)
+    public function __construct(string $option, string $expected, mixed $value, int $code = 0, ?\Exception $previous = null)
     {
         parent::__construct(
             sprintf(
diff --git a/src/Exception/InvalidArgumentException.php b/src/Exception/InvalidArgumentException.php
deleted file mode 100644
index 846ac3fb..00000000
--- a/src/Exception/InvalidArgumentException.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php declare(strict_types=1);
-/*
- * This file is part of sebastian/diff.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-namespace SebastianBergmann\Diff;
-
-class InvalidArgumentException extends \InvalidArgumentException implements Exception
-{
-}
diff --git a/src/Output/StrictUnifiedDiffOutputBuilder.php b/src/Output/StrictUnifiedDiffOutputBuilder.php
index 5c496186..85cea9fb 100644
--- a/src/Output/StrictUnifiedDiffOutputBuilder.php
+++ b/src/Output/StrictUnifiedDiffOutputBuilder.php
@@ -127,8 +127,10 @@ public function getDiff(array $diff): string
             : $diff;
     }
 
-    private function writeDiffHunks($output, array $diff): void
+    private function writeDiffHunks(mixed $output, array $diff): void
     {
+        assert(is_resource($output));
+
         // detect "No newline at end of file" and insert into `$diff` if needed
 
         $upperLimit = count($diff);
@@ -153,7 +155,7 @@ private function writeDiffHunks($output, array $diff): void
                         array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]);
                     }
 
-                    if (!count($toFind)) {
+                    if ($toFind === []) {
                         break;
                     }
                 }
@@ -166,9 +168,7 @@ private function writeDiffHunks($output, array $diff): void
         $hunkCapture = false;
         $sameCount   = $toRange = $fromRange = 0;
         $toStart     = $fromStart = 1;
-        $i           = 0;
 
-        /** @var int $i */
         foreach ($diff as $i => $entry) {
             if (0 === $entry[1]) { // same
                 if (false === $hunkCapture) {
@@ -258,6 +258,8 @@ private function writeDiffHunks($output, array $diff): void
         $fromRange -= $sameCount;
         $toRange   -= $sameCount;
 
+        assert(isset($i) && is_int($i));
+
         $this->writeHunk(
             $diff,
             $hunkCapture - $contextStartOffset,
@@ -278,8 +280,10 @@ private function writeHunk(
         int $fromRange,
         int $toStart,
         int $toRange,
-        $output
+        mixed $output
     ): void {
+        assert(is_resource($output));
+
         fwrite($output, '@@ -' . $fromStart);
 
         if (!$this->collapseRanges || 1 !== $fromRange) {
diff --git a/src/Output/UnifiedDiffOutputBuilder.php b/src/Output/UnifiedDiffOutputBuilder.php
index d07ace6f..5db481f8 100644
--- a/src/Output/UnifiedDiffOutputBuilder.php
+++ b/src/Output/UnifiedDiffOutputBuilder.php
@@ -15,6 +15,7 @@
 use function fclose;
 use function fopen;
 use function fwrite;
+use function is_int;
 use function is_resource;
 use function max;
 use function min;
@@ -75,8 +76,10 @@ public function getDiff(array $diff): string
             : $diff;
     }
 
-    private function writeDiffHunks($output, array $diff): void
+    private function writeDiffHunks(mixed $output, array $diff): void
     {
+        assert(is_resource($output));
+
         // detect "No newline at end of file" and insert into `$diff` if needed
 
         $upperLimit = count($diff);
@@ -101,7 +104,7 @@ private function writeDiffHunks($output, array $diff): void
                         array_splice($diff, $i + 1, 0, [["\n\\ No newline at end of file\n", Differ::NO_LINE_END_EOF_WARNING]]);
                     }
 
-                    if (!count($toFind)) {
+                    if ($toFind === []) {
                         break;
                     }
                 }
@@ -114,9 +117,7 @@ private function writeDiffHunks($output, array $diff): void
         $hunkCapture = false;
         $sameCount   = $toRange = $fromRange = 0;
         $toStart     = $fromStart = 1;
-        $i           = 0;
 
-        /** @var int $i */
         foreach ($diff as $i => $entry) {
             if (0 === $entry[1]) { // same
                 if (false === $hunkCapture) {
@@ -204,6 +205,8 @@ private function writeDiffHunks($output, array $diff): void
         $fromRange -= $sameCount;
         $toRange   -= $sameCount;
 
+        assert(isset($i) && is_int($i));
+
         $this->writeHunk(
             $diff,
             $hunkCapture - $contextStartOffset,
@@ -224,8 +227,10 @@ private function writeHunk(
         int $fromRange,
         int $toStart,
         int $toRange,
-        $output
+        mixed $output
     ): void {
+        assert(is_resource($output));
+
         if ($this->addLineNumbers) {
             fwrite($output, '@@ -' . $fromStart);
 
diff --git a/src/Parser.php b/src/Parser.php
index e63e690c..efd8ba7b 100644
--- a/src/Parser.php
+++ b/src/Parser.php
@@ -11,7 +11,6 @@
 
 use const PREG_UNMATCHED_AS_NULL;
 use function array_pop;
-use function assert;
 use function count;
 use function max;
 use function preg_match;
@@ -29,7 +28,9 @@ public function parse(string $string): array
     {
         $lines = preg_split('(\r\n|\r|\n)', $string);
 
-        if (!empty($lines) && $lines[count($lines) - 1] === '') {
+        if ($lines !== false &&
+            $lines !== [] &&
+            $lines[count($lines) - 1] === '') {
             array_pop($lines);
         }
 
@@ -48,9 +49,6 @@ public function parse(string $string): array
                     $collected = [];
                 }
 
-                assert(!empty($fromMatch['file']));
-                assert(!empty($toMatch['file']));
-
                 $diff = new Diff($fromMatch['file'], $toMatch['file']);
 
                 $i++;
@@ -63,7 +61,7 @@ public function parse(string $string): array
             }
         }
 
-        if ($diff !== null && count($collected)) {
+        if ($diff !== null && $collected !== []) {
             $this->parseFileDiff($diff, $collected);
 
             $diffs[] = $diff;
diff --git a/tests/Exception/InvalidArgumentExceptionTest.php b/tests/Exception/InvalidArgumentExceptionTest.php
deleted file mode 100644
index ea88119c..00000000
--- a/tests/Exception/InvalidArgumentExceptionTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php declare(strict_types=1);
-/*
- * This file is part of sebastian/diff.
- *
- * (c) Sebastian Bergmann <sebastian@phpunit.de>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-namespace SebastianBergmann\Diff;
-
-use LogicException;
-use PHPUnit\Framework\Attributes\CoversClass;
-use PHPUnit\Framework\Attributes\Small;
-use PHPUnit\Framework\TestCase;
-
-#[CoversClass(InvalidArgumentException::class)]
-#[Small]
-final class InvalidArgumentExceptionTest extends TestCase
-{
-    public function testInvalidArgumentException(): void
-    {
-        $previousException = new LogicException;
-        $message           = 'test';
-        $code              = 123;
-
-        $exception = new InvalidArgumentException($message, $code, $previousException);
-
-        $this->assertInstanceOf(Exception::class, $exception);
-        $this->assertSame($message, $exception->getMessage());
-        $this->assertSame($code, $exception->getCode());
-        $this->assertSame($previousException, $exception->getPrevious());
-    }
-}
diff --git a/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php b/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php
index b51da5d6..aa324ca6 100644
--- a/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php
+++ b/tests/Output/Integration/StrictUnifiedDiffOutputBuilderIntegrationTest.php
@@ -147,7 +147,7 @@ public function testIntegrationUsingPHPFileInVendorPatch(string $fileFrom, strin
     #[DataProvider('provideBasicDiffGeneration')]
     #[DataProvider('provideOutputBuildingCases')]
     #[DataProvider('provideSample')]
-    public function testIntegrationOfUnitTestCasesGitApply(string $expected, string $from, string $to): void
+    public function testIntegrationOfUnitTestCasesGitApply(string $expected, string $from, string $to, ?array $options = null): void
     {
         $this->doIntegrationTestGitApply($expected, $from);
     }
@@ -155,7 +155,7 @@ public function testIntegrationOfUnitTestCasesGitApply(string $expected, string
     #[DataProvider('provideBasicDiffGeneration')]
     #[DataProvider('provideOutputBuildingCases')]
     #[DataProvider('provideSample')]
-    public function testIntegrationOfUnitTestCasesPatch(string $expected, string $from, string $to): void
+    public function testIntegrationOfUnitTestCasesPatch(string $expected, string $from, string $to, ?array $options = null): void
     {
         $this->doIntegrationTestPatch($expected, $from, $to);
     }
diff --git a/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php b/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php
index 7ae1da26..58bab66c 100644
--- a/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php
+++ b/tests/Output/Integration/UnifiedDiffOutputBuilderIntegrationTest.php
@@ -86,7 +86,7 @@ public function testDiffWithLineNumbersPath(string $expected, string $from, stri
     }
 
     #[DataProvider('provideDiffWithLineNumbers')]
-    public function testDiffWithLineNumbersGitApply(string $expected, string $from): void
+    public function testDiffWithLineNumbersGitApply(string $expected, string $from, string $to): void
     {
         $this->doIntegrationTestGitApply($expected, $from);
     }
diff --git a/tests/Utils/FileUtils.php b/tests/Utils/FileUtils.php
index 5613d784..d52595c5 100644
--- a/tests/Utils/FileUtils.php
+++ b/tests/Utils/FileUtils.php
@@ -27,7 +27,7 @@ public static function getFileContent(string $file): string
                 sprintf(
                     'Failed to read content of file "%s".%s',
                     $file,
-                    $error ? ' ' . $error['message'] : '',
+                    $error !== null ? ' ' . $error['message'] : '',
                 ),
             );
         }
diff --git a/tests/Utils/UnifiedDiffAssertTrait.php b/tests/Utils/UnifiedDiffAssertTrait.php
index c0c96e70..a5878669 100644
--- a/tests/Utils/UnifiedDiffAssertTrait.php
+++ b/tests/Utils/UnifiedDiffAssertTrait.php
@@ -271,8 +271,10 @@ private function unifiedDiffAssertHunkHeader(string $line, string $message): arr
 
         return [
             (int) $matches[1],
+            /** @phpstan-ignore empty.notAllowed */
             empty($matches[2]) ? 1 : (int) substr($matches[2], 1),
             (int) $matches[3],
+            /** @phpstan-ignore empty.notAllowed */
             empty($matches[4]) ? 1 : (int) substr($matches[4], 1),
         ];
     }
diff --git a/tools/.phpstan/composer.json b/tools/.phpstan/composer.json
new file mode 100644
index 00000000..8ef20ffa
--- /dev/null
+++ b/tools/.phpstan/composer.json
@@ -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 --git a/tools/.phpstan/composer.lock b/tools/.phpstan/composer.lock
new file mode 100644
index 00000000..6c4d8920
--- /dev/null
+++ b/tools/.phpstan/composer.lock
@@ -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 --git a/tools/.phpstan/vendor/autoload.php b/tools/.phpstan/vendor/autoload.php
new file mode 100644
index 00000000..87b89022
--- /dev/null
+++ b/tools/.phpstan/vendor/autoload.php
@@ -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 --git a/tools/.phpstan/vendor/bin/phpstan b/tools/.phpstan/vendor/bin/phpstan
new file mode 100755
index 00000000..d76c0be7
--- /dev/null
+++ b/tools/.phpstan/vendor/bin/phpstan
@@ -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 --git a/tools/.phpstan/vendor/bin/phpstan.phar b/tools/.phpstan/vendor/bin/phpstan.phar
new file mode 100755
index 00000000..fecf96f6
--- /dev/null
+++ b/tools/.phpstan/vendor/bin/phpstan.phar
@@ -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 --git a/tools/.phpstan/vendor/composer/ClassLoader.php b/tools/.phpstan/vendor/composer/ClassLoader.php
new file mode 100644
index 00000000..7824d8f7
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/ClassLoader.php
@@ -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 --git a/tools/.phpstan/vendor/composer/InstalledVersions.php b/tools/.phpstan/vendor/composer/InstalledVersions.php
new file mode 100644
index 00000000..6d29bff6
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/InstalledVersions.php
@@ -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 --git a/tools/.phpstan/vendor/composer/LICENSE b/tools/.phpstan/vendor/composer/LICENSE
new file mode 100644
index 00000000..f27399a0
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/LICENSE
@@ -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 --git a/tools/.phpstan/vendor/composer/autoload_classmap.php b/tools/.phpstan/vendor/composer/autoload_classmap.php
new file mode 100644
index 00000000..feb7a8f3
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_classmap.php
@@ -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 --git a/tools/.phpstan/vendor/composer/autoload_files.php b/tools/.phpstan/vendor/composer/autoload_files.php
new file mode 100644
index 00000000..b62e293b
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_files.php
@@ -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 --git a/tools/.phpstan/vendor/composer/autoload_namespaces.php b/tools/.phpstan/vendor/composer/autoload_namespaces.php
new file mode 100644
index 00000000..15a2ff3a
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(__DIR__);
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/tools/.phpstan/vendor/composer/autoload_psr4.php b/tools/.phpstan/vendor/composer/autoload_psr4.php
new file mode 100644
index 00000000..1dc5d9e4
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_psr4.php
@@ -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 --git a/tools/.phpstan/vendor/composer/autoload_real.php b/tools/.phpstan/vendor/composer/autoload_real.php
new file mode 100644
index 00000000..c91f94e3
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_real.php
@@ -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 --git a/tools/.phpstan/vendor/composer/autoload_static.php b/tools/.phpstan/vendor/composer/autoload_static.php
new file mode 100644
index 00000000..041214c0
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/autoload_static.php
@@ -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 --git a/tools/.phpstan/vendor/composer/installed.json b/tools/.phpstan/vendor/composer/installed.json
new file mode 100644
index 00000000..e7a7c7bb
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/installed.json
@@ -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 --git a/tools/.phpstan/vendor/composer/installed.php b/tools/.phpstan/vendor/composer/installed.php
new file mode 100644
index 00000000..3e39796b
--- /dev/null
+++ b/tools/.phpstan/vendor/composer/installed.php
@@ -0,0 +1,77 @@
+<?php return array(
+    'root' => array(
+        'name' => '__root__',
+        'pretty_version' => 'dev-main',
+        'version' => 'dev-main',
+        'reference' => '58d2d6ba301dc234faf5d477ac870d0574fb6515',
+        'type' => 'library',
+        'install_path' => __DIR__ . '/../../',
+        'aliases' => array(),
+        'dev' => true,
+    ),
+    'versions' => array(
+        '__root__' => array(
+            'pretty_version' => 'dev-main',
+            'version' => 'dev-main',
+            'reference' => '58d2d6ba301dc234faf5d477ac870d0574fb6515',
+            '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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md b/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md
new file mode 100644
index 00000000..8b8d5ce6
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md b/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md
new file mode 100644
index 00000000..130e719a
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/LICENSE.md
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md b/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md
new file mode 100644
index 00000000..8296743c
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/README.md
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json b/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json
new file mode 100644
index 00000000..89d68711
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon b/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon
new file mode 100644
index 00000000..a81a7e83
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/rules.neon
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php
new file mode 100644
index 00000000..938cab76
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Analyzer.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php
new file mode 100644
index 00000000..937bf0ec
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/FinalRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php
new file mode 100644
index 00000000..93ecf7c6
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/NoExtendsRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php
new file mode 100644
index 00000000..76e96c56
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Classes/PHPUnit/Framework/TestCaseWithSuffixRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php
new file mode 100644
index 00000000..64351579
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoNullableReturnTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php
new file mode 100644
index 00000000..2c47cb74
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterPassedByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php
new file mode 100644
index 00000000..94bd1463
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullDefaultValueRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php
new file mode 100644
index 00000000..3cff6ee6
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Closures/NoParameterWithNullableTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php
new file mode 100644
index 00000000..3fcbb101
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/ErrorIdentifier.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php
new file mode 100644
index 00000000..ad8cc1ef
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoAssignByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php
new file mode 100644
index 00000000..cd12ffea
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoCompactRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php
new file mode 100644
index 00000000..49c0939c
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoErrorSuppressionRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php
new file mode 100644
index 00000000..b5420578
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoEvalRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php
new file mode 100644
index 00000000..f1443d66
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Expressions/NoIssetRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php
new file mode 100644
index 00000000..5f9ec115
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Files/DeclareStrictTypesRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php
new file mode 100644
index 00000000..06da4f72
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoNullableReturnTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php
new file mode 100644
index 00000000..e461aa13
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterPassedByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php
new file mode 100644
index 00000000..fe82a4e3
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullDefaultValueRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php
new file mode 100644
index 00000000..90275530
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoParameterWithNullableTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php
new file mode 100644
index 00000000..0efb7008
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Functions/NoReturnByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php
new file mode 100644
index 00000000..89fc226f
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/FinalInAbstractClassRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php
new file mode 100644
index 00000000..e8b7e34a
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoConstructorParameterWithDefaultValueRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php
new file mode 100644
index 00000000..e0e84c94
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoNullableReturnTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php
new file mode 100644
index 00000000..4c90f696
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterPassedByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php
new file mode 100644
index 00000000..f64a8312
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithContainerTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php
new file mode 100644
index 00000000..9888974c
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullDefaultValueRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php
new file mode 100644
index 00000000..632cd7be
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoParameterWithNullableTypeDeclarationRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php
new file mode 100644
index 00000000..a1bf87ff
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/NoReturnByReferenceRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php
new file mode 100644
index 00000000..9aa2c3cc
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Methods/PrivateInFinalClassRule.php
@@ -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 --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php
new file mode 100644
index 00000000..127e5eed
--- /dev/null
+++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/src/Statements/NoSwitchRule.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php b/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php
new file mode 100644
index 00000000..25851af6
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/.phpstorm.meta.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/composer.json b/tools/.phpstan/vendor/nette/utils/composer.json
new file mode 100644
index 00000000..74bd6183
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/composer.json
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/license.md b/tools/.phpstan/vendor/nette/utils/license.md
new file mode 100644
index 00000000..cf741bd0
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/license.md
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/readme.md b/tools/.phpstan/vendor/nette/utils/readme.md
new file mode 100644
index 00000000..0038f534
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/readme.md
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php b/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php
new file mode 100644
index 00000000..d749d4ee
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/HtmlStringable.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php b/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php
new file mode 100644
index 00000000..02bd7407
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Iterators/CachingIterator.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php b/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php
new file mode 100644
index 00000000..284da29d
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Iterators/Mapper.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/SmartObject.php b/tools/.phpstan/vendor/nette/utils/src/SmartObject.php
new file mode 100644
index 00000000..3b2203f1
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/SmartObject.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/StaticClass.php b/tools/.phpstan/vendor/nette/utils/src/StaticClass.php
new file mode 100644
index 00000000..b1d84862
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/StaticClass.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Translator.php b/tools/.phpstan/vendor/nette/utils/src/Translator.php
new file mode 100644
index 00000000..f973f5f1
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Translator.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php
new file mode 100644
index 00000000..349ffe0e
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayHash.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php
new file mode 100644
index 00000000..a402f9bf
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ArrayList.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php
new file mode 100644
index 00000000..00a4a8cd
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Arrays.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php
new file mode 100644
index 00000000..1777428f
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Callback.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php b/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php
new file mode 100644
index 00000000..6ad65205
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/DateTime.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php b/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php
new file mode 100644
index 00000000..fb92d119
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/FileInfo.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php b/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php
new file mode 100644
index 00000000..ab9a7e87
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/FileSystem.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php
new file mode 100644
index 00000000..a496528a
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Finder.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php
new file mode 100644
index 00000000..cc2781d7
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Floats.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php
new file mode 100644
index 00000000..b3586c16
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Helpers.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php
new file mode 100644
index 00000000..fc0e3ef2
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Html.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php
new file mode 100644
index 00000000..d2947c72
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Image.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php
new file mode 100644
index 00000000..013adbd6
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ImageColor.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php
new file mode 100644
index 00000000..3092c8f0
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ImageType.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php
new file mode 100644
index 00000000..cc751520
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Iterables.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php
new file mode 100644
index 00000000..b87917b2
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Json.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php
new file mode 100644
index 00000000..f4bd55f2
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ObjectHelpers.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php
new file mode 100644
index 00000000..aa4812c0
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Paginator.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php
new file mode 100644
index 00000000..b14fbd55
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Random.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php
new file mode 100644
index 00000000..87889be3
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Reflection.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php b/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php
new file mode 100644
index 00000000..b003fcbd
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/ReflectionMethod.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php
new file mode 100644
index 00000000..c0735659
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Strings.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php
new file mode 100644
index 00000000..7a178812
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Type.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php b/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php
new file mode 100644
index 00000000..61ccf091
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/Validators.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php b/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php
new file mode 100644
index 00000000..af949ce4
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/Utils/exceptions.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/compatibility.php b/tools/.phpstan/vendor/nette/utils/src/compatibility.php
new file mode 100644
index 00000000..9df54801
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/compatibility.php
@@ -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 --git a/tools/.phpstan/vendor/nette/utils/src/exceptions.php b/tools/.phpstan/vendor/nette/utils/src/exceptions.php
new file mode 100644
index 00000000..bbda7ddc
--- /dev/null
+++ b/tools/.phpstan/vendor/nette/utils/src/exceptions.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE b/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE
new file mode 100644
index 00000000..afe8bee4
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/extension-installer/LICENSE
@@ -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 --git a/tools/.phpstan/vendor/phpstan/extension-installer/README.md b/tools/.phpstan/vendor/phpstan/extension-installer/README.md
new file mode 100644
index 00000000..0616f999
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/extension-installer/README.md
@@ -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 --git a/tools/.phpstan/vendor/phpstan/extension-installer/composer.json b/tools/.phpstan/vendor/phpstan/extension-installer/composer.json
new file mode 100644
index 00000000..b2cc1a05
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/extension-installer/composer.json
@@ -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 --git a/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php b/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php
new file mode 100644
index 00000000..bf7dadbf
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php
@@ -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/diff/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/diff/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/diff/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 --git a/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php b/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php
new file mode 100644
index 00000000..ec757351
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/extension-installer/src/Plugin.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig
new file mode 100644
index 00000000..5d66bc42
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/.editorconfig
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE
new file mode 100644
index 00000000..d0053746
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/LICENSE
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md
new file mode 100644
index 00000000..14ade92e
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json
new file mode 100644
index 00000000..2bbc44d6
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon
new file mode 100644
index 00000000..61b49854
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php
new file mode 100644
index 00000000..eed19aea
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanAndRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php
new file mode 100644
index 00000000..5187cf57
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanNotRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php
new file mode 100644
index 00000000..cb06a341
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInBooleanOrRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php
new file mode 100644
index 00000000..550e9857
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInElseIfConditionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php
new file mode 100644
index 00000000..5c08894b
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInIfConditionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php
new file mode 100644
index 00000000..4fe855a5
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanInTernaryOperatorRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php
new file mode 100644
index 00000000..4ecba329
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/BooleansInConditions/BooleanRuleHelper.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php
new file mode 100644
index 00000000..ca8f2268
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Cast/UselessCastRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php
new file mode 100644
index 00000000..77595810
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php
new file mode 100644
index 00000000..76e401ce
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedBacktickRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php
new file mode 100644
index 00000000..d19f5ea2
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedEmptyRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php
new file mode 100644
index 00000000..cee777ce
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedImplicitArrayCreationRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php
new file mode 100644
index 00000000..70b8514f
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedLooseComparisonRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php
new file mode 100644
index 00000000..fac42790
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/DisallowedConstructs/DisallowedShortTernaryRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php
new file mode 100644
index 00000000..f710474e
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForLoop/OverwriteVariablesWithForLoopInitRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php
new file mode 100644
index 00000000..0cf620c3
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/ForeachLoop/OverwriteVariablesWithForeachRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php
new file mode 100644
index 00000000..6760c7d5
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ArrayFilterStrictRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php
new file mode 100644
index 00000000..4f41d26b
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Functions/ClosureUsesThisRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php
new file mode 100644
index 00000000..1dba6ed6
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorMethodCallRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php
new file mode 100644
index 00000000..fa747d6a
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/IllegalConstructorStaticCallRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php
new file mode 100644
index 00000000..5f800e50
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Methods/WrongCaseOfInheritedMethodRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php
new file mode 100644
index 00000000..4e87a885
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticIncrementOrDecrementRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php
new file mode 100644
index 00000000..d0e08099
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostDecrementRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php
new file mode 100644
index 00000000..400d8288
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPostIncrementRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php
new file mode 100644
index 00000000..9d583560
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreDecrementRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php
new file mode 100644
index 00000000..d5d81f2a
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandInArithmeticPreIncrementRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php
new file mode 100644
index 00000000..80de1463
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticAdditionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php
new file mode 100644
index 00000000..e95b3d62
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticDivisionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php
new file mode 100644
index 00000000..1992b84a
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticExponentiationRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php
new file mode 100644
index 00000000..5b5f3c32
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticModuloRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php
new file mode 100644
index 00000000..353df4c6
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticMultiplicationRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php
new file mode 100644
index 00000000..5559d60f
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperandsInArithmeticSubtractionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php
new file mode 100644
index 00000000..6de54cab
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Operators/OperatorRuleHelper.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php
new file mode 100644
index 00000000..492aa604
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsCallableRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php
new file mode 100644
index 00000000..c0ae18b3
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/DynamicCallOnStaticMethodsRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php
new file mode 100644
index 00000000..f959fc91
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/StrictCalls/StrictFunctionCallsRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php
new file mode 100644
index 00000000..ba7c92f3
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/SwitchConditions/MatchingTypeInSwitchCaseConditionRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php
new file mode 100644
index 00000000..d55fc789
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php
new file mode 100644
index 00000000..dd891a9e
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableMethodCallableRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php
new file mode 100644
index 00000000..0d077b27
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariablePropertyFetchRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php
new file mode 100644
index 00000000..963f01d0
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php
new file mode 100644
index 00000000..2cfebaca
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticMethodCallableRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php
new file mode 100644
index 00000000..bc475992
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableStaticPropertyFetchRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php
new file mode 100644
index 00000000..f78e4ef4
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/VariableVariables/VariableVariablesRule.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/LICENSE b/tools/.phpstan/vendor/phpstan/phpstan/LICENSE
new file mode 100644
index 00000000..e5f34e60
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/LICENSE
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/README.md b/tools/.phpstan/vendor/phpstan/phpstan/README.md
new file mode 100644
index 00000000..abae67ec
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/README.md
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md b/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md
new file mode 100644
index 00000000..52294909
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/UPGRADING.md
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php b/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php
new file mode 100644
index 00000000..a5d341bf
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/composer.json b/tools/.phpstan/vendor/phpstan/phpstan/composer.json
new file mode 100644
index 00000000..dc62c19c
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/composer.json
@@ -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 --git a/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon b/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon
new file mode 100644
index 00000000..01fee972
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/conf/bleedingEdge.neon
@@ -0,0 +1,2 @@
+includes:
+	- phar://phpstan.phar/conf/bleedingEdge.neon
diff --git a/tools/.phpstan/vendor/phpstan/phpstan/phpstan b/tools/.phpstan/vendor/phpstan/phpstan/phpstan
new file mode 100755
index 00000000..7a08ef48
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/phpstan
@@ -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';
diff --git a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar
new file mode 100755
index 00000000..07b26c79
Binary files /dev/null and b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar differ
diff --git a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc
new file mode 100644
index 00000000..ce16c835
--- /dev/null
+++ b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig b/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig
new file mode 100644
index 00000000..bec95c44
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/.editorconfig
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore b/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore
new file mode 100644
index 00000000..a6edf7a9
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/.gitignore
@@ -0,0 +1,5 @@
+/vendor
+composer.lock
+
+.idea
+/.phpunit.cache
diff --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE b/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE
new file mode 100644
index 00000000..dcb1e371
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/LICENSE
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md b/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md
new file mode 100644
index 00000000..5d673fdf
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/README.md
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json b/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json
new file mode 100644
index 00000000..e32de7ff
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/composer.json
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon b/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon
new file mode 100644
index 00000000..b2a58b69
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/config/extension.neon
@@ -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
diff --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/docs/required_type_level.jpg b/tools/.phpstan/vendor/tomasvotruba/type-coverage/docs/required_type_level.jpg
new file mode 100644
index 00000000..cd219abe
Binary files /dev/null and b/tools/.phpstan/vendor/tomasvotruba/type-coverage/docs/required_type_level.jpg differ
diff --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php
new file mode 100644
index 00000000..224fbf73
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/rector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php
new file mode 100644
index 00000000..e05c09d1
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/CollectorDataNormalizer.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php
new file mode 100644
index 00000000..4296b613
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ConstantTypeDeclarationCollector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php
new file mode 100644
index 00000000..ad677eee
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/DeclareCollector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php
new file mode 100644
index 00000000..a9d4a494
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ParamTypeDeclarationCollector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php
new file mode 100644
index 00000000..893a60ba
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/PropertyTypeDeclarationCollector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php
new file mode 100644
index 00000000..f6f63b84
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Collectors/ReturnTypeDeclarationCollector.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php
new file mode 100644
index 00000000..f2fd6f2b
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php
new file mode 100644
index 00000000..7b4cec24
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Configuration/ScopeConfigurationResolver.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php
new file mode 100644
index 00000000..04d7c394
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Formatter/TypeCoverageFormatter.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php
new file mode 100644
index 00000000..b53da098
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ConstantTypeCoverageRule.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php
new file mode 100644
index 00000000..314c0b59
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/DeclareCoverageRule.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php
new file mode 100644
index 00000000..ed300eea
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ParamTypeCoverageRule.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php
new file mode 100644
index 00000000..27dcec2c
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/PropertyTypeCoverageRule.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php
new file mode 100644
index 00000000..c7e7fbaa
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/Rules/ReturnTypeCoverageRule.php
@@ -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 --git a/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php
new file mode 100644
index 00000000..c539839d
--- /dev/null
+++ b/tools/.phpstan/vendor/tomasvotruba/type-coverage/src/ValueObject/TypeCountAndMissingTypes.php
@@ -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;
+    }
+}
diff --git a/tools/composer b/tools/composer
index b59d7e10..3b71ca64 100755
Binary files a/tools/composer and b/tools/composer differ
diff --git a/tools/phive b/tools/phive
new file mode 100755
index 00000000..27e468da
--- /dev/null
+++ b/tools/phive
@@ -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æï�æ´4vendor/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Š)´3vendor/phar-io/filesystem/src/FilenameException.phpmå«Çfbfo‰ý´2vendor/phar-io/filesystem/src/LastModifiedDate.phpçå«ÇfTö•…[´(vendor/phar-io/executor/src/Executor.phpå«Çf£#½j~´1vendor/phar-io/executor/src/ExecutorException.php€å«Çfg—</n´.vendor/phar-io/executor/src/ExecutorResult.phpôå«Çf/0SH´)vendor/phar-io/gnupg/src/ErrorStrings.phpuIå«ÇfçÒ»¤&vendor/phar-io/gnupg/src/Exception.phpaå«ÇfYNµ�¤$vendor/phar-io/gnupg/src/Factory.php7å«Çfêjþh¤"vendor/phar-io/gnupg/src/GnuPG.php=$å«Çfó	KGE	¤Dvendor/phar-io/version/src/constraints/AbstractVersionConstraint.php¯å«ÇfnoSMy´Dvendor/phar-io/version/src/constraints/AndVersionConstraintGroup.php×å«ÇfÒ/j-Ò´?vendor/phar-io/version/src/constraints/AnyVersionConstraint.php@å«ÇfLÊ[´Avendor/phar-io/version/src/constraints/ExactVersionConstraint.phpÈå«Çf†:B Œ´Pvendor/phar-io/version/src/constraints/GreaterThanOrEqualToVersionConstraint.php„å«Çf·ÈÉ^¼´Cvendor/phar-io/version/src/constraints/OrVersionConstraintGroup.phpÿå«ÇfÕ¿‘×Ø´Qvendor/phar-io/version/src/constraints/SpecificMajorAndMinorVersionConstraint.php¼å«ÇfÓLÌK´Ivendor/phar-io/version/src/constraints/SpecificMajorVersionConstraint.phpúå«Çf¢ý´<vendor/phar-io/version/src/constraints/VersionConstraint.phpíå«Çf0ø¦õW´3vendor/phar-io/version/src/exceptions/Exception.php¨å«ÇfóÑG‹´Jvendor/phar-io/version/src/exceptions/InvalidPreReleaseSuffixException.php�å«Çfu¹»þü´Avendor/phar-io/version/src/exceptions/InvalidVersionException.php•å«Çfs|—Ê´Bvendor/phar-io/version/src/exceptions/NoBuildMetaDataException.php‡å«Çfp’°¨—´Evendor/phar-io/version/src/exceptions/NoPreReleaseSuffixException.phpŠå«ÇfrXbpÔ´Ovendor/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ë¶´6vendor/phar-io/version/src/VersionConstraintParser.phpÿå«Çf‘<P6´5vendor/phar-io/version/src/VersionConstraintValue.php&
+å«ÇfgP>13´,vendor/phar-io/version/src/VersionNumber.php¡å«ÇfkJ}Ór´6vendor/phar-io/manifest/src/ManifestDocumentMapper.php€å«Çf¤‚q³»¤.vendor/phar-io/manifest/src/ManifestLoader.php å«Çf‚q‘Ì¤2vendor/phar-io/manifest/src/ManifestSerializer.php‡å«ÇfM÷Û‚¯¤Evendor/phar-io/manifest/src/exceptions/ElementCollectionException.phpå«Çf0_Uj¤4vendor/phar-io/manifest/src/exceptions/Exception.phpÈå«ÇfŽ›PŒ¤Jvendor/phar-io/manifest/src/exceptions/InvalidApplicationNameException.php1å«ÇfFMüV†¤@vendor/phar-io/manifest/src/exceptions/InvalidEmailException.phpå«Çf+·Ë¤>vendor/phar-io/manifest/src/exceptions/InvalidUrlException.phpå«Çf/ÙY�¤Dvendor/phar-io/manifest/src/exceptions/ManifestDocumentException.php÷å«Çf'à‡ o¤Kvendor/phar-io/manifest/src/exceptions/ManifestDocumentLoadingException.phpûå«Çf!˜„Õ£¤Jvendor/phar-io/manifest/src/exceptions/ManifestDocumentMapperException.phpýå«Çf0`'€i¤Cvendor/phar-io/manifest/src/exceptions/ManifestElementException.phpöå«Çf%#mß¤Bvendor/phar-io/manifest/src/exceptions/ManifestLoaderException.phpØå«ÇfÒ4oô¤Bvendor/phar-io/manifest/src/exceptions/NoEmailAddressException.phpå«Çf4œq:¤2vendor/phar-io/manifest/src/values/Application.phpøå«Çf5fæÒ=¤6vendor/phar-io/manifest/src/values/ApplicationName.phpœå«Çf¥¤-vendor/phar-io/manifest/src/values/Author.phpå«Çfõ<L¹¤7vendor/phar-io/manifest/src/values/AuthorCollection.phpå«ÇfßãÂÂ¤?vendor/phar-io/manifest/src/values/AuthorCollectionIterator.php…å«Çfè]î=Œ¤7vendor/phar-io/manifest/src/values/BundledComponent.phpHå«Çf—µZ	¤Avendor/phar-io/manifest/src/values/BundledComponentCollection.php¢å«ÇfëÇé–$¤Ivendor/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|à¤0vendor/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�Á"ë&¤2vendor/phar-io/manifest/src/values/Requirement.php¨å«Çf1šq¤¤<vendor/phar-io/manifest/src/values/RequirementCollection.php\å«ÇfäX?ñ¤Dvendor/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Í£¤1vendor/phar-io/manifest/src/xml/AuthorElement.phpÚå«Çfn¸þÞ2¤;vendor/phar-io/manifest/src/xml/AuthorElementCollection.phpSå«ÇfS(æ7ä¤2vendor/phar-io/manifest/src/xml/BundlesElement.phpzå«Çff‘‰}¤4vendor/phar-io/manifest/src/xml/ComponentElement.php†å«Çf`$Sg¤>vendor/phar-io/manifest/src/xml/ComponentElementCollection.php\å«ÇfT6ž¤3vendor/phar-io/manifest/src/xml/ContainsElement.php‰å«Çf“aÇÉÎ¤4vendor/phar-io/manifest/src/xml/CopyrightElement.phpå«Çf}Ït)T¤5vendor/phar-io/manifest/src/xml/ElementCollection.phpËå«Çf±ç ²L¤.vendor/phar-io/manifest/src/xml/ExtElement.phpå«ÇfKÁüãë¤8vendor/phar-io/manifest/src/xml/ExtElementCollection.phpJå«ÇfQ¬ï¤4vendor/phar-io/manifest/src/xml/ExtensionElement.phpŠå«Çfaôzõj¤2vendor/phar-io/manifest/src/xml/LicenseElement.php|å«Çf\t²TX¤4vendor/phar-io/manifest/src/xml/ManifestDocument.php
å«Çf9ÑS¤3vendor/phar-io/manifest/src/xml/ManifestElement.phpnå«Çf¹ªpû¤.vendor/phar-io/manifest/src/xml/PhpElement.phpå«Çf’©wO¤3vendor/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áJ�Dˆ¤6src/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å«ÇfPX'¬e´'src/commands/migrate/MigrateCommand.php‹å«Çféî	Î"¤-src/commands/migrate/MigrateCommandConfig.phptå«Çft†ÎWÂ¤1src/commands/outdated/OutdatedConfigException.phpžå«Çfè-4ú´)src/commands/outdated/OutdatedContext.php4å«Çf§#>�´(src/commands/outdated/OutdatedConfig.php9å«ÇfÙ¼ý
¤)src/commands/outdated/OutdatedCommand.phpQå«ÇfPKæä5¤#src/commands/purge/PurgeContext.php¨å«Çff«ûP´#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ûgY¨U¤!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æ°�¤Csrc/commands/update-repository-list/UpdateRepositoryListCommand.php¶å«Çf‹8H÷j¤%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´0src/services/migration/HomePhiveXmlMigration.php>å«Çfë?ê²´0src/services/migration/InternalFileMigration.phpYå«ÇfmòæÅ@´$src/services/migration/Migration.phpøå«ÇfÎX'mY´3src/services/migration/ProjectPhiveXmlMigration.php¢å«Çf;9Ì´,src/services/migration/UserFileMigration.phpÒå«Çf`ç¦p´0src/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	5ÛJÔ´*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ü	å«Çfmÿ´*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]å«ÇfqM;Bî´?src/services/resolver/strategy/RemoteFirstResolvingStrategy.php^å«ÇfrÀÁÙ´4src/services/resolver/strategy/ResolvingStrategy.php¾å«Çf-W$Ÿ–´7src/services/resolver/AbstractRequestedPharResolver.php0å«Çf82äQ´+src/services/resolver/DirectUrlResolver.phpÝå«Çf7Ük­´-src/services/resolver/GitlabAliasResolver.phpGå«Çf¤èvãµ´,src/services/resolver/LocalAliasResolver.phpå«ÇfïÁ_«Ÿ´-src/services/resolver/PharIoAliasResolver.php”	å«ÇfIÓD×X´/src/services/resolver/RequestedPharResolver.php4å«ÇfWÅR/´6src/services/resolver/RequestedPharResolverFactory.php4å«Çf.”?Lî´6src/services/resolver/RequestedPharResolverService.phpWå«ÇfÞzËÄN´=src/services/resolver/RequestedPharResolverServiceBuilder.phpòå«Çf‘+‡ó&´-src/services/resolver/GithubAliasResolver.phpt
å«Çf@ËZt¤6src/services/signature/gpg/GnupgVerificationResult.phpƒå«ÇfkL¤5src/services/signature/gpg/GnupgSignatureVerifier.php8å«ÇfÊe'8¤,src/services/signature/SignatureVerifier.phpâå«Çf>PÏú´-src/services/signature/VerificationResult.php4å«ÇfJOÑ·´src/shared/cli/input/Input.php¶å«Çf()D÷U´%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å«ÇfGMÝêª´"src/shared/cli/RunnerException.php·å«Çfm;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å«ÇfE0¾‚N¤ src/shared/config/AuthConfig.phpòå«Çf,d¥ä´#src/shared/config/AuthXmlConfig.phpå«Çf‹S»à¦´.src/shared/config/AuthXmlConfigFileLocator.phpxå«Çff6®Ã´)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)å«ÇfWQwÅ´+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	å«ÇfFcz€¹¤-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Î±®ÿ´1src/shared/exceptions/DownloadFailedException.phpžå«ÇfË«)$´.src/shared/exceptions/EnvironmentException.php›å«Çf¬‰bb´(src/shared/exceptions/ErrorException.phpšå«Çf
I±¸W´#src/shared/exceptions/Exception.phpŽå«Çf
+É<½õ´+src/shared/exceptions/ExecutorException.phpÜå«Çf.»´1src/shared/exceptions/FeatureMissingException.phpËå«Çfƒ�Ö´2src/shared/exceptions/FileNotWritableException.phpŸå«Çfðg
)´&src/shared/exceptions/GitException.php“å«Çf
+å‚=ˆ´5src/shared/exceptions/GnupgKeyDownloaderException.php¢å«ÇfåÂm8´%src/shared/exceptions/IOException.php’å«Çf
+½Ë¸Ë´5src/shared/exceptions/InstallationFailedException.php¢å«Çfuä´.src/shared/exceptions/InvalidHashException.php›å«Çf`o­´-src/shared/exceptions/InvalidXmlException.phpšå«ÇfÄÖ}´5src/shared/exceptions/LinkCreationFailedException.php¢å«ÇfH@!g´,src/shared/exceptions/MigrationException.php™å«Çf
šgâ´3src/shared/exceptions/MigrationsFailedException.php‹å«Çftshg´3src/shared/exceptions/NoGPGBinaryFoundException.php å«ÇfŸG?´+src/shared/exceptions/NotFoundException.php˜å«ÇfÿA´)´'src/shared/exceptions/PharException.php”å«Çf
+2eh×´0src/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´5src/shared/exceptions/VerificationFailedException.php¢å«ÇfVõ…&´ 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.šð´6src/shared/http/authentication/BasicAuthentication.phpºå«Çf’«B-ý´7src/shared/http/authentication/BearerAuthentication.phpÚå«Çf/±Ý'I´6src/shared/http/authentication/TokenAuthentication.phpØå«Çf/Eû´ src/shared/http/CacheBackend.phpLå«ÇfSº4´src/shared/http/Curl.phpu
+å«ÇflBi³´!src/shared/http/HttpException.phpŽå«ÇffdÞ_´'src/shared/http/HttpProgressHandler.phpºå«Çf™	YÃ_´)src/shared/http/HttpResponseException.phpœå«ÇfmÈ‘A´"src/shared/http/Authentication.phpëå«Çfš×çž¤src/shared/http/CurlConfig.phpGå«ÇfÌð‹	¤%src/shared/http/CurlConfigBuilder.phpå«Çf·‡•½¤src/shared/http/ETag.php2å«ÇfPxp²r¤+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ùå«Çf1K	Ò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™å«Çfl€çI´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å«ÇfV$tã¤*src/shared/repository/GithubRepository.php
+å«Çf×R'!r¤,src/shared/sources/SourcesListFileLoader.php¡å«Çf9™>K´1src/shared/sources/LocalSourcesListFileLoader.phpCå«Çf¨nÁCÒ¤2src/shared/sources/RemoteSourcesListFileLoader.phpå«Çf¸sSD¤src/shared/sources/Source.php\å«Çf
õ[¤"src/shared/sources/SourcesList.php�	å«Çf!dN¿¤+src/shared/version/GitAwarePhiveVersion.php³å«Çf%ƒäBÇ´#src/shared/version/PhiveVersion.phpÇå«Çf€ÁL++´)src/shared/version/StaticPhiveVersion.phpaå«Çf`VÓkØ´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þå«ÇfyH>Of´src/shared/Url.phpm
+å«ÇfªÐ ÄÃ´src/shared/PharRegistry.php~&å«Çfc¬” ë¤src/shared/XmlFile.phpm
å«Çf8ñºjž¤src/shared/GnuPG.phpXå«Çf0µ¯¤$src/GithubAliasResolverException.php�å«ÇfÆðQ¸´src/PhiveContext.php¾å«ÇfÉ4±ìk´src/autoload.php™Så«Çf1"w|”´src/Factory.php´Få«Ç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ï�¼º´­WmoÛFþî_Ávî$e¶åtëœ:sÚ"M�¤ÁŠ¡)Œ³DY‡HwÚå$hóß‡;½X¶d7ÅêO–D>$RO¼ÊâB¦ÐÕ¤x@sºÏPÃ½ãž`)êŒ1SçòúOðÃ½&L�{½ aZÃ[®0 ©îáK¯àÀëS`Å|{;S|Å¡Ÿ1Š�Ó,_$<€(q)`>¤Ð¤ò€ÜÒÛš{ðÅÚ›_Ÿb®‡'(t®ð\×áÝÂòxÛÐÜ…YÖ<x¨ò,LàŠÝ €HÉb¢lêûšXp#W¨¢DÞŽ™úÿæ¨MŽÚþû¯“—¿½ð—HÄÅr¨0aÄW84†eÈZ&9•·¸fqöS Ó�'‡“ñÑ¼Ä©’8UrÒ°”@rw¹F¥ýçã££ñK)U(E‰àwRºDº,¼`_IwÝ°~Xýõ¦U·šDKÃ[Á"Óìs·I°elÖ€Ù´«
}´L™fŒø‚'œî!âw¨!’
+>rÊ[
†-Ý‚çzråÚK^�"ÅÓârÎµïx0Çw`Z¸oUPù“lx“lù’l—¦IÍf	Ðu®¯��1�½í@»ŒI6É¨ ñ.KdˆîÀMS(L.ÊÉ6‰×"©�1ÓÐ13†'¶QÍW©ìMÄEWš@H1L±…�«
S�k `6³Q?ÈŸ·!KX¾R!˜ù�zBZ†L)v?×1�È­ŠjÔißWÀDcw�%ˆ<] �Â”qQæ®Í{dYh9ö×†3d.¨¯aI×qËÇV¿ö;�Ã®ºË´X)¶B¥Y¢!ÏL.Å;é­“ËXø'Š¥m®[fW1¿4“š$`xØN6‡¤ 9ca
5h€39^7ÊB!»i?zèuÑj¡?�?Ãœ‘ïÀ¨ys«­½ö?…”+<mþæT<t¯¼ãš´ëMa!eÒèL� Sš,ˆÑ%•ã ¹U—Ñ#žà¼ÄkÖÛ£^¯)VF¾ja=»03YíUæbƒ�q¸ è§2D˜Áxòâ…7…•äá®½÷7Kxø—¡È:5õ…ì&nm&÷Iå^ÒÔ5»ÖîuzS¨e]÷ Hl†ºNGÖpo;hp;=ÌOgŠŠ\çT!£ò­(·ÓÓgú)DŒ'ŽœÍ–
v¶ƒO§ßY¤NÇŽÁØ1ªð¸‰jñïš¡ÊP¥›#?Ãx2™xðÄHªme¿AœÊ°£%Û:¹~¡ 0*îõ™RRÕ\@¿…ÿ}}ûaýúVŸÚ}Ü¸Õ¨ýaŸ.1OÂú0i¯¼éÆ¡µ‚)ßþ
*š¤ÃÞž_ž�^½¿ügþáìâÍå›«÷—Fá
+Ô½ò3}Ú™É–Zí— ÿ•‚Á¬Ã›sº÷¦ð®üÛMEõôqiÔ°{3Y;Ž�eìF¸½X·œâ7åqÛl	÷{º«�%&‚Û:åzû+àú£âÄ	vlœj‰éùmeô#×HùµµGš_B»>�¬ÀoŒVañõk}H¶7¶5¢(¨ùÂ­·Í£å£–{"y¦Ë�
‹œ€k’€­ÕÄ”éo
+A—lœ‹•Ù†W÷ÙZ!¶º×MÙz‰ÖÛw›­b%ÿcÃQqqV°ˆŠšàð,¬ê·u8•¸?N4Ëê
Ò·ôñ¡÷mÍ=Â0€áý~Å�:ú±Õâ :‚Ž‚ÄËAir§4ˆÿ]
+¢ƒ®/¼«uêZ&o2OD³#½hI,XãlZA0=K2ÄxèLnã¹qž�E”û
+€¼Á­ËLsÙ
ÄI]Èƒr°‚ßò@DL·«w„ƒ(¶án¼³ûhyÜU¿b“Ù(7Æy¶Xãüéúh?bñG¼7§’ÆÍ²xÂEÈ±
+ƒ@à=O‘±Ž�­8µÐMp$Ä<8ÏpÉ ”¾»£ßø½z[�h–Š‡GMsœçŽŸMKE6¸‰‚‡UêwŸ>)c<=°µDšÅ�ß‡Â"í…qÊâ<Ýõ£?]…PMkÃ0½ûWèÐƒZÊ®ÍÚm
+½
zÏSCêK	”Òÿ>œÅiÉºMGéé}=>ùÊÃ'šZ”ÄÁ.øä‘Ö*N‘¼6o•»æ}kkÜŸˆñ˜ajMqg!–YÏ�ý2>C¶ì>ØN3Âì0òÉC”vå¸i£ãíÛ�Ú8´Î°m…iqh
ËQq”˜'ÒÄ¢àÜÓÄ™qei±IXXßZ›€†÷ˆýÄóå¾«9™‘ju­â*�Ûà¦þ$%ÝáÝIy*î
+ßr1Ø$9ÂMû¾©æI¹D~ýFJ¥þË4"W©×ßMJºˆ/•–[oÚJÇßùS‰È6"áô•”4iKu"µiÔpt„6ö¯ºÞµvÇ!¨êw¯Ö|Á6
/Àzö7;ÿ¹¬ß½O¢ôÓèÒÜ§
í4°€·ÞåH²MÂ|„ûˆé[õø™|ØÂør4ò3ì’µƒ_£Àl2�ëg¦Áòä&³l9Ñü™ÂØÚ^æ¦Iú$¸a*}âJÂfã+iH§>¹ÅîÌÜƒ_™½ýŒ)âæü*ó¸(iöÁïn&3Éõæå‰*˜FJµ¬3YøÂ
KzRJsB.pSÕ˜Þ ”›/\þì‡r³ÖàÀÿ5'ö$°ÊCp¹ÙìJ‹‚Z©äÕÅ®ƒtZˆSs]#ÖÏ8@›Íê*A¨„P;f[€&ƒÂ£��	ƒ–O‚}ŒA¶…¤¢<!m¾Q°C�ˆ�?Bÿ'„\*Qƒ`´+ØÌso´i>­_?²Y„[¤O\£OJï]ïüªžÍi_¾ Ÿö%¾ª&¬Ìþº¦4²ÀBm³·ªéM)›£?EZí@â¿§’xŒË‹u��LÚ<Z<œçôCrÝ=Ò{/Ï±ãÕ¥kÅdÙvkÎ4/°-’�&„²;Kƒáî8E7OF‰”ðžQT†^Ì¹¿ËÜ1äü*ä•ê[¤ÌdL÷Äyšè9þÆŠQÙ\gü×
+°EúŽ‚ÎŽ¾Rnår”?U)³R÷ß–èØM
ðz¥’”>æY?Ü Exsà’z†v’UË´‚:P 
4_*{¦dƒ:›Lò�¸Îš§ºc�SÌzšÕÚ®Tu‡âîÎ¶xgºÊ§Yó-úŠ9/ÜT5ãX£IÁ®5v—Ú´á¢#îr’X‹E>.Û£d,˜¡¥ÖJÃÐ~gmnWÝ+�*«ªÒ¸{ü4vØ�I4—ºÎ™Wp‰pxs83Î´æü‡cÕpÖÍ5kÞ^‹Ñ¶EgíM�|Õíì;—³n˜´â©¦èQ-¸ÎÒNs{Ûå98ÜrÎþ™6Ä¤õ<õ–dak+|°
+¹ù&Ô«ˆI÷ñ#\ñoã8¿z`0ÂÞN©ªð3ôU<ää÷a…Í''¹JiùB(�«§	F—¡‚”?;ûtxÊ•[8ÅàuÖpÎÌ±³¬zœuëðÅ;r}7ãŸCý¿UõX»¶Å|j[õ
±8É^_bÛ§o…ŽóTƒ¸ÿ}º_Á)Üß¬þ½½ûümóáæaywóuY¹ü=ú³±/È(PHIMÎI,JÕ(.)ÊL.‰/©,H-V°U0Ô´æÊKÌM-.HLNUÈH,òÌ�qËÌI
®,.IÍµæâJÎI,.V	�Ô¹V$§”dæç)¤V”¤æ¥+ Dª¹j¹u‘MKÃ@†ïù#’¥xM­zÐBAQ°Þ
+eº™˜…ý»“Ö"ýï²ijÓÆÎeÙ�Ù÷}fæî¡*+ÈI(t”xvRð’·y˜Àm:Žjò
+‚÷ÝÌ.¦RÑÇÖ3éq	…ÞÃz~µ¹,$åOÈ?Àh8lNÂã,Bn.5Í´®WŠÚô¨9+'×áó oËÆÑþ½^)) ¨�`i
,—ÂÏ®œô%�ßÓ#Ä€Kéoî)˜t]BÁ.ê!séìÆCè7áù[PN¡÷pž‘»Œ…³:ˆ{F]%Ò0øpM³KkH;Œýî²L8B¦©³zj�FNâÏøšÝ™¯´ã3þ•$Wÿ&DÓ(Úô{Mâ™Y£’9(ôºe† wÚñ…pÄµ3�œ'U$GÛ“IŸoUú7•“›—h.n5Í`e­êà·fçë½Û×wÑ/½SAnÛ0¼ë[CF$Ã†ïvâöâ‚¢h®½ÐôÚ" ‘—LRþ{AEbHYM�CÌ‹„ÝîhgtýUW:“¬AÒŒ#ü¬˜¹S¿·ÏÈ�Uf�eŽBõVÔøð‡,6í«g­³Œ×ŒzüÍ–³Yû„|ÓÌ°zä\5
“û¾0À‘5B!gæx/dß
 ƒÖÆýBrµíºËö©Ý®Nr+”l¡XüWÀ<+;õþä¶´Ø $gÐC·Ï‚,Cv¹§¼(d»Ç(¯8¸ÒFH{(BÛŸ«)Á”®æI‰3�Ta]3s<±Ø0zh7Y”eÊL7Ñx1E$i¹rV;;‡ÜðXwçƒÄ§�©öø®´ÑÝ›
ª:eïæéuD€ØÊ¨'JŽÚ‡ 
ˆ�Ìb”�¡ÇcwÇÙ(¾D½Å_ˆeŒò§Òm©Ó’.ÈŸQ×ƒûßÅ#ö)nc2™Òö
+	¤²ÐN„cdûq Î°å9=È]­~({«œÜ'˜(4§ýY7JPD¿œ]¢7«/¶cÛÁ®ß°í”ýUÌ1
+ÂPà=§ø¯`×gqªà" Kš*ÔäÑ¤ð xwqý†ï|©K%ã—FeQ<Þn>MeOß
+‘¬�¡‰Ö|ºA[ªÍ�ñGˆ[$îžWßmF�Sù÷ïÊÓªèÑ¢7}�’?OÃ0ÅwŠJT({	 U˜@0ª\×4–Û:Ÿ«¢*ßå�“6		“%û½ûÝ½óý£M,Ó<“Îr!á5áøl>×G)<\2&Rî„‹7é|Jpb`Eå	<8‚#Tz__-ÊÓ¢:p’p%L–q½[;9"ÿ6OÖÓ>¥iØ%�ŠVf'û¾Î(ÂhGè¼­%
ÁräY=@3ÃàûÇWhµó¬4•mO—ûmª|{-H
›MÓÑ,çU>0oK]Ã©ªVÔ§D¹›‡ÚñYæIU¦P„p;‚P¾�´I‚¼¿”äQÃÖ˜tt2åÞ½Ò¹Ùy×µ»Žc¸›Bö¶ß!î%­ë‚ÿ`NÑÂž§�/e¦#ÀóÐ§pS°UµâÚÅ'ÈYÎ~•\m�ã6’þ>¿‚,�ÜnbImKN.wèéžä™—Þñ$9ÜÞâ@Ë´Ím‰THª»�Eþû¡(‰b‘´{n>Iôðí©b±Þ<ÿöÝ±#;V7T±—Ú(^›ÿ5§Žiò=É^}÷BÐ–éŽÖŒÜ©z+ÿçGÑßýøÝ‹uCµ&o”’jcMþùâ!„|ó
yO;r`‚)jØŽ<pJZzÏ,øFîØ{Ú}­�Ü)þ@
#µÚ�–vä{ò7ûþ,ì?¿ÿwòÕ¦¯k¦õWvß2÷íG»RCÌï!r‡øYÜù(HGë{f<HA˜Ò\
+Âè+‡~+hÃw¤ë·
¯É=;Ú¤âæØz–Ñ€?0m’à•¿¦þÌ¤DÍjÅL©0„5½bbídz™l1!nŽ¬¾×}q›eh³Tëî¨¨ö×Éòðð5ïŽL%ŸnI*„4DvLÀ¶@µ|ÜU$‚PJÙ2„PÕâÍ¯<zÍy{ë.½ÏI’³jBüª¤8x ˜nç#×XbÚ*ž-wtOJXË¶S#6ÅVîØÿÐ·[¦×Hëo}ä‘˜¨åŽ‹i™9J§y‘ÀªSg`º>2<s$§j	p,cßö¡|©<Ð¦G=™²—½@{wòøÆY."Œ“Äæ$}ŠTºpbQ½¿{m¢p´ÏÊ—Pü"b}æÆšMëXÿÄ´ìUÍ4aOGÚkƒô¨ˆøŽïFáhþ¬zmÈíëøŒŽc8cÍ”á{^S$‡¢—Š¯HáÿY°§ŽÕ`ç£ÅãŸykMü¾á52¨ŽòŸØI3õÀT4Ë•#}¸kÏ˜Ü+GþçAÃˆ‘äökrýµr¬ÿÊè½¯èøf^¥X'
sôa	‹sè[&ÐYõ¾þÁ;óó§·>.¢?øî¨ÿÀÌ£T÷1cŽ÷Éž¥ö·²t´oX³7ð í)o�Â-í·ÔP{£Fš0,�`�’ðTcX1o©×tÛ°ôË³¼ŠpI¼Œïêòœ¦“úH¹ð‘Žð÷\k°�é{±œ‰—dG
õ¿Íf¾÷¯äj1�1D÷]'&pÙÙ�ßÊXË�¿�Õ¬Ú¼e²÷Eºò¬·aJ$Ü¡•ãöÍÇÈËƒæ+‘*·ÿ`èÂ®«wJ>ð›0ð)‰>J…”Ïh¨: C:–'ipÃZ¸&ñfé@.o»†Á�Cô–³+3š˜²GöºŒD0:*-æ¿Œìú¾¡¾´Ëè	=R±kÐNŸ˜îCŒê(Ú´'pfi¸@­ÂµÓ�ød¾'CL¢z!ð³Q:Æ¯-"Ô›r®(åù/ºc5\r­uO�úžö�/ºÊQ>9ï#>\¼ŠßÒ¤UEÔoþÂž&'ÊzÆÝÇäKR9)€ŸÌF¡%�¦�ñîÿ`„îÞ~ð¿UáŽ!ÖòÈu8_/ÂÑU´e†ùë¯ƒ·³¦Ê×³µ#,W­8 ÑŽÓñ[t¾µ#óÆ3°Š=È{¤ÐkŸÊ›Oïˆ}–|€ã¾‚]�
šÀùŽ6‰´xíYg{«jíØü8ÛW*jÖàw/[,<Öo®Ï<Ù"Kœœ=u\Óå	ìÿ${Ù,Š„bž[ý*xáÏh{¶X&&í”4¬6!tå,¥R}wXNö¢ÝòC/{ªn¶¨\4§bÇ0[¬ýÏŠifˆb¿õ!yÙãZù²àže¹?Ãàž0�=³,+fí¼ûéf“-	íºXŽž]yJ-Wm°£¥cQìù¡U-ŽŸWžq‘
¯O¤¥¦>"LœŽ‹{Bˆ*@à@6[Ï‹lZªŒeaGY‹�•O<‡ xßyvF¡d-Ì½{t÷öCqfy
+‡n8møï˜Ôü*±¨ó“r¢0xCDN8/1SoŽà„¡b–—h–m#·²b3Q?ù)¡šåûÿIÕî‘*<m†óõ@Ñ¶‘5¶œY‘Íú´ãp\Mä<K˜¦†ë=ÆäóœšÀÂzu€+í¹ùô}ŸhýæS¬	Å2ýúÍ'ô}¢ùÍà—%£ò¬p:¾cLSg€¡ªä{eÅ:ø…iÙÕ"€€zp±—4+¸‹lƒ¥®rÏ
+Ü7�UÁÜ^y6åæý&ö^³««�ý4l¶àƒ©?[%®Èh™€N‰!¬ÎÌ9&Ivl3™å[†°Aˆ$L°{›-'1ÜÍñ¾H¾ìÙrÇ-sq|ÏfËI ?±Sê¡^NâØ¸dM
+5IãÍ”HKÜéå*8¥6Áû½œDpÛï‹#ØlZ=ÅË‰õëÍ‡¯3Xú&�þÊV!õßÞmÂüê*|Q
N)f«<6	%[¥¼€&tgÞ?\OLÞˆÐûXMü_“FÖ´adß‹úŒ^¬Jï2Çöw5	án|ãÈ—Môî¬BëóþúÆÿ^†ìƒ»ÃPV&+³à\ìÉ0’UæªVÜðþ$|’Ã»èheèDÊ.<VR]Ë¶¥X±Jï9�eŠœ�r&ÙË™’`x½jÆÁƒÖÞbL@†m¦ZÌœµ-U\¬0»?QüYJÒRq••Ÿ*G,o9¸¯´>{ñ�Å3žMµ¶Âµî™:ç÷Wž×xïR¦ô�ò¨@ÐÐydMÃ;ÃkR÷êC«PñÎC×±á
+Ø[O"˜Ães”Erª¥0ì	£&AŒáëyà$›ì;›$2%ƒ ¯dŽìÒ�I@¯•¼gâLÁl½Â¨tÕhŠäýõMú�\O™ƒÕ}ß4§tÈº^GhxNÌ�=\c½Ìç·ßï™JæíòEøî<Ìf®ÏD�¹z‡Ò°‹×/Ž™1›Ò`Â™fúâH÷r{Ë@M…`|éëÊ‘*Z›gŽ³òFüÖK3p|iÄ$éÿfJBÈ¹çOñÎî1ðnÈŽë®¡'räÂ\>û:b
�õ±.šö<[†Õp
/dÿìÁ\À
TÙÝ±š·´ù2"]4þq‡G[Æ¼xÒÌ¿â²6_¼¦ËV4
ÑýÌ¦�‰FïŽH•ÈXå.²†ºÆ+®I=eFrÁf°Æ\ìFÃH­»�«ïyî½P�ã’ç2ïèÓDÝ;v õ)ú<±óið+Ò—ÚÅÑ>*H¤å.„þèõ`%™j¹ô#tgs/¢¾XjÉ]`ígÃÎTò<Œø«%Jïä.Äþ|dÖšî$JáLñ=¢¨H¨Ët�È½€{.ÂKM2ÞÿˆüÈÜÝ×¤–=aÈ£ì›yT´CÀIT?PPbÚ0e¦�Àf¾òØ=ßB‘¡/Q7âî´/‘»øü¦‘C6aÁñ’Û˜d÷™CÇE":Ê]ŒwÔð 1#/Â‘Û˜ß 1]ùùW_™&Š¸°e}¤÷¸#!;3ptµŸŸ ?3Á KÏ�GNÈ‘Šs•¤ç†^ùC±YÓÈçGú¯Ùè~áÈÕ¹‘;)¾€îÒ>¹Ï�ªâEïm@>öìë˜©ÿ×.ñZzGÀ¹Ë<ü Õ–ïv(É]²Ò;®Ã$_Î‰C:©5‡*ö#7GBmzšÀkzÍù2Œ�!�ƒßÜ% >+Ü ã’?ÐFã/“¤¦ZÛÛ»›¸YÎeà+­kÖ�ÿÔ4	Sç²­¥ðLœÁFi“(UæQâÁæCl´8	~ÎC é…sÄÂ’¡KKŒNÙpZÿ"¿Êå#Æ¾KÅ–Ö÷ ƒá¼—’[ñ¸÷“Ô~o
BU1j¸5IínÈXÁ3®l9<=ëœ²°£q'w€<*%°3±nƒé¾>í¥²ë6ô,;g%Ü3í1� avânåmS§»¿r—¢°“€2©&[ÆÒuÂÜOUpÑõ†ý[ÓÉÖ«ÃÈÞ\W>ï®ªo¸
+ÓE€uÊÃ.Ü»ñó!‰"káb¾M­àÜR‘G.vòqð&[Ú4ž_‚‡î\±ð]Tëy3ñÀ•¶8ð@·ý>¶T�›tçjçÐˆFhúFŸkã.¸û@[v	7©„—Ç¼ñÂqQÇJX¸-\ð†q!¹¡ó4�Yh)Ù«{3¸Ÿ;tI
+†]�'Ü3¤Ÿ
+l}V'B”ÒPÌ3ÉdH°„ r'íÍÜµ°[¥È|ÄCá@¬ð+ž?±ÓV>MEÆ¸'¥pQFF-†.Lƒà‹×lê„MM¹ Qƒ”3Î›“†¦£m ;f¬
òpeÞ¼Û›¸m&å€ÒQ9½ÌÂ*¤ zˆv;7ÀF´hÀ$•ÉÏ‡‰ë™:ÅÍÐe¦B?2•BÏ=öU·]@í†"ð$£_À?žB‡ÁHÁ]DýaCâ¶Ò¿“›òîöú.¦ÕÂæŠŠÔPõö*…Õ¬î7qOébåŸV°ÒÅÉÞw;šÜøÄï›§ŽAg·0ˆ•°?°ÌçZÅð«ŠKX—34 .rî|fûyôølå|öËÿz…à™WlÏÌÝØD9{ªÃÅÒÒ9ÕÃüƒWßHÙ!��CV²Ë¦W"˜qìØ(Ù$cåÒ¯_ÌµªíÉ®‚�e‚†[î=è
Ôê[ÖJ…æxB?˜™Ÿz#Á‹Î({6þ¹<¼†Î7ð©¦ˆråGÆ£†RUÉž7øA(Waui¸]È¨Ç�¥s­Ç{�:¬s§í”�N±õÓˆ¾�ûÁBŒ[ù8[èK€\ÂiøY	h­Í|OƒãWþœ:úÑQéœhÌ¶ŽW.Ñ�™:d¸Ì£.¸#)]ýoÃÿ"|�•¶…¬:ÙAbY^¥`™e‰d“T‹Á�Kt:—Î
ßð6^2õ*©^‰N°Òyçw³L†j´ÿêLL"oU–UÊ!„«¢ïZHdêÃh>Ï[­jv¬Ç
+ì ±S|‘^¤Šseåuõì‡,mà…™Îž2?²’›ëÍ;²åÂ
+½Sò UõÊ� ÉÇà¡DÐ9�Ú±=“5™_Õ û©¬æÚuJvŠÛÔ øPè‰¶_ÎgŠ9xýS-=9	v!Æ�ˆ<ú²
++ðc O\-)f¢\Kµ@ïm8Õ‰v�j;z—/°yƒ¾a®	%
£{¼ŠWß1«¿LÔéÖ“*[Vçéd¯—Tü÷Ù?ƒæüfWYZ ‰û‰F…ÍÁz(6ª´Fà9Ÿ¯ûýž×ö™§ÖÆÚ@8¤*CÆvÌrM¶½F�Øù"�K_¾*ÏÎÁyÓõJÒ1øÝÕ\‚‘²s�Aâ¦Vº©‚¶¶?0Ñ7RHÆŸF¿­Mã‘RHTï¥M#¡ ÿ)þêS±ü¢¡ŸnQ—º«\£Xš¼„Y�ÁSÛÊdÍ£ƒ¡1�mºTú *Ò//¡û=´f�¶oïFn7×h
—[ÿ…+W�f]ƒùa�qÓ¾ËQ®qÒ%®œOünÏ^û›Ÿ‘J8ã½™‚	lûBxÚ¤Y
+˜j�~�™„/Ý¶Iwó{“Â"+•«*¯¯'�´SØ!?QûÙŠxøuÞ‹.QµÆút¶F—’º*ÝéU¹ž“;%Ÿ8Û†qÇO^çla¡ó¸§rŽ«H†ÑËËè£W—ÑF——ÑW]]F/1z}½Bh(§^B—�]FW�_F¯1ºxF:N˜XšÅ3ÒÌ°8‹gÄ™ayÏÈ3Ã-žh†%Z<#Ñ‰t¹Eºùë»Dì“-Ùü=j_.òÉb�?@lä�×óÏ\aTÃ·Š¢_QeËÅ(¾ëÁè Ñ`(²�7òåæ¯ï^á!WóFèV*C©žê¼AÃîb9cwS/Çž76U÷{.£¯‡›”ÛÄv^/Hjh9/5ž”(* åy€Z¢Ä|¶\ŒÒ¼6†µtcŒEjë-R4'âo^Ï‹yVwlÓQ@Ç
+™�b~ûÍÇQ:»Þ¶i¡©ð�,AâŽë{Â[[lÕ¤¥
8L%Ùt“]‹©U¼Q¬ÆäV8O™s²e5…ß> �pm»ãðÓ-·=¢@­ý%@Š‘&à�)}±ÅØ³1|¶ÌF¥yÉ'å‡ápÔo	ˆö„õ7+kØG›Ž�‹•œANR
?I‚RMôœ	ˆïJ¶ïÊ®žÝD†Fæ£žØ_vÛð«åÚFx‰eò,Öý~ÈC×«Mƒ¯}ž'€>;27dÏl3>¶Dùd3R/xbs£2¼ì…ÝÓ,PYj´§6Àž3sãMV "<fT€@£AÓ ´|¤fªGPñŒÚMû¯
G“½’í`8åáÀ°ÎM�û¯T	û÷ï\¯|ÓuM*¤un•|´¶æ„ÑF»öŽ±$üd ¨²>”M›òø�„2€æÈhoH,†Ü·Øã–/ûùïß
ÍÐØˆ½h¼öü•láï‚›HþB~õíØäAþéæç{òò_¸ÖÌ¼Ô¬ÙûmK»¿Yôß_½òpðgH/“¯ú©9zÎ§ç€¼xàÃyì/þxñEÈ1
+€0À=¯È¨£³Š“ˆ›$¤­¡‰Pÿîè�×tº*á�’æic_üV1l±*kˆtˆ)±à´RÏyˆ×4Ô¼“ö™E};#Jv‰Ápþë�>uT]oÚ0}Ï¯¸­¨â @·=†ÑVë(Eê(*�ö°L‘.ÄR°-Û) Šÿ>9_@Hý’Ø>÷ëÜ{üýV&§T!ÑF±ØDf'QÃ¾z‡Ó5jIc„YBÕD„cžÍÆÇÉt}4Úbœ¡êŸÁñíKq¾Ó×áO¦06Bí>Ø_qà8×Ý.ÜqÁ¸–&8Ìy/ÖRhT£­A®™às“½éÉÓ½vâ”j
4Ž�{{§
+ªi/¤bïÔ tVrõƒqjs«,ò/tk_±àÚ¨Ìnúå]¹“TÑõÁûÁ]‰(£eo)‹a™ñ"Ý(ª}’ÛcÏÒÔƒ�Â
tLÂtïærœ»…ì�Ö`±Bj0ï©;�D¬±ÞzØËÕQD¶bÅx”
+ºÀqWæzÇ¹ÙÊÌ 'îxú{6~|þ5ºÐo„éÝP=7Šññ¼Á‰½-Æ–�›2ÒèÝh4¨”Pk±@Rƒ`ôòòüÍ'O£é«Wö±Z
+M¦xn}ð·?`Žâ�XÛãjº‰çŸ&TvÍx6.ú0£&ùöŠkYSq;!ª¾:.Ç6ä"Ìç<Â-ÓF·  ¥Œ¦Œj’ù‘µM+µbÊyÈù)Ç¸•Ïý™nîL¢ÄFÃh£´#xª…Ryõ|žu:Žç"ž+%gs“°8Bh7)4	g�³èyîƒûg2u½ÜôÜ‚»IPa·èB`w,NÜÆè)ÔYj¬7ÜbLB-ãfIÜ+
WÚõËx>¸+K¬‘™:¸eæ^,°9—y9Õ%\ØdšEØ•SYŽaÉ&q§rÂ[ÁÂRd|=�)R�`_E¶Ü�PÀ¸64MÁ$ãôº°«UÝw*Û·þÄ8êü g@¦V|—!¿ô+„ßšr=¯lUcÉ±ë¿_þµc5l
_§Ï]Ë<5”ÀáÝûh:·Y°¡Þéh…&2¸–Ñ‚©ú¡Ú;{ç?µksÛ6ò»~ÅÞŒ;¤|¢%¹nË–'vs™ë5ž8íI£�È…1	²hGÓæ¿ß|$¡Gnzøb»‹}bàÍ›t�B€~D8ºBrêË…Ü¤(`Ãîu‡‘EJ|„‡5á“Ù–=|¸ît2QmÝE?“	¯~\ï…~F‘E²†ó3�ðq#$Æ³;ÊÑ—	ßìBP?•T×�Nÿô´§ðeMP\¹¦¬/œ¤)r <ÉXr�²,
aIá›Ä4¦þe¡†¥èGý�¤T�ø>ã™Œ6=HX´ÑX1ÊuàøGF9°Ü@º¦Ï.�Ó„ËP¶Jz¢DÎ„ðŒœ®6] �Æi„12‰A´ä¿~úr?‚/kF$MÄd,‘°Dð’È’,\ƒLÔn&p•E°J8$r�ÒŒ§‰@Ñ�Ó~Ç�ˆ ]v:ýÓSxûL8”nPx
+�rúL$Â	VÞ«TiQ¬“
K&ãt'UéÝQ˜†ï´÷š”ÉrD„¼ÿJåû$@ƒ7,ˆÒlQVóµ™?aBòÌ—ne—Ê½­4[ö=C±š&5@Í2]øSsWëD®©ð&%‹|sl¿�Y1.1
C4PMi4jÝÐ
ìšˆ
+»áM…úÍn¶<Þuº`!œ<á¦;Â9ÙÔ4�Se?-ˆæès$¿ ¢&|£€®&6dã:9À–(7ºÓ
+G-Çór!œ^m†Â')Š5Fá¡[
+áMˆxÔâºÝnE1ïz“å§L¦™tM1*²ÕÝS°
+HWàÎRŽá"&Ò_»Îøìôã>}þ²øôï™pgÁ?»3áž�vÇNfêf'ºŽÓ+ÕëöàDÓ¢èšÁ¡G™quuµÊ¹Â8:&àR&»å9Óá¼×&YQ"O9eÒQ$öù¼†<ßªþm«h)ŠÁy<�Á|ol<áF¥Á*8î¯mñQ¸ú°§#*¤÷„Ñp¶ãy/T®=SË#0 ß‡ K#êç¹–2‰Lý"Q“xE¿b�ó�“[¡ëîøjš¶Ð<%\àG¶J
+Ì2Lj†ÖÅN­Sx[�k“þµ"‘ÀÔ·ú$/B•Kb‚„ØƒÊG4dDfk™ª@ÓwÜâ×¼BÕ¡G$�­†�Ž�\¿ƒÞ1ª%„„†!våSìŸm±YÖša,Ññ»V±µàª’‹Þ-‹ŸÛ=D:|þÊCao•}�kF‰J†…œõ¢;VewGrÓ,÷¥œ{Å'·³�V<‰µ2Fÿû)z…J½¶™óŒu"$‘™èéFãK¾æM1ÒŒÁqÌBBc’Ä©¾Bó~dq¼-ë…I*ð*áHü5¸{ N"Ê°iÒ“”p©ºõ~-
+
¨J£q�KgÍü$cÒÍÉºp?6OTËO˜¤,3œ”[¹Æ¹®v~âô|nc*¤êN]-Uœßoùx÷øñƒÓ…Œåmbôû0ýðëoFs(iàîõÅàÕÝàîõùÕÅååÅåŸgggßn¼º\ž¿?ÜÂù`xá
.½á/?]¾º:¿<‡\À†0À`w¯5™Âos=mmUÌoÅ¤ÓBP=¼©FÔ{pcXkAÙb�_'64AÃ…Î‘4a‹€HÜ…åU¡eÅÀ¯)åxIóŒ\Ð„Yáòg¬À4[>áÆ#Q˜Xák"Ö»¡ŠµSlÐ)Ü¤œªë¡ê¾·Jùæ-¼â&›Ë¸oUD^Ì¯ÛxÛÛ§oeaÉ‘<5£ÿ`\¿»ýÞ¨Î)àâVðëW?1üˆK"$%Þ!cÂÜˆå[Qn{Ëbû,°DH¥Þ.þ6åî?þNårŠ¶rå%4nç•í ‚nTSLnÒ'Pyp?õ�Ñ‘7Êý¸á¾Å&–Ðxu(4†ç¯�µŸÅ’º8V®Øeµc‹â´Ñ÷´š{c£Ñ?“ˆTnÊÑaÐ€W¦qrøÖV
Ä¼9ù
+±¬‡M¼\i§Â+6¶-ÓüPáÎ;’é|ÕQÞáŠd‘ü�†„“X¸–aÃ:U9ž§fÞ€rpàÌ2;¶çä=m£ãyd-#Hn4oÀ°
ŒÿÉ‹³HÒ4jŽç±ÄK‘ÇT¨í½Î(­h!G”V ò‘—°RŽN%zº•kã.Õ€h=_Êf‡]NW~%L8[ßîtmªTyVßB‹ý.»þ¢ËIº#¨?'šíX€Ï¿fQ¤z"ÅJå°ÙÃ¿Ÿ{à¼PætõeÀpX90§àsŸeQä˜­<áá/”¡>Iß«•[·À~p>ù¡9›nÇ~Ý�o9¶`mNuÂBÝ:N©aµi›Ì5n¾;m‡©æ3S¯ÒºÛz2j<«ÙËÃ‹_#*Zn¶Î…ª
E&»£íKÜ¾&ó½Ë›¬Ô³ŒÑ?hà:ú©v¦áÂé�äv­ï=i&ßçL·Üm“YŽ¿_¥æX_Dp1Ü·“T¿oü„Ÿ9	Õƒ0‰/à-ÀZÊTŒúý�Ê3ýZ}–ð°ï‡Ô[R¦v_pyæ‡ôM:ÎÁ!•×d¼Œ’å"�e×«q�øý»û/·y4Ùn
ñ„åD25jãIFaÙºÅ¶ex)bqçð²*”¬0£]Œx¡RŸ[ÑMsëüBª*´tF;`©Ö>ÉÔs:Wbj·-bä!ºVtµÚïwærtC³­Ž[u.,Ïx5J£TWo€[òŸ‘çc�pÌ'Ä-ù«v“]®=›ïïIJ–4¢’¢0Ý4Î»Ç�ð{Ñ«Ô¨ç]+m3>Ê¥/ŒSuˆz_¶EHÅZEü±^=RÖý>8Ö\;é¶›Vh·ðå²4«;°ó‹±JùÿõbXúÖJí«ùž0+ÎO“Ô-ù~_T|¯%2m‰Ú�¾züŸ‰õgÒWÉÌTÑxüß!¨N·_²Qu³ìü÷~/¨QùI¬$Ö.rœCi%&4r,Î±Èì9ðjÝ‘ièïH";ÃÅþß·z�*í„3‡¼ýRÿ\7Š v”£Ëˆn÷S…<?¢Ó¨t.ŸõW	-m†¨¯Ü¤&áÆHDsS¦GÆfÃŸr*È2Â˜ç`ŽÏÉSŠ94¯@-(«36‡‰­Ù´žA[êJ u†¤›¼¦°¡”y'B)ØÁ*¢ª<T”®²ïTû`Þ*@…"SG�jK÷½dGÄB­®˜ñ l}§ñÞy
+ ŒFpÏ|¾Ie"ä‘†¬¾í«í÷È%]mê¢ ·™\«/lù÷¶:Â…ð{bÉ¿”Ú<¥ßmZþ÷	[`.ðÎP8êÓL™	wûpïyœV§ÙƒÜÈÊ£j‘ÕˆºiD¥þ)“(yAîÎêÁ°«»gMx3Šš±¦pÚ±fnjàµã
v¥3û÷­ó_mPÁjA½ïW¼C¶Icz­�ÔIHi ”‚KN£�ÕzEg5ÃŒÖ&”ü{™íš'ºIzzïé­?Ç.¢aç)ñ,[g;{Žœq��óUµ\TXàg'­x†dDJ†ÐâGGé1üzâ”%èU…:ssÜ&eÜyÒßœ,cMIySŸú«†o.±åš²	)¾òÀ	ë|lb9DÏçÀ;NûžTÏ°ƒŠèdàKH°ŽÑÞÃ…øœdßHxq¬™!Ú†Ô“IÐKDÏ”áãx÷íñþáûö¡P�[G†#e4Rò©ãG±VRÉaHŽáBÃ%‚e¥ÔsŽäø, UUQ�-‘38O9ãvj'À}ÐÒ‹¤�ž{VËx»üSÀr±Àæ@	Å”î‹rÇ$2ÆEH²%ÿD~àUõo9Ô^ÚA]ù»�ig³‰æõÝ|+uQÞýpój�ë7Búò¾åí(2›:¹þOŸØ†¤ïªœH_ª¿mRÁn1½û+^%€hP¯@SH”¶‘ªªRª\Ò
ÞYÖª±­±Š*þ½òfIÂ\Ö;óæÍ¼gÏ>…* `mI¸“�–i8â#>¦j<Tâge"Jc&"�$ø?*’{ÿë‘%ï®h_°Ç¸±ä~³¤ˆ‰ãùêøUðõ¼¢˜9|åš³xLÌCØËçÀ–õ†œ;ÃÖÎ¤møì©b”µµÐ>ìÅ¬«r¬Ñì"Ã¸ÒË†’ñn„`™"ckx×ô}»¿½ûþp—©Å©¢„E&û³ªØ™T!eW¢¯E3´/8[0VŽ6i>3hª”¶#®hS·ÞÅ$d\ú"¾à?‰]±Xå´No`ø«`<b¾%ÁÀÓs^!c‚˜-%FO¿ó�>=OÕ‘£ùbˆy ¡ÍE²nwoéë•5eít¶Ëå²Ö©yFn�ž³6Žì#ÙšG ÚŸ0Z=
!	»4™t‰Níæ9zÙû÷×§ÚºÔÓzP—Õ~¬áØo%£·}9&Xyo;k•^˜t…þ…‰»#»br˜ýw�zîmÇ¾Ž;ïÉ!œjq(ÉFžžTêÿI�Á“Ô|Ô|PÿmP]kA|ß_1…Ø&$ô5vÛ|�Ò@)—>ÊÞžÎ'º§]$]Œ)ùïå®ö‹S=I£™AšÍ§ÚW´”rTZ˜+'ÿå‡J†x¿\‡ëUÀ
+?z6tœ	l¨Q¥Ã÷>êSyþIj\ä*`¦.Òw*„ûå7©6Q…n›Ó|ÕÒÇKl©‰æ_h$ÅÆNÀmí+•šéœxOº¢Èwö‰z<àsQxOèÆœ‘J=(ïzG”™‰Xº¢Ct.r‰š)á…i?ë¾>=<~Û>NVóÇÞGÇ>ZžòiF§{ö>¥beÔDH¥¥)‚ë q «1ÑY@ëRŽf¸“Ãz(b®‘ÅÁCÍ4�¸áíòO€:6™ºQÒt9Rjf²ÅQ€w/ÿšå
šRòQ6•’�*pi=ƒ¯á¿–Ñ¶®,»Åò6woM.V'�×ðm�Ao1…ïû+Þ!RwK›Š+É†6%ˆJ€�‚8!¡YïlláØ–g¶i…òßÑ¦I"|²Gß{Ïó¦ï“MhÙxÊ\Šfgô—>'Ôx[MŠ›Ë—øn� sžá‰²"vøf)?ÄŸ?8‹‹a\`‡–¦Â]Œ¹§ð›³
+¦”ß6‡÷¸åÙ–Ü�¨£€OÜsÆTƒÛdÇäùœs^­)„3¶Ntÿ��1C-£ë½‡‰é9»•UPhá�á º˜×¤.†+$Ï$ŒGÇ›�îóÃýâër1Xí6VKŠ
	Z7ôÓôÊ-6N-thEbŸ
ÃÄ–‡
+nŠ@k–D†Ï
+š…ñ$‚ÅÝïcÍä‚‚Ÿ”C+¸k†Éÿˆ?¤¾ñÎ ëƒ€‰ëäK¹`ôør©Þ¡‰ÑïeÃEµœQ¿"×³‚–š]X•Õ¤xå]‡òˆZ’yï|û…•>�RYU'Þ'þão.0þ7æL{=#9F¶ÇðÌÚç€ÑÐò)Œº®÷I/ºm±-þm’ÁnÚ@†ï~Š9pÀˆõJ€’D´�Tµ•@9EBãõ€G]ïngÇÐ¨É»WkB{óøóç~{ò9TJ2…úQ…�®õ9P„)|Êo²Ñ ƒ¬*Ž°aKÀŠ‚ßÀ¯
+åÁ?=’Döî:ƒí›nÅÜYt¿I4ÂÅÑ¼8\_—4Â’
+ŒÊèà5$0‰‡Á<T�|°tÞ‘lktîŒmkB»_¼€V›ÆZ0><o+t%X6ä"»�—•½B°„‘`Ç´oŸûþp¿ø±\$U»±V¨°Ç%§~ŠF©„=kšZ‰¾C`|I©‚Qæ°¦ÐÐYA7Yf,Æ_…PIVºŸ²øÓ ]ùŽ¹÷.ª ;ú«äÊ·EšýHüËFƒÌw(Ð)Bšá*A¯fÇ5Ú·íÝ¦°l`Ó8“Z€õÚ´âÆhû¸-ô¼ð–ÚG´

�þ3aÞåh­(ät<>µ½×äÝûÓé¥þ®fïu0ý˜8Á¯—s_ËûÇt».Ö
+ïíI8!mä
¸šméPê²Ý¸ŸÃt:½ë}4§óòrbæxò�û…ùa­×ì?uQAnÛ0¼ësðA6Ü½Únê$HÛE[ A.i`¬¨•E”&‰%e×(ü÷‚ŠœÚŠ»QËÙ™�áü£¯=JV†„óE«¸Œ;Ïð~8Ë&£#<Ô: Ò†¡<I„«ð£&¹s?Y‚vö"CÍÕWb×†ì/–0'±¼(ÿ%_ŽqÏ…¨Éâ7,˜‡CcákÏÎî¯YVk²¶‡m¬Ž	Ú-ðÉ	bÍ¨c œß‰^ÕdK­Ø†¶•“5EíìÞ0ÆFó¶�ûzwsûíþ6QµŽcM[
+(uÊ§h"—ØêX#¦T‚kD1”+9E0É,­9xRÜh–eÊPø.]çÆÙ…´�ŸÅ5ü;²-®ŠÔVñ
2˜ŒFXlHððôœ6H/zC‘1P¯—éIŸžgÙ�£ýb„…'¡5’9»ÂI
œè•¶dÉ4Ü8§~,×Á»}šÂh…ª±*ÅŽåòÙ¨˜ŸªŒA"´;¡vÎ[&¶q:ý?Ã°óØ:H�ôîò4…cêYÝgg·Tní�æ�w^1Ø¼†SÎ™£µ*'LªF~F‘Â±ä±™TºB~t�F;ÕWµþH*áØˆE”†g'—ûìß)ë¡+2�–÷Ù_�RMk1½ï¯x¼Æ‰éÕ_µRhJÁ!§‚kg½ÓÊ’�´vCÉ/’×�ãöP�´3oß×îôƒk*Vš<÷Cô¢â:>;˜á}9)Fƒ<6P‹fH€#ak|mÈßÛoOìƒXs] CûªÄÒÆ�&óƒ}˜’7¼Øœž¯+ž±â
…(dð‰[ö˜†Ó`áÇÖi¾Þ°ßîÈ˜lk$&hgà£õˆ
£nµ†²îÙË¶‰ SA‹bbjëwÅš!œf
+Œ½ð!¿÷ùþöîËê.QåÄ±¡ˆT’úÙ´‘+$6ˆ©•`[¯ÊVœ*†v)¾(hRJSX9VR‹z ïÖ/Mõ ÆútkMˆžÄDðÏÈ¦
+XnÒDÅ¿¿
+
XìÉ#�£<s^ö½]Ò˜ÿL&: k7ZêÖ¨TÖk•E[ó/b¶èY/[1¤ŸH·<Ì”G±Ó=ñ•�ÅLJžM�ÏÉÞ²”�|:½ÔíÕ<3bö'Çå:‰äõÑ}Z½ü;ƒ²;§…C¿«½ýñRŽ±±VŸ9•ýÓöj¾å˜?T¿Ì÷ì´_âÝlöÆäyÔt<ÇÖÔ¤¿ú~yMØÞ
+¥B³3¡ó”/ÅomQËnÛ0¼ë+æàƒe81zõ«N‚
Ð\äTÀXQ+‰-EäÊnPäßÒvš¸åi9;œ�.ßûÎ£fe(ð8JÐJvòä9b…wå¢˜M
+Lð­Ó�6á)\ƒ¯…÷ý‘CÔÎ^ÈÔ±*q,ãÖ�ýÉA"–,oªóýºæõ[®(Š&‹�<pÀ2ž��ï<;oø’xË¡íÉÚî`µ$êÉÀ £Œ�rþ)è¶�­a´bÚ6.ô$ÚÙ)¼aŠŒ½æC~÷éáîþËö>Iå�¥#Á�"j�ò©á-$¥ÝC¹šS³ÂRÏÑ“â‹€E¡Åˆ­g¥­>ÓNÍ;g£ÒVÀ¿„mqS%DÉ¿ŒßÌ&lö� É,c>è=	cÔ'íEq‡Êh…f°*mŒÝNe­AIþqÛbä‚nµ%óHfài–<j”§iYˆ[™Ï_¼}YžF¦3Jñ\­³
+V/–RëùÿÆ”ë½ÑÇ§•1Ú‹rŽÊ9óÊJ`Â_ÂÕºeÉyŽË\g7ã«Õê�‘óüçâmPÁjQ¼¿¯˜Cv	½Æn›&¤$JÀ¥§BÑ¾ÕzEŸõ’6&”ü{Y×¹˜ÜF£1šõ—66ôœ/<LrüŽ—ÆŽOø¸\¥Ë³„3üÅ1Haˆ£‘ê€§‘ì¡þúÉæRõ"á ]ä%¾š2n
+é¶p¬É”¯»·ù¢çÏçØpGBŠ{žØ°ö7âº��k+|*¼aÛîHõD;©Ä,=øV
12†©äÚ^L¶c€´G‘ÌêÑ¡ÚŽBªž£&g<ï¾Ç‡Û»ï›»ùÔáã)°'G/s?ÝÜc/1"æV¼N–¹ö<Wp™”vì�2Ÿ´JI4Ø†yuän«z‰þ&hSW$c˜4Ïé�ë®a_
øðü,¯ÐÕZVé]ù&Lt»X^Áh•^Ó?]�AK1…ïùïØ©xnÕªT,ˆO‚Ìfß6Á4	É¬µˆÿ]¶X„gøÞðæ›_g—ÑÒ)U-Þê»î3+.q1ž™ó‰Á/ÎWt>¾"KQ¤ÏNÊ*½½²TŸâÔà€Žì7%·Aâ‹VÌ¥D.šã<myu†5©ê%â�=æõ¸Xd—™rà)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+
+N9’·ô G.•ˆøßûŒÏùª«R€�\q°VÅ·Wû(Œ.t:.s‚){Ð´rËüD5)ypÎG6£1¿9J˜*îˆ`Ãc[é·î¡MJ&ô†Œæ½$iDBnF{~ÝÏýEÊ±
+Â0à=Oq£ŽÎUÄÁ¡›“SAŽäÇ’ë‘»JE|w
+]?¾ãYG¥„X¸agÞrô‡¿F':ì» \aÊt¹õÓpG³<IB,lF½¼¸ä´òu‰PÏ“‡$£a
—öœ+Ä·‘«üÉhÃOø†EÈ±
+Â0à=Oq£ŽÎU
+¢ƒƒâäT(GòCÉåÈ�PßÝ±ßøG]”báŽ�yÏÑgÿ(ŒNtØA¸Â”#è¹p¿µé…n¹ÉB,lF�v~ç’îp¾°óu�PÏM«C’Ñ´U®ZP!n´å7üÂEÈ»
+Â@Ð~¿bJ-­£XYØHP°
+È°¹!ûvFXÿÝ2§<Ç³®J3bâ†�y“è/ÿ(ŒNtØ¡p†)GÐ¸r»Öé‰fRËBLlF·:6Ü‘À†Ç{Y¤_z„ºÔBèŽ2M[IÖ„ŒâF[~Ã/ü]�QKQ…ßçWœGQúìÖZe‹‚H©mŸ„’½sÆ	ÞÉ½ÜdºŠô¿—Yasò%$ßêK+z¦,�MSü‰—JÇg|:<ëN�:áç¨ŽA3¡Ž*-P|¥Ý”‡ßl®ÅN:ìÐƒtˆ¯ÍˆË,öÄŽ•4ãÅæ½>éy~Œ{nÄCÅpÍ™
+.êXYjæ>xÉö8‰Ù;›Æ‚¾ð­4ÄHsÎH¥¾4}b=²&šjCi“„;FÍ'þ*·»¹Û›«õÝýzYµû8F	lÅÑëâg3{l5FÄbÅËÜ‘JÏEÁig2Ñ«$î	:ëºAM2Rwü2Ÿk--Ø¿WÅ<š¨Åú9±.×�ÏAë?f�øÑÑ©fN´p|„¯Ý¿î?}�Ao1…ïû+Þ!‡lTqm’ET„”ŠR4ë�ÍZ8¶�UUÿ;ò6¡4|óø½ÏoÞüMì#Z6Ž„ÇIÅÝè}ä„^×³j:©0Á]o:ë6!’(B‡¯=Émøþ�%Ùà/+Ò±©ñV<cåÈÿ`Ñ„9‰çesº_¶|}�57”Ô’ÇGÎ,˜§Ó`ûÈ!:>®X¶;òþL›½Õ"=øÚ3ºìLˆ÷b·½‚|g
ûÄ°¾²#µÁ_ :¦ÄØ[>¾O·ïn¾¬o
+jØX{R(¡µ¥Ÿ&+·8Xí¡¥•²†	-—
+¦•§§H†Ï
+šU•q”VÙºö3+½'%<TL',÷$(øm•q»'eŒöä2Ïž´17ÎtÙ›²6|RÉFÇGû“¾ÆÃ`(gTÒ¾ºæXü–§Ç¿c)­Ø¸¾:¥zÆ	kÿ‚ú_ÿÌäÒøåî£ =K}…&÷Oøs,‹£éÏñéãÇê•TËnÛ0¼ë+¶€J†çÑ“Ù¹E-‚&È%6Z^YhŠ )9E•D=L©Ž“ê"`8Îî¬öf.	Œ8Uèk£XdVæ�D
!\SOÐjI#„û„ª»tñ„J³TL=/âTk¸Wø9R�Y³øëHÅrj¢Th9å>D©ÂŸTBÏ–S>dƒ9€p£J‰}‡3¸tQ.Júèºå^¹(šR¤‡ªˆÔÜk•­Â7åäJM”]N=û‡p›SeÅ†ãN#¶}.æ8Ñ6ë3l‘íÖ¨ „‹Oúˆ3ÎÔª°!ÜšD¥{
w"§œmú©~‰P–Šš_kfkÎ"ˆ3•g°ZÙ¸U¿¾½ª&¨§¢|&aúl&©ÒøTú5gj)¯ÞQiª¬ LšÂ’
+M¦D£\xBk‹¦ºøc­:´Ób¿l¥Ú¼Lè=­*©“bLÿPH
ªÇ„
+ÿŸ_k í;˜À:M¹s‹ÁwÛé�Yó�‹ºQ8�jêtì½/}óÒ1åú¸v·?N']ëÜí]=ÐmóvTÚXSë¦7�èfSÁÂBeRžîQ&±oQ#�'“Î{®ÈËÓ¦œ1ïûÉS¶q
)Üâ„@Ægsßß`^”;¬X**ìæ+ha·O!ÉƒÅùÜ_l†Ap>Œ™v#[H…ÛÕ®¤û•ò¨¾y£àKXnù^lv€Àý‡ËÀ_h©˜0±Oj*pºF_5i®‚£Ñ;ÿ*@ØZz¾\Nûœ&¨–sµìÛž\/mI„ôkêü‚‚Ï„	œÏNytÆ>l°þ¬9ÞÚ)}õÞ­XmSã6þž_±ÜpØàã…¼p´\ËL�2å†%)£Ø›X­#»’ äþ{GŽœÄ²lG†ÄÞ×gŸ]iÓ¤Q
+!1áè
+Éi ïåSŠzpâ�¶Žö[°ß"*`Bc* %\B2�ëˆðËdx‹\Ð„µ[�‹º�Ÿ9C8�	û¹Ð%œáÙ¸øÞ±78&BRÂàWÌ�CWÎÒ(Å$�Ñ<G>�ÆÙŒQ©Du_2B˜dqA’>q:�$BLd�²IÂgDÒ„B#sŠ¹Þo—?]\Ý\(SyÆ2"ˆ€�*|Æ™Ä¨Œ@*TD’ñ!HBTµ™¡HI€@§­V!@‡çÀÑþ>œÍ	eœM•õ8åtN$ÂnÂé”2k­›\ê´UÖÕ/¯²ÙyÅÄŒü�ðWªPöZ•”È 2UXÇ‹kŽ`ŽòM6™ÐÇªª!`µržÑ8üŠ’üL$©˜oC"‰ÖO³qL˜d,P¥†ûû aBò,�®F{w¾	«§k¢>»ªº~™È8–À¿·$¦¡kèžšªÖÊAÏð¹Tû¾ÊxieÎdÄ“W‰	ßÅc€©JH‹Y“�¢4]¯•Z¬3¦puèfA ×ëåUØDH}ò �áCSœ®s•@ÊÑçË× –FJg6��úp”gPM	2KÞ¿kà—«¬uµŸkÔôX³—’°ÕÉ®�z0)§LNÜrÎÇ°�ÿ9‡¥ç:¤)Ê¯ªm]/ÿÿ–Äºp\+¯zöò×ªa-ò+qï´U"ÇŽÖ�ˆ¨RËdF�°�¼±Ä
+£68¾íÍØ*öý>Ö�¥±F×�q’Äµ¨ð}Gó½Ñþ›‘X¸Å<ßMd„¼êj£¯ª´É=-5m¯kP��X Ö
g¥™i8«¾~gg{{
¾`o¯äkg��!é÷5Î(™�¿:r- y†�%¦âŽD"ÿ¶®´žà5µÖok›¸ßÜäo+ÃKN»orºèEŸ–éÓožNï�¨Åi÷MN·OÔ66ûÍcõÇµ9í¾Éic¢;k§Ö1ªzú-§À¶™¾«ÓÎô]-85G\yÜ”P
á¥ŠnóŽqq¯;õšð‚ÍeGmms¹G4ÛÔäÝÖ¦^4À~mN‰g>¹ôéÄW,€òî í”V†7èWÏ¡Æyõ|áRRŠÏ~#±î%/[/•ØÊ9?ÝSwê7-öÀòí ÏfE²ÛnÆÖWG	ÂÉL_ÏïFj–A„B¿7¼dsµÞm¹uéýs…dJ¸(ÖE—pNžVþ¼ÌVwÌ¼ñ —£Tj×¥Lz…þ�“7´3ª®šy›meA	Ú,äM= B t×
+yo:#/_Év,²Çæ6Qñd®©!Ü �7…ã˜œ«]bó°*ƒ´1„ÚÄÿ|“ŠÎ¨ÒÖ¦^FTn¡z“›±lAõÕ5µ™èºL[ò{‹ßC,<ç8E…¿sô×|P‚Å\wsZ÷�w'þ§Ñ0Ü÷JÃa»ª¡h\«áš*…ZNÐZ5ÏŒ¬S1â[ÌvMÖôÝAÇ
q¾£$‹ñ‚§Y�EÞe‹t‘ÆÞ°=P¼:„áðÀš[‰,ý»cÿñÿûìÿé�ÜAgØÞxr6:ðêsß=z¤ŽÑ«Ã”ãô>'¦»,æáŠ]‡ë—÷ãIýPÃ8·šdñ“É‡båÒ”v>
+Â°DÂ$‰ãänpv‹Î“4ÖÁYZ»y57&÷*¥âPùÞúÝU]oÛ6}÷¯¸<è£Ž�¾&q7ðºÛÀi_,§ ©+‹›Lr$7hÒß>P–e}Ø±�
+0¾’xî½çðÞÃ‹�Œ%„H¢ÐÕF1j¾˜G‰úðÎ;oõüøp3
K˜I”ÁmLÔG|F¥™àÝd[]êÁPq„÷	á¢2.ˆâx5[¿wC¼ìÀgDF8ü‚)*¸ÐëW2–(d‚õ�ïQÍ„óÚÞ”3c·æü,˜!J“¨��ŠÍc„‡�0Š\#0	µ †	Þ™ Ñ—î×�×£ßÇ#*clbb`I4„Ìê3K
†°d&cUÑ"U�Š­½'Ô’P¬	tÞjÑ„h
ùûµàÚ(Â¸¹%J£‚o-€žïgOðáÊÄJ,5|â:•R(ƒa;úJQZ"9¨—=e:K…(åÔþ³G¦WÇËçÐ~ IŠÞY³�¼»Xn �’B»+@œ'Çƒ7ý>D$Ñè•vÛ¥Ð¤ŠCÛªrr&x£>(‘Ê<‚w^ž[•Lo©pþeA�]§w?	î¿ûÓÁÃ`„]úÖœ�t}oÐî1§³&P/ S8.Ì­€í
+´TŒ›ÈurÐ�4?iÛû\(bw7µTbmç©—ÌÐr-&§ÓzýÔ¶¡óÝ9k¶MÚ;–„x#Q#TSàMÀû^…fwÀ“vI–~&xCåÏ½	R9ìüärŽæ7ò‡P®wrÉô�?º�sÍ‹µy†ü±‘ÊÝÝV�LŒši,‘²ˆÑ¬¸fÎ†¢õT9dœ�œëuö
+,8SÏƒÁNè¬mTo³Q:žê�‡™J?’òÈõA/V‰øè+¡¦It¯<lR*ö@n¬¶j|uË½i
+›m,�N)½½„'ÓÒøDB!±&²òK-f\ç[ ýà)xÚv:Åná’DC{n“Œq¾@nê­PN8™Bm«K#V	°WÙ]4‹«¤œó A«vW—uÈ›Fÿ‚®YË¼l]�NgÚ¨¢àwÞ6–AŽ»n¼YkTB[2ƒê.&üF�þJIr'™äÉÆ÷’>Û©N[§QÍ«�eG9[•‰”à9IñVÆÊ½´£ÿ^ßðÕ®øÑ
ÿ/uÞ:øžÆÚ®÷Î¡ÛÖý~N÷:Ýÿ«KKž˜h<šýÅú¸kz÷pUém©¬L¹øQŒßsëoµUM�Ú0½çWL¥I(»l8BÓ­Ú^*u+¤J\6(2fW‰Ù¥ªøï•“ùÚ|´*·àyofžßxÞ=Å‡¶H"Ð’J0ª|õ+F	.8öÂà$DŠ°<ñ%òV($‹øÂ0h@¤„üûSÄ¥„qµ"A‚ðÛ˜ŽÇðáHÄ%ê[nPÀxšžÆ‚‰B¸É�H,ŒAÆ‡Bb¢è¡
+Ñ-ó}-6 ÀÓì	Ø$,Ø>£"Ÿ‰"C€Ç¬æïÙi'›€QØ%œ*qð}šjœPeå\e°�‹®wêÀäýû*y�'*ÄÇDHÌU´*ì‹4øÜ\ÜÕW-™eÏ/�ÞŠ¨Á/9Ri»È>åìAZ’¿‹|Uì«yE´vògíeMZ6ãkÜ¹õ;8µÙpf³ÑÎ¹ÔÓÐŸ3ž"gîà+iÉ<Í�Ã1bÛºOñ¤¡•[oô_”ù®+X×/#…\1¬–wìTGÝ`—Ü‡È•~=<ÅA´EË|0'ÕÎj	Ó‹Mÿp�ãÏ²Ì–Ç¤Ï“£V5ÕËãÚ†'°WvÃÌ�'AP*6½ñìáu�I‰ªÎê¬m� 5³Ó’Ù¹d.´šº¢#ï¬GÞYKÞÙ-oMcÝv£¾EêW“VÝ»5d·›½Ñ±¹éG]®g;°¼XàÞÓ)4§Þ[ëalOk¾šèå¨è¥
®«Wr�¦ÐRuý\P/ÎzQŽ/¯ÈêI%|�q@(ZWðãzf›×Ï}4Êôïµ¹ÿ7i²UDùOr4?ACt)Çè·à�ë‚y4«­gowµ°WZM6R	«*®s€³ñ}�ÁjA†ïûÿ!Û¤1½Övâ$¤4PB!%§‚ÑÎÊÞ¡cÍ ÑØ˜�w/³‰C0%s“æÓ‡ôÏ¯RŸÐ±¤<Ê¦ÞÙÊ‰3ø:ž5ÓIƒ	~÷>cíÃg$RC\ãWOzÿ<±få¢Á€ŽÜ×*Œ›@ò—Õ2æ¤ÂËöX_t|yŽGn)›'Á.¬˜çcc™úÄ1>oX7[9a‹x«èÛß£ÂzÆº„ÓAý¦7�tÞ±d†—uÔ-™�rŽ˜2cçy?Ìý¼¿½{x¼«ªábëÉ°§ŒÎ×|ÚbÜaï­‡ÕTr,ê.v\#˜6B[Î‰Ÿ4k(g¼ÕeÛ²â¹i`:™`¹#Å•«šÚLêwdŒ³…Â³W2•6x‡uWÀjå¢dÓâl4¿Òc<x}guÓ/—C‹w]ýzù¿Ôçk9ŒÆßÐÆ>˜”­¨œH	áSá†í©ÒÕ9lù©ó¨ziþíW_oÛ6×§¸"N‹½ÚIÚÆsÑM¬éž
+´tŽˆÉ$GRq‚"ß} EQE;ÙŠ½M‰u¼ûÝñþëì­¨TX6Db®´¤¥þC?
+Tp¿ËìÍ«^ÁmMliƒ@"5ð-ÜÔD^ño×„Ñ-*ý:Ë»ââQÒ»ZC^ð^2„Ë†°?QjgD2|·éß_Wx1‡/¸!JSÂà#¶(áLõ„w¢ÈEƒ1ã%Ê»a,âmÕ†« äLKºi5—ÊÙö�KÐ5Â¶m(½¡†»¡%2…@Ù–ËÑ”³9ˆ‰B¸§¸·rŸ®VëÏ_ÖÊzC×DÃž(¨¨êta{ªkÐÆcŠ·²D(y…Î;o2Fv¨)1öß2ËZå©¿£T”³oë‡…1ˆGô´eJÂý?v¶âLiI(Ó7D*”ïm-ùžlì^·-+­b%$ez»Ì²²!JAoð¯¼lwÈô5%|ÏD»ih9ïˆÈc˜UîW±ðhNÞ<Z>oæ™™XÊÔ@:PN/îP¯ÇºACË‹åÁ$5Œžs˜™(�^ìˆ¸}˜{-±ì�))YŸðyl‘£{“b\‰µTÚC5Åý-8� Ý‘:ˆ¼iYÕ`µâ;Á™…‘/ãÓ¾Xf#$‰º•î}¤òƒyÌé{!ZÚºùLv�3­Á–Tó¤¨ËÊH¤§¦¤l4d¨ÄYèìÄñÄc#–À¿OP]Ö�ûz�QÂjs6òÚ¸Z|	ç3´·½F¥ÈæÅrÊtáÈ+^YÚC²îoWp’Þ�£Š³ÙÄPCÅC`±ÚS{£q,Jß¬4
ñ„Ñ>YLœé’Æ,k\”VC7’ÈÇçp[42uÔš!ý×=staOO•ÕÓP/îÈ×Gó“¯LµBpi†…mK?«“9$�ïœ%G‚>´¡¸ñuQ,†ù|5Lº Æ3ÒêšKÓ0lYÛ·o,ûzÞ-—H\â8Pk|'ä´«¼0³Ëá:bœU½ÖÓRUŒå˜žâ<è8ÓBO±×D­¯	mòÞZ]ë�yK vE`mÓLÐ‹ƒ]cðÚÌ­}tÎ!rß§Ñy˜ð½hÿÞÅÈñ�]i	’jìðU6yŠßÐÇ9ès!•Py2ºó¤…ÿ ÇG#1‚¾Ã›0¹fy9P;'&%F¾µBÖ+³Žºùx“Š–°ÛU©ƒû×±Ýç>2ê;èÓû?l‹fgbnÅ[ä�¯I$»œ»‚YÉû;œº®�¿DÅ&æát|ãK
+oz¢Ï˜ÛÞÔÂy'H‡é§!kOVÝBþÓ(P¦í<è¡MÆQè×`vòZCŽ²`n{0zÊ¤õMà?$CÀáº÷‚˜ºã‘&0Ý^�~`Äì/ì‡ÅòiT‡å¼&ª“vó
ëhõ�Ñ]Y8+£x—ýßE=vÅ�+{v‡»’á0¬opI¹)õ?JÅa“ŒwG[k¥X€?=þ•›êôù‘¹Qøþï•ùt šn´ •}ÝNíÅ^øM7Vó�Ëô×Ù3íñÿ™äòê)ûÅ“AoÓ@…ïþs²]¥‰¸&¥”–VTjQ¥rDB“õ8^±Þ]ÍŒI+ÄG›8Nš‚ÊØƒ¥]½7ûí›ñÉÛØD¨È8d*DÙý¢�‘ÞÀëržM�28‚O�¨­#°Y!Ôp× _‡Ï·èmM¢“ÖÚ‹Ù.…Â”ðŽ=Á¹Cÿ•XN�=�-¶ûIE§c¸§ŠZôð�:b8‘íÁYl"…èèPxN¼lÑûmç­&) ¯À¯l�–ží*0hCPwÎ�@“ÚYC^¬¯·¨6ø1DG(ß,­Ö¾›ë‹Ë�÷—©Ô:
mPa…••Í]TÁÊjš“Ð±!0¡¢>�iæ±%‰hè0¿y–u’Ð¼I—ƒD¶^ëy–‡"°ÕÝ¬ˆá{»…³DQ­Ùykí•u›Žú%Œmº¹œ
uú
+i)?îíÒbÒŽ=žVƒá}0]K^o1Fâ¢,�O[ŒÅ_Z‡úÙlÀÙq<q•óaûªi ¸|0×�Qy@§
‡ì³mB<Ï¡ú4‹<)S$¯j´ŽªI>ÞËgüÌYX¯åˆŽO—¤¡¢âšýö=ÙæûR·Ò0üa·úÞ¹z/Ú<6È³é4‡É®L Ÿ¶Ûô¡uy�ö2Ðýše@ÚùÔíHþõåw‰¤<úX6”ÿ­¡ù‘ý½XKoã6¾ûWÌÁ€¥ÀŽw�Š$Nóh‚HÅ&ÛØ]´4Žˆ¥H–¤â¤Eþ{A‰’(Y²c'¨.–Èy|óäÐG¿ÈDBŒ#
+m�Ì½y–¨aÃÃÁto{p—P
Ê¨I”±€ß¢®Ä·ÂéµÙ@N{.ä³¢‰� 
+áTq„3FøTFÃQOæå÷~ŒÇc¸Å9Ñ†¿a†
+Žt¹p"‰B2lž¡zH	ç-ÚŒScI�ð"Á�¢óÌ¥¶K¡À$‹Œ1ˆ* –šÑ¹F |!TJ|’!Ñ�—9ßõÕùÅ§Û+*÷†Iˆ�%ÑS]èÂ–Ô$`¬Ç´ÈT„‰�w¦NRÔ’DØößá`�éjõTš
+þí”?»×sÁµQ„rsØEè~×íµ%üusý§¢Uñ¹ÈxdÍ†Hd%IµfÍ½—™¹·^Entk_u¯P"±vL÷öàDjÂÒ‰Î¤T¨5ÜP­)(0d‘Êz#bÄî9Ü¢¢„ÑPÁ¿€\Ð#Q5TËdw¤¢�Ä ŸRVQldsF#X)óN\R†A©†©{[ð”?ÀÐiãÀ£ ±aŸóƒjË>ç¸¹l³`rìA¸Í5•î°¢ó×—�V8«v„¥!5î�!Êü*¢,En‚Ð¹Ê# q|.¸!”ëÜäøÍ'’bŽ¡¹ê2juãîYb:cÚ
+\½µ4TëWuéõˆøŒgTašG )¥±ÕÍ}–ñ˜a›±X�ÏE*¯¸+v…&S¼”² œêÄ÷¤4—“^Q4Ü¾’UuòÂ8.ë4|*ªÉ±�Èo0ê¹�B£¹â±ÕgT†›ˆ\2ÕÕŒ`4†ŸÂ>Æ†E£�ûFc}¹»œü<ZÇrÁ°à�	Q}”Kû{j\#
FO)ãÚÊOŒ‘ú`:µÌûTLŸR6-c8µ:2Úw­ß$ÖÅ«Ýþ‚òP#�KëV³®I×Y�Íóc�™™f´û�ûõ{*%£Q^F¶xa˜7&p%ÃÇâe¶VahOûŽÔ\�ÓŒcä´�ÖÚÜŽ¨E2ˆ&ÇD»ôë(×5B~+Ç½ú-ÉYÉÔKj¢ŠŠðŒ´OdøÜ	“cª=ßÙð7I_ÏŠ²IKjQ�ü,Ÿ¹Bòã°±ü2XíšÎ±™ð6X¬ó.�.žrý¾ÂR�ŸNå3u3@®*�å$Ð¡‘Äq
m…¨ ÌMx@Óª– o`X¦‚p…c7çÆ¸ 3ose”i#Ò¶_õÛV½lmÃ)Ïó®†QÇê.�ÆIidìB($¶¤;µ�ÍL"”B †$ÿjÿ&åWÛ™¯ïs¿7Gm-	SBYKÔ…]ÂžúÚÈ¶“¡¼Íº#—k¾.hº&È^:¹Û.›KPÝÜ,&S¬-å‹êwÝ&·½Wå4fUïã\0†ÕPu-w”�L¤'ÁÍ‘]·ÆÆtR5\�Ïàë÷ÎêêD‘”·Ó®*ºhråÚaþ§�tÈ>÷è6ÌÙ×‰;ú®�T(ÏpmëÝ¹:M6�®ýúõû
+ä:çvjÎÍ²r’7`íá[nW†Þ¨ÕG«€:2ÇË0›.Õç¶-ŸÌîý·Öúöþø–Áÿõ­¡¼£¶o¥~k˜÷î­ö›Øùÿ9Á:6˜Ífð¡šâfâ{ãµA+Též#»Hž*íím3&*wÏ›6„·œà^
uŠ­þJé¹Åüy»&ë9zåZIšÕ
³îÇÕ­^Ú~ì¼lvûB¨|lj‚ÜùÒi“Š:gèÝ;k³v(
+ç¿þu�KKA„ïý+ê¨"Šç]ŸËŠ*‚Éödv‚=é¦“qñ¿Ë¬/Xð˜Ô—JQÓÓÒ4UÞ1¯ýÉß
+Žq´;	‡{{xèÄÐJbˆ¡PuäwÕE~¼!•–Í6ì,—·*«Î±wq^•q‘HŸ¹ºaJUùlù34|²�{^’¹�âŠ®˜ÚÏâ¬t…sI¼
^p]õ¤ºÅ*>¢ m³z•åà¹Úw¶Ë\á£RBü
:ÒI"«1DÛ\{rÉº�’˜Œñ"¼ÞÜ]/fóÛûùhµiÃ;r¬ÉÐˆ}ýâkñ>6fy¨‘sÃßí¥ž­Päíþ&!ÆXè%iÎëjèY}þ¹Œa&!ÄDf˜'…YN‰ã¨ü"àWgmì_H_¾®
Ë÷ð>]�AKA…ïó+ÞÑJ±xnÕZ©XPô(Hv6ëNg†$k-â—­V¡Ç„ï%�ovQCEË>‘ð‘šDo/¶­¬8Ãéhê&ÇÇx
+QÑÅÄˆŠJb(Éª<ßQŽ«�8ìØ«R·_ƒáÈ�p)™±H”ßXL1#É<oöóIËçc<rCj‘2n¸gÁL÷‹y
•KM|.X^×”óÛçh
+Ê-|É&±é­ˆþv».Œ®O	þ¯è@§è9+#æ®Èš,–<FMLÊx�¼ÙånWWËûÇåpjgÃ6¤h£þüâ›h6ÓÒ‹gøÒò¯�‰Ë´f­äùÐßÔ¹^OAÊ†šÄSçb6–n`—žëÐ	üaœ[ýçðé¾Ü7u�]K#AEßûWÜGQô5q×"T÷qa©ôÔd
+{ª›®£ˆÿ]fÖd!°�}9uûræ?KWÐpLTùÀ¼Jô?þ^Øp�³ÃY8=
+8Â¯N­$†
+UGnñÔQ]æß¤Ò²ùIÀÄÞäò^eÝ9â!®ª2®éW7Ì©*_®¶ï“†ã™Wd.¤¸ã�+æ¶
.KW8—Äûà5×uOª{ì â#
+Ò1«WY
ž«}o»ÍÞ1Ú!%ÄÝÐ‘NY�!ÚæÚ“KÖc”ÄdŒWáÍtw¿¼Y<>/ÆªÉ†wäØ�¡ûû7ØˆwðÑ˜å¡FFÌ
Û9
J=[¡Èûþf!ÆXê+%i®êzèY}ñ¹Œcf!ÄDf; ”$qÚùH=ï8ð›³6öß"H_�‘á_ø «$q4g¾-¸�tàç³ð¾u�OKAÅïó)ÞQEÏ­ÿ©XPô(H:›íg3Ã$kñ»ËV«Pð˜—ßKozZº‚†c¢Ê;æU¢?û{aÃ1Žv'áp/`��ZI1ªŽÜâ¾£:ÏO·¤Ò²ùAÀš½Ìå½Ê²sìÄ]œWe\$Ò®n˜RU>[læƒ†OöñÀ2R\óÀSÛg¥+œKâmð‚ë²'Õ-vPñiƒ˜Õ«,ÏÕ~²]å
+ïí�âoÐ‘NY�!ÚæÚ“KÖ}”ÄdŒWáÕÚw3¿œÝ=ÌÆSë6¼#ÇŠ�Ø÷/n°ïàcc–‡17üÓÎaPêÙ
+EÞîoÂ`Œ¹¾R’æ¼.‡žÕgo‘ËfBLd¶f=IúÝ‚ßœµ±í�¾$%ÃŸø>Ãu�OkAÅïó)Þ1	!¡g»mþàPC[
+io…"Ïj½"³šAÒÆ	¥ß½¬'`èQO¿'=Þòc:Î…ŒO<LrüŠçÆŽ÷xwºH—g	gø>ˆ£—ÂG#Ôß²uýù…Tzö¸HØ³·µ=›l‡ÀI>Åµ)ã¦�>°…cI¦|µ9Ì8Ç=oÈCHñ‰'6,ý \µ¡qm…�Á¶íHªGì¤3
+Ò¹j˜l¦¨æ/Ùîª!F?•‚üt¦‹dVgˆöÕF
+©zŽV˜œñ(¼Ûû>¯oW_ïWó©}1P`GŽNüß/î°“sc^'ËŒ\;~iç2)�ì�2÷·HirÆZ©HwmÛid�ÕSæ6‡Y¤”¹€V^wà§`íü¿fÈØ
+Ï’ãMü�þ¤¿e�ËJAE÷õw©"ŠëßŽ(¨ˆº$S�¶ƒÕ©¢’vñß¥GGa\&œ›\Îô°t
ÇD•7Ì«Dò÷Â†}ìmNÂîVÀ:1´’b(T¹ÅmGõ2?^“JËæ;Kö4—÷*Ï�c#nâ¸*ã$‘¾puÃ”ªòÑ|5ï4|°�{ž“¹�â‚®˜ÚjqTºÂ¹$^O¸>÷¤ºÆ*>¢ m³z•ùà¹ÚO·ó\á£RBü-:ÒI"«1DÛ\{rÉº�’˜Œñ*¼Xæ®.Og7÷³ñÔÒ†wäX�¡ûþÅ
â|4fy¨‘sÃ?vvƒRÏV(òº¿Iƒ1îuéyö¹Œ%&!ÄDfXqg9=«ÿà7gmì_Ò—Ä#kø[~„Ïð…RMOÛ@½ûWÌDÒ^HShP‘BU‰*B›õ8u½»šó¡Šÿ^ÙqH>ºË3ïÍ¼}o�¿Ä"B†ÖÆž(“Õ;}Š(pŸÓq2ì'Ð‡_	ääH V9ü,_„›Kã)GÑ£ìYˆOLËB¡gSøÊáÔÿYŽ
{œ.ÖÿGNp…#JÆÃw¬�áXÖ…i,"†èpxŠ¼,�÷;ØÊ“ÖP0>¼2-*
,­¶óÀ B^9öEh�vdÑù<pi”‚@thážð¡áÍ/Îf?®fõ¨Æ
-ŒÂƒÈHV»0ƒÒ´vLBÅÁ†[w†‰7%J4wý'I%sZü¾œÏ˜�›B^y[«‰L^óq’XgD`MülU¢×y0ùåìÑblø¨è3�›M‰Êè°lŠ€a¿Ó{ÃÛ
+®okÉu72ÝEØs´x,]Ó•q²f6_èÿ_“
^”+«��ZÒš;�†M¹³¾³¯E¶Šª…#»±çîîevÏ0›§.7m¯YŸ½:�ÃÉvNv¯öÎ‰E¡sNÞqýé¶5¤‘g½ŽFÛ²’ímœÝb}özsò8‚ý†p\Uúöçœ\]—ô`ðŠ¸Rz8)QÄ,ñ}€#ÿA×6ûÞï×/¿ÓL»ØÍœlƒKW†>¿z1SF­Øwcÿ0è%ê|Ëö^:‚UÞ›€Û™o„´–ñœüe�_KAÄßçSÔ£Š(y¾KâŸœ(h1�é›­ug{†éÞœòÝÃ^<çc¿ª.jù¹c–Æó–¢?øK¥á#>.ÂéQÀ~ÉÐ§L$C•æ(=¾
ÒnÊÏ;ÑÔÓü$`Ë^–úÒÒãà8ˆ‡8oJ\dÑ'67,¥)ÏÖ»û¤ã§cÜs-æI×œØ°´�pV‡ÊR3÷Á¶ÇQT÷ØI“Ï(D;Ä¢ÞÒzòÒìµÛUið�è§œßŠÎtN‘jDÒ¾´Q<=FÍ#~%n¶¾Û›ËÕ×ûÕµ]ÃqlÄÐ%û÷‹6Éø¼˜•©E"–Ž¯ëœ•‘V%r¿E“ß'õ4rõYç‹b3ì¸/%N#Õï¤V¶7|vjgï�Æš9;ÿÅßáOøe�]KAEßçWÜG±øÜúMEAEÔGAÒÙ¬œÍ“¬UÄÿ.[­B}L87¹œÙQé
+Ž‰*o™W‰þäï…
Øßž†ÉNÀ:1´’b(T¹ÅmGõ2?^“JËæ{+ö,—÷*Ï�c+nã¤*ã4‘¾puÃŒªòñb=ï5|¸‹{^�¹�â‚®˜Ùzq\ºÂ¹$ÞO¹>÷¤ºÁ*>¢ m³z•Åà¹ÚO·ó\á£RBü-:ÒI"«1DÛ\{rÉº‹’˜Œñ*¼\å®.Ïæ7÷óñÔÊ†wäX’¡ûþÅ
–â|4fy¨‘sÃ?v&A©g+yÓß4„Áwƒºô<‹\ÆÓb"3¬¹yâžÕð›³6ö/	éË7kø[~„Ïð]�QKBA…ßï¯8�)bô¬•%F‚E`�BŒ»sÝ¥½»ËÎÜT¢ÿ×4ÁÇ9|3søÆ÷ÙeX6�
+_‰oôC÷™·¸é�ªë~…>Þ�Ô>0¼ SQ¤oŽÊ<­^(úšE‡ì4å}ñ§¸2=<”Èx?¹¨`L%òd}š‡–ïXòšD=E<sËc9“ì2§ø|ä²i(Æ¶�^;-LŠZüºÕTäØí)¨cÔm0ÿE;:xÃQ>Ö©4¤>År`Æ—çíao1ŸÎ^—³îÔÁ†:RlI`½üýb‹­WíŒIj‹a˜dùhçºŠÔ°d2|éoTU&�NÁ"‘å2ÛÎ]ðN9ZÁêù&n8ªà~W?Õ/u�OK$AÅïõ)ÞQE”=Ï¸:Êˆ»"èQ�LUz:luª¨¤eÙï¾ôø<æå——Ç›Ÿ×¾"qÌÔøÀ¼Iô'­l8Ã�ÃY8=
+8ÂC/†N2C•š£t¸ë©­ÊãoRéØü$`Ç^•úÚdÓ;â!M—™ô77Ì©)_¬?æ“Ä?�qÏk2RÜðÈ
sû.j_¹ÔÌûà%·Í@ª{ì¨â
+Ò„XÔ›¬G/ÍÞ³]—ïÝ˜3âgÐ‰ÎY�!Ú•6�KÑcÔÌdŒgáíîî×êjy{¿œ¬vmxOŽ-’ØÛ/NØŠ÷ð©1+c‹ŒX¿·s”¶J‘÷û›…0c¥Ï”%-ÚfX}ù¹Naf!ÄLf¸-Ë�$/Rjlö¹¿8k²o
 CÍ<I†/ñoøþ]�OKAÅïý)ÞqWDÉÕÝÄ(
+zHMO�S¤·»©ªv³¿{˜ÉdëV�ß«z¼õy+zŽ‰”æ*Ñ_|WÙð_–«pzp„çQƒ$†*©£ø1’Þ—Ÿ�”e`ó“€™½.u§ò::q‰KÍŒ«Dù«Ö¤™/º�ý¤çoÇxâŽÌ…2î¸±bmÂE+—šø¼b}ÝPÎlËâ
+Ê=bÉ®Ò5/jûl·Eá#ch)!þ:ÑI"gcHŠnÈ¥äcÔÄdŒ7áíì{¸¿¾ùþt3�šÛð‘[2ôbÿ~q�­øŸ³Ò42béyßÎiÈ´a«ù°¿U1‘.kMçàßÎ¹7<ï*ãO€Úº$CËqFÄ>Ë3t¥¤=;�²7Ípm¼šÅ÷ðþ…“ÝN1…ï÷)N�ŠMˆz›Ê�‚ŠÔ¢JT½BŠ&ÞIÖÂ±]{6ªòî•7H¢¾óøÌœÏg½g_}éQ°28�´’‰<{ŽáKg˜õ»ºøUêˆ™6á)Ü?K
+·îáY=ã(§íµóÏAÏKA®:¸–qeÈ>r�ˆ3
+–/¦›ýiÁç=Üó”¢h²øÆœÅMáÂ—ž�7¼/¼â0_�µ{ÚÊjIR�- œ• §•¸[¶ %cVõšÔF+¶‘¡íÌ…‰v¶o˜"c©¹nú¾ß^�ïîÇiT“†”$¨)¢ÐqíÅj-%$%]C¹‚Ûtú™¥GOŠ÷ófYšUÉ>ð|² Qåp÷ ú ­Ì†Y¦ÅˆKï�V
ñ-3èw»¸XR@³ód�Ê>è%	ã(q³u­š­^
&ål”P)ÉÛîFÞiG§u”.xrÎ6V�“ÑÅM[¾V÷…©ŠÑÆ6¬Þ7§xßXæ�ÁýÕ5°TÁnÏüp–Žã?™|?¡5ãSçÌ‡Ó1µÌï¹µQ¾Ø½
c'½–N[~z†üÓëgÎ�êþC}xÜk;¶OKÊàjX®qk—Éfïbã'Å>mò�¶´ÚG“¯ÉÒÿÛ\ðàs<H?µu‚f$NÀOž•p1À’máBß“z¤9§†¶Þ‹ÿ0
­`M°Ó¾õ^VmÄ«ì•’[k1…ß÷WL !»ÆŽék|‰�àÒ@
+écÁÈÚY¯¨,‰™Ù¸¡Í/Ú‹í¸NJõ¶££s¾™ÙñM(ä¨­"LYÈhYÊs@†	|ÈFÉ°—@¾•†¡0Á0E¾€¯¥¢{ÿý‹r¦@–«jí�ÏdÖ¥@ª3˜“C¸µÊý@†±"‡³U÷}•ã´�¸R,F9ø„Œ¹+ÌBÐ‹ÇÂ[¤õF9w¤­œ‘(årÐÞ	™U%ž¸eûè	¤D(*kAï@£Ú�ŽŒ+<m”ïú,*Fx2¸­ß}¾¿[<<.¢U=
)•ÀV1ä†›,Ìak¤‰c_‘FÐ>Çv:ÃÄ©
rP�ç7J’Š#šÓ18�qRŒ’D[ÅóJJOð+öz0{R1Ö­£q,2OJÎcÊ(y-u•µ¿eì_rŒÕVª•5zÏ±\jïX¨Ò’¶iµ}n³æ5Lê€¬Œç<a0�b€IutÛ=îâÕËiÅ�u~š]w}ïÃLéYëY*®ÑÒì'B©È’í�ÚÔY»‚ô•ÅåÃø‚§—ýWåË“u{ƒé¾‡�({·é5ÊƒÚàÉžßêæe·ùFÚƒY`e7ÅŒ$S„*„v€­~xe?ÖkXyoß$ivz6i~‰µ·ólpþw¥R’ß‚Ã-<øZ2ÏsBæÅO�!f¤Ù{;>DîH_’?}’Oo1ÅïþsÈ	ê5K(¥*R[UJoUƒwv×ª×¶Æ³ ¨Êw¯¼h€¶{óÌóï=Ïìü}¨ä¤-2�¢°ÑòC^Ex€wãLÍ&
+&ð­2
+c	L„€,àøZ!oü÷ÏèLAQî´Úµ/lÊJ`¤Ç°bGðhÑý$–sdGËýp¾Ëi1…gÚcƒ>RCó8–¡
+äƒ¥Ká#qY£sÚÆIR@—ƒöNØìñûl<ƒTEc-èSÐ¤¶F“‹ÆžkãÝ‚%ŒCÇöÞ§ÍúéËóSBµÓ�
+Ž!7±ó¢ŽF*�4±èÖÚçÔOg¦Öjºœ_¦T	Ö¾q‚{KY{Ü1ŠçUY2•(}¹hœNA'y¦Ôl2�¥P,
+Ýš:XªÉI¼Ì�“éª‘Êó"Òc„®°öÖR~ƒ8Eš^Óà—híÈ=g»KäÔlIvƒm#ýVÛ]¦º^³·Fÿyæù¨»?ÈÇ÷pð&ïMÒw“{»èiÛ<Ú¬Õ¼ª!OweK&iØ�’õõÙ_#”$�.ŽÆ÷€ÌøòÆ¼'�g8ó½äµëI(ãäÔuÏqãÿòJ’a‰z¹µ¡wmåèøOu—àdüª~…‘Oo1Åïû)æ�ÃB ´×ò§$(U‘ÚªRzK#d¼³¬ïØ�¡¨Êw¯¼,´@JöfÏ›ß{~;úè+j«ó l´,dë1ÀÞw†Ù ›A~T&@i,‚	à¸¾WŠçîçWE¦Ä 74Ú™ó[6«J ×¸eB¸³Šž‘%ÀH1át¹?ß8éÁ.U£>cD†QØ_L}åÑy‹§Â;äU­ˆN´‘Œ$)(*@;6Ë(ŽC›í“c�
+¡ŒÖ‚>Mjk4R@0T:®•G=ðU@XÜ4{_æ³ûo÷	Õ´!•Ø¨…	;/,`c¤I�Y#hW`ÛÎ #UcðJãiÃ,‹a.ÈJ›SI§( ]¤$t»0¬½U‚}S{‹5’„ÃÞÈ�ôn£TŽ'ÉO[ì.fÎZlx{5¼B€ß@ã´VÜî>>%Zx6k%Wª„av¬7$gRï‚iÞ1†w­ÞÇ¥5úïí(G-ùiÜƒW§
—¾«ÔqÒN`|õ'+”"ä�a³ðòº)ãÆP‘w>ÀÚ™â~œûh­¬i8Kçì?F‰Lg¸Ñî‡æÇo¸œõ·É Õûÿ"GGf$I¬]IÿÅµ±OèOñ„¿äíB¯¯÷�—ì…�Ao1…ïþïÐC…F\IZB¢"*A…TÄ	)r¼³Ygl�Ç‰*ÔÿŽv{Yyæù½Ïoñ:u	
¹`…FYÅ;ÝèS¢Œ¼ÏÍlb0Á§Îg´>|F²¢ˆ->vVîã—–}KY¯
NÚuLOâw�bäÆx#LXË_I4ca…i¹Î×
ÝNñH[›Õ[Æ;*$Xäa°L]¢˜]
+W$»½e¾ÐöZ¥°ÜÀEVñÛ¢QrÏö6
+´#´%¸3hUïˆ3ÁseoÕGž"²™pðt<Ý{¿¾{x¼«V§6´³Š£Íh|þ‘E
Ž^;hm,Ç"ŽàbC};3ÃvO9YG—ýÍ�)ù<ýL’}äá?7Æ›3V…›@Í:îSdbÅ7³ÉËƒTÞÕ :NâV	W5un~—öÖhçÈÓ¸lƒwh»Ú	69«§£>ìä>=û
ãž­~Wµ�·UX�7ÑÅ¾¿Y÷gŠº~þ;ËŽôÁîi4~5¼ûg¢�á_ƒÿgÕóW·á)ÿ²»€{6ß�’A�Ú0…ïùsØ vQ¯KYÐVEj«JÛEÕÄ™$VÛO@¨Úÿ^9	t›,U}³ýæ{oÆ^¼÷¥‡Œ”A¦QÖJ~ÈÉS€x7ž'³IøVê¹6:€Gp9|-‘·îûg´:§ w	4Ú�ó'ÖE)0RcxdK°6hK€²¥UzÞße´œÂ3¥D£…�TÃ"œV¾ôä¼¡¾pM\ThmO[[-Q
+h3PÎ
+ë´Ç¡ËöÁ1HI�×Æ€º�j£Ù@ mî¸BÑÎNÁÂ@pÐtlê>m7O_žŸ"ª™†”(pÄ™­epÔR‚Ä‰W³"P.£n:³ÄbEÁ£¢þüæIR‚�«­`jhÞl·BŒâø±(˜
+”î8¯­ŠAEù<If“	¬„*oPèVWÞPEVÂ°ÐV¦ëÚf†²�«¼³de£)ƒ!@ÿjãŒ¡Öìös:t€_	@é€< îöÑ-J<ëC,¸I{’øývûyÒªêÔhõ§gÌ²QŸ9DŒïáàtÖ…‰ë&>ÊíràµÛÃÃ°~ÞÔ½$ç^ZÌVLR³}£«N1{3tAÒ¯£ñ= 3ž^…ìè×²þ•ªïÑ|†ÕV†ÈööxüOrAr~æÈ¿þGÎª¡½¥ãÔµù.a^’ß…’OoÚ@ÅïþsÈ„öZþ”‚R©­*¥·4Bëõ€WYÏ®fg¡¨Êw¯Ö�´±�ø¶ö›ß{óÖã�¾ôP ¶Š±„�–•ì=˜Àûî(ö2èÁÏÒX‹`xÅn
?JÅK÷ë›"³Æ 7ÔÚ…ó{6›R £»ð‰	an="K€±bÂY~<ß8íÃæ*ˆQ_0"Ã8_Ì|éÑy‹MáyS)¢†6’‘$EhGÂ&�â8²}vR"¬£µ _‚&µ5) Z;®”G}ðU@ØÜÕs_—‹Ûïw·	U·!¥Ø©…	Ï^XÀÎH	’.²FÐ®ÀC;ÃŒT…Á+�ÍþFYÂR�•8Õ§u$�¢€v‘’dØëÁL°òV	Lå-VH^æÆ†¤?�TX,®òŽ�dšœµU!@óÓÂY‹µÇ‘'¨ð'¨Ý·Š[”û‡ä�$žÍV	ÂUÞ�„QöšaHZCÞSï;�w½�¹5ú_«•v„£–ÎùeNøwK¤ç*ÝÏ`ÚÒÀäÄà`ºAiZ…NwTãžNÇdÜ*:Ý°u¦h[¿Þôh«¬©9¹sö?£D¦nüü«tÎmx9õ#î“Uºš·œ.rtdF’ÄjwÜŠzßp|¸hIø[Þ®ûúúyÊþ…‘AkÛ@…ïúï�ƒmÜ˜^k;ubRjHK!=Ìx5²–®w—ÙY›Pòß‹d)N•–ê&í·o¾yZ|ŒuDÉÆ‘ð(©X£[}Šœ°Äûñ¼˜M
+Lð½¶	•u›I¡Â·šd~|!o+Nz] e×!>‰Ý×Š‘ãV<ãÎ‘ÿÉ¢	Ï«]ÿ~]òÍ�¼£¤–<>sfÁ"õV±Ž¢ã!xÇ²?�÷6{«
+ò%Lð*v—5HêÜ>�ÖŒ*;ó"ÚÐÎö‰a}ä@jƒŸ":¦Ä8Z>µ÷6ëû¯�÷MTÛ†Ö¤8QBiÓy—8Y­¡Mc)d1JîÚ™žœ"ö7/
+ã(¥K�›‹
+~0›L°:’à6kdœcÓžOf-ÅIWÔi^üyï¡ÛrˆwÛwxÌ;g
ªìÏáÛ­	>©d££7“ûQÓ—ð>mÜY7ÏUSÈ»›ŽÅò•áéÄò•Usüüw·=ëY)�ÆÞör1Ö,~ ò¿èn¥&ºßî_‰Ùçâ7m‘ÍnÛ0„ïzŠ=ä nŒ^#;µ“*¨§(j#§ÆšZYDi’X’rƒÂï^P–b˜7-?ÎÌŽÆßlc¡"¡�)už¥ð+ÿaÉÁ¾fy2$0€e#ÔRHÙƒ©áWƒ\š÷WÔ²&çïèØgc?Xn©È`ÆšàI¡þCìŒ‘5M×ÇïûŠ‡° 5:/QÃ
+Ä0vÇÁÔ6–ŒUt
>o¶¨õ´ôÔ£=Ëuð†]ŸíÅ0ø† J�8�´’‚´#�º6¼E/�‚U„Ž •´ëÞÍËçâç¢ˆR]¾A;tPIwð¢
+vÒ7àccÎÂTÔ·3J4nÉYtÝ_ž$ÁEX;/å|Yü^½Íæå÷Ù²X¯³ržw@´ˆébO¼j‘ó$
+�ƒb‹RÁ¿`4À´E†˜Lo¢w[–-z‚;Šlž†a­¤8K¯V]Â§ýóŸõâñÜÅ¿<’v�©s.Ý*Y¥=Û‹_²]¾ÉÉ<^íoG@·èŒÓìá¸ÁÙšÉÖŸT?‹õKžÔn„<îXeÐY]ÈÒs¿i„†·J“ÉjTŽ.Ë‰Ç7lv i¥n£gç_üdc¨üïûìûä?•SÝoÚ0Ï_qUíuPF‹¨Vi«&µê^&!Ç¹�ÓÛ³Ï04õŸ>Ú%alyIâ»û}Ùž|°¥…¥SÏŽ$/ykÑÃ5¼ë�“Q?�><•ä¡ …@¬p¦€/¥p÷æÛg¡©@ÏW	Ô½sc·ŽV%C*{pã4Â­ú;:ö0Nã,;ü_å8À#fÂ3	
1 ƒ‰?,ÌliÑX…ÍÆ[t«JhÝè
š8¶‚Ð9H£ÙQØ8¿×vgp‰P¥@…ÆnEµG ]W	&£`
+�°&ÜÔsŸîç‹‡ÇE„ªÓàR0l„‡œüŽsØ—À11o‚“Òä¸Og”hQ¡·Bb3¿q’\}FçÉèÃ{ü—ÚÜhÏN�ŽR	ïañ“QÇ`üÊ=<m-Â¯`ÔïÃl-ÜX«HÖVD…Q]¬[GkÁâµ>NþmQ·†×âê†�)’P-#0,—²n	’Ó¦ ·
+œm’ÞÞc|.â§o0ö…ë†µÆ@4tØ‰#/Ý¦VÈ
/iï}+ïW©98Ý¡øK+“ÈÓêÓÿ¹"<W‘&3Fµ‘ÙüW”;ãÚ{/ÈIôvBÃ)ùÅ� Tº›<Ã=7•L™Â¯Äe7ûñ¨·ýœž†§�¸¼<™óp*Me¡O�å/Éo]�ÁJ$A†ïõÿqFDÙ«3º®¢(¨z\XÒÕi;XSU$)ÇA|wéqÜÃä–ð%ùù–¿ëXÑsL¤<3W‰þÏ7•
§ø5_„ãƒ€<�b$1ÄPIeÀãHz[þÞS–�Í�¶ìe©•—Ñ1‹süÑÌ¸H”_YÝ°$Í|ÞýôG=Ÿâ‰;2Ê¸áÆŠ¥ýÎëX¹ÔÄûàëËŠrÞc[ŸPPîKv•®yQÛe».
+CK	ñÐ‰N9CòPtE.%¢&&c¼	¯·{w·—WOWÓ©­
É±&C/öý‹{¬ÅGødÌJÓÈˆ¥ç��ã�iÅV)ò¾¿E1‘î¤SÒ
øÝ9÷†çMe|¨­K1´§€ÛÁ³ù	ºRÒŽ›JÙ›f¸6^l‡Ÿá3|…�AO1…ïþïÀ!‰R"®M )ˆ
+$Š*QnHÑÄ;›µêØÖxœUü÷ÊÛMi«úæ™oÞ{3‹©KhØzegu¥Ï‰3Îq6ž›ÙÄ`‚¯�Ëh�g¸ŒD¢ˆ-¾t$·ñé3×rÖSƒž½ŠéYÜ¦SŒì%0.=…o,š± 	¼\þ§
_LñÀkÊê(à†ùPX¦.qLž�ÁK–Í–B8bKpZQPh`cPqë¢Qò�íShÇh‹÷°¿‚VÚ;Ë!3\h£lI]S$Ï”;Çû~îîöêúþáºJõ×ÐŽ{Êh\þéÅ
öN;h½XŽE,ÃÆ†‡ëÌL -çD–�ï77ÆzÊwC’ïf“	–;Tƒ°©µœÄíH'UonÞ¢�âÿàŠøKeí�E[‚­[bµ²1d•bu4˜ôªÓ^§Ž‡,õ�ÔÍÞ]Tçû£f�Úì=kýåïÎÖ{Úòhüþ°Ýoa-^ÛýOêQ|Uª¡ÿ%ó*Ð‹ù•U]OÛ0}Ï¯¸H<´Uíu¥|U !14
´½LBŽsC¬¹¶ç�²jâ¿ON“4qœy©êœ{îñññÍé¹*äH9Ñ81V3jŸìF¡�|šÎ““Y3x,™�‚qf@mAð­$úVþúJ+ÐØã*ìRª�fÏ¥…	�Â¥Wœˆß¨­�S¢^dÍÿãÏRxÀŒËˆ€/èPÃ©i.T©P*Ž!ð
+õóŠ`�`ÖC�ˆ¨V³ÌY©M­íFj°%Bá8Ú
+õhÎ(
+ƒÀD!õŠX&E
+Š#1k†/UÝÝíòúþáÚSUnØ’Xx!rf¶½0‡fK°Þ1#�¦TæX»s’²B£ÅÐ¿y’8Ó®þ@m˜Íï<I('Æ@ƒ†	ÀÉlk¢áR)Îh%ûž¬Ðwòï•fkb}ÛyÒ¯©¹ØuÛ³Ü¨!¯ÏJlp»órPH# �è;þqLã
+…]JÎ‘F™ôeB†+'rŽùR®”ûi²Úp)—qF¡pb[÷ôD¥0V;j'¡ë•Íiklãdºõ®2+�Ûõ#q ·åtß&‡»šÖÉñÏ¡OéÑ™
á³h2€ë-
Àmh¼ßsŒ|œ3Áƒãa	Š»¦t;õó
ü©‹"iðo^ã™xFëÏ2ý<¸ˆ;·5Z§E×ô·8ëyÚ&Rct=ûÇ}=]•Ç1®ÝÑŒÅBì‰£ák4~¬ã�;7Âø†ñ2Öq˜…ñNáµªÚí¹kc=?%f:	ò3)ùÞ£::jÞà¿c™&zónîÿïõ_‹Â|Du§â½Ü7R§.Ù-¤pN_X€pœE±&µ¤ž˜îŒì¨/7�™U‹…î÷¦%Ù¸æ#³8~aÑ¿d=-­àƒE-9®ã°ñÏGŠX–qüÉl9éûÐ°M£ŠCªžÁ]¢öd^“ÿm�Ao1…ïû+Þ¡‡$jq%iZQ	PE8"EŽw6káŒÍÌlB…úß‘·Ù>Ù3Ïß{3ó›ÜfÔä£©Ið¶¶ÇLŠ+¼Ïªé¤Â_Û hB$EvbH
Z'÷éÛ'Ç¡!µË
+½ö.åG	ÛÖ0òc¼&ÜFÇßIL1wÂ´ØïËš®Ï±¢�SŽñ�:Ìu(,r›)åH§Â[’íÎ1Ÿh;V¤p\Ã'6	›Î’è1Ûû$°–Ðt1Â¿-ê<±7IvÎBâsäHN	û@‡þßÇû»åçÕ² úmXë§¨ƒ>{Q�C°V6¦©Oð©¦ãv¦»ivžN÷7«*�*Ú¼üiÄ¡]ÚÂ.Çþ¦ø³ü«€éd‚ÅÞ	JÞ§RÎöÎg4gÕs£ÛÄàÑtìË¨X¯}b5é¼�Žˆ×?ã£I9ge²‹ë—®þ‚ÉÓÿ-œ®zðhüvHùŠ²Nøú|ª~u�Oo1Åïû)Þ¡‡$*�¸Ò?„FETTQÄ	)r¼³ÙŽmfÆ‰*ÔïŽ¼$%ÁÛãßÌ{~WosŸÑ’Nh¤&ìmaO™×x=¾l¦“|íYÑq °";1¤½“ûôý“‹Ü‘ÚEƒ��§ü$¼ê
#?Æ;‰„ÛàâS\9‰4[îï-Ýœã‘–N�]Ä*$¸Ò}a–ûL):oIVkã["[EábŸ¢	/‹%Ñ�·÷I`=¡+!À¿­t`OQ	»$kgœâ9r §„
Óvèûx?¿ûüxWG
iXï[§hYÿhQ‹-[«‰i*â	>µ´KgÚD·&ÍÎÓa~—MSô¥ú�D9Åý>OQMÇŠùàTñÐçÝãúYXhMÑÀë†“âßò¯¦“	f'8šZ�U"oœÎ6't ,{t%ú? ÅÛèxêñ˜ñÎJ]g5¤W7G®Oê×–çÓ.VdGâ£ñ›ÿü«.dEâMìõž›ß]�ÁNA†ïóÿ‘x!IÔñhbÊl—i\fÆNWBŒïnÁÇ¶_Û?ßä&‡ŒŠ}CÊ½b*ÞÞmŸ¹à
+—ý±
x
RPKÃ�‚LjH5žé2½=R”š‹]8ØyÊ{•M0ô|·³†â«LH#O×§ú¢âë!V¼¦bB÷Ü²bRN�i™Snøœ±n¶ãÛF±Å
+>ESY·–´³Ý%…FÝ6
üÐŽnÄs,‰uÒ-™¤8Dn˜
+ãKxwØ{XÎO«Ewê`ÃvTPIùûÅvbÖ+©UÏð©â£�‘‹´å’Éó¹¿±s�µîf/üÙŠò–£áÛý¸_}’MoÛ0†ïþ<ô�iƒ]ë4KtX€mÖÝ²``dÚ&KE'†þ÷A¶“:¨o_>|LyúÑ—2R™AX+ù-{OàÃ0M&£Fð³Ôrmt�,àrø^"/Ý¯¯huNAîh²ç÷¬‹R` †ðÈ–àÉ ýC,¦È–æ›Ãû]F³1¼Ðƒh´ð™jb˜†ÃÁÜ—žœ7t|".*´ö,[[-1
+h3PÎ
+ëM-ŽCçöÉ1HI�×Æ€:ŠÆ´ÑŠl Ð6w\¡hgÇà
a ØjÚ5}_–‹ço/ÏÕlCJØa€L‡ve°ÓR‚Ä�W³"P.£n;“ÄbEÁ£¢óý¥IR‚…«­àÆPÚ¼.…ÅñcQ0(Ýq^[AÅxš$“ÑæB•7(t«+o¨"+á0ÕVÆ?èo­¹‰Ì¢•2ôNÎjGô`G¹ñ%þ%�È¹[­ãŒXõ¬·1{ÃoÕø«­ÖiÒê�Ñêíû0Ë=ÒIãð¶NgÝàøÜÄµßÎúðÕNºÒ&ýšlÛæÌ™¤f{êÝ'WÝ
+’^8†÷€Ì¸ï	uÌ+^'çäæV#O[¹¤µÕ+Ìá»Ð‚äpi}õ²�Ë¡–vï·´BG…×ä?…‘Mo1†ïû+æ�íµ|”¥*R[UMoi„Œw–Åk»ã1Uùï‘7�,%¾ÙóÎó¾3~ô¥‡µQŒ­ LZæ²ñ`ïÛƒ¬ßÉ ¿J
+P�A ^±€+àG©xæ~S–
+r•A­�:¿aZ–-Ý†Ol®�²È`¨Øâd±»_å8îÂ-.TR¾`D†aØ=L|éÑyƒ‡Âkäe¥¬=ÐFK’¤ lÚYaZDq¶Ù>;)Šhè— ImH£
dÇ•r¶Þ 
++ÂuÝ÷u6½ù~{“Põ6¤Tk §ðì…9¬IJ�´±à"kírÜn§ŸYUaðJãáþYÂL�•8Ô·"Z�¢€vÑ&I¿Ó�‰`å�ìQå
Vh%¼ô
ÉJ÷'þ‰ÄueœLµQ!@ãuêŒÁš¼ëƒ,ø—Ôž+ÅMÀÝ}â¦ªgZ)A¸à×jdû�dåHï] z¶¼Ûê}\Ò¯SÏçÚÙ µ´N¦ßwmo§s‘~ 7n–a´/ï�—(
lhµuÿãé4Œk²y«ýVŽòc¯ý�Î€VÊPÍY8gF‰l�pÃçßo�é|àÜ$—´ü·LÎrtdF+‰ÕX×™Í€w>÷g�,þ•·÷{y¹ƒ<fO¥R]k1|¿_1~°�Ó×Ømí—ÜPHÈS¡ìÉ{9QYÚ½¸¦ä¿—»ø;¦1ô^$íŽffG7úËˆG‰Û¢Éý©ëÈ‚�øÐfƒn†.J+(¬cXA¤¤¾—”nÃ�oämÁ¢Wì4Äu²O¥¢m:˜$Ï¸qäqRÁˆ’çq¾=_-øS÷œ“¨%�¯\qÂH¶…q,#‡èøxÃéiIÞŸ`+oµ†‚ü&xM6¯4$Ùxû´d•s0;£5ÚYÃ^Ö!-Imð=DÇ$ŒgË«æÞüv:»»ŸÕTMZ’bE‚…•W-^`eµ„Ö‰I¨’a˜°àM:ƒÌÓ’%’áÓü†YVÉ®úÈIlðÛu¼h"ëkåõÞ(Œ#<¬#ãO±Ê�5%µEåM=(FgM3S»s�Éþ¸¹W‰µJžW‡€aÓÉþEïlž(­kêùëö<í¦y	%ÿVöõàí/w´d´†éáM<h=Ÿ–:×˜méÎÛµÛÇìg¸ŽÌº]Œ£�[öI„“ömÑ×TñQÄ­æ_èçÝ
jerü8yî­Ë‚œð…ÚÛ7xGw¾µÿ×ÜüŽê>êËt_²¿m‘O�Ú0ÄïùsØDtQ¯ØÂnY‰VÕ{ªç…X5vôlCWß½r–â[^~ž™7|©«I-˜:Î³’>÷ï59ñ¹›%ý4AŠE¥J¥	Ê¡ìaKü¬Oí¯ïÂ¨’œ¿OÐ°Ï¶~gµ®<:²‹1Â“æ7±w64Z¿ïzìaN+á¼ß(càŽƒQ]ÕdkM×àñz#Œ¹bƒQ>¢¦€´Æ³ZoÙµÙ^,ÃW„2h
y
+i­$GP¦´¼^YÓC­I8ÂVÑ®¹7›>O~Ì'QªiÃWÂc'
+å^T`§|s6°$H[PÛN?1bC®’®ûË’$¸çñ2�-&¯ùÛx6ý:^Lòåë,k~—ÁÈ˜-ú{â|+8K©…sX²ÆßúiŠÑV0b*³Ž¾q\³Ú
+O¸¬³ä0
++­äY6Ï›¤ï´—#Ým…ã¹‹»}z$ãÓ’õÔ½	­ŠNÃµ²\`�akÇûÛÆÂÍ»N÷á˜úlÉä›ÅRý4=�)F¾b»s˜šmÌ´d=ù#©Ž-ò±‰“ýÛ\.ÿ€­UÅEU¢s~€fóÞ­7ëb8¢ÚÑeƒñ4Aahw+kvB÷í¢ûä��Ok1Åïû)Þ¡;¤	½Ön'li 	…„ž
+aV;»ÕJB3ªJ¾{‘³ÎÁ%ª›†÷çÇ[L6¡gã)óB4;£ú˜Xðï–«æì¸Á1î­Î3œ QVÄ_-åëøý†‚Xô´ÁN{Ócv£U,Ì›—žÂÎ*XS|Ñíÿ§=ŸŸàŽ;uð™g¬e¸H6qLž…—œÇ‰B8Ð–à´JA¡‡‰A³ëŠÆ,3Û§˜¡–1ïa^@«Ú;ÃA.1O¤.†$Ï$ŒŸŽ·;ß—ë«öö®­Q»5Ô’bK‚ÞÉs÷Ø:µÐº˜Ä’
ÃÄžçuÎš@K"Ã‡û­šÆxÁ¦¨�¹õ<qPð/åÐö²ýýw©tÞ%˜JŒ‘õ–&^,ß£…qÖÕ—YKxSÑÞž�¬�™¿‘/¼8ªhGËÕÎðÔ¼–ßNäüÿpµþ£Á’´7sC£5ß’¼äÿýÔüe�Íj[1…÷zŠ³èÂ7¤	ÙÖnšÄ¸$Ð–BºYw®%*�ÄÌ¨n(y÷rýqf5šùtttf_j¬è)d/4Q“ìÙ^*)>ãª›ºË3‡3üŠI1¤LHŠêÅPüŒ^ÊÓwÏi µ‡-;/õEÒ*&¡Ã­0á.{þMbŠ™¦›åá|ÑÓõ9iéÕ’gÜS#ÁLƒ›+•šé¼#Y­=ó	Û8ÙˆÂs�PØ$-›Ñ½·¯E`‘0´œŽFG:§@¬„ÄC‘µ·Tø5“WÂŸD›í½oóÅ�ÇÅ(µMÃ¢7l¼¢Oº{‹zl’EØ˜˜–&�JOût.û5iõ�Nó›:²WÅm³Xd‘iMló’3…Ñ
è¯÷Š÷›j[æ04ÞMC!¶I÷é­äKÈš0˜6o‘É‘ëÃø™�×+²ùNò@uG¬›nÛW÷êþ}�ÍjA„ïûuXküC®‘b;
+1$&`a4[«2Û3L÷FÁïVòê Cú4Ó|UÝ]‹ûÜe4ôÑÎÔJðöÓö™Š�x_Ï«ÛË
+—xé‚¢
‘ŠìŠ!µøÞ¹ò˜~|sZªÝT8°«”÷%l;ÃÌ×øT„XF'¿XL±pEø°™þ7
ï®ðÌ�SNð…:5r—™rä9¸dÙöNäŒ$ØˆÂIŸÄJØ–Š¾íö9XG´CŒð§EG:OQ"H›Jï,$¹BŽtJüÜt_Wë§çõhuHÃ:gØ9Eô8‹
vÁ:Ø˜˜¦¡xÂ§†oéÜVâzjvžçùÍ«ÊG§Šå M¤®#{Š�ŒÒ(&nêÿ­ ›<ÚAü¸2¶´UêsÊDê¬þ€óæ*ÅÈ£äh4V¡
E Üý‡Ÿ�ð±Þ�‡^ß�c»›BYîŸ\ÏÙ…Ÿ.ê“¢žž¯Õkõ��Ak1…ïúïPˆÒ„^k7Mb\hC!%§BkgwEµ#¡Å
%ÿ½È±[0ôRÝ4|oæã-ßç1£c©ðL­oßí)³âÞÌîâÔá_Ç èCdE¦bH=¾ŒTnÓ·Ï$¡gµs‡»Jù©„a4Ìü×E7‘äS,©_mÿóŽ/ÏpÏR$øÈ•–z\å1sÊ‘�Á.ÃD"Gl•`
IŸÄJØTKE÷nR��Œ¾ÆÿG´Ñ1xeéS™ÈB’3äÈ¤ŒÇÀÛ]îÓíj}w¿n«vmØH†-)º /·¸Ã6Øk�iªÅ3|êxßÎ…šX3y>îoáœ�¤ŠUšr[GžXüÓX:Å�<Ì9ÈuƒG_Å7ilw4ñlþÍI†=×^a«EðªÙ½¾Ø®m¯ý@±òì¤Ù�Ì»À³û×þ.’üß‰Ç—ðß+Ïî7e�Ín1„ïzŠ9ôà
Ò¹Ön’fá"Ú¢@zÈZ®W¨–HªnPäÝ‹õßÁæI¢>G³¸+CAG!y¡™šÄ`¯öVHñ7ÍÜ]_8\à×}L„¨(^¹ÇÏÁËS~ùî9ö¤vå°eÛ\Þ$®Ã,4ø"LxHž“˜bá…é~u¸_ut{‰gZyµè�TI°ÐCã¾…rIt
+>�¬GÏ|ÂVŽ6¡ðÜ!d6‰«jYtïíkØ@èkJG£�b VBä>Ëè-f¾DIä•ð'Òf;÷í©]þx^NRÛ4lð†�WtQw»¨Ã&Ú›Ó\%BîhŸÎµc?’è4¿¹s!yU´y,™‰m™h$¶6§Da2úkÄ�âüåŸ€RW)ô•wÝPEˆmÖ|:SÝOL%dUL›3jv„¦ú0ýêãíš¬Ý	¨æˆ5óíñÝ½»ÿ�’ÁjÛ@†ïzŠÿP°Ò„^k'Ml\hC!!§B¯FÒÒÕì²;ŠkJÞ½¬#¹àPÙÛßÌ|úµ‹O¡¨Ù8Š\&�ÖèOÝN¸À‡j^œŸ8Á}gë6!PTøß;Š7þÇ7ÛpÒ³{våÃ.Ú¶S”¦ÂuÆÒ‘üâ¨	ŠÂW›é~Vóå)îxCI-	¾ðÀ‹4®BØÇÇà’cÛ“È;ˆÕŒ‚¤†ñ¢Ñnõ1�nŸ}„vŒfpæ šig
KbXi|ìI­—SÇ”�–·û¾¯7«õíÝ:�Ú§¡)¶”PÛô¼‹kl­vÐœXòC4ãkÓ9/„zN�ç7/
+ã(%¬¼(YIkÇ=‹‚+K�0�SýOaØ8kÐb²3ZÖ[ê¹¬>"+I;rùDÖ!
+Þe¹÷—-ëµŽÖä.gYnVÍ÷
OÅÿæ?pLÖËÛV<>7¿¾å~Þøùý¾>�cÍ*cžy×qíåVáíª<@ùüóZuÖÕËÝþwÌxjšUüàøTü}‘Áj1†ïûÿ¡�Ý�&ô»ibãÒ@
+é±Pdí¬%ª‰ÑlSòîe×».1Iu’†o4Ÿ~Í¿$—P“
F¨Ì*Þê/Ý%ÊøŒOÕ¬¸8-pŠÎg4>|F2¢ˆ
¾;#·ñç½aßPÖó»Œi'~ã¥­p#LXÃ¿I4cn„éz=�Ïkº:Ã#­MVoß¨#Á<O…ëäÅè\�lZÃ|ÄvìµGa¸†�¬â×�FÉ£Û×(PGhº`¢=¼%ÎÏM”Ö¨�|†ÈdÂ“§íÐww»\=<®ú«†4ÔÅÖdÔ>ïgQ�­WíË±K°±¦1�‹‚MK9KÇùÍŠÂ“ó¿W�Zb=+q�1‘SýO©[oÑtl{ilHo:uQF,—Õ%^U–1ÚÃû+ú%¤�0˜¶ïÁå�í×‡þ…¯6¤KçC-Ä‹Ýƒi©<1CûIuÀ«Ù°})Þó½Ûg?Nì}_WÞÖ<êúŸÝ¤6~ò[n/Å_…TÛnÛ0}÷WpX‡ÚizÙë’v]³+ÐvÃZ`i(2U$�¢“Cÿ}�íÄ©Ó‹ž,^)÷¿ºÜAŠRÂØ3)É^9ôp
+Ÿ“^tÜ‰ w¹ò�)� <8A6ƒß¹ K{-ŒÊÐóQeìÀº©YÎË¾‘A¸ÐÂ< ±‡¾ ƒçÓõý(Å³.ÜâTxVÂÀO,� ï×†s—;´Nc;ði6Æ´b£8„‚0)Hk˜Ô´`K¾æöÃpŽ�ZƒÜ
ÑZI4A™ÌÒ\°²¦N£ð…Ë2ïêr0¼¹¨R
ÎÃRxH•¯ja
+KÅ9pPÌÛ‚$‚´)ÖêGFÌÑ;!±­_/Š
+�ðý×õPã
÷Ö÷›â•òµá’‘[ªn�2w+‡•Öƒ\˜Vž¬02tÒk°�m†<‘Zxß²{GÊpÖ‹¢ãNÎçNÆC5w)¿©ßW†»
Û³Ðœ˜z&!Jl¨]«5Vø/àÀ¿ ¬·´%Àh0ƒÓ‘ZFØ36-Ws4îEÏÓ”á�hg½
+eëXWLµ’M³“‰´Æ3’ã-™«*á+©¹…³&zx¶†„S8éµ�jî,qÀñqR…=U>Ž^šØ¸ômÔk•Ž“W1øÈqòV¥¯S>8xÆ¤
ò€«€tl ¨$ÛFzg!´JÒÔZý.ô«ýŒk{9àäÍ„KeÒ÷ûmF´"Ë(ÃÝ~ƒJÜzçl³�¯Ò/iŽZÇ­jÕnjmoÇËë¶ÓQf	…Ì¡Ù&¾JØÞÍpTñ‡ÒÊxF¢Í¶ZiÇ‡Ã9Ù%\î¾Ôá£D>â�¬pêÿD¼¿%>ºRÞ.Ì,Ãý'¿ßm~4UI²—ôž™jõZ3­ôÃiÕ|“òTKþý]�MkA†ïó+ÞC!vÈ½Æn>qi 
…„ž
+EžÕî�Õ#MœPòßË8vÖMâ‘ôð.¯ò˜Ñ±�Tx¦V‚·ßö–YñŸçw~ìpŒç1(úA‘©R�#•ûôë;IèYíÌaËÞ¥üVÂ0f~Ž›"ŒÛHò‡‹)–T„¯×ûþ¬ãË<ñšÔ	¾qå‚¥î×yÌœräCð–Ë0‘È[%XCAÒÁ'±ÖÕRÑ�Û×T`#£¯1ÂÿmtžEAúT&²�ä92)ã%ðf»÷p·z|ZµSÛ4l$Ã†]Ð�_Üal„µÄ4Õâ>u¼KçÜ	M¬™<æ·pÎGRÅêÕV‘'¿K§Ø3ûù_¹®cðè«ø¦‹�í‘&žÍ/ÐldØq­
+[-‚OÍëôr`»±�ðOŠ•gGÍëh¾Ø.¼»w÷e�OO#1ÅïùïÀ¡ƒXWZX–ª¤e…G$”f<�hS'²�-ñÝWÓBÅ§Äï—gçM~–¾ ¥�¼ÐHMb°W{/¤¸Äy3vgÇÇxî£¢‹‰Å‹!wxì½Üç—Ï±#µS‡5;Íå]â¢7ŒBƒ_Â„›äù/‰)&^˜®ç»ûiKW'x¢¹W‹žqG•Ý5®K_(—D‡à
Ébé™ØÊÑž[„Ì&q^-‹nw»Íë	]M	a¿è@§ˆ•¹Ë²ô3Ÿ $òJøiµ~÷û~:ûó4¬ÖiXï
+¯h£nfQ‹U´6$¦¹J „ÜÒ6�3Ç~IZ| ÃüÆÎ…äU1{³Y¢%±MsJ†U@oFÜ*¾+J�§ÐUÞtC!¶QsñÅoË%dUL«/úh/u4üáÇÕ‚lº1ÛQÍkÆëã§ûtÿ��MkA†ïû+ÞC!vHz�Ý|‡ÒRHé©´³ÚÝ¡³šAÒÖ	%ÿ½¬k'`è¥s›—GÒÃ»¼,}AÃ!‘òÌ\cðG.løˆóEuv\áßúhhcbDC!uä_{Ò»üã3IlÙü´Â–]åò¬±ë³0Çµ
+ã&‘üduÃ’TøªÞÿO¾8Á×dIð‰GV,m\•¾p.‰ÁÖn ‘v”è
+’!‹k¬GÏj;·Û¬ðžÑŽ)!¼ŠNtŠ�ÅQÚ¬yÌr‚’˜Œñ+òf;w·ZyXO«¶mxOŽ
šhoqƒMô>5fyÔÀ¹á];g•ÐÀV(ða‹ª
+‰Ì°~r‹YÖ‰OAcØ“ûüwe¬ShG	“4:öÛ¬³ù9&%évØô”}TÁ»IîýEÇ~í;ëï”FžµY�æ‹-ÿRýkû*…<Ö‰ÿïHx�»õRý�‘Kk[1…÷úgQˆò ÛÚMóÀ¥�´’vU(cÝ¹÷ŠÈ#1Å5%ÿ½È±S0tSí4|sôq4ÿ�ÇŒŽ}$åI1
Þ~Ú&sÁ{¼�ÎÜù±Ã1ÆPÐ‡È™Ô�z|IoÓ�Ï$¡çbg[ö&å�†a4LüW*ŒëHòÈjsRáËåþ~ÖñÅ	îyIÅ	>qeÅ¼ì—yÌœräCðšuX‘È[%XCAÒÁ'1
ËjIËÎícRØÈèkŒð¯¢�ŽÁ³F�>éŠ,$9AŽL…ñx½Ý»»½Y|¹_´¨m6’aM](/oq‡u°Ö+©ªgøÔñ®�s'´â’Éóa3ç|¤Rp÷b²ˆ¼b1ð/cé
+öÜ~þÛ@®Ë<ú*¾)c`{ØdžLß¡É°ãÚQ¶ª‚7Ííôb`»²�ôwŠ•'Gíã�¦³íÂ³ûWþ7�ÿ_5þMv­VMoã6½ëWLYH
+œ8¹Ú±›&›EHÜb“{(`ÐÔÈ"J‘*9JbtóßJ”-ÉŽã]Ô'k4��oFsùK‘� —Ì`dÉNsZhañ8žp�™°�
+‰ ,ÌèþÈ˜ù¢ÿºgJ¤hé,€Ê÷F+#–AÄcøÕ(„kÉÔßhÈÂ%3
+¯ÍóY‚Ó<à‚YLÁoX¢�KÛ®Š¬@]Hì;^£YæL©žo©9W`*®±(Ië±}Ö(CHK)�¯�:o)8*‹ TªMÎHh5€B"³OŸ«¸»/7·³‡[—ªbƒ2FðÌ,$ÂÖµ0�gA�cÌêÒp®ôìÅr´ãØço¥Eøôûý'ÍË�Ã­ÄÍócfô3[H¬ÓRq¸.—µÍ�œ/‘æŽTd{ï…�;—žUŠÅK.ç\"3s4F›~œ÷p™÷½/-Î…"4ŠÉÝŽ¶0BQ:.™µÐ�ÑPÿE¹�‚»µßîïf0�0#*ìh8,2fÎ„¾är˜ûÃ‹³ópTÑÃ“¸zb¦Í­»Š*³OŒŽ�{w_Ì#Á[\�²îµ„cÇœ»Íxôl÷)DGžçh·\Ü�Ü­‚Âç­\·/‡ ê¸Ÿg/
+.øðÑ~¥	R]ª$´v"ãñúñ5Xÿ5H¥Q`Q¦£‘;ëCuÌnÑ-=E;jøü¯ï²é+4|¾ä²¶ì'ô¸0ø“=‹È”Ø:å=Gñxst2«Þm85À¤ºŽ–f¢VÎÆët*5K¾ÝßE-ü=·ºäò¦mú÷œ©:vûê€3âDëyÇô3ª:¦Óéé­eKŒâœ\ª�*qj®MäOÃÑdç‡¾Ó,jÙªïíS¥Kä”9Ê{úò
¼VÖ|^�	SrŠÚ
_…¶uäFôé•-
Þhc�¯A>®
+ljõjiÔób[çkK¤­ˆ	eýøŽâôL-8­“öãºjªQ¤H<ó×«Ë1
+¹�ßéÅ.Fÿì€ìÚÞBÙ‹<¦üœ_ñŸRlsÙ3íFÙ�;¤ñqcÌ˜½.U";ZËm\!U�çýíõê‘-]õÙCT�áêK7€pQ'ãÓ©Dµ¤&“	\¼ÇÙ6ž®e7c½¨C	[c|‹¯~Ÿ¾Ýx[];‚'-’vï­Éw¡#ÒÏ´fMêŒ«Ê×�iÎ¤ƒZ
¬Ðí!|ÿþõz-ûóë—Ê£u?3UÃ™&`àWhÖh°†�y·�§d7_L¬­³z	Ù,Šm¦¼�#ëe×I:„yt÷Ø=ZÊSuÚBòÿ®9Íñ>ZÈ…µB-ÃÌÃ�&¬ékðµ•oOÛ0ÆßçS¨IÕ?ð¶¥”ut“Š¦½˜„\çÒXsìÈ¾Pª‰ï>9u²4Á&æw¶ïîyò»s{þ!Osˆ‘Kf0´d§{ÚæhagÑ8vèÂ]*,$B"93:�¯)3×úÇ-S"AKƒÊØ+�o�X§!�àÒ(„™dê'²pÎŒÂ‹UµÄ8íÁWÌ’`
+>c�Îmup‘§9ê\b;p†f�1¥Z±…äB�©¸VdÄª m¬÷öI !)¤^uÑRpTA¨D›Œ‘Ðª¹DfnÊ¼›ë«ùb9w¥J”2‚
³»ÓÂ6‚R GÌêÂp®côt†�bÚœqlóAa>~¹�KÌPÑ¸Ú/tŒ7Âúƒ¤PÜ¹›¡(—ÌZ¨
+ùtøäÅJ
+î`X‚ï·7‹%L “åv4æ)3¡‡�™f>x68íŒƒ2{ØíÂÅ3
[î#ÊÂF<0B8ÆÊnS¯vy_J›‚SØ(ReEÞ¦[ÇZêo`Ò(í®Ÿ¼€Ñ„Ü�®5ÖH—äùc²ØM²ZÃ±£�ÀoÿH‰Â£}½þ4e¶.îR›öÜ¢Ôè
(Ü´iÏ9æÎL¸ï–ïÓá…[�ZN,(M`‘@+¨(œØNïÙÌÒàW­“š3¹`DG{'Ñ¸ÞzØn¤Â¨ƒ¢MèžÖk}ÚÜjÑJkÙ€ý‚è3-zÃp\¥BÆ³­#PËú’‹�zc2óØ˜ÄÃ�÷ñv¶½ckWf±-Êd4*_Yo_¢?„Yx�ƒÖV"BYbŠ£NnÞsþ:óz¤ Ö
+µî´\þÅ4¼ýi–ô
ª×PýÌ=Ó�òøºÐ‚ß,ßŸJTkJa2™ÀéÿàÚè]Ñïþ^}q%þ¨¿íÑýÃ°{–GŽeåñ)ø
…�Áj1†ïûÿ¡àuHz­Ý4±qi 
�„œ
+EÖÎ®Dµ#¡™�mJÞ½ìzí€›Ò¹�øfþO3ÿœ\BE6˜L¥höVê.‘à>LgÅåY�3<:/¨} xA2YkÜ;“oã�ï†}M¢vÓ.ûÆ)J;ÅMfÂ"þEYs“™®×‡þ¢¢«s<ÐÚˆzÃøJeÌåðp�\¢˜�‚ÊMk˜OØŽ½ö(W°‘5ûu§1Ëèö%f¨#Ô]°GÑžÞÁsskÔG>G
+d„ðìi3Ì}»]®îVýªáêŒbc•—}UØxuÐþb»l	6V4^ç²`Ó’$céô~³¢°ÁˆàÞ¥U –XA[%®æðþ»€Ô­ƒ·¨;¶½.Ò'Êâ#—Ó�è…¸Ñ¾2i—ïzµ÷W
é�ŽÎO&tTNž÷Ã“él˜y)ÞLqFVÛƒ‰ôIëÃ?sœ‘¥ó¡*'´Õÿ¬nHOV¿¶Ëí±¿¢˜6o’åìëõãƒP&^ìîLK£Ù‘=:¾]�Oo1Åïþï€ÔÝª´âJÒRµ­"Ú#r¼³±…wl<ã†õ»£M“2§ùó›ñó›~Ê>£#m¡F´§?t›Ip�íÄ\�œãÙA"!²-ŠÔcém¹Oß,‡žD/
vì<åm	k¯h\‹Ï…	³hù'Lmaº]êËŽn.ðD++,ãŽ*LåÐ¸Í>SÊ‘NÁ•õ`™OØÊAG–;¸ÄZÂªj*²×ö%¨'ô5F¸£Ð‘ŽÁ!pŸÊ`5$¾@Žd…ðh³Ûûz?_<>-ÆS;7Ô[ÅÆ
+º ooQ‡MP“T‹#¸ÔÑÞ�+Ãv ÉÖÑ©c\´"øF¿j($‹H±‚~+q'8€‡þ¹®bpè+»Q3Ö¤Ë»åžiÚ�XúüÿÆ…´ÓæŸys�ñnüÂû›5éÜ‡ØÍ¶�v æ,û|ÖÁv²K_Í«ùU�]KBA†ï÷W¼—*¢t­•u°"»bÜ3§]Zw—�9~ý÷8¦�—óòÌ<¼3½Ï.£f¨pO´x«zÌ,·7ý‰xw^ÐøÀð‚LE‘,�ßñÈàDT)‹ÿtŠžíã¡DÆc øÅES*‘g›Ë<ªùnˆoHÔSÄ·\0•K0Ë.sÊ�;kØµøM«©ÈYø”
+Ô1š6Ø{Go9
+ÃÇ&•-©Oqˆ˜„±ó¼?í½.ªùÛjÞ�:SGŠ=	j/.®±÷ê ]yIm±›êKå±‰´eÉdKGe‘Ö§�LŒiå:ZWÁ¯Ÿ9r¡P¥¨|Ð‰16�ª´ÍI¸œsðA9Ö‚kßæÇüuTßOÛ0~Ï_q“:‘Teh¯[Ò6!Êã$dœKsšk{¾KMüï“Ó$uCç—Äö÷Ýw?}öÉ×JÔFÌYiy��|þ±˜g'Ó¦p_CE�¼
+®‚Ûš6ø!ƒ±pþ%ÐªÈuŸƒEøb”ý�AÎT°xùØï?”x1ƒ%>*R¾aƒÎ¸?¸ôµGç
F ([‚vV=6âw‚×.€ÔUcèA=¢
i´Œ@¶ra­„œ��7¨aCøÔò¾ß,®~.¯¢©60©•À“b(‰·ZXÂI
ƒg×� ]Ù‡|’YµFöJ#ÜÖ*Ü¸_mFæYÖpôËê¨ìY©æY¦�b†…[{Çn½ŽÞâ³ -n,‹2¦?þ›œL§p¹Qa`-1lHc”�÷>ÐF	ÂDïßÏ³ÝÐ¯ëyC¤xÚÁ}óhHï\xÐÎ²„FKÞâù¿p¶¢Ut ~go`½ÃcwÈ.ðH{ûÄâÃÖéÝÍþi�ËX‡;dg6‰°OSNÛK4¨Å˜p÷×"Š.ÿmVT@+§§i6úpßx;’Û™-æƒÁIì¨ã‹QBàü@G”6nØ­ó¡~q÷z¸ŠøŒºÌ‹SØ8*“È&¢Â
+å+…ÖÅ—ho+´BÙ6/ÚÍý>0/ºŽ‰«r•®!?×ñEE¶\([R©9ÿ�Dß0×d0NV^ &ºg¦5‰‹*Èß¥‰‰Ò¶¢°Î»™Ë�ºÞ‚÷ŸŽf‰±ãÅK	dWyQcÓqÅ7‡l“a›ãt7¨·*{m˜ï´fo�4ÃkZº“ét{1…KÏÊ¬�¹ñ> 3üp—5U¤ïPš`ï_<þý™÷ÑKQ‚k´ÒQFÌÐ‚wí'¨ãã84XRÉÓÑ3Ö½IËmÎ‡±JØ»¬(fÃ˜A›`«ÑU‡=LÛ±‹¤£ö“ñšýuRMoA½ï¯ð)€¨W ”–)j#‘CHh˜õ²ÓÌÎŒl/UùïÕ,ìM˜“?ží÷<y€µU„m2ZÖrÈŸ:£dÐM /¹aÈŒE0A‘€Ïà97;ì'P!f>Èls�¶îÀr_­r¯HÂ0Väpº©ý~Š“,q£XŒrðK$s˜†< #”KA{'d6¥xâÓÀGO 9BVZº™ÑÖhtŒ`\æ©Pb¼ëA°¨agp_Õ=-fóËylU	“\	ìCjø8SØÉA¢xö%iíÓZò qª@J#<çŠ~Umd”$%7¡Gcqy`ÁbõÍjñtÝD3ö%‰¶Šf¾ž‘f¾(”KgÞeføGÐ¥Ç¢¬½NþMÝ.LwŠ ™ùÆL ³S‚ÐÚ{z5n{Aê˜/7ÖhÈJ§ãÞ`½ÖÞ±P©¥]â›Y³úbž¡å�F¯ÉV[øUØ£V¸òÏ¸¹Ûò®@'ÐÂ³sF¼(Ú¢4Ÿ¼Vâ	Zòaü\wVýNf…éœÖT	V„N†ÃK¡�¦wä¯‰ÞbÒ5í[ñzî'ÿÓ€‡�~ ¼}ü[”úê3iw†PÛ‚¥$wkðý$^{ûNŸšõ³ww�zö[òÝTKo7¾ï¯˜*¼+H1z­¬­]ÕN\�½¸†AsgµlVäffVŠPø¿ä>´zH®å…äçñ}œ™«ßª¢‚u©c2ZžeW!ÏIfÑå8‚1|*CnJÃP)p9<fƒo"/®Ú‘Y±Nà†,Âï¥²Ÿ‘„áJ‘Åë—îþ&ÃtK|Q,FYx‡5\q'¸®Š
+]U¢Êf �2/µ8â6à�#�!¯ËtÝ¿.�FËÆæŽÖJŒ³¨JTŒ°1¸
vïï·–·ÞU&…Ø*†Ìp3Ø)@<xv5ií²òedÕ¹Rá¡PtïþŒÌ¢¨fŸ—Õ>2pEÆJ>ÒÛ¯+/n®÷v£J“ÝÐª^£•#mëõÎ”¸Ü±à:}Ôý_Hlœíö…³,¤Œ•EŒ4‹"]*fX¸uåi‰´1áßàr<†ë�"X„üÞ°xp^W‘Ù(Añ^7‹UýR½Gùü¬CÜZK<ô44MÚ�~�<«Ót …ùQÿì5ê’l,ÇpM(5Yøˆ_jdÁÌ³ðøÔª/Ï&—›-”ÍL¦9îX„‘n)é$É¯ ˆÔn˜hés˜ÃãÓl/­·0‹[øóqÒ’åWî•. n‘¯P<CÈñi FÔè3˜§>ÕÎù�F¿„vG’�¡*�âf·ægX‰Üø§wŽº
+	÷Ø#;”ô%Éì4àæ˜°áiš†=¢8ãÁSýø45üüuÈËÚœzœÉäLçdG¡_A+ñ?Ó·Œð˜d¿ü2¶Æ#óhê�m‘D•ÜµT_›Ã:ø¡Â49Ä?�<œ¦øÕ°pœœ”IAnèüÖÔ‰O·³+¾XV¨Mn0k†åÏ™CëB¼‹ÉiÎÓTñRÈØUœ$®0àlô;û‡ÕþúŸíõ´=¦)¡Êâ$ïÂYA+ñ°&»Bå¶mHëãLS¡Ý[”;R+OD|Ñšy4y+<á±˜áC®8 œ@³§{Ãnuk?ú?Ðä¨{«'ßc{«ï¨Ìïc`šáæÿÌB×Ÿ�¯®G_£ÿ}QËnÛ0¼ë+æ�ƒlØ1z­uë¦H€¢
� §M­"¢I�+¹Aá/(K¶¥$å�»3œŸ\á�‘ÔÂSØ+É[~q–Fód6N0Æc¡r¥	*À	Ï°9îUÓu‚±±îÅ«ç‚‘Ê>{Cø¢…ùMžÂZïºûuF«	h'+apKy,B7X»Â‘uš"Âd�Ö°W»Š­­à7ëÁ!¯´†<©G´V’L (“[_
+VÖLà4‰@¨íÞ÷»ÍÍ�‡›øTŒÁØ‹€L…£eØ+.À1|°•—i³.ò,1¢¤à„$ÜÂßÙ§¦‘y’H-BÀWÊE¥ycË2ºR¥ÓT’á€�VOÝøo³ñëZxü"”5Ýv<kÖÎ«Z0áªî­çIŸ|KÚ½Ç,Î»!­otcM®ž_ñe3n©®Úi%‘WFÆv±ÝJkûJrÚâDxŸœp—®/mžol5 Q[c<Wñ¿¦«¾–¯».”ãt9¨l€>ŠwÃˆî
+Š×ÃÛ5Ñ’S:úˆÚªìÂ´Ê‘ö^ž®
+ÚºÈNG—)ßM:]�TÚÏêŽ'®¼9'9$ÿ© ÷Ì}Hþm�Ok1Åïû)Þ!¯Ibz­Çí6¥�ÒRz
+˜Yíl$*KbF»&”|÷"ÿI]Ý4ïÍûéiq“lBÇÆ“ðD³8“×ù9±^¿«çÕlZaŠÖ)zçN‘H2b�{ëF¾ª°s41=‹{²SãƒÆGOáKV,H¯Úãýªãå¸%ÍŽ¾ðÀ‚…«dÇä¹A¡ƒ‰!‹k‡EÀÏQ�-£¼‡y¥·w†ƒ2\è£l(».�<“2FÇÛÝÞ×»æöÛÃm‰ÚË–2¶¤èœîYÜaë²E.å5b&vÇÊ³*Ð†5‘aÜ[’»ø¸û‘yUOªøÄ=
>7q³¡Ð51ôî	¿+˜M§X�$h¼{üžÊµ$-‰)3ÎŒwi^í•¡õÎ ‚)c¬×&Í2˜<9
:Ù¬ÀrÎJ‘Ëå_×ÿBŠéåm”%ýÉ¢.†½{R¿G£?‰Îƒ„ÿ)—KKzØ:÷!çõ‘öRý�VÁnÜ6½ïWÌ¡EÁZ'EÑC(’41�¢†S÷b®4’S•3Üµ€¢ß^EíjkºÛKÏ<>Î¼yäª(nØ´X¯àû¡³;„ÛÖÑÖ¸’±äù^WÔ÷Æ×pkB{ôÂw«UQ¼O��_Å
+`S–õ¸�ùó	T‘…z¸J{hÔ6`%FxVcc¢“WðÏù:±x>Cy*‡@m@æ
À[OC°^Në‡Ú2Ô1XßBcBM{ïÈÔ¬DßLHWEÑ¡2ÙOíA:Ë ‹@Q†(`|
ø`EƒwØ’_Æth!ÿë$ÜY–e¬]jàêÃ/×`œ5Œ
E_ƒõðÝÕ‡Ë?ßm>üþÛ»ó€±
+yýÐ;Å³žÅ8·e)&´(°µþü^'¤¿cpp»ü²^¯ï2�+
…2†Ñ6)CgÔ–%Øm¬Áƒ³UŽàì6˜0®¦.$ôóÜ±§‹Ïå}g
´Vº¸Õöh'Î‡@_°’3]wæñúê)Ð“�²][šŠ§ôðAÙZ9tÒ9[»C7×3ïRÎ`.Ûcê*Ë,Ê\Ù£ 
+ ¦žÍ`•‚U4ŒOUá

ãÔá¤>­8šZ‹Y5Écï¬¿ÏP­BMcö,×SGFA©90�)Å�ðÌÙ{t#ü+Ú€�¦±ØY‡-òóCQ7e)Ø¤íüÏ^y˜L]zQÑ© Óø©úR²t°Nø6D–²ÚòG^Œ»uèÅ�`u[QöŒ 1°ïÐÏœkxöÓ‹²¶­h¬o1¤©þ¶@ðòçœêÈ·
+—oÏ²¥
+í­t©pŸ_<|†!`cÎ€q0Á¨à·#$[;©TC¡ÂÒTRFÏ¶õXo~ÕõGc4$}&Ÿ©¨ˆ1Ìóg#Ì‹ë/L~’‡VöÞÓÞü@-„cÛ"ËÉ>Š:Ä � ß¢CAˆ>ò¡'«¢ØÓ³)\äØëiñ´…Ðê!ÏÞ”Ê(³…¼¼È?žÉuŠÉfšv†DÂúTç¹^zFÅeäQ›ÖSÀã‰CÊÙÙë3 ïF�Žao�ƒ-B"¦]3Y|¦s“¾@rN%£Û;½d¶äuÊ»Çä›&J7ŸäM@M5�o¨È7¶�aêªvgžw£Cª¹›E^”½ÌNùTrQ°‰œvvîNOs;sxŸîÃùZ˜1æv¼§Š! _¸RJ>!çfûø¨`j³!ÐTXÒ¡
õžg0U æ´ƒæ‘ûõÓÆ”`¦sÒAðE[Q?y²ÒIÍžc¥Š¢«µËSckëm«³©›Jx�_ôùÝ0…è\,jÁJzÊØ¯t„Ü½ðœ;¦&âÓ¶º•Z†’šÆY�wß˜„ƒô´¶‹Ö�Á¼°Ñ,P�{h¾h·ZÍösJ%µö�0*@dG•q³Fl`ÉSS‘÷X‰†©
ˆNÎññU?µ
xZ€±Üè- t§»t~áTäY‚±þ‰ù^^]ÿsÔ"˜þ,GËÅ‹*W_ùMo�Yj“™¦c|åU3MÂô®Ñ²¬þmRÉnÛ0½ë+‚–/èµ^êÖu‘]Œ¦GM�-"I�#»A‘/(ïQyãÌ¼mÈñGW:$µð”öJrÎ/ŽÂä}6J†Ý]ü.UÀFi‚
+pÂ3ìËRíh� ™˜[÷âÕ¶d¤2Ã'oŸµ0Ïä9`,¼¡Ùút4íá‰Ö"°T“Ç8œ
+3W:²NS„0¤5ìÕºfëÃQð«õà’°©µ†<«Çi­$™@Pfc}%XYÓƒÓ$a§hßà¾=Î?ž‘ª	Æ¥`ìE@¡ÂA‹
+ì—à>ØÚK‚´Å)ò01¢¢à„$,KáíªÙÈ(Iê}•ö|KœÇd8Œnû�}îÉi!#TjH»¹­ª˜FUNS�˜kµ:•ÿ&0ìv1Û	�…Ù)oMœ‹ÖbÏyµL¸§Ko”ÜÂ"ãÏš]ÝFÙ¦|¸z­•¼˜ÎcšÀ¾–œ^K_kõ®Ù�tÙÑw<÷q±ýé“7fßŒ8¥ÉÅa¼¾þß'ý!Y3¥Ùì¬*ÚêŽþtïÓwáŸ»7éy*ž«ºmÄÓyçâ£wz­N;^º%nþÈñ—‚Ë4kC[_&Íó/�¿òt†%i7¨ŠNvƒË0ÀÝÊ¬ÌÝ¹œ�VóšüE�AO[A„ïû+æ�8'PÚ(¨‘ª*ô†T9»~¬Å¾õjíG@ÿ½´)G�Æ³üÒrCâX¨ó‰y—è¿ý­±]_�.ÂåYÀ²)14ê°ÍòÂÇJÛ[—§ì8‰§øÚ+ã[¡úÌÝ
Kê•owÇù"ñÍ9îyGæBßyâŽ¥…Û–k+<A5!jõ.»ÉµÛ¿À;íðÌ¦Rÿ§Ïî"‘«1¤ÚGrÑzŽV˜Œñ"¼?ìýØ¬Ö?ï×ó©˜grìÉ�ÄþfqÂ^<ÃgxÓ©GFÔtD¾•F¶F‘±ÍÔ7úxhdB,d†M5§RV:ŽTÓJë Oë×Èm~üê\“áñS’±¹ºáSü M»"qîÁ¿ªM­iwNÛ®®Q®qµïá•‘OoÚ@Åïþs¨dˆL¢^¡iQÚ¢Vm¤T½
ë±½Ê²»�‡ (ß½²§@Õ?sóø·óÞ¼½‰U„œŒC¦ž([£wºŽ$¯ûÃäì$�øVY�Â:+‘B×•} ÓZbâšmY)ôLÞ²'xçÐß«ÀÙÓåb÷}šÓ8ƒZ ¨E©&†‘ì—±Š¢£ô9˜à•í¢ÖÀ²|´"(jçÀtê
í¬!/Ö�—¨6ø¢#‚K«öÝçéäêËÍU3ª]L+TX¡@ne£E9¬¬V Íòj6&ä»•Ï�K’ˆ†àºBž†Y›È0Iji|yÓ(ƒõwÈŒëaÛþ•œMœ�} OŒn¼Ò£“Ä8�©E·k=*ù\`Ÿ†§ ÖgÍ‹"Ó�Ú2Éwtõæ¤¾„W!6?ûç°Ám_6Å¤5¿ØìmÁnSE.IÓRåZtPÆrpOkIç(×Ô¶Sž“�
J¦‰­sR’~òaå¿¶#¥×?‡VäXþ¶k4µS†ƒºCªi¶Ï6Ç?"7¬9dKè~;·<d•–10òÁð‹1è„éý„þB�

ÐŠ:¨½ØÒSžvtÏÿ!áIð…³F­/ÿ7çÛ.�6Ùnáyö'ls›ù±Éçä'ÍX[oÛ6~÷¯8ŒZJ�¦í£§I]·
�¥Fã’À ¥c™(Ej$•ÔXóßÊ².åxi¦'Y<÷ïÜèãwÉ*�F$zJKè¹^'¨Foüaçè 0[QKÊ¨‚„H
b	Ó½ÇWÈ(Æ"YK­4x�g’#¼g„C©Éñt±ýý*Ä“>\á‚(M	‡Ï˜¢„cµýpš¬	CC„‡®%]¤ZH•+ü($èÂ2e‚B»¡f4@®(_
+MïCÂ�(„{ŠßÅùxry51¢2ÇôŠhx 
+Bª6º0„ªW �óJ¤2@D¸uù¨ÃIŒ*!ÂtEä¹¸Í"2ìtRe(¹Ò0ý:ù4¿š^œÏæ—_æ“ß§³¿†Ùñ2å�1‘rm}‹s¥¥L< ´Î‰Ñ\%ŒæL¹ê�”áÕZiŒo?P‰�r]#Èl»3z;qLxø%1òÔä{€Ù[�ú”Š
+~{Æ×ùëØø#	åÚI8ùN½é3©¦D*�NÀˆRpÎ•&ŒåÎŒ_ÒþéÀé=‘`¼ÍÝ4x™³DÒ{¢º£ùÑ°SçÊ"õgÌr™6cR;¶™'üžJÁcäºÁ‰å™Í6#2B] w!¢…lHÐN²\X’.
ÊL™Ï³”i ½ŒÀ<Õ�tÅæ¥_œZ®[¾–tU/«n•-µx�±ù9|æéš¢;<)A‚ê3*LÚu‹«6ncÅKU
6‹ËíŽájƒÊ0?èoäÀ©^Iñ  ¥6›dÆûøÈ™jÏ@ñ£tº/÷‹nªëÂØÚó«à˜G¢N%wïð$B½á{Où*=¿ŒZîxS€;Z™¬†ñ¿4†©ÄÐtžV2WŸi%¾æ*M!5†�þe3¼y$¾âß)*½1çæî)LkäÊ@J¤$-p–u”…ôLF©Ájlf�çÃh4‚×»ŽPgŠ>J×»Ä^øVÙÇŒn
Pš¶Ÿ¡¸ú,gb«Ó8º‚UŒ­kªºº"jóîõ4Æ‰�D®{»5.…ð,0P]sE#^	ðsôfòI&ð0Í%ööÈá]ÉùŸR'ŸÕÜiE²™DÝÄÐÂnî†%¸K!‘«"¿ê½µ„Ûó�(è5oìDë2SíÆ´‘Mš…ò"?ö|x×$ˆPWÀSÆ*––>ÜÜÁ8>Ô£åÕ(¡ììêó¹¦KŠÒ³]è7Ù†5z€çb,ôåä3‘÷œ}´nc×*7&ßÐ,çž?~4­¤jsXcß]ÑY4Qþt×]%RïV­’­
+¦FŠïDFYÍ–�=ºp½¼ÀëRÁë!t)—ÒÌï—/%DrYO*óºÔ·ÊÃÌ‰kÉª®%ó
+Y�™¿%þ-§þ¬u²‹y2³êÛ‰x³·OoL8òÅ–RÄÀ‡Ï³Ùô
+®¿^ôš%°}vê*y5•B‹@0§¨JYlŸÇfÙÑ¢kl?mÚŽÉ¨z°šâº÷v^çÌîë•;\ŠNœ³z~µÑ\iIydÕ¾ÃÑG@¦Ð�láÊ”˜kþ¨r9õzG7§ƒÑÝQ¯_’õámßu%vE¢Æ2„gŒåÕnÈ^ÝŽ›×w¾�ã�§nvÛ¶è7ûÏÛ¶ÔubâsZ®¨žïž$æÕ6ìÍ�+…Ú¢»3!\sïÉ}ü©ÁXBâ˜6
CŸGcÆ÷³ì§ÆU£ß7n;ÏÛõ¢Œß^0me¥ÏÓbþëêm†yË]íç–Ëö™XÙ‡ê"Þ`óoNYÂõ[IuÚ8Ö¦K£ç·]9k½´�Û™Ù•È±bY­W\‡ŽŒ~WÖÕ»Õ“fþz¬»ä“ˆ5ÚIuÉqµ¡=7Þáá§*7CÏ‡/ÊO'Œ¢;”1åvåNË(ÝO°k|în?
g¶ˆ?vþ�VMoÛ0½ûWp@�ÙEºn×¦ÉÚe-V (Š¥v(P¨2“%M’“Cÿû Kv³ùKä#Éøü£Ê¤H9Ñ«µOv¯Ð,>$óèô8‚cxÈ™�Œqf@mAfpŸ³-¾‹ ²XIµ×l“[ˆi—Z |âDüDm
œ-ðâ¹}—ârk|&Æ2"à–¨áÜ´*W(GgD¤@¥°š=—VjÓ¼–lŽ�•œí¢;kÎ(
+ƒÀD&uA,“bŠ#1[†»Êïöfuu·¾rP1›;b e¦Ž…)ì˜ÍÁ:òF–š"P™¶”O#A
+4ŠP„ûœèùXUdE¥éŽ®ÇõÞX,?3�ÔJ½Ÿ¿bà~:ÌyQNŒ�a,á|%‹Âñb…âX °Vœ=¶Ç"€Óãc¸Ø8­¤ÈØÆeëŒ”f[bŽhu<�&]×¨·ŒâÈ‰y×¡óWüU¢±˜:b_ÑH¾Eý”ØŒ�*©ÖÈ«r�|MsÑø©ò™3
+Y)¨Sžž¨Æê’Ú¸2pÏdQš*ÌB«6é€pow�ªÇmèã³êhTI£¢{Ž\Ã�,ëäÚCXô¢†~–Î0*p&X#ûræm¢}"½îàeZü�´´'g°•,õ½AÛÍƒƒ¬CmÐÖÚÄIõòàÆI£y�"Sùº«§‘ñ<Y1•¥°q…‘Àb±€÷C	Ücs-w p×¶EµH®	ã˜^ý¦¨ÜküöN‚«ž+¡©ûÛ¤¯áK6“	Í¡Ž
+ÄÀ‘&&àËëñ‰}ÏÙ¨¤^C‘´´HÝjëtšÄ÷Þ ŒÖ+7Š;[×�ßöNMJ×Íö ›±
Ò?JÑX&ªâ{jîÏã6HuñMó¦Ô)0Nf#;<X'Ë¶£Ûh ƒdgðfª5Sy'íeš>ÈêßâGÁã$™ÿC£ÂÙô.ë®Ñ–Zø[$À¯i‡>ã�úÉ¬K¥¤¶˜6ö¾ÚJæOõp»tÒP¼)¯©¦Glæº¾ü´?4C5ý‚´»«ýû3ç¡ToR–euœÌBã:—Ñqˆq+éOL¿£6®[C˜¡R'ËLjŠ—Ô-˜oÂ°�èVXçöK g0îsFlê%ï¦aÿ=ÝƒvNÎ ý>èíViÈ7'æVÒ:v.µVŒÉ5>“Û³u¤t²t_nqG¬+ËKô•“AOã0…ïùOˆCRØ½RèÂV¬	±HåX	¹Î„X8¶eOZ*Ôÿ¾rHÛ¤íJln¿™÷ÍŒsõÃ•9I-<¥�½’üÂ+Gáú{6J.	x.U@¡4A8á¶ÀS©tž QL¬[yõZ2R™áÖÂO-Ìy¸ÞÐÍ|s>Ïi<Ä”æ"°¿©&�«°	Ü¸Ò‘uš¢Âä�Ö°Wóš­­á/ëÁ%¡¨µ†ÜºGµV’L (SX_	VÖá4‰@X(Z6y÷“»Çé],Õ4Æ¥`,E@®Â§åX*.Á±ù`k/	Òæ›–/#*
+NHÂS)ü½�5%I"—‘ÑÒÖ†GýX°žGI"µ*ðÄVUDW•ÓT‘á€‰V³Mø#€‹Á7á1m`BLŒñÎyµL8
»»Qòõ4m¥Ð­`?/’ü©ÙÕ‡i¶	·	®žk%w]¾¼HkûZrÚõî2{T=Œa×¸uÊÚQÄï4.ælÜ)\ï
`OÛ-µý®÷ÄŸŽmìz×k<®�wLï$k¦4»ÄÂª¼ÛXÝj%Â§õ!ÐÙø•¸U¤Y;Óø©ióŠÒ^•c|ëä€ýl¼ôŠé™Þ9=™™fD¶@S¢ey3viÀ+[{„U`ª.gæ$+ì¼2[È>ÎN¿NŽÏò<®þ\Yx
+V/(ÿ´£X£?Ú¬¿Ãö-o—Ø«%¼+œ¶D‡{�rº½î,­°ž„,±½„m�GQÑ×÷6ÀÇ.mÝï~Ý6²NþUPMO[A¼ï¯˜[„@½6�mQ¿�àÖT•³Ï/»ê²»²ýQÅ¯ö5‰„Oöxìñxñ¡†ŠŽ}"á©šDo¿mWY/ÞÍæîüÄá�!*ú˜QQI¥Ç}ˆÏ|æ02–¥î$n‚aêg¸–Ì¸I”ÿ°˜bA’ùj}¨Ï:¾<Å¯I-RÆgX°ÐpUCåR7"(wð%›Äõ`Et/ø±,0ú!%ø£zc§è9+#æ¾ÈY,ù51)ã9òvœûz·¼ýþpÛV�Æ,�aKŠ.ê-î°�`Í¼–A<Ã—î`ùÜezb­ä÷�ä®¬Æ�Ì�ô-´Z¦¸úÄ™…Ò²dã›;ç©â[Üïað‹qîoÙøë J1öí°~È¾ùÂ†íK.Ûü£¶R§³÷ Úí'ZÛ ?�@‹‰Ù \\b¢“cï×|L_Ý«û�T]oÛ0|÷¯à€¶ƒ¤Å^—&m—uX�}aéžÖ¢Pd:¦H‚H'†þ÷A¶»v6L/‰¨»ã‘¢|qé
+J-<&Ä^I~ä_iö:�Fç£FpW(‚\iEà„g°9|-ÔÏ"¨ë~yµ.™Âµ7oµ0?Ñ3Á…ð¯VûýY†ó1,q%ˆ•0ðKôpAûÀ•+Z§1A˜¤5ìÕªdë©IøÞzà!/µyÈÐZI4„ LnýF°²fN£ „­Â]Åûx»¸ù¼¼	RUa\†� ÈÕ¹0ƒ�â8O¶ôAÚl_òydÄÉ	‰ðµþÖÞW™FQIÁ—‘!3�óÊp>­¢]àýB«û…5d5Þ‰•L©|Rk/v³	õ¨�Ó¸AÃ5¥ÿŽÎG#¸Ú
+ß#-¬ÉÕ:¸ çÕV0Â‰¬ÂÓè%5¨~)Ù•< Ø*Ü'Ô¹”5Kô[%q@Ûô­@õ#¸R†Ñ¡Ã<‰MÕ™½Ú‰k7
¾Ñ/WZÉ¶·��Òb_JNj ÀÐÜÀÍ¸‡í5­éR‹êô§iHu”6WÖI˜’É¼>…vÍÚö }S:l[�T;{©¿¿Ó°}ŽŽö	ŸP–ŒIú¶Veß*‡ä…ödN…Ý-YpIIÚ-±²qpH!õñJ&ó5òwB¸	JÒéK¿/Áàº!ù×â1Äï�¤W.ÈÄi3Hû•[�B�t�	êøìWp(ú€˜Ì¥0Í +>8¦ÊÌ þl„sZaOàg@MØO¡Ì�÷Öÿ—þB˜û˜¡fã_SüE(|+•)ñ-„ê{˜ÌE–}³»äÇ¿¬��vŠ\#wn+I„‡Þ<÷†¢ó†&ó�WŒwøÄÉÁ%-Ù+³NÒþxäÒ›V¼>if?û×¼úÒ\kÝÒc^nMn“æsžÄ§„N	
+±EX!È¬Á³xÜfîü…W³¼†Kˆ)†7Çiº¸ÏÑm�Ok1Åïû)ÞÁ�µIbz­×í’Ò@ÿÜcÀÌjg-QYšY›PòÝ‹ÖvhuÍ¼ù==-?$›Ð±ñ”¹ÍÎèVŸËÝ»é¢šÏ*ÌðÓ:Aï<Ã	eEìñhÝ�o+ŒŠ&¦çìvVQ›)>æÀøä)üâ¬‚%åÀëör¿íxu�
·$ê(àœ±”Kc�lâ˜<!(t01hví 1ËÙðsÌPËèïa^Ý‹Ú;ÃA.ô1ïI]×HžIÇÇqïëCsÿ}s_Pc0µ¤8’ sròâG§ZÂK²a˜Ø]"Ï«@{–D†ñh)?Ä§ñGUe<‰à›ÛeRnâ~O¡kbèÝ¿+˜ÏfX(£ñîéG*/”B,³”Ý�”11Þ�G‹ê4Zïú!˜ÒÆvkbÍƒÑú-hOÅôìVÎ¤¤¸YýeâîU·U/ÿ7�%¤ž¾G£CÍ¬CÿÂoV–äT×W2n_M/6/ÕE�ÍNA„ïûuB žAE	F£$x$1ÃL/Óqvf2ÝËOŒïnEŽ]©êê¯§÷Ùg8²Áê‰¶ú¡§Lr{ÓŸTãA…Þ=jdS©ÆÊóžFÎŽyÊ§Â;¯èÙ>J$<?©¨`jJ¤Ùö2�Ý
±¦­eñL-Lå"Ì²Ï”r ÎlŠZxÛj*òWø”
+Ôê6ØÿöÎØRÇ:•Æ(§8Dd„°g:œs/Ëùâu½èV�ÁÔÅÁËo9X=´ƒ—ÔK°É]�ÇU4
I6–°ò¦,Óæü‘IUÙ`DðÖª3JnžbÍ»ÅÑRîN•¢l®79PCQWñ«ú®~•QÁn1¼û+æ€´IµâÚ$¥°*P�h¥".M…¼Þ·YÇ6ÏÏM¢ªÿŽv³‰zß<3ïÍŒ={ÛˆšŒÓL£$l�ü”m¤4;žª³…|omBcÁ&DÍ‚Ðà¶µOtªÐ+Ê·l—­`dÆxÏžðÁiÿ‹Xfš=]VûûiMÜQ¥“Xíñ™21fi\Æ6RˆŽ:!´¯a‚¶U–Ài0üÒšìÌÁ½S;kÈ'‚õMà•üÑ‘N„'Kë~îëuyõíîª[Õ“VÖ:¡¶içE5ÖVZHW>…Ì†`B½¯|¦¼^QŠÚn[Í×aÑ¿ÈT©œŽ¡EéìâybíÊà…62UÊ8�n²ÔZ¨pÐFÈ×	Çr<+ˆ¹rÖ ÉÞt­Àô;[¦ôC»¼û<¿Ä›;r|Ž*7Lv‡I2û=�ù|Ž"d‰YŠi/zQ;B¦ë0Z’|ñaíoúÑ4ŸC3ëíëí÷ ;Åc
+¾0¿@ñXLŽÉÍÊu\Onþ&‡d=Š÷ðQËàg�X¿üßÀ÷Câ>ÒÊ¯�_Ô�’Ok1ÅïúSd×$1½ÖŽëÖ84¥$çÐCÀÈÚY¯ZYš‘7¦ä»íw1%…è¤�½ß{ÃN?ûÊC�ÊÈ€qÐŠ×|ðH×ó‰�Œà±Ò¥6šÀËÀàJx¨ô¯4çAo+†Låð%X„¯FÚß˜`*ƒÅù¦ÿ¾*pv+ÜHb--|Ãˆ¦Ôæ¾òè¼Á4Ò œå 7‘] xãp…PFc@éiÚh…–´-]ØIÖÎ^€7(	a¯±nÞý¸],ïVË$ÕãJ2Ô’ ÐÔ²°€ZsœÂ“‹A!(Wô‘ÇÂÊ’—
+á¡’áÖ=5™éXºÑWbÜ5×ôd"„2’î#’±X8[ê-üãÑæ{`aôÓ½Oæ)ÁRÏ½—ŒpæÚúD´å¸1ZA­JeX¯•³Ä!*Î†*ý³¼C¥s–Ò]Îº\´Sûåß’{|t)P–‚�sf �c°'Ê—³JRk$;w‘}äóüMF;Ô/-qúû€¥KÈ>t¤¡©aÄt¸
+®‹õÉÒ—Ï
+;Sw®C¶ÿC"<º8„LŠG‹§‰·È§‰ßŽ\KËô�œ}×V‘³ÿÙiø¹3ïÒÞ™¿ò/â­X[O9~Ï¯8Qe‚hßV�IKSº¥¢€HØ²™™“Œ·Ž=k{hË_Ùsó\QµyÊØçú�›íÃ÷qCˆ#=¥%
ô\?Å¨üwýƒÎþnvaQÊ¨‚˜H
b]ã^,ÅDÄO’.#
^Ð‡#É>2Â Ô
+‰äøá>ÿÞq<€)Þ¥)áð”p¨ò…q£ˆB <„@p-é}¢…T™ÂÏB‚Ž	cÚ
5£r…@ùBÈÑTðÄ‰BXS|°|§'“ã³é±eÓÑð@„T¥º0„ª#ÐÆy% "Ì]Þïp²B“á""òDÜZD:�DJ®4|�žŸÍ/.�g³¿æ—'g³»¹Hx`Ì‚@$\×ÖŒ9ó8Ñsã5r­jû+ÁçÈ�)µKÊõ"]ýtþí“’æ
+\#o'ŒÞNW‚áŒÜ3cuÀˆRpžè�h'bµ2`ÒUÌÐQ�ò¤ËÿvöwwáÃšÈ4®Wl"ø‚.
8f;–tM4ÂN\Ù>èT™�ÜóDÇ‰n0
+»\g¸ÄTCãÒ%*ÁÖ(§(×4ÀÝ%MS�ÍŠ)2´�
^•mÔùJ�ZÝ•íŒ9Nî
Ê`Íç6Edh¯&¯&`°ÙáŠ‡ƒ†O…ƒz”ja¸�È�ïg�6¿SÃ±«
ü:Â5ò\{¶ê» 6$WÌó›yScHmÌ
Cž/MB_¿"CüÜ(|Ä ÑèõG°4tÉðs=yˆ2…Ð+ÈC–DG–À*÷úM?Ëó£ðZ
ŽYãL|¦½¾GÅƒ¤:§É£è7?‰:‘¼Dé¹ÓŽl.µ#Ê…*Ëø«
+DJòTBÝ�é¬|éØ½ÁÕÂµúªozšÚ_ÝPfzK�­.¾¦ózÅ¶Sy½bÛilcž0úóflK¾-áµ#ÆQ¾ïÃÛüëM_J¢Õ¸€œL…+Xˆ„‡½ÒÆð�ã¸sÅ»é�‘öÐû¥2~LlÛ#”k³zÂ•&Œah>ŽÖ„2ÃÖ»ssv!$’ ‚Ò 
+v�kùÔ¬Ã?“0¼ÞMeÓX¶›ž™Þ½»Á‹ûAiæ*Z˜¿�ˆ”nUhî6¦K6Í«}¤ûÙÞ„ep.¾]* l·Ü{\±Ñ-¿åoT·jQ=í¸©©Í¢jo‚
yYïi#H3³Ú'S[}¸¹k
lÛŽ—¨ÍÄS^ßÜ¤a=Þ&Å³;Ã1UE65+8…€kÊ<¨ì<w3�QW’y}øù®$�¨ýÎv—¨Mn{ýV]m�ô;‘Ü`Û 6¿Öx»¿žÁºoTŠ´ƒ5%puy
+CçBCaðÃ kj%¬Ó²S½f~¦Öüi%l®ÖÇ
+l‹ð#UenÚÓÃLd‡Ï´‘Ê¡§‰Š!1;GŒÕIK5$Y'*‘÷’ŸŠÀÞ96PQeîK5 ûu<ÓÔN±r
ñúFÂ‰F9‹w¼/
+  ýõB(ÊöæÎnCHÚB³ÜH£¦ûnS­r´`ìö¢Qeç­)oBàjØ ±lÓ©Ävä›¢ª=}ã	 GôµI_+‡J)ÀŽt?û#˜&q,¤Æ0£w[¯ÄX(ª…|*ËÍ=°ÅçÕÄ¸2¬X•ž±K‰ŒL§úøT-Ø†¸ŽCùu ÿW;7W¤¤ñ
‘kº (ëQ,m,×e¼ZÒZ&¸íl@·8™e8wyï¦—3¤µ‘Ý
šÏ[YTžO·0h'«ìüæ¼xn„b53AÂëo§^ïðýãŠåÓÅï¾Û{Ûë	åK¿{5û<ü½ïÇ‡Åì\1®ün¤u¬Fûû&	÷¨ØÏ÷»°?î¹i²#…°3Âê
3‹ŽÓ×ˆ_=rb!3°-4“x6õz/ÙfÎ¦f­WoÑ¥n«Î*^Pd¡�àš°[ÏÆ“ðúHg�M^Ê7È¹ê�¹šÐBèá˜Ä1òpQzVbûq2õ5}
+;woÌ¾Íòz€c‰
+å¿GTãÔ>où° LaK	[s)5)ñJRºÓ,ýòKeóf¢Ò”Û9Zö­úu-å6¹8­ü¶à?Qi»Ì“iáÈU"ñø‘*­\®ÆË›W•ãÌ£âî¿Ý[Þ-\îüU�]KBA†ï÷W¼—)¢t­•u°"»bÝ3Ç]Zw—™9~ý÷8¦�—óòÌ<¼3y(¾ &-Ó�(§Ÿz,$w·½±õ
úøðAÐ„H‚bY‘,|ØÑÐàDT¹9l¼âÆõðÈ‰ðmú"VÁÄr¢éú2kº`Ik+lÂ+µÄ˜È%˜_(—H›j¸œ”ÃºÕÌr>g†zBÓÆ÷oïè%!„ÔdÞZ
9
P"Y!ìíO{oójö¾œu§NÅÔ[ÅÞ
+ê .ª±ê¡]yÉ-;‚Ëõ¥òÈ$»%)ÖÞò<¯NÓÊu´ªbX½P"¶±ÊIé cc\´"X´¼¡s:(¥ZpÍâÛü˜_�RÁnÚ@½û+æ@‘D½BÓ¢TEªRÔ´=EŠ–õ¯ºÞ]ÍÌBQÅ¿Wk1…CG>xfß›÷ÞÚ“÷¡P¢¶Š0g!£åE¶ùîm1În‡á{m*cCP$à+XÔf�7´ˆ™[2«Z ×| ‡ðÑ*÷I&ŠÞ/ýM‰Ó<áR±åà3F$˜ðapê€>XL@P®í��YFñÄ�à'O 5B­}TOhk4:F0®òÔ(1Þ� XTŒ°6¸iy_æ³‡Ç§‡´ª
&µØ(†Òð^KØ©ARxö‘4‚öå!òmæTƒ”FXÔŠæþ¹½‘q–EN¾œNÊÀ�Œ“jœeÚ*fXDZáÌ7M²jš`±A'3kžã?Àíp÷kEíúo¸JÆ¶I82k%ÂàÙˆ§í8;¥¥�_£„(g$ßŽ;BˆKkô«ã—íE-yHuâ¡'::"zrÝþö¨èÒ¤¤»¼ž¾²áî4À?Àýšvr÷j:µ»ËÖñ7ê(˜ï`íMÙ“®<¡Ò5äg®§+”.2–)$ç(†A<Nú	.¦Hï�_cç}âøoãzº!#8w•ÏOP©ºæü ÕUZ
o8=µbX":(Ñ¢`ys5ºÈé™jã>ªóâÿ°?‘Øx—ýîIÈ¸U^œm8�ôn`×}·]öUPÁNA½ÏW¼[„@½6�DÕ¢Â­©*gÖ›1™ÙÞ„¨âß«Ù&‘ðÉ~~öóóìKé
+ö‘„Çj¼ý±]a½ø4™ºó‡¼tAÑ†ÈŠBbÈ-žº°á3‡�1Ïe'aÕÆ~‚kIŒ›Hé•Å3’ÄWËC}Öðå)žyIj�î¹gÁLÀUé
+ç¹A©�ÏÉ$,{Ë¢{Á¯Y`£íc„?ªWvž“2Bj³¬ÉBN§(‘I›ÀÛaîÛÃüöûóm]5³Ž[R4Aÿkqƒm°VÍkîÅ3|n–Ï]¢5k!ÏxêHòbøÈÔ¹^?B‹y‹;N,ç9¿ÙÔ9I?y�7¼GÁoÆ©Q|$ã¯€"ÙØ×»Ú>ùj+¶Ç”·éG©¥Ž'ŸA"´ÛOÔ¶^~�£UÌKŠ#\\b´{¿§CúîÞÝ?�T]kÛH}×¯8-–‚ãÐ×MâMkR(iHv—]„ñèJ*Íóa'”ü÷2#ÙÖ‡Ó]½Ïœ{Ï=çéâ]iäÄkf(µÎîžÜ‹&{ù!;OÎNœàÏJX¢&ÍŒƒ*pW‰
-DÄJé#ÊÊ!å>IøT3ù�Œ³¸`FÒÕz÷‘ÓrŽZ3ë“øBž.ìîàJWš”®)Ád®¤3bí�2¶#ü¬\E(|]ƒïÙºœ¤%Y(Ó0'”œC×Ä,a#hë¾Þ¬®o®C«(ÌUÌaË,ra[.Ê±®‚â­ò†¸Êw’ÏÉ²šqÂ]ÅÌ�zŒŽœ'‰·a.É3¬6Bºâ<IxÍ¬Å=5jC+Õ4aVÑèš’ÎbU‹ÇÝñ�ÎNNpµafX³R²e `´æïx<>O†•a²{*ƒ¦—I‰î]ŽÃ4ß¼ÓÞMÊT<ž2‰
ýÓÔoŒ§×‡âø‹¾NV?�ÙNÝÕ¨‘`Ž4Ò‘‘¬AeMt ·Š�v÷ëZðÃÒžž¸’ÖÏ]Ú�£[èlŸïAÃ0=o;3ûõG¾Í‡ÃìmÛaY£ð¼)>]¶ÓîqyˆÍØ¼Ã2‚·*ú}w!™ôÈ»œcT0Ô
+Æà×äèé™¸w”f¿c£DÞ÷#¼¼¡[ß—ÓeI.,ð–5”f]¶Â#
+¤¿•pº¬˜
5il™õM�«ŒÚBÒ·Ê}V^æ×Ïœt/í>
éìîËÇ{¼·�Ê¡‰È³xnê9ØZ'd¹˜ÍÑÑŒz=ˆª�Ÿ»ƒ°ñ°�À¯°ºçzXón‡Ó(ÄŸ^þ²¬¤tO—½‘‡ÓåÖG7²PéÀ”½ð˜b!ËøÚÞÛ 1PFªvý“¿ÉØ0xÖÿ÷àŒ�eše{–éHc'bŒ¨ÝÜˆïXqßƒ¶´3!\Íñ/†yÝUÜ{#g}ÎŠÙHh[ÆIÎþŸñ}ó'á™�Š…D¢Q†ð]ª­„�,ð¯òàLÂx‰ÇYtÚ›’gp
+­Bxé-åqµv1›å›¬ú?P¿\ÿ¤vx2yg^“×ä'}RÝoÚ0÷_q<@DËö:(£Ë¨V©êªÒG$dœKbÍ±­ó†¦þï“CHiGæ'Üïë|³¯¾ô�¡2’p˜´â
<†›Ï£©˜$x)u€\ÀKbp9<•z‡×šŠÔùé¢dªÜ’Eøf¤ý…Äf’,.¶§óu†ó1¬p+kiáÖH0§‹…/=:o0‚´(g™ô¶fG¡¼s\"äµ1 :õXm´B´ÍU’µ³cðe@ØiÜ7¸‡ûtù¸ZFª&—’a/d:µ0ƒ½æ8†®&… \vŠ<VV¼TO¥¤{·n:2¢ÝÕ�6¸:Æjý]*vt˜
+¡Œž±r;L]UI›¥Îæº€?`’$°ØI‚ÔèõO#„(ß<é�d„�2º}šŠ÷¨Ir'øà”dGÿðÅ²–Ì×[£äµUQ6ål`ªÏ]
Üq3îSí‘µQãÄ_ÍßÁùºé4¦—©#¢/[¿^NX ˆ0}�îpæ—�k²ÿ7q5¿Ä÷ÎÀ$IŽ”	,¸$·Í·Ñ¶bù[a³kK'}ÞãÄ=Ê
+£é8Â¶èuüÖèÆå-u…–‡Ÿ:¯â/U�]KBA†ï÷W¼—*’t­•u°"$»bÜ3§]Zw—�9~ý÷8¦�—óòÌ<¼3¹Ë.£f¨pO´x«zÈ,7×ý±
xw^ÐøÀð‚LE‘,œßò•Á‘¨R>ÿé=ÛÇ}‰Œ‡@ñ‹‹
+&T"O×çùªæÛ!–¼&QOÏÜrÁDÎÁ4»Ì)î@P¬aSÔâ×­¦"'ác*PÇhÚ`ÿí¼å(›T6¤>Å!r`ÆÖóî¸÷2¯f¯ËYwêXL)v$¨½ü¹¸ÆÎ«ƒvå%µÅ2lªÏ•G&Ò†%“e,•yZ?26¦•ËhU¿zâÈ…B•¢ò^ÇÆØ@"xca=…à½r¬—,¾Í�ù�TÁNÛ@½û+	!;J@½6�T¤
+!hÕC©¢Íz�Xï®vÖ¡V•¯ÖNb;ñ¡{°ìÝ÷æ½7cûò‹Í-¤(•p³w$ýÂWùêS2�.FŒà{N)b°Ây0<ç´ÆójÄÜØÊÑ*÷ËnœF¸UB¿£ó—Âi¼^îžÏSœ�á—‚=	
_±D—¼Û¸¶¹Ec �‚4Ú;Z–Þ8Þ
+>>GÈJ¥@îÕZ‘DÍ¤3ã
+áÉè1X…‚Ö„5ïÛãüþéõ>”ªƒù\xø)q£…)|�ÏÁ‡ðlJ'¤Iw‘/"-
+d+$Âs.Ü£y«;2�¢’ƒ/-ƒ2�^çD5�"©3¼ £Ÿ›¢^©°
+Ôža®èm·ý7¸�àz-\�27:£UÐëh-<Â©¬·§QŸŒ½à*DªŽ(¶sxH¼×krFgG<lÏ†ô5{¡ºAÁýé–jË¥"Ù¶k±�F³w¥ôq
k ÿ6ðx�éEíek1ÝTÝý*m€¾ã”lgÖix5&³ÆÉnóª�Å®ë©Æõp€îØkªöÚ>Pºµ}uÔêÝ7ÿ ,=ÆÉgXJ»ñ„"Á¤|]ó×ïíÈÂ¢â^üÉ,|ÈqÒíÒ@©æ
+ýžÙFÛ´j™q(d¾—ì6®¦ÿ`LÃèø¶ºCö¤ë¯>>ne�þiÜ;éÕ9”Þ¸*øÜ4íÐyz‚…õUÜ
‘ÀÙœì¾í¸¦ÖµŸD�q2î%ƒw%5%¬ðg#]â´w²é7o`Æ“5·éR�ôÿ¦žÌÂ¯ïÈ|2†L(ÆÞ,šë&ú•PMo1½ï¯x‡vWmWÒ†„U•T”c¥ÈñÎÆŽmyf"ÔÿŽ¼Ù´©èŸìyÏïcn>FÑ’v*QÉ’¬–•"ñíûjZLê5~Ëè¬#XFTI:Ü»£ë£	ñ�ìÆJ]a‘<á“Sþ%aÜ¨äi¾>½¯[š]â�ÖŠÅ*�/ÔSÂ
Ÿóh"…è(¡|¼$»î%$
?‡1„®wúÙ=³�Õä™`}ÒV‰
þÑ‘bÂÎÒ~ø÷õ®Y~{Xf©¡˜%Ø+FkùèE-öV$—çÐ'MÐ¡=Už^m‰£Ò„{£Ò]x62-
+í3~“4a»U¾m‚ïì
+˜Ô5æ;•Ð8ûø=æ|œõ2“Ý)!\hgGhZ‘~í¬F×{�ÇX­tð,©×Rž�ý¬FÃ|.r�«ÙˆÛ×&™ôô¶•Q¼pV1qY}À:w&œHúäÿÕ¿šmHiÓoÉKz/e…Þ½ršÔõQ¨Æ\L
+{–2nmTZþÖ4ÜFêäÍ�Ùí%¤JIþ7%—Õ)ÝSñµW[oÛ6~÷¯8RX2ìd{(4µ—ÖKÛÝ$E�F:¶ˆR$GÙ†ü÷�”d‹´ÜÖê!‘y.<ßw>^ôü7]hÈ1Ì`bÉðŒVTk´ó_ÒËÑÅdxWpk.¸Í�ZÃmÁ·x>ï±Tº6|S$Y
+/ŒDx)˜üˆ†,<gFâÕC÷û<ÇÅîñ�YâLÂ¬ÐÀsÛ
\éB£Ò�#0™C¦$þP‘2¶�ð•2@Âº²ýìÎ[ð¥Eàr­LÉˆ+9-�Y„-Ç��{{³¼þóþÚ¥òÀ¨`;f!ç¶™sØq*€x«*“!d*ï _Œ$+Ñj–!ÜÌÜ¨ž‘ËÑ¨²®.™¹™!+J•_FcJ×Ñ�+b¥+Z9¬(ÉFv«
—´ŽGk»Ú ­K½Ê¹‰ÌnX²2­¤àòc3ØVþŠ¼¯-aé_²Àþ�åJ~x!ëöu©¤%Ã¸¤AÇöÿåh”	f-Ü£XW:g„KU–®K¼ÔK‡–‚è†ÿ\L&pµeÆ§ý]í¤P,GãXwfmø–Â™Ì—£0ø5§¢zx!8³wh•ØdØpzùÄi®å–%]­Gáx°Åa^
-GqYeJêûÄñŽ•¿*ÒÕñ¬ÊÇwè5~�3RÇPmkhãtõ xv�ÅÊIÏ’©2J¼ƒ{"þ#Â§{¿!ª‡¸=DôYíÓ8íÍÝ#pˆ±ƒk�«–œƒ-¦eÏƒ÷H[Å¹çÌ-õÙ"ÄØ˜æÇZ‹¢Àº¨A}E¡=ô�Å…ÚŠBØp!ƒ²ŠB~ xæMEÞY‘÷AKnàqXQø	³Š0IŸÁVñ¼Ï´Á*´„¹ÌAâîúc	ºÇ™Ý¨ç1»VÌ¸ºÐç8�ùíSÉWûíÝÒv©ø’s´Ä¥?NÚ‚»­29îãl±Á¦
íÆvË¨HÒ ¡A­,'ejÇèIÍ¦yKBÖÒË~*¯qÛ4ç�Ø—Ñ.û²þbº¶×¡º·°Aa.?íMŽ’øš£‰™ß—{4çøb×LXì_CòS7S?Y’ÎÜ¾6ÈÍ»‚ÉÄõ²3ž^_aŽ4íï/¯Ùbg8á�\«dü·ª€	ƒ,¯¡`[ô‰;´ÛvñºÕ››÷×çã>÷¤Êô–ñãÁL¦Ž‹ÐÍzÜÊf‹¼}O:bz]ïaàÒÂ£o¤âMƒ5Ð‹|„ŒQV@ÒMõŠq�ùõ§µ_.gø5d]£L2î’p¹éˆÚ³´ö‰ŸÁÎá¬éêh-Û`¸¶yëª¼iÐyÿ«Ò6Ñw/t4¼e÷5$hï†ÉØ+Èßbm•eh­»×Ð\¼r µ¯ï‰OáÔê8üº'Ãå&Iƒ-±WãÅdÒX&pE…Q;Ÿa·u
¯%ûÓâHtþhh•×mµ¡�Ï*õÞuÞÝ“øšœ¤SûÃce÷ÓÕ8Þ>Âlóy³ÛÄñ¸}ó?=lXÐ´¥ªDRd~OòU+ÃLÝ~rµÝ:‘IÓ
+
+‰Ž­ƒ-Æî¡6 ã/“ n¶`¶SÉ´é–�³·ZZ6qÉñ–ùý¨ó+Ã	¼ö‰¿†°¼ûRûÞžƒ‰~ H”®c‰ìqŸ*çÛq»¯ÖäT¾)üüëÓ§?dÉ>"<±í
’=ÜÁ¯ù'(™¬˜õw…Ü|ŸlöDk°TÛ£uÿÄžÄüíònþ>ŽþUPËn1¼ë+æ¶v`$èµv­‘¦A‹6€s‹‹‚Ör#!Š$�Ü8F‘/v0OäÌP£áâ²†Š–}"á‰šDomWYÏ?MçîìÄá÷!*º˜QQI¥Ã]ˆ/|ê0*–¥î$>ÃÄOñE2ãk¢üÄbŠIæ«Í~>mùb†oH-RÆwîY°Ð=pUCåRBPnáK6‰›ÞŠè‡á·"°Àèú”àîƒ:EÏY1wEžÉbÉ3ÔÄ¤Œ—ÈÛqïçíòú×êzxjf�[R´Qß½¸Å6Z€
áµôâ¾´ûÈg.Ó3k%Ï¸$·e=^dî\¯ÇÐz™âú†3¥eÉÆ¯6wÎ'RÅê‰÷øÕ8·Šc)þ9¨RŒýð«®Ï~…G¶¹lóï:Œ:™~‰Ðîcc(aë%ãáÕtE<78¿@Ó5³cŽz
FŽšõg>¶oîÍýµSÍoÚ0¿ç¯x‡JDA»Ž�uƒVCšÖjôX)2ÎyÂ±­çšøß'C´´«vX”Cl¿ß§œá'_zÈQÅ˜aÒ’ÉÖc}h’~'�<–  ƒ@¼bWÀCIkì%°Ÿ˜8¿eZ–©nÃg¶_Œ²+d	0Tlñfq\÷rwaŽ„”…¯X#Ã07n|éÑyƒq”ÍA;+L‹Z‡FðÎ1H‰PÔÆ€þ£§
i´�lá¸RBÎvÁTaM¸Ùã¾Í&·ßç·‘jLJ%°Qr
+-ÌaCR‚ÄðÁÕ¬´Ë�‘û‰U¯4ÂC©xæžö�’¤Ñ—ÕQX˜ªA’h£B€ù
+ÍÄU•²ùÄÙ‚–ð+èw:p³VCO÷>"CÔˆgži­áJjŽÉsT´l—€�ãÙå”µ8Þ60_/é“Å,ÓÎáZKz®&Ø=J\p¶›ñ¹Š]]�O°fôÜû‹ñ—Œ0:”–^hu¡Õoµ»×³(cÜæ~�¼aLÛaáœ9óÈ(5ÛK«×ãR…ÃwÚ*k|Gi‰2Å d÷7,*5�´¨€ôïBª–²Õ>ïðÒãE?=hõ{>^¶~Ä÷~V¦ujµ±ûo<¾TÎˆÞÎüˆ•7JðŽÆ?àÏ²éìG–öšW;[ò†gß
þ6Ï>õkD»d—ü¥Ußoâ8~Ï_1·Z–Õ½BË¶GYiµTG·ÒI•�qbÕ±#{E§ýßOvÈöéòP•ñÌ7ó}3ß~Í’bä’-ÁiC§íÝŸÑ4¸0€—DXØ	‰ ,dÌè<'â€ã¼Ç\g'#ö	AÈ#x0
+á/ÉÔ;²pËŒÂûmõ{ãlkÜ2K‚)xÂ
ÜÚÊpŸ%êL¢s¦bàZ‘Ûœ´±eÂoÚ%»\JàçìÎ[
+ŽÊ"µÓ&e$´B&‘Y„ƒÀ£�û¾œ/~¬Ê£„™…XØ"Æp”9òVç†#pW”oÅR´ãÏ	3Kýæ™An]]Š»Ì}³GÚ8¨ÈN¯œgùoÏmf„¢]ÛJfc0“ŒcqòÈ_DŠË4Í‰mei.+û&$®O–0õÿºÊç¾ò·¹o«œ²œ¦AÀ%³Öï(ç:M�®"Í$¦®Dpž•ùßàf0€û3õˆ¹V;±wR9�Ìˆ#„ÏÜ›§A3Î—ðŠÆ:zí�CaoÇtHw•>¶ƒ
+†O]÷Ö|+¿È½qÝ±drNa—`ÉhXA—XÃ&§ŠÄ¾vëv…Â¨\Ê¨TÔ}ŸÝð�f>ÀÝE¼–G‰í<šZ¹Oì ,ÜuSx�2;»’†Ñ%Ù¯vZ¾./të´�Á�Vâ W%Æä9aMà E\Á¾£Dòì:·)lH4ší‘^0Í$#¬&=Œjê`ehy�žÝŸDËMxöB¿×{]ü½^®~ôzýaKoŸ¯lðÿNóøð²¨çPú8š+,ìÿ3JG1<MÄÄ®ú�LÄÌ©èBx4‚p]B;.‰¢ÚX4ºTF-ÕN‡�Ù(÷OØ¯‹}É
2·"…‚žû¢}£³k2BíÃ(:EÍÖ—wîÜû+ÒX�áçÝõy•!»8]Œ%€[NÑ¤²^&È å¦±4Ã&N`xNÚ¬úf0(pO‰ÑGËÕâƒcæ8”G7×	v;RU~nÌªy­�~Œ–„òoXyAÏSÝüÇ‹³Ææ¨A�fø!,Ù0‚/_à�“RW4¾ê0joOÞ×Rãß÷õàùiùº€77ìüÞ“Y|‚¢Œ1ü´è_åO£ÑNŽŸÀñHƒ®*Aã~#Mc5]­ÐEä¤Í)ŒF3T67¸(ù×Dê<Ä-É.s=„«÷©œ²zT5@¿‚ÿ•P]k1|×¯˜·³ƒIèkí¤i�´
-mÀ}‹CXëöîDI¬öâ˜’ÿ^tþS(dŸvgg53Z|H}BÃÖ“ð$«8«�ºMœ/ßMçæâÌà¿z—Ñ:Ïp‰D[Üõî™Ï
FFÓV\×+&vŠ�Ÿ<…ß,š± 	|½>Ìç
_Í°ä5euð•,ò¸N}â˜<"(4°1¨¸õ Qò^ðshÏhïa�ê…í�å�.´QžH]3$Ï”ÏŽ7ãÝ÷ÛúæÇò¦<5ÓžÊh\Þiqƒ�ÓZÂç8ˆeØØ"_˜@OœYÆ]OrWã�Ì�ò)´ª½[}áÀB¾ŽAùEçÆXO9c©¤CÞ£àåÐdœ’ñÇ@’¨l‹¯v¶ÄBÇú-ÄMø™Ê˜'Ó÷ Úî/J	ë ÷G TEÞW¥¹¼BEÕìtÙù¸&_�Ë®:îæcûjþã¦Ž¡õÎªÝ[=ÝïL�¢;ÿJ¿š¿ÍVßoÛ6~×_qX
+ädyÙC»ÉŒ
dAœî%Z:K\iRàQv�5ÿû@ý¤$w[�Ÿ¤ãÝww?�xù.K3ˆ1L£OFóÈ¼š}†4=&ÞÙ‰'ð”r‚5œ cÚ€ZÃCÊ·xêAá1WÙ^ó$5àG\k‰ð›`ò3jCpÉ´Ä«Uý~ã,„®Î$|À5\Rm¸ÊÒU&Ð:“1DJÍW¹Qšª„7JƒIÖ¹5Ù­·àJBàr­ô†®d™@F[Ž»"îîvþþ~ñÞB�™”Ø1‚˜S™cØq“‚±Í“Êu„©¸nùÌ“lƒ”±á!eúV-F&ž—“­KF630­ÙþuÃ²É!û–‰©·©\šž�o2¡bìY)_‘Ñ¥Ñ-b9|9W’”À'¶¶ªH0"Xfrš«ÍÆReQqƒÒ”¥ù/àìä®¶L[¿ç&Ë�mÛnešo™A8V…yâul)�˜X&÷ƒ�ÌÙìvª›+¹æÉ ž†>L–¯�Zv^_#%Éè<2~á`×¡‡0Ã&¢ÓM§üÖÇ¡¨â¤Ø
+**í:¶BÏÜøzkÚg¥S"BgM[ò{Þš±Þy³ao‡ÙÃ/åýà¶ŠÇn'Lˆ[I†	�qUË7S�g®·8å&B­˜ƒôÏ0=o‹Ô@ñ5øÝª¾~à»‡áÒ•ªÝ�Ò‹=ÜtPíÒhr-Û¢ß¼ÝeüƒVbdêkR+Õ¶_lÏ{H®Uýh¬*i@B1:ü#€ét
+¿|£íR<ãÙNsƒOøÅøGKy¯àáÃõ#Ù‰»æI®1†u1iíà/k>]Ê¥<ú~ž†	Gƒ\\ÖY.Fp
+GƒTÇÆN3˜‚Ä¸Î]ÎèìÓãÝ(„Ñ¨Éò=/&ãÒXk£ûr§¢âç`Ÿ?ânc½¸ÉÖJ#‹R¨øFåéµŒg,ŽÕÎ¯ú]å\”ïELð}Ü4˜´0šËÄþ›°jÿÿuÅ%ìU®�ŠŠO¦¦œ<?HWöñ±áÇ©H«]{<=õL:®¹$4¾
x>éíõÄè^3ŠˆŸ.Ä¦òysVSUÓåÅÇ&w~£ñ¨?ÖmØxÆÉ™üê\ˆ* AÓDT‡æ…¹z«ÛqéhEuª-^Ê¨>j?€wNšÖì²e3
ägÜSñ4­/s~§	+ °ci®Ž]G»ì×ëþ¬}ß§¥^åwT]ÏÆç¿ö„S0L®-E×¥ÚÉO$3¹Æ.Ô™æÒ�ßRsÏ6èA´}s¿’ªÆç~lè]\;Ò»Œ‡ŽÂöÃ’ú—ZµoÞßÍUMoã6½ëWL+Ê¦½®c7‰‘EÛEÓ],�Á˜[D)R ©x�bÿ{AŠ¶¨çÒK}¢çë½yŽ®~­Ë
+b5¥ÆjÎì‹=Ôd–¿d‹äržÀþ*¹�-Ü@�Ú‚ÚÂç’¿Òû|ÄZÕÍw¥…”ep£%Á­@ù7ikà
+µ¤ëÍñÿû‚V9<Ð�å(á7jHÃ•9®ë²&Ur�€²¦¤Õ|ÓX¥Mü¨4Ø’`Ûì„î¢g$
—[¥+´\ÉjAh^9í}Þï÷ë»Ow®”oÌ–ha�
+nZ,*`Ïm	Ö5oT£SÅ±åËDbE¦FFð¹D}¯ž¼"‹$iŒã%™CÔ/Ö‹I;éMz4
º˜j¤Ø£t°¹ ‡ƒ±Tù£ãÙó{žOkÁŸÖªªPÔ®’¹ûÎÈŸzÑ_I®äÓ�<„ãZIc5rG%a��‹¶1¡ÜZÉ-ßÁ?	Àå|×¯¨Áá §žóÕš¿¢%˜1Áƒk‘ô³<×o•5‡‰uÏ=NFý'íÜ�&R;gH¬›�à¬“öå…ùVfÓ˜þLµ‡|HoÀ'ï3èAfA÷›¹»Xu*xëò„³Föa\äPˆQBÄÚ„¸}úã¤^›=‡k[jµ7pfLÆa{è¾œ”vGÖicÒìC;ð‘|éO�8
+q/�E!¨H³X4÷Ód-§U¹Xu�¡I/Mc¨p°ì^ij,Ú˜húåå%2p\ý«L½Ûƒ~1¸#ãØ.—Køy˜”´²5º…IG±žë©ø'¬(ÍòÉ(Wmê™ž‹ïª†”4ÅeÏ‹ž-0jä
ýÜ:•îi -3p‹%�T2ªö¿Så|áã‚MÛþÆò
ÔËabN¢ñÌ§^¬�¾"Ls¶xkˆÛGzrä0º’öÁÍ�±¦jZ¥óðgÜReÎ<³è“•ö“CZ¯�Çç˜§ÿJ½Iªá­L79L™oÏ|l“â‰€ÈtZ$§{}Ý×ÕrÊÜŽËÜž+57}\OÇ®{{v¸û›îl”Q›ýU×}*.V%šöœ¾C!Þeo¢ì„ÚàjËtX?’}PÁnZ1¼û+æ� $¨×B(-
+j$TE¡½!!c/}«úÙ–wUù÷ÊhU©­OëÙÙ™Ù�¾ËM†'l¡�ha§[=e’‡7Ã‰�FøÜ°`Ï�À‚l‹"íñÜð�î
zÆ"åSá¯�bà†x_"áC°ñLm‰4ß]ÿ÷žf·XÓÎŠ²�øHLå
+Ìs“)å@•=\ŠZx×i*r1\¦mû.¸_î•ØQÇ}*­UNñ9�Â�éØÏ­ž�ŸÖ�Uª_L«8Z�g9{‘Ç‘µ�Öå%uÅ\ò×•Ç&Ú–$[GxnlyJ›þ"c:ùÚ,o©mmôc\°"ø’½Uz¡œ„5•ÓŠE/p›µUp…~�F˜lÁµIiÝ§’:ºä@«d=•­rsáƒUÂMèá‰9£Ý.°Ã¾‹®Û­KQ´tNÿ½¨/Aê»©—¹›�xømT›¯·£ïä:¥Áð-‰ý¿Ôîf>c­—%µçDƒáUùÕüu�Oo1Åïþï¶I•´âJþPˆ
+T ¨T8„&ÞÙ¬…k[3³M#Ôï^í’D
+ïäyú�ŸŸçoJ[P³�$<R“àí—íëâÕxæ®..ð­
Š&DFPCnp×†G¾tˆU.{	ÛÖ0òc¼•Äx)ýf1Åœ$ñõæ8_Ö¼œàž7¤(á#w,˜ëÑ¸.má\"÷ (Õð9™„MgYôø>¬e4]Œð§ôžŽÁsRFHM–²�Ó%2)ã1ðnØû|»ºùrÓ_5³–;RÔAÿfq�]°Ö—×Ü‰gø\+_¹D¬…<ã®%¹ÍëáGfÎuzn­W1¬?pb¡¸ÊÉøÉfÎùHªø^j2>¸à'ãT+ÎaüqP$ûþ]M—|_[¶O)ïÒ×Ò�:¿‰Ðþ°ÑKØ:Iøq2zUMÏSòž‹M»¤a›¸®°X¢¡¨<9§‹pÃ2ÍMCâêèÿ‡ÞÆ¼¡Xá-–¨¶Õ	ý9ŽÏîÙ½}TMOÛ@½ûWÌ�ƒP¯„¦@DÕH!UHh³Ç«®w·³ëÐ¨â¿Wþö®>%3o¾Þ{öå7“H‘KF[G‚»Ww0h¿~IÑù,‚<åÂB&$‚°`9Ð<äb�gÔˆ•6»ÜAÌ¸&…p#™ú�ä,\2RxµíþŸ¥¸œÃ·Ì:ÁüÀ	.m¸2¹Am$V@`*®•#±-�&Ûü®	\Ž�•Rï§Wh)8*‹ T¦©`Nh5#‘Y„½À·ºîn½º½ßÜV­êÃ\Î¼1©°Í,LáM¸\u¼Õ%q®ÓîäóH±­aá!g´Ö/5#‹(â’YÏ&eWº(ª¥Da$¨œ…•/]ø_p>›ÁÕž‘_³Ò*»jR…1$öÌ!œð:¼ˆüÊµ²ŽI¹AÚŽ“"á¥ÃâGüS¢u˜V‡<¢Õr�ôQ+3Â„�j~òƒÕM›žÎ¯ÕÙ Dî4Mêl›hëL¹•‚CV*^‰¯¯\+ë¨ä.®ÕsŒÊ“rœ÷…gîS¶<z†š€˜ž‰qWŸƒþè‘´N©ž“Ê‘§ËÆ]¾½nVùGUU¡5‚‚ñ=ÍßxsØ°Õ zí ƒÎUàý¸Úøyé0N.`¯E:"&Ó„Œç{�.wè<Ílœ³pBãà˜ázIj©öjÚQsó“n¥Šƒ­;?%ütÙ­ïaÇçÇ2£9Gò>õõÁòNóúëw­ëÌ=+0N’iG%zÁd�ìÝS¤}/{I&Ìxt‡D_À¦4F“Ã´Å�ÍMh´NÓa`~ì¸^‡)ý!“¶qÕÐ±µB“¼9x[~¢&¡+I…¶í~Å¡mF]ê�ë•™@ŠÖûE'á°ÇO$+´ZÕß9&”›´ò-ŸiâxÍ9÷¬¬Ø©Þù}UÒ½eïÑ­VmoÛ6þ®_qŒVrífýÇi2/Á
+m±4Ã€$ê$F‘yŠgùïiÙ–ä—%CùIïžç¹uò©**HQ*a1vlIò/*tÓ�É$:F0„ï9ÈH!�ƒJX“Á·‚žðCÁbfª…¥¼`ˆeçV#ü¬„þ-;8VãÙãêýCŠ§#¸ÆGá˜„†_±F'nõá¬**4•BoB§ �fK�5ëÂKc�„¬V
+äšÝ[+’¨éÌØR0=‚J¡pO„óàwõyvñåúÂC…À¸sá %·äÂæÄ°Þ™ÚJiÒUÈG‘%ºJH„o…°ŸÍ]ÈÈ$Šjçuié™�ôƒ°V,&áscyI
+¯Ž±¼û…,J6v1‰"©„spS¥‚qfÊRètftF9ü
‡pö$,ÌÝ}­<¾óJü^eéI0Â@*j¶&Q×+èû£T
fß±êl÷�¿›#¯Õ^)ØØ-ÞiÖ€Uõ£"¹ÉÍÃƒ4Ú±­%ÇÁÀ¯vl­`Fkƒ^=Ý»=Š÷HnI“h¿¾ðãÓ�h¯i7Ñ=§®¤¶S?É=ÇÝÚ¼ã¾Äzççu­–xC8³ÈµÕðþU£cL}ãÝÞ7ÛG;«‘#wÌ]œCèÝvV2RŒKEAqŽŒ/­)gŠÎm^—¨ÙÅISt¿5]—sEÂapì–4nH’Nt;äö*ìõ®_Zš»ì»TmáPYÌÐ~Í2E=÷£1j/í¦[Æ§…pËçøÝdl–(ï3fÆJ<—+¾ÑŽrÝ*Ôÿ!xcÇuƒØÓðÚ¦jA»L‡‹½ì°UÉwt\åC„)ÜÞ·:*3…, Þyâ6m' ü	Ÿk»ÔÜ>æ~Qñ,+^¬[Þ¾…7«Ù÷üüQbœŒVÊGÀ¶Æ¤í—¿¾H×8éì<G[n¬:>&wcÕÆ�JQ3eŽ¦Æy¸iþ¨§P9ô2¶\
+4ýæ3>îš-é|�ˆÓ„®zEˆÝ””?û¾I§ý	1_5ÛqŸ¶
rä–Á1èZ©I� ´îí}£¸snâC!Ž¶7wÐÿŽÖ‘Ñ³p‡
+Ò'?Òq•�`’ó?€qÒ±l%ÿyû*©Ù;i¸°fîÂ¿@ó#ÔÌ¯‹¿ý°"£Óþlr¡¯^8”v\Z{çO¸¾ýZ6Ÿ™Zóæ.l�Ùy¬:÷af,Ä‚)ü4�ÁÉÍ¿¿ß?i­N:ÌèyŽþ=�Áj1†ïóÿq7„,½6Û6í’Ò@)�„žÅãÑ¬E=²‘äÝ†’w3éT7‹Ïúõiÿ©¦Š�bJsåè¿ü¹’}x·½îv.ð˜Ø0r&°¡u”÷‰OtÕa!¥>+“c·ø¬Bø’ƒü&uÃ>¨ÐM¿¾¯úx‰êƒ9Á7j¤ØÛÚ¸©©R©™fAÄ"®Ü7/jÿ¿…'ÂØrFüŸ>Ó™#‰XÆ¢Sp.r‰š)áÄt^þ}¿;Üþx¸�G-bž‚ãÛ[
8³'ø,o¥i$Ä2¬Ê»NÂDVC$Ü§ wåi¹Èu×ÅÌð“Ô¸È¡LÓ¼O5ÓDâ†Cæ§µý·€ÚúÌc“8¯úC±9m¶ïq*¼Rsív�â‰å/è	CB"%K¤Eîô�ÙDŽ(Íks¤P+‰�e�´‰�.ƒ_º—î�–mO1Çßß§°&¦>¨¥Ú[
+¬[‰mˆŽ½BBiÎ×‹šK¢Ø×M|÷)÷PZÚ!…¼º³ó÷ÏN,9§Ÿ]î E©…Ç.±W’ùÉ!�}ê�“Q?�>üÊA¦4‚"pÂ3ØnsµÂãªSëž¼Zä]Ùƒ/Þ |ÕÂ,Ñ3Á©ð'óöÿ8ÅóÌp.ˆ•0p…%z8¥Ö0q¹Cë4†� L
+Òöj^²õÔ/­Î²Rk�zØ­•DCÊdÖ‚•5p!¬®+ÝÍõôâÇì"„ª
+ã\0¬Aª¨fa
+kÅ9p(žlé%‚´i[ò(1¢@rB"ÜæÂ_Û‡êDÆIRRÈËÈ@r^ÎÆI"µ ‚©-
+aÒ+[ªp4L0Õêá•÷o0ê÷a².…dëŸ<Ø�W+ÁGYm'µ¹œk%_2x|”ÖûRr·�ÐJz
"¬£Péð¼ñÀÙVÜà~NÚdjE&œ{»>”øÅ‰.À›­£ƒ‰-�YÕxfG²þï�lÝÊ‘ÖŠeÝÍÆ-_X2\r§sòÊ–G.½yUåð|�ü
3QêM.½ñŽ¶©{—�£v‘”+Ô.±BOÊšHÊïZR†Xh	º®U1 [r*ÓHÒÏFƒÒŠ8s£(ª\éÉ¸
šˆÇÂ®b)w•(CKŒ½ÿÙ£.¿tá#!÷•(3ôè,©*Î;Z¡ÆÞmbÄ¶†GÂXæ]ÐÄ@¤-œ%ô‘œi#‹j\RlƒT¢(ê¬m“ÿ¸‡ïj£Ù&pL:…Zøý\Þ&}¯5[˜qZOšCÙW³®ß§Ý=YXÍ£Ûiçå‡�ô!<ÕŒe°Z…7Tåë^†ìà`´7ð''÷fiìº/{ú½cÝýzNž“­TÝkÛ0÷_qµCÚ�n#nºl¡¥…1
+Ùã Èò9U$MwNFÿ÷!5ÎíCÕ‹ìã÷uòY_½òP£4"`N´ä{^{¤ñ°(³A/ƒüRš ÑAx\wJ/ñ4ƒ„˜:¿z®rYÀ·`¾a00Á…'U÷~ZãefX	b-,Ü`‹.¨+L¼òè¼Áak�ÎrÐUË.ÐÆðÚ`…Ð´Æ€ÜºG´Ñ-!hÛ¸°¬�íƒ7(a©q•x?n§W?gWQ*5ÆJ0¬A­éÙkXiVÀ±yrm�ÒÕ]ËƒÌŠ’áN‰pë~§)³¬¥˜ËÊèsä{iQyX'´åæ¹º¸Ögkb\¤Ç2Ë¦
+åµ‹†¥–3€A¯—vèÁ„Up+‚[»F×7‚ÔÕ£D�6˜AÚ}[-w)–t³Î#ŽðÑ£dLô>Äp§AåœÙØÆu¤©iÊ6Þu˜(e¶ÅÓJ³T�ïxÅžZ\2~�™ÃH�’Þè‘|…äVïA¦Î2ZÎSÚ“Ë9rW)öSt«
+(ÊWíÏÎ?¿=Àü®>~ùôö[ð»F8ž½=Âüßê56¢5üÒ4�8X\½:åùæÊ�?P¼¥¬c Ö{ëãþÞÄÆ$�æÓÎ; ·Áv­�\âŸV˜—#ýÌzÊþ­VMoã6½ûWL’;n¯Nìf7Mš mjlRô°»id–IbHÙ+ùïÅP²¬�´›Cy°%r†óÞ›áP?›Ì@‚q.CëHÆîÙ•íâ§è|4;Á)<eÒB*siÁr SXer‡g#ðWÚ”$×™ƒ0Žà)„�¹P$gáB�ÂË—ÃûY‚Ë	<â‹°N
+·X Á…=L\šÌ 69²!•@¬•#ùR8M¶x£	\†�yq�­s£²R¥š¶ÂI­&`ra'qïý~»»º~x¼æ­<1—	{a!‘¶Š…	ì¥ËÀ1y«Šb�(ÏFJlÑ#¬2Awú‹Wä|4*,ãR1GkH*—žûÙ§Œô^¼älçÂZøUf}�å/z¯r-$�[“ã•³Ð]ø{`Š—\Æ¬‰u°úðtffcg¹Ö›Âç#o7;=…Ë� ¸uÎ\å•cÔ~’;áÆY³ÔwbÔúó×�ËËG¤’í»\åòË…3Å0ŽöÓ}‡•gr�å'ôüú^ä§�^þNáÒÛ#Ä¦ÚdÖVªIÅó³�ŠØ…-QZ*L@‰²½ãd³Æ5i®FuŽxŒ¹p¦Ëãæ°è
+Þ3<†dÃ¶Ì=Ã*”ŸY¥íUF%ùõu¨§ã²´p(µ!sL®¿ÅhX·ÿÔ4©}Â*ø]Í�ªµ%©¼Wœ>fù¹YáhTO‹%ktÁ¤¿Î!mà×·Ô_¶((Î‚ÊýÇoœÕh³¯u-ñH5¡ˆ3‡òÛÒÿAl±�VŽÊÞL‹S^³?]®Ñ…¡Â=üIyðŠ�Ïf˜Çhpót>çÃEÓ%·¡J³°£`�ATqQÙ‚ð±ˆc´�×=–=�Wˆ…cø84	‡ñ€ñ ü¦Ë=I‡	RR­Ã�1�ºõ…AUPU;E"M¾‘Â‰�Ã‰
&0F¯Î•N0Œš×ßÑZ±Æ0Š»G­D_RØcØ5|‹Ã�JuÔZñ}R6U�	l°<úñÞ.BW�êžÀéÒ²V•8i‰çøQ'eØÏc“•æº€±û3²dù¸n°„D8é÷Räº)rïHQ7odÄ÷à#ñ/­'<nÎÖ‰¥¤ºP	hå)Øêä2ÎªÿDßëu�‚ïv¸úúiZ\÷,±ã'´Fó'Æ˜ê§h;-“VŽd
+a³<]Jû Ý
c£A;idè 
+¦ÛçZQe¦ÇÍ×èü}æ“Ó¾%5Ãù¡ƒç@èýpª„F	U•Ê{ÁT¿¯£m’Oo1Äïû)æ€Ä‚Hh¯åo¥)JU¡¦·¶BÆûv×Š±­ç· Tå»GÞJ«øæñ¼ßx,O¡(H[Å”Ga£e#Ç@qö~0ÉÆÃCü¨MDi,ÁDÅ_b]›=Ýfhw>ÙTµ ×|dGød•{&–ˆ©bGËíy[Ð|„'Úª(F9|¡†Óx–¡äƒ¥d„r´wÂfÛˆçx
+üìRÊÆZèKzr[£ÉE‚q¥ç�ãÝÁ’Š„½¡C;÷uuwÿíé>¡ÚbR+ÁAE&vYTà`¤†¤òÑ7¬	ÚçÊãÌ©Å 4a]+^ù_í‹L²L[#\ªG:®vÁ³Ãì‚¥9‰¸–ÿd0±Ü+Ncë‡„Oj`³WBèU	6É:±ÙZ£Q6N§nØl´wQ¸Ñ’wÓ�}pB§ÕK-næ­ŽÙ…—Ž^Þ¦šö~�tl?…«Ð{¦ãàÃß«§ØX¹ÎàN™ý“v3ïHy;ª�“4ìàèð?3¿x®°?û‡Šþo,x7zÛUW6N:c¿1Î�_²W•U[oÚJ~÷¯˜$Ûˆ@ÚÇHÎiÒž¨U�´OEëõ¯Xï®öXUúÛ«õ
;P)á3|ßÌ7W_]«\AŠ”�‘±šQûdK…fñ.ž³qcøž3ãÌ€"Ú‚Ìà!g;œP!>JUj¶É-D4†´@ø—±Em
\-ð&iOS\Nàb,#þC‡®Lk¸Q¹B©8z ‘•Âj–8+µi~’lŽ�9Î�vÑ=š3ŠÂ 0‘I]Ë¤˜€âHÂŽá¾â}½ÿx÷íñÎ»ª³9±°'RfêX˜ÂžÙ¬OÞH§)•i›ò,¤@£ExÈ‰¾—?«ŠÌƒÀ„[bñ;+ð¾(œ%	Çyen�ŸÇÇÒX,~Þ2�ÔJ]þ
à}¨yPNŒ�—pF¿`ù?’5ü
+fã1Üìˆ†ÏÂ=|öú¼Ui¶#a´NmæÁÚÅ>�ï¥ÞÞ2}$Tß0>	N¥0V;ïeÚ`W2'¨ï<=uÐ¨–XkšôT´aã&'ÿùú_,+,,ºT^ªtâýßÏÁY9ŠhSÏ»ØÀˆ¥hŸý°¡°ñ‡c®‘s±d…’ÚF§§J£qÜz9ÆK?—Ñˆ¥ñêrÝ¸b8–XÀªoÌ¤FBsˆ«Ð£Â5#%
,–±_±ÎÙjíÃ;–V¬p}T÷|ŒÀ2ˆ°P¶Œ*NüÒ“ÍµÜƒÀý±wŠÊW1
+¿Iøqk€	Øb	™t"
ã³�FÔJ3Q•¥MÈ¸d‹¥	×«Ëõ*ì�Â5\_Cö[Í
+4–ªž„ó.:Píàr>Lv¨c±€0|sÎ}¯I½Ê‘ˆ*Š{Š4Z§Å0V4l%K'CC/úä´ë/LÍh­>ÜÉ…ŠÂ›¦½"Ç'îRs%ºeêû;ÉÒþºpf|·WCQƒ•½Xú…V;cÓdºQ›0žÆlÖÜµwÓHÁËWøS.ñÝú{á÷ëi?ÄyÉïß.y›Þ&y›~‡Ç~�?!U/üáðÜ—3ß½Ú÷M
kÏyûi6ˆãÅÌX�\¨gÔCRäh1êmE=FÃ§çà9ø=�AO1…ïýïàˆ�xT1Œ!Á£‰é¶³tBi›v²1þw³+xœ™oæÍ{³‡ä,¯3
Šd6ò%m¢rw3œªÉHa„Ç5{$�±ÆÆñ‘Æ
+=±ˆ©Í¼s‚�â1Â“×aOY
+f:šW—zléþ[ªtÖ¯ÔPÆ¬\óäÅä©¡ƒ…‰A2W�Ä\Î‚/1C¡n¼‡ùWïhÏ†B!p¨c>há®‘<éB82�ú½·Õbù¾]v§zcâ´à¤,—?-²8±8Hg¾Ä&‚‰öby¢‚>PIÚ6NçUüì™*ÅA(×Ý`Mís<µ¥Œo©©<ÔM0Ýk°g ?ìpµ§ve‡·ØôàšÚ©úQ¿EPÁNB1¼÷+æàŒ�xT”`$CÄ£‰)}ûè†Ò6Û}’ã¿›÷=îÎÌÎÎLo³Ï¨È+4(*ìô]ÛLåúr81ãsƒs¼z.¨9¸ [Q¤kÏ42èó”[á�WÜw	÷ÁÆ=‰L­DšmOó¨¢›lhk‹²�x¤†ÓrZÌ²Ï”r Ž+¸UxÛh’òkø�ê	uÜŸ{Çì(Ç:ÉÁ*§x�ÈÂÓ±×=-ç‹çÍ¢;ÕSoG[Pqùñ¢
+GVíÂ—Ôˆ#¸T�"�M´*Ù:ÂÚ[Y¦·¾‘‰1•¤î€µËCN¢$ø4�›m`‡º‰®{ÜÃ+jûîãg{j‡WÿÊ*MÐ‰ù2ß}�Qo1„ßïWL¥Há
ík€”%*jUE¥�•�Ï·ÇY5¶µ^ƒP•ÿ^ùÚP¿y5ûÍÌŽ?„6 &mS/
+-KÙŠ“÷å¨öôñ£5�±|ƒÇÖlè¦@§˜ù°c³j=]â#;Â'«Ü/b‰+v4­ÿ›šîXP¥¢åð™1Æñ0˜†6�–²ÊÕÐÞ	›*‰ç¸7|ði	M²úèžÕÖhr‘`\ãy­Äx7@°¤"achÛí}�Ïî¿-î3ª+&­lUDmâ³ÕØi!¹|ô‰5AûúPyX8µ¦”&<¶Šçþgw‘QQh«bÄÚÍ×Á³|§˜¬àwÃ~Ó�b'’g�ÍF	áJûädTœs·úGÛ·"lŽ!UÖh4ÉéÜË¥ö.
+'-½ìöŒ€§Lp}]î#æw•[¿½ë6ö£É1ß_¢sÎy°,{z=ž‰‹¤5ÅØ+oQyoOì™$±;¬HfÙ¹WâÍd‚wÿÅ¾ˆo»_‚žt¹Lzxé’yûË]B¾Òü©ø�UMoÛF½óWL7"
In®–­8uDp‘±Š\+r(.¼š%f—R‰Æÿ=Ø%ÅQ(Ê¹ovÞ¼™y¼ù˜g9$+ÁË2¶/¶ÌÑÜ~ˆæÁÕe—°Ê¤�T*i lA§ð”É=Îðˆ{�—,·™…0ŽàÂJÐ+²5p#˜ðns|Ÿ%¸˜À3n„±R|ÁnÌñÃ]žå¨s…‚ˆ5Y–›Âj6uÂÏšÁfi¡ÄMv‡V2F2’RÍ;a¥¦	ä
+…AØK<ø¸¿–÷_ŸÜU¾0›	a ‘¦Ê…	¤ÍÀºâ�.8Fˆur,ù* ±C“‹á)¼Ôk¯È<
+ãxQì2ƒ¤Á,Êyÿ³ÉY’MçA+a<bùŒ¼—1Â¿ÀÕå%Üí»“?õ�”	²ËëNs–{a.^»§ó`ºÜåšíùÀãÙiØ½’ëo…Í;ˆÒþó¹€%�ÃK:_qa,&÷Z)¬Ô8
³¢Ì‹�’q«ÝËK¬ÉX.bz€{ú2õu™tQ�"]	ZÄ�Ü‘M‹éT+Ò?«´¨Š÷QÝT÷\¸�š.závÐÉ!¼!5¼íß	¸âtüxÛ¶íç	BW·ëV×ßÂšö¸÷·óM’žÜ#–ÞTh[1N&à·.^Iè³¤-²_]·ÝùŽ¦P¶+Ú+–>³'”Ô:¹Û«k£zTÜ#Sßá.·îp�Þ¿‡wÇ¥ôÑÓÅmF“3ô&`¹À¨ÛÉ�âÓÅ�¥Å‚IÒ6ìÝ3òF*
|ý¶®&ï;™0°A$(&`5H2V(9ã^êÂÀÙHMÆ¯7¤§/Ÿ¾ÏÖ4ä˜Á¨óö#«ÌMˆÁ!GN1¶ª„½P2�p'Ê
zOÜ	IVHBs�6Î*2Žl49ŸpÜy«}v'^LÁunWé•¦­q7ž$ó5¡/	J]€`„­v3ÓJ1÷Gí�¾çÇ¿nÆ
+ÿ±áhM#˜AÓí%¥:ŒœVkZÓh0=õEB)}Àd¥«©ôÓò¿&à�YsX{|8þÛ û¬$LêÍpU;Y~3ãI‡XFQ—Ž{mÁä»p²!áïç…¨#†Þ1]´{Ù$uÖ)¬£¨¿Ñµ7+Ý]»ÞRG×ðä×ÿË¡Óõ”ñÊ7Â
Ï]Õc™ôTÔÓ:eë­üW§=m‰ûî^ÃFkÕ)¢Ÿºv¾é"¦øù³g§ÓE¬)•¼ÇU†f>Ž'�
+e°aøü�T]kÛ0}÷¯¸„ŒØÁIì©iºlý`¡cÚ—Ñ” È×±˜-	é:%”ü÷!ÄŽ“ÒèÅøúèÜsÎ•|õ]'"ä)3è[2‚Ó’¶íôk0ñ.†á9b‘"šÃc"68ö @Ü(½5b�ø<€F"üL™ü‡†,\1#q¶ªßÇ^‡ð„+fI0	¿0GW¶.Ìt¢Qé˜Œ€+IF¬rRÆV
ï•Jâ<M�ï»;t*8J‹ d¬LÆH(‚N‘Y„�À·bßïùÍÝŸ§;GU£„¼1‘°e/ŒàMPäÌ[•ŽÀUT[¾ð$ËÐjÆfæjQ$2ñ¼Ü:]’»Î 2�ª'‡U«��w«d–V§‚Êú-#|Î³,'¶J7O™µð˜¯RÁpïÀÅp³
3ŽAÈµSçÊÚˆ
#„¾ˆ&ÞYÀXÈ5šB\w3†m�6ä"²grëBt|dòh7È[Š'[)p%-™œ“2ãêkER@š„—Ë=Ô¯döEÖ’ÛþÃÊqa±A”Œá	ÝµÐ Š[}wzF×"‚ýš–ãè Z�â`¨ÓÓ"+'ÐÁT¾kL}U	®Qû ÝûÎ;àiùÁe�GcÕ åF6Ž?¥‘±:IÔw·Pôò:9¬¾¼Âzºoâ¹„Œë[æ`6×È?7„oApŠu0¨˜[±2Èx~;rf‹°Ûã=¤¨.µß[ÐÛKtÓk÷A×“oÊY”îÇ5º.ÿkþàï(Eƒ %¼BGo!�G|6�ÜÞ2bgÌ¶}š>ækÍèÎ£¿óvÞu�Oo1Åïþï�Ã."A½†?¡E‰ŠZUHÉ�¢ÈØkÅ±­ñ,5ùî•HZ5�›Çï½ŸŸG7©I°d¼fª²°3ò(‡Dyü©ªAO¡‡‡Æelœ'¸Œ¤Y7X4nGW
+�bÓ�Ý¶T¦Æg„/^‡'bÉi4]ŸÏW–&}ÜÓZgq:à+µÄåóbššD1y*Bè`abvëV"çð.2¤!lZïaÞèEí�¡�	.l"?kq1ô‘<éLØ9Úw¾ïóÙí�ûÛÕ“Fö:Ãº|d‘ÅÞI)åslÙL´çÊô3å¤
aÑhžÇŸÝ�•jsyW0…5³>•2^çŒn³��Eïé(ù¥`ÐëaºÓŒÂÛåª0ÊEb·ÓB¸x¢ÃÜfŒ±\
Õñª]{gÞaÚÚêh?©ëkì¢³'D™‹ÒçrrÌZ®0>)‡�âõãÜFçjÑí¾Ñ¡3Ô×XÇèÿf’–ßûVEu9Ù’ÌmU÷ÿæö!ÜR�——7ûiþµß¹°%Nì‚ü/çüöWõ�SY‹Û0~÷¯˜Â²Ø!»¡¯u’¦]²t¡ÇBúX²<ŽEeIŒÆñ†²ÿ½È‰/Zºmõ$Íñãñò­+ä(µ Œ=“’¼ç“C¿z�¤ÑbÁ¾–ÊC¡4‚òà1ØKuÄÛÚŠ;ëN¤%C,xGá½æ;{X
+2¸Éº÷mŽë9ì0ž•0ðk$Xú.°q¥Cë4†B&i
“Êj¶ä/„÷–€K„¢ÖdÏªµ’h<‚2…¥J°²fN£ðG…MÛ÷ñánûy·
P­1.C#<äÊŸ¹0‡Fq	Ì{[“D�6ï,/"#*ôNH„ÇRÐƒýÖN$�¢Ú÷¡{¥qwòŒU{
-i‰Ì3	É µðBæ“:P+Tå4VhØÃü,f3ØA‡d„„#uŒp¥ñ ä)ýËjƒM�Cu¦•„¢6²åÛï¥5ž©–÷íôù’‹¸p®Â°nÖç:XMõŒ
+6áµºH÷çß‘Âœ§€qò2kõˆŽ�k2SÖ›5>)Ï>Nàú^
„Câ�„Êl‰,ýÛ?“Uƒµ£UùˆLwâÇ3O;.É6æÙ/ËöI¢—Ž|$`ô
rÛ�NÍG.’ô—®R˜\ã�‡˜vN­ö;îÈ2Êð;õ¶ê—vë<—ôeÈ©®Äê¼yŽ~�RMoÛ0½ûWðP v‘¤Ø5I³ni»Ø†Ùa‡�,Ó¶0Y(*©1ô¿R7Å>}±Dò‘ïñiñÖµ*”ZæžIIÞrïÐ_¿)æÙÕe—ð¥Uj¥”'ˆÁÖðØªN3H+ëzRMË�ËÞ‘Ax¯…ùŽÄ‚Þ”§û´Âå6X
+ÏJxÀ€
+Ü¸Ö¡uc!S�´†I•�-ùãÀ{KÀ-B´9L�ÕZI4A™ÚR'XY3§Qx„�Â}Â}\¯î>oîb«$Œ[Á°*å³°‚½â8Š÷6�D�¶:I¾ÊŒèÐ;![Akû-mdžeÁ¡{¥qÓ{Æ.#džeRïáÁv˜ _;ýI5”˜>1šÊÃÚ0’:Â^²?2J­$ÔÁÈÝn¥5ž)HÎWÖÔª�™þÅ‘P‚Ððlv^=$ãwÄL–
r$w«%[êób²Œ[ÊG.™þÔéQ1þ#öƒ¶¥ÐkãYh�xçÅP\ÌÓñ9û­’.x>¨Å¼˜Ai­>S@È�0ük—ù½$åÃg=5Í¯­F«V˜Ó“ˆæÄ‡Ý$úºuP€UrÓÃAb8Z2½æA–QÆ—3P©ìIÎÉ¸ÐØÙ�á%bp_Ì`gUuF1F'Kxe
£áüœ,	E=ipÈÅ¿˜4Èqàÿ.æ°H†¿V>h~Î~U�Ín1„ï~Š:p˜‰B"®Ù%¢D¬ÄO¤…òØ=±…×¶º{vY¡¼;ò$³ŸìOÕU]^¿«¡Â“K–©åèô§+ÉÛ7ýÊ\žœá[ˆ‚1&BTËŠ2â!Ä=]ÌŠÛR�ƒ¢s=Þs&|H6ÿ"VÁÚr¦›ay_xº>Ç–+mÆGšˆ±–ÜÔP©ÔDM›=\ÉÊq˜´°¼Þ†Â8¥wJoêe!Ä<ÞY�%Ÿ£&²BØG:ÌsŸ6·w_¶wÍj.¦Á*Và£<g‘Ç!j€¶òR&vWüRùÒd»#©Ö‚åMù1ÿÈÊ˜INè>&ÚEi7_ÛÈÊ;ˆ²u
+—¬6Y‰³MMñ9>ò¼2è·Rö‚ÿéuRt§ìfå»ŸT]…¡”ô¢n‡I'ÎmZÍôÉ<[qQr­íÉ-Øì}M¾EwËÞxU’ï¯°/ÑÿcÜèëkO‰”º~±~2•RM‹A½Ï¯xÇ$,¼š¨«kÄ€ÊâêM�šžšLkOWS]“Äÿ.ÓÙ$ !à©é®Wï£º–¯R—Ð°¤<É¦ÞÙwÛ'Î/žMÕ|Va†/�Ïh}`øŒDj��ßòm…‚¸—´W¿é7Åk�Œ7�âOVËX’F¾«�÷Û†_Þà‘kÊæ)â=¬XæãÃ]êK
+<A±�“hêëÁDó“à;QXÇh‡àNê#:xÇ13|lE{2/ñ)0eÆÖó®ô}Xß¯>=®FªÌ:2ì(£ñù Å
vÞ:Ø>Ë Žá¤9FžW‘zÎ‰ã¡#]Ë·2‘EUùh¬íXøè7ZàWóÙ¬œ˜aïÈ¾-†úÔQDÍh$ŽZôg¶A#Z
+ùB‡Ï  LÍ¾tÝ@QÐÕáÄ1/gêàÚ!º£ØÁ$O¦ÏQ‹„EuÍêŽA!ÈaˆÙÆ×š[Q.£§ÖXAv¨RÏ0ß3&Å÷ôï4¦Cá”ö¥#òî‰³$
+²ãæºý~Èö_þÿ†Ì:O*?Ø”�_Æˆy(–~^>8R8£®»ôùkf=-ÃÙéEp\©Š^mØÞrvêÓ‘pÜÚ¸¹ŒîÏÚŠoÕïê�TMoÛ0½ûWðPÀv‘¦Ø5é²ni‹X‡Ý°ŠÌØZI é¤ÁÐÿ^HNœûôE2ÉGò=ºxšj«2Zd�ß¾)ÇÙùi§ð¥1KcCP$à—p×˜53HS¶dêF Ð%¼'‡ðÁ*÷ˆ$Š^.öÿÃ
+'¸Ç…b1ÊÁGl‘à‚÷†ËÐôÁbå*ÐÞ	™E+žxWðÆHƒ°l­ÝW�ÑÖhtŒ`ÜÒÓJ‰ñnÁ¢b„µÁMÂ}šM¯?ß_ÇT‰˜4J`£*Ã]-¬`c¤‰äÙ·¤´¯ö”Ï3§VÈAi„»FÑÌÏ“"ã,k¹7Ý‹÷[\¥k„Œ³L[Åwä –„ú¾²·¦¦Ô,à“ «¾2RD<?3€Ð.¬Ñ°l�NÖ‡íµZŠ©wKSÃ‰Nç¦ÖÌg.´'&å.GÊ£�ŒF¯ñ½3~dplë2ŸMj”ož�«¯¡OÛ¢<›D5‹<¤åxZÙ¼ü3|'ÀÌ±(kÃ¢ì£Ëqº>g¿å¼jY:]°(G°ðÞ¾bF(-9X*Ëø×45Ê²&ºê#ˆÓwõ¯¹ò[¿Æ´:ó»yÆ±©:‡Ã
ÌóaòžÏsè¨¶»ÙU{•†ùqKäu\·¾«Êï©í—N,ÖJop°8Ü”#X{S½ê6Z“¸GCAÇ-áõ“aáb'ì!:´2õNÐI±+s6!TUDÖØûÊò_}×(±½ÿU4tóï^’cµz‰ž³mSMoÛ0½ûWðÐ!v�¦Ø5iÒnýÀ
+l]�t·…,Ó±PEH:Y0ô¿Rb'Ùª“Lñ‘ï=Ò—W¡	P¡¶Š0g!£åU¶yö¹˜fÃ†ðÜ†ÚXÃ	øž³Æq)ãÆ‡-™e#�ë¾�Cøj•{C†KE¯Ëî{\á|,‹Q¾a‹—Ü®CÐ‹1”«@{'dÊV<ñ¾á½'�¡n­Ýw�ÙÖhtŒ`\íi¥Äx7‚`Q1ÂÚà&á¾?ÜÜ=.îb©$L%°Q•á]/¬`c¤‰âÙ·¤´¯:É™S+ä 4ÂS£èÁ¿$G¦YÖräåtì¥bŒ™ÓÓ02Nê]t�¿7[\¥ë•©’…”ÐV1Ã/FŠ¯?Ì’’6Àß‚®b8�þÉ.†C¸^+‚k^\h%2�/�ÌZ	Â™‰Ñi¶¶¥5úÀòõU{ÇB­–üPaAGÎ,.•ÞGnŠ=‡xÎ¢‹çó„Yß´{ŠÐÉdrÜ¯/šjírß?¦i8ºÒkÏ‹	”ÞÛ£þ„Ò’¡O*õæò‚:½¯ºD‰zn‘5™ÐŽÛá–�_ÿ£å*‹?m±ùÁo«bkoªc[VÈ¬–³n!òÁa„¾†O9eWžjã7X�áÖÃÖ·°QN@<¼!†´ÕÞVi�¯£Îò�T{úñ˜òãéœÏµwµ¡UÞ‘%ÛŠãq&î7�QÚ¬ßñ<ª<Ÿ+^$“ò¢€1Æ¥ÒomLOá)•îÙç]µâ�õhÿíš`ZÌ�“÷S}Ïþ�TMoÛH½ëW0EPKAlc¯uìÍ6MÑ»EÑ´ÀHÆ#J":š�”cÑÿ^ŒlÙ‰Ó�øb›óÈ÷øÈ™‹?c¡Dëc.ÊdõV7eþG1Ë¦gœÁç†*r$
+„
+>6´ÂI=â*Ä
SÝ(ä¶€¿Ø#¼vÆEV�Ã/—ÃÿI‰‹s¸Á¥%ãávÈp!Cà26Ct˜€`|	6xeZvXv„oƒ6UçØ={B;²è�|¸5JÁŸCthaE¸îóþ~uýáæ:•êÓÆ(¬�@I²åÂÖ¤
hj^BÇÁ†rhyšyÓ¢Dc>6†ß‡ÿzGfYÖÉ>ô–ÞlD±í¦”Y–YgDà]h1ÁäßÖýC5÷J�Úè°E¯‡àÿÀôì.W†a(•T¤ƒÈ´2Špê°6v3Ëž	g¬S·CBì–Ž,T�·=ëí­
^”;«ùUðÕpjûïb§(}N“AãÅ–æh¼¨QS“oˆÑjàM^ŒÉí|Sß“ûÖ�ŠÙq¥AÕQ¥O»p¾ËøöcÑÖø­o˜¯`‚{ •Q;öQÛ‰î±ðò%œìÈ_3þ
Ó£ô'TTA~òÈ›ñïITòâ¡}dUÆ	ìØÑö£œ¦zý&’£qn¡c /jœ+—ýŸÃam¼‚h·Ò€Æ´A^“`BPí§ƒc_D9É�T3š2M®F½
+^Ñk^œÃè¾u^æ/Õ(¯¦Ó4Ñ	…iL—`º×õbTÀÉ|þ°·ŸØIòE�÷;ÿóé=£Ô0¿ß,Àñ\Ò-ááð—Œ5êËíéñõSêÑ§í]$¯ÈÞ8
ljÜ>C‡îö·ã.
ònÐÒG&£_/åa!W�Ê§÷ôÐXìöó|´�Ïÿ_Ì²?ãE‰“�Aî·ì;¥‘ÍnÛ0„ïzŠ9ä`	NŒ^kÇuk$ˆ�¶�$�AS+‹-MË•
£È»”%×îÏ¡(o~œ™]MÞ…: $mÓ 
+-KÙŠ×oòq6*2øR›ˆÊX‚‰Š¾Â}m¶t•¡%æ>ìÙ¬kÁ@çxÏŽðÁ*÷�X"&ŠÍVý÷UIÓ!h¥¢åpG
1&±f¡äƒ¥B¹Ú;a³jÄsìo=CjBÕX}LO´5š\$WyÞ(1Þ
,©HØÚµï>.æ7Ÿn’U;˜ÔJ°S¥‰‡,*±3RCÒðÑ7¬	Ú—ýÈ£Ì©
Å 4á¾V¼ðÏíFÆY¦­ŠŸÌšÛð[¥Åóß3f[ÅèåbÔê�ÍV	á¢:èãsznÍóÂ…F~ãMRÇÙAlVÖhT�Ó)Ë¥ö.
+7Z}^0<ñ<˜ä]Åt.ÒØ—ÓŽÅõ/½N�ö)��®Jº|Íúþ¾ÀŒIv?÷òôÒ]�þØ}MrDã Å¬ö';¿§£�Ž£îü†Ò/‰�{´œOt9]“Ì½«Ìz�çÃ¿x˜-ý‡Ç=û¯¤åŸl†gk=1}é÷úšýµSKoÛ0¾ûWp@PØé#Ýµn²tm‚
X·ÝN](2S$ƒ¢“kþû Ä®•¦k·Ãt²Eò{ˆäù»²(!C©aì˜”ä	¯Jtý·Iõºták¡äJ#(¥ ›ÃM¡xÁ&ãÒ–+R³‚!–	\�Ax¯…ù�ÄÎN›ÿ“Gp‹SáX	°B‚s×\Ë¢D[jô‰ LÒ&5­Ø’«	Ç–€„¼Òä#»ÏÖJ¢qÊä–æ‚•5GPja¡p¹©ûôñrôùvä¡6Æ¸Ká SnË…,ÀÞ¼³Ii³Ær/2bŽ®á¦ôÑ~ß¼HE•óºŒôÌ ˆÄj’+ÍHénHÚÊpERçàZÍh#öi¡$Â¯ ×íÂp!¨��…dK+/Á'”¤‚:ùö>�¶×ÕT+Ù’M&ÒÇTIŽ÷ šÚ¤&õ§ã�êô^?OƒÆU„cÅ�‹“3XX•…¨¹P3èÃÝ}­ÔŸÜ
+Y@¼Ëz<˜!?ªuqÂAgÞ\„rýQ9Ämôx0¯\]�q•YŠ“§(�Ì»{ï;(š!_¡“¤Jÿ'éNå:j¿¢PÔ¦Óq
šÀNŸ’rAv	—mŸÝx“>ú)qËÖÔ§Ñ.aMÖëv·�.	¹"ÓbÝÝ×¡Þ³]›!sHáKŸm'7�Yc†ýZ»ŽÀ±à�©�½úX3ítËí_~�¼8‘T™­½!exßNí€*Ï…vø*ìµ0™ð¾ÿ
œ©zŠ]¯ðx[0µVCÇó£W{\í3]YƒÐ‡Óÿ²Xñ›G	ððÜ³½E“ÂÁgv-DjÓÒ¼ÍÃÃ¿X½½9ò•ÍË¯£ß¥VÛn7}×WŒ9Þ5¤}µ,Õ‰kÃAZ×°ìô%€AqG»„)rËáJÿ{Aîýb×Mõ Hä\Ïœ™áÙ¯i’B„\2ƒY#¸}´ûiþK8��àîA°A¤ÌXÐk¸MÄ?ŒÀK\ètoDœXx�Bø$™zBc	Î˜Qx¾*ÿˆp1�%®YÁ\c†Î¨<8O“u*Ñ	Sp­¬«ÌjC…Ã+mÀ&ëLJà•w'-GEB­µÙ0+´š@*‘ÂVàÎëýþùâòfyéLùÄlÂ,ìA$(÷…ì„MÀºäIg†#p•)ŸŒÛ ¥Œ#Ü&Ì|Öß<"³Ñ(#—âÎ3Pj„²ë™?-¯„Äåž,nüÏÙhÄ%#ò×¿é�’šEhàÇàäøÎ·ÌÀRÄŠÙÌàW4b-Ð¸ œDjÄ–Y„1u%f£¶‰‹ùe›%š­àØ3ÀÛ÷]ußÆ¡}O7m\v¯­M/¤@e{jIuU(¥ÙJ
+^øøÈµ"k2n/à>
ƒ
“ê¾�UœZºK‡Z²…@+e/5sŸ±#ÎtÑsóÁBuÔ:8µ^y:JÍxò‹y·.�»òbÞ.‰;z®ª™«Ã¹MŒÞ”d½bBbtù�cêjÖû¬¶LŠèšQÒ•9¬yTØ
–Yšjc1ºÃ¼�Ç&ÿžúZ4ñv‰ºvr)äÙ•fÜiPjN1Ú#ƒ0,çµ×BÅh|³ÂT&eãV¬¡¡Ÿ0ªø•j„1`¬ˆfëj½¯4ƒ–ŠW+<Lú7enWýÒû¿(½S•³«: j#qÃ6„aËnXóä¹Á ÍŒ…;ý�™	´¿¢!¡•?¯2h¡þ?†µgI�>¾îFÂ832<ÏŽºT®K:…3H©vËcÞïŸRàM5¨QÒã Ò�.-3Î‘¨O
ï×¥æq|!»>5Ü§Ø$ÁQ.
VW‰‚ÿ:¤S¸¾¿¿…!FGŸøtÁhi�PqQ 2Ì­Ÿ£:rèS«…HG¼'ÜàL‡7îäÍèãŠÑºªæNÃ×'í}�V&�3Ë\V0Æ.Æ?�o…íƒÂï)r·ý=”hŒ6°KP�Á¿3$+Tì‘>¤a|óèÿ@"ã8âr9šm�/w$¼Ú1ùJáþÝóŸº¦;Ÿ^œ½“¼‘|KO€Ãö0~ró¦9fÂS �J£:e£¼u�´9úqóçÍåóÑàXò�Œ”˜ÜL)KSƒî!¥‰ÄJîo2)?š8Û4^]ª£ÄôoX�¨g†›e¸CÊdcôÖ¹�iAeQYO©V´½Û>ò�ÍuðZTÓÅŽQó¸]ël ug½Â²—»kpÂ¼«À®3�ÒV˜ÓQ`ôMÒ»†Ó«yÅh/]÷V­ØŸYoØzã„QâJ×¬ÿe1#Ü‹&èÂ�kÌóW¼Ã�ººêN£Ø‘?‰y5Àþ2ZÅPz:€2Ôb^9OÍ�¾ºëÿàí‚j—?�þ­V[k#7~÷¯8g3cœ¤}X
+q’¦Í:l mRèKÀÈšc�ˆ,
Ggì˜’ÿ^4÷›½Ùmýä‘ÎõÓw>éê—$N B©aà˜”äït×?…³ÑÅdø+VVJ#(‰ »‚/±Úâù2‹;›ìI­c†@†ð+„ß´0/HìàJ�ÁÛeù}áÍžp)+aà3¦HpåÊ…Û$NÐ&½!�´†I-S¶äŠ„÷–€c„Uª5È*»·ÖJ¢qÊ¬,m+k¦�ha«p—ù=>ÜÍÿxšûPYc†�p)—çÂvŠc`ß¼³)Ii£²å‹‘t‰�_bAö9Cd6¥Î×e¤ÏKáÐ[ÎÚË2ÞØ¨»¦Q�cÁRÈ¸ç`“}gÉ!/�ÈÒ"&ÒHÝý„”áU¾ZÔx¯4>íãæù“"”liÿUƒù«ÄÄ‡<déÿÛË‰¥c’Ajá\nk­‘àŸÀÅd·[Ap§ÕóŸ)'){¬ýVBj+al³åÙ¨í°Q¯õmI­•ús‰P¾�.µ’5R‹…´Æ1¥’ƒFâ"SXÔæcO‡³›|®ëbüæÛpt•÷x$`œÄ‚¦P¢ã+SÐti­†±?ëð¶VE�ÔLûÆW£ÂµrŒôh¥ÐsOˆ¢Û ,úí8x¢™4™¿*Ÿz4kgC	a"?Õv9ZÞg7käz+ì VäíuZiVg“}�Á”E+‘
+Â))ô
P;<U+óòQñ#tl	»P×¥HÁ2† Eðjˆ`ŒÝî9&»ƒ;(Ì³Zî…ÒU~A¯µbÀƒÓ¦¬2·K8q§ScÖîïèœXc†­ Í¢[&Ë(½V$^#çS„—Íá¬!ä”L{Bf_‰š�u=Gf£?E¢Fag7;RŒfeÛ`U@ù{J™5œ8`›#T
+tIáž˜üT„j´¶ªð
›Ä­M�i¸úë 8d8…þø1l�y1™äÞ¸ÍèãàQ™—;Â!î¦¹8V2<p Ù˜|Ë�”ŠZnè˜bTÿ`)êŸl¦‘¢³ôå‚>|€ò%åþ&Åb©=›ÎÑðè¡º¦çŸ9Æ2ìŠDç~�²äCè
Ò1ÅÎ»2.%œ½
Gÿæ=*ÿ­YiSeý.¤çO­�¦ôdÚË(Ãaawg#/±}QÆwêP‡UÝ›ë�R1tÍQ‹P#ã÷kø[=È­7\À”âQèp¾iWrÿ<÷·üÍÛ={Â�ÝbtúÙû¦S;ò@9¤ê�w\÷_»‰gÁÍG—g!Œ‘ÈØ)¸¬þìÓñ€à¼Ú"Â´ˆÜ{-t 9ÈÀ¢WU¿ãapªdo£…�ÑkÛ0ÆßõWÜC¡vHmöº¤YÖ®e�±•uc/s‘Ï±˜"‰Ó9Yýß‹œ¸k©Ù„^ôÝÝ÷ÝOów¡
P“¶È”Ea£¥’C xù&Ÿ©r¢`ßZ¡1–ÀDÈ¾�»Öì¨PÐw\ûp`³i2�Ã{vWÝ/b‰0Gv´\ï¢¦Åîi�Q:øH1Ìã ,CÈK©ÐÕ ½6ëN<ÇSà­g�– é¬ý”žº­Ñä"�q�ç-Šñn
+ÁF‚�¡}?÷iu}óùþ&Yõ`Ò¢À#Ô&³¨†½‘$ÁGß±&Ð¾�KåpK1 &¸k‘Wþgÿ#3¥º˜ör:%÷îÕ†¤Jä$Î”Òc<N¹(h-ñ-jñ|€?
+ œL`¹C†Až”½ØìPÎš£>SG¹[[£ÿfV),
+wZ²ÁaÉOéœ%¶‹Å©—Ï|SùaÜ}CòÃ¸Úïã‚,cú³<&éØ�£ýhgörŸ‹Å†äK'¡“,Ÿ¾þÈ¬ª>¬¾Vp^Åéjïš2´ÈW(…Ð6X:Ïóÿ!}wæ·7õ+¤1}iÔáHO+=¨G}PMo1½ï¯x»(	êµJ5RTEJ«^*!ã�eG5¶5ž…¢Šÿ^–*TßæÍû˜çÉ‡ØFÔd�*“
+[]è.RºW�‹Ñ°À_[NhØ8!Q„/-oè®À�ñâNxÕ*J[á£xÂ'güOM˜ñ4[žæ»š¦7x¥¥IÊÆã3u$˜¤0‹m¤e"Œ¯aƒWáe§ARøÚšÎ9Ø·ôÌvlÉ'û&ÈÚ(ƒèÈ$Â†i{Ð=?=Ì¿¼Î³Õ¡˜¶F±5	5§cÕØ²¶Ð\>…N,Á†úTyTx³¦�%¼´FžÂ�Ã�Œ‹Â:“ÒôI�s$ÏÁ
‚ßŒ†CÌ6F.9�Æj�]¶Î¤(¼1J4G|\ánéØ¢é¼ÍÍ°XØà“Jgµ¼jwÒW}x~ƒ\êvÚop’×ûëQ+Ò‹„rî7,Á¯É+ôw¨Þ_6;Kæå9œIÞRhð�}¶éÌõüæü„´ÿÏù·Ói¯½¼¯¿©ûJÿ7ùæùWàúªÉ¾Ø•QMk1¼ï¯˜C»ÆŽéµv\·iB%„¸ôT0²ôÖ+*KâIkcJþ{‘ºëÏR¨NÒ{3oæ�¦|ã¡HÁT†ÈZÆeÜ{
+wïªI1à[£jm:ÀŽp5^½¥Ûqïüžõº‰(e…�l	ŸŒ°?‰cÀT°¥ùªß*š
± •Q‹/ÔcúÂÜ7žœ7”€VA:Y¯Úè8t‚�ŽBÝyPOh£%Ù@Ð¶v¼Q;;„7$a«i—y_ŸîžiT^,6"b'”´Ha§cƒ˜–®eI�Nõ+�+6¼�„—Fð“û‘™…4"„\\oµ$ü*`<`¾œ[¯´NJû4)5=ë­ˆ„î“âšôÙí¬qB_ÑÔ¡Õ}»2Z¢n­L`¹”Î†È­Œå™�ƒâðRãdhÕí�ÎMŠd4ëiîNm_ÀŽ3ìÔf½ýÝìšbòòÈnóJùëÊEë½ãHª+$É|©Þgß'u�òÂähÖˆ�`eOÍÖŸÅ†Êjˆ³âwâ �-«êtët˜bËö2€LúïÙÇ ºþ% ”Êgn®>ÞNª£ê+~åUÁnÛ8½ë+¦€SK†�`¯uâ¦5²Ù‹lP7ÛK€€¦FQš$f(»Å&ÿ¾ ,Ñräíe/Ë‹(òÍ¼y3Còü½+ä(µ LÙ“’þÁÿpÈ¿eÓäl”À¾”Š¡PA18Al·¥Úài5bnÝR«ÒC*3ø@á£æ’g8dðrÙþŸæ8Ã—‚½þÀ
+	Î¹]¸t¥Cë4 “ƒ´Æ“ZVÞ7„¿[_"•Ö #{@k%Ñ0‚2…¥µðÊš18�‚6
+·µÝŸŸæW7‹«àªæKáa+rÅ;.Ìa«|	>ˆg[‘D�6o%Ÿ%F¬‘��·¥ Oö¾ÎÈ4I*q˜�)ã‹i½ÚÞÏµºÿ«ò®ò›#±²¦ýÎ­aOB?M©3|ÆZÌ5Jo	þIÎF#¸Ü‚�ÏaXv¤6Â#lCÕ‚ë/ŒzÞdMX…ùiƒi<UK­ä^ÙÃC„¦
gC’5!…1ù›Ìvp±�#l>õ¢¹ô%ÙmÔxõ]¢l¯FÂuìiä¬3™£ñªPH0Pq>Ž˜†`nu°
^´[â=¨Wlž/íÑKk5„!ßV+ƒy½™½ƒEåœ%�yÃÛÉP,œ©´~ìZxäXÏ:§ÍÒEmÒ”4ŒÂ
+YBµ€à(¬[–âHÕ»\a¨Ò7}å“™´k§rä›ÌVè›¬¥Yöœ1Œp˜•©pz°ó”ô£Ê‹�Nx|„ã<“™âkBá‘¾”Â´–?ÌNYtª8¦?=Š?HÛ�á^±^È`¬\÷4Lf[R¿
+2Ê¬Ò£a4WÈË€0†''üNx8~x�Â±Æ4ûƒNÎ÷OAÀ¯øùŒ‚ƒ›-ŽïdÓäèúñ¦‚~cA·€ý³öJùv­rxºáí[è´O)x¡VFøŠðŽôË-ônƒá�…ëÛkˆ™þ=ÐoÐVÖóëh?‹Óc—Òó
+×ÏÜö^°~ÝÚ‚†Œ¬…—¥2+h;°°•ÉÃ…'üf8î>b“™à6×‡)Ê¦Çâ&ô™Vsûò>%ÿ}‘ÁnÛ0†ïz
+ZÔ.’»ÎYÖ®h±Å Ým@¡ÈtDD‘‘N}÷AŽ“Å;TIùü©É×h#ÔhœNX°$2ò*ûˆüåSY©Ûk×ðb‰¡!‡@Q'�ÐÀÜÒot!î­¬@aJ¸Oá›Ó~�I&:y¼[ï75NG°À¥f!íá;¶˜`ÂÇÀ]´Ct˜AûLð’hÙJHÜŸB±Më˜=g;2è�|ÒF?‚èP3Â–p×Õ=Ï,³TgL¬Øi†šøÀÂv$$›çÐ&ƒ`B}´|«¼Þ GmæV§YøÝM¤RªåÜ—7™yiªÿ¢û�#¿>Dûò'r¸Ø³à¦;fùJ)ã43üòô¨î2=‹và› ¯†Ñ?
+ ¦ h²‰3‹£2\D«ÓþÝkd!ß�«üÛ@u/•×EžÂxºBùÙJl¥(ÇÓ]"Á™oBqJË«7\\=“_“_Á%ƒ¸ä«Ñ:žj^H"¿*ÊÑ€{þRžDËJ�ÎýÜ†Ä^5ÿÖý’ƒkçZlîñŒ4,P?®<o$oïê]ý�TaOAý~¿b1äÀö+Õ*FªDLúÅ„,wƒ·qÝÝìÌ�¤±¿½Ùõ€;°6)_à–÷æ½™7{§ßln!ÃT	‡1±“)Ïxm‘_[ýè¤ArI°�
+AXáÌ&¹\b7‚€¸0víäSÎ§-8wá»úœ
+§ñl¾yîf8L`ŠsA,…†k,ÐÁ)mÎlnÑX…Bg�ÍNÎ6ŽJÁ+ã€s„E¡¤[u�V2EMR/Œ{,�NÀ*„°”¸
+¼ñÍÅèv:ò¥Bcœ†• È$½ka+É9°ožLáR„Ôd›–O"-^�¬H&¹p7æ1L¤Ey_:õÊ¡úÌ<óM fê×ÿ'ë¤æÅþ)»™C«DŠïÿ”WRátMŒ/á§·Ð�¢T	"ø)ufV�šX(…ð•QgõÓ_€ur)Øw¥‰ar}~?›ŒÏ/F×wãËÑ= ytN¯nÆ£Ûó£££f?
+Ô“vÎ–Ây£R?ùqT+6_¬Œ%Üs%Ó]{³YÐtEÊñ…’�wÛ‚¡aÂw²©º-Ó*‡ZÂ¡æ^¯Z£$¶ú[TÃÇÖn
+À êÉÞJgÎ0¦>ì­9¿MñfºÐ°¹p	ìž3$–:¬U«K#³Ì…%µÆ8p¨¤~Ž«�	wøÿé¶áÉ[ì4®¶Ôš§ÎÐ_SðÈ¯I£ãVg(hrŠ[Ð…fw.¸Ù*÷¹€÷t†OÈ—ÒaÊÆ­÷˜ƒÁ îã3tuBVpþ`ürûu=þ�Ù/MèÂNö•`¹ÄIÆŸ*Õ¤vA½*ÂO•K½Ù•ÀwËX¹ß1¡Zôzû×/©J$ûû|¸GOÈï·ÈOlå$ã�^˜¸fº|×ÄÍ±ÔÏþ‚°�cj&‡-$û±TbØV­æý�QSápô*‰©: ƒä~H5K{x‹Þ¢?�VmoÛ6þ®_q<T
+”fûÚ¤N:#él]gÃ€uhêdq‘H–¤œEþû@Š’©7ÃübŠwÏ½=w4¯®e!!CZ…±6ŠQódöõû“Ëèâ,‚3x,˜†œ•Lƒ$Ê€ÈásÁvø6§±r¯Ø¶0Ó>(ŽðSIø3*£áŠ(Ž7›öûm†ËÖ¸!Ú0Âág¬QÁ•nnd!QÈ­"žÜ(¶©�PÚ;¼
+L��×e	´ónµKF‘kÆs¡*b˜à)È‰FØ1|q¸_îW·ŸÖ·Ö”KÌÄÀÑ�1ÝøÂ^˜)ÀØäµ¨E "kS¾ˆ8©PKB>DÝ‹/®"—QTk§Ö3h©7ù¥;õŠw¬Äõ^¬ÜÖêÉÿ@¥™à_>ðÌoW‚k£ãæ£µœÑÞ�´'?*$ÕcAøoêökMÊGqr-‘²œÑ_É¿B�ñ¿Çd¡…ˆ–Dk¸çÚ�²\£Ú1Šð-¸8;ƒ›QMëýY•+Ás¶µ\X±TlGÂBzñe4„å
£¡X+™‚=àÖöÅ~„R^0j£Ç×É†°•¨$1lÃJfösx:¡ä
ÉzS2zè¾§'êŠ[S;»åëê•a¥¥éktEéªÐ—·ñ‡	4&Síç¶*�>£r�Ä7�];“çË6n×û�ÿ Ëc¨ ÚÄ†.´�b:äÝ�)à|€™âÓb¦jÑ€_§ÙÆÿ�Öãu-¥P³l®½…j6)<à×µÁÌdÏƒÏÚÛjÃ¸¿<7B”°¨eF¶Í“¼ƒ�`YÈÊn8ÎM¥çË-šÑÔÇIP’Š<£ý7”»g¤Õém…{4Yàˆ�µr§DåË·åIüÙÅrˆ¿;BÐù’þPóØ9NÂö´K¡©?„÷Í6c·mL¹-q’xèŠ“Ì6êù’dÙïšl±±Ö71LpÈé ‰Áœ9Û¶vqOË.Ž/í��3*I.ÁO¤²	Nky:Ân™ÕmBÜ¢éÜ�ûkÜ™éŒ“9/!
Ó-5#é„É~?÷ÄIØ2Œº¿ü»Y?žñè$ð9’¥à�7a«”¼ƒ±©oƒ!™·Î§(r˜zžLOÍ±X§'ª²ï‘ð&o�Ž]÷Z‰“†iRÖ'p}
?ÃàÛ6ž}tõ[Ú¿ëâ7ÿ|¯ß¤3žý~mãÛQwý59F'½Îâ“üM„5Ñ�Öéñ‡ÝÉÞIÏÃßÝWÒþw½Fÿ­VQoÛ6~×¯¸.,Žƒí1‰Ód�‡xh#ZuaÐÔ):L&5’²cùï)Ê–d)m�ñEÐÝÇ»ïîÈ;^½Ï’"ä)Sj£ˆ›¥Ùe¨Ç¿.ƒóÓNá¯„4Ä”"�†Œ)2†YBàw2Û)zN„|·J üž2ñ7*£áŠ)�7«òáõæ¸bÚp�9*¸Ò¥à&K2”YŠLDÀ¥0ŠV¹‘J{‡H&Aˆó4¾÷nÑ)q�D,Õš’bYŠL#l·nß‡éÝäa>±¦\`&a¶LCDºð…lÉ$`lðZæŠ#p•!Ÿ‚­QgŒ#Ì¦¦rá2r¹¶H¡
ÌîgË�·>>-?MžæÓÇ‡Ë¦rúÐ­|š|˜ÜÎ']êš8Î·‘—¹0
¾š¤X¦’E5Ô´ÎRaCª3EÂÄ…ÔGø‘	ŠQ›Å,É&¥Ñ'ü''…k,ý¶€?¡zê2·¸Ki1YÞ¥{ÌMSéí.¦bÃRŠüïä…cfƒhÅúïeð”i
wr�1C+JÉìæ¨6Äþ
ÎOOáfÃ®mÕ­8S´a¡'=£:ØÅp„%Qƒº¯»9-Þ]‘UÎ�T#ôÖòUJüP¤år
=GOjèi~> »zöDŸ]0¢hÜF°OÝê^ƒVœ‰§\„6ÓÐË¦°’2­¸¥Â_œîì:aº<á ÊÍ.…&WŒÊñÀéõÀŽ´ÎQÃ¾~óétâµ7h	^žÑ¼T ±TÈxá~�ÃV§À4ôÔAÔd©·d¬
K³©³‹ÛvS5$´a‚£ë�-7â¢ÅŠ‹ÌvèqÍ–ãë-Ü¹ÀHÔƒ¬.£v¶Kû›ÂŒAà¼å°Òe—­û_�3—†Ž=|iËÎ�ù®µNAÔ‡Ñqß¬iM³‹w{¢Ê3š�]s¹ÎRBV(ÕZ(Å¹üú
Æeï;Ávõg÷³2\x§Á×7Â*7V@r�ýá›V
+¶LÏ�"ñÞFW*Ú‰û¹”ÙÙL"Gøíx[Ë–ï]‹¶©Òu1\µš³-¬ß“Cbþçâí‰ºJ5«'¤,M1©€qãæ@ô½rv°ÿùj½-y­tÖz‹vˆÐ'äG›sÐÐûÂ¥ˆI­§E&ÜSlo¹>Oü”¬<cŽw2¥Ø®,Õñ€ém™$ž»JxòEæ
+PlHIáŽ^$Q»RiÄ5	šÒñÎ½b¤‹×Ÿ'�0}±Q±øN/ÄI½žþ-žÔ€'Ã=í=ºÚ¬k#ùìz«Èàç"š°«Š¯gÙ�ç}²Ã¾O0±Û²Ýûþb–jÜgü5ømRßkÛ0~÷_ñ­tÄiÊ^›&ëZV[Y}	E>×ÇÉHggeôrâÆi£'éî»ïÇÙ×Ÿ«²BNÚ(OiÏZVò\Q˜~Ê&Éå0Á¿K(Ø8 R^à
+<”ÜÐ8A‹˜»êÙóS)Hu†/Þ¾eÿ�—€kå-Ý¬»÷8§ÙZ« ¬,¾QM×¡+ÜTeE®2�P6‡vV<¯kq>ìïœ‡”„¢6úU=¢
k²�À¶p~£„�¡2¤¡aÚ¶sßïç·?·‘ª
&¥lU@Îa§E9¶,%$†®öš ]ÞE¾L¬ÚP¨”&<”Êß»e»‘I’ÔáµtÇ†ÏAhÓ^ãÈ¤ßoG–sÃËŸµTµL’D~ÑÆ5Ê,È7¬	ÿ¸qÓ(�[Û°wvCV¢“Ø«<7JçtèM’ã±�Æ»	×I·ÕzmX£¨­Ž›Ãj¥�
âk-i_¶¯3ê˜÷TÙÞo<çq³Ó7&ß@w»Òôà.>_N{ôqY”vÆy±¿eWhç=;\ =a‰me5¹�ls·
½¬ý8­ÏŽSXÚ¢ÓM_3âÙ>¥ÆŒ×JÙ!é>GgèCo�þr��fïDûË¹˜m==*o£Æ0žPy¶R¤ƒ¹²Ö	r2$´ûÓÏ>†³«Ö3b«pµÍÇƒNšÏŽ¨³Irôö$µ·'cõØvâiÖ}Â—ä?½TMoÚ@½ûWÌ!ŒP¯ù Ð(i#Ñ*‚Fê¡R4¬¼í²»�;EUþ{µØÒ Dé!>ÙóñÞÛ7ž=}Ë‡LQ¶FouIÎÞå'Y¿›A¾–V`n�ˆÈ
+a×¥­©—Áºâ<ÄÛE©Ð19ŒØ|pè«À)²§álóÝ+hpSš¡¨EŸ¨"†SÙ†±Œ¢£Tè0Á+ÛY¥�¥%¼ZÌ+çÀlÙSµ³†¼X?¼DµÁBt„BP[º[÷�¯Î/¾L/Ôú`Z¢Â
+V.*àÎj	š/¡bC`B±9r?ó¸$‰h®Kä«ð}íÈI–‡"0š‰2��W[¿˜*£Òbv-É«ÀÓäŸ ßíÂ°F†	ýªH”ŠÄÑT_¢ÑÀ«$"G¶5*ÁÁ¼‰ŸdM¸š9k`^y“<€Û[¼(WF;ÏÂnpòVLz’
Gƒ6g;d)}¿Ÿ’~“©”öÓM‰kk¤yÉ�¡¶Ø!í÷!røAF�)±‰ðARÛw4À¢Ø€v¶é§ª�ÒfV#gQ¶=ûÊÞézî2¶¢—ÖÑ8`AÜÉó-KÞšÝÊ]X-«YÏ„å2÷P~\÷>V–?Åwøÿø_ÀwÁ Û1¾}¿�áãÄüZ»c‰Ü³ámNh”^+±°œþß›ÉX^?²v�Fµ»j”Lº¥¶Û¶ mW¸“?s<ì“Vìÿ±eÃtŸým�ËnÛ0E÷úŠ»ÈB
+ò@·¶ëÆ
b4@Pq—Š19²ˆ2$;3²cù÷BräU¹â�÷ÁÃÅ—Òxv‘„k5	Î~Ù±°~þÔÌ«ÛË
+—øÑE"#(
+‰!·xîÂžo*ŒŠû\Žv�¡v
V’_#¥ß,¦X�$¾ÛNó�çå6¼%µ@	ß¸gÁB§ƒ»ÒÎ%ò %—“IØö–E?
+×Y`£íc„;·ê'e„Ôfy%9]¡D&eìFßÓãýÃ÷ÍÃ5‚YG†)|ÐS{‚u°^s/Žá²Ÿ�o«D¯¬…ã¹#yÌ?Ç™W•‹¤Š§ì(®ƒ¨½°æ¸i·1!ãÝüfœ¼bµUrÿQü­ ôÛÚ>¹üÆ®7®_øOÏjì‡æ“™eÃ²Žq¡§M3Ã>ÿ5¬éæzIÞO¶úb ¼^îØÖä,Ë±nÆiXÅ@z–6ÍüVH8Ùl6½é\{’¼WïÕ?m�Mo1†ïû+æ�DùP¯@iHÔHQA�•ªYû…µblwf‚ªü÷j–Soë™çÕ;³o¥)äá"Fjœý¶c�~ý2žV÷×]ÓÏ&(mB¥Âb”7ôÖ„=î*ê‰§\Ž¶�ÑÈ�i!	ô9½CLiÆ’ðPó�Çü†Ö¨Y-p¢ïh!4Óáã¡4¹Dt qòär2	ukYô¸ÌBÖ€6mŒä.éƒCRPH›,;¶�Ó
•VÐ>àÐï½¾<=ÿX?wª¾˜5lt`%ô”O‡`
YW^s+ä²*ßW‰wÐÂôÖ°¼ä_ýE¦Uå"«Ò
+»lXQ[AsÜ‡´]›°a{$|’WZÔjÂî?ÄßŠˆ¨´uŽ6mr]Â\k­ð§…|}Z†¬!ûà@WzzŒ'´ÏÁŸU½ŽÉ&“As!§døº�³÷ƒytÕ]áv¾…-ÙY–ãhÜO¯Ùq\ÄÀzAÇgÙgõYý=PËNA¼ÏWÔ!!×Ø„—ˆ‚EsDBãÙZO‹afÒÓ»Žåß£µ1·~Ô£«—W5VtÉ+gÍT‚½Ú®²]^ÌîüÄáÏQzI„4T¯†Òã1ÊÈ3‡=â®Ô�Ê&faŽÍÄmòù�j
K¯™×ëcÖñÛ)V\ûfâ3~p bÙŽƒë+KMœ€ð¹C(ÙTÖƒm†ß‹Â"Ñ)!|ºOè$�¹’û¢ïÞ¤äSÔDßˆQ¸Ýó~>ÜÝÿZÝORû`½aë:i/vØŠEØ¾•AJwŒ|î²g«>�ÑëCyÙdáœd£öÓâ‰­¤Qòfeê�›þ:¨Ã:I@?ä0�þaŒ³'þØŒÝ¤x SWÔQñ¥ŠùWŒEº…ûçþ…RËnÛ0¼ë+æ�"’Çè5Ž]§AŠ(‚Àî±@AS«ˆ(M²Ë•£Í¿”%×yÝ“H�æ±£ËO¡	¨H[Å”Ga£å‡ìÅéÇb’�Ë%¾5&¢6–`"‚b�¯ñÐ˜
�gè×>ìØ<6‚\¸bGøl•ûI,—ŠÍWÃù¼¢Ù–´RQŒr¸¥–—q¸˜‡&�–ÊUÐÞ	›U+žc/øÅ3¤!Ô­µÐõ„¶F“‹ãjÏk%Æ»3K*6†¶Ýw_ï®oî—7‰ª&�lUDeâ^‹*l�4�>ú–5Aûjˆ<ÎœZSJÅwþ{·‘I–µ1ùr:)#6NêI–©UVZ ­ŠWýqA¿ZŠBUbYPôvC³–Öä$â}ÀïÆe‰ùF1\kíŸ÷‘å¸ƒ6%„GO2ÉöwíÊ}d–äžž$Ÿè„û§âoªÞCš“´¥Ñ,Qcú8éÏ{±Cþ×ª=ú¥j"9:Xv,(øhÄó®Ï0.Ë½�siØoÓÆ:Â›'M!)ôï‡=x!�ê=Þ½�ýGùM�üÅ¦Ó®’â“¦3GÛ7óþGÉO¯}k+8/Ãbp0‚‡Û«>ÄÓ³WîF³G’»Šœ˜ÚçÅh¦âRØ¸Ç¼(ŠÉÁDßE&iÙW7š
U¼Ê>ôøœý�Q]OÛ@|÷¯˜J‘°#Ô×R(�T!””·JèrÞÄ§wîî:!ªøïÈŽ
+­Ô{9�wfçÃÇŸË¢DNÖ¦T”�Õ{]—$'³QrÔOÐÇ÷Â	æÎœ 4¬ˆsÜnIÃ
â<–kv‹B‘Úg_¼	?‰Upl8Ðé¬{sbJ3#êLÀUÄ8–îÃiY”KO5&ä°1(»Y¥‘¥¼Œ-óÊ{Ø­z�öÎR‚óÈF]‡(=!,­Þ·ëó‹›éE½ª	¦…Q¬Œ w²Ñ¢+§´/±bK°1ï"%Á<�”ÆnÃ×ñGÓÈ(I¬7"øê˜¬Þ±Ÿ�D¿$=*…\p6ecuB¿*¥¼æoQ¿8ê÷qº4Œ+ÕòÜ;
+ZkÖ£’ÝÒ(¡WlG£¤#57úo¨ÛD¹²yØ¢Ú}ÕÌ;‹ylÝîï·ÐtG}G.kMÖ§W÷3¿q²ï¬=%o*ñÆ[ºWz¼ûÌ>aÚ”?¡2ŠÓÈëu7GúaŸ0FîØ§Ù®Íú0iÅ¡s¬¼¾¡GM_É�¶”Öt²b_ß'x­µ m´^h=&©|SÃëjã‚LžÖÛ²Q²¢e
ÆNn¢^Æ*äï´Bóg»BÒw\‹[ÜuÆ[R#>™*»°H3q04bv#ˆ[Lþ™b³ý� [îfiÛy#Ï_)‡x1´á=%Ï­”QoÓ0Çßó)©U“j[âi]ËÆØ`MÓO€&×¹6Ï6w—¶ÚwGNÒÒ´{?5öùþ¿ÿÝ¹'oB @maÊBFË½<äñËl”äÃ†ð¹43cCP$àgpSš%PGœûðHf^
+¤:ƒ3ro­r?‘„áD‘ÃÓéúû¨ÀÉÜáT±åàVHpÂë�ÓPôÁbå
+ÐÞ	™i%ž¸¼ôR"Ì*kAoÔc´5#7óô ÄxwÁ¢b„…Áe}ïÓÕùÅõÝELU“R	,Ca¸ÑÂ–FJ�hž}EAûbm9Oœz@J#Ü”Š®ü·º"£$©8r9•WÁúGÝ]dœÌvw…‚çQ’h«˜á½«¦gÖ(¾Eöv�¸tÃÙ”…”–[üU!‘aõ;È‡C8](‚Kcñ�_:ëU�Ùãq ³P‚Ð›uŽGIsZM­ÑÙîïµw,TiIwòí$ÈZù¸z±z‡“nŒ÷5cðÓóÊÔ¸J;V¡GÛŸÙ1ÜÕ-ºÅàÙˆ§Ç-
+3ƒôE÷Âá¤T\—6Í¶�ã"”ŠÜš]èñW’îŽ6WZìÚnœ‰hoGkŽÒjNß	7O³QÒ!lºŸÖ9`�2�Ç0S–ñÿ!J§2û¹¬×Ê¶ƒÔ°lç­D—�®[w©ŒÅâb¥1Ô½êý;éö$´º…×eljž·¯åÙþíUŒÔÔµÈÿ@-ßa¼~›é À®×^EöÖ.áÙ´ã²}Ïé 	|œçóšæHû‡\“/^ç­.ç}î÷_]ö9'¬ÿ”¸Vß'Ì6
+Û“R¿œ8bÏ½¬ÃIÑþN#þö½¶‘~·R]+1â#{÷N‰Jkµz~Ï½t’f¬¦YOÉ•RKo1¾ï¯ø*å°‹´×B($JÕHQAŽ•"ãX«Ž½�™… *ÿ½òòŽÒC}³gæ{�‡ßêªFIÖ¦\”�ÕgÝÔ$W_ŠAÖïdèà©r‚…ó'¨
+â�•[Q/CÛqë
»e¥Èm�	Âµ7á±
+††�çû{¯¤Ñ%f47¢Îü †CÙ?Œëª¦X{J�0¡„�AÙÍ�,;Âï‘¡aÑx{`OÝÞY
+BpaùÅ¨‹áµ'#„•£u;wwsû0»MP­1­Œbm¥“-•X;­ É¼Ä†-ÁÆro¹ŸóBRKx¬ßÅŸm"ƒ,ëwZ‰S’èW$0Æ;#Ðï¤ÍÏGk<˜ê(N#o@É$I¯·Þˆà>õLÒìŒA¯J¡Læ¢l¬NéwC¢T&‡®?ô;ŒW†±­-“µMBOÅšÝÊ(á‚w…A¶}oæÞY,š`Stx~¶1ˆrc5?Ã9;ºt.R\ÝÑ¾„«SüÔðö1o•çgvÒìÉµøŠY»‡é1´#³[ ÿt>ÐUFÚøòâTd:LÚpØëUÞ<Ð«æï‡‘�ìÖâÉÎ®h½]ÓQTþ.„b��©<èŽ–¤Sj?§\oÎÜ¿ÓÙØÍŒðù_vŽÐjÿ×oÙ[ö½VQoÛ6~×¯¸"qÜ¾Ú±—,M¶A$
P`š:[Di’;žì]þû@J²%Ùh1`_,QßÝ}ßÝñè‹Ÿ\á G©aê™”äÞ:ôÓÙ$
ÀçByX(� <8Av…ZãyqmÝ–Ô²`HeWd~ÖÂ|Eb‚^Î›÷óggð„sáY	¿b‰¾Ù¸t…Cë4 “ƒ´†IÍK¶äë€·–€„E©5È]ô€ÖJ¢ñÊ,,­+kÎÀia­píîï®o>=ÝWQ‚a#<äÊW±0‡�â8ˆ÷¶$‰ mÞH%F¬Ð;!
+Awö�˜‘I’Œ‘â#z«×èAZ	lA€V¾ÎŸ se�ÐY¯ØÒžïýyô-µð¾ö{lkgøÊhrWsÏ$$?â_%zÆ<€w¨o	Àh0€Ëµ 0¥Ö?E
þ>ÄŒ"À‘ZF8©ôùIÒµk™Ü*�÷VäHÆ:n÷mƒÁG»1ú¸Ñ¢ó¹6vå\+	‹ÒÈP6xy‘Öx¦RrzœKü¬®ç?«3ÖI¨èpV›5Ýëè»ž°Ï=€ßŽ+ ª"i§LpBí×l\'úqß
+{ºjé»®ÁpVÛ"ÍÚÊÂ"ä’LÃ�iû	_9íÜk¬i‡Å�°1uÛOwKäVÒ¬µsk©bÔ§ºDn¨NºÞãÁƒ½÷nZ‡³¼~N÷ÑŸI§5«¶»7�‚eí&¹y•èb
Nð¿K’ß¨¨&I}Þ:<,„óæt©¸(ç§ãÎ§ƒø%böÅOÀaäoÞš�‚Esƒ_[Ãh8Í²«^¾w„´ø1!-þ/B®šƒG6ä®ÕŒü×°¾¬tãñ‚ì*<U¤i¡
+í&»3k¡Uþe¥¿×cÍšŠ¯G¼ë®Ñ—o­që¼Ð«¡ð‰á]ö�‹z®ï§¯e”ájÛ
¨þ‘·‡~oõœN§Óx³ô•÷aÝ‰[ý¦Ç�W7»[©…j.�¶€0*ÖÍÈÊÆðLº=ôKÒ�IëØ«l’të¨²9ÆJk¯%éá,ü[x$V>ýýÔ!½8±ÄS˜ÎàÃû÷~_oIºQù–üm�Ak[1„ïúsèÁ6Á&×Øm“†”J0v�…"ëí«–(’º»Ï®)ýïEÏvi¡ÇÝ�ùF£Õû+:
+ÉMÔ„ƒ}µc%}{=]ºÅÌa†Ï‘='+ªCé±Ž¼§¹Ã¨¸/õ(ü-&aŠ;É„ÉçS¬¼dºÝ]æyGï®°¥�WcŸñH	VzYÜÖX©ÔDMŸ;„’Mx7X=~,‹„~H	áOzS'”•À¹/òê�K¾BMä•°g:Œ¾OO÷ÏÛ‡†‹Yô†ƒWt¬§,êp`‹°V^Ë �Jw©¼pÙ¿’Vëèå©|déÜb6>qCZÒžBßÒ†\?Þm`µecŸ°Ñ:™œ�¤oÌÍÅÒàg”à§€:ìôC­ätžüãÁù{œÞœ“6T‹²9.ÝiJöL?l¢”ú9EOo°/Ü-Ý/÷­TÁNÛ@½û+æ�ƒQ¯(4@AŠ*è­R´Y�ãi7»ÛÙq¢¨âß+Û8"Í’äPßüæí›÷Æã½øìK9j£Ó LZ¦²ö.?eÃdÐO /%(È P¯XÀðTÒÏh#ç×LóR ÕÜ°Eøb”ý…,.[¼žuïg9^�À3ÎTR°B†‹Ð×¾ôè¼ÁšÊæ �¦Y%ŽÃ[Ã{Ç %BQzÓ½fÒhÙÂñB	9{Þ 
+KÂUsnü8ºûö|WK5Á¤T+ §ÐöÂV$%H>¸Š5‚vyy�XµÀà•Fx*?ºÍD†I¢�
+&ø»Â ˜×Õ	g–È÷J‹ã5üIý>\/C÷
î™–JzE‹“®f†4•Õu(˜Nµ³A¸Ò’v
+Ý‘ì­Eýôê§Wo¸|§[—_ãês”6×�!ºés3‰0¦ ÷dpìTŽ½ƒ³sˆH¼sÆ([°¸ŠÓ
¯Imq²ÍÙJzz5Ç†zëVÖ4ô4Ûð³Cé¿³Ù8ÉÎá–õ{0žc‡–FL=ˆø‘!´’f}Œ�Vf{0Ù9ì¢q?‘ÓCíŽÎëÝ_ai‚']…ÚÛžò®Éˆ›½ò‡¼}%)«ÙÎ¼"ðQ^¢rGx0*êá_øX»rG­Í‡ŸèãêQŽö‰¼UØýD-ÿÅÚfÃãj‡.‡‘³ÍÓ¬ýZ_ô.�8&±ëâ5ù�R]oÚ0}Ï¯8•�
+¨íµ|Œ
1­ÒTU°ÇI“qnkÆö®ohëŸœ
+ÚCýd'çãžc�ß‡2 'mS7
+-ße(NÞõFÙ°Ÿ¡�¯¥‰(Œ%˜ˆ Xà<–¦¦Û
bîÃžÍS)èê>°#|´Êý –ˆ±bG³u{¾Íizƒ­U£>SEŒql?ÌBÈK	århï„ÍºÏñ`øÉ3¤$•µÐG÷„¶F“‹ã
+Ï%Æ»K*jCÛ†÷å~¾xX-’TLJ%ØªˆÜÄ¿^”ck¤„¤ðÑW¬	ÚçmäaæÔ†bPšðX*¾÷ßšFFY¦­ŠKúYQÊÓß%Eokâqm4áWÃ~³Z1\eíï‹„d” �M­„Ð)Geoæ[uNQÙÍ@ÅH,¸JBè¤ÈƒiãtäWkk4ŠÊéT(Tž·ÝËÆ>ìzw¨½É™Ó2ºg&“É¤ÉÐ;¥uz‘QÏÙ%ÕWÿM˜Á4’<ÐNº/Óžj_ ü;Æa„×
@çí$îÉ±w‡Uó²–|4âyÿ–š¤d¿…£-í/všBš¢{=WÖžÞÖTx&ÐŽt%Æ=µƒ^÷.¶Ê$»³›LÛl¯Ò´}<g}PMk1½ï¯xvMÓkýQ'!¡�RBÜcÁhµ³^ERG£uMÉ/²wƒ)%s’ÞÌ¼�Y~	]@CÚ*¦2
+-;9Š«OÕ¢˜OLñ£3­±|‹§Îôt]à4qçÃ‘Í¾”ºÂ
;Â­Uî…X"–ŠmêñÝÐú
+[ªU£¾R"Æ2ŽÀ&t�|°”¡\í�°©“xŽƒàƒgHGh“µÐïêyÚM.Œk=¿*1Þ]!XR‘Ð:œö¾=ÞÝßÞgªS0é”à "ÏZÔà`¤ƒäðÑ'Öí›1ò¼pê•bPšðÔ)~ô?OY…¶*F<Ó¯DQ¨ÉÝgŠÞöÄ[âÞhºMÆ6ÄøSÀ|:Å¦WŒ¥Åó1“g<°é•&í_g8ÕÖh´Ééœ
»�ö.
+'-åÈ0®TƒD®IN2[¬.xsûíÿìu¶Zžý·ß
++¡ý“8¼ªÏF½4hõ�—ÙzOòIY-.XáÙš~“NBåH\
ÊÅ$‰Ý»æ˜ñ­ø­V]oÛ6}×¯¸)\X6ì¸y�#7Yš4Š.H:ôašºŽ¸Ñ$G^Ù	¶þ÷�”dë+A°NðƒEÝËsÏ¹äÉ{“H‘Kf1vd§{z2è’£Ñ<š�#Ã—L8X	‰ f	ô
+n2±ÁÃ‚Å¹6OV<d1Á™U?I¦þDKN˜Uxº¬ÞS\Là—Ì‘`
+®0G'®Z85™Am$zC`*®Y±ÌI[W^j”!¬r)�ïÐ½µ•Cj¥íš‘ÐjF"s�Ûà÷éúüâóÝ…ß*£Œl™ƒT¸SØ
+Ê€<y§sË¸N+Ê³H±5:Ã8ÂMÆìµþ™GQî|\Š{dÀG#uŠóæª3V(ZµWÉíæQÄ%s>
+Êòå™ÌÝ¢Órƒð‘P¥Î–Ž,ãt‹åèSÃÎêï`6Ãé†Y¸?è­’š¥h}ìþ³±bÃa°j|žGMg•KùÏ-#ü$Ö‚:Î¶úÒö»"2çR êúd»Om§s)¾ý’“É»N:,—&_JÁ÷ÊÝßs­ÙœS\®!MÚ*´hOêØ%Ø¨Ò?_ÓEÓ	’®z-‡}a5i²o°Õ¢7®Xû×ïýÜm‘õ¸Q
+0°õ×Ñ1Ü…¾E£� mŸjÜÄ
+âƒ¦Ãt‘1J/Õeð�EÊ­ªb&ûô)nî¹•aš¾g<­ÖR‰5]0wGV¨‡x4�Ý‡=&0œ
G�$	¬˜tøÿ…H
eº{IÍ™,­ˆ¥¾pF<ƒ¸*ˆK&$¦�MÈÕà‡#­z†ÃK0�›.¶V~eVy¡†þ)§S<ü(è*_ÂÙÍ5ø	ÅÀGŽ˜b
+SàL)MU	Â›·îÍpR¤yÔØ¶žÌÿ” z”#a×�œ¸P=eÇåí-ûß¹C[”ÓÀXýrú’jdÇÃÙŽK­Ss+ÛzùNU¸…_­lŠ¹Ò÷¼;žÍ˜‡!¢C®×3ëÃš½
?‹áˆrï
Ú{Ã09z÷ÎÐ
r/m]ÖRKT.·øUP&Ônl7š©[âaˆù¾ìrÓEZþ�=ù+÷!7)#Ü‡W.ï“v¹PfõØÛ²e-ù´³ÝL‡·øÙiõ�‹ç0zÎµ"T�ºÖ@fãqñe§!’Þ³yG»´Ý¹ÇäzÊœCKpàÏShó-mgýõýLJ�a£EÚ=£„ÔŸy?FÛÐA‚[\3†A1TßµóV$`/q?óÆÄÐþ&âa@zœásíÿWhô¬<-¾YúXÃA’„«Mÿ<î?½,:£ýÕ²|’î!ÔŒ«aðlß3ÂûR•Qç°2Ùciªg^˜ˆíþÚßßÆâFèÜí–^¬=
+2æjA<ÓÝ
ýû´É¼:]/ö~¯f<²¹D�¼Æ¶ÞS8z¥�Cú"Ö÷L”ïÑ¿�TQOÛ@~Ï¯0ZÓŠÁØÓÔRc…!¶	­Ó^ª®§9q½Ël_K5øïÓ%¥d@»ÝSrþìÏŸó9ïË¢„µU„)-#Y”Èýýv/Ùë$Ð�ï…aÈ�E0¥"ŸÃeaf¸›@…8ñå‚Ì¤HuŽÉ!|°ÊÝ 	Ã�"‡Gã‡÷Ýw`ˆcÅb”ƒO�à€.ŽÊ¢D_ZŒ@P.í��ñÄKÂSO B¬½b�hk4:F0.÷4Ub¼Û�Ò¢b„™Áy•÷ùüdðu8ˆ¥*aR(�¹bÈ×\˜ÁÜHÅ³¤´Ï$ï%NM‘K¥.EçþªšH/IÇ¾œŽÌ ˆÔbtƒ‹ÞîUás7SÖdÇ4	St2¸ÕXFx]Ö;sáòìj@äi(dÜ„{I¢­b†3ÊÉ$“])ü†¬€™–cE†¢¿€½NŽfŠêÖ¢’x[’™)AØž5ò>*Q½¤Ž‡±5úQ×h¤½c¡ %­mgJT{IÏvÝëÃJ©Lk@ïYü	!ôëR5ðþeú	Ê©q¤’Œ“´Ý®FÔ '”@nËÏVþ˜ßºÞHføÂù¹»ÀE${oŸÓ¤ky8L§Š­kxûoßµa«ß�)çŠ›p´Fæ<ØõüGý~Þük®•á¾ ³šà¦Á6�Ùíæä§'>Ã
s%�[×í¿XúnÕÁÊ.KWÝà"nr»3o²F&‡tëéz¥+µ;�©pw/ ›h ›ŽG
+òsp8_»µië¢Î…Ì#ƒóRý²”q@ø+Â¢£[
óß/‡pŸü�TÝoÚ0Ï_q“�š Z¶×Ò26DYÕnBeÚË6UÆ¹$VƒmÙ(šøß';„�¶Úü”œïî÷á³¯>êLCŒ<gCKFpz¤�F{ý!ýn]øž	‰È„Í�J`–‰^à3ÆJoŒH3‚�GðÉH„Ï9“OhÈÂ3G‹úÿ"Æaæ¸`–“ð4peëÀHg•ÎÑ%“1p%ÉˆEAÊØ
+ðF !)òxƒî²sÁQZ!e–Œ„’=Ð92‹°¸öu÷·ãÉ·ùÄµòÂ(ckf!¶ÄÂÖ‚2 'ÞªÂp®âZr?�l‰V3Ž0Ë˜¹U¿¼#ƒ (,Âä™£vÐƒ èw=åél
+s‘JF…Aø�F$‚{zPX!SÏk*‹Ùf“ñ=Lž	¥J^x8ž3kÝ¾N›.e4 –:Ç%J²p¼ù'èw»0Z1SAtû>ª�X1Bè¤:û‰w¸™£Y	ŽGÙOÍVU¤‹E.8$…ä^Ñã#WÒ’)8…% Cèµ{¶šDG·:ÎðóaªÓ:r]±;ÈØ•»Œ6#—´mÄ”u]QfÔÚî9ÃDŽqsXUjÿ¤¤•«Ûø;"Sè,ÑZ–bê€­�ï3†m ó$ÕZÞ™¢ÑFH²ÑåúÚ"§–v2›ÖŸ×jÊœëZ5#Â¥¦v›pÇeG"ª¦^"�ð]Õí|(ì�ãv‡›0Š =¬Xjeèá|gòù°Ìpš®)RKmõNYpÀkÇ­
éÎÎÑÚÓÝ2H…‘µEƒ£œí1R]òÏ^¾Ò÷%[àŒxa3^ÐÁC-~&Aâúµ±;èÍýZRsÆ†BRT…Ç*ö±N›è¶}ê{ÛÌò)åovtY¾?¯Î°óa71©NÏ‡ÕÍykL›ý?“ÎÊw¦Îò¼:Œ!a¹Å³={šÏêü\ûÔù	ÿùþwT?-Ûà/=PÑjA|ß¯˜‡<ÄÁ$äµvÛ4!¡�RB]úT(ë=Ý­ÈZ»H:Súïå.½>j4šÑÌöcË
¥•.Í•“ÿòs#{»Ú„›«€+|Ïlè¹ØÐ¢:j�—ÌGº˜µ�•‡ì¸L+|R!Ü—(¯¤nØFºÛ/óuGÖØÑ>šs|¦‘[[€»–ÕVh""J‡TÅ•÷£Wµ†OUá™Ð�¥ ýwŸØ…‰Xúª‡è\e�V(áÈtšï¾<?<~Ý=NRs0ÏÑqŠ†ŽíÍ‹:œØ3|
+ouÔDHµ["ß‰²á%G}®?çF6!°8i?-v<HôQé)÷LŠßÚ¸/œÐ�’¦÷pœÖç¹~pq ³8Ð`‹ÎQ5žqñ*õ$O,iS·Õ;¼™¤9ñ7²±ø&ü	…�Ao1…ïùï¸[U­¸²K)T[µjA‹8!¡LÆ3±H“Èv:Z!þ;š)‹zq´ýÙï=oßÖXÑSH^h¥&ì›*é›Wë�;?q8ÁçÈŠ��Õ‹¡xˆüDgqUêAxŒ†UXã�dÂûäówSl½dºìŽõYO§ØSçÕØgÜP#ÁV��Ë+•šhás�P²	wÍŠèoÁë"°HZJÔg:q ¬ÎC‘Go\ò)j"¯„'¦iÙ»¿½Ú}ÜïæSK0‹Þ0yEÏú¬E=&¶›Ãki¡ôÇÈç.ûGÒêá!z¹-_—�lœãl$Ã<øBÂ‡ÅÃ'Ò–?ÔÖ%Zó#Ù5ç‘¤
+g[­_cv‘Ç�û+Îz—Ë”ïè0£])éàäõ¥‡}�T‡–þ³7’íDŠ| U?ÒKC?Ý/=�AKA…ïó+ÞÁƒ-¥âÕ¶Z-Š‘B=dv6Û	Ng†LÆRÄÿ.»Z�yyÉË—ù]ö-¹`….‹
+;}×S¦²¸ÍÌÕØ`Œ7Ïd+ŠÔaãù“¦ƒc•òIxï—n„{‰„‡`ã‰Ì­DZ6çzÚÒí[jlQ¶ÏTI0/ga™}¦”õFØØÂ¥¨ÂMÕ$å/ð)	ÔºÜzïì(Ç.ÉÁ*§8Adá“é8Ì½¬W�¯ÛÇ~Õ¦Þ*Ž¶ åò›E-Ž¬ÚÃ—TÅ\jÏÈW&Ú•laã­¬ÓnøÈnxfG%éúæ:æªø2�kØ¡«Ñõgõ`Ëaø{Üãâ@¥Ø=MÐ¤pÑRgkP, Rit3È3óm~­TMoÜ6¼ëWL’Š�^³–ãÄq…Ô¾I`p¥'‹Eä“7‹dÿ{AJòÊêöV^
fÞÇ<>ž¿µ­EM•Ž2ÏNVüÀ;K¾ü=_'g«+Ü·Ò£‘Š =¬pÓàs+Ÿè4Ad\»sò±edUŽwNÞ+¡¿“c�sá4]n¦ÿÓš.
+ÜÑFx–Bã#õäpî'àÒ¶–ŒUˆºFe4;¹éÙ8?&üÃ8pKhz¥P=gl%+Òž uc\'X]À*žð$iuÞ\]ßÞ]‡P±1nc+<jé‡\Tc+¹‡æ½é]E¨L=µ|–hÑ‘·¢"|n…»1_£#_¯”\'Iï[{ÆÝý‡›Ûuš^W¡4�Ä~�Iý œ»ìØÉn�yë¤æf‰²c£Ì–Ü:I*%¼Ç•ÑÞ(ºÑ¶gÈÎ*êH³ÇüLàlµÂå“pøÔs@Wg¶N>	&œ˜¯“—äF(O¿�Æ,E2$¸cG¢;(ã+\ZáD·1×|ºV4òÇÐýFÉêÐíÃC´×õgcåc©Å‘P(‡9äcÓáœ„É¾¾DTÚ]°fë_	Á>9Zket#]×K?â¤#ïÅ#Ø£pRS#zÅ(Á®§üÍÏ
+Ý‘ÿdc¤rÆ.>Þ"ý;Å¤»tV¶6£d©‰¶ÑmétP8²Av¬áI6·/n�ÙBÓõZ“»þQQÌš¥·Dµól°!ˆMØ23y‘æ‡Z÷‡j³ÈðbH¯/¶N2ÝÓÎâ^d“•9N§­ÈR|yå½òß�3ïŠƒ'ù,yL›E9ìåò™GÏ>�¢ÿòæÿógáQ¬Ø‘·&¼rålï'Sbeó&÷Ø¶á•Ë~›^™ì9B�/é.-ÂM(�¦ßŠáæËkqÈX–HÓe»Ž¸wúùª�îÄyjº¶ûdŸüÅVÛnÛF}çWL
#¢Vª�7ËR|‰Ò
+m,Cv’ÉVäP\xµ»˜]ê‚Äÿ^ð&Q·I
+Tož™9çhw†—ït¬!Ä@0B×Xâ�Û•FÓ>«·œ¦ç€�17q�À
hFT÷1ŸcÃ�q«ôŠø4¶àu¸&‰p#˜|F².I¼š”Ï�;><à„Ë™„¿0A‚KS®t¬Qi�)˜!PÒŸ$V‘)~P6Fˆ! XwOÑ‚(
—‘¢³\I´@fæYÞ?½ÛîÝC7-•	³1³°`Bnò^Â‚Ûl*Þ¨„„@…¥ä¦#Ù�fÂ}Ì¨§F™#£[Á[Ž“˜-�…‡Ç÷ÝÁ µézÌ#Q"ƒ”!Dâw‚\Ž[í„5átL¨p0!&,xÎ1=9g‚‡×4Mf(mw NsZŽfÜ*i”À~bub�Ï´Àh ˆ|ut2<(ø~înúÝqw0è 
g­ã¨/×ƒ»ÞÝŸÐ†óï zwú�ÕzÛr2XÓóàjÎ¸´©½Y*ñ9³§s¤‰2Ü® 
EtqQ-´[a¢”Ø+¡‰K{OjJhÌ'2‹¦H,®ý�3²”ÖMÙlÚûyíƒÅê…wéï4=5¿wÚÏeª»©RoíÕƒö1ÒiâËaêÙ)êÉHewYNá4½Ñ6ÅúÌ+<ynAacqç�ÇUuâY¿G\Z·Úp2’'�/¯’.U®‰ë"ð�‡7o¾çô«ÚNFË?Þ�–g7Ãó¿O ±ÏíG„fK‘—ö¨À|&¸ù¼ð·Á¯Ÿ‚/Œ$—Óu«Eþü‹v×ûUËjÃùµÔ±íî?s@ºDŠÖj0}úE-Ù@ÛU²1½;øPf¨'€\GµïÏ¨øÈè9T¹2+û"šM˜(B»+B-6S£L‚öáeàÖšîÈyßÆãºÛðÞÕGgÍšÆ2[eäfÛ%-gƒMý
+VÛ–Ú„ä6<ª(ö+ŠyZ�ç–¥úÛ˜¢üQößþ/êû£­‚ªü¿MÏËs<¸ÒŒØ¶—Eñr{­Û
Ïòoå—€[ÝEÃÇÙ?0þvcåÍôÁR‚õÝ`cR�¸8ú5áÖŠ70g"AˆÁšWmï>TL­.ò�”ÒÖç_�SaOÛ0ýž_ñ„˜HºR4iŸZÂ`…mHŒ¡Á´€*×¹4®ÙNBýï“Ó$¤aBÓò)w~÷î½;ûðSžåHˆKf(´Îîfî)'ˆ&ÁÁ À7™°H…$‹œ�â*+¨S�?±ÈBáÄ(ÂgÉÔgqÈŒ¢ãy�:âšæÌ:Á¾QA‡¶IçYN:—ä�`*×Ê1/œ6¶nøE¸Œ�R‚·Ý=Z
+NÊ„JµY2'´"—Ä,a%¨¬ê.Î§g—×gžª2æ2æP2‹DØM/JP
+—ÁyóV†¸NË�bK²9ã„«Œ™s}WMän*Å$
+ëµ)î»cÉ'ÛëŒ$ÕK®ln„ré$¸dÖbª•Õ’nØ\žÈ‹¹ÜOÄ:L\üú~9»:9==¿üŠ'A…:p¼bÌöäÅVµF¬˜#ìfÄ2ößÀF—1nïkx­ U=›UbLÁ]¸ahø£Z³ÿvý÷�êÄþxýwn–$?uÙÐ]Fc¬´H^{•·÷ž×èòmN{íŒP‹0û5µè²éÂå…CŒ½½ÉKvÉìPgÛtª
1ž!ì™c»B%ôˆø¨ñÙ�EEÉµ,–ê·H\æUoä¦ZVÉpCM¶Ë*%£;ïöŸ»ëÑvhw^
+×Áëò;µÓqÒØÅí%+ì°·¸£~m
+Õ}ñ#ðëê»~£�‡w5·¿†\aTS»½Ûú’¶ËíP(Wï!Ã�5ó„¸~Š½Þn
+ï£ÿ5Úi°d�aÛ~F—m—·�·\ïaI¦ãñö»o&²þ��Ak1…ïû+Þ¡‡8„„^c·Ik\jHZC¹Š¬�]
‘%13ëM(ýïe7öÞ>ÎÓûÞèÍâ¦„‚š|tBgjÂÞþØ[!ýòy6¯®Î+œã1°¢áH`EqbÈ
6�÷tYat,synƒáÌÏðMá{té…Ä'‰n·Çù²¦¯x ­Sc—ð“:,ô(Ü–P(—Hƒ.Õð9™ð¶³,zXø#,š.FøiûàŽì))�S“eçŒsº@‰ä”°gêGîn½\ýzX
Qc1ÎÐ;EÍú¾‹jôl6”×Ü‰'ø\+_UÉíH‹ó„Mp²ÎÏãEž—‘çUÅÉHšáñwg¥3ü­ tÛÈM—üð/ôÂF�ôjãéS‹OF¯vOª®¥Ù5ö™ëùÇä:5y"‡¾'“ON§v‚û÷ùd~%’e¢i˜Nf7’[!Õ	/áä„{'/uîÓ”°;ú¯ú­�Ak1„ïû+æÐƒLB¯¶Û&165”ØÔ¥§@ÐjßZ¢ŠžxïmŒ)ùïe7v ´½”ê6bôÍŒæŸJ(hÈ''4R“èíÁŽ…ôÃûñ¬ºº¨p�o!*Ú˜QQœ¸Å6Ä'º¬08\Ž÷Á0òcÜH&Ü&—�˜bî$Óu}Ö—
}œ`GµS‹.ã3u$˜ëùâº„B\õF¸ÜÀs6‰ug,z
+\±À¡íR‚MïÝ)zÊJˆ¹eyt9OP9%<E:ï¾¬Ë»Ý²G
Ã,8ÃÁ)š¨/YÔà-ÀúñÊ�x‚çæ<ùªÊî‘´8OØ'k¾~ä~‘â¬ª|rªØtV:[9o,Gü¬ tuŠm—}_
{²gåD/îQÍœðŽ±Þ©Ž§'Ö	Ò!ë$#ÓooÔtú}ùõv³[>¬ïV›ÉoàÙÀ{®þÞ-±Pó*þ�óOMŸ«_­”ÛN1†ï÷)F›(Í�½Ë’@Q©´H õ‚T‘ã�d-¼¶5že‰
+ï^9ç@ ªTß�çŸ™ï·-Ÿž¹ÜA†RÂØ3)Écž;ôýn=�Ú�p›+S¥”'ˆÁNá:WØŠ`¡Z7'5ËbY‡Od>kaî‘ØÃ© ƒç“uÜÊpÐ„œÏJøŠ%œúõÆ¹ËZ§1A˜¤5LjR²%¿øÅpŽ0-µ¹™ÔZI4A™©¥B°²¦	N£ð
+«EÝ·ËáÅ÷›‹ÐjaŒsÁP	™òËY˜A¥8æ½-I"H›­-·##
+ôNH„ë\Ð¥-Nd4Ô*�¢Ò6#Ãtp„³1¡ÓBâX
+­'BÞ§ûïHž¦Q$µð†V[Âlh�·”ìJ|d4YHîîþŽ\9ÑJnV¤/ˆ,-®ÕÌàCt…Þ‹Ö{ð`U¶*k/
ý5Q\u’ä®“&Ý>xXFE­ù¢_ºiä¡á^o‡à�ô9z›û§ £ÌlC^-ã·Ù÷¯è»i’¼¤Ñó
þ5Éaù{®Ýg¶2Åjã5~»
«3è`ŽZÛjkl]ýÃÏ(>nÇ£Æ¨ñ4×ãVã¬>ê¶�›àYð.Q,ˆÄ<´c™£¯÷`Eµ…‹�K2°<´$)jÐÚÔÜ�ü‚Ö*Õ)ji î›òçæŽÃ4Úõ¦X„ãé`Fˆæ_Í=ýg'ï:û«§£ð)|,®ù9ÞU-ßÅsô��ÍnZ1…÷~ŠY°AÝBiQ#E-Rš]$d|çr­�53¡Šw¯—”F‘Zïæçœ3Ÿ'_R“ B,cW”½Ó•Êí§ÞØŒúúð³ñµ^ YV –�ßá��ÓÆœÒ�ý¦Qèº|åˆpl|EV�‰åˆ³õ¥¾©p:€'\[Qo#|ÃŒ¹4f©IH)`Y+p•ý:+±´�÷Ä 
B�C÷–^¶ƒwÁÇšxkÕS@
+haçqÒ=>ÌßŸÅê¦�UØ[�ÊË9+Ø{m@¼Pf‡à¨º �L´[”dÂ²±ü@/§y™?6&Ë»ö"î<SÜbÔ±1.Xø‘5e}$g•~€Q¿³�åvxo�J^™&ö;«�úÜ›s;¯ƒwPçè
+.¬VŽ¢(g§Ý¿}.Â^W^§ §ín¯ÜËøøqÆõlÝ½Bƒþ)°&
+ÐIì£.™6Œ"Ï©²ŠÒûÜ^Ýákè^ë‡SÉ)«Ì)cÕæõ®�/�Q3ÇwÃéµÎ)
+lõ4~³l�ÿåü¿–Gs4¿=�AKA…ïó+Þ±-¥Å«­Z]*D
+õX�ÙÙ¬œÎ™lkÿ»ìj=&ù’÷^–wÙg4ä‚vú¦çLåæj¼0ó‰Á¯žZ.ÈV©ÅÖó‘fQ¥|~÷Š‘ã^"á!ØøA¢K+‘Võ¥ž5t;ÅŽj[”mÄu$X–Kc•}¦”õ llàRTáºÓ$åOð1	ÔÚ.¸õžì(Ç6ÉÁ*§8EdáÈtöž7Õúe·îO
ÁÔ[ÅÉ4\~µ¨Á‰ÕCûð%uâ.5—Èsí�J¶Ž°õV6i?|d_^ÃQIÚ~X¥Ã¡·õe wu`‡¶‹®7ú$×)�Æ×8&næÛüE�OkB1ÄïùsTÅ³ÚÚŠ¥‚Áö&”5om‚1	Ù}þ¡ô»—gÕwwf~ÌŽ³Ë¨Ø*Ü-Þê§ž3ËxÐš~Ç ƒwç[^�©(ÒKçÜ3¸(¦)Ÿ‹ÿrŠ–mã©DÆs ¸ã¢‚•È“ÍmîUüÐÅŠ7$ê)â•k.Ém1É.sÊ�!(V°)jñ›ZS‘+ð%¨clë`ïôF¼å(·©ìI}Š]äÀ$ŒƒçãÅ·˜Ogo«Yu)¦ŽGT^þX\áèÕA›ò’êb6U·Ê}iÏ’É2–ŽÊ<­/YOƒScv²œüÐHÓ´ßS¬É’¦r¿ƒOÊ±’¾
äz¼mú‹â#îb:ÆkÆÍ�ùe�AOA…ïó+ÞÁu“©¢HáˆT93c1;3{“ ªÿíÒÀ¡G?¿ç§Ï³ï5Vö‰Ÿ¨5ñöÛÞ*ëüê´s—ggxŠ¢ØJbˆ¢R3”-£ìøÂar,J}kò
'þ·-3~$Ê¯ÜL1£–ùfsœ/;Çš7¤&”qÏ7Ìô(ÜÔX¹ÔÄ£”|ÉÖd3Xiú¯ð®4Xdl‡”à?ÛGwÏY’·¥õdRò9jbRÆNx?å~®Ë‡õr<5�Y$ÃžAô£‹öb6ÂkšgøŽÈ—.SÏZÉ3#µUyž>ò¼HÒ97(cyð\ÇúÎ9ŸH‹Ò÷”Ã¯IÕÏ=ø`œƒ~%ðÇ@6IüÈ¯†‡²|üÈbŽ«ÎýïYå%	·íeè9Û*>`ŽëÎýuï•QMk[1¼¿_1‡lcbzµÝÖ©Ih ´�”že­·ÏZ"KêjŸ�PúßË{þ€–Ä¥'íjgv4£ùûì3jv�”ÅTœ}·çÌåí›á¬šŒ*ŒðÕKA#�!™Ô�ÜyÙòe…±LùYeí
7Ä•FÆ‡@ñ‘Õ
+æ¤‘«cYó»1îyEÅ„">rËŠy9^,²ÏœràŠ5\Š¦²j-i9Þ$…yFÓ†wRïÐAÇÂ�Ø$Ý�IŠcäÀT[á]Ïût»¼þ|Ý­ê�™'ÃŽ
+j){-®±ó°Î|I­:†KõÑò¤Š´á’É1î<émzèyX™U•Dcmºá2Eã'ÃÏ
+r»
+âÐ´Ñuƒ£Ø$¶<N±J)Ìª‘�1íÊ—ÜÕý?Å5.Rßžç)ÿhE¹|£Ðò1×l{½›¤KOz";O:œbß¾BöTÎ’Ïè’sœ­\éºÝp´ò�`¨®�Ð“éz8Å6I} MF£þÄ‹LJlä‰k\l»X£É‹ûË1†¿ÂÈ
+½boãPÎª_Õo]�AOA…ïó+Þ�p%IŒ’àÑÄ³]¦q˜™L»‚1þw³«@â±¯_ûú:»É>£"l¡žha§oú™I®&ý©xñ,¨9X�mQ¤kÏ42èˆEÊŸ…w^Ñs}Ü–H¸6¾SQÁÌ–Hóí©Ut=Ä†¶V”mÄ5T0““0Ï>SÊ�Z6Vp)jám£©ÈŸá}*PO¨›àÎî-ØQÇ:•½UNqˆÈ
+áƒéÐÍ=®Ë§Í²]ÕSo+¨X~½¨Â�ÕCÛð’šâ.U§Ècíž$[GX{[VéµûÈë"ðÔ˜FþÉË££ÜÞ25Æ+‚EŠJG=7@G¥X	.,xŸí)ªà"~ÈÍ6°k#Úîª;å¸{î Á&Sóm~m�ÁN›1„ï~Š9B ÊñOZhD¤ªE¥í	©rì	¶êØ®w�U}÷ê„Úãî~;³³“w5Txºd�D[tú]Ÿ*ezq<˜óƒ|	Q°Š‰ˆ‚j›¢¬pâ†g{bVêS‹�AqäŽqÝ2ñ>ÙüƒMÛ2¯–‡úÌóí)î¹´¢ÑfÜ²³a"‡ÆU
•¥&Ž löp%k‹Ë®¥É‹áMiÐ@¬zJp¯î#�¢c"æUik«±äSÔD+Ä&r»ßû°˜Í?ÞÏG©}0
V±µåÙ‹Û¨:†—Ò›#\ñ‡Èç&Û5¥ZGÜÛåaÿ‘‡YŠƒ1]ˆùÎ±Žöƒ1.Y|æÏNÑ×¸Sf/Qü2Pû2E7Å×Ì]¥SúëöØ×ÌŠ).ó/¹È›¢ÿô,5Å›ÿAßlê/‰�S\æ·ù]�MKC1E÷ùwiKiqÝªÕR± R¬Ë‚¤yóÌ`^2óú�øßåUÛ‚ËÎÌ�›É]ö¹`]‰vú®‡LrsÝ›Qß �7Ï‚š�ÙEª±ô¼¥¡ÁÑ˜¥|(üáW®‡û	ÁÆO**˜Øiº9½‡Ý°¢�eñD-Lä¦ÙgJ9P'ÂÆ
+.E-¼i5ù|Lê	uÜ9½³;ŠBàX§ÒXåÈ�¬¶L»ãÜób6YÍ»UÇbê­bgËoUØ±zhW^R[Á¥êTyd¢mH²u„¥·e‘ÖÇYÏ��iåžïåî–±1.X¼¶1R9sÐ^)V‚‹
+nr †¢
+.ðË|›]�½NÄ@„û<ÅPÐAÒ§£ §8Ñï%¾¬•ÍzñON÷ö(B‚ˆé¬Ñ|Ï[©ŠB¦)TiÆ=s!4•‰Ì¸.xH(”¾‚ÌÇ®Ã¯ží|½×�UêFÕÇÃús>2ï„ORc©ã¿Ø%³Á²D™QÅ‘ÓNÈ©5ª4#ÕlØÄ…W*$\céÏøBÉJMÔÁŽäÈîÍÆaXØs\ûI¶¡å¤¯,C;Úld/ØÒJ°P:Þ×©ÄL'¸gÂ-J�„·pÈ
~4þm#³´P�KNu=OÝ7]‘AKA…ïó+ÞÁC»H‹W[µZ*D
+õ(Èt6Û	Ng†LÖZÄÿ.»m=x
+I¾äÍ›Lï²Ï¨É+4(*ìô]™ÊÍÕpbÆ•A…WÏ
d+ŠÔ`åù“F=1Où ¼õŠ�â^"á!ØøA¢S+‘f›s>ªéökÚØ¢l#ž¨%Á´œ³ì3¥¨ac
—¢
+oZMRN‚�I žÐ´!Àý©wt`G±86IvV9ÅKä@¶>™öýÜór¾xY/ºU½1õV±·5—£ÕØ³zhg¾¤VÁ¥úlyl¢ÝQÉÖVÞÊ2½õ?ò6<1†£’4]sžv;ëçä¬&Á·€qUõfê%íË?nñå(wO?aã>ævØ¡i£ëzØ’žÆúÓÅ-.Ü1^ŸNÌ�ù­VßoÛ6~÷_q-²J2”é£gÉŒd+VdÅ:ì%
š:YDhR;RvŒ5ÿû@ê‡eYv›¡zÉ»û>~äÝñòç<Ë!A.ah,	ngv“£™\DãÁùpCø+R!„�œ‘�Â§L¬ðlÞbªó
‰Ef!äÜ�BøE2õ„d
\2Rx=¯Çg	^ÅðçÌXÁü†\šzâ:ÏrÔ¹DgL%Àµ²$æ…Õd*À;M`3„´�xƒî¬¥à¨‚P©¦%³B«r‰Ì ¬®½ßÇÓÛûÏ·.”ß˜Í˜…53�Sbaka3°nóFÄ¸Nê-Ÿ[¢ÉGø”1ú ¿xE¾L¥…qÜwèÀˆØfö„›>cÍ¸oÙ #žu–„šùÕÎ´ÉI(›vg-ITãÁ€Í�%Æ-pÉŒ�_Q!19ÕÊâ³±Ì%.QYõÔ¿€óá®WŒà�ÜÅ3n“n>'±báD—óãA9]Ì¥à[øÙŒke,Ü†QÒ}'NÁÓ«Ê& p]C„ÑØÛ½ô‡dIrC‹Â‘õwS-à„Ñ"ÁJ‹ä ÆéUÛÑ{ìÀœ‡¥ç®mFzÝ(qûÌÑÇ¨ÖÏ{i´%ÿ†T	ÃÉŠÉòCe
+Â{m§Z¥Rp+Ô"¬œ+Š}»Ùâu�Žª·¨ÝL�šCÝ’"´©ÚÑˆœ)'”Pº�s­å~<K�ò¤ôÚô
+x0f7ƒZB”ìhWz­š
—†ðŸBš¿�ŠßK"eÒà½H«t¸Ó4Í5LxÆhŸ‡H!,“<,-àÍdídsŸgâ³¬K&L¦]ùö#XÆÂ�A…«S�¨6ƒ‹ u«Ý¶¤¨ëRÉãð)Äþ6üØìk®õÑªá®lo*†{Š—^¯‘ð^ÃŽŠÛ.áB×­âíÔüÿ#â^¥äŽŸ©‹žyEz¶ÎãÏÒ¤.žäYµXÛÜù¦:‚ð	70™€kƒ1ør“R™S·ÐTfLx¶8ƒ‡@jµ`r�b´Í�üØ›=F¸Ìí¦äàŽPiÐ
/Sä¹&‹Éî]!m‘»ÞÝ¾.»rŽª˜{Ê<<~C¾­Ú�3AÆ%LEê�L7K§•CXj+¥˜�ñvÄƒGØ
+ñQë§"÷�.$÷˜ÁæÚf°fó*µZÌ¿C¯Vwzµjõc¡‰×Ûóö*n·_Ja,LZ)ÑÇi¼Í¯T2žAXz2'Nðn^oÍÜª7Ó¹½pÚ»Ÿ÷]ûº|TD}½-=Þ½ƒîd¯·ûxÕ3Ç{«­
+Ñ†kð&;x�gASËÂ=‚¯_{ñ÷Â½ÿv¸‹(Ú‹uhGªe¯½ûª'lø¶.6ÁO&ðïwÿÃ™RÚ7'®—s¡0y—JÄ•ÖñÁÐ]£ÑþåéuŽú¨ôRÝù—Á­UQkÛ0~÷¯¸AFí�µì5Nºt¡c�Ñº·4E>Çb²d$ÙiýïC²ì:vZ˜^Ëw÷}÷Ý'yö­È
+H�r¢0ÔF1jÍs�zþ5Šƒ‹qcø�1
)ãLCA”™Â]Æ*<ÀE,eñ¬Ø.3Ò®”@øÎ‰øƒÊh˜%p±mžÏ¼œÀ=n‰6Œø‰%*˜éfcQdÊ‚£
" RÅ¶¥‘J{ÀR�ÉÒ’s -º�æŒ¢ÐL¤RåÄ0)&Pp$¡b¸wy¿VËë›ûk[Ê5f2b`O4$L×X˜Àž™Œm^ËRQ*“¦å‹@�uA(Â]FÔJ>8E–œÅAPjËMP‹D)òü˜£Úa|ø†ÊR˜Þž.&�ƒ€r¢5Üv[Ãßàb<†EET]tfÉŠÝrö„É¥¥eƒ
+Å*bFÒçÎa½‰ƒÃuêz3H"jWæ(L?ÍýÂQ$¯!aT^¢å•[Îh§!4ua
ÙÐšøäh
+•d‰oÐ®‘ýË¥g¿öñ˜ûŒØE¾oÂeD÷àì¤¢)l¥ä…¦T˜ÖhÂ>¢MÙD8]L¦ä^ÃRæ9‰ŸÐõE÷Ï‡µÑÉ	vR©Ý@)G½Cš¥~òd_­Ãºqv9’ pŒgxn—÷^xv#¡Ö¢>¶>|ÖgÏh2È<1�ÞÈû’f·aüòêvîLåÍyœ;I’+oÜV½ÆÉGÖZ}íÌÕ<žÚ¡i€–öø†Ñ˜0Cg¹Ãö‘¢÷mÑ	>ESZ�;¡ÍòÿÙ
} €wC
ö;¬DE8kGµ²ù¶ÅëØj§�ÑUç@Ów\¤w�O[_¸KzÑ/~²¦ûnx!C�<m¯ukûÜ±µB]rÓÕsî†nãÂŽ´>°ÃÁúÿMZáÍÅÖí|Öz÷ç¤¥ØnEñp˜uÑ¦ù—àíWÛnÛ8}×WÌ.,'vÒì£eÓ)6@6)š¶/mÐÒX""“*IÙ	6þ÷/’uó¥ØìË¢~’¨áá9‡3Cúô�,É Â0%}©
ÕƒzÎP'ƒ‰w|àÁ|N¨„M¨„Œ|ºÀ#LÄÏž�~8€w‚!¼O	{D¡$œÁð|Z¼Ex6„;œ©(að'æ(àTçY’!ÏRÔ�@X!gJÐi®¸�nÁ\€JfyšBX®®£S"“”Í¸˜E9B–"‘ŠK3ïúêâòæîRCa*!
+–DBD¥]#XR•€Òâ%ÏEˆò¨�|ì12G™‘ácBÄÿnù~‘Ò‰çåRsc¡^Bž35©�ÉLP¦fÍQ%RdÍÁ|*•°ƒ·¹º�½ç9‹äåSˆ™˜x^˜)áþÈQ*øÛ8>8€ó@„ Ïš±Í]…Ð#"^L¼z$eª—q	¼Ý'Ôé¬ÞŽ²Ìí¸ÏòiJÃµæ‡‡�3©D*ßò7„N›þõôÎŒÎô°~
+I�ï†”ùnž|‡3‚“V¨£0\Äý��[uÍˆ�è_p¦ðIiÌÃ`\ê^^&:Ó|·XBä
>)PÕdÈk56,FeÃœQÅ�ÎÀHùöö‚ €þ¨ßª…�l
«˜�¥xÍYlø…¦¡KDƒ7„ßƒIg˜JÜ´@Š—ãÅmCgôŒíp2�ž‚ÓÀèçÃÃMZ:î.TKˆq¤§î‡v…ÀBw	2¢Ú2k#E×˜¼q>G�€5�5Wí]þ­˜0:	Ó™FYŽí¼Ñ¿©@òØDìÀn%üz�U™ù£³9Š‹÷ú¬jF
+T¹`•œÝ¯xª�]S‡-;FÑµ“*¤­—±N4Êâ
+œusGù©Dð¥m½Öïßp˜s�ºðÉ
+Ù¯ìáªiqÆåááF§t/ú¶Ž¼ß®­ä<†)çéF£tË>­õ¿]¸�’o¶³aá¥ëÚƒ1,8�ZÖ–IôÈøReçæl6Ú�[k“[yíNK¿ÿ…ihsodX²¶æ5‘Çã+¶ )�,·Z|mkÂÖºþÈ©@ù•¤9nT¶Wžý¬5,}x#¡`šŒ€q†Ó²­Þtûc”}² QkN«[Ußz–À~G—‰Ýqxýìé<"J¿”È±3ùœ‘;Ž0K|èPûTxõ0Ü\âaBÄÐ6˜•×Dª�åžWì¸¸Hˆð
ÈYñÿë½tÜ.Ó}"ÖÕM^£IXƒáå~5Œ_
£aÏÏV?lì4{ é&Ô*‰íý¤¼Ònn&ú†»«{�P»%4¹íN¶{_û_>eê?ðÄABŽ—}:Æz~Áh�¶±Eë›þú~¿*ÿÛ9pn.�Î¨í¾ÛLPÆñ²EÔ}?îÞ õVïºË•9ÔÚ&%ž›yTÊ¬¤Ò–T‰
+((”Ô¡‡ÿf‡{hZÅ_(%‰Ñíc`å­¼ÕýOã8ö÷þO\Q¶ÃíÞISf:P 
+¨Àì�™Äm­Ií¬íPÐ.ÿûÊŽ“:NRàv÷‡c$4ñûðûö{�Óy
+1ŽÄ±/$'‘åSŠE7Øïìlu`®çDÀ”$ˆ€q	l
+—sò€ßu@c²ô‰“Ù\‚0àÃçÑï˜K§øÓ}ñý.Æ=¸Â÷HH‚(œâsø ŠƒOé<Å,M°BDcˆ•œÜg’qa.<fäÃ4KˆÊÛvB"LB§Œ/�$Œö M0^jº³Ñáðüj¨XiÅäIX"1ù]8†%‘s�JyÁ2aˆX\¨¼Ó¡h�EŠ"—sÄGìV[äö0!û�N&6Ž†ŸoNÂÏƒÃ/×“Áá0�œ_L†á`rrµ¯Ñ¦�”�±ŒJç,Æ÷Ù,¼GÑwÉQ„](áJ
+çsÎx8Ã2L�pæ@ŽSÆ%¡3ú˜&,v*i~Ê˜JáÀÉ¢‰ŠP
+ìÞODˆ8GOÎ1Ç3"$æ¡˜g2fK Q`æ:Ì�Ì]xÊ	•S÷Tò×Xe÷BúŠ‡ô�pF¸pGªn>F8]‰WEX;ÆHf�‰„ÎÖaŽÉŒëà½Âü�®oFÇˆ$8^ÇNÿ>Tþ{lRJÿþŠ¹(©¯çœ-Ñ}‚÷;�(ABÀ$£sø­�f÷	‰LŒOÃ‹/Ð‡÷û
ÜÙ�‹›ë£Áõð.O/áëpr5º8‡>ì6ÿsŽGWW£óèÃ?
ëæüËùÅ/çááÅx<8?‚>üØ‚9œL.&Ð‡ŸZà—ƒÉ`\bý«k<:™®Gçáñ`t6Tþ»U¥øñÅ�j×²Âéé×q8¹9¿�‡Ð‡Ÿ6�­-øô€8²ÅÑøŒEH2®ªŠæÎÉ’ºI~¾ïP]d2Íd
›écÙöl�ä¡ðx•ÆJ€	¶“£J6Á¿fXÔIx~î¢»^£[ÔRÀ6~™Ça¨ýÀ³HúAý8–-LÙ+Œ�ÕVç{Z�mÓ([¬ 5ujò¯pK¦Ñ€À¤–úéªggûÀH
åOß
+
+7W*¸EH8¨F«
+j
+®åïÓ‡žÑ¤Â³t¼ƒëFáÖ�­ž›]Î3ê{@¨´l&ù“õUQAdI±~°ß„#°ÌÒIF%Yàüˆ£LjhÌ±Ì¸z™’éÞž.…+ògˆ�ŒæàçÅ³¬ÐÐÅA³°bÎ–%šßÅ-·ù„Ê ‹·fX²¸"syiõ©záN…û‘ókÕhø†õ�fØz`NŽIbžjæÄÁK&*ëe“Ð™�Êët¥o¸êöÿÍ6å£]ùyeM^Y•WVå•V^;ww¶¶rÀ|’J~Õ¸4Ð�ÆL×½ÞiÞê©˜‡®jÂ{ª£#tÝE®Ôê@5«=]º	¡8Øƒ{Æ»L(€â¥#†¿âeîØíìrVkKRÑ¸²{ðÀHl×t­ô�½ROÈü¯ßªÆ›ß7¤ß<%�w§AÞ
ýNÙ’znäþq�ñRDçü�¼»žsåê[YB};“‰¿fÎ	ª–³"E-@O•=óßÜ™=X�G@WßQ
Ó%X¨©UÄ„½5DzðQßjn�Üì
þ»GŸa
+}3OøfþòÃðh4	ÃüÀ;ð¼~€]Ë«EdéWñ[.ÎÝ~
üíúày-3Ùøg{ÿx›ÂßŒ¯WäÃ�_Ä¯=¨"iõË7‹QÍÏí¸�6e#U•ŒÝ�€nÊô +$N]|}£ž¶ûàeyôêÙÒs*ÌJ�¥¯yqXÂe\èmYúï×ˆŸë2¾hõ•õ7ccþ=ØêŸï:¢äªLóì¶@µŸšA¹*yÞÁÇ�ð~-žžÕrD¯M”S­y^…X¤˜wWÃrZ5f£!µÍ~[ BŸ½^¾ó(L™'XS¸ònvû`É‰Ä:Õ«niõUm�Qd¬ÊÖ�Žïä£ô‚ºÌnÃß¸µÚå�^©[I½qÖÏ©i.¯tòÛéL#®iÌâäÀNY°ž¤ZI¬4µµ‚æì‚ümÛúf}ã{1i‚žò­‹ðzà±éÔ³0k+ÿ›V¥žýz{wMû¾gEì¼¨%}«¶s¶<Å(n~|Bè?ªØk³zá)x·tã·3&ßvû+;ÓK�÷š±Ç
+À×Ì@î¶†ªìH[Z
ýôªïrf¡z¾®-ºÿe{,%(“À1ŠŸ@25BªÆxˆ3¬ô¦˜%	[ª÷Ÿc$õE°wKoé6lŠ[ºÑ\­ìßÖYo:ÿ\[?jT
y½CVk®j>7Øµu·Ýiõào³³Þ„4·Ñ¬¹XPQaàÇ×Ú’ WS6[ôÙ[­ï®óZ]°6SÄ6ë•Œ¦§\›ŽL‹.Ô–£²+Ù>ÐÜ|å+{?[Ÿ¹ôX`ØlÌ‘ðY¦bßßØ™mE2ÃÒ"qí¦ùÎîCW[Œ\ð¿(Íkst»ó¬�íÿæ·ryS¯ÍQ¾*\¹§êcË­¥Ö~z^YZyFÇˆÆj•÷ÔBd6}fÇ£…ôiƒÊ>ªE¤â=jðdu?ºÎ¡ùHj-šôøÙB¿·gÆRo
+Î7DXEjÃp†Â_Þ¦ð6z¥ÿÂ§BÎŸ^neÂº‹ÿö¤X_“u×Ë¹vRÎ"¬"@&·…*Ë¶}öné¦h©¹…áZ Nr¾©Öþét­nø¬µ®'p9‡š¿^ê¦ªWS Ðª^ä4'qÃxaï} m—RÍ²çÎsç…QÁJCA¼ïWÌÁC[ÄâÕVm-"…z$o_^7¸Ý]vóZŠøïòžV�If23Éô6¹„š­§Ìƒ¢Y¬¾ê1q¹¾NÌxd0Â³“‚F<C
+eEl°v²çƒ±ˆé˜eë;Ä<Æ�§ðÆY¦”ÏªS}QóÍ96\QQ¡€n9cZN�Yr‰còÜA¡†�A³T­Æ\¾ïc†:FÓzû£Þ¡½X…!¡‰yG*1œ#y¦ÂØzÞãj±|Ú,»U}0u¤8PA-åK‹kD´_b›-ÃÆúylí¸$²Œµ£¼Š/ýE&ÆHPÎM7˜·ê14²Å»€ÔV^,š6ØÎ•ÃAÅöNû„-Îê¸#	Ã+T1ú‰ù“½eý�ý{>1æÅVMoÛ8½ëWL‹4’'î^íØë$›bt»šC�mÐÔÈ"J‘Zrd×Øæ¿/¨[Rdí¥º&‡oÞ{3éê÷,É B.™ÁÀ’œžh—¡�ÿÎ¼ÉÈƒ<&ÂB,$‚°�1C cxHÄ/=("nu¶3b�<„k£n$S_Ñ�…+f.WõÿËcøˆ+fI0bŽ®l½°Ì’u&ÑSp­ÈˆUNÚØ*á;m€„8—ø>»‹–‚£²BÅÚ¤Œ„VcÈ$2‹°¸-Î½¿¿½ûðñÎAÂ(a[f!¶Ì…l%@N¼Õ¹á\Gµä‰§XŠ6cá!aæ^.™y^n/Å]f°™ŠâYg•L¦m¹øÇßÝILQÑÌó¸dÖÂuNÉ§TÞj‹5ˆ4+÷Ë�jõ?`2ÁrÃ|Jå;'d4)Ö3#6ŒÎ¾•ë3¯/~aÔÉÁµ²drNÚ\VP¾’‚˜?=íCƒ:g�$¬H¹çÌùv±¨v`Þ`â¶Ÿ½^ô„YÇ	^T®hIµ†³H§L¨p
++­e3Ï¿9šÀ¼v:ð'“ÌUbZùg™hKó×oìë/þx4; ´¹$G±ÅùbQ@e†°rÐ=)7ª>x±à:W„°€·-u
·—”½-x÷�cæÄ�4z�4dE{¿aŠˆ!xU©yii
Ð,—{
+Š pÛfì�ý �µSFŒÄÚÀÛð¶aî³÷K+µ¿‡KgNCíz[,Ìõ„ið¶‰SêâJC©š�ïf¥ÿãV^õÑÍX¡6LŠhØRÇèq—¹ûeÉ�–z‹&¨ˆºzA´#ª�0Ÿƒ¿bVp¿«¦î÷º¡T$ñÆEö7Ö¸äÕOù¸“Ü`äÀ˜´~ß¿¦íúÅ´b©û·&®…É6ü·[A<iÔ «ƒ»W–Oú+*ÚÚiTÅÉ|t!ÝbtØ54°WÈšÓà7EÌ0z#Â˜å’^Öæ¾t¿;i\ûLøÙÉ[½+o¡cÞÁãÖXQ:Â¡¡Ü²£8Ñ½¹Eã¾,üÎÏ[á¯ªûPG¸v+Úív@xQ~v ÆàOý°¸ú1“»ñ½3fíV›è8Ã>V‡SáþÌ‘9Ócüt�¾×k¡* ¦Š¡ŒG'Q¯Àö :??©ëô$j^£¾�9ŒØK}ðÉN¼¬OŽ¹gïÙû�SËnÛ0¼ë+¶€K†èµNÜ$nÒZ)�µ’ØÐ$±\Ú1‚ü{AYŠÉ©<IË™�™%yúÕÕ
+”Z¦žII~ä�Cö9›&“Aø]+¥ÒÊƒÄ`KXÔj…ãÄÜº
©ªfHed.µ0OHìáT�Áó¼û8ÂæÂ³~`@‚SßÎ]íÐ:�Â ­aRy`K¾¼¶\#”Ak�oê­•Dã”)--+k†à4
+�°R¸nx·7ó«ŸwW±UŒkÁ°
+å·ZXÀZq
Ã{H"H[t‘'‰KôNH„E-èÆ>4™&Iðo¥k¥ñnã—Íg¤L“Djá=\®ÿ,õÜšRUq÷ÖJÁ–à%˜p¾[@TŒeGj%¡'›ò49_™•"k–høw{Ç´¹V¿»ðže›rKp!×JBŒŒs…ÇGi�g
+’Ó}é}­a— µ<ÜWkÛgmè¸zqâ£Ù^8;2ÝöÝ–Îv“9Bm•ÞP]®øûúqº
+9žKš[«¡Wi›�}�î$÷<«Ò°WŽ‹�™C«£Y…ü½�Ç[�f;³­•Æ·#µ´iì¾£/ÈþEÉÇü^)´Î…|Ú‘öF×0ï-=)S}S„’-mÒl4‹� í»xƒG"p=~^ê~6M¶†F3|Vž}šÁÉÉNqW>žÁÁ	ŒfkRŒ÷‚Œ2UÚ¿´\Ã¸‘žtÒÍC>t¾¶Aæ¡Ï�#X*ƒÅÛ—íK$^™ê¸[ÿãùÆHŸþ;Sw®òC‰ÔŠt·í5ùÍRMO1½ûWÌ�Š$âC½6@C#ª"U	nm…&ÞÙØª×¶ff“¢Šÿ^y“
@U�õem¿7óÞ¼õÙÇì2Td2�DÙ[}ÐÇLrþ~<5§¸w^ ö�Àdd…TÃ­ó+:1Ð1æ)?²_:…‘Ã%G‚OãOb8CŽ4[ôç“Š.ŽàŽ(ê1Âj‰áLú‹Yv™RTˆ€±›¢²_´šX¶‚Ÿƒ:‚º
ìN½°ƒ·…ÀÇ:qƒêS<‚…`åiÝÕ}½ž_ÝÜ]•VÝ`êPa�•—�U°öê@Ëð’Z¶6UýÈ§&bC’ÑÜ:äëô½KdjL+ÅW´E$³�ZO�±E`žšœÄ+]¶êæ)Ö~	¾É�Š*0¸ýmN'˜­�È·E¾€™ý
+•àw LM_×}a³ŒŒÍ~ƒaÅ–·mÙ.‚·ÏþlŠ¢ÜZ!3>î•Ž·.Ë:(I_P8á¬ÐžÌ›:KÒb�¢zÛý³î1Æ%T©AÇ`(×‰	­ƒÑP††~Ëò5Œðñ…Cya£×YZ“¶a¯ÃëAúÓ½ú'ó¼ÛmÕqZC¤u7ìÕ/Ky“Åæ�oà~*–à�íÒÿ5ì×S¾
+{‘Rø�"VnéòÛ²kB}Oæ]PËj#1¼ë+ê°OÈƒ\×^ça’¬!ƒsØÃBèÑôX"²$Ô=qÌ’_4‰CˆNê¢]=»È.£c¨ðD´x«OºÏ,¿Î›©9;28Â£ó‚Þ†d*ŠÔcåüŸŒŒEÊûâ7N1±
®Jd\ŠÏ\T0£ù²=Ì§Ï�±æ–D=Eüæ�fr.³ËœràJÅ6E-¾4ù¼Mêýìgzeo9
+ÃÇ>•-©Oñ90	ãÅónÔÝ/7ë›j5SGŠ	:/ïYÜaçÕAkyIC±›ºCå3iË’É2VŽÊ2ý/25f�OèÖ^ïEy;~«djŒ
$‚»�Z
+£èÏ6,Rìýüª;Á7øŸ€\’²­›õC´µ6¬÷ÉŽ%'Ë(J!pWÃñÃ›Ÿ8,ðaV_aJüF=™5mNæõW­¤0(¯HÝ¤™ŽoæÍüuQMoÚ@½ûWÌ�ƒ�HP¯@hZJT¤¨B%Js¨„†õ�²ìZ³cSTå¿WëuhsÚùx;ï½™ÉÇª¬ 'cQ(
*lt­‡ŠÂÍ‡lœû	ôá¡ä[P¡(ø–%7t�@‹˜ùê ¼-R“Á'qŸ-ºg
0Aqt»9å×9M°¢
etð•j˜„Sá¶*+ò•¥t9ïTxS«—p$¼óZµµ`ÎìmÙ�ì
+/;Tön•%
Ó¾ýw¿˜Í¿­æqTkLKTØc€œÃ+å°g-A£ùàk1Æç'ËÃÄáŽB…†`Y¢,üÏv#ã$©Ã¹tÇ–V‡ ´kÃøeÜí?’öîôÎ¼*ÈN—(�dœ$Æbpï
ÚvþÓÎÎ¼+xôKÉå.Ê¿€a¿·
+Ì]ÃâÝŽœFÑ±W	7¨=úÛ'¯­zcÙ@Q;÷ëµi%ÕFÓ§�� gZ¢àáÐkþß¼ÔU�•·2PÈéhÔ¥CûÞøl|žÑ‹‡»švàæÂr„½�‹W2ñègï[Ò¸ö§­¥<Þ
zÜM³œnÛ± ¤µ¸èÕ´;4kÓïdQ¹¡%jùàÓe·¨^žÙm¿°�Q/‡4ËNú_’?�SMoÛ0½ûWp@ÑØA>°ëÒf]³+Pl: ;(™Ž¹Ê’@ÑÉ‚¡ÿ}�'nÒÓt’¨G>¾'ñâ³/=ä¨�bLƒ0iy–�Çpù1›$ã~}øYR€‚ðŠ\ó’V8J AÌœß0-K�Tgð…-ÂµQöY\(¶xµhÏ£§xÀ…
+BÊÂ7¬‘á"´�+_ztÞ`‚²9hg…iQ‹ã°#¼uR"µ1 ÷ìmH£
dÇ•rvÞ 
++Âu“w7»ùþpK5Â¤Tk §°åÂÖ$%H\ÍA»¼•<N¬ª0x¥æ¥â;÷Ô82I’:ìC·dða«fS&I¢�
+akà¯ÊÌœ-h¯ï�Vâþ&ã~®VŠaˆ”1ì™VJÎtž$oÁ7vEìl…VN2ðpwœ63ôô£_Ÿf¹&¼KðõÂ�†¢¶:ÏÏÚÙ \kI»Ô]®A«`×ò Ë¶+ŸíDÇu-N;àò¨ù#è¶î6typæµeÚ£Z]ñøú¾º%J|—4ûíóuûôL•âMS­ÛÈpºD™³û�ZîleLó
Ó¬ÓS¡ŒY(ýrHî(l*<:~!»üJŒZoÒl8�Ÿ5íùföþT¦—íÞ%.* m{Nñ	içç²C¸kø‰GÃéšIðQ±%»L{×NJ5¬c_*‘»¶}'JW›Ü>õ9d1%Í¸…èœP…#˜o'Ñ3ÈP²Ë“Ò½ŽQ¯o~øo…ŒR³= ß¥hA;’öw¼&ÿ�TQOA~¿_1Mh8Jú*jB«Ñ¢‰Ø>XC†½9nã²»Ù�Iãoö8à8Ië>@Øùfæûæ›åô«Í,$$:Š=;)xÂ+KþìK«uÛ´aœI©TÒƒEÇ`R¸Ïä‚Ž#(cWNÎ2†X´àÒi‚¾BýBŽ=œ¢Ót1Ýü>Nè¼4EÏ5\QNNýæâÂf–ŒU€€:a4;9ÍÙ8_6üfpF�æJ�Øvh%iO ujÜYÝ«=ÁBÒ²È»½GÃPªÆ2,ÑC"ýº%°”œñÞäN“l$w#�sòÁ}†îÚü.&Ò‹¢Ü^Z„Î€ÎájòB«	½JÏ¾·öÖIÍéú¶�ÉâÌ$Tjø*ÈL/Š„Bïa¨Ò='Í—9g£S99·ŠÂ�‡ÊíŸÀ:¹@¼µg¸ÝýMÆw7ÃœÁS�§‰VÏ$gùôX˜yÎÎ¡ùýz|õØŸ\>Ž¯Ö)ÍÎ.a&Ya	§L¸½<�ðÜ‹Šïn»
tUaŒUž
ÚÅÊ4›O•»�M&…—Ž«•ª©­R~8�àßÑy%
+gµ>öv¸[†>•4KQlRñDô‰™£Ô­˜£*ýd
+ñ§ºéq	ï€'•žœTœhUÉ†ãˆs§!Eå©·�”ü*€÷ÂŽÎ3ô?ÑIœ*Šßuz*I<·ö$wÛíué6\pæÌr½GÛõ«/i‰êœâŒøSÜ�×çYj}ïÆ¦@}ˆWÐ´Ü×—Ï-nŽà~Ë!5>ûfgË¬uÐ‚›Òa‘˜0#þ˜	Ûr~)Yd°US#Â?Wý‘žìA*{D�½ú¨
+ÎÕ¶»Ú•÷üÏº}BGîC…J1Wü¾ÜÎšÃ›7õ‹6K]3¨¹gÅúó-úåY[oÛ6~÷¯8²Z
+ìe{�7]–a¶.h²Ð-ÛÄhQ#)§Á–ÿ>�’(‰"e¹°‡ù%E~ç~áÑ«×ù6‡FFR	š¨õ”£¼ø:^LÎN'p
+÷[*aM•�¡€¯ávK÷øåÌŽ+ž?	ºÙ*ˆ’ÞˆáF²?P(	¯ˆÈðrU?™ârw¸"RQ’Á÷X €W²^¸Ì·9òœ¡Þ$K!á™tU(.dEð;.@mÖc�Xêz7£	f�fk.vDQžÍ gH$Âžâ£9÷ÃÍÕõÛ»k
eS[¢à‘HH©,ia
+�TmAiá%/D‚�ð´ùl’‘Êœ$·["nøïF#‹É¤�š¯,Ñ”�Ê‡”ŠEwq·z�J(Îø#ºïd.h¦Öåê·?ýxÍp‡™²ÏoyŠåÃõÇs}¦|¬¸øŽ2¼{’
+w¿K&Š‹§Ðý¯£óþ’ò¬þ;ôîŠgR	B3uK„Ô¢LÈJ¯$
+F¤,½ä·»âÙšnà¯	ÀÙé)\î‰€ßvL³ µ©×sA÷D!œ$f·~µ˜tO÷öAÍ¶bÅhÒèüá!1‹DE5O-&fA²!:q%©þ�hš/8èü.ºâ:§øúTPD}üÙê­D<…KµüQ6^S½8ój„¤©6yt“IECó'´ý8ƒwøg�RÕoEû1>‡=§i[ÚÕ4ç”ùrƒê-ÙaWÖÑ?º†¨RÁ–H½Oû}d â¶v
p^½×àå¡
*çPÜ!@åMŠ™¢	a‘…š9löˆêŸ@UˆlÑY¶OÏ€Lâa^óÏ—‰@¢°Šùhª7Oã…a¾”¨Þ¨*]ES-ætµ¸�3}J$Mk2±uêÙ±EÇ¶Æ(?…Má2W¦ys`6¨Ì|Iä�4ÛD±Ÿ‰ pS×`¼·ARA|ê§`¤"¥	4„�!ÄxbŠ•¦c�ø‡j1r¼ñX)t‰ô@¥®ÜQ¯aªD�S8‡éš0‰ÓvÀxÜG’½‰Ø–™ÜR®é*²Må—ç°âœµ¼¦Œ!ûVKŸ@ª"/_†s‡Ùì3Õ0wPˆ»ºú¶Sd�l‰
¥4³`«½eõÑ{ñ[©(Êðlûà=8_êÆÉr¢{¥7+ÉY¡ð–¨mäã6~->„P¶Àß£Ïáœ2¤òbtmqSüs?Ö†«Ž'4s"0Såÿ%ÛW[ÊRozž:_v\ãª}Åw�Âœ²ž—Õ¼zë+è¹I&MFrÜo¼¶
ï �Ãa?ªÚâhzûý›wð…„Œ+Xó"K�f�›ËÈÇ³õ/þ“9Ì7†ëf�¦2|Ž[¢e­‚Ö—Ä
$M¢6[‹ÑM „ÅÃ1D�}lI8‚“U?ÑšÊ6w`jÑ�ºft@çKüH¥’Ñqé½¥¯`”UäKó¢TÑûcÂLFñ9!ÈS[‹Z{.àý‡–Þì½§¹¶œ¸"£k.�$[ÛÓ¶óÅŸŠ§hzvf¢ä¼ì)�ÈÉÛÅÉ÷š0ÉxŠ÷¼+í¡¾±¶�;TÆèv
+·×/{ç9TÚ[&þ•ªí]Ž	]Ó¤×«Uð^\\@V0v¨¬Ëmw¿kö`F:Šy÷öd‘k¡!öþ×ÓuØ?î‰Ø jZ’.à10ñç×Oö¡“,][{¹tmYžª8‡¿ÿ†T>”^W¾,í÷aÅ1EuzÏ9Ó3¯šQZ*±^ÐµÖÁRÔj]®
,û
+l´wbùó7sÑH¥ÆVƒ½|WlŠGøvîdÒÎ©i<_R…»è+ï¨ÁC!ÀÌ19ã‡¡EwxÐ£‡f_àKuÍÑ›hôèÎ—$Ï1K«¾8s3�=ù±œÖ5Îâe§™‹n4¶œÔLã¬·™sï�E÷ærÏ£Á®_Ûég.¸ÂD‘ÛIÂ¶'CcµÖÍ°WVSM÷ÚkÜú˜+o¿õ	¦C¸Ì%a»9Ýd\à\o!+†ó
+Ð™·º-Ž�³×­¦a0ØáÜ(Üý{]N�æ›ŽÍÎ4>êlw;i3b«‰sÌÛÅ‚ÓÕ¸Á‘a?«öº‘•ö›”ÿƒ�àåË~R¬oc%d­-ïŒï?°½·ióÝ{ÐB0¨³€¿‡toHzšÛŸýjœîïÂtšžó/¨%œoÌ­¯–-4M¢{Åìé}±Gœ	‡wHÛ*0áÉ½ËPH¤ÒÇðB°žœdÔ1|œíZ·[}+~�»\=�xï‰-.>máHV�«~Ž‘ªÙÝj]ÏeK‰š1å°…ÊmAæKÌd!ðºO8ÇZ*hAŒ±ž”Cý®kuue¾”3‘�LÕ�ôÊ/oÃï¤ÀÌºËƒ_6ÍtTbÔ�•xô½™_}³^zrVJMÙµø`¡õÞ+ÊÊiJa¨ñ{‰¨Öœ~ùý×:·‹!&Û3}…`zOoé±ëáZyôç8·8�É!!Rã¾Ë�¦ØÊ.†àQèFS±AÑq_êJ�xžü­Xmoâ8þÎ¯­*P�½ûrÒÒv»ËöMêí¡m÷îK¥Ê8Câ«c[ö¤€Nýï';BRú’OÁ?Ï3ãÉh†£Ï&5#—ÌbäÈ
+N÷´0èŽë[ƒnºp›
+S!„Ã,�žÂ8�ØoA°i³°"I	"Þ�/V!|•L= %GÌ*<�,÷c<9„œ0G‚)¸Ä-¹åÂ©I
j#ÑS1p­ÈŠINÚº’ð\[ ašK	|Åî­¥à¨‚PSm3FB«C0™Cx8ç®¯FgßoÎ<TpŒRF0cbá
+.Œa&(òÎ;�[ŽÀu¼tyÐR,CgG§Ì^é»‘a«•;¯KqÏ87RÇ8Ü\ud�võÅ|âÈÖÉŠ¬XúÆ¯¡}dr½r+2¼Ê²œØD–,¥œs!ñfá³»oÂ"'mÛü«÷gc?øs7’âî/ãµ¸a«Å%sFZMEÿµÝ.œ>2gêQX­2Täãã÷Œ�Œp½7lm+ÁG¸kÞ�
¿g•ž•‡L>‘‚¯ãyÏµrdsNQ0ðOUyUêáÊb)²¢j½ù¹)È+€cP¹”Á¬SË?>¥z'8®E¨fº&oÚˆŒÄ¢‚õ¸à­R¬RÎšŒ:kÎ§:{q®ˆiaðld¤K�á*×¢Î'Xý¨h	Bë~õNRæŠ÷¨�êÛ�†þXØ¥þÇ3@	R
hØÀñÑw¹Å³¹pä¼÷&)·*XVãòœ•k>„�ÆÇáofEÚ—8²— =÷îî”‚¶H¨]jï„§BÆQ»o¼¶vEÎ)
Ûé&¾‡ZÖ¦J—H…àç4ú¢µm	ÓŸgr)t;é…Ô&¿ä”¾‘–å”îGYTÚh´¤­@÷f�×PûI¸ÖœÉwT =ÞþÞ»�õb7q™�ÆÃíqÍã‹÷ãLL²›ñ’ÈŒOw×Æ½yS"Óãs7ý-fF[fÿhû Tò~*î)3÷3û°ï·u¥1)COöÆ4Kà~yö:¿ëu°‰²3¿­þ9½æãj’5êîë?ùR×K*Ýô¼ ú:^“/ÐÊÂ~‚nµ–¯(H¿C±F<èv¬.œRjõÌÁw}1¾ø*³‹s�«ølÎ1ô0¥áàÅ¬86f[/“6ÔïNtu«G:Ë˜Ú,qÁ	àŒx
+Q¥i^É…lt;:Ç„cøð]Î‘—=rb˜ñ0õN÷áNÁ™ -ˆ"'‚�¶€*œð“[¢r“Î	•óŒBÁørÜÿPëyB`C�µ5¶ÑRZ£ùÝž!7at×ÂÑO+}ÀZÙÌ
Ïë÷C�vŸŸ„}¡1#6xù{ksG{¾òu¤¥Äb¿:Y›ewÙ0ÝhÇv÷á­—˜¤÷€×ìÈ§Ú"ó©P¹Qû°}ØœY6Zò&&sp â:vpGxOüy‹aÓ ô·wÂâ8jlû§˜´ýùChœ·;a>úŸËq»Øù½Ÿ<]¢FúTI”f=(ÄìºË?ÙüK‚çÚVr)”šÆ¹­ä(=ë�¸|-g¹åßQ{üÇ·ÕÀóÔzjý¥UßoÚ:~Ï_q*Q‘ ºÞ«Ý'hº®Œª“v§jto“*ãˆ5c[ö	müï“�’Õ®nöùõ�ïø³oÞ™Ü@†\2‹±#+8½ÐÖ KÿNÆÑõ ‚<çÂÁBHáÀ0K ð”‹5¾‰ xL´ÙZ±Ì	bžÀ{«î%SßÑ’ƒfÞÍ÷ë7Þa†sæH0�X …·ß¸3¹Am$zG`*®Y1/H[W|Ð(GXR¯«{o)8*‡ ÔBÛ#¡ÕŒDæÖ7!îÓÇÉôólêS…Æ(gæ ®¬…lå@¾y§Ë¸Îö-_GŠ­ÐÆžrf?êo�‘qÎãRÜWg¬P´‡ÝÊñAHœmá*üG—Ì9ð‹z£¤fZø\p·f‰ÌD
+Tä«{“±bÍ¡—×¦qÔš0žã=ãßQeGaÜ»ª�ò×FøI¬Äq)»·Tq¦˜KÁý¾¼p­Ù‚SÜ@Ü€8lƒ*Q$U·þëyÊ¯n�¶[ì8†åNZ7åW»ºµ2dw”[½q°gù�	‰ÙôGãÑWn×';Ëª˜ø«•Ð+¬LFabÇÈkŽ 
t6tÙô™-kÀ�&®nsæ¦Šì6à]Ç¼Dš[VÖQ•½NOvÛ@
+ZtF{9¤Ç¼†|!×°‰,9àÝgÄs£¬i‚^k^¡²çnÎQ·ÜýW)ãØà¿þW…?r/ÃÇçç'@kµÁ¥ƒx¢3Áe–ô‡'c{%Qÿ¢sl‰qòª—O'Gí�&#¶Åâšß0ºZ6qÒ%èÄÑhÄ.‘±g«]4B„›œ£sÇµþÇ0ú¥'�®Ï;„ŸK7*á	ƒË¬?¸ºenFV¨eœ;ùzOŒàœëç½išÂÛ¿þéRb‘
+«'^³q‰}‰äWþ&ð»Z›hE¨J‰$z¼„ÎÎ¿ÊíH[<½Ë\™¢»{¯³m|ÆŸõw>Ý®ñ
+ÇäêŠ9‡–àÂ_1Ç§÷ÌÙÖÀæZËÊ£lió¢Ü�~YÚÁá�úÙIuÏ½ªÇƒFÚ¯îA#ýÏºQƒ­™�l.±ÿêº­í;ÚE¿�QMk1½ëW¼C!»Á$-½yí6mp[C·äR(Zí¬WT–ÄÌ¬]SüßËnâÄøÔ¹Ió>¥ÙÇÜe4ä‚e*DÙ;ý¥ûL2WVæúÒàß;/h} xA¶¬H-:¿¥+ƒq›òžýºS®Ä'Ž„ÏÁÆßÄ*˜YŽtSÏW
}˜`Eµõ6âõÄ˜Éñâ&w™R4ac—¢²¯{M,Ï†_C;BÛ‡÷â> ƒw…àc›xcÕ§8Ad…°õ´ywËÛÅýj1H�Å´³Š�4^ž¼¨ÁÎkÊKêÙ\jŽ•¯M´’lá¡³¼L?Ç©ŒéeÈÝàQÖÔçL\�-úZ”+c\°"XÄ­ç7õ.9«‰ñ×@îëàÝ+oMz‚¿,®ñ&eb«>®W{QÚ”ÓSÅg©a|‹â5Sñ”¢8§Oðv‚÷e‰ù|Ž‹ÇåýEy¢1“öñèc“vrâ5�¶œ6«>
©¶AŠ²z¡Œ9SøýŸä›ÿR8˜ƒù•T]OÛ@|÷¯ØJˆÄMÔ×†RH0M¤AðPPt9¯ãç»ÓÞ:*ü÷ÊŽ	Hõ‹åÝñÌÎìÙÇ?]ê F©aÓ3)É^9ô?¾…Ý Ó
+ ·©ò�(� <8A6�ëTÍ±@‰è[·"5Kš2„32=-Ì{8dðtºynÇxrcœ
+ÏJ`ŽÇ~S8u©Cë4@&i
“šælÉW‚–€S„$×äV½@k%ÑxeK™`eÍ8�Â#Ì.Ê÷~ûÑhT¥1NÃBxˆ•_kaÅ)paÞÛœ$‚´ñÆr'0"Cï„D¸N
íC™H7r_Ìed¡‚H¬&O¸šàRyöÝ·íXQÁ³®öD|‰œÚ¸/´Ž–]�Y÷*�¥q¼òŒÙÃ¹"”liÕ
‚D¡Ajá=Ü+Û…�Ì\‘5\2šØC½ö7è´ZåZpJÈ9ð,XÉªÚ)ï.Ÿj%«Îëð	Ùlœ;¤_ÚN…öÍð;xÔIÅ]\§ÁEÙiLÆÑÍ]tvKÈKPçß§Âl†[‡ñÔZ½Kü>Þfcpu�ßï¢ÆËûzâ‘æH!~€¿>»ìÀßLXÏ‰S²ÿÁ¶öå¶õ5CÞñµ}¨™S	4¿TÓìfÖ�ÅUÎSF¼¤fcd!µ§­ÒòÈ àë�hT†k¦ß-ðu„7Aý©EþmØÓ,ó}ü|ç>wÎû¾Õ–0¾ÊÙåü?‹?�‡ý«ÑîÚŸŸ÷ ûÖDY^¼óùâ÷¬p}Ú{Êœ+úhƒ{c«>öM|3äž2‚V£¢†ï„É2Êâ7T×¾O•Lû6Ë„‰ËÏ�I™Ù®pc‘"a—ØØ°¾ÿ�VÛnã6}÷WÌ$N¼íSGi¯·	°Ù
â´}ÈM�,biRàŒ|A›/¨‹-ÙN¶]>YœË™9sHúâ×,Í F©…Ã�Ø)ÉSÞdHÑO½agpÒ�xLA¢4‚"È„c°	Ü§j‰g(<F6Û85OBÙƒßœA¸ÖÂ|CÇÂ¼šÕßg1^öa‚3A¬„�ÌÑÁÕWYš¡Í4zG&i
;5ËÙ:ª?Zœ"$¹Ö ·èÞ[+‰†”I¬[VÖô!Ó(a©pUÄ}º�?OÆ>UÑ§‚a%bE%Æ°RœûæÉæN"H×-:F,�2!îSání×‚‘a§““¯ËH�Â9±™~ÃÍ×Š˜†m3®Q–[×"¾CNm<Z�×3ïPÚ*€�JãdCŒ‹¯”CÉÖm¾ë°—ê1uv%fÚš(#4H-ˆà£ÖVÅc³TÎš\3š˜ ¹÷w`prWKá`¼FéÇâùð†Ì©¥`„.V†a§`r­ÿñ›ùAÌ*U2ÙÅB˜¸ŠËò™Vˆ+¹c-qv1É3t¿k;šÂÞù‘*ýrÈ¹3`p„:	»ÓÉøáÏñC¿ØªË{½aòÒ‚ÝâM§Òb—K‹�B—Ð-Ñõwl[î5à3áÐðùy3AZ!úÕõ;½¬@Ôäï�²RA7v�ÛQ{fÖêÃþ÷U7_îÆA¿†n•ô²�Y™æ®Ø«†^Ñè¾×¡ô*�ÁÑ.æÈ]l?­¨ÂwU½‡�7Y÷«¨¥òñ¢Ãà³…Ô.â-!ƒ2€;%�)U´ì©jWB‹Ê§’àçïRÚ�í£‹ò,³ŽidµuÉ9ËùÈä›t)º5ŒNHVK<äªj'šðh¿E®C
=Žî4ô¿“skÊåyÈrÞ}F5Âù^púh«K"¼csFE´,­H¹æ]t}¤ê_8}¤§’Z³)X¦n¯Kèò�ÑÖ.ÇÏb’K‰D?0‡Ê!T†{ûyçÈµžÞ?Ãe¿¼yyÌ‘ËÛóZ™Ê½vêŽJ=ääÚJ¡3e‚½ÛÓYFéÐ&Ø_�ÛÝƒU�@[°Õ¨š/¼‹¢âÙx…­#!G¹K¬CáGú¾AÿGNïEPˆ „;Á3‚.[{€é•8ƒ4ÁÏ—ƒ—_ ?
+6/5ÕÅµâ‘�±7ì´2]ÖFˆ¢ÞïƒÀîIh•5í%lQQ˜›–—7dTñPÏî¥ó/•XÛR9}÷WtRP3¦¼8É¾ì†�%€Y¨J€Â„d‹Py¦íQ!K³R�/›âß·47ÏÍÆø[êËQ÷Q«›Eaú‚it
iî“GËÍáÛîA§¿×�=¸
¹�1Ü@Ä4�ÃuÈg¸ß�DâDEKÍ'!�ëwá“–Ç‚ÉGÔdàÓ�Fùïý?ö`ˆ#fˆ3	ç£†&_8ŠÂU$Ð
+“øJ’æ£˜”6™Ã3¥�B„q,ø…w+-¸�Ò p9VzÊˆ+ÙƒH 33ŽóDïóÅÉàr8°¦’ƒQÈæÌ@ÀMê˜s
+�ìá�Šµ�à« ?r¿#ÙMÄ|„ë�éõ#‰ÈA§+)
Áõùµw|qùéæŸƒÚêÝàfxquY^Þž^}½MWÆ±ô-p`Z³¥÷ˆKÜ�©mû*–T[¡à˜Å‚<âSüOIôÖåÐø,B¢LOê›ôK‘P6V	¥áJzB±ƒÚvþ¥þÉŸ×U¸äÞ¤�Ö®6Ï…‘ÛDÔ×•á�F´¬m™HsIãÚê"ÀQ<ñnØHdÖŽYð)TÁ	b°ð1²¢é^–ò3.p¸4„Ó§\£OJ/×	Ø¯)ÔÒÌ'ð3rÆµ’S”¿:ý½=8š1�æß²Í®FZú–™;õ5ÂýÃA'ÝŒG‚û«y^B+ûä¦V2¥næÃ~v,»ûXXËD�§NŽ%•ßƒ#
+µšWqÉdú­`&H×ŒÂ[u¢¦S&ƒ¤ÒÈ	ìøéïî{ÈÃSF§ÑÄ‚à0¡£›eÎuv
ì§—£Ÿ }¹æ¶»½·ÝÂM·;*¦(¦ìà‚Ó‰
+°›EÐ~øÜb^Â›r¼ì'‰Hœ·†a…2ƒ»¤"«Xt�å 0ûT?òg.Ñ$çNîœûú‡|ÝË7{ð®Y#ÅZ&€òºe3÷oº•„ìkÉÒ¹šbÁd·ûJ´Þ¬2ÓP)%ÖÐÓ2ÂÖK«sÇ4·×ÎªdÄøU?Þ*×…´s}~q7ðÎ¯¾œê	[°µ:³øÖº
+™ÙÂÕÚx˜8Š”&s¢„Ò\%¬{>(ß”~ärÒžƒ&V›õ•lZOÝîæhØÐkµX¶†Û^€W«d‚ëï@{‘t�KeËÕb		¸\Ý§Âü5ÑOÑ½EÆKL9Ï&9?V{bë�©[±Þ«º~–Q9òZfoÞö¾ñù,s¿æó¹4z©Â‹ÓYµÜ�­j<-l-	îeÀ^�èDas‚ó’‘Vû lQ1r"Ù®k8ø|ö‹&HÇ\2½¼´utƒùro_Ë3dküÂ�ár²Ýƒ‰ÒÄÏ8I4ÆÂ˜)4îTì6kò†Hn)ä™ü7æƒŒù4c\¤u°¡‘uAßOmOä>KÊ›XÚ6s˜jSÈrU¸gcÙä*	»¦ëô*»«²Ÿy¹Cm»M·»Nî*BÍˆËIÚv¹ÝBnÛƒ.6'¿há7màyi|²n§²Xô½®cœîÚ=íl{zn.$¡}Èø¬íiLêI­™w�r›í4ªJvª17‚£²7ƒ¶ïXþjÄÄ1—§\onXŠî¹òÞV:Ç<7ùû¬ùŒQy¶ªÞŒÆµLÂT‰\'�.ÖE¨­ÌÆ�\ußøÙÔé�£ÆãòZœ²…'ÑXÂyg(¬Îoÿ|·IÉ„jîa^˜</,ù*ôú}0\ú?«óÒO˜(�S5ÃÀ>ß“møæ!›!�?DÿÆJ'	…PúX‰]ƒaU?ÍV÷ÝFOý´&‘-…³=™Ù4ê:v¬ÞÏÇé&�µS·ë|½=q^lCµn>ßìÄpï*áÉt”RÙ~�|�äÓ�uÂ‡(dÚþ|´˜ŠüELŒå@$Æìà•jdEÅþ¨NWõiúÈÙï¥ÙÔ~ÆJ#óÃd¼*ð2;„†êÑl¿G©h]¶ì÷þ‹2êà‚úÙôÅ¥!&}”6ŽÉ$–˜;¨{j«S+è«èlD^§ñK�lÈÐ³<ý/Am‘$ÿrs'ú¾5=ÊJµÉß§ÎÿE�ÍJA„ïóuLB0xNÔÄ1 ˆÇ€Lf{�ÆÙ™aº7?ˆï.»sì¢ª«¿ž=dŸQ‘¶Ð@´°Ów=g’»ÛáÔLF#¼yÔ,È¶(R��çÝôŽeÊçÂ^1pC,J$<?©¨`fK¤ùþ2ßTt?Æ–öV”mÄ3µT0“‹0Ï>SÊ�:#l¬àRÔÂûVS‘¿Â§T žP·!Àý·wîÀŽ¢8Ö©4V9Å1r +„Ó±Ï½¬—«×íª[Õƒ©·Š£T,¿]TáÈê¡¼¤¶8‚KÕyb¢mH²u„�·e�výG¦Æ¸`E°hÕ¯NŽrwè¤+Áî*q“5Up¿Ì·ùE�ÍJA„ïóuLB0xNÔhˆ	Äc@&³½™ÆÙ™aº7?ˆï.»sì¢ª«¿ž=dŸQ‘¶Ð@´°Ó=g’»ÛáÔLF#¼{Ô,È¶(R�µçÝôŽEÊçÂ{¯¸!K$<?©¨`fK¤ùî2ßTt?Æ†vV”mÄµT0“‹0Ï>SÊ�:#l¬àRÔÂ»VS‘¿ÂçT žP·!Àý·wîÀŽ¢8Ö©4V9Å1r +„Ó±Ï½®Ë·Í²[Õƒ©·Š£T,¿]TáÈê¡¼¤¶8‚KÕyb¢mH²u„µ·e•¶ýG¦Æ¸`E°H±æýòä(w'€NJ±l¯79PCQWñË|›E�ÍJA„ïóuLB0xNÔè1 ˆÇ€Lf{3�³3Ãto~ß]6sì¢ª«¿ž=dŸQ“¶Ð@´°Ó=e’»ÛáÔLF#¼{4,È¶(Rƒ•ç=ÝœUÊ§Â;¯¸!K$<?©¨`fK¤ùö2ßÔt?Æš¶V”mÄuT0“‹0Ï>SÊ�z#l¬áRÔÂÛNS‘¿ÂçT žÐt!Àý·÷îÀŽ¢86©´V9Å1r +„=Óáœ{]V‹·õ¢_uSo+¨Y~»¨Æ�ÕC{xI]q—êòÄDÛ’dë+oË2mÎ™ã‚AÕ•P¥Øðnqt”û3@G¥X6W‰Û¨¥¨‚«øe¾ÍE�ÍJA„ïóuLBHðœ¨Ñ1 ˆÇ€Lf{�ÆÙ™aº7?ˆï.»sì¢ª«¿žßgŸQ‘¶Ð@´°Ów=g’Û›áÌLG#¼yÔ,È¶(R��çMzÇ2åsá¯¸!J$<?©¨`nK¤Åþ2O*ºcK{+Ê6â™Z*˜ËEXdŸ)å@�6Vp)já}«©È_áS*PO¨ÛàþÛ;w`GQëT«œâ9�Â�éØç^ÖËÕëvÕ­êÁÔ[ÅÑ
+*–ß.ªpdõÐ^R[Á¥ê‚<5Ñ6$Ù:ÂÆÛ²N»þ#3c\°"X¶%¬NŽrwè¤+Áî*q“5Up¿Ì·ùE�AO1…ïû+Þ�xEˆ$Æ�à‘Äí¬m,mÓ™e!ÆÿnEŽóòÞ¼ùfzŸ]†e¨pO´x£ïzÊ,·7ýI5TàÍyAíÃ2Eª±vþÀ£
+gÇ<åSñNÑ3}<”Èx?¹¨`J%òlw™G–ï†ØðŽD=E<sÃS¹³ì2§¸3‚¢…IQ‹ß5šŠü.S�:FÝ„óßÞ¹ƒ7…ác�ÊžÔ§8DLÂ8xnÏ¹—Õ|ñºYt«Î`êHÑ’Àzùíb‹Ö«ƒvð’šb&Ùò¸Š´gÉdkGe•¶ç�LªÊÁSjcHd—äÛÅÑpîN•£l¯’ßçÀ{Ž*¸Š_ÕwõE�ÍJA„ïóuLBHðœ¨Ñ°b@$�™Ìö:�³3Ãto~ß]6sìâ«®®žßgŸQ“¶Ð@´°Ów=e’Û›áÌLG#¼y4,È¶(Rƒµç=MÎÄ2åSá¯¸!J$<?©¨`nK¤Åî2OjºcC;+Ê6â™:*˜ËEXdŸ)å@=k¸µð®ÓTä/ð)¨'4]pÿé=ØQÇ&•Ö*§8Fd…°g:œ}/«eõº©úUçbê­â`5ËoÕ8°zh_^RWÁ¥úRyj¢mI²u„µ·e•¶ç�ÌŒqÁŠ Š{.)¶µ::Êý £R¬Û«ÄmÔS‚«øe¾Í]�ÍJA„ïóuLBHðœ¨Ñ°b@$�™Ìö:ƒ³3Cwo~ß]6�]Tuõ×óÛâjrÑ2
D98}ÕS!¹¾ÎÌtd0Â‹‚&DBËŠÜ`íÃž&gÇ2—‡7¯¸!î8î£MïÄ*˜[N´Ø]æIM7clhgEƒMx¤Žs¹‹âå©7Â¦.'å°ë4³ü>d†zBÓÅ÷ÛÞ»cp”„R“¹µr£D²BØ:œsO«eõ¼©úUg0õVq°‚:ÈwÕ8õÐ^rÇŽàr}Ažšd[’baí-¯òöü‘™1.ZTÌ™«££Ò_:*¥Z°ý§‡¶Dj)©àOü0ŸæE�AK1…ïùïØ–Òâ¹U«¥bA¤ÐÉfgM0MÂÌl·"þwÙÕêñ
ß›7o–·ÅÔä¢e‰rpúª…äúj¼0ó‰ÁMˆ„ (–¹ÁÎ‡Íb�Ë‡7¯¹1î8î£MïÄ*XZN´ª.zVÓÍ{ª¬h°	�Ôc)—ÁªøB¹DêAØTÃå¤ªV3ËoàCf¨'4mŒpé=ƒ£$„�šÌG«!§)J$+„S nð=m×›çý¦_5So�ÔA~²¨FÔCûò’[v—ëKå¹IöHR¬#ì¼åm~>²0¦ÂÁsîl{’7=¸9;*ýA ³RªåŸÃ§ù2ßm�Ok1Åïùï¨"Š½®¶¶¢T("Ø£P²ÙÙ&4›„Ì¬(ýîeµ¶—çÍoæÍ›éC²	¯3õX²3ò&çD<›ô5(ðj£vžàIgA¬±µî@#…±ˆéœÝ»ôL�9ž¼”…1Õ9Ð¼¼Õ£Šî‡ØQ©Yœx¦–2¦|æÉ&ŠÉSB‡
+&É®l%fþ1\Å±„ºõæ×½£½3˜àBs£ÅÅ0Dò¤™ppt¼Ì½¬ËÍnÙ­º«GÍ¨_½¨ÂÑ‰…tá9¶ÙL¬n‘Ç*è†8iCØZ�×qùH¡”ñšË™îâåÉPêŽ�„BÅØÿI®Iž
+Òñ7ñS@jKïL—�›(«Ø†
+3L
+õoÿê§KO˜á®P_êu�Ak1…ïúï�ƒmR›^m'uhK =ÌX;ë]KbfÖŽ)ùïe×»N(­.B3Oï›7ËO¹Ê(Ø×$<R“àmc§Ìzóq¼p³‰Ã?« (CÍŠLbH%«pà©C§¸Kù$aWF~ŒÏ_jŠ¿XL±$‰¼ÚïiÁ·×xâ-©ŠøÊ
–:V¹ÊœrÍ­øMÂ¶±$Úï“À*FÙÔ5ü…Þªëà9*#Ä2Éž,¤x�\3)ãøØýûöp·þñ´n­º`V‘áHŠ"è™ÅŽÁ*X^S#žáS1Dž¹H{ÖLžñX‘<¤çn#çe¬_<ç½pÎ×¤Š{&k„¿Õw—>øÅ8úö¿Ì&¬$ :µÀ¶š%ÈWû³ÏÂ
âîn7óŽOQMoI¦½¶·l¶uð(›è;áfs‘ŽÎì6îGkÏU»—·}7ï&$™„£Íçï
Ççö«û'zÇÖÏ=ÏûàoHak$þEü^ÝE�KkA„ïû+ê¨"JÎš§(‚rÂìlo¦ÉìÌ0Ýëƒ�ÿvã±‹ª®þz~Ÿ\BEÖ›LÑÌVßõœHno†³b:*0Â«cAÍžÀ‚d²"ÖØ:>Ð¤@ïXÄtÎüá;Äc„'oÂ'eÌMôP^æIEwcì¨4¢lž©¥Œ¹\„‡äÅä©3Â„
+6Í\¶³ü®b†:BÝzûßÞ¹=[
+BàPÇÜåÆHžŒLÇ>÷²^,7»e·ªSgG#¨X~»¨Â‘ÕA;x‰m¶«ò´¦!IÆ¶ÎäuÜ÷™…õF+ö´‰ú–YMéiy²”º[@'¥P	öW‰›ä©¡ ‚«øU|?E�AO1…ïýï„@<ƒŠTcHðHbJwÖNì¶Mg0Æÿnv9ÎË›ùòÍü6ûŒŠ\°…¢…�¾ég&¹¾ÎÌtd0Â«gAÍ�À‚l‹"ÕØx>ÐÄ o,Sþ,üî7Ä]‰„û`ãÌm‰´ØŸçIE7clioEÙF<QKs9‹ì3¥¨+ÂÆ
+.E-¼o5ù>¤õ„º
îŸÞµ;ŠBàX§ÒXåÇÈ�¬LÇ~ïy½\½lWÝ©^L½U­ bùeQ…#«‡vò’Úâ.Ugå©‰¶!ÉÖ6Þ–uÚõ™ã‚Á#ëêä(w|ÐI)V‚Ý%â&j(ªà~™oóE�OO1Åïýï„@<ƒŠ"*Ñ<’˜ÒÎÒÆnÛtfùãw7»Šçå½yó›émv–LÐ…z,Åù�S&¾¾êOÔx 0À»óŒÊ‚gd]©ÂÊù=�:Ç<åSñ;'è™>îJ$Ü?©cªK¤Ùö<�,Ý±¦­fñ:â™*˜òY˜e—)å@­:Z˜¥øm#©ð_ác*G¨š`þÛ[wð†"|¬R©µø‡È�4öž]îu9_¼­íªLœ4Ãzþí"‹ƒiá95ÅL²gä±Šº&ÎÚVN—eÚt™(e‚fÆSlòî…NéCÒ–Êâh(·ç€ŽBÑ26É×9PMQñK}«E�AO1…ïýï„@<ƒŠŒ$FIðHbJwÖNì¶Mg0Æÿnv9ÎË›ùòÍü6ûŒŠ\°…¢…�¾ég&¹¾ÎÌtd0Â«gAÍ�À‚l‹"ÕØx>ÐÄ o,Sþ,üî7Ä]‰„û`ãÌm‰´ØŸçIE7clioEÙF<RKs9‹ì3¥¨+ÂÆ
+.E-¼o5ù>¤õ„º
îŸÞµ;ŠBàX§ÒXåÇÈ�¬LÇ~ïi½\=oWÝ©^L½U­ bùeQ…#«‡vò’Úâ.Ugå©‰¶!ÉÖ6Þ–uÚõ™ã‚Áúeur”;<è¤+Áîq“5Up	¿Ì·ùE�ÍJA„ïûuLB0xNÔhH0 ˆÇ€tfz�ÁÙ™aº7?ˆï.»s¬¢º?ªfÙeX6�
+D‹7ú®çÌrw;œV“Q…ÞœÔ>0¼ SQ¤ç|S¡O,R>ÿá3Äc‰Œ§@ñ“‹
+fT"Ï÷}cù~Œ-ïIÔSÄ3·\0“‹1Ï.sÊ�» (Z˜µø}«©Èp•
+Ô1ê6˜z—Þp†�u*
©OqŒ˜„qð|ìï^Ö‹åëvÙ½ê‹©#Å‘ÖË/‹-Ž^´+/©-†a’½TžT‘–L†±qTÖi×/2­*Hë(J!ôüùÀvy2œ;	>)G+Ø]-ßäÀ
G\Í¯ê»úE�ÍJA„ïûuLB0xNÔhˆ$ ˆÇ€tfz�ÁÙ™aº7?ˆï.»sì¢ª«¿ž=d—aÙ*<-Þè»ž3ËÝípZMFFxs^PûÀð‚LE‘jlœ?ðM…Þ±Hù\ü‡SÌ�%2žÅO.*˜Q‰<ß_æË÷clyO¢ž"VÜrÁL.Â<»Ì)îŒ haRÔâ÷­¦"…Ï©@£nC€ùoïÜÁŽÂð±N¥!õ)Ž‘“0ž�}îe½X¾n—ÝªL)Ž$°^~»ØâèÕA;xIm1“ìyREjX2ÆÆQY§]ÿ‘iU™@"XÇoW$ny2œ»;À'åh»«ä›¸á¨‚«øU}W?E�AO1…ïû+Þ�x%IŒ!Áƒ3´³¶±Û6�YÀÿ»ÙUä8/ïÍ›oæ·ÙeX6�
+D‹7ú¦Ÿ™åúj8«¦£
+#¼8/¨}`xA¦¢H56ÎxR¡w,Sþ,þÝ)fˆ»÷�âÌ©D^ìÏóÄòÍ[Þ“¨§ˆGn¹`.ga‘]æ”wFP´0)jñûVS‘¿Â‡T ŽQ·!Àü·wîà
GaøX§Ò�úÇÈ�IÏÇ>÷´^®ž·«nU¦ŽGX/¿]lqôê ¼¤¶†IöŒ<­"5,™cã¨¬Ó®ÿÈ¬ªL ¬ã�‚·¯MX�çîðI9ZÁî"ù&n8ªà"~UßÕE�ÍjA„ïóuT‘HÎšÄD”sÂ8Û›iœ�¦Û?BÞ=ì&ÆcÕýQ5yÊ>£"l¡žha§zÉ$÷ý±
x÷,¨9X�mQ¤kÏGº3è³”/…?½¢çúx.‘ðlÜSQÁÄ–HÓÝUßUô8Ä†vV”mÄ+¨`"Wcš}¦”µAØXÁ¥¨…wMEþ€‹T žPB€û§·éÀŽ¢8Ö©4V9Å!r +„#Ó©»[-gó·Í¼}ÕSo'+¨X~YTáÄê¡myI‡â.U×Ê#mC’­#¬½-Ë´íã‚ÁŠã~V¨ã/,ªægG¹• ³R¬Û›ÅMÔPTÁÍü2ßæE�_KBAÅß÷SœGQzÖÊ#¡B°G!Ö½sÝ¡½»ËÎø�è»Ç½e¾ÍÎÌ�s¦÷ÙgTä‚-Ô-ìôCÏ™äö¦?1ã�Áïž5²-ŠTcåù@#ƒÎ1Où\xç=×ÇC‰„Ç`ã'Lm‰4Û^öQEwC¬ikEÙF<Óž
+¦rfÙgJ9Pk„�\ŠZx»×Täø”
+Ôê}pÿôÖØQÇ:•Æ*§8Dd…p`:vw/Ëùâm½h_uÁÔ[ÅÑ
+*–_U8²zh^Ò¾8‚KÕ%òØDÛ�dë+oË2mºF&Æ¸`EðÊ»ÒÁ'G¹@'¥X	6W‰›¨¡¨‚«øe¾Ím�AkA…ïó+Þ!Û¤1½ÚNê$84Ð–@zyVë:™$­SòßËîÚq�ÛHOïÓÓâKi
+*ö‘„Gj¼­íPX¯?�çn:q˜àguˆŒ ($†\ã©	;¾rè÷¹$lÃÈ�q+‰q)ýb1Å‚$ñrsú_U|s‰gÞ�Z „¯Ü²`¡§Â²4…s‰Ü	A©‚ÏÉ$lZË¢GàCXÃ¨Ûá?è�:ÏI!ÕY^ÉBN—(‘I»Àû~îÛãýêÇóª³êƒYC†=)ª ‹+ìƒ5°.¼æV<Ãçêyê½²òŒ§†ä1¿ô™;×*cõæ¹tè¹s>’*¾‡­ôËè…ÈÕ‡üfœ*=Ïà·€éd‚åŽ$B‡ÙU‹„ã¢îmæn¨¶›<ê6ùÞa½ö9©Iëm4Œõã£y÷.ºlŸn†®Ï–'A!ád³Ùßnã¡ýþî–mˆ7ÏŽ{ŸyÂÖJú{r{wE�KkB1…÷ùg©"J×Ú—¢V("Ø¥Pb2·	ÍMBf®Jÿ{¹·µ.çpÎœùfú˜]†%t¡KñFÞå’‰ïïú5(ðæ<£ò�àYAª°uþH#…Î1OùRü‡ôLÏ%fAÇO*Â˜êéép�G–†ØÑA³xñB
Lù*<e—)å@­:Z˜¥øC#©ð_á2ˆ#TM0ÿí­;xC‘	>V©ÔZ|ŠCä@š	GO§.÷ºž/6»E»ª§'Í°ž»ÈâäÅAZxNM1“ìy¬¢®‰³6„­Óe�öÝG&J™ ™±I«íjæ£.—ej¢]œ
åöÐY(ZÆþ&ù:ª)
+ã&~©oõE�Ok1Åïùï¨"JÏÚÖV”
+E{JLf›Ðl2³þ¡ô»—ÝvëqïÍ›ßÌ³Ë°d‚.4`)ÞÈ»\3ñýÝp¦¦#…ÞœgT><#ë"HvÎŸh¢Ð9–)_‹ÿp‚�â©DÂsÐñ“Š0æºDZûybéaŒ=5‹×/ÔPÁœ{a‘]¦”µFèhaR”â��¤Â…ëT ŽP5!Àü··îà
E&øX¥Rkñ)Ž‘i&œ<�»Üëf¹ÚîWíªLœœ5Ãzþí"‹³iá95ÅL²=òTE]gm;§Ë&º�Ì”2A3c›d�šhWC¹=tŠ–q¸I¾Î�jŠÂ¸‰_ê[ýE�ÍJA„ïóuLBHðœ¨Ñ1 ˆÇ€Lf{�ÆÙ™aº7?ˆï.»sì�ª®®žßgŸQ‘¶Ð@´°Ów=g’Û›áÌLG#¼yÔ,È¶(R��çMzÅ2åsá¯¸!J$<?©¨`nK¤Åþ2O*ºcK{+Ê6â™Z*˜Ë,²Ï”r N+¸µð¾ÕTä/ð)¨'Ômpÿé�:°£(Žu*�UNqŒÈ
+áÀtì}/ëåêu»êVõÅÔ[ÅÑ
+*–ß,ªpdõÐ®¼¤¶8‚KÕ¥òÔDÛ�dëoË:íú�ÌŒqÁŠôpur”»@'¥X	vWÄMÔPTÁ~™oóE�ÍJA„ïóuLB0xNÔhˆ	Äc@:³½ÎàìÌ0Ý›Äw—Ýsì�ª®®ž=d—Q±
Tx Z¼Õ=e–»ÛáÔLF#¼;/¨}`xA¦¢H5ÖÎïùÆ W,R>ÿé;Äc‰Œ§@ñ‹‹
+fT"Ïw—ù¦âû16¼#QO/ÜrÁL.`ž]æ”wBP¬`SÔâw­¦"�Ï©@£nC€ýOïÔÁ[ŽÂð±N¥!õ)Ž‘“0öž½ïuµX¾m–Ýª¾˜:RHPy9gq…ƒWíÊKj‹eØT]*OL¤†%“e¬•UÚö™c‰œa¥¸,�–sw	ø¨+ÁöŠ|“7Up…ßæÇüE�ÍNA„ïóuB žAE	Fcˆx$1Íl/3qvf2ÝüÅøîfW‘c©®êêé}vÛ@…{¢Å[ýÐsf¹½éOÌx`0À»ó‚Ú†d*ŠTcåü�G�bžò¹ø�Sôl%2ÅO.*˜R‰<Û^æQÅwC¬yK¢ž"žyÏS¹€Yv™SÜ
+A±‚MQ‹ßî5ù|Jêõ>ØÿôV¼å(ëTRŸâ90	ãàùØí½,ç‹×õ¢µêŠ©#Å‘•—ß,®pôê myIûb6U—Êc©aÉd+Ge™6ÝG&ÆØ@"|ã]kw^œ,çöðI9V‚Íù&n8ªà
+¿Ì·ùE�KkA„ïó+ê¨"JÎš§"	A0G!ÌÎöfšŒ3Ãt¯Bþ{ØMŒÇ.ªºúëùmö5¹`
D;}×S&¹¾ÎÌtd0Â›gAÃ�À‚l‹"5X{ÞÓÄ w,R>þðŠ�â¾DÂC°ñ“Š
+æ¶Dº«Îó¤¦›16TYQ¶OÔRÁ\ÎÂ]ö™RÔac
—¢®ZMEþ
+S�zBÓ†÷ßÞ¹;ŠBàØ¤²³Ê)Ž‘Y!ì™}îeµX¾n–ÝªL½U¬ fùí¢Víà%µÅ\ªÏÈSíŽ$[GX{[ViÛdfŒVë¶
+ìžé´<:ÊÝ £R¬Û‹Ä»hGQñË|›E�AO1…ïýï„@<ƒŠŒ$ÆñHbJwÖNì¶Mg0Æÿnv9ÎË{óÍ›ùmö¹`
D;}ÓÏLr}5œ™éÈ`„WÏ‚š�ÙEª±ñ| ‰AïX¦üYøÝ+nˆ»	÷ÁÆ**˜Ûi±?Ï“ŠnÆØÒÞŠ²�x¤–
+ærÙgJ9Pg„�\ŠZxßj*ò|Hê	uÜ?½sv…À±N¥±Ê)Ž‘Y!˜Ž}îi½\=oWÝª¾˜z«8ZAÅòË¢
+GVíÊKj‹#¸T�+OM´
I¶Ž°ñ¶¬Ó®ÿÈÌ¬^¨G®NŽrwè¤+Áî"q“5Up¿Ì·ùE�AO1…ïýï„@<ƒŠŒ$ÆñHb†î¬mì¶Mg0Æÿnv9ÎË{óæ›ùmvÛ@…¢Å[}ÓÏÌr}5œ™éÈ`„Wçµ/ÈT©ÆÆùOzÇ2åÏâß�b`‡¸+‘q(~pQÁœJäÅþ<O*¾cË{õñÈ-Ìå,,²ËœràÎŠlŠZü¾ÕTä¯ð!¨cÔm°ÿí�;xËQ>Ö©4¤>Å1r`ÆÁó±Ï=­—«çíª[Õƒ©#Å‘•—ß.®pôê ¼¤¶X†MÕyj"5,™,cã¨¬Ó®ÿÈÌH/,)xu²œ»À'åX	vÉ79pÃQñË|›E�ÍJA„ïóuŒÏI4"BÄc@fg{�ÆÙ™aº7?ˆï.»=vQÕÕ_O²Ï¨É[h$ZØé›ž3Éìîjbn¯
®ñêYÐp ° Û¢H
¶žtc08)Ÿ¿{ÅÈ]á±DÂS°ñƒŠ
+¦¶DšW—ù¦¦û1vTYQ¶/ÔQÁT.Â<ûL)ê�°±†KQW�¦"¿…Ï©@=¡éB€ûkïÝ�E!plRi­rŠcä@V¦ã�[¯ËÍnÙ¯ÀÔ[ÅÑ
+j–Ÿ.ªqdõÐ^RWÁ¥ú‚|k¢mI²u„­·e•öÃG&Æ¸`E°"²fÑåÉQîï�”b-ØÿKÜæ@-Eü‹ŸrWv=¾(©ÍI¨<¶²IúœºXc†»‰ù2ßE�_KBAÅßï§8�*¢ô¬•%FB„`õ$Äºwl‡ÖÝef®ˆ¾{\Ë|œÃ9sæ7ãÛ
+jòÑ	uÔ„½½Û±�^_uGÕ°W¡‡—ÀŠ
G+ŠCÞ`xGƒ
+'Ç4—£ðG0t|w’÷Ñ¥OSŒ�$š¬Ïó ¦›>–´vjì©!ÁXÏÂ¤„B¹Dj�p©†ÏÉ„×�eÑ¿Â‡,°@Ø41Âÿ··îÈž’8m²l�qN}”HN	;¦ý)÷4ŸÎž—³vÕ	Ì‚3ì�¢fýí¢{¶ká57â	>×gäa•Ü–´8OX'ó¼:}dTU>:U¼&mJÉbT¿‘(ç4ÍIM'›<•ö0ÐÁ(ÕŠÕEâm‰´¥dŠ‹øU}W?E�ÍjA„ïóuT%gMb"J„CNBg{3Mfg†éö��w»‰ñXEuTMï³Ï¨È[¨'ZØé»ž3ÉíMbÆƒ^=jd[©ÆÚó�F]bžò¹ð‡Wô\%ƒ�ŸTT0µ%ÒlwÑ£Šî†ØÐÎŠ²�x¢=LåbÌ²Ï”r 6+¸µðn¯©Èp™
+Ôê}pÿô6ØQÇ:•Æ*§8Dd…p`:vwÏ«ùâe³h_uÅÔ[ÅÑ
+*–_U8²zh[^Ò¾8‚KÕ¥òØDÛ�dëkoË*m»E&Æ¸`EðF…kvi9Pµ89Ê­�”b%Ø^-nr †¢
+®æ—ù6?½S]kÛ@|×¯Ø›HÆŽé«�¸iƒÓBuå|Z[GÏwÇíÊv(ùïá$K–dC¡ÐÜ“¼³³³ãëO.s�¢ÔÂcLì•ä_üâ�n>&Óh<ˆ`?2E°RA8áì
+ž3µÅ«ŠŠ;ë^¼Zg±Là³7_´0¿Ñ3Áµðo—Õï«gCXàR+aàæèášªÀ­ËZ§1‚0)HkØ«eÎÖÓaà½õÀÂ*×d==Tk%Ñ‚2+ë7‚•5Cp!lîŠ¾Ç‡»ùÓb ŠÅ8;A�**ga
+;ÅpXžlî%‚´iµò82bƒä„DxÎ„°?E¦Q”Sàed˜HR8¤µ~=í$÷(;!r^^•Ñð½Ò¸x!ÆMñO£HjAó=Ê ü‰\¾ÔJ¶'äŒqÕ=i7aÒ*0„°¯YCOøõ£2˜LjÌïH¹ærx½ Æh††r�a¾WÄwA“éù–X,5žk9ö`]7•"q�ï²OÐ§Ëa+ØÖúdÄh&hQ,'I»³Z¾66dâ¥!ôlÎ.ç!ô¼lòöÈ¹7`p×‘°Í½‰ÕNpÛA/»¬^Ë‘ãÁ Ìà–3owG7Ì÷]0À¡`\šÃ«­à¦ÿº‡<ÚäÈ1™ÀÖª´aµ‚øC£b4Ã²=IUá´Z‚ÔÌÚš„wöÐõÁ¿ª-V~.œqÑ§H-ËP0èøáŒàMœÔ&§í'´'“'Ë÷67i«¶á—×ÿq£Æ?ç_o¤¨òþ—RÕ�ªð{ë¸õß.ö½…‘Q�1…ßçWœ‡}€	.ú*°¢ã&F7â›R:¦±´M{KÿÝt¦³+:osóõœ{Î¿qµCERO½À^I^òÁQ˜¼ê�ŠaY Ä×Z¬•&¨'<Ã®ñP«Ýhˆ™u¯65£'ûxë
á�æ'yohºêþo+º`A+X	ƒÉcºÁÔÕŽ¬Ó”@SAZÃ^­"[²á{ëÁ5aµ†|rO´V’L (³¶~+XY3€Ó$a§hß¼ûx?›ZÌ“TŒkÁØ‹€J…Ö‹*ì×à>Øè%AÚª‹<,ŒØRpBjáïí÷¦‘QQH-BÀü‘dÚø…¨¿
+–%¦;á‘LÌ&É¤±ój'˜p#ív+L5*Îiá½8<ƒmdù’U†Ÿ‘ô¨xf+Ê¬‹+­$ÖÑÈÔ–KiM`%÷òbÝ&ƒì�Í�ü“^?ÇJßM*êÅ]~LNÒ\0­¦q�t	ù³}ŽÏ Â"JI!ôú¯±²VŸ¬æ‰£7Ï¥'¼ü§è†xžé$›²ÿOõLoX–-^bšñ¶ßo?ò|xÍ÷sÓKrmpÍ÷´¿ë)fí%’\>ð5½³›‹cñm’[k1…ß÷WœBŠ×&‰kèKã´Í…”J	¸ô¥—0ÖÎF¢Ihfí„àÿ^$ßÒR½�æœùf¤Ó�ÑF4l:J\‹&gôNŸ"ËûÉpZ�GFøj� uÃ	"%EhqkÝ‚�+”ŒËŸ’»·ŠÚqž<ã¢#ÿ›“
+N)y>›oÏÇ
8ÄŒç$êÈãš{N8•mà,ÚÈ!vœA¾�	^“›÷’l
+~
+	jmßu0»ê9»s†½0œoCz uÁ"vLÂX8^Ýç›Ë«/³«lUSKŠ%	'ëZÜ`éÔBsóúd&4Û–Ç•§–H†qk)Ý„e"Óªê%sy“+Ã’Øéß¡˜øþî�Ôü{!19¯í´ªZç©ƒéH3K“k~Tö�à‚„Kà¹€ØÏ;g JêÌÞ¬
é2xe¯åYý=Ìú<<Áy^‰µOž—îÚ:C×±4îeÃi¬ª²�G£µ~„3µ),7~A�k²ùÕ£á˜969ã5j
+Ê&�v‡É^úÄß¶ºkFž`\óÔµ¨_íçWÆ¿¾¿9zGGíÏç·oVc—�‹vøB–Wa,-þ³ÞÌ¾¼–üË}PJf×çG“ò�{óéÎ{µÊªúm’[k1…ß÷WœBŠ×&‰ÛÐ§mã�@)—¾ôdíl$ªHB3k'ÿ÷"ù––êEh4çÌ7#�}Š&¢!íT¢š%Y-wò‰?¼í�ªá Â_�e´Ö,#ª$-n��Óa…’1ñ)Ù{#¨uÉ.�ò¿)	ãL%Oç³Íù°¡�û˜ÒL±XåqM%œñ&pM¤åD(ß@/ÉÎ:	‰×¯B‚BÛ9½­ž³�Õä™`}Òƒü>¢#Å„¹¥EÑ}¾O¾L'Ùª4&F	ŠÑX^Õ¢+’›çÐ%MÐ¡Ù´<¬¼z ŽJn�J7áG™È¨ª:Î\^çÊ0ŠÍèïPLt÷ Dÿ{Á1Y/í¨ªZë•ƒvŠS£ŽŽO®Ð£�o—Š©ž+ˆÝÌY
%VïìÚ�ÆÁy)ëï±§Wçþ)^ÈóJ$]òð´“këŒ]÷¸”îíï„ýQ‘,«²
ƒ•ÃçbRX0nü\9ÛdûÉ£¦˜IÖ9Ãl
+B:�wJž»Dß6º-m†èŸblóÕ¶¨_ífX÷†¿¾¿9x¯ÚŸÏ'ï–{C›�‹¶ÿB–Wa,Mþ³^Ï¿î½æüÓ}(”<L¯/ŽŽOÊsîìG[÷åz,Ëêm’[k1…ß÷WœBŠ×Æ‰[Ò–$NÛ\Hq ”€K_z	²v6U$¡™µ‚ÿ{‘|KKõ"4šsæ›‘N?FÑ�v*QÍ’¬–[yŒÄï_÷ÇÕhPa€¯Æ2Zë–U„7ÆÎé BÉ¸ñ1Ù;#¨uçÉ.œò¿)	ãT%Og³Íù ¡CLi¦X¬ò˜PG	§¼	œE)DG9Ê7ÐÁK²³NBâuÁO!A¡íœƒÞVÏÙÎjòL°¾
é^‰
~ˆèH1aniQtŸ¯/¯¾L¯²UiLŒ,£±¼ªE
V$7Ï¡Kš C³iyTyuO•&Ü•®Ã�2‘qUuœ¹¼Î•a›ñß¡˜èîö^‰þ÷‚c²^ÚqUµÖ+í3¦F½™(6 !ß0.S	<U»™³,J¬ÞÙµ!]/ä¥<¬¿Ãž^�û'x&Ï+‘tÉÃÓL®­3vÝãRº7Ü	ûã"YVe
+‡ÎÄ¤°`\û¹r¶ÉöWšb&YçŒV°)é<Þ-(yî}Ûè¶´¢‚y°Í3TÛ¢~±›aÝýúþjÿXí·?ŸŽß-÷F6mÿ™,¯ÂXšüf½žÝ{Éù§û P(y˜NÎ÷�Þ–çÜÙ�·îËõX–Õm’[k1…ß÷WœBŠ×&Žë@ �Ý6R(%àÒ—^‚¬��DIhfí„àÿ^$ßÒR½,Í9óÍÌN?FÑ�v*QÍ’¬–;yŠÄïÇýI5Tà«±ŒÖ:‚eD•¡Å­±:ªP2.C|JöÞjÝÇyò„§üoJÂ˜ªäél¾½5ôá3š+«<®©£„)ogÑD
+ÑQN„ò
tð’ì¼“�xSðSHCh;ç wÕs¶³š<¬oCzPbƒ?Dt¤˜°°´,ºÏ7—W_fWÙª4&F	–ŠÑX^×¢K+’›çÐ%MÐ¡Ù¶<ª¼z ŽJn�J7áG™È¤ª:Î\^çÊ0ŠÍäïPLt÷ DÿûÀ1Y/í¤ªZë•ƒvŠ3£NÆÇ×Š
èQÈ7ŒÅTÏÄnî¬‹«÷vmH—Áy)‹õ÷8Ðë{ÿ/äù$’.yxZ‚ÉµuÆ®{\J÷÷Âþ¤HVUùŒƒµÃgbRX2nüB9Ûdû«GM1“lrFkØ„tï”<w‰¾mu;ÚÑ?Å"ØæªmQ¿ÚÏ°î�~}3|§†íÏçññÛÕÁÈfâ"î¿ÐåS K—ÿã¬7¨{¯9ÿê>Jf×çÃ“ñqÙçÞ~²s_mæ²ªþ}’AoÛ0…ïú<ô`iƒ]ã4ËZth�a(�a§-3•0EÒH:A1ô¿r’&í†ùdQ�ï#Ÿ=û˜]†Žl@¦J”½Õ•>g’ëuc&##øæ¼ÀÚ/�‘Ò�ßÒ•�Aq›ò3û'§PÙ>q$¸	«À9Ò¢=ž¯:š�aI-ŠzŒpO=1ÌäXXd—)å@E;°)*û¶×Är~NêÖ}`_éE¼¥(>®oP}ŠcÈ�P¶žvCß—‡Û»¯Ë»b5,¦v(ÐyÙ³¨ƒ�WZ–—Ô³%°©;®<17$-Á£C~H?†Dcz)sE[ÈàPÜŠ~õ¤1[QF«`ŠÀ
+Ý£8ð›hCQ†óo0�`±E†2R|*ÐRÎì·¨Å»1ûZßoOØÕÊ¦(Ê½ÕêÐ=Èëƒuy.Êj—sŠÒ3}Çà»Â®öºæ½¬Táú-/ÿF£,`UO�ƒŸ˜LÚs<÷ü¯×>¸jÈä"©#.¯õÚ”Âß¶gaWgˆñYïåü4_ý†ýúm2'%[~€Óï2zé¶Éw�y1u�Ak1…ïþï�Ãn	½f·mš%%�RÛc¡h<šXÄ±]I“%”þ÷âI7ôÒ›e}OOOÛ�-5Œ3)¯ÌU¢ÿð—ÆöþÝz.NNñ-‰a’ÌC#uÔ	÷Ižù<`!vµ½¨<$Ç*®ñIã:SyduÃ–´ðÕp¬ÏGþp†=d.TpË3+¶vü¸j©qm™;*#b-®2Ì^Õþ~®
+OŒiÎñÍ½ÓY"cH™ª>‘K-gh™ÉÏÂ‡E÷ånwóuÓG-Á<‘ã@†QìÕ‹GÄ¼‡·:kdÄ:#_„BOl�"ã>‘ÞÕïËE6!HqÖ©7nÉ~hó�%Âœ\"¦¹Ä¾¦ª»Zœ‹/Ç/8‰¯õúÆyÚ„åo:²ý‚¯:¶¼þòÏ™²­ú(œTO¬}©õ%†Zó&ü]‘Ok1Åïúïð:‡Bé!ë4ÿHi Cr,„±vÖ+"KB3×„|÷¢µ×M£ÛŒž~ïÍhq™º„†­§Ì•hvVŸu—X.¾LksvjpŠ§Î	ZçN�(+b‹eç^yn0(ncÚe·î•�â:Æ�§ðÂYÊ�¯Vc=oøû�¼"QG?¹çŒ…Œ�«Ô%ŽÉs‚Bƒf·ê5f9þˆÚ1ÚÞ{Ø£{Q{g9Ã…6æ
©‹a†ä™„ñêx;¼{¸¿½ûõxWPÃ`Ú‘bK‚ÆÉÞ‹l�vÐ2¼Ä>[†�Í8ò™	´aIdËŽò}ü=l¤6¦—’+ØâŒ	ûúÌ¡¼­�i] ëI7$Î^÷ÚqPg‡¤à?Ê¡|j¿HýÊ;QRgÿy´9nâÚ…%‰lcn†�kœøÒ�a,Óá~zaß¨åœØÌMñ#/¸ø?uµÇ`ŽÉùó˜Ú™µÏ�·ºúœÖƒì}¯N9*Û²ßãkÖ§]âªäÚG}ûžËšŒ¤wó]�OKAÅïó)ÞÍVÄâÕÖ¿E± "´GAÒÙlgpœ’lk¿»ìj=˜[’—üò2»ª¡¢aŸHx¤&ÑÛ«í+ëÅÙxê&ÇÇX…¨hcbDE%1”Ï!nùÔaPÌKÝKÜÃÈ�q#™q›(¿±˜bF’ùz}ÈO¾<Á’×¤)ã�;ÌôP¸®¡r©‰{!(7ð%›ÄugEôx_m—ü½W§è9+#æ¶È;Y,ù51)cy7Ì=.æwOË»~Õ`Ìv¤h¢þ°¸Á.Z€õæµtâ¾4Ë—é�µ’g<’Ey>2u®�™|"UÜ2	ËMg�³E?\þ0Î�â_ùÓ@•bì{|Ûe?46l«}åÑøýqyó+íCØ:É8úM‡Æ—ûrß]�OK1Åïùïf+Rñjë*D
+ö(Hš�m‚qff­EúÝeWëÁ¹ååe~ïevUcEC!{¡‘š¤`¯¶«¤gã©;=v8Æ*&E›2!)ªCi±Œéƒ&ƒã®Ô�¤M4ŒÂ7Â„Ûìù�Ä3/L×ëÃyÒÐå	žiíÕ’g<PG‚™„ë+•š©7ÂsƒPØ$­;+¢¿Àû"°Hh»œþè½;§@¬„Äm‘wo©ð	j&¯„�DÛáÝãânþô<ïW
Å,zÃÖ+š¤?,j°Ma}y-�B(Í¡ò©cÿNZ} ,£—Ey~dê\›Øg„ìU±*oÄ7�EbKaú4âFñOþrP¥…žÞv†‹
ÙjWi4>GŸ�7¿Ö~„¬ÆÑÀ9šúÞíÝ7u�Ak1…ïúïàƒLB®±Û¦1(%�ôV(³ÚÙ•ˆ2£YSúßËnâ’BsÔè{óÞ›í§
+:ö‰”—Õ4zûiÇÂõÃåjã.ÎÎðbE#VRCîqâžÏfb—ËQãK¿ÂgÆM"ybµŠ-©ðu{zŸwüq�n©Z$ÁY±­§Áu	…sI<� éà³˜Æv´¬õÕð6+,0ú1%ø¿î�¢g©Œ(}Ög²˜e�’˜*cù0ë¾ÞíšoÍ´j.f�ªèb}ñâ‡h6•¯yTÏð¹;U¾pBÏ\yÆ} ½Ë?æ‹lœ‹b¬ýô±#ø†üK‡_ÊØ¦èÑ�â§dT1=.¿kÂbÔ´ºB›sÚ¸ÿâÛ.‹±Ø[ÁY†÷%�Ñð–oé=ºZVþ7Ñzæ±`£aýê……‰±ºÂ>Çnã~»?�VQoâ8~Ï¯˜“x·ì½¥K›Â�ÔìI«^…Œ3k];²'ÐjÕÿ~²I
+„”²ë'ìùœï›ñç1W_Ò$…¹dCKFpZÐKŠ¶óg½´4`ž+!„…”½‚I"6ø)�ˆtúbÄ:!ynŒB¸•L}GC®˜QØ]óO1^7a†KfI0ÌÐÀ•-ºi’¢N%: 0×ŠŒXf¤�Í	ûÚ%«LJàoì-Ge„ZióÄHhÕ„T"³�[¿ï~õF³žû”OŒF°ebaw\ÃVPä’·:3�ë¸H¹(ö„6ea’03ÔÿùŠ´ƒ ³©,Aôuz?õÇ‹Á|>YDã»^»Oæ‹èÆaª"ƒÞÍ]oÚÿ:ŠæÃñ¨1ŸOv¨ªèh|;¾ûV™LÇO{³YU´ˆ�cžöfãûó„V™â®ÐÀ3#hŒÒï´©<#¯Z_#¹c¬
+	%¨jÝ"é”ÌöÒ‚VÃû¥ëŽ.Ò4l�ÃµÒý!rÉ¬…(3~­FºfÀÙ@­Æ-§Fl!Ô2#ÛÁ1ÒS]	EMxÏ_ŸlÒ©Óg¡�åÝBÑ	>!J##tàsŽO³¥|Ÿ«K?Ì5:Qõ¿`£EœgáFÍ9÷�k—š�\|)^hËÅ•¢ÇJ\àµZ�Eš¢ÕrƒoªÌn>óÓwõåü%_=:=ÇŸx<+€Åñ€( ‹ÑØÐ
+Ô’Ýôböý}rŠíg‰caÙRâÄèµAkÿAB^L¸¿ˆŽ�L†çÉôHÓ)3êVÇ/?ÃãZÁE¨NóáLJ·
+µ4_ïçð_Ê´päŠI‹ïYòá½vä�¦¬ã#wFhH¬g„}!÷.uíßµò‹óØµk¯¡Øû÷Î”…Òƒb&G�Ë]zô.8õÒbŒSºq¤¸&9ÁGQñó÷RìˆÒw]7Ð¥Äèí®Çöž9ztlUûï¹3v~Bbx�}÷÷®¾÷³
…û['wØAøä�pÈf)—¼kA™¤bZð{�5žÔÏuÌP(ª¾c;®Óõ¼É»!V¤�·ªà†¯)(Ü—5Ü¿²^\óà=ör_÷”Æ÷È¯D=g?ë¡5Ò OÔ•{Ä~”¿W*Hñ½×àE�]K1Eßó+îc[J‹Ï­Z-•D
+õQ�ivÖÓ$dfû�øßeW·>ÎåÌîÌï³Ë¨Ø*<-Þê»^2ËíÍpf¦#ƒ^�Ô>0¼ SQ¤[ç�<1èˆeÊ—â?œb`‡x(‘ñ(~rQÁœJäÅ¾Ÿ'ß�±ã=‰zŠXsÃséƒEv™SÜ‚ XÁ¦¨ÅïMEþ„O©@£nB€½Ú[:xËQ>Ö©H}ŠcäÀ$Œ£çS·÷¼Y®^v«öTWL)N$¨¼üº¸ÂÉ«ƒ¶å%5Å2lªúÊSéÀ’É2¶ŽÊ&½u™Ócu¶œ[õÌHkÕ|MÁgåXÉ?‡/óm~mQÁn1½ïW¼C›(jÄµ	P¨ŠR	PDé
	ÍÚ³±…c[ãq¢
+ñïÈ�Ô“Ç3oÞÌ{³}›]†eH¸/*Þèw}Î\^¿Zlºõ²Ã_�/}`ø‚L¢H#öÎŸøºÃ„¸KùYüÁ)z³À;‰Œ÷�â-Ø’D¾æÿµå7+<ò@E=Eì¸²`[æÄmv™SÜ€ haRTñCÕ$åÏÀI Ž1Ö`þNoèà
ÇÂðqLr$õ)®�Saœ<Ÿ§¾�w÷ŸïÕ$L)ÎT`}¹Ìb‹³WmâKªb&ÙYòº‹tä’É0öŽä!}›Ùt��Ê2¶ÂN5ï%„KÙQ´�?;ÈuÞ`¬Ñ´Q”Dû'	¸ª78%o7Ý‹ØÑG_ÛþØz¹œ^,ñ‰Õ%Û®e(„YIÍ–”FIG¨P,#KA_sHd×6�c3ËÖ*#…ÂÐ„â‘ÂdŸSÍ0ÁsÔV¡!‰N…™v•:uµãùX›oíúEMnrçiÚ°ÿ×¶K
+W—å7R
+›îW÷E�ÍNA„ïóuB žAE	cˆx$1Ãl¯Óqvf2ÝüÅøîfW‘cWªºúëé}ö¹`õD;}×s&¹½éOÌx`0À›gAÍ�À‚l‹"ÕX{>ÐÈ sÌS>þðŠžëã¡DÂc°ñ“Š
+¦¶Dší.ó¨¢»!6´³¢l#–´§‚©\„Yö™RÔac—¢Þí5ù+|Jê	õ>¸ÿöÖØQÇ:•Æ*§8Dd…p`:v¹çÕ|ñ²Y´«:0õVq´‚Šå·‹*Y=´…—´/ŽàRuA›h’laímY¥m÷‘‰1.X,Uó+INQhqr”ÛC@'¥X	¶W‰›¨¡¨‚«øe¾Ím‘Áj1†ïzŠÿ��]ãÆô;©Ó�â@)çX0²vìU$13kã–¼{ÑÆë¤%{“43ß÷ÏÎ¾ä6£!,S%ÊÞéJ™äús=5“‘ÁO­l| xA¶¬H<¶~G—}Å]ÊöÛVQ¹·	_ƒ�¿ˆU0³i¾Î—
ÝŒ±¤µõ6bA1f2\Ìs›)å@¥66p)*ûu§‰åü–Ú6]p'z©ÞQ‚�›ÄÏV}Šcä@V;Oû¾ïûÃÝý�å}ÕÓÖ*öVÐxyeQƒ½×ZÂKêØ\j†Èí3I¶ŽðØZ~H?û�L�é¤xEWÈ�Ì>êfjŒ]‹²u
+¬n;m)ªw½!þ˜ŒF˜ï,£HÄmÁ”ëÌ~g•pæ˜šÒdƒLÍëS·Þ½ñV+—¢(wN«ã�÷]õT¾³íÓÍ»W\ÿ‡(e/ƒ¬,Tó‚lC¼ìAU}5x¿A˜´ãÓª‹;±ÿÝ§¾Â¹à\.ÆƒË–ôé�©ªÇØÕÿøœÖ™9)¹ò¿Nn§1ƒÐÔ¼˜¿µVmo£Fþî_1'%gìúâ»SÛôâ8�KHcÉ1ãæNidm`1«ãXº»Ø‰Úü÷j1Œ|ªR¾Øì>óÌ+3sþkÄàa7Dk\0âŠ…xŽ1~èZýnºà„ƒOB„CŒ˜êƒ�>iAŠÐiüÌÈ2 ¹±Ão!Š¾b&8œ#áËÇüýÄÃ=˜áGÄAÜà38çùÁeÄ˜Æ!–@@‘.�#�‰ Œg
+¯)`ð“0w«]¢Cââˆc ‘OÙ7$�z‡q+‚×©Üd¬Ó™!©RÇD€¬�ð�.ìÁšˆ„tžÓ„¹\êå.÷[ú†yŒ\V€Ø˜þ™FdÐj%\"#.@ŸÛÓrº9�ºãŒo
sîˆëÑxbN
Û6måµ9™˜wS9csªBLÌ»ÅÌ2Œ«Åd|;Vê( ÒâvôÙ6®ÆöLuiÙ¦cêæ¤îòó—Ú‹ùÌ°­»+Õ½m8s{êØ£éìÚPú>›MöøúË�9S:V ,CÍáèÖâz4sLËPFO8úÝ˜îÑ§N/nÇÊÜö“È•%ˆ1ô¼øŠŸø‰pÁ+×öI„½Ê)�‰„?hµÜqzÂB�F>YÂß-€~·—+Ä JÂðYŠÑh,…Q1£OÏ0·'²þ$<fd…†£ôfÎÂAë»i\†=	‚B®¦Ó@•6c¬Š%³ÑG¢ŠOƒu¾‘êÁ„º(œñPÇLŸ¸Hà‹=®pÄa÷UîQ"‚,†U´½j4hó³oB@¹¸EqYkœ<†Ä-ºX¤µÂWhYPŠ(t²¤ÊçHö‘wÛ;î„KB^Ô*8–LGÁÏÂ”•ÉNCh·‹ãq¾¦ÌK�;g°¢ÄÛ·&¯šÔ˜mñÈ‡ø µÛðf8,©xûò³œ¿ìb•¸T?0ÌK_kó³cÞî¼½Ý`ËöÒäyŠ"Ògpä/µ�PÛ}YòÝÅ‹Ê…4Xë<Èˆ•®wØïv7ü]¸£ëòwn<¹8ý3H_éß•yvƒÌ�Î™ê[*¹'Óø&ó1@\ÅY�Us™Ú^«Ì×¶ùœRHÃ¥x€OäÄpÌÁ§IäÉ¤ÚÊ©ÞþeX$,jNKNñÐøÙÔ¸«á#¥aÉõÌ„j/Õk2¯Óhâ2”f,F’]ëœmÔ”rÓ¥ÓV·“�½��/à§ž¹»u¤ÈŸß«¡»36…~<„”³6E
+–`5¸´Õä¶ú(ä5èÝUàõÎFt¼ïEÌªýX-˜n/¥óB0o�
rÙÖ£�+uFµüîª–ÊªI]eñ“Ð©5k³ÂîT–œ­ØCiô»0ò<ì‰Àº±àôäýÉiºk3üWBÞ488=ùñÓyKƒ¬ýd‹�ÖVíbí½¦“×ÿ½
+.Û®ÌrcëÈÍÔbmÐJDie¨DN�òŽÑ 1@\ª‘YwÑ¦�~o'ÚS›öò
+[Aó?Ì¢Ã–ï"ê'P­Õÿ}ø ]Õ¯3yÊÁÞ@M°UfcNÃöÆñ^ÔŠe�Äµµ–­ ¥¡'kŽÄ‡j­Aom�Î±Ðj7ûºlôµs–;[[%é×¨
+–ÑÁØz¥’Ø�H�—Ö¿uR]�Ú0|Ï¯Ø‡;]‚àP_ËG¹CT=©ªP9õ©2Î†X
¶µÞ@QÅ¯q·O‰=³3³ëñ›[HQ‚0vLJòš�ÝäS2Š†½zðž+™*”+ˆÁd°ÌÕŸ#¨sc�¤¶9C,x!�ðZý‰Œiœm.ÿÏ)Nû°Â�p¬„†oX"ÁØ]f6·hl�B§ �fR›’
¹Zð«!à!+‹äUÝ£%Q;¥3C;ÁÊè>Ø…CØ+<T¼ïoóÅ�ÕÂ·ª‚q.ÂAªÜYS8(Î�}xgJ’Ò¤—ÈÃH‹:+$Â2ôf~WEQé¼/-½28KJs6Š"Yç`^R17:SÛ×R)ü‹†½Ìö‚`¡÷ŠŒÞ¡f¯âï,©½`„lîFQ›V‰ÿBr^´Ë³Áe—øRr~6tC×«šdËM¡dn½–F;¦Rrú�öÛÖZ^ú¡z —ÔCñõà0˜&�Qt°¡„Ç¶ãwÀ�*T�ÃÐvº}ã·'Ÿƒ…†¦es:�‡_Q¾ê÷Ñ>ôõT�

�î©ƒ¸“v0Ý"×ßqò!%^ÅøYjV;\1)½�“­ùKêWàKeßk–·$ó÷'á;#Lòö�¡K�f[§èÞp«NÍŠovz&ä’tH¿løým�Ak1…ïû+Þ!Û¤1½&Nâ6¸$PJÀ9ÌX;k‰*’˜™]Jþ{ÑÆ›ˆnzzï{3ZÝ_Ð²‹$<S“àlg/…õúëüªY.,ðäƒ¢‘…Ä�;<ú0ðEƒÑq—Ë‹„ƒ7ÌÜß$1¾GJXL±"I¼ÞO÷‹–oÎ±å=©J¸çž+�„uñ…s‰\� ÔÂådö½eÑSá�,0ÏèúáÞÛ«;ÇI!uYžÉBNç(‘ICàã˜ûùp·ùµÝTÔ¸˜y2IÑ}ëâÇ`V—×Ü‹c¸ÜN+/›DÏ¬…ãÑ“<äßã�\5�‹¤ŠÍð·€åb�õ@‚ŠN‡®r‘0�1ÎŠ}
Žb¿�Á¡ë“«“c·s9©IïlvŠ¿ùç'x=guÈ/7£Žëw`}zýKºa³ùå4Õœ°õ’>P'Økó¥TQkâ@~Ï¯˜ÁD´¶Oµõzõ,-¥Ðö­ ãf4K×Ý0;Ñ“ãþû±1ÑØÚ«pyËÌì|ß|ûí\|Ë³RR™b/¬•Ld�“¿<KQ¿Až2ía¦
�ö�#¸<dzI'”#—¯YÏ3�X%ð�-ÁµAûJ,.�-]Mëÿ“”†]x¤)zÑhá–
+b¸ðuà*Ïrr¹¡PhSPÎ
+ëi!Ž}xã$#˜Æ€Ú¢‡j£YO íÌñE;Û…Üz‚¥¦UyîçÝh|ÿ8­ÊÁ$C�zHµß`Q
++-HÞ»‚�ri=r?²¸ Ÿ£"xÈ�ïÜK©È Š
+xY�Ëî“¼�I‚¬øÁ~Þgxö6$<aÊ
*Údªþ7ÚÐãÚ-^~h&%Ž×ƒ(R½‡2)ŽqN#T]£z%›‚^ä†öâ¿#€~§WKdØ6“…LÎz‰BÐš¢§Tó Ú„‹©ÑjÇuæòÂ…’x×£>”T0á«c½!Y_0�i/>>ýzzšvUAîÞ°ª…Ë~Hÿ9Ì"C?¶Âëø™
´
+6É9L�3
x=ƒøË~÷Þ0C?Ê´Iãp¦7œ“Ü:/ábã$i’“la†ÆÓŽpÅ¨QðD}ˆÐ °‡TuFë
+=³yr÷áL9Û¶6ù§(s’ÑÆsMY‚»í¼1Ú>ë9Iå¢ímn@{Ãàä¸]Ù¸�ô†L˜ÆIy¦ú”ÑXpÞ¤3~Âd,­ÊÌAY>¥H‚ó�ø©�Ç´o©î†k+tïÖ2¶*9’sX:�6í^Ù÷Î;#½[q«´Ï;ÙÑ?–àqÒÝáÛ§Öf¯I6Co´©6ÁVœ¾<Â`�­·ûí.´'í.lŸÅJ'	œ@»×†“r/V�æhb‡Tn0Ûí§�®é¨7«þûÁÖÀ‡Wá»—ÙØ~¢¿ÅVÛnã6}×WÌƒ
I�gÓl[Ä‘›M6m‚í¶A’}[À ¥QD”&‰!å4{ùŒý�~S¿¤ .¶.vš>U6Dž™sæÂ¡NÒ¹†Ác‰'vnŸ4šøU8õ&{ìÁ}Î
d\ pš‘•ÁMÎWxàA‰¸Pú‰øCn!HBxCá\0ù’5pÊHâÙ¢y?HqÁ.˜±œI¸Â	NM³p¦s�Jt@`2…DIK|QXE¦&üYØ!+„€dÍîÐ‚'(
—™¢%³\É´@fVK»_¯/.»»t®ÊÀlÎ,<2)7¦ðÈmÖoTA	B¢Ò&ä‰'Ù�f	ÂMÎèZ},32õ¼Â8¤4îîoç7oÞÎo¯¹ºŸ–Y!'	2¡õÖd±\ Í+Ý½=£‰K›õW-Í5K§ž—f\Y«oH=s‹2EB¾Ô—(mwÿŠÉT Ág`²·g+Fp!øÇß«ë¢t[šøŠY„‘*—§^×à‰² Ñ‡-”â2NfàÐU@>°špÕh‡|¿¶ÓÅBðd““ù¼Ì>‰
ZÁÔêÃ:^÷Œ\q÷gÕÄ›{€R%@–
+¬v¿nç6–‘
\F\
+ÂX)žàüUyÚÊö²ŒKnrLƒ�<U<û³Gâ›Ü¾>ë7/ãƒN™Å Ý1ÕŒŠò?<©jºaåõæþìíåŸ‹é[õ(…béÿ„AqÃa»î!´ÉVÐ-�kß­õí·E|-3Ô'ð®·ÆÆ�ZÅØŸ1sWv]†át›ã¦*f»Â‘®ÓTy*Ë»ÉEÃ~ƒ” ´A8íÆT]¼Äq#¡}^˜¾^½#´ƒ³¥ldq©…+z>üýí¯/cóÆ&îgÆß¥ã±ß1x¦ñ:Š›ºt;œÑ–­ÒûÚÆç9£ '?ÜiW
Ö²�ö¯½;tÝ·;²hn1A¾r's€ÿÕm·{‘Èçz¹ƒÞ¼µ{|Ð Íð©ÇûfªmÒÀ¥…Ö’#(_“‚¥
Ošk¢7~8Ìbxuxüãë¾á3L&ðþ|Û‰éÜ¹Aã&�qG!€ïÏýÝƒ©Ëzt\S¾û¯”GÇk¾w;øj'k3‡m »rÚ;0™PÌÂ(í–q[JGFª�åíW~²}3˜ÀÑÁëÖÐt6ëX ¾�«g¸ö�ûe¨3Ø'�ÝÆYÇ‡øàGÝïªõ]öÕû­T[oÚ0~Ï¯8} ˆú: cí˜ZišÐhÞ&!ãœk®mŸÀØÔÿ>9$%ÜHó›�/ßÍ'|r¹ƒ¥„-Ï¤$ÏxíÐïâ~ÔmGÐ†—\yÈ”FPœ ›Á$WK¼� D<Z·&µÈZ2†Ïd´0¿�ØÃ@�ÁÑ¼Þß¦xß�)Î…g%<a�_Œ\îÐ:�Â¤ ­aRó‚-ùJð«%à!+´ù®ÐZI4A™ÌÒ«`eMœFá–
+Wå{ßžÇß§ã@Uã\0¬„‡Tù�¦°Rœ‡ðÞ$¤MëÈÝÈˆWôNH„I.èÙþ,éGQáƒ/#ƒ2�-LÚ�"©…÷ðÄì&d„Þ'.Œð7è¶Û0Z
+‚„t gŽÔ2 n
+Òýh¦Àð·CÉ˜~±+s	žP¢Zbz
wâ.A{4\á\1×Jnû˜Í¤5ž©�Ü
+YC¸NI²ã¿:ª-î!W¡¸ª0¬›p[îÒð¾†U�{˜¦ZÀì¶·®}Ô„ÛêN°&nlö¶
Þ›&7¥…ÍÛñêÈ	éVü±’mhB.È4²Ÿc7¢j+Ò©úƒ�6TzŠö°žÓükFÿ£ªèñn•çM'îZËu÷gOÑð9ÊKî¨nu‚$+ÊL[Ñ$U´ŽŽáp½æ<7ô¶Ti7–™Öþ°v�«tá®×‹ã³³æ®O‘¸ÿ”¡ü8ý'nßý[ô•“[kÛ@…ßõ+æÁI¸1}�ãÔ­IH ”€óÖ3^�­¥Òî2;²1%ÿ½¬.¾(vCõ¦Õ™9ß™ÑÞ~q¹ƒŒT�L±ÖJ²sä'Ÿ“q4J#Há5×Vº Ð²€]ÁK®7tA­˜Y·c½Îb•ÀW6ß
+4¿‰ÅÃ-²¡é²{¿ÎènsZ¢�©"†[ßL]îÈº‚‚Ðd ¬ÖËJ,ûÖðÁ2HN°ªŠÔÞ=¨­ÈxmV–KmÍ\Aè	6š¶uÝóÓìþûü>´ªƒIŽ[ô�ißxQ[-9HïmÅŠ@Ù¬‹<Š–ä*‚—ùÉþ¬'2Ž¢Ê.£‚sÝ}±&Y„dÄ�{ß·¬…z‡^˜°¬ËJ\d(Ø“HéBëq©½‡g«°˜ûbF,z¥
+ÁŸ`”¦0Ý ‡®Ú¬z8v¬7A4È­—�e�Ê™ÚÔý¡ÒYFÞy=4,µ®ZZH!º®”Ä-ÂÞsØA
¯Ð&i¹Ã3Óÿt×ÉarŒÛ)&z½;4µoçy×$�­GœÜt€&&©ØôÑ>jÙÇùGçsÛ�[»K³O~\U¬¯~�`ŒÒ´é�ÂÔ!cyfÚ­àtÅ{ðÿ˜é
l¬ÎÞïî1Lº8N»l®ÃGi‡ï¯Õ	Ë~ÁoÑ_…‘Oo1Åïû)Þ!@4´×B(mšªHQ%‘r©„¼f`GõÚ–gUùî•—?I�ß<zþ½÷Æ£/±Š˜“u&QG4±Õ™>G’«OÝa1èèá±bÁ‚�Ñ$EXà®â]h×!>'^VŠŽíâkò„oÎø?”T02ÉÓ¤ÜÝ/ç4îã�J#ÊÆã'5”0’Ý`«H!:ÊB?‡
^—�†$[Ã!A+Â¢qvïžÕŽ-y!°_„TåàûˆŽŒVLëöÝíôúæ×ÃMFµÅ´2ŠµÌY6^4Çšµ‚æòšd	6Ìw•…75I4–pW™4
¿Û�‹¢Âw£ôÈ5MëºQSº<·ÎˆàÞ(ÝrÍŠ¿z=LV&�½flžÅÄ+£„—…Ãâ¼0QmØ³_Š�‚œx*´óˆMéØbÑx›÷†ÙÌ/š«�l»	Ôo#¼zöO¸l°ÝmÉ|.ò&?Œ[B;¸Ú÷;�ìÁYò¦Ù‘LhOÚ¶È·—Ó]–¤íÞ;ÝÏmþ×d‰´Iþ¿€çH÷»Tçhñß!²<±Vì÷ËÜy&Æøx>©�æ¿ÉØãzßãÍ>_ŠÅXmoÛ8þî_1»ðBRàØé¶Ÿœ:I7ë"Ò^à$ÀiÎ`¨±E”"u$åØØö¿HÉz¡lßõ®ÀùSBÎë3Ãá#¾¿Ì’b¤œ(µQŒš…Ùf¨'o¢óÞè¤'ð�0
KÆ˜†Œ(r	w	[ã°NâZf[ÅV‰��FðA	„?8_Q
ï‰xõ²ûãÅîñ…hÃˆ€ÌQÁ{½[¸Ê’eÆÑ
+1P)Œb/¹‘J—?J&AXæœ­¼[iÎ(
+�ÀÄRª”&Å2ŽD#¬¾:½ÛÙõôóýÔšr‰™„x%b¦_Ã+3	›¼–¹¢TÆ»”G=ARÔ¡w	Q3ùÅ!rÞëåÚÆ%¨õD)²]0aPi¤æ|ßîWÜjoƒÊ\øÂ¸É¸ŒÑ[ebá¬xËéËBÅQxë™ÂÕ"%†&Þ†Îfé¯e$—¯¨¼
£Xê-åtÉ”.£þ“|`)ÎÒ47ä…[`('ZÃu®ø�1Ù5g(°4ã˜¢0«õF''pµ&Êé\K±d+‹¼ÝÊ[ƒÐ§nù¼×V°¦î”\)Ôú†ˆ˜£êhfí}ßÄ£â•\q_Läœ›>�ndhH'.WªŽ¤"oYÊÌ
’•†	<=ûªƒnöuDYþÂ­Ë±XP)´Q95¡°¿�N·ø{PíïÃÍjÐ²VØùXzÕn/*ëg}{€N/Š2Aõ›4ýŸûÒžG+Ý©–ïÀÆU`…Â÷
+ÔBÿ®L¢äkÑ|Ó
ÅÌJ—›£½À&HâÐv‡m‡\ºâ»jÃÄµC4vÖæ¨3i'Qê¤l'o¯´ÓìžÆ®F“gö™Ð†Ša´‰Ó‹X~–fŽ&WâoË1m�ç®èŸÐ ²Â•´r6ªð6HçøÏµÙ™ü˜®Ðü¿ õëôB¢Lh-u1;Ž¿B�sc]ë˜ã%L'ï…¿°}ñŒ(’‚Âò¦êÓäx;Ÿ»¢ÏÄR†}š€	}ÜdH
ÆÊWQ.)¤ÈÖ{�Y¹ Q˜hìþn”&±]ÆX#RôÜ
+ÍM¹ÕÊ•-!¬•.&ðîì¬9KxœÕp~?Ô«€‹¬³˜[V¾¶f_)S7×À‡¥IŽŠÊx—pcxós+W\3‘å¦(œe-b}ÎvaI›½UJ
+ã`à®ð°Pð‹ðÓMXè=½yŽT¡b¥�½Eyê'.Úô×„çøìÆ¹µÜ8…HÃÃdÇ'Âšƒ„¥XÔ<LÎ&´4‹ÌÜF·½
+G“É‚©!«ÀO­=4lcØiT›«2ä­ÍšS…ÁèáßO£ËùîF?
‡'QÄ‚Ô08YÔ‘‹âÍ�|Rð´�ÒÒÓïÏQäpuQ;ûKVÊíxEÍÿºónkÉâ=7¼;ÚL0Ó86§Dß»Ö[MÖÒÑhþ–™–…-º`µ­ój7:t‹¡è^bONbAwØÏ‡i,ñÞßLãä9+~·È[Õu�žúeR^i~ÙKý'[Ç`¶<ý,ž~²CÃfc6aÝ[ì~"µ±_(õè­&o¹Ó�¼mè¢o%%ü^ókT†-u#qg¹3|ZGßþ
+ÍqûNÄ7íÏwüsÔ’¯1že?v©TkÀ‚ñ»woÇ�"4’Øïä¢ü�›…±9Ú~;i³Cº�´c»Å^nEëí¡ûöÜ
JÁt.áf$ŽkëºVl:€ÿ–'ú©E©þ)<ö]eFmýÄ|
+WŽ—
Òb@í¹„ÐN§*rèc(«?UJª’…L˜¨�Eoûü§êOk2�ëÇùítq»¸›Nç‹ëéüaöqvýáaÁ_0:�ûû[ õa�LÉŽéÈæÏ¡^Qž*ü°#è2(bý„Z“†‘=
¾&öÕD…°Ä£q6,BÙ¥_¿ˆ/âWî5¸‡%Î¾"ßBŠDhØÊ\�û”cöÂáœ�˜ Ò>,Þ„ˆ!
¬Q±å¶™¹–Žº½+ƒJ@€«?Ì0…p)U±#(ÂRÉ,!ÕãÑÈ†5LÈf3Ô8Š%Õ#Jpc¡f˜˜”G.0ÛSdE˜ƒý€¶ŠÛit´Ïæ•î([7ì#!º~~ó‡oßª×­zsO¿Ÿ�
àíÙ»gËaóîœ,™Î¥Ý|hÚØ�óË1–šÕWkõOF”Æ¹7AÝ?ÿQ]Ê'¶0x»/¨†—Kü·:%úM;îX‡¾Ÿ\µ«VÉ×"Ç‰Þ�lÇPSÙæ|µñ1…±�¨�Û
Ì1%L0±*þÑh‚çÏÂ
+Rš4>Ã³ÚïŽâVòžSÃ*�Am>Šà=¼=Ô9çÇè±-a•q»|Åè>@ÎKž? RÃå©Ù :¨apÕ8­û¬9¼£nÅ¿÷þ•�ÍKAÅïûW¼ƒ‡¶”ŠW­Ÿ¥RA¤øq$�Ív‚Ó™!“m)âÿ.»ZO^<&yù½¼L/³Ï¨ÙRSqöfûÌåüdxV�*Œðì¥ ‘À�‚LjH
–^¶<©Ð+f)ïUÖÞ0pC\kdÜŠï¬V0%�|µ:Ô“š/ÆxâŠXpËŠi94®²ÏœràNŠ5\Š¦²j-iù1¼M
+óŒ¦
î×½SqCb“tC&)Ž‘Sal…wýÞýÝlþð4ïP}0ódØQA-åÛ‹kìÄ<¬_R«ŽáR}ˆ|\EÚpÉäKOz—^û�œU•DcmºÁÂ,Ï‚p4|T�ÛU‡¦�®»k¶Á‹µÆ¸œ?ÓGl´Æ9bÂð´g<rÉ)–þÅ3ÕÿÃ|V_µTÑNÛ@|÷WI”•x*1¤  �*„€ÇJèr^Ç§:w§»uRÔòïÕ9vâ8�TH½·œggfg÷2¼´™EB2Ž:ž�’üÂ¯–|ü¥{�ô"ôðœ)�Tååa…c˜™šÓq„qmì«SÓŒÑ‘]|sšp•ý“{…Ó4šÔ¿�ºèã‰&Â³·T�ÃÐ×#›Y26§„Ð	¤ÑìÔ¤`ã|%xc8#¤EžC®Ô:W’´'(�7¬ŒîÃæ$<a®hQÖ}¿»ß?�UÙg‚±‰òK-J°Pœ�CóÞN¤Iê–O"-fä­�„‡L¸;ó£Lä<Šd.¼Ç-³}$oMðò;€“^£¹pzHÂµuj.˜pè*ø•I^Ï£Í¥yŸ1Ûk“P«‹<ÿ3~Û
+Äbºý(˜¾«™Úqõ—ªÎ“\I¤…–!Z¼¼H£=»Br'˜\¹ê×mnôÕÇeé¬´‚¸Tïãr­¿¬¾v«ôÂ9Ó\4	·ƒk�k?å]ÜL­,Õ'®ÃjK¯Ü-A�xÂÍÛî�”*¤$ï;Ý¯˜“7zrÄ…Ó[n‡8;=ÝCzoøÆ:ùwÖ8Žqvzö!ï”ø¶Ââ0Ô}¼ûøÂ`WµïÑmÏñ­±¬Ö‹|6Þ“c„ÕØ˜\½¸-õLø°p{#*9âåÎµÅ—5=Œ8sf±ù¸Ç¿$Ù U�vÛ˜×6Êý_ÛP):užµÙæÒ‡SêBÓb·tçèÞ,y­#Oš¡4ê4�ºë-®ZÚÝþÇ‘T:`Woµý&ÞŸÁªhï Ölÿu†Ö-½;—þ3ÃY+|vB[ÿ4oÑ_½•QoÛ6Çßõ)îÁ«¥Ôn¶lI‡8v“ÉZ,À•Y.V´…ÀHg‹Mi$×(òÝÊ²ËYN0ìa|1Dýîîÿ?ž©›we^B†)#m©MU¢¶%ÊáOÎÀ:?³àâœJXR†@%”D((–0Ëé#¾± &Ü¢Ü
+ºÊØ©w‚#üÆÿ…’pCÇÛ‡ýó›G=˜ã‘Š¬PÀ�ÜoÜ–y‰EÉPƒ@xiÁ• •*„l
+þ^P9Â²bÒCuM3š"—”/±&Š¼%C")nê¸©ïzÁÜÓ©jc*'
+6DBFå®f°¡*¥ÍË¢)BZd{Ëç'k”%If9~ñ¹îÈÀ²*©uñTWÉËÁÑ^)(WË�e¥ŒH	*±¥|5QªtE®€®K†käJ‚±ûÍ(}$J«áR�ÐÁn‘¡„!|ª½.†#èº‹hê%n¸˜Žƒ8‰¼y8ýà%³(üãc·w€¯^‚'á<6Ø·§X7Ï5±‹›Äñ,‰¼xÞ8ñ¢(ŒLôÊ@#ïîñ«A„3/º‹ý0Hbÿ½7fÙŸ/
r>Ÿî•µRþòÖã0LÞß“Èû‘çÆsƒ¼4�Ü‡q„ñÄîMäŸÜ­rWf¹ixïÉØ|oÜ­‘/«þ=?;ƒÛG"€r¥gÌ<îÎš|�EyÌr’ÖÛÿ&¹Ò™g(ô3Â�ÇQ.£ŸÃJ•U;¸¨·›€²z`4ý>íIRª¨Re9š ž)¿ÑÛ«ü:ÍÜëÕÑÇþhÿ
+†f[Ž ]2
íq„ì4ì�½	ýúé´•If/ƒN%XÞy1YAYÁxÅ˜s]Û‰P–…¾ƒZÂŸm³^U%øÍŠXlí®®Ùí5ëZÎ‹W¨þo‰+T/*lÆä q¦ïY¾‚ÎU^d=øo¢•ØOÏÚxýÚ0Ñ6²�þè[£æÉn»©AJTšƒ­Õx_S,kCtŽDÐ%Ø§ûyÓšáW¯€J‰Ê–È–××ß/ôOì�V¨ôƒí|qŽ‹´¹?ÚªÐçËÂn‘z5_»«odˆð¯
+¥‚%¡3°�ôw}2”ÃHLžI}¾¦§•ÞèÒ¡šþöÙÎQëŸ›£Ã$œî½1Q‡ÃÏE±�ÔÞ“õ7­V[o*7~çWL�ˆØ� Q_ÎC$”Ð&RJ"HÚ‡$BÆ;ËZ5¶�í…ƒ"þ{åÝeÙ‘*Õ/	ã¹}3ßÌúúFE
+¤œhôŒÕŒÚ…Ý)4ƒ_ý~ëò¼çð1!ãÌ€"Ú‚á9b¼hA¢1–j§Ù*²àQFZ üÆ‰øµ5pM´ÀÛåá÷E€Ã.ÌqIŒeDÀ=Æ¨áÚ·*R(G§D@¥°š-c+µÉþ.5Ø!Œ9šGwÚœQ�‰Pê5±LŠ.(ŽÄ ln»Ç‡ñd:Ÿ8W	0[b `&�…l™�À:ðFÆš"P _¶Y£Q„"<GD?È÷¤"ýV+6NSã×Ùãd1~z}¼›¾,f“ùÓã_“ÅýÓü¥_Ðº›Î£š`4Êda,¨Dk²[¬Q¯°ñÆD,´•*cQ•Â,Vh©ÔAåÒ(Í„
Séä'EåÄéÏ"Î÷1gïO±U±í·Z”c`ÆÄ*�[1Ž5¿·V�9Ca�­Ç5
+k  ýl\žŸÃí†èâÍùer¥4Û‹Ð¦‰¸ß*¸ c)B¶ª$âªAšlMY0””“ŠÖt5É7ÀÞ>2/9£Ç.IuL­W•¡èóÎíRËrñ³Ú¸Óvôë
Sc‹QUH=Žà+
+©k§pì.÷ÍVh½WÍ¡kÞ…›ÉYA-qDÌ¹•ôk†FI7jÇ|5ÚX‹CPü‰ôoM”BíuVh;ÝÌeâÌÿ2‡Iðÿ'á¼~™EÖê<�¢µÛbí5ÚH]hÌîtZíHë¶†ëB¬yo¸B{ŸÉ<¿Ð2}0N‘fLs'”	�ÀËÀeŒÌ½ä1| ÚLÉTãKohÐÎ2R?¨£u71í7Y¦ôé
·šY|¡ô²•áu^ôÎÕÇJ·ÇRëþ=3à�ß½ìÝ/ÀrÇê]%×j-JÃÐ~f�Ø{åvÖ|”–LÞ˜£çlÌ‹‡…àå
+½!3ó˜R4Æó«­’î`Ô¯iíK’=Pb]']Rù¢…66hªýDk©�ÅŸá��…�0ŽÁœWrLHö'CVèù~¥§û¦k\Ë
¾
+²!Œ“%/²êh¾?Ö¹T,²ù¬à°‘–[¸…b¯3•°fìò bMÌíüÁ6ŽT±ºè4Go.ü©y®Ìa¦s„WÙîÿ,Áû…ƒ¶2uÁ[nöQãE›©GfÜÆ-|·½S�ý£ÞÝMçÅLž~÷?›ŒF#¿dT�‰Pò2ð²,Y}ªa�ôÏyx7�Ã³–KŽë+¸ci!d"íêÃ³[a�oÂogæ[q54ÀuçôCª¦^cx3Åk
tû%-Æ—,;iÿ5íòfUùÖæ^îÉÝ@½#‰ò÷4®Êü»P~Ü•6z#ù,¤³Õ¸hÒ€oI9Rµ·Ä0ë„^p¦:påþl¾w>N­”|Ã�Ún
å-vàôW÷SÃo$
+¡
+/ä¯†øxßúm�AOA…ïó+Þ��àP”`4!†D½‘˜ÙÙ®Ó8ÌL¦]�ÿ»ÙUäâ±¯¯}ý:½Î>£&l¡�ha§¯zÈ$³ñÙÄŒÎ
ÎñìYÐp ° Û¢H
Öžw44è‹”…ß¼bàÎpS"á6ØøNES["Í«c=¬éêOTYQ¶÷ÔRÁTŽÂ<ûL)êŒ°±†KQW­¦"¿�w©@=¡iC€ûKïÜ�E!plRÙZå/�Y!ì˜öýÜêa±||Zv«z0õV±·‚šå'‹jìY=´ƒ—ÔGp©>"�L´[’laímyH›þ#c\°"X¤Øð[[¨îÚËG¹;ô¡kÁæ$ñ6ÚRTÁIü4�Û*°ë> ŠÇ´J®Âã‰ùÏñRf¸œ˜/ó
=�KKCA…÷ó+Î²-Eqkë³T,ˆêR�éÜÜNp:3$¹-Eüïr¯Ö]'9ù2¿«±¢¡�¼ÐHM8Ø‡�*éÍÕxæ.'¼EV´œ¬¨^¥Å:ò�.Å¢Ô“ð.FaŒÉ„Çäó'‰)æ^2ÝoÏùEC·SlhëÕØg<SG‚¹ž÷5V*5Q/„Ï
BÉ&¼í¬ˆþ>�EBÛ¥„ðïÞ«ÊJàÜÙ{ã’§¨‰¼LÇaîeµX¾n–ýªÌ¢7½¢aýõ¢G¶ëáµt¡4gäK—ýž´ú@XG/«ò>|dæg#iÿ
eã–Iðå vÛÄm—C¼nL8ïFãkèÍÜ·ûµSßOÛ@~Ï_áIL$YiÄW
+tU•XWQà…"t½8ÍiÉÝÉç´ ‰ÿ}º4ý1¨[’‹ýÙþüÙwrfs)ÊB†ŽII~äg‹®{u‚$ †›\9ÈT� XA&ƒq®Ø Fô�}&5ÏBA�4Â÷Bè_HìàD�ÆóÙú¿�âi&8Ž•Ðp‰œ¸µáÜæ�-ÐAè¤ÑLjV±!×¼0œ#dUQ€ÜT÷èBIÔAéÌP)XÝ[ p…Ë:îjØŒ&ŸªnŒsÁ°RåVµ0…¥âØ7ïLEAštÝrhQ¢³B"ŒsAC3­éAå<R;†qïær8ºøùx1¼Œz?�Ú™UZzZ M¥ù•Í
+Î=õ×fÂùc)Xæ¯Î’Òœ­¬
“;$§Œ^;A á\í¾¥ð‰Q§üY•¶À5¯ÜÃ5«L!ÁïÀV³BÉm½9²Ç�D‰aô
¼ZzÞ`ýsàõôÚ@wÓKxàU<:nRÃÃ¨õV›¨³É±m6<LÂvÝOÓ‡/íÝwœ¶¶ÅZpPãÑE�`“GeÖ‡/|êvák´C¸&Ý¸ï� »Íºeô²MJÈéÝ�¬�$q¼‚ÆpÎ9™¥ƒ[í*k
1¦ÍDú~=H(Íƒ'‰ÖÛ%ï‰ÞD{Ý›ãÿþè~qG×gáñ£©þ_U§É{e§I]ømW;öÌìÃTê‰�ÆåÇ†6·/<ì›ªHAö—‹„d_ö®aÑŒ)#SÂg·�{´Ÿr³fžÊzì;+­wî%øu�AkA…ïó+ÞÑ6&¡×®›º
)
ê’S!ÌÎj=¢ã™AÒÆ˜Òÿ^Æ‰“KrŸôÞÓês�…ä…fjÂÁìXI?}˜wîrá°À¯ÈŠ‘�Õ‹¡Œ¸‹üH'âºÔ£ð.faŽ/’	_“ÏHL±ò’iÝŸû‹�®–ØRïÕØg|§‰+=Ö5V*5Qáó€P²	÷“ÑgÁoE`‘0N)!¼¨7:q ¬Îc‘½7.y‰šÈ+á‘épÚûq{}³ÙÞ´S§`½áàë“
8°EX¯e’@e8G¾tÙïI«„»èå¶ü>}¤snÒ—Ñ=‰rÉçÚ9ÇÙHÆ¶õ“ž<ýuP§>qÀ8åÐƒu;ÕZÄh˜Í?¢/%uîMrGö|¾�¯Jï°¿§¶˜y×¹î?}‘Ao1…ïû+Þ!@4¨×)¥*RUEMnUƒw`­ÛÏ‚P•ÿ^y—%iÓvož÷ü=¿ÙÉ‡XE”l	÷’Š5ú]O‘Óô}\Œx¬lÂÖ:†Mˆ$Š°Å}e|] q,B<‰ÝUŠžéc.žñÑ‘ÿÁ¢	Ï³Mw¾.ùvˆÞPRKŸ¹fÁ$uƒY¬"‡è8A¾„	^Ånj
’Î�Ÿ‚@+Æ¶væ’žÝÎö‰aý6ÈžÔ?DtL‰q°|lî}Y.î¾>ÜeTSL+R)¡´©ÍâG«4—O¡Ã0¡ì*�
+O{N‘ã¾"Y†§f#ã¢¨S~—79&Ô^ÇÍl.B§¥²�iG‹¬ÒÆq{ìÄùn'¼#=�…,©õÆQJøÆM£EpŽÛ$»�Ž÷ì5½`‡o‘øYÀh0Àì@Ò�VëÜ)+Qì!û®¤U¦X­ÇE+ÖgÍK=*ËÞ™p¹Ð¿Á!Øò”¿«¼Äw·pµÆôâ7®ç¿ã›íõú7°^_ñ„µ–NýÞÿ/pÇÚm$c_mö-Þóñ÷öÏ¨çâ…TÁŽÚ0½ç+æ°@tQ¯…ÝÒ¢]iµZ‰ª§•�qbÕØ–gBÕþ{e“„“Ö—$ö{oæ½±2ûê
+9J-<ˆ½’¼æ“Czø<œf“Q#øY(‚­ÒŠÀ	Ï`·ðV¨ÞgëN^í
+†�Â7o¾ka~£g‚™ðç›úû>ÇÇ1¬p#ˆ•0ðKô0£zcî
+‡Öi@&i
{µ)Ùzª
+>[\ lK­A6ÕZ+‰†”ÙZ¿¬¬ƒÓ(á ðy/ËÅÓëê)HEc\†£ È�kaGÅp0O¶ôAÚ¼¶<ÉŒØ#9!Þ
+á—ö=&2Í²’š­g¥qu"Æ}|
”iûüzRÖÔÏ�-¬!öBžf™Ô‚–†Xh�y`ÀŸ`2Áü <f
ÛÎ«ƒ`„»s×ÐªB‚Uµ~ÓÞMÞ¥³Dáp£÷+‰:•„©­Œ£ë6Öê.@tåF+	ÛÒÈ@‡õZÆâ¥äA„UeÃ7»u‰ïÒrœZ¼ s�›ËYô�[Ãj|aÝ…+÷é12¯ÖC=¾²ÛoD¦Ãë°’ÆëÆÀ:´ÚÊU[—iuÐÁ`bâ<®ðñq{h;äW±ÇÁðK=ªK:¹ô¦Òÿ¤–�$‚l�TŸîíôúk$£U¤•p_¹žØûë½T�‡2Í5ëS¿žN�¨¢ðzñjöiµg÷‘ým�Ak1…ïúï�ƒ½¤1½ÖNê4¤ÔPJÀ=ÌX;›*Kb4kJþ{ÑÚ›¨.Bož¾73«Ï¹ÏhÙRžSñ¶³—Ìåöã|é�CƒŸ½tR�I
©ÃS/G¾q)¿¨<÷†™Ÿã^#ãK ø›Õ
+V¤‘×ûé}ÓòÝ5¶¼§bBßx`ÅªLÂ:÷™S\� ØÂ§h*ûÁ’–Kà×¤°žÑ
!À¿¥WwÏ±0$vId’â5r`*Œ£ðiü÷}óðøcûXQã`Ö“áD­”s·8‰õ°:|Iƒz†Oí4òÂE:pÉäO=é&ý7²tÎ*eïƒP�ràG;‹›–£I'¬øã`Ñ4XIQ“ãseW9«ÉWT)K7yÇ
Ö™”Ó§³ëR»†}�nˆ¾.»�O±˜ÞfgûüÒA=WuÐw£ŽÛ·ÔZzuÿåQÙŽÙ³ù§©‹8e4¾£N°W÷�‘ÍnÛ0„ï|Š9ä`nŒ^k'u¤h€"â¶§M­,¢4IpW6‚Âï^PÕ&é�u´~3³Z¼�MDEÆéD#–d�¬å!_¼ÏÕl¢0ÁçÆ2jë–u„w�ÝÓ¹B§¸
+ñ!Ùm#™1Þ%Oxï´ÿNI�<-7åû¼¢Ë)V´Ñ,V{|¤–\ËØD
+ÑQBû
+&xIvÓJHÜ~	ÒêÖ9˜Á=«�5ä™`}ÒN‹
~ŠèH3aoéÐÝûtsu}»ºÎ¨®˜4ZpÐŒÊò£U8Xi ¹<‡6‚	U©<S^ïˆ£6„»F§›ð­ÛÈ\©–‡ÑWJlƒ/ï¹RÆif|ñÜÆ’PuO�Ñì.:Ú‘FýP0›L°Üë„Ìo³uÇd÷Zg9Ç\=•ö~/´û!Ç)äDšql7ÎÔ­7y¥X¯Mð,©52êïwQ¦ƒyq›~÷Åòs–×ûê2_ÌŸ¥Î³óž”Ï‡
+Ï$�ìQrçÓãŸÓ[^•0¿Á&÷[ªDÒ&�Z;¦b¶$}ÛL)Å_€ž¶øñ¾‹Ÿ�ýÞþÆ;¡ç–äVïèØ¯½ÕQýµV]oÚ0}Ï¯¸•*ñ!(Ú+”–
µZ¥
+MëØÓ¤Ê87Äš±#Û�Uÿ}²IL“ÒM›_€äÜësÎ=q¸¾ÍÒb¤œ(ìj£5Ïæ%C=}×›D£~}ø’2
	ãLCF”™À§”mñ*‡˜ËìE±uj K{ð^	„œˆï¨Œ†k¢ÎVåï«oð„+¢
#>bŽ
+®uya–¥ÊŒ£1P)Œb«ÜH¥‹
ï¥“"$9ç@ýîÍE¡˜H¤ÚÃ¤@Æ‘h„-Ã�«{|˜ß-žîl+'Ì¤ÄÀŽhˆ™>ì…1ì˜IÁXñZæŠ"P—’G‘ Ô¡ŸR¢ä7çÈ$Šrí/Ý3ŽO/ÚàÆ}µ%“êý¯¨4“¢ü|íÞ\
+maÂL¢ˆr¢5Ì¥HØ:WÛøŒú}˜m‰«C¬-S{9SlKÂå�ClTmO�¨µ9ç¿Š>A5ÚÎ1ö:O—Õ\R7Å“UVùRñ (W¼‰_Iâlv
+`–¯8£�ä‚Úíàù™:¹95]°«pÕÙ8ðWCCÇŽèÛÒ§À˜:U¨wÅÛbJ¬èà®SídÂÂ5º[½".v]ÚŒoÜ6µ5-ãÒ@Ú,òDDe�Z[f£QåuWi3Ñ@[.
 s¤	<¤ÁþØŸÎÄÍ‚l°Û—I8Ú¨ÐäJTÝ<×*ˆ�íf©m‹Ç÷>÷‡º>ÌLªä®y`Üý ˜Y*lÔFó¡1¢
+Ë
+7–@÷¢œ´ö5Ý^5jv92 p×Æ§ÛqçÓ ¤�Nï8ÄBcèÉé8í+GA¦	ß‰Ö¨Ì�%C£rôrÚ’ÚbNMçøð¬µM+èy1=<«¯S„‹	†B)Ñ�ä,!ß«�È?ŠO•�?ÎNç¦FÿÏsSƒÛÕYHð25šÎ €´ô�²¤R«yKë§ÓÛ&›W^báP—ŠŸ�§íðŸGYÐ(_8­Ct¸¿xî–Ÿ“zm2KÅß2î·ÁLÛ?®g�­¾öÑo­U]oÚ0}Ï¯¸“*Ûk)”­jµJ]U‰iO“�qnˆ5ÇŽì(Úúß'›$$�t<,�ÄÇ÷žsîIrs›%DÈ%3Z2‚ÓŠöÚÙ§þ4˜À÷DXˆ…D2ft/‰Øâ8�¸ÓÙÞˆMBò>|6
+á‹dê²pÃŒÂÅº¼G8Â×Ì’`
+¾bŽnlyc‘%êL¢Sp­ÈˆuNÚØ¢áƒ6@	BœK	¼êîÐRpTA¨X›”‘Ðj™Df¶w~ßÓãÝýóòÞ•òÂ(a;f!öÐ#Ø	J€œx«sÃ¸ŽJÉ“@±mÆ8ÂKÂÌ£þé™An/Å]g_}…¯Â’�ú•ü $.÷–0õ§�µoL‰-U'ï¯>i¡¹sÿÊ1s´àh¬ÐªüŸ—ÌZ¿¿€É`‹-3àÌQ'ßÝÎŒØ2B¸r^Lƒ&´(w‚ÝVmpçÂ	6öÖ4�*—òO+6ŠQnðA¨
šÌEÅþ,_KÁ�ƒY­¸V–LÎ),ªyÃŠxÉtxàæÉá¶Ÿë3O¯_ØæŽ+ ÑÜ•†ö1+�k�}$Ï€v´ÀËpåsßÁ»Ã;·ñí¼ƒ¤g–bØ¿.cqTm�r£êâÿUªpÝU+ÐU®¡¬»¢›š+ç§×Uëhé[-g™e21kÑÐHÄ#29–"ß³±Ìc‹LÂìòÜ‘[k-;É�íñavY›õ¡Æ”½;<¾Õ_,ž§·Aê¢w2XCø¡ ×)«žwxF p×$öž5T!®‰´H½þ1º…ÊËz7	³å;±ÛþÚK;lée	3×“IÆ�ûµ0�æEô”6Fsf—ÞÄ°ßÚÔ›¤“ñk*{ÕZÿ¿N¶®¶<¯)&³o
«ð ùå¸¾Ž�N]ãð2­õágÄ;>Fp…Æmu�,�ƒ˜	‰Ñ¸7„�CW¨ž™Ãï[ð½UßOÛ0~Ï_q“�h+Jµ×•B�TMˆ®{š„\çB,\;ó9íÐÆÿŽìæW“”š–—Æ¹ïî»ïî|=9KâBä’ì‘5‚Û{û” M>÷ÇÁhÀ¾Ç‚ A$ÌXÐÜÆb�ÇxÄ…NžŒxˆ-ôxÎ�Bø*™zDc	N˜Q8]æçãO�`ŽKFV0×˜¢�Ê?L“8A�Ht@`*®•5b™Zm(#¼ÒlŒ¥R/ØZ
+ŽŠ„Š´Y1+´:‚D"#„µÀ�÷›Ý\\~›_ºP^˜�™…
#m¹0„�°1X'žtj8×a.y(¶BJG¸�™¹Ñ?}EÆA�ÂåoŽ‰£ûc†¸çOdqå_]„û4$´Ê/´"k˜Pv\2"¸Ã_)’ÅÐyÀŸ`4ÀtÍÌ6JˆÊŠH q9:sbÄšY„Q˜ÆÁ®cƒ¯á»nÉè�!¤æ�f¸º»J¥ü›×¤Í•Ù¯¥Ö²^±Gtó˜�“t)‡(UÜ…€û{îsL¹íy€{j•«”ê¨À46«ò*z§%ò¬�]è„‰/H‰ñBe0�ˆIBoîgSàž7¬ÃÓ2ûÜ0Ùí~
ß�áð-¯¹íèÉij]nºlB%³²»5t¡·Š.Ûë><·7ùmÙÎ^ÿK½ÁeÉÚÔ¨fåvÂ�ƒ­Ã¦66zCåÏ£}yœKÁ(OÁ*ì"‚^³iB‘eŠ£ß²™SµÍÝyWrw�ÏnÊ´{‡Å*�Ûëó;ˆ�ÒÀÙaÿŸÉ_™‹_ù^é#ÿ—ðÅÝ¬&»®&fT4Ó_Èî)jmeIV²R,Œìº�Ýäèšk÷žÍ°ŸoVÝ	ïãjY'Ï•?�„˜\
;ÑÐš¡Ü§µ¥³gJcF³ÒY÷"Ö§ÉvG¿A{¹H¬õ4B¿>ùÍ­ù±¹Ïãt?£¹5B=8äßÞ0›ÃÓÒíÕèùRï¬}û?/�SÑn1|¿¯ØJy‰úÚ„@Q%RE¥éS¥ÈøÎª±­Ý5iÔæß+w§ã€^ßxfgfïjŠ9j«{,d´<ÉK@ì_fƒð£0KcCP$à—ðP˜
žgP"n|x!³*zºŸÉ!|±ÊýF†+E§‹úÿyŽ×C˜ãB±åà#\q}0
E@,& (—ƒöNÈ,¢xâJð«'�a­Ý¨'´5#·ô´Vb¼B°¨acð¹¼÷íîfv?Ÿ%ªÒ˜JàY1ä†·Z˜Ã³‘$™gI#hŸ×–/2§ÖÈAi„‡BÑ�ÿU&r™e‘›£ŸHl¼«¿/³L[Åó‚'Áü;n3ë`q�Nê£¿ÀÅ`Ó�"¨(’r:d6JÎ6
õ<
ðHvÉv¡.ZûïVq±Æ?µ`žvo¥˜ÜjïJJå À¡aØ¬œ’HøØLâÂ
Ëètjžž´w,µô*ÉRcØR'0l<'“C˜”?Û0.GÂ¤t»c¯zÖ¯bOŸ³Týè:©ÕG0®v@Õ
¨i¥ƒ‹d¡MVÖÑÁtFî¤Ôw<t*KÀ×ÃÁn–°×ÿïmË;¡Dr ñM–Ê½Zcb¨ÚÙãhÅxŠªª4±Õí£Û	ø8ã#ÙÄVoÆ1¶¦†×ÖêVv=RÌH22ËQ
+Ê¥:ÐS½Ú�
+ÅóìxÒ‡8?Œ·KyÊdWaò–Õým:éyû¶Ø·ã¦g-ØIÓ;œï5ÝUØ¾Óï‘¨™_³ÿmQËnÛ0¼ë+æàƒm¸1zõ#qÄh€¢à&—¶0hj-¥Iawe×(òïõ°S ºˆšÎÎŒwUY!'ë
ÓP”�Õ­ž+’åÇÑ<›Ž3Œñ½t‚½ó'¨+âO¥;ÒM††q«3»¢TíŸ8>{~«`a8Ðj×ßät;Á†vFÔ™€/Tc!=°ªÊŠbå)aBƒ²ÛÕYº…ëÈÐ’°¯½‡½lOlï,!¸°�|0êb˜ òd„pttjî}}¼ø¶yHRM0-�âd¹“vå89-¡)¼Äš-ÁÆ¼�<Í‚9�TÆžJÃ�ñgÓÈ<Ëj¹@kçis¥Csœ¿�½‹‹¡Ï³Ìz#‚g¡<Q@”B.
3˜ŽÇX
#™Å�_ÉHTìŽF	ƒZLA2ÏZ´Þyg±¯ƒM5`»µ1ˆrmuØÒÓJa�òL.hç
+ƒc{¸NRRkWÌ0›s¿ü
+ßõÚâŠ`´fZ»PWì‚b‰P{ß�G]¾Æ´a
+:›½5Ûš»šéö¿/<š_´éï}¸m}ay­'
_³¾Ó–?ÆŠIk—v;|ún™és£6Íº®!:¡ÿö÷[_³UPMKA½Ï¯x­ˆâÕÖ¯–Š‚ˆ´™Îf�à83&YKÿ»ìjE�/yy™ž×XÑPH^h¤&ìÉ¶•ôôx<qGûûxˆ¬h9XQ½J‹ûÈïtè00æ¥n…Ÿ£aÆ¸”L˜%Ÿ_HL1õ’éb½Ã‡
�`Ek¯Æ>ãš:Lu7¸¨±R©‰z"|nJ6áugEô'ðª,Ú.%„ßôž�8PVç¶È«7.ù5‘WÂ;ÓfÐÝÞÌw«Eo5³è
¯hX¿³¨Á†-ÂúòZ:	„Pš]å#—ý+iõ�p½Ü”Çá#ç8IÛ/VƒlIµ([‘->Ôn�8 írè¯Ã3Ù’†u¶]Ò[GjÔô®£{òŽOð#›—”hðš¸O÷­VÛnÛF}×WœH”…ÉKd9v\·IP†ÝöÅ1Œ9·^ï²;K©D‘/–]éÂqwçrÎ™Ù¡ÎÞy�ŒSMŽcñN¥þÉWËìÇÑt09à¿åJ°Pš¡9»Àm®V|:@mqe‹Ê©eî§#\:Ãø É<³ó‚3r†/æÝú4ãó÷<'ñŠ>rÉgÒm\yÁ¶ÐA&Cj�wj^zë¤Mø³uð9cQj�t“=Xk•²†2ë^È+kšI+ÅëÚï×OW×7÷×!TMÌçä±&A¦¤ÉÅÖÊçð�¼ØÒ¥ŒÔfåÉÀÐKA)ã6'÷É~©™¥\&
™¡Ì9GÕt[Ê¹x×l¶î°eÍ—OfEZeíòúï”‹àÒkÛþNƒT“~Q^ÓüŽ+Ê[WA½š_ØxÁ}ÍaçìŸLNNp±"‡ÏbÍOä)p…S+òŒáŸíÁtÐì—s­Ò-•§§Ôñ®L}¼‰Q;�ÚáÇç],Ì“imðµ?ò’ý×…“ÕÿU²xÎ‚ñÞ
+C·»½Cëveµæ&Ö×ÆÄ†×Ç¶ñhº5U®ßfYÆçKö—Z‘Ä£ñ9É½wÊ,ƒïÆyaSš#> _»Þ’ÎâH0dã]µ+Wxü¦F»ÏpÕÔ¼Eßv@Ü„xˆ<-Ÿæèq‡E­1RòÌ+ý…!w¯‡@ê6™`Í¥Ùx]A-�uáŽÕ±ÐaR¯Š�ö0vøùœ+�ã¾¨Z=³®à-æ2 7WÞ‘«àiÙÜKvÎ¶¥è
+KëQ8ûbÃõm1�"‡™¡LÉ"ì­†ENîw§ÑØ”ZïÛE-
ùÒq0ë,öL¶En+@"ì%z|ˆ´2Ï=Ö®wû„mNnB›ÍÚÅCÔTpzl\vhwŒK§ƒí‘±Z næL¼M’`ü6ÁÛf³¢Ó @ÔkOŸ¦Õn›U@Œzò½.;¶wü`7{‘¾Iðf”à!:%I£Ñ©¨eô˜À»’G¯Â>,¯±ƒûØÀlÚ>³æ—Ðo9­´iøyéa,‚P¨‘cŒ”LäQ
+¿ßØþ°‘TñdR¶‹€­·1º95>§,‹{©ÖÔŒ”Ea�ç¬eq=µ’Í¨HÝXdvm´¥Œæšqûñò.Åì+ëk7©_§VŸZ�VœM9¤¶Ô
+ëÃ˜ ­«péKá¬G©½*~?¹î¿)VW£ï(Ï·ÀM&í§™e	íS%™
+9IÎÍ@­ÿó(Í‚wãã0ÿ�_²Söéî\”.Ž}éÌ–N÷ùþ:ø�TïkÛ0ýî¿â�Ú!?Ø×¦Íš–”º,$Ý>
‚"ŸcQYÒ¤s²0ò¿)¶ã4…ÁôIÒ½{ïÝùä›/&7�"—ÌbìÈ
+N+Út·Ÿ“Q4ìFÐ…×\8È„D³:ƒy.¶8ˆ  ´Ù[±É	bžÀÄ*„{ÉÔZrpÃ¬Â»u}¤8îÁ×Ì‘`
+ž°D7®¾¸3¹Am$z 0•×Š¬X—¤­«µÊ²RJà�ºGKÁQ9¡2mFB«‰Ì!lîBÞËóÃt¶œzªPåŒ`Ç¤Âµ0…� Èïti9×i]ò0R¬@gG˜çÌ>ëŸ¡#£(*�G*G0Ÿ¼>=Ï¿­î'Ëélòu:
+Á¬TÜÛÃ(÷6�×Í£�¸Ü;Â"l½Ì(Š¸dÎÁ‹æL.Ðh'HÛ=ˆÂH,P‘ƒe°ØŠý‰†Ý.Üm™
ìÜøòöÞ¾+¶Œ:¶
+Œ¢ã}¹–‚Ÿ|®V¡[rŠÏxšÄ¤’ó«ã[Ö×!¸mó{Àác•
ÒÃwr÷ûþ*Ñ¦^/>;yºÖ1¹†*íAK‰G®–[qÂ-(Ü]bã¤ªÚ¯L[d<‡ø]ýñÉ«¹ø\½?fnIV¨Mœ$ÀtŒ÷Ô2à—È þô>qƒô¢ù¦?Ðº`¤?æº0R ‹MÀ4Ñä=«_þmUâè,r8;5-è�YšÆ¾-ËÒm	Óª?—¨ÀÔ¸š±ã¤÷Tãýc ö½øne|•w=âoæ§zÀu1¼‚A=NUÿƒîIÀ¿ß·j«‚«ä?å®’‹´ó›äÔåÃif,RiÕ©ËçC^=±ö”7uÔ–¡“U»ä\˜¦Ö§®øëŸEÜ€Û³×»üÙ$µ‘Cô�UmoÛ6þ®_q(RH2âxI›¢ˆcÏMš¢¶¬ˆ“bÀ6Œt6‰Ñ$Ë£ìCþû@‰²%Û‰£/�wÏ½=w:ÿÕp9f’YLÈY‘¹·4Hƒã´õ:tàŽ‚‰�‚À0ë@Oàs<Š Ô¸ÔfiÅ”;H²>Y…p!™ú­#8gVáè±>å8<„1>2r‚)øŠZ8§Z02Ü 6½"0•C¦•³â±pÚRpøE[paRH	ÙÊ»×–"CEBM´�1'´:#‘Â\à¢´ûíúòêf|å¡ÊÄgŒ TùÂÂqp>yÒ…Í2�×)÷"ÅfH†eß8³×úï²"ý(*ÈÇ¥2ïÈX¡Ü¤_J?ÿñû•Ä*W�ƒáw´$´ªßý(Ê$#
+×·h4	§íÄÌTæã2¢ÆÝ@¯Ó�ÑœYøs&¿øÄ:½Rn¬˜3‡pð³’÷£J\<J‘­£}xÈ´"g‹Ì%5Bm’þ9ðUéÃ
¸þúi7úÝ-–� ‹å-þ(�æ>Ë¤u‚Û<¦gÌ.µ”Xa5b± p±­›¤ýµò�íÒ
êÖ$q¯g|ëÎgö¯‘ïëàÍ[zóOüøp#®îpŠî“Œ’´;d4vV¨i’¦¡¸þ™h‹,ã�´+Ö–q$U8)0Z¥q£óV©[]]¨¥_wy«$Ý!Ëó¤uç_¦qaŒ¶óP¯m­€ôŠŒwÚz/�ÒI3Ú
+Å…1Kây¥§/àxï÷V¾ˆSXù,F(ÿÝXLs…ÅM¸½–_ñ¶Å–A[ÒàÝÓš]aÕºG­‘éu:•bFŽ[½ ¸Vs&Eî½_ýÌÐxJ�öl7ç¬Œõ¶¤gà¯ÛÉ/Îˆo’k-ô3¿Ù‹`JË;6½a3Lb¯§Ý¡p8K~i¢ÿÉTŸƒ5ìfK½RÜ´òŠß™,ð%«¹Wˆ›cHáª)\š­éÊüŸ!&ÎºÇñÙVKC»Ê‘áì¸"Á*ŒFlm¨“Ó{ÁNN?¼îÝÇ÷{áÞ}|ÿZ¸Óã“½p§Ç'ÏÃ5ø\Ò´4ÚÅÔdµeïÕ+§âß�gÀ[ò{µlKÚþyì`ukvŸg÷½•ûÈM5ÒÃÛ7¯cùÊ¦Eõ¦˜@ÒÆí9£­ÕµÁËF;Ê]µ�°kù½´pV8ûV(A|Ä(‹W
yŠþ�RÁnÛ0½û+Þ¡;HZìº6i×¢Ã
+EÑ,;
(™‰…)’JÑ	‚-ÿ>ÈqS'i�m¼"ßã#}qª€’´ULy6Zžd(?çÙY/Cß*13–`"‚b�Ÿá¡2K:ÍÐ n|X³™W‚\øÄŽpm•ûI,Š]M_Þ§%�úÓTE1ÊáÕÄ¸ˆ/‰«PòÁRB¹Ú;a3­Åsl?{†T„Ym-ôN=¡­Ñä"Á¸™ç…ã]Á’Š„¥¡UÓ÷õîæö~|›¨cR)ÁJE”&nµ¨ÄÊHIæ£¯Y´/_,ŸeN-(¥	•â;ÿ£ÙÈy–i«bÄ„í#�x^Ã,‚¥9‰7\�Ú¯Îz=\-ÃÕÖþž°M©Ø,•Nj¶çÙ_b£™Oºðæ‹ÞÁTÚ»(\kñ|Ú"Zžzj�Æ¬v:íOO;h~™ôÒ06ú}l3[É6Y´®Rœ¤F©À°5rPÝuïFOÅMöæ8s’Gj.¯×�ô\S*Óò½N¸û,>¢m»ñÖÒ–«3'·œÉ­Ž±yÑ.4…™!ï8��§`’šÝ+÷«ñÍ×Þ¨ƒÑœdÂ6/#z®•�±âPdÇ>©²Ì÷j)’›q‚g¡²µuŒj™Þ™bN’R÷jAyÑÿ¿æïÄ±Ùã¿õ¿ƒîþ8Gˆb/S¼¹ö·o³É6Ù­VßoÛF~÷_Á$rŒíK§I³lI1A²í%
J¢­[ÏwÚ‘gOú¿§Ží(+ô^¬;‘ù}$O>{_•”kt³8•ËBêŠxþc2MOFp¿•Ša©4�b¨Ð	Ø%Ü•jC§#h,®lU;µ*â<�Kg>h4_È	Ã:CY¿?-è<…Ê�E¡�òäàŒûƒ‹ª¬ÈVš‚! ) ·FœÊ¼XÇ]ÀŸ­)	–^kÈwÑƒµV9&PfiÝEY“B¥	™`£hÛøýz{uýéá:@5Ä¤D�-2ŠÛXTÀVI	È³õ.'ÈmÑSžŽ®‰+Ì	îJt·ös£Èl4òò2yˆÊ,Ð9¬g‡Çì3×vî�ceÍç[³A­Šn{ýwNUp´í~g£Q®‘~QRúìž*ËJ¬«A­+Mk2ÂðÐpØ{÷Ï`zrtð‘­ù	·ð¢rjƒB0þ³{1µç>Ó*¦²XäÖ°8ŸK¼Ãhœ’.DXã ãä¼Ç‚yk2k¾#¯Hî©)¨ïé/O,T	âƒŒÝþ6y�Û•ÕšZ¬½L\‡	s0´}i'³gãPåæi~er¾"¹Ô
+9N&çÈâ”Yß�óÒ:Â¼„øˆ|ãz‡Ž©ˆ@†1qõ¾\aÉ®Fûk¼ikÞeßu@ÜB<F‚«EÈ9zÚcÑh9JHæ•þ‚1õ�Ç‰4m2…-+MFt
je¬3Ö`AŸ“*ÈˆZ*rØƒ±ÛÀOJª
¡jõ…t
b!#@è2%]
‚«v.É9kÈzÖ5¬¬@åìÚ†]1_ ‡;COG"ìÆU‰îw§¡+°ñZÚ�Y­ŠwÌz‹“ç"w@fŽžšÂ6›!=Ç¾l
£ÌÙ-“[vk´Åbá�ŽžŽB…¥–·—G R˜¼Mámóù¢Ó@(
+w@·íœ»v×À$‘^WžGö8µþº;ÊñM
+o’£Sä<J!:eµŠžRç)y5ácõi{¿Lé?lû·°ÀDëÐ8%np×¹™0‚DÐÔ&�£‰<Óû¨Àó‡�˜Ê° ÉÉ.Cnƒ¥î/œÉ9E<Hµ¡fØW•uBEw'ÅÍõ“îf>…è“…¾G0Ów7—÷Qòs¨ ¯�Ä°N�>� �8»r¤�[¯¨¬„yG­ë0½ž©Pê ŠßO®‡oŠÕ×è;Êó­ä¦Óð
¾ñ–8´OóQãÐÔP"—ÔÞŒÍŸ¥‰áÝä%Ìÿã—NÊ!Ý½AÙãâH¼3Ïtúïð×Ñ¿M�QKBA…ß÷WœGIzM+K”	Áƒwç¶Cëî²;W‘è¿Ç½eô83ß™3gf÷Ùg8¶�
+ª±ú¦çÌõöz85“‘Á/^*	©ÈT©ÁÖË‘¯zb‘ò¹È»Wì%2Å.Z1£y¾¿ÔWŽïÆØñžª
+E<qË³ziÌ³ÏœràE›¢Ù·šJý5\¥õŒ¦
öÏ½£ƒXŽ•!±Iå@*)Ž‘Se…O½n³^,ŸwËnUL=)NTá¤þx±ÃIÔC»ð5µÅ2lr—ÈéÀ5“el=•uzí?25F¢riºÁ®—Õ�T]IàM"ÇŸr»bÑ´Ñv'"$rƒáÍÍÔ|™omPÁjA½ïWè°×8^z��ÔIHhÀ”€{è¡`Æ³ÚŽèìÌ imLÉ¿—Ùf·µN3zOïéiõ9¹5Zo§¢LVwzJ(·ŸÊeQÍ
+˜Á7G
yH†b¯Ž¸( g<Ætbúé¦¶„{Þ„_È*°2p½þ‹ïæ°Å½%àvÈ°’¡±N.aL3L¨ÁÆ LûN#Ë»ásdP‡ÐtÞƒÝ3Û“Å šÈ­QŠaÉ£„á±ŸÛ¼<>}Ý>e©>˜:£p45É_/¬áHê@sx‰[ë!rUÓ¢$c^�á—ø£¿È²(:[Ïäq{Å¶æ‘eQXoD`­ñÛ^X6$š	›hjd 6yl1¨ÀeÂï šÍ`}0ƒv^+‰é`áªùgÚ÷»½'Ml>ìv6Qî¬NG�q¨|·Éu•Ïp}7@p{®�	o—|4õ´¼9�q¦Ê¨x<'LG<W¿·>¯÷¸°Öü?ÂÄ©&¹©ªä/(VŒ)
+iäÓµ'ÑÉ…‘‘B(“p9þÊ!õ[ñmSÛnÛ0}÷Wp@�ØARc¯M›¥k,@±Kì¡@¡Øt-L–‰NZ¬ý÷A¾ßôd‘‡â9<ôå7�jˆ1Ì oÉðˆ^è]£½ú¬¼pîÁSn!á�[ÐÌ¨R~Äs
+Ä�Òï†¿¦~Àµ‘ß“Ñ�…Kf$nõý<Æõöx`–8“ðs4piëÀF§•è€Àd‘’dø!'elÕp«PŠ�äB@ÔtwhÁ#”�ËD™ŒWrZ ³GŽ§¢î~ws÷sçž*„QÊNÌBÌmÙc8qJ�œx«r!D*®%‡ždZÍ"„‡”™�z.&²ò¼Ü"Ü2ÂGžá.Ërb�«"\!·\àþÝfÅ§{iåy‘`ÖÂoÌá¾hhï¹%‡¸W,F<Ó3”daðÏçsØ™�'#SÓ†!œ•RžŒXy}pÍdT‘´G·ê$EÙ{ª¬M‹oþ•“ÎiT¨Šð°`4ÑQ]ÆÞ®_k–:?A’ËÈm¼¼DJZ2yD~pÇÍ§È¢‰7£h´÷sÕ™-®#°RÔæÆZ*ò"¨ltçÌ­ßrÝp,£W=Øš24ØÖÀ	hGËÕØ´AA)¤º‚Ú¬°”ÓÖî¸ëç´G®©\tw»3
+ž€ÿe q¹Æ7nÉú||°\sûKÄhS&ý± ;ãí¸’¾5*+YøA«­¢íŽAÊ�‰§.[¿÷¦KþÉ„[˜~bÂ¬Å0K‰´½C�2sÎUhP+ËI™÷¥à–f%
„£�õÒAsz„óy™™Ã†R£Njû·ŒŒïÞ"ÔÎ�
+N:75·8*�w¹Ü˜åúd8áN&ÊŸm‘¢”ËWh5B¡±3üb5Ý"M­nëœ?üc†O,×–ñÚúš¹|zÿ…R]oÛ0|÷¯àŠ¶/Á^›´KWdX�a(�f/Û(2S$�¢œEþû Çn“~`z²©ÓÝñÈÉ'W;(QjA˜y&%yÉ;‡þòc>NFƒp_+•ÒÊƒÄ`+¸«UƒÃZÄ�u;Rëš!“9\“Aø¬…ùƒÄ&‚NWýÿ°Ä«æ¸ž•0ðL|_˜ºÚ¡u#„)AZÃ¤V�-ùNð‹%à¡
+Zƒ|T�h­$� Lei#XYS€Ó(<B£pÛ¾ûv{3û>ŸEª¶1®ÃVx(•?ha	[Å5plÞÛ@AÚ²oy”±Aï„D¸«ÝÚ_m"ã$	>ú22*ƒ2KA$vãÓ²w¤W‡ê­i„Vå5­Ã
ÏþJt5N©…÷0?È?$£Á¦� ˆFÍ:Z‰eGªŒp§7NN¡Ò/p�tsa¥•|2·\Jk<S�œu"-kÑòÄ‡yç%žó˜Ð‡+4>þˆ�ìÞïfí»|ü«pÙ{}vHC¼l
Æúþu›käV#¿è£x2EÈ�Ì±Üÿ¨¤#Sìð-š†º(i^Ïà8Âü«Ê#	UAö®ß’¬ËùgêjACeÓÒµâ:¬º/-Véï˜æÇSˆ‡k²[0¸}s£²|<Ý"féÂøàœ¥¸øÝº:ë[ÚA;°³÷þ,-ºFN˜Ž&¼ïÚ'ÿµTïoÛ6ý®¿âP¤�dØqûÕŽ]gYŒh³Ù€Y0ÔÉ"F“Ü×ò¿”%[’�-k1~±EÝ�÷ÞÝÓÅW8ÈPjA˜°'%ýƒß:äÙût�à—B1äJ#('ÈƒÍáK¡žð<‚*âÊº-©Uá!‘)\’AøAó’g¸dpñØ<Ÿg8Â->
+öJø	K$¸àæbá
+‡Öi� LÒOê±ô–¸n¸´¾@ÈK­Aî»‡h­$FP&·´^Y3§Q0Â“ÂM•÷éãÕõÍíu(Uó…ð°™â]/Ì`£|>�g[’D�6k(�##ÖÈNH„/… �ö÷J‘i•p:;RÆçÓêöÇŸ?_k\£ñÓ(’Z0ÃmU™?)öðW0`ñ$~[ëeÀ6W÷ŽÔ“ðg;0ÞM£&¥ú…A§ž´†=•Ò[:¯ß×¥ÊG­ääÃÃ>4iº¶Û¤5´pÎ‚ £yë-Ìz˜BØó²…/Èn:Œ¯¿JtÁ?¢[¡ßå,-]j%8	‚WÿàL„ŸtRWmãü³DÚÂáÌšY$ñxìÂ¬&®t·¨JÌÞ¼å7÷õ=¡³¬¼¥m<¬[Œæ‚o=)³JÒtzèr½±rÐâH Ñ¼Â’ì ¥õÐÂQ9$ý£¹F³òÌf3x×–>œJD0¸9©c²§xcáPr[šrKP‘�·|šX‹Ùó+QÎáý·bü\j¯œÆR…ü�X÷î9x­?¤fÏNÌ/Œïˆ¨ò¸NÞµÇFèK2-†I‡¯Äh¾BéëÏJ‡ÏkœÂ‡	ÄaÏ•�‡�üP÷WÒ}ÍûuJÒqšî3ÓÿÃx•Ë––®ìÚYÆÚ�§ƒ¹Í	¾h=YÚ¹ïfãRûoóXÈü.kubÃi{�KY@Ã¦^ÜÀé4¥áQ­S'“ŽÎ7Ö/ƒ5:¹ÿÁAñ£õß_Î`¯Ñ‹û¾�îobÅ0~yëüÝ~ÜÝ¿jé�“t‚HlÛµ_�»ûÀÜ
+Y@òòbt6/N!,®±ö·à¤v¦§[ÊÝ}ÐÎü›*½	5Šîj4Â=G�‘ÝN1…ï÷)R~‰zK
+…ÐFmJ(½AZ9ÞÙ]c[ölBÔòî•—%„µj­½ÙÑ™9ß™¾w¥CFROíÀ^INyí(ŒÞuI¿› ‹ëRäJT€žas\•jI½µâÌºµWEÉhËN½!|ÐÂÜ‘ç€¡ð†NÏÿ½ŒŽ0§…¬„Á'ªÈcž'®td�¦(„0¤5ìÕ¢bëCcxa=¸$ä•Ö�÷¨ÖJ’	erëï+kà4‰@X*ZÕ}_&gãé|GÕÁ¸Œ•ÈTxò¢+Å%8†¶ò’ mö¹ŸqOÁ	I¸*…ŸØÛz#ƒ$©Â¦t¡4Í×�éþö\y’lýz�$R‹ðQñéJxªûnÈe
è�Éd¯Š?pÕB+·ß¦Ÿ§—ß§éÍx6Ÿ\N1B«2wÆ®Lk�Ôò~·‹“¥ðÑ'òÖ#¼Z
+&ìŠwe¦ÒúgoŠßäË'�¦¥É+#ãv‘¦5“¯$·£YœÞi ãÛ�;<<.cÔXÇòãÛÓ
+â&w»s„èe˜ÊÑn6TØ�júmÏø<qå
^«Iã_º¸î™µ‘ÐÐ
+›kµÓô|2KSôÐê÷zÍ×ê’WD{/�U˜‘³AÕý/£;»|;1F¤ó££�Ón9ý[(öë¿nSÄ_màI2|-Šmò­ù�‚e‰xèñƒ$WßlŸþ7ÛÜHø˜<&¿uQÑj1|×WÌCƒï‚�4…¾äÜ4­Ii ”€K P(:ÝÚ'z‘Äî^Œ)ù÷¢‹}Ž[º/’†YÍÎìü}jr�e*DÙ;ý©ÛDòî¢¬Ìù©Á)¾µ^°òÁ’eE\á®õ�tf001mÙ¯[EáJ|à@øØÙð‹XsË�®ëýû¬¡«)–T[Qo>SOŒ¹ì�ëÔ&Š©£L„

\Ê¾î5²ì?E†¶„Ußup£zfwÞQ‚«ÈV}S¤Ž¬=m†¾/·‹›¯Ë›üÕ`L[«ØXAãåY‹l¼¶Ðl^bÏŽàb³·|n‚} IÖîZË·ñÇ�HeL/y®à²2«TC’Ø]UÆØZ”­S¸ÎŠ<GzO,™õÛ@êëÎ»CïštGX*û°.ÊKÈpÛ5äbÒžG�bÄsMœf/·¶(ñæõÅÛÙIƒzû×ÿ]VŽyñb)“é‘Æ«œÙìê0kQr(Åäû¤Ñ²®Of8Æ\þoÿ`¼2Oæm�Ok1Åïúï�ƒmÒ˜\c'uR(%àÒSÀÈÚYKT‘ÄÌìº¡ä»­wÓ?T7½yú½yZ¿/¾ !-ÓL”ƒÓ�¾’ëËùÊ,|õAÐ†H‚bY‘[<úÐÓ…Áà¸Íå…ÃÁ+fnŽœ£Mß‰U°¶œh³Ÿî
ÝœcK{+lÂ=uÄXË$lŠ/”K¤j„M
\NÊaßif?e†zBÛÅ÷–^Ý18JB©Íül5ätŽÉ
+¡tÞ}~¸½û²½«¨¡˜z«8ZAä”E
ŽA=´–—Ü±#¸ÜL•—&Ùg’báÑ[~ÈOÃ�¬ŒqÑŠ`«Vƒ´oÄrýPJ�à/ñ§€åb�Mo5=*¿Ê…Co•pÖŸÜ+s’»}m—\­‡ÝÎå$Ê�ÓÙ˜^ÌÇ€zÎj—w7ã×`ëøõÿðé¸ël~5í÷Ê¤§ØðÕü�TaOÛ0ýž_ñT15�ºfûJ)+C !M‰‰/Û„\çÒX8¶e;)hðß‘S‡6ÛØ¸o¹¼ó{w÷ì£O¦2(ˆKf)uÞ
+îoýƒ!·ø8™'y– Ã·J8”B„ƒaÖC—¸ªDK³âT›+Ö•GÊ'8±ŠðY2uGÖ;1«h¹ê¿gOqM+æ¼`
+_¨!‹#×'–¦2¤�¤S¸VÞŠUãµu‘ð\[øŠP6R‚¿°´œ”#Uj[3/´šÂHbŽÐ
+Útu_/NÏ.¯ÏÂQ]c¾bæP·å¢á+øÐ¼Ó�å®‹¾å<Q¬&g'\UÌ^èÝDæIÒ¸ KñÀº7R4f�±Bùò÷¬·F»mòBµLŠâÄ®›š”?»çdhž$\2çpªk£Ù)˜Ã¯ò,Ã²e6œ$Ô:¨icEË<á %Uh;OÞýE¨iVRð�ÐÛ[®•ó¶á>�Õ,è˜D!!ÂäÞ“r�¥›ÐÌy·�4Bç/Èïº•7í+ƒ€ŸXô#LÇùxŠAñÓßå1wÝ‰J'‡}s;Y–|c”˜aœ�1Ûgþ'ÃšüMWùfŠÿwÉjzÃa(Ë³lÍ°4Ì²ƒ…Ä/_Y½q¯º+â†NØyùµU¢Õ¢Øß=¯ˆßa-qÓ0åIôTQ"í¡‹J&áñ{¹û–
+ÑuE›W›Høñº¥ãX/¢®ºq+
+ïÚöÑÀh»¶<|4Åè�a-ZR;höìü÷ó”<E�AO1…ïýï„@<ƒŠ"DcHðhb†î¬m,mÓ™e1Æÿnv<ÎÌ{óå½ùmvÛ@…¢Å[}ÓÏÌr}5œ™éÈ`„çµ/ÈT©ÆÖù#OzÅ2åÏâß�b`‡¸+‘q(~pQÁœJäÅþ<O*¾cÇ{õñÈ
Ìå¼Xd—9åÀ�+Øµø}£©Èp�
+Ô1ê&Ø½So9
+ÃÇ:•©OqŒ˜„qôÜö¾§Írõ¼[u¯ú`êHÑ’ òòËâ
+­WíÂKjŠeØT�#OM¤K&ËØ:*›ôÚ723¦Æêd9wè™16�Ö>ðCjcHTq¹ÜÁ'åXÉ¿_æÛü�TËnÛ0¼ë+¦€I†}Üš8uë¤m€>‚:ÇM­%"4)�+«FÑ/(ËŽì8@y’–³;³Ã%/ß—E‰Œ¤ŽÏNI^ð¶$?y�^Dã~„>îå±Rš <Jáv…»Bmh¡AÌl¹u*/‰LñÁÂG-Ì9ö¸ÎÐt¹ÿet5Àœ–Â³_¨"‡K¿LË¢$[j
+@“AZÃN-+¶Î·„Ÿ¬„U¥5ä�= µ’d<A™•ukÁÊšJMÂ6Šê&ïëíìæûü&”jãB0já‘)¿ã¢µâš÷¶r’ m¶oy±&_
+I¸+„»µ¿G.¢¨òi<ãîËÝâÇü¢‰¬*#ƒÈ"Sî$F¿Iž„”_<ÅùÒ)Ã«Ó(;¶ÚÖô^-=·ÁVä'¥i¾õLë_×Ê‘dë¶Q4î7¶NC‡3»!'rºÍ�uÔô*µðŸãOã~Ó�p8Ô¨°S:µLèÕÖ=(“wIšýj©•|”¸X4V¹JròXìIvÚ‡ÕG2¼:…`rŽ4$ü=O­üO*­WØåÎ¤ï°´Vw¨qåög“<"‡WÂÏÙ)“')FˆÇ£\qœÑ7‡ÕÇ”gëÆÐ›ß’Ê §ÝŸ•š³ž’$Ã÷"N®o4t«’­aGývÒºÞ†Õˆƒ¡úH_ÒÎ^¿ôá0–!�+†;T�8ïIÚZ±³cÿÕÜ„g\ì$ôXä˜`.IÆŒ¼tjIYäÃ¡ÐµØ†�L9ÞâÍUŒÑ~PrâkÚ|¯´NÒz¶â²âz»ÃœÙŒ:d­¦ó#v"ðÈåN9¼˜Lðê?m�g¶ÒYcgFLn­am}ð5œ6Xäñ‘}§Óü9ôövÇçàÀ™!ië<>#ÉîáHvï×¯x›¦˜L&ˆkeb¼Gl*ãâqF›±©´Ž÷þFÿ�TïOÛ0ýž¿â�ÐHªÄ¤}Y)ƒm…Mµ|Û¦èê\×¶ÎNK5ñ¿ON“þ°IË—$¾ç»{÷ž}öÑ2
+™bçY
+Ÿú•%×?MzÑI'‚ÜÒA.�t`‘=˜î
+¹ ã*ÄgcW,g…‡X$pÉšà“Bý@ìœ!kº˜6ÿÇ�waBSt^¢†¯TÃ™k.laÉXE¨3F{–ÓÒvuÁ+Ãà‚¼T
+Ä¦z@+)H;©sÃsôÒè.XEè’–Õ¾oÃÏƒÑdRUÄ|�–è “n]‹2XJ_€ä�)Y“5”O"�srÁ]�<4?ª‰ô¢¨t©�‡›Éí(ý4¼ŽîÓËI:¹G×½6`0ßŽÓÑíh°å¥¡k@f\¥´JéQ:ïZaz´ÊdÔZ•.­öµ–9£ÓŒÄó
UD¡ó)1þ{4�»Ù1ÔT2»äY9'í�‚lØÑ‹"¡Ð9¸qFA�ð;8étàb�a¾z&–-Ëz‚CÆe/ÚGV<ž-²£l‹­ÞÐ�‹Œó&}ÈWG6_°YºW;¯qu¹rª¤ØÎ!M+Å¸>¹“šVxƒGÞž3.¡_Ù„ÖÝ†Ïþ®UŽ.x.©ïOßu_öJRÓ�Ì!n©'pÐï·]´ÛZx*Ú iù*óvÞ rœtÛâÇI²eö´ßÙAã»¸¦œüGG×rAºâÓè˜r �‡*+HíM0>	OÙ‰+­5ŽêZ™’éh¯Å–Bµý­‰v˜´Ÿ‘ã2N>4­lé0ù’õŽîÿJtW•¹Öž~-Õm=wø\>R‡9ã,Œï¯¶õ¼º&UCãæp4{'–„Ì¥¨oÉ7›ôA—J%`jŒÚõzŽt¿Ýð&ž&Äõíu_)˜:8| UÛ*•¡Ú·_�ÝuÏÌµ3Ê•£Þ^ôiïoC!¼¿‡¬?_´õî0*ìÍºV8¿�ZOÑuR[oÚ0~Ï¯8“*‘ (Ýë(F©V©Z+@Ú¥é�qNˆUc[¶C+ýí“CHsióäŸïvŽ/¯T¢ BÊ‰FßXÍ¨]Ú½B3øô½^Ûƒ6,f f�PD[�1<$l‹çd©öš­>
`¬ÂWNÄ3jkà’h�£Õéÿ<Âaæ¸"Æ2"à¦¨áÒœ
+#•(”Š£k"" RXÍV©•Úä‚7RƒMâ”s …ºëæŒ¢0LÄRoˆeRt@q$aËp—áîn'Óïó©£Ê‚Ù„XØ3G-Œ`ÇlÖ…72Õ�Êè¹ç	²A£ExHˆ¾•a6‘¾ç¥¦(Ý0Žó½±¸	¯™Fj¥Þ÷Ë
&œpÞ+çÔô=�rb,ˆ^£-Pw’+5üózí6Œ¶DÃDŠ˜­�WVšm‰E8£Y¹ïU›3±ŸþHU®ëàÜ_SŠ³7ëÙMºâŒBœ
+êÊ°\R)ŒÕ)µ~®œûëÔÕ,t
+Ñ’J��À}gn9Ýá‘íT„Á[þZc•Þ5Ö3×™Ù‚¹×•Å˜ŽØ6Œl¢åÎ€[êDn6DD9bú—bvj´fêõëÞ»ã\£­=
?øÅOi:,¿‘£;Lˆ9žý–ÍˆZAy¦YzElâÒ6Ñk´ut¾÷Š¬#x¼x‚Á`×·³édq?ûµœOÆ³ñâ~// 4®—biâ·^Ãñã¸ûûé‹õéñO/Ãð)xe­ÎÑJC¸¨›tŸF›jwo8ŠýJó¡ê1ÇUÞO–í‡ÔÏL¬K³íiÂxÔ`-1–]}OÙ°Ûª©š©3¼·ïw]|˜i!%7
ôÁ;xÿ�V[o"7~Ÿ_q*¡Î€hhU©j!,ÙF‰ˆµ4$U�Œç�±ÖØ^ûUùï•çÆ0l.-/Ìø|þÎÕŸç|frrÉ,&Ž¬à”ÒÞ ›þÐŸD£A¸Ï…ƒµ�Â�a–@¯a‘‹-žEP .µÙ[ñ”$¼­BøU2õ	-98gVáÅª~?ËðÃ–¸bŽS0G�Î]½parƒÚH@`*®Y±ò¤­«^k”#¬½”Àï-Gå„Zk»a$´‚‘ÈÂVà®Øw{syõÛò*P‰QÎvÌA&\é3Ø	Ê�BòN{Ë¸Îê”G‘bt†q„EÎì�þ»¨È$Š¼HåóEúÇÃÕÝŸéÝõå�¿üüÓ¤0®½â!,`Ö²}ú	÷)~Ž\Ç¼bƒ—Î2×^Qg-'2éÊ™¥Ÿ=Ú}Çl˜u˜z+;ë!W£»~Ù¯.’–z‡¶4Ü¨-“"ûhŸü]}áh°´V%¹—{G¸)Ëd".™sð`%üŒ¸Ø2[„£žBqÃ²±bË¡ç­˜DïBæÚQåä=pÃ(¯ Æ¯¤ààˆ‘à‡¬…{°2©¶÷ÊÿþVZ×Á‡ŸEò¶®[RÁ†�G£¸ßL§°fÒá¤Øðü†Ã9‘ù�^Å±Û0®ô=�Náû¯ùm¦i1«Ösj<z+ú-G=®7F+Tä`
+½p"¾ûPŒÔÃÝmR 'piFå¼Å"—¤µÿ¯Øñ7?Âlq|ºÑ[Q¾O«Æwìu‹ƒ½ÍÖãÇxhqE×=mIŒñ°ÍÓ‡Ù1my„1Ä£ø�:’^õKúãzàNšUEÅ\
}•ó{“±)ÕTOHóªrï`;œ£×)ŒòwÐ•çìuªZ]ý|J¨p×X“Z“ÊMPÿõ²]_0Ë6.)f"Ax‰ \·¼Š5$…Ü&5¤<QíÓÑŠŽK­°Lú0ˆÏ‡‘th`ÚÈDÓ¸!Ä³¶NÀâoã0s³¸’§N	B˜-8+¹ÏNî�:î!Äñ0°O/¥7ª…Ÿ=“.)*ÓóV¾(D­xB‘öt.GƒA¹oEhõìôŒÕ¤¹–•ùXªÑ´u¥ÞÒÃV‹¬Ó¸Ã�ÕBU.2îv‘r«wE}_ºÜ’øw%÷0¿¿_,¡æ„ð½Î£-aÖÖ´ç£Âvsi$´­»ãR§^”ßæ*¯…÷(ç#l=Oÿ'ÏûC‚[‘aw·À™Rš`…e�4OfáGÝþçè_ÕZ_o9÷§à	<Øuû°8 ©Ý¤iŠ]ì5W\¶{¤A ÏÐáÆÒ¬¤IjÜö»$ÍiFc»múpFÑÚE‘ù#%öÕë"+ Å$'#©MÔ½Ú(ç/ã³Ñìd'ð{F%¬hŽ@%D(à+ø�Ñ|>CqÉ‹­ ëLA”Äp!Â›œ°ÿ P^Áð|Yÿ~žâb7¸$RQÂà,QÀ+YœY�¼ÈQa)$œ)A—¥âBV¾ãT†°*ó’fwM�Ó™D lÅÅ†(ÊÙŠ‰Dx øhÖýý×Ë«ë›+ÍÊ(¦2¢à‘HH©´{a
+�Te ´ò’—"AHxZ«<1²AY�áCFÄ¯ü“±ÈÙhTJ-KôÎ@„ Ûû’Ñ?K<ó§’lÃÓÎ˜æ~�ê^ëŒLÉÎ<e÷†cgX‚2µ²£oÿñþ*Ç
2Õü¾æiµ{%ë;šãÍV*Ü|zK&Š‹í^‚«Ï	z¿!Jýu×œ6™7ÿ
+I9«ÿ=�’œHi¦ÿ‰k}[øï`vrçD@#Ž>=Sú@ÂQ‘áhã/û÷&×"ô¥K+µ-—9MZ»Þës�J”‰ŠjGŸí—‰#‰¿u\‰¬?GÚ¦»Ì›ÕÕ††Ä[<] “¥À«ÏT*½øÛÏ?Çg]vÞ
+Íµ£º&ýV‰¤©¶n¤ÿ²ëâScoWè¥¢ÌÄN-·ÝX’4ËíÊ3_	ífõÀÜW}ºH…•gFcM?1˜.$ªUEa4ÖN3žØùéb�êšl0ŠYú`ÝÊ[]¹Z»¿n” l}Óœ'Æ0škÇNÓ‘!V‘™±Í>£hÂñn2òò"³ÓÓ—	¢V½´’¿žŒã}{wÕÐ ?žÀXfäåÀ9�¢@–^f4O£†Oìx.]A-VFä
]3¢J�ï([£0�Ån0þ²&;È"
µ+cŸOW»U+‚wú2vX˜ÀÛÑYóe÷é‚¤i­IÃ´Í5µ®Èµ¯@U
+M„F})�€˜Ì6ïh¦Æ‘ºNìš+èiÁ�Ï^ï5?œ+ó¼a{6;9±3'p^A6 �›Ã‘F†jª¡¨L¦Íu{W�Î‚@¸F¥©ddøÄ§6U»(¨Å–0‡Û;çLV\ I2ˆ:‡÷g‰bU‰8Ïf….N5�Ûs½ÃüÙ±|v§½Ñì‘­§u£¤ÍvM2w ¶ÒÈôö®
&ÆSü�·@=ì°•½,‹}‰ã£$kt2Çê¬îAa|
+œ¦®)ÉRò¼Tø�¨L‹éPOºÎºp"ÌÜLÉs+C6Ì_jêÛsg»ö\™4~R…›èEßš=šÏ�ŸvÏŠH‰Bµ„ÓEA2eŽŠ2©K�¯ê:¬6¡eÓ…À
À
+xj’Ì1J„¦†ÒCûfmA“õŒÕ-^ü½
n©Þ•d”­?TQ±B(Ì/vƒû«LðÇ$ë²±)V£ñ5ÍtTèøY`BWS0¾«o
U©+^²tìº§j'-4&Ü�ì†5£�‹†E."N ²%UJõ<mØŸ*3"-PØÅÍ¢¯5s{Þ"ý›Í�¥þÃ¸²&Ê %Š,‰ÄçãIo‘•¦?\I*Þ<âx7ÜõarŸïv­³+k›î=—%ç¹cg_¼ƒ…i é‡xØ›­ÅýëWÕ·ÀÍ¡>B{‡Î–rÏÂÈ]ïïÕ¼mù0å�p>*WðØuøa_Ù�R÷JØ5H™G£¼ŽGûUÞé�6—|{òn¯vO‡ñ
óÉë�Ù•à½"Ã1[ €Õà@Ž°ß˜Œzˆv¨)ã£^¸@h—WV|[â
+{WÿMaÐ‹~€….,µwëŸ)æ¨E:6,»¿±í0OF¤‰<é[§ü?´Œò�Ì�®±FõMÙè<]äÈÖ*ƒ¼L+_uÛúÈJ‰©½s…®[e;ÿu—.?}0®"G©ønü”W-GÈï»p9Œö™÷cE¸ßÄy>l_“ôòüûMü¤õ¥êÚTñZùCíêó{"Ï­OêÍömÃ‘óþë'Ð¾kw»™0Ö5_çÕ�nÊd4TM@'¼xgÆ;øœ­@O0O.Á`	œÕoŒ?²Ð;“lªq’S"CÇä¼î8©‡å<ôTÃÍ›áì¼ó&i¥ø¦“q8…H—*u£(ê[ãÿAò'¾ÆP¢ÄÞ½O´R¦;Xîèÿ¤]^ö°‡·ÞuÖnËÌ_v2mÕÂi»`$T‡4Un¸¿óæ)ÔTmöÕ\Üp·½ÇEÄÕ[*zoZvØÂƒ÷†Õv´ú\:½7" ÑeDýfõ -BµZ×\ýKPE–9P‡ö&ôçÙ%aúêþ(¨B[¦*Çòô;–Ïú×ô®Z-
Ð¢±Ø{”æ’÷ˆ)s«G�vW*k½ûmˆï1ÑxÀ:ªƒJ\¤{5¬vçé½Ï;KM÷8Bü	T�Ã�:vGS ¼¸ªÐ´÷xt¤ñ±œËé±|n
+ˆÎ
,ÐÔö™¯î{ì|+ÚÑk�$ßLéšq�S}ÕÓÞ1µJúCÀráÊ}ïsÐk'¥:pÕäžýyÇ<fžWý–ÃdçëY°—;p%¯rQèš\?†÷^má¯¿Æá˜€»Ö+vûªSO„Š’þ;ÕþÎšMXë~+:ÐG«]mpaÝˆî½=Xëæœ˜âÆöã†˜4�çá‡Ÿ�]œzÀ6õ¼ërz¥:ÿÁK£ëCºÓ3|É°üu1Ã-1Y°õETf‹
0™ÛÄØY_êSlÌôæ]$*;Ô?¼½jtr^wÍþF�YáNÍºIÿ¿19³�H_Fÿ�WÛnã6}×WÌCI��tß
+;v²Í
�Íõ.š‡C�"¢©’”ã`»ÿ^�ºQ{£—Xôáœ9œ3çì¼È
+H�r¢0ÒF1jžÍ{�zõ)^§ÇÃ·ŒiHG`
+¢È2¶Å“âRïŠ½f"Ãg%þàDüƒÊh8#JàÅKó~’àz|!Ú0"àO,QÁ™n.Š¬@Yp´@ "*…Qì¥4RéšðF*0BZr´e·hÎ(
+�ÀD*UN“bG¢¶ßÜ¾»ÛËëûÍµ
å„™Œx#¦+.Là�™Œ¯e©(•I#ù4$G]Šð�u+ŸÜ‰,ƒ ÔW_¿\IZæ(Ì²Y¸æØ{¿—	ö^î˜î¾}| &«Þêø7Œãæ]ÌŸ®˜Bj¤zß°}g“_åDkxÌ¹]ƒÀéñ1\l‰QrþŸ'ÄŠ¶€B±-1G‰Ì—AO“ø»«äôÑM&#tÚ¥ØÛ`k#^Gð¶Ä+)M]�û‹ûÇpa2%ß4ÜŠ-á,yÌùõŽba½TCêˆåg´!†QHKA-R%s«-rÇêÔÄÐÈÓúŒíc�Ï}X¹oª�¼’ysàQ¼ìÐ¶	lVU¼ùúÍeµfq-�¥uàÕ
+Â0öXíãÄ�À·)}>éÏ —í|Í%I¿Üµ>ñÑ®¶ÑÊ…¶š¢m—wS÷(žõŽ$©å×š¯Ûò~ÿëÎÏ!?´�KJ¸­oöÏ³ÎÖîËí¡vf¶�BS*Ñ¢ª}õqÔEo«ýüL¥ÐF•ÔD­£[Ïv.í–¬ýêÙÛf¾nö6Ë+¿#Øîj±^;Àã[°]:(¯²e½+òÅt:î¬3Ã0^x7�'¬9Ï*�W4W2�âùºü~
EÍ&GLôßÕ{›à® &›Áy}·Â5;kÍ’ó*ÉæÆõ²¬zÇâV5rÐ9u�‘Œ�÷&;htî¢´»«Ä›Œ-Ça¡$Išr´ê„Lì³•,ûio¢ó5)
+ÉeÆxUARk²Åè O3™,
+]*¼Þ1mtï2¦åÂÌ?_½qÅŒâÃIõiÐ¾ì5`ÇÑßûK›îÂŸîãC`‚U¸‰ë¤B¸«Æ'ªç’ÏT›cÑMÔI¢¶—ª»™›�…&<Ÿ­QxòFŽ—âpj¶ÙµG6pýÓ`B"(ÊÔ?±aOU	O�.ÖÁ!9•@Wb¬ý7jæ6z5Ø>`@— ×x V¯¥¼õÜu“·t�ü o<GìkÑ)wú^©§wã:OÀ¸Ý†ùZá+ÓÕ}#$
+ûS8œ�fT<éûáÏ§‰ïí¹æGÔðie´1ÂO'¿…3¿»™ÿúj\u
+…ÕÿÎ˜Á�¨+H	×8DVÿV|-MQš–Í¨'ºÐkõŸÁÿµ’ËnÛ0E÷úŠYˆlø�nëGÝ&Ž M
¸Ý0hj,–Ib8’!4ù÷‚zÙqƒvÓp§á�¹ç5ùdÊT†ŽIIÞraÑM?tÇÁ¨@~$ÊÁ^¥Ê�Ä`ö°JTŽÃJÅ­±©8ae>“Fø’
+}@bAç»æ{á¬kÜ	ÇJhxÀ	&®)ÌmbÑØ½„Ž@Í¤vrµá½!àaŸ¥)ÈÖÝ«S%Q;¥÷†Ž‚•Ñ}°)
+‡�+<•}_oOë…UãD0œ„ƒH¹Ê#8)N€}xg2’ÒDMäQ Å�a•z4›r#ã ÈœçÒÒ;ƒÍu>.‹µî^¥¸.ãqs§%*ÆA Sá,u¶ZÂ¯`ÔëÁ<›Xg6ö¦¾lIå‚:eu¼Ö¶#ÿ�'æˆwŠê›íR%Ï Û­4Ú1e’ÃÚ¯2è_ŒlftkB:~CƒYÕ0m¹®u«´$þú¥
Puô`NÈiD¢xÞ‹Ôa}5z]­!.ÿ^Cç€Å%_õáÍòéçjùðýÛbzÃ+¨ÁL¸uÙv»õ‚ü©A.#fµ]éó*Â5×ÿ¶`É¤û±
+öžˆ�scù¿6�#©}Ñ:¢s"Æ>´	U¬g„ïú5ÅÙþÂ÷_IËŒÏï_£ÆÈHd(¼Œò&ÎYÙ˜¿¿E�MOB1E÷ýw	„@\ƒ
+Tcˆ¸41óúæÙÆÒ6�y|ÄøßÍCÁåLÎ�“;ÓÛì2j¶�
+÷D‹·ú®ÇÌr}ÕŸ˜ñÀ`€Wç�/ÈT©ÁÚù�NÄ"åcñNÑ³}ÌKdÜŠŸ\T0¥yV�çQÍ7Cl¸"QO�ÜrÁTÎ‹Yv™SÜ� XÃ¦¨ÅW­¦"ÂûT ŽÑ´!À^ì¼å(›T¶¤>Å!r`ÆÎóþ”{Z-–Ï›ewêTL)ö$¨½üº¸ÆÞ«ƒvå%µÅ2lªÏ•Ç&Ò–%“e¬•Uz;}dbL+ŒåÁrîÔcl <xum5žä…%…—>(ÇZþcø2ßæ…‘MoA†ïû+|@JR¥-\›Z¢*q!Mf½»#&žÁö$�ªþw4›ìJQ)õÍžÇ~çµ§oc¡Dë
ãP”�Õ_º‹(³7£Iq~RÀ	|kœ@å<‚ˆ†B·�ÛàY-±qÇ®n†vWLï¼¡ßÈ*05Lx¹êò³çc¸Ã•u†à#&d˜JW¸ŒMÄ=f•`)»UÒÀr|´A¨’÷`{õL{g‘ÁQxmÔCôhaãpÛö}¾Y\¹»Î£ZcÚ…­(�ìµ°„­Ó4›—�Ø"ØPv–Ï2k”h,Âmcø&,Û�LŠ"Éqi¹ðnù	ÙøE Å{�…õFd¿ÅCð^‘J�c
+€˜VÞY¨Ùl	ÿ$Ç(ß�OûËQ
¯BÌ�£X…à�951uï0›Í`Ð„5&-òXüSÃX‹QåŠë´FR>?8¯ét^£~md8j³®uépÔ
+¿þ¯¦5”�;Jø¢ÜÓÿ�æ hó%ûé5ê'
+[êy†ÙìžJüè9dq�m6›Ce¼àø˜iÐÇA—=Çä¥¿ÀP8�jF‘AÏôÈÏÎãcñ¥\moÜ6þž_¡’—
+I›¢@/w—¬Ç×´1vã4Àù`ÐÒ¬–5WTIÊ/8ô¿ø"­¤%%ãÉJ3|‰/Ã™!©¿ÿ³Ù5�ò<ûWÁKZWEê’ˆRžU5ðž2è¤°â· HV´QD(-S;*3*3Rg¤U¼‚QPf[Ê {ž•<«¹Ê ¤ê‘lØ•Vbœ”W**ˆ§�²,Ë¶m](Êë§�F¤|–ýÏÜÖRE‹Ì
+@f¯³ºeìç^N·ÙÓƒðµôß 4‚<<Iõß“fGå——ÍŽÞÂå%¹–J�B	ø³© Ôr’³[O²×ÿÈžäÄ--@æÝýü�+µîJ�ïˆX;éwÍ®yò7³.FëJ_*¨‚¬�Â€ÞÝ8I,u«v¯·´ê¸vD@™Û{ù›VíVæ'jE¢wŒ¹Sª1ˆê}Í1h[èwÝ%ù~Ïªàëž¡k¡GÕã‚ñ‚(.–	ôüh•#¹®‰„‘»I]¹Ëß	ˆÜÅ#Ñb±Ç
+šƒI�z
D€@ó™RI„)vpMŠ¨KÑJ‹ßZq,âŠÙîÝ�×Nœ¯Ü��•Ä¢3zyYpÆ”¯%gÀ[Õ´jÒ�Ííý|e•WVù“¹‰#ÛïÉ´r4þÊ
+°ü=ÿ‰ëìä€]8¦Àš†!·&f™ë“ULä2ÍFko›Û¹kÚ³Ý²qý'¹ã˜‚Š\3XBÿ¬•�à
+î=O½²‚¬Ù†4I-h�!|àS+OxîÙN�î
®;ã¹î‹ÂšïRø¾dnI¡¸xXÀ}oµððA³4‚O0NÎ{<vbÖLgu I�U´u
žX›ûx¤¹Ç4
+è§ôÍ î¦Lœ?ø¾!Š^SFÕC`ÖÖE4úA9mó}Ã¥ç”L†ØÊ‰Þhn<7÷ÕÐ‰{läT=FùÁ‹(ŸøÀ44Žs(#éJ�Û4ŒžÒ¤TÁB¸´êôÐqÓ,(g9V² ø©KµÂÆÆcp7l:'¡žÝ�~úV0Ÿßß
+†@ðµT�ƒk«íº¥¬œÚâ	è[«ƒÆŽè=GJ�Æá§ ë
+(…Z*æƒRÍÊ(D¢–°%-SSê¤ù‰ýgHÇÐ~;ê'@õ™’
+(T+ØbbêÄh^†LF•ü®Öùº-¡ÊåÖ=qúï�>¶�¡¾¥‚×û£Fòw‡ßxØ“=ÀFíËr=
ˆ¾¡’¼~k ®p®¦‡¯¡ÕÐ/ ˆÏb¾ûL¢«zùÁ°ÏtE{\•înþÎý@¢Å<§ÕL}^²eÓÁ2}êµQŠD‡Z¸�jDµöTJZGÌ5ï­þ¯V[:•ÚÙ§étÙÝÏu
+õ¤WJB¼Ç9åá÷´£Dgg¶{�!ùµ»B@×\Ý	j20Í@üÆÕï®@Ê«HÅõêÐBRUm¬fB~µ¢“Ž~Jc;uE¹#Ìå-yTî¦Æ|£5Ïµæ{3žd¹®O)ÚàWTíÚk@.Îó§F×D”È™ÞÃ2}xÚ»0�ÑQFçpßq­ûñøŒÄ×#©uÅHä[0’ðŒ_f.æ—£N�¢é«ØU©ªn›	èiÝžŸbŠßÀÃ±îêùòª©4jSýh+|L1¼ŽÈÐ=Ô±Ò}Ã…Z~­3§‡�—´ªÍÌw‚né1I¯p Út·¾¸2BËc×ÇÆ.Ãã—A!”X€D,>î€5�¸L‹òÀ\D¶ã{Ð·äýžEÌ»øtVA~Ý3ìük©ìØ�¦²#M5£b]*0Äz@ìpÒÁ+RîtþÖ›ØÐÈçNëƒÕJÀPk#±D°vj	mSøF	�.@6z=1€»vâÄ¥Öì ±­Jk©c¦«Æ¦ÎeÒÒŽ5`œ´ãÁ™‡1´?aã'@Mº>šiÍEñ%W�7Ý~Ä„I¶»ÂÁ,ðY'G$�æÜšŒƒÅ¥îi­@Ô„EF_gN=%
+£õ-a´Ô3_ÌØ0Êz†Ä·¬)z¿�È½:š¯{t–òôOXÔ?$¯K¢Èòß’×'D‘H�E'4Å÷\pñ~_èw¿F (gëBK—7B­o
+(Ëþ‘Ö7+W&Í²3*Cyx-Ê?R‰ÌÀëÔ(‹‹uf”¥„�†cK…LÙ«iXßëÂ©»5
}D�h˜’bDÃæt”kÐ%oER·²ÝyœËs*–ec/t‡°»#ƒÚJV€P6²ñ¹\–F²ÕA+ßNèÈNšÛ‰pÝyí÷Oü¨ïi¼nÂÆMˆ˜n±Sl_rÙDõÐXËÔsL¶ Í<=.gÞ¬¸‡gÑ±ö¼'’iÖ¼æUS]Óšˆ‡-oëÆßøéùé[Sâ½.�gTÑL*‰�·JGue`pwb½UÌüÀ
ïºo`{ÀczŒŒ6$éõä5!>„	„ˆÈB_zöbõ0˜ÍXú2ìzö�hçsfãË '§lz1—¥Þ+?Ì:Nªà¬WÀ º(/\
]˜„W=ER½t…–þøEp†~Ä1Y¹sà–ííeœÛkhxŠßk/#üBK�vsÔJŸ›bÛãTV’×‹:‚”N4—±ÐØ¸©[_mSë±.¢wª™ÿÆÙÄXã»´xš°h¿$….cÜ¥SWc
+ü±«Fð? Pˆ¬ÿ¹-‘šøoÚkF‹8²R:è?7Â_ zˆt`ã£ƒFŽŽCÀÜba�¿Ì„ÙŠ*vY~®ÿÅùdÔëÆŒ@1cHÇMŒî§;Là¹&
+>jY,0 ÓUcÖV‚Ã)8cPöÚ:ÄU¯ƒÃ^îXŽÛ­¾ýX�ùÔAoœN4òž+HÍî¬MéoJïØ@äG,ç·$H4å-™M»¯­
+n3¸¡j…9DG¸þØÉ‡ŽšH:¯˜ £,Áð`¹wÄ
Ž�§`.:€ßrHÝËpœç	qN´—7Ð_çy±=8Ì;Ù¯�¢Çíã !”'7²|­ÿÅ¢hhM¡‘#ÈÐ7|L=ÆL,F?±$ØüTC¯Ä­«ÙÍk§„ÞÔ!h]é$ÅâŠµSL:K!�míæˆ@÷<(ä›þ'®£ÊyØZ$w$ßìÈÄ#¹#/_ý8�÷òÕ�8ÄïúañûŸ~À!¾zñrñÕ‹—Äø�g©Îä
„¶hhQ¾¹äæŒ¢ß@MqQæÉ¢{­Óc›¬CæwÒ¬{†ŠH´XTt¢eà\Î=­q&ñ�Ë¶y�µÏ¿ø[<bûõ¡åÌÇÆè%ä?4A+CãÅ
x+‘cfˆ5tÜÈqþ±3FG�Ÿ¶1{+Êp„»éTp¡®"¢e�ÍqñàM	}6:'�.¤ø
ÔØ¯Ø|Ö…’>b£D+ÍbË4tæU>[%tìÞÖôžëÕ‚ˆCyV6Ï‘,/!8†”•„¶ŽèQ%\Ÿ ;k ¿¢¡1´Îp¬úÒX›8ë€9çë"Áñáúm‰eK:¯-™ cl‰-z˜*gvYÕçÝçfï‘e=Ì­ø½HG)üøÌ½9Û»8ý›s½È¹¿•ÁÔÃ…DeZ	"rCå…‘²™rx~!vÃðøBÚ>Ì©‰äÃ½ÍðöÉÎ¿èm¦ßÝÑºäw2Ê€ÿnuñÜ‘,pÇ�bÀï÷fÇîøé¿îÍ¾\1Bxvø8ä_ý¯ÇE�½Î¤úû“w º/MŽ?$I¥ÕNò?�‹ú¿Ï¦ß’Ô© * »º:9[_]eße#ý)ù_öõ”hÁþÚêë£g?>­ù®.ýåko¹í»…àÝÀ�ë‡¢À:vNâÉ5†7×Ð†<ËÝ<;3•4vmþ{!ÍK/Îh¼®¯Eó%Š”(’¢HŠ›/‹uA�¤”ÃDHÎy-·ˆÓ?LOöŽŸï‘çäëš	²d)&HA¹$ù’\®Ùí�qž[ÎVkI&É”¼æ�7)Ín�KA^PžÁ«›æûhgd7THF3òJàä…h¯Šuy‘‚B$4[�$Ï$g7¥Ì¹¨|Ÿs"×@–eš’¤]]a§,�LaÙ2ç*Yž�"*€Ü1¸×tŸ?ž¿ûóü�šJoL®©$÷T�ÕZ° ÷L®‰T›yÉ I¾h¶|¼—Ñ
ˆ‚&@.×”Ì¿i‰œìí•BafB’Ë—×_æ'²,³DñBV “ûE¬)/²òòâÛ{šÈœo	Dêoó/ÀË³æïsµ§,“—”à'{{IJ… Í\ÿÜ#„�ãçÏÉ«;ÊIV¦é¿ÎKžžçÙ’­Ô6ÔxÁÙ•@ž%íÐÉ^€Rï°^Ú£½«à.áyÊ¾]Á?JÒ#á<¸Ö»ìŽñ<Û@æÓA7†ðIù¬”*·�E«�š²(oR–tê¹¾Öºãe"'&ï
³ä¥%†fßäT¯=­E®þ<S¶sxV’ScÃJ7G'F5ü#Ìã
+äU™eÀ'ÓY%`ýe,ÍA–<#Üã“vØXzò<ßlh¶øœ'Tæ|2=@ð¾”²(%>nÊÇ2‹#ýÂV\Ý9ð;–‚YË³š‰­=7zÇJ|6$,Bgh��ÆÆgxv™5ê‰—ÆüRƒSã3Ì©‰o1áV.db+éð¬P>jÒáf¾ËÉtzPûDõÏG1½x	üZ,¨„+(rÁ”ÃüÌ„4$Ò3–Pß|·W°É%Ìõ¥"Ê{–Âçœ.Ô‰äYQß�Á¥óeÓxº³†µ×`wúë¶ö•òÈ·Œƒ¾€ZŸÒ£¹ÎWïèz~Û¤ïj†BÉOL¦‡gk*ª¯Éþ*Íohº�³§÷JÓÖ
Å›Ö�––ºoLIE@GÝh„Š4r£¡¥å~t„’	IÓT™q¼ j"CT6$,,‡Ê—=^ÌÂ"Þ=bJ°¥o­#~|ó‹–¾�ˆ�=‹Õ_½áþWÛµÞ,*ÛyzüMÉRí½ÏnÔ?
g§ØHß3.d…Ì²Õ\r*aµíqW #ö9¤z3ã}ºçÅ}kz–TQð©áº{ì·•†4l*Oà¥5?­£]MÆ]=¨¸³’ÅáYÁa	üËr™²&Sò’Dª’Ìˆ{Ãa¨3ÞÝŽ„*îžÈt=ùü×ÎƒÍß	aCáÆˆTpájãˆÂ¨^–|ežhó;¼+‹âQB�xnÏóM‘àÃÉÔ:ïNsÆ_jÝÿû·Zôäò×œß²lÕN{+6ô-±>H•lò>f½ñlœ§ê‘@¯«ŽÛú>h.©,…™Zš$¹´hüôÒoù
ùïn÷¶Ó‰ÓÄÊQÍ!]–n´äuy´=Ì¿Íï³´Îo1ö/˜\—7¯SFEcð;g$1õ¨¡Ôr‡cð¥”J@Cº(,[—Î;Â@h ¥‚cãúþ/^œO[�?'U5Ò<$6$¬E‡
+áf¨ÒéÏ4¨ô}PçãEñ–´LÍÓ†„EáP!Ü¸ÅYŒk«ÀêKË^,Â|Æ�h-°ªì^}ù[ž4u÷
+¡	YlhýD£Ôcêb¼Ãû)úhdùaÁó!öGU²zÊ•UùÆ‹‘Ø|xÔ¤´8uÓ‘_yÚjuDÕZ[™e pBÅOÌ•5tuXüB¿¿^Áûœ[9Òˆ¼ÎÉ¯l%à£HÖ‡Ï³MnsL~TÍ¤Ò"]€A²!´�C<“®
Ìˆ
	3íP¡w ä[–­>HYœ§¬7ˆQ3ÎeÎé
+Îi²†74¹åøâ·b.3#êù·ƒ ²·pP‹h_‹{|µ”Åeís® [÷T³â˜=½.åº³£î«/³f²¿y<6eà!6Øƒ"êùm“*ýõ%jQu
+ë·UÿdIS�¬b-e!fÇÇÅšò#–ÓR®÷xnçOÉ¿äå£³ß~þÝ¶Ý	Pšn©À%ùI½Ëw^Ái›¬lkF¬n‚Î¼Ø’LÜIOOý.bº¤¯ªQ™y»î•?Á]3–(¢R/T }ÌªúÅâ& M¦ÐÅ¾7Ö›ìz7°@0]OÄ¯:ìˆo8^	d2mx­|‹Xúfâ'˜ÙÎH^=Dßãncn”1ÑM¼S¾`2¥Á�º`t£}ä&0&ë®“K¬ 8#á‘0¯È,ÁÓÓ&»£B €¤ÜÆ ]Ç6 èekRi^Fùè»p‡™í£ÍÒÎŒX-YAÝ¶Xõ»h£›«2È×÷”ƒµœU²jû5HŸç
+6u¶å‘Û§ð^ïäP=u=Åyøß­ˆ©°"jè›‚JvÃR&·ƒ­9kÅiÇ„:",îC^†×´f™™Á¦c°ú((3­90º£50ÈiU}0¦ïzp¼ÝT
ª1lµ\ì4”Þ¨[×…bw­GýÀô¿ÿ8ÂVÂÌŒ„àHƒ_hÃ¬X‡£
+L{ƒ‰¿ó©|àmë’VlåÑÕ#äÑYY¬æl•QYråËÙ’õ¹«ó5$·¢Ü:#äA'Â	!ÍˆD¼TxgÏ«?ït3’Eí)UCºÙ:³Î7@N±PÿâòÂð�'6™r&¢äðî;RL~þÓÏ?[í)7,ë�ù
Ë(ß^R¹Æ:I4·¶ÑLZxSwUë(—˜p *ÍŸ«i¡VSÂ3Ò}…uh`cöµ*>Á6êMiël?nŠœË^ã6Eú•—*µÙ©Ìi<i�ñ
ÞÖf¤ÙÄ�‡ðñP/Á²Õ"¿Ïœ¢–³–%i¹r}ýöãÕõ59"ûÇGGÇªñè¸X‡·°ÀU wT¬‹}Ôè¬èl¯`·ì
+;�–~µ}5Ÿýrj‰<÷“˜
+®Þ>LþÃ‹ò!Wžç†gÄ!‹»tQ•ÆV÷TðWA`»üeOŠ•#x³b÷›<OÉ³*0o’ŸvÔMj4'r4-D#8K<Z9ªš½–�~èW˜ÂËQj0¦eý‚Ãþ½Ô˜"TûjÒ'©È¢©=R5�©˜b"
+‰'PñEÅÕw1*
+D7ìÚ¯1ˆÅ†Ø\1L]‰�è¯ñÒøŒ`cá-£3ý—íØë–ë:û½µC‡´žŽtâ–‰ùp<óðfðÚ R·†ùB_ñªgÅÀþ¾šq¾:ÜQx£*ý�@ýõóm|½™?P.ñhÙÅŒŸ}7uo'Ãá™Š##"¿Ó9š�¾Güqëc�Wu+@x¸§™o ?¬kb‰°ª¾~±¦�dß½3>&ã}ôÈq°€sl—åjýhåo]8ît½ž:ôÛßšæºÖ×^gPzÑM‹a‰öeã{à¹"AOoéËh–¨š0Âáº7çÀƒ…‰Y7žµË§¼WÖyàoŸ¶} 15có<cNW¨:V;I6ÝCRL¬>0#á„“ð,Èy‰©XÆ´×< Fû
+ª@ùö¡Å½vÿäÿ«ÒçÕzÔ“,öÛ$›Ñ­«¨¸b®œ;sõ\ÿÆœö¿C:T»ä&¸]ÿØû7�‘OOÂ@Åïýã&=êÑ°5E4’¢P0á6´#]Ýînv·üùö†jŒ1Þf2/¿yó¦»¯%lÉ:¡gWÝK·QÐ¿èt€ÇqºL ^äc¸›fÃt´˜Åy:Í`þ�L’|šÁ0�$A«Í+áàEH‚:ÀÆë½(PÊlH‘EO%¬ŸÐ0\&³y:ÍÂ´‚0¼�ó$ƒN'
+úØø
+öµTŽ³Ê{ãnz=S¡í
+Ý;ÎXô±óhô¼É#êKÖmSê…‚J;ÏÑÝ_5ën¡kþ`ˆ³\¿‘bPX*Iy�Òqv¼/uñœ
+KþSÐ‹Î`i�µ‘ô�9@'
+�#«°&Îb‰e)ƒÎí´-9Ó†8rXÓ?àÚn~ÀO?=ï«ÕhfÖ¯f[Œ–M:Îdq=ô«'Îÿ o„—x’Æ€Ð’ý=ŽG+¶èé4�6ø~û©(x�T=oÛ0Ýý+î5�t)„ÐdjÓ!)ÐõL�%"")ß‘‘òïÊ2âXrát#îßÇÁ›ÛÞ5â‰mðZ^-WR 7¡´¾ÒòÏóÃ·òv½¸é¹`S£Ñ»ÆsÑ³–uŒm¡T×uËîû2P¥®W«+õ÷×Ï§*6èÐÇ‡@î·�š¨å.Ac·K)"P…ñr÷Œ\(ÕÖ@K¤XËQ1ŸÏ Ö!„ÈGAáÁ¡–GÍÀ×6Ø?¿µøÑ84w	½9éœr;è“ˆµL~’/sÂí^°(ƒë¥:áW³Cybj¨ŽzçÂ�2_ˆ1’Ý¤ˆ#ƒ!,ÑG
KßZÔ2{Œd}5±?s¿¥HŒZî’¥a§žÇ»¼ØKxZ`î•ÿe"_9cbØÆÐ¿€'1Ò?
|eSl3,£Ž]~^aÖ0Ñ/6ÀŸd§vÑ'‡úš„Zn€­™‹6‡E ¤Á1¼àôýÎcK[!ÇÉœŽÂÍéc,ëÅ¾0üëÅ;³±/È(àâ*J-)-ÊSˆæRPPPPÏN­,ÖË/HÍ+H/ÐË/JW×Aˆ§•¥é•&•æ•”ê%ççÂä@Js3KôRSJÕ¹b­¹sHMÎÈWÈOKã*È(PPRVðpŠwóôqõsôuUVVRPÕâ�SÁNÛ@½ç+¦–|KìVªz¨BP
+¢‚ƒB@âRilOâ-ëkwœàK¿½Ú
$@AªO–öÍÌ{oÞŒ�
²N±9Š¾$Ÿ#8žÆŸF£ÀõÅì.ƒ“y~6;¿]L—³y7?³Ël9Ïálv™
lY++¥	¶è;áE•¨uk2dQ¨‚¢êÇwÙâf6ÏãØ@ŸN—YF£É`ÜÖjCðØhãŽ¢Z¤ußÓ´­Ñ&ŠÓðMvS=Ëwú>{Døñß�*Za§eøTå„-9@­áúbºp€¦Ç
V•Åu�å d#¨Œ2khH*eàOšNÉ~Ì=wP¢�²F³&�š`ËöÁWVÊR)lû!�€P,•Ü4d*ª@œ¨ò¶JjP’ömÇ%›•ZCÍ
EÏc#H'òJ2œf×Y~šå'÷p5Í§çÙU–/?°e¶
++j=SöÐs†¨òì´r~ulàÍ*†æ…:Õ´º÷–…F¨:¯¤çÎÂŽõÁ�©–š»u
†å¥ôC;M¸!àNB·§hŠXUtBCp^mÉ	à•ÆB [¥õ~^A ŒÔšª—nz`Ð{ÙÖmg”D‡3øõ5ùö¾³ÿéš÷¡sÀ6€+¸-ñvYÒ½G#”dÄ¢+ÐÑp?õÙ#ÔŽƒáhàvq	-+#>aÂ€¦i~³?µs»<®•Ô]Qkù7•’ZjÙ)ÌJn
+eÐ‡ÿ¿:«'éï$]¥Â¬ÿ¾·ìM…G²¡PáG½¶v¼;êÉà/ÅT\U_˜]IHÑ¬r*A��Ø�ß]ð0�häHÖZö“Š&+nt‰0›²¤3z7>œ¶Á0×:�£ßGBMB
\ No newline at end of file
diff --git a/tools/php-cs-fixer b/tools/php-cs-fixer
index 8dc13e0a..789cb966 100755
Binary files a/tools/php-cs-fixer and b/tools/php-cs-fixer differ
diff --git a/tools/phpstan b/tools/phpstan
deleted file mode 100755
index 293c4441..00000000
Binary files a/tools/phpstan and /dev/null differ
diff --git a/tools/phpstan b/tools/phpstan
new file mode 120000
index 00000000..5e15af47
--- /dev/null
+++ b/tools/phpstan
@@ -0,0 +1 @@
+.phpstan/vendor/bin/phpstan
\ No newline at end of file
